访问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); } }
?
?
原文:http://mrchaohe.iteye.com/blog/2258197