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,
DEFAULT_MIME_MAPPINGS);
}
// 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 {
}
页:
[1]