[英]difference between _jspInit() and jspInit() in jsp
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
。 这是出于理解目的。
核心区别:
如果在JSP中使用了任何自定义标记,则_jspInit()
方法由容器生成。 否则将不会生成。
如果您尝试覆盖_jspInit()
并使用自定义标签,则容器将抛出编译错误,提示-duplicate方法。 (将有两个具有相同签名的_jspInit()
方法)
覆盖jspInit()和jspService()之间的区别在于-_jspService()始终存在于任何JSP-> java文件中,并且具有优先权,并且我们的jspService()方法将永远不会使用。
但是_jspInit()方法有条件地出现在jsp-> java文件中。 因此,当没有_jspInit()方法时,我们的jspInit()方法将被调用,并且这很有可能。
看看这篇不错的文章
请纠正我,我错了!
当将jsp页面转换为Servlet时,jspinit()将转换为_jspinit()方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.