Tomcat8.x 在上下文的web.xml配置跳转到jsp文件<jsp-file>

<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);
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值