首页 > Web开发 > 详细

Tomcat 编译 jsp 流程

时间:2015-11-21 02:07:55      阅读:405      评论:0      收藏:0      [点我收藏+]

访问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);
            }
}

?

?

Tomcat 编译 jsp 流程

原文:http://mrchaohe.iteye.com/blog/2258197

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!