JSP java代码说“javax.naming”在<%中使用时不存在!

时间:2012-01-06 16:53:30

标签: java jsp compiler-errors

当我在<%中编写代码时,我可以使用javax.naming,但是当我在<%!中编写代码时,会收到javax.naming不存在的错误。< / p>

一些例子:

<% 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:尝试将前缀添加到Context,并得到类似的错误。

编辑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();

2 个答案:

答案 0 :(得分:4)

首先,这种类型代码应该在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();
    //...

Scriptlet <%):

<% 
    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生命周期的内容会更有意义。

答案 1 :(得分:2)

我同意Bhesh发布的内容。但是,你可以做到以下几点。

<%! 
   public void jspInit(){
  try{
      javax.naming.InitialContext ic2 = new javax.naming.InitialContext(); 
   } catch (javax.naming.NamingException ne){
                                             // do something when exception occurs
                                            }
   }
%> 

JSP容器在加载页面时调用jspInit方法。