Tomcat 编译 jsp 流程

Tomcat启动进行默认初始化

org.apache.catalina.startup.Tomcat;
    public static void initWebappDefaults(Context ctx) {
        // Default servlet 
        Wrapper servlet = addServlet(
                ctx, "default", "org.apache.catalina.servlets.DefaultServlet");
        servlet.setLoadOnStartup(1);

        // JSP servlet (by class name - to avoid loading all deps)
        //添加jsp映射的Servlet
        servlet = addServlet(
                ctx, "jsp", "org.apache.jasper.servlet.JspServlet");
        servlet.addInitParameter("fork", "false");
        servlet.setLoadOnStartup(3);
        
        // Servlet mappings 
        ctx.addServletMapping("/", "default");
        ctx.addServletMapping("*.jsp", "jsp");
        ctx.addServletMapping("*.jspx", "jsp");

        // Sessions
        //设置session管理器
        ctx.setManager( new StandardManager());
        ctx.setSessionTimeout(30);
        
        // MIME mappings
        for (int i = 0; i < DEFAULT_MIME_MAPPINGS.length;) {
            ctx.addMimeMapping(DEFAULT_MIME_MAPPINGS[i++],
                    DEFAULT_MIME_MAPPINGS[i++]);
        }
        
        // Welcome files
        ctx.addWelcomeFile("index.html");
        ctx.addWelcomeFile("index.htm");
        ctx.addWelcomeFile("index.jsp");
    }

 

访问jsp页面tomcat交由JspServlet处理

 

org.apache.jasper.servlet.JspServlet

private void serviceJspFile(HttpServletRequest request,
                                HttpServletResponse response, String jspUri,
                                boolean precompile){
        //判断jsp是否已经封装        
        JspServletWrapper wrapper = rctxt.getWrapper(jspUri);
        if (wrapper == null) {
            synchronized(this) {
                wrapper = rctxt.getWrapper(jspUri);
                //没有封装得到jsp文件
                if (wrapper == null) {
                    // Check if the requested JSP page exists, to avoid
                    // creating unnecessary directories and files.
                    // jsp文件不存在进行错误操作
                    if (null == context.getResource(jspUri)) {
                        handleMissingResource(request, response, jspUri);
                        return;
                    }
                    //如果存在封装jsp并添加映射
                    wrapper = new JspServletWrapper(config, options, jspUri,
                                                    rctxt);
                    rctxt.addWrapper(jspUri,wrapper);
                }
            }
        }

        try {
            //执行jsp封装的service
            //@see org.apache.jasper.servlet.JspServletWrapper#service(HttpServletRequest request, 
                        HttpServletResponse response,
                        boolean precompile)
            wrapper.service(request, response, precompile);
        } catch (FileNotFoundException fnfe) {
            handleMissingResource(request, response, jspUri);
        }
}

 

org.apache.jasper.servlet.JspServletWrapper

public void service(HttpServletRequest request, 
                        HttpServletResponse response,
                        boolean precompile)
            throws ServletException, IOException, FileNotFoundException {
//......
            /*
             * (1) Compile
             */
            if (options.getDevelopment() || firstTime ) {
                synchronized (this) {
                    firstTime = false;

                    // The following sets reload to true, if necessary
                    //编译jsp
                    ctxt.compile();
                }
            } else {
                if (compileException != null) {
                    // Throw cached compilation exception
                    throw compileException;
                }
            }

            /*
             * (2) (Re)load servlet class file
             */
            //得到jsp编译后的Servlet
            servlet = getServlet();
//......
            /*
             * (4) Service request
             */
            if (servlet instanceof SingleThreadModel) {
               // sync on the wrapper so that the freshness
               // of the page is determined right before servicing
               synchronized (this) {
                   //单线程执行jsp编译后的Servlet
                   servlet.service(request, response);
                }
            } else {
                //方法线程执行(非单线程)
                servlet.service(request, response);
            }
}

 

 

org.apache.jasper.compiler.Compiler
public void compile(boolean compileClass, boolean jspcMode)
  throws FileNotFoundException, JasperException, Exception {
  //生成java
  String[] smap = generateJava();
  //生成class
  generateClass(smap);
}

protected String[] generateJava() throws Exception {
  //生成java文件    
  writer = setupContextWriter(javaFileName);
  //写入java内容
  Generator.generate(writer, this, pageNodes);

}

 

org.apache.jasper.JspCompilationContext

public Compiler createCompiler() {
        //试着将options.getCompilerClassName改为自己重构的类
        if (options.getCompilerClassName() != null) {
            jspCompiler = createCompiler(options.getCompilerClassName());
        } else {
}

 

猜你喜欢

转载自mrchaohe.iteye.com/blog/2258197