一、 Spring MVC 优点

基于 MVC 架构:基于 MVC 架构,功能分工明确。解耦合,
容易理解,上手快,使用简单。
作为 Spring 框架一部分,能够使用 Spring IoC Aop。方便整合
Strtus,MyBatis,Hiberate,JPA 等其他框架。
SpringMVC 强化注解的使用,在控制器,ServiceDao 都可以使用注解。方便灵活。 使用
@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource 在控制器类
中注入 Service, Service 类中注入 Dao
1.1使用 SpringMVC 框架 web 请求处理顺序
web.xml
SpringMVC.xml
MyController.java:
package controllers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView
@Controller
@RequestMapping(value = "/test")
public class Mycontroller {
@RequestMapping(value = "/some.do")
public ModelAndView doSome() {
// 处理some.do请求了,相当于service调用处理完成了
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "欢迎使用springmvc做web开发");
mv.addObject("fun", "执行的是doSome方法");
mv.setViewName("show");
return mv;
}
}

二、SpringMVC 执行流程

2.1简单执行流程

用户通过浏览器发起一个 HTTP 请求,该请求会被 DispatcherServlet(前端控制器)拦截;

DispatcherServlet 调用 HandlerMapping(处理器映射器)找到具体的处理器(Handler)及拦截器,HandlerMapping将Handler以 HandlerExecutionChain 执行链的形式返回DispatcherServlet。

DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);

HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(即 Controller 控制器)对请求进行处理;

Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC 的底层对象,包括 Model 数据模型和 View 视图信息);

HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;

DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;

ViewResolver 解析完成后,会将 View 视图并返回给 DispatcherServlet;

DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);

视图负责将结果显示到浏览器(客户端)。

2.2SpringMVC核心组件

Spring MVC 对各个组件的职责划分的比较清晰。 DispatcherServlet 负责协调,其他组件则各自做分内之事,互不干扰。

三、 注解

3.1. @Controller

@Controller 注解标记一个类为 Spring Web MVC 控制器 ControllerSpring MVC 会扫描有该注解的类,然后扫描这个类下面带有 @RequestMapping 注解的方法,根据注解信息,为这个方法生成一 个对应的处理器对象。

3.2. @RequestMapping

@RequestMapping 注解,配置处理器的 HTTP 请求方法,URI等信息,这样才能将请求和方法进行映射。这个注解可以作用于类上面,也可以作用于方法上面,在类上面一般是配置这个控制器的 URI 前缀 @RequestMapping(value = "/some.do"),some.do的请求由该方法处理。

3.3. @Controller & @RestController

Controller 返回一个页面
单独使用@Controller 不加 @ResponseBody 的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。
@RestController 返回JSON XML 形式数据
@RestController 只返回对象,对象数据直接以JSON XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。

@Controller +@ResponseBody 返回JSON XML 形式数据
如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用 @Controller 并结合@ResponseBody 注解,也就是说 @Controller + @ResponseBody = @RestController Spring 4 之后新加的注解)。
@ResponseBody 注解的作用是将 Controller 的方法返回的对象通过适当的转换器转换为指定
的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回JSON 或者 XML
据,返回 JSON 数据的情况比较多。

3.4. @RequestMapping & @GetMapping

@RequestMapping :可注解在类和方法上; @GetMapping 仅可注册在方法
@RequestMapping :可进行 GETPOSTPUTDELETE 等请求方法 @GetMapping
@RequestMapping GET 请求方法的特例,目的是为了提高清晰度。

四、Interceptor(拦截器) & Filter(过滤器) & Listener(监听器)

4.1 Interceptor(拦截器)

拦截器从字面意思来讲,他的功能就是进行拦截操作。拦截器依赖于web框架,在实现上基于Java射机制属于面向切面编程(AOP)的一种运用。拦截器可以构成拦截器栈,针对Controller完成特定功能,比如日志记录、登录判断、权限检查等作用
拦截器必须实现org.springframework.web.servlet包的 HandlerInterceptor。此接口定义了三种方法:preHandle:程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行;
postHandle:原始方法运行后运行,如果原始方法被拦截,则不执行。在业务处理器(即控制器
Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端
返回响应;
afterCompletion:拦截器最后执行的方法,无论原始方法是否执行,在DispatcherServlet处理完
请求后,才会执行afterCompletion()方法。
SpringMVC.xml:

4.2. Filter(过滤器)

过滤器从字面意思来讲,它就是对请求进行一个过滤,它不能产生请求,也不能进行响应。但可以用来转换HTTP请求、响应和头信息。它可以修改对某一资源的请求,或者修改某一资源的响应。当请求到达Servlet 容器,会先经过 Filter ,然后再交给 Servlet,之后 Filter 还可以对 Servlet 的响应进一步处理。并且多个 Filter 还能形成一个链。使用图示表达如下:
过滤器依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤。它是随web应用的启动而启动,只初始化一次,以后就可以拦截相关请求,随着web应用的停止而销毁。比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。
web.xml:修改字符编码使得汉字正常显示

4.3过滤器和拦截器的执行顺序

4.4 Listener(监听器)

监听器的作用是监听一些事件的发生从而进行一些操作,比如监听ServletContext,HttpSession的创建,销毁,从而执行一些初始化加载配置文件的操作,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
Web容器启动后,Spring的监听器会启动监听,监听是否创建ServletContext的对象,如果发生了创建ServletContext对象这个事件(web容器启动后一定会生成一个ServletContext对象,所以监听事件一定会发生)ContextLoaderListener类会实例化并且执行初始化方法,将spring的配置文件中配置bean注册到Spring容器中
web.xml:

4.5总结

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐