访问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