在学习springmvc怎么接管申请前,咱们须要先讲一讲servlet。它其实java提供的一个Web组件。而咱们比拟熟知的Tomcat容器就是一种Servlet容器的实现,顾名思义就是用来治理servlet的。
最早学习java的时候我置信每个人都学习过Servlet的常识,咱们只须要继承一个HttpServlet,而后在WEB-INF目录下的web.xml文件中配置Servlet的拜访对外门路,最初启动Tomcat服务器。咱们就能够在浏览器中拜访该Servlet了。
不过在springboot中提供了更简略的实现,代码如下:
@WebServlet(urlPatterns = "/self_servlet/*")public class MvcTest extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("I received a req:"+req.getMethod()+"-"+req.getServletPath()+"-"+req.getRequestURI()); }}
最初只须要将该类注册到容器当中去就能够了。当然注册Servlet,Springboot提供了两种形式:
1.应用@WebServlet注解,再通过@ServletComponentScan 扫描该类,会主动注册。
2.@Bean的形式也提供注册办法:
@Bean public ServletRegistrationBean<MvcTest> registrationInit(){ ServletRegistrationBean<MvcTest> registrationBean =new ServletRegistrationBean<>(); registrationBean.addUrlMappings("/self_servlet/*"); registrationBean.setServlet(new MvcTest()); return registrationBean; }
最初咱们申请测试一下http://localhost:8080/self_servlet/dsadsd,控制台中就会打印出相应的信息。
I received a req:GET-/self_servlet-/self_servlet/dsadsd
以上的学习咱们就晓得了,只有向spring注册一个ServletBean就能够拦挡到申请,而后再办法内做解决。没错!springboot也是这么做的!这里咱们简略的引出此类,后续详解。
这个类就是DispatcherServlet,它就是HttpServlet的一个子类。容器会调用service办法,最终调用DispatcherServlet#doService的办法,代码如下:
@Override protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception { // …… 疏忽代码,只保留次要逻辑 try { doDispatch(request, response); } // …… }
能够看到的是MVC的控制器再接管到申请后会调用doDispatch办法进行一个散发操作。咱们很容易想到在这个办法里会进行最终的办法调用和后果返回。具体实现留在前面文章。
最初咱们来看一下这个DispatcherServlet怎么注册的:DispatcherServletAutoConfiguration
protected static class DispatcherServletRegistrationConfiguration { @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME) @ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet, WebMvcProperties webMvcProperties, ObjectProvider<MultipartConfigElement> multipartConfig) { DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet, webMvcProperties.getServlet().getPath()); registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup()); multipartConfig.ifAvailable(registration::setMultipartConfig); return registration; } }
DispatcherServletRegistrationBean是ServletRegistrationBean的一个子类,所以咱们晓得,springMVC的前端控制器Servlet是通过上文提到的第二种形式实现的。至于为什么应用DispatcherServletRegistrationBean而不间接用ServletRegistrationBean,是为了重写url_pattern相干的办法不容许中途被批改。