最近看一个项目的源码的时候突然想起,既然struts2继承MVC设计模式,将视图与控制分离开,与SERVLET API的耦合降到最低,那么JSP编译执行之后的文件还是一个SERVLET吗?于是我在TOMCAT里面看了下,发现与纯JSP确实不一样,但是又很相似,大概是这种        这到底是什么?跟SERVLET有什么区别?请大虾们详细解下import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
import com.bbs.struts.DAO.*;
import com.bbs.struts.tl.*;
import java.util.*;
import com.bbs.struts.DAO.*;public final class register_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();  private static java.util.List _jspx_dependants;  static {
    _jspx_dependants = new java.util.ArrayList(4);
    _jspx_dependants.add("/top.jsp");
    _jspx_dependants.add("/top2.jsp");
    _jspx_dependants.add("/footer.jsp");
    _jspx_dependants.add("/WEB-INF/app.tld");
  }  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005fif_0026_005ftest;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005fform_0026_005fnamespace_005fid_005faction;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005felse;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005fproperty_0026_005fvalue_005fnobody;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005ftextfield_0026_005fsize_005fname_005fmaxlength_005fid_005fnobody;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005fpassword_0026_005fsize_005fname_005fmaxlength_005fid_005fnobody;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005fproperty_0026_005fvalue_005fdefault_005fnobody;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fapp_005fdisplayCount_005fnobody;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005fform_0026_005fnamespace_005faction;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005ftextfield_0026_005fvalue_005fsize_005fname_005fmaxlength_005fid_005fnobody;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005fradio_0026_005fvalue_005fname_005flist_005fcssStyle_005fnobody;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005ftextarea_0026_005frows_005fname_005fid_005fnobody;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005fselect_0026_005fvalue_005frequired_005fonchange_005fname_005flist_005fid_005fheaderKey_005fnobody;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005fsubmit_0026_005fvalue_005ftype_005fonclick_005fcssClass_005fnobody;
  private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fs_005fsubmit_0026_005fvalue_005ftype_005fnobody;  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.AnnotationProcessor _jsp_annotationprocessor;  public Object getDependants() {
    return _jspx_dependants;
  }  public void _jspInit() {
    _005fjspx_005ftagPool_005fs_005fif_0026_005ftest = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005fform_0026_005fnamespace_005fid_005faction = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005felse = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005fproperty_0026_005fvalue_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005ftextfield_0026_005fsize_005fname_005fmaxlength_005fid_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005fpassword_0026_005fsize_005fname_005fmaxlength_005fid_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005fproperty_0026_005fvalue_005fdefault_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fapp_005fdisplayCount_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005fform_0026_005fnamespace_005faction = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005ftextfield_0026_005fvalue_005fsize_005fname_005fmaxlength_005fid_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005fradio_0026_005fvalue_005fname_005flist_005fcssStyle_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005ftextarea_0026_005frows_005fname_005fid_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005fselect_0026_005fvalue_005frequired_005fonchange_005fname_005flist_005fid_005fheaderKey_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005fsubmit_0026_005fvalue_005ftype_005fonclick_005fcssClass_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _005fjspx_005ftagPool_005fs_005fsubmit_0026_005fvalue_005ftype_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
  }  public void _jspDestroy() {
    _005fjspx_005ftagPool_005fs_005fif_0026_005ftest.release();
    _005fjspx_005ftagPool_005fs_005fform_0026_005fnamespace_005fid_005faction.release();
    _005fjspx_005ftagPool_005fs_005felse.release();
    _005fjspx_005ftagPool_005fs_005fproperty_0026_005fvalue_005fnobody.release();
    _005fjspx_005ftagPool_005fs_005ftextfield_0026_005fsize_005fname_005fmaxlength_005fid_005fnobody.release();
    _005fjspx_005ftagPool_005fs_005fpassword_0026_005fsize_005fname_005fmaxlength_005fid_005fnobody.release();
    _005fjspx_005ftagPool_005fs_005fproperty_0026_005fvalue_005fdefault_005fnobody.release();
    _005fjspx_005ftagPool_005fapp_005fdisplayCount_005fnobody.release();
    _005fjspx_005ftagPool_005fs_005fform_0026_005fnamespace_005faction.release();
    _005fjspx_005ftagPool_005fs_005ftextfield_0026_005fvalue_005fsize_005fname_005fmaxlength_005fid_005fnobody.release();
    _005fjspx_005ftagPool_005fs_005fradio_0026_005fvalue_005fname_005flist_005fcssStyle_005fnobody.release();
    _005fjspx_005ftagPool_005fs_005ftextarea_0026_005frows_005fname_005fid_005fnobody.release();
    _005fjspx_005ftagPool_005fs_005fselect_0026_005fvalue_005frequired_005fonchange_005fname_005flist_005fid_005fheaderKey_005fnobody.release();
    _005fjspx_005ftagPool_005fs_005fsubmit_0026_005fvalue_005ftype_005fonclick_005fcssClass_005fnobody.release();
    _005fjspx_005ftagPool_005fs_005fsubmit_0026_005fvalue_005ftype_005fnobody.release();
  }  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {
。。

解决方案 »

  1.   

    jsp是一种特殊的servlet,通过编译之后还是servlet
      

  2.   

    JSP编译执行之后的文件还是一个SERVLET,jsp是在servlet的基础上发展过来的
      

  3.   

    <%= (this instanceof javax.servlet.Servlet) %>jsp只是一个模板,最终运行的还是编译成Servlet的.class
      

  4.   

    一样的,什么struts的jsp
    难道还有servlet的jsp
      

  5.   

    必须的!  不管是什么框架,他们这要是J2EE项目,最后使用的还是servlet,hibernate的底层使用的还是JDBC!
      

  6.   

    jsp是一种特殊的servlet,通过编译之后还是servlet,同意2楼。
      

  7.   

    public final class register_jsp extends org.apache.jasper.runtime.HttpJspBase看这里编译后的JSP继承自HttpJspBase这个抽象类
    而HttpJspBase这个类是继承自HttpServlet的 很明显是个servlet
    eclipse可以ctrl+shift+T搜下这2个类就知道了
      

  8.   

    主要是想知道STRUTS2为什么继承HttpJspBase而不继承HttpServlet,而且你看前者的代码确实很长,这样不会影响JSP编译成JAVA文件的时间吗?
      

  9.   

    和Struts2没有一丝一毫的关系。
    继承HttpJspBase,就是因为他在HttpServlet的基础上增加了很多帮助jsp的功能。直接继承HttpServlet,生成的代码更冗长。另外,代码的长短和运行时间没有任何关系。话说下面这行代码,就一行,但是运行时间最长
    for(;;);