jspInit()和_jspInit()有什么区别?我能够覆盖jspInit(),并在初始化servlet时调用它。但是_jspInit()是空方法,我无法覆盖它。为什么我们有两个不同的版本用于相同的功能?与jspDestroy相同? 使用Tomcat 7的JSP版本为2.2
更新: PFB jsp文件:
<%@ page language="java"%>
<!DOCTYPE html>
<html>
<body>
<%! public void jspInit(){
System.out.println("In jspInit");
}
%>
<% System.out.println("Hello world"); %>
</body>
</html>
PFB生成的Servlet文件。
public final class A_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
public void jspInit(){
System.out.println("In jspInit");
}
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
// some code
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
// some code
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
// some code
try {
//some code
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<body>\r\n");
out.write("\r\n");
out.write("\r\n");
System.out.println("Hello world");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {//some code
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
注意:我已用注释替换了一些代码。它有一个空的_JspInit()并覆盖jspInit()。我知道我不应该在服务器端代码上使用System.out
。这是为了理解目的。
答案 0 :(得分:0)
核心差异:
如果在JSP中使用任何自定义标记,则由容器生成 _jspInit()
方法。否则就不会生成它。
如果您尝试覆盖_jspInit()
并使用自定义标记,容器将抛出编译错误,说明-duplicate方法。 (将有两个具有相同签名的_jspInit()
方法)
重写jspInit()和jspService()之间的区别在于--_jspService()将始终存在于任何JSP-&gt; java文件中,并且优先,并且我们的jspService()方法将不会被使用。
但_jspInit()方法有条件地出现在jsp-&gt; java文件中。所以,当没有_jspInit()方法时,我们的jspInit()方法将被调用,这很可能。
看看这个不错的article
答案 1 :(得分:-1)
请纠正我,我错了!
当jsp页面被翻译成Servlet时,jspinit()被转换为_jspinit()方法。