乐趣区

关于spring:SpringMVC详解1怎么接收请求

在学习 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 相干的办法不容许中途被批改。

退出移动版