Spring MVC 结构

DispatcherServlet -- 前置控制器

HandlerMapping接口 -- 处理请求的映射

HandlerMapping接口的实现类:

  • SimpleUrlHandlerMapping 通过配置文件,把一个URL映射到Controller
  • DefaultAnnotationHandlerMapping 通过注解,把一个URL映射到Controller类上

HandlerAdapter接口 -- 处理请求的映射

AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上

Controller接口 -- 控制器(handler)

由于我们使用了@Controller注解,添加了@Controller注解注解的类就可以担任控制器(Action)的职责,

所以我们并没有用到这个接口。

HandlerInterceptor 接口--拦截器

ViewResolver接口的实现类

UrlBasedViewResolver类 通过配置文件,把一个视图名交给到一个View来处理

image

springMVC的执行流程

Spring MVC是由DispatcherServlet为核心的框架,客户端发送url给web服务器,然后dispatcherServlet调用handlerMapper查询对应的Controller,查到后再经过interceptor后到达controller.

controller执行后返回ModelAndViewdispatcherServlet,随后通过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适配器,实现这个接口或继承此类,可以非常方便的实现自己的拦截器。

有以下三个方法:

  1. Action之前执行:
    public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler);

  2. 生成视图之前执行
    public void postHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler,
    ModelAndView modelAndView);

  3. 最后执行,可用于释放资源
    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";

posted @ 2020-03-10 23:04  continued258  阅读(95)  评论(0)    收藏  举报