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 { }