在研究SpringMVC源码以前得先看看Tomcat的源码(由于WEB应用要工做在容器中)。先构建Tomcat8的源码环境java
进入Tomcat官网https://tomcat.apache.org/download-80.cgi,选择tomcat8,下载下来是tomcat-8.5.49web
新建一个tomcat-8.5.49目录,再到其下新建一个deploy(是Tomcat的工做目录:-Dcatalina.home=x:\\*.*\deploy -Dcatalina.base=x:\\*.*\deploy)目录和导入源码目录,最终效果以下apache
deploy目录下的结构,除了能够复制的,其余目录直接新建tomcat
在tomcat-8.5.49目录下新建一个pom.xmlcookie
内容以下:session
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>gxf</groupId> <artifactId>apache-tomcat-8</artifactId> <name>apache-tomcat-8</name> <version>1.0</version> <packaging>pom</packaging> <modules> <module>tomcat-8</module> </modules> </project>
在tomcat-8目录下新建pom.xml,文件内容以下:app
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-8</artifactId> <name>tomcat-8</name> <version>8.5</version> <build> <finalName>tomcat8.0</finalName>w <sourceDirectory>java</sourceDirectory> <!--CookieFilter 报错的一种解决方法就是将测试目录注释掉--> <testSourceDirectory>test</testSourceDirectory> <resources> <resource> <directory>java</directory> </resource> </resources> <testResources> <testResource> <directory>test</directory> </testResource> </testResources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <encoding>UTF-8</encoding> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.5</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>ant</groupId> <artifactId>ant</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>javax.xml</groupId> <artifactId>jaxrpc</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.eclipse.jdt.core.compiler</groupId> <artifactId>ecj</artifactId> <version>4.6.1</version> </dependency> </dependencies> </project>
File-Open-选择tomcat-8.5.49目录下的pom.xml文件,Idea会提示你,选择导入为Maven项目eclipse
导入成功以后以下所示:maven
中间会遇到的问题:ide
CookieFilter会报错,有三种解决方式:
1.在test源码目录下的util目录下新建CookieFitler
package util; import java.util.Locale; import java.util.StringTokenizer; /** * Processes a cookie header and attempts to obfuscate any cookie values that * represent session IDs from other web applications. Since session cookie names * are configurable, as are session ID lengths, this filter is not expected to * be 100% effective. * * It is required that the examples web application is removed in security * conscious environments as documented in the Security How-To. This filter is * intended to reduce the impact of failing to follow that advice. A failure by * this filter to obfuscate a session ID or similar value is not a security * vulnerability. In such instances the vulnerability is the failure to remove * the examples web application. */ public class CookieFilter { private static final String OBFUSCATED = "[obfuscated]"; private CookieFilter() { // Hide default constructor } public static String filter(String cookieHeader, String sessionId) { StringBuilder sb = new StringBuilder(cookieHeader.length()); // Cookie name value pairs are ';' separated. // Session IDs don't use ; in the value so don't worry about quoted // values that contain ; StringTokenizer st = new StringTokenizer(cookieHeader, ";"); boolean first = true; while (st.hasMoreTokens()) { if (first) { first = false; } else { sb.append(';'); } sb.append(filterNameValuePair(st.nextToken(), sessionId)); } return sb.toString(); } private static String filterNameValuePair(String input, String sessionId) { int i = input.indexOf('='); if (i == -1) { return input; } String name = input.substring(0, i); String value = input.substring(i + 1, input.length()); return name + "=" + filter(name, value, sessionId); } public static String filter(String cookieName, String cookieValue, String sessionId) { if (cookieName.toLowerCase(Locale.ENGLISH).contains("jsessionid") && (sessionId == null || !cookieValue.contains(sessionId))) { cookieValue = OBFUSCATED; } return cookieValue; } }
2.删除test源码目录
3.删除报错的类
从新rebuild应该能够成功
配置"run configuration"
点击:run-新建一个Application ,tomcat8.5.49
VM-OPTIONS
-Dcatalina.home=deploy -Dcatalina.base=deploy -Djava.endorsed.dirs=deploy/endorsed -Djava.io.tmpdir=deploy/temp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=deploy/conf/logging.properties -Dfile.encoding=UTF8 -Duser.language=en -Duser.region=US
其中后面三项是设置启动后的乱码问题
此时运行还会报错,须要改一点代码
/*添加JSP支持*/ context.addServletContainerInitializer(new JasperInitializer(),null);
到这里应该全部的问题都解决了,启动,验证
熟悉的8080端口提示
可能不熟悉的tom猫的管理界面