<servlet>
<servlet-name>/hellojsp</servlet-name>
<jsp-file>/a/b/c/file.jsp</jsp-file>
</servlet>
// <jsp-file> 标签的解析,转成标准化org.apache.catalina.core.StandardWrapper
// <jsp-file> 标签的解析--------------1
// <servlet>
// <servlet-name>/hellojsp</servlet-name>
// <jsp-file>/a/b/c/file.jsp</jsp-file>
// </servlet>
// servletDef {
// "jspFile":null,
// "servletClass": "org.apache.jasper.servlet.JspServlet",
// "parameters":{
// "jspFile" : "/a/b/c/file.jsp",
// },
// "parameters":{
// "fork":false,
// "xpoweredBy":false
// }
// }
class org.apache.catalina.startup.ContextConfig{
public void lifecycleEvent(LifecycleEvent event) {
context = (Context) event.getLifecycle(); // 取得触发者 org.apache.catalina.core.StandardContext
configureStart();
}
protected void webConfig() {
// 使用 org.apache.jasper.servlet.JspServlet 包装 <jsp-file>/a/b/c/file.jsp</jsp-file>的文件
convertJsps(webXml);
}
private void convertJsps(WebXml webXml) {
Map<String,String> jspInitParams;
ServletDef jspServlet = webXml.getServlets().get("jsp");
if (jspServlet == null) {
jspInitParams = new HashMap<>();
Wrapper w = (Wrapper) context.findChild("jsp"); // org.apache.jasper.servlet.JspServlet
if (w != null) {
String[] params = w.findInitParameters();
for (String param : params) {
jspInitParams.put(param, w.findInitParameter(param));
}
}
} else {
jspInitParams = jspServlet.getParameterMap();
}
for (ServletDef servletDef: webXml.getServlets().values()) {
if (servletDef.getJspFile() != null) {
// 如果是使用 <jsp-file>a/b/c/file.jsp</jsp-file>配置的文件,要转换
convertJsp(servletDef, jspInitParams);
}
}
}
private void convertJsp(ServletDef servletDef,
Map<String,String> jspInitParams) {
// org.apache.jasper.servlet.JspServlet
servletDef.setServletClass(org.apache.catalina.core.Constants.JSP_SERVLET_CLASS); //常量
String jspFile = servletDef.getJspFile();
if ((jspFile != null) && !jspFile.startsWith("/")) {
if (context.isServlet22()) {
if(log.isDebugEnabled()) {
log.debug(sm.getString("contextConfig.jspFile.warning",
jspFile));
}
jspFile = "/" + jspFile;
} else {
throw new IllegalArgumentException
(sm.getString("contextConfig.jspFile.error", jspFile));
}
}
servletDef.getParameterMap().put("jspFile", jspFile);
servletDef.setJspFile(null);
for (Map.Entry<String, String> initParam: jspInitParams.entrySet()) {
servletDef.addInitParameter(initParam.getKey(), initParam.getValue());
}
}
}
// 转成标准化的org.apache.catalina.core.StandardWrapper---------------2
for (ServletDef servlet : webxml.getServlets().values()) { // 添加Servlet对象
// org.apache.catalina.core.StandardContext.createWrapper();
// 创建org.apache.catalina.core.StandardWrapper对象
// 给wrapper添加生命周期监听器
// 给wrapper添加容器监听器
Wrapper wrapper = context.createWrapper();
// Description is ignored
// Display name is ignored
// Icons are ignored
// jsp-file gets passed to the JSP Servlet as an init-param
if (servlet.getLoadOnStartup() != null) {
wrapper.setLoadOnStartup(servlet.getLoadOnStartup().intValue());
}
if (servlet.getEnabled() != null) {
wrapper.setEnabled(servlet.getEnabled().booleanValue());
}
wrapper.setName(servlet.getServletName()); // servlet的名称
Map<String,String> params = servlet.getParameterMap(); // Servlet的属性
for (Entry<String, String> entry : params.entrySet()) {
wrapper.addInitParameter(entry.getKey(), entry.getValue());
}
wrapper.setRunAs(servlet.getRunAs());
Set<SecurityRoleRef> roleRefs = servlet.getSecurityRoleRefs();
for (SecurityRoleRef roleRef : roleRefs) {
wrapper.addSecurityReference(
roleRef.getName(), roleRef.getLink());
}
wrapper.setServletClass(servlet.getServletClass()); // Servlet的类名
//servlet === org.apache.tomcat.util.descriptor.web.ServletDef
// 设置文件上传的配置
// <web-app>
// <servlet>
// <multipart-config>
// <!-- 50MB max -->
// <max-file-size>52428800</max-file-size>
// <max-request-size>52428800</max-request-size>
// <file-size-threshold>0</file-size-threshold>
// </multipart-config>
// </servlet>
// </web-app>
MultipartDef multipartdef = servlet.getMultipartDef();
if (multipartdef != null) {
if (multipartdef.getMaxFileSize() != null &&
multipartdef.getMaxRequestSize()!= null &&
multipartdef.getFileSizeThreshold() != null) {
// 设置文件上传的配置
wrapper.setMultipartConfigElement(new MultipartConfigElement(
multipartdef.getLocation(),
Long.parseLong(multipartdef.getMaxFileSize()),
Long.parseLong(multipartdef.getMaxRequestSize()),
Integer.parseInt(
multipartdef.getFileSizeThreshold())));
} else {
// org.apache.catalina.core.StandardWrapper
wrapper.setMultipartConfigElement(new MultipartConfigElement(
multipartdef.getLocation()));
}
}
if (servlet.getAsyncSupported() != null) {
wrapper.setAsyncSupported(
servlet.getAsyncSupported().booleanValue());
}
wrapper.setOverridable(servlet.isOverridable());
// wrapper === org.apache.catalina.core.StandardWrapper
context.addChild(wrapper);
}