本章实现 @RestController标注Controller、@RequestMapping注册url、@RequestBody解析json请求参数、@RequestParam标注请求入参。
首先我们需要一个入口用起来配置以及启动Tomcat。先简单的说一下Tomcat启动流程
public class TomcatStartApplication { private static final Log log = LogFactory.getLog(TomcatStartApplication.class); public static void run(Class<?> primarySource) { log.debug(" StartBoot begin run ... "); try { TomcatStarter starter = TomcatStarter.init(); //获取启动类对应包下的所有类 Set<Class<?>> classes = ClassUtil.getChildClass(primarySource.getPackageName()); //扫描标注了RestController的类 Set<Class<?>> servletClassSet = ClassUtil.findContainAnnotation(classes, RestController.class); //注册Servlet ServletRegister servletRegister = new ServletRegister(); servletRegister.registerServlet(servletClassSet); //添加dispatcherServlet统一控制器 //Tomcat会将所有请求提交到dispatcherServlet,dispatcherServlet再根据uri调用对应的方法 TomcatStarter.addServlet("dispatcherServlet", new DispatcherServlet(), "/"); //启动Tomcat starter.startUp(); } catch (LifecycleException e) { e.printStackTrace(); log.error(" StartBoot run fail "); } } }
我们创建一个Tomcat的启动类,用于初始化以及启动Tomcat,并提供添加Servlet到Tomcat中的方法。
init()方法中的代码都是上一章所讲述过的,这章不重复讲述,这个类只是对上一章的代码简单封装了一下,忘记的同学可以打开上一章博文回顾一下~
public interface WebApplicationInitializer { void startUp() throws LifecycleException; } public class TomcatStarter implements WebApplicationInitializer{ public static Tomcat tomcat; public static StandardContext defaultContext; //默认端口 public static final int PORT = 8888; //默认项目路径 public static final String CONTEXT_PATH = ""; public static TomcatStarter init() { TomcatStarter starter = new TomcatStarter(); tomcat = new Tomcat(); //创建上下文 defaultContext= new StandardContext(); defaultContext.setPath(CONTEXT_PATH); defaultContext.addLifecycleListener(new Tomcat.FixContextListener()); tomcat.getHost().addChild(defaultContext); Connector connector = new Connector(); connector.setPort(PORT); tomcat.setConnector(connector); return starter; } @Override public void startUp() throws LifecycleException { tomcat.start(); } public static void addServlet(String servletName, Servlet servlet,String pattern) { tomcat.addServlet(CONTEXT_PATH,servletName , servlet); defaultContext.addServletMappingDecoded(pattern,servletName); } }
注意:由于我们只注册了一个 "/" 路径到Tomcat中,该路径会将所有请求解析到DispatcherServlet,再由DispatcherServlet进行处理请求,请求规则如下图:
这个时候我们就需要把所有类扫描出来,并找出使用@RestController注解标注的类,并把对应所需要调用的方法注册成Handler。