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

时间:2015-12-04 11:09:50

标签: java 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。这是为了理解目的。

2 个答案:

答案 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()方法。