前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于DispatchServlet

关于DispatchServlet

作者头像
大话swift
发布2019-09-12 12:06:24
6280
发布2019-09-12 12:06:24
举报
文章被收录于专栏:大话swift大话swift大话swift

SpringMVC其实是SpringFramework下的一个基于Servlet API的一个子项目。为啥叫SpringMVC呢?是因为它的源码部分的module是spring-webmvc,那么DispatchServlet里面我们都能做啥呢?

和多说的Servlet一样,DispatchServlet需要通过web.xml来声明和配置文件映射特定的Servlet。与此对应,DispatchServlet通过Spring的configuration来去查找delegate对应的请求映射,view视图解析,异常处理等

下面的粒子是基于Java文件的configuration注册和初始化DispatchServlet

public class MyWebApplicationInitializer implements WebApplicationInitializer {
    @Override    public void onStartup(ServletContext servletCxt) {
        // Load Spring web application configuration        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();        ac.register(AppConfig.class);        ac.refresh();
        // Create and register the DispatcherServlet        DispatcherServlet servlet = new DispatcherServlet(ac);        ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);        registration.setLoadOnStartup(1);        registration.addMapping("/app/*");    }}

而接下来的是通过web.xml 进行configuration注册和初始化实现的DispatchServlert

<web-app>
    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>
    <context-param>        <param-name>contextConfigLocation</param-name>        <param-value>/WEB-INF/app-context.xml</param-value>    </context-param>
    <servlet>        <servlet-name>app</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <init-param>            <param-name>contextConfigLocation</param-name>            <param-value></param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>
    <servlet-mapping>        <servlet-name>app</servlet-name>        <url-pattern>/app/*</url-pattern>    </servlet-mapping>
</web-app>

也就是说Spring要想启动一个web项目有两种方式:web.xml配置和使用Java原生文件进行配置(SpringBoot采用的方式)

  1. 拦截器 所有的HandlerMapping都支持拦截器功能,当你想对特定的request实现某个特定的功能时,比如说检测一些需求。而我们的拦截器必须实现HandlerInterceptor这个interface,然后覆写这些方法
  • preHandle(..): Before the actual handler is executed
  • postHandle(..): After the handler is executed
  • afterCompletion(..): After the complete request has finished
  1. 异常 加入请求中发生异常或者来自halder抛出的异常(@Controller),DispatchServlet代理会根据HandlerExceptionResolver链去寻找能处理摸个特定异常对应的handling 假如,有的Resolver都没能处理这个错误,那么系统为我们生成一个默认的处理页面,当然我们也可以自己在web.xml中注册一个
<error-page>    <location>/error</location></error-page>

然后自己实现一个响应的hanler

@RestControllerpublic class ErrorController {
    @RequestMapping(path = "/error")    public Map<String, Object> handle(HttpServletRequest request) {        Map<String, Object> map = new HashMap<String, Object>();        map.put("status", request.getAttribute("javax.servlet.error.status_code"));        map.put("reason", request.getAttribute("javax.servlet.error.message"));        return map;    }}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档