Spring MVC 结构
DispatcherServlet -- 前置控制器
HandlerMapping接口 -- 处理请求的映射
HandlerMapping接口的实现类:
- SimpleUrlHandlerMapping 通过配置文件,把一个URL映射到Controller
- DefaultAnnotationHandlerMapping 通过注解,把一个URL映射到Controller类上
HandlerAdapter接口 -- 处理请求的映射
AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上
Controller接口 -- 控制器(handler)
由于我们使用了@Controller注解,添加了@Controller注解注解的类就可以担任控制器(Action)的职责,
所以我们并没有用到这个接口。
HandlerInterceptor 接口--拦截器
ViewResolver接口的实现类
UrlBasedViewResolver类 通过配置文件,把一个视图名交给到一个View来处理

springMVC的执行流程
Spring MVC是由DispatcherServlet为核心的框架,客户端发送url给web服务器,然后dispatcherServlet调用handlerMapper查询对应的Controller,查到后再经过interceptor后到达controller.
controller执行后返回ModelAndView给dispatcherServlet,随后通过ViewResolver(视图解析器)解析ModelAndView,然后将参数放到View中返回给浏览器.
请求如何映射到具体的Action中的方法?
方案一:基于xml配置映射,可以利用SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping进行Url映射和拦截请求。
配置方法略。
方案二:基于注解映射,可以使用DefaultAnnotationHandlerMapping。
xml代码
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
</bean>
并在类上使用:
@Controller
@RequestMapping("/user")
Spring中的拦截器:
Spring为我们提供了:org.springframework.web.servlet.HandlerInterceptor接口,
org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,实现这个接口或继承此类,可以非常方便的实现自己的拦截器。
有以下三个方法:
-
Action之前执行:
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler); -
生成视图之前执行
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView); -
最后执行,可用于释放资源
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
- 分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)
- 在preHandle中,可以进行编码、安全控制等处理;
- 在postHandle中,有机会修改ModelAndView;
- 在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。
参数中的Object handler是下一个拦截器。
转发与重定向
可以通过redirect/forward:url方式转到另一个Action进行连续的处理。
可以通过redirect:url 防止表单重复提交 。
写法如下:
-
return "forward:/order/add";
-
return "redirect:/index.jsp";

浙公网安备 33010602011771号