本文章只是仿写SpringMvc框架的第一篇,后续会增加Aop、HandlerInterceptor、Valid、扫描xml文件等功能。
首先说下仿写SpringMvc(mini)需要实现的几个核心功能:实现Ioc容器(Beanfactory),扫描注解解析出需要处理的类(controller、bean、RequestMapping、AutoWired注解等),实现SpringMvc核心的DispatcherServlet以及Handler等。
本项目基于idea开发
1、建立项目,新建一个maven工程导入相关依赖,主要是tomcat的依赖和配置打成jar包后程序的入口
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.34</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.dy.minispringMvc.MiniSpringMvcApp</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
注意:mainClass是你自己的main方法所在类,这里主要是为了配置jar包的程序入口。
打包时候点击左上角的Maven,然后点击install即可,打完后的包可以直接运行。
2、整合tomcat服务器,这里**注意 TomcatServer.this.tomcat.getServer().await();**开启tomcat服务等待。不然运行的时候刷一下就过去了。
package com.dy.minispringMvc.core;
import com.dy.minispringMvc.Servlet.CustomDispatcherServlet;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
public class TomcatServer {
private Tomcat tomcat;
private String[] args;
public TomcatServer(String[] args) {
this.args = args;
}
//把自定义servlet注册到tomcat容器当中
public void startServer() throws LifecycleException {
tomcat = new Tomcat();
tomcat.setPort(7788);
tomcat.start();
//创建一个Context对象
Context context = new StandardContext();
context.setPath("");
context.addLifecycleListener(new Tomcat.FixContextListener());
//实例化我们自己的CustomDispatcherServlet
CustomDispatcherServlet servlet = new CustomDispatcherServlet();
//注册我们自己的CustomDispatcherServlet到tomcat
tomcat.addServlet(context, "servlet", servlet).setAsyncSupported(true);
//设置映射,这里是7788端口下所有路径都会到我们自己的CustomDispatcherServlet
context.addServletMappingDecoded("/", "servlet");
tomcat.getHost().