当我用<%编写代码时,可以使用javax.naming,但是当我用<%!编写代码时,我得到一个错误,即javax.naming不存在。

一些例子:

<% Javax.naming.InitialContext ic = new Javax.naming.InitialContext(); %> fine
<%! void foo() { Javax.naming.InitialContext ic2 = new Javax.naming.InitialContext(); } %> error

确切的错误:
rptCountsRecon_jsp.java:22: package Javax.naming does not exist
    Javax.naming.Context init = new Javax.naming.InitialContext();

我对Java有点陌生,对JSP也很陌生。

编辑:将foo方法添加到第二个示例,因为它可能有助于理解我的问题。还添加了来自Tomcat的确切错误。
编辑2:尝试将前缀添加到上下文,并得到类似的错误。

编辑3:侧面问题...当前代码给出以下错误:
    try
    {
        javax.naming.Context init = new javax.naming.InitialContext();
        Context ctx = (Context) init.lookup("java:comp/env");
        String jndiName = getServletContext().getInitParameter("jndiName");
        DataSource ds = (DataSource) ctx.lookup(jndiName);
        Connection dbConn = ds.getConnection();
        PreparedStatement pstmnt = dbConn.prepareStatement(sql);
        for(int i=0; i!=binds.size(); ++i)
            pstmnt.setString(i+1, binds.elementAt(i)); //binds index starts at 1 -_-

        return pstmnt.executeQuery();
    } catch (Exception e) {
        //out.println("A naming exception occured... I don't know how to get the info of it.");
        return null;
    }

rptCountsRecon_jsp.java:28: unreported exception java.sql.SQLException; must be caught or declared to be thrown
        Connection dbConn = ds.getConnection();

最佳答案

首先,这种类型的代码应该在servlet中,而不是JSP中。

声明(<%!):

<%!
    javax.naming.InitialContext ic2 = new javax.naming.InitialContext();
%>
ic2是成员变量。不能执行ic2 = new javax.naming.InitialContext();的原因是因为构造函数抛出javax.naming.NamingException

想象一下,如下所示:
public class JspServlet {
    //there is no way to handle that exception here
    javax.naming.InitialContext ic2 = new javax.naming.InitialContext();
    //...

小脚本(<%):
<%
    javax.naming.InitialContext ic = new javax.naming.InitialContext();
%>

之所以可以在那里(在scriplet中)进行操作,是因为该scriplet中的所有内容都在生成的JSP服务方法的try块内。

想象一下,如下所示:
public class JspServlet {

    public void _jspService(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, java.io.IOException {
        try {
            javax.naming.InitialContext ic = new javax.naming.InitialContext();
        } catch (Exception e) {
            //...
        }

我认为,如果您阅读有关JSP生命周期的更多信息,这将更有意义。

关于java - JSP Java代码说<%!中使用 “javax.naming”不存在!,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8761373/

10-10 14:23