一个request请求开始到结束,究竟进行了哪些步骤, 其中springMVC哪些模块参与,开发人员其中担任什么角色;前端
1. 用户向服务器发送request请求,请求被Spring 前端控制DispatcherServlet捕获;java
2. DispatcherServlet对请求URL进行解析,获得请求资源标识符(URI)。而后根据该URI,调用HandlerMapping得到该Handler配置的全部相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;web
3. DispatcherServlet 根据得到的Handler,选择一个合适的HandlerAdapter。(附注:若是成功得到HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)spring
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程当中,根据你的配置,Spring将帮你作一些额外的工做:服务器
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息mvc
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等app
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等jsp
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中ide
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;post
6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。
在实际开发中, 咱们开发人员其实关心并很少,咱们只要作好关键配置便可, 但具体哪些呢;
xml方式注解配置
<mvc:interceptors> <!--对全部的请求记性拦截--> <!--<beans:bean class="com.sunp.common.interceptor.Myinterceptor"/>--> <!--对特定的请求进行拦截--> <mvc:interceptor> <mapping path="/kfc/brands/brand1/*"/> <beans:bean class="com.sunp.common.interceptor.Myinterceptor"/> </mvc:interceptor> </mvc:interceptors>
package cn.javass.chapter5.web.interceptor; //省略import public class HandlerInterceptor1 extends HandlerInterceptorAdapter {//此处通常继承HandlerInterceptorAdapter适配器便可 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("===========HandlerInterceptor1 preHandle 请求前"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("===========HandlerInterceptor1 postHandle 请求中"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("===========HandlerInterceptor1 afterCompletion 请求后"); } }
@Controller @RequestMapping("/welcome") public class HelloWorldController { @RequestMapping(value="/hello" ,method=RequestMethod.GET) public String printWelcome(ModelMap model){ model.addAttribute("message" ,"Spring MVC Hello World"); return "hello"; } }
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/" /> <property name="suffix" value=".jsp" /> </bean>