spring mvc请求过程

Spring mvc处理请求过程

1、    首先客户端发送一个HTTP请求,Web服务器接收这个请求,如果匹配DispatcherServlet的请求映射路径,web容器将请求转交给DispatcherServlet处理。

2、    DispatcherServlet接收到请求,根据请求信息(包括URL,HTTP方法,请求报文,请求参数,cookie等)及HandlerMapping的配置找到对应的请求处理器(Handler),在spring MVC中并没有定义一个Handler接口,任何一个object都可以成为请求处理器。

3、    通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler,HandlerAdapter负责对各种Handler方法调用。

4、    处理器完成业务逻辑后返回一个ModelAndView给DispatcherServlet,ModelAndView包含了视图逻辑名与模型数据信息。

5、    DispatcherServlet通过ViewResolver完成逻辑视图名到真实视图对象的解析工作。

6、    当得到真实对象的Veiw,DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行视图渲染。

 

配置DispatcherServlet

<servlet>

<servlet-name>springmvc</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>springmvc</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

配置了<servlet-name>为springmvc,DispatcherServlet默认自动加载/WEB-INF/springmvc-servlet.xml(即<servlet-name>-servlet.xml)的spring配置文件,启动web层spring容器。

多个spring容器之间可以设置为父子容器,实现良好解耦,在spring mvc中,web层spring 容器将作为业务层spring容器的子容器,即web层容器可以引用业务层容器的bean,而业务层却访问不到web层容器的bean。

 

DispatcherServlet参数设置

如果需要对DispatcherServlet的默认规则修改,可以通过<servlet>的<init-param>指定

namespace

        DispatcherServlet对应命名空间,默认为<servlet-name>-servlet,显示指定该属性后,配置文件对应路径为/WEB-INF/<namespace>.xml,如/WEB-INF/springmvc.xml

contextConfigLocation

         如果DispatcherServlet上下文对应的spring配置文件有多个,可以使用该属性指定配置文件位置,如:”classpath:bb1.xml,classpath:bb2.xml”

<servlet>

    <servlet-name>springmvc</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <load-on-startup>1</load-on-startup>

    <init-param>

        <param-name>

            contextConfigLocation

       </param-name>

    <param-value>

         /WEB-INF/springmvc.xml

     </param- value>

</init-param>

</servlet>

 

DispatcherServlet内部逻辑

DispatcherServlet通过initStrategies方法装配springmvc组件

protected voidinitStrategies(ApplicationContext context) {

initMultipartResolver(context);//初始化文件上传解析器

initLocaleResolver(context);//初始化本地解析器

         initThemeResolver(context);//初始化主题解析器

         initHandlerMappings(context);//初始化处理器映射器

         initHandlerAdapters(context);//初始化处理器适配器

         initHandlerExceptionResolvers(context);//初始化异常解析器

         initRequestToViewNameTranslator(context);//初始化请求到视图名称解析器

         initViewResolvers(context);//初始化视图解析器

         initFlashMapManager(context);

}

initStrategies()方法在WebApplicationContext初始化后自动执行,此时spring上下文中的Bean已经初始化完成,该方法通过反射机制查找并装配spring容器中用户显示自定义的组件Bean,如找不到再装配默认组件实例。

org.springframework.web.servlet类路径下DispatcherServlet.properties指定了默认组件

#本地解析器

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

#主题解析器

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

#处理器映射器 (2个)

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\

         org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

#处理器适配器

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\

         org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\

         org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

#异常解析器

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\

         org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\

         org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

 

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

#视图解析器

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

 

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

如果用户希望采用非默认类型组件,则需要在spring配置文件中配置自定义组件bean,spring mvc一旦发现上下文中拥有自定义组件,就不会使用默认组件。

DispatcherServlet初始化后,会自动扫描上下文的bean,根据名称或类型匹配机制查找自定义组件,找不到则使用DispatcherServlet.properties指定的默认组件

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过配置 `HandlerInterceptor` 来增加 Spring MVC 请求的超时时间。以下是一个示例: ```java public class TimeoutInterceptor implements HandlerInterceptor { private static final int DEFAULT_TIMEOUT = 3000; // 默认超时时间为3秒 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { int timeout = getTimeout(handler); // 获取当前请求处理器的超时时间 if (timeout > 0) { request.setAttribute("javax.servlet.async.request_timeout", timeout); // 设置超时时间 } else { request.setAttribute("javax.servlet.async.request_timeout", DEFAULT_TIMEOUT); // 使用默认超时时间 } return true; } private int getTimeout(Object handler) { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Timeout timeout = handlerMethod.getMethodAnnotation(Timeout.class); // 从方法上获取超时时间 if (timeout != null) { return timeout.value(); } timeout = handlerMethod.getBeanType().getAnnotation(Timeout.class); // 从类上获取超时时间 if (timeout != null) { return timeout.value(); } } return 0; } } ``` 在上面的代码中,`Timeout` 是一个自定义的注解,表示超时时间。你需要将它添加到需要设置超时时间的请求处理器(即 Controller 中的方法)上。示例代码如下: ```java @RestController public class MyController { @GetMapping("/test") @Timeout(5000) // 设置超时时间为5秒 public String test() { // ... } } ``` 最后,在 Spring MVC 的配置文件中注册 `TimeoutInterceptor`,并将其添加到拦截器链中即可: ```xml <mvc:interceptors> <bean class="com.example.TimeoutInterceptor"/> </mvc:interceptors> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值