繁体   English   中英

jsp中_jspInit()和jspInit()之间的区别

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM