当我在<%
中编写代码时,我可以使用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();
答案 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方法。