Spring MVC
1 什么是springMVC
springMVC基于java实现的MVC的设计模式,通过把model,view,controller分离,将web层进行解耦,将复杂的逻辑清晰化,简化代码开发,方便开发人员之间的配合.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rjgXi86v-1573720869970)(image/springmvc流程.jpg)]
用户向服务器发开请求,请求被SpringMVC 前端控制器 DispatcherServlet 捕获;
DispatcherServlet收到请求调用HandlerMapping处理器映射器()。
DispatcherServlet 对请求 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用
HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应
的拦截 器),最后以 HandlerExecutionChain 对象的形式返回;
DispatcherServlet 根据获得的 Handler,选择一个合弁的 HandlerAdapter;(附注:如果成功获得
HandlerAdapter 后,此时将开始执行拦截器的 preHandler(true或者false) 方法)
提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler(Controller)。 在填充 Handler
的 入参过程中,根据你的配置,SpringMVC 将帮你做一些额外的工作:
1 HttpMessageConveter: 将请 求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息。
2 数据转换:对请求消息进行数据转换。如 String 转换成 Integer、Double 等。
3 数据根式化:对请求消息进行数据格式 化。 如将字符串转换成格式化数字或格式化日期等。
4数据验证: 验证数据的有效性(长度、格式 等),验证结果存储到 BindingResult 或 Error 中。
Handler 执行完成后,向HandlerAdapte返回一个 ModelAndView 对象;
HandlerAdapter将根据返回的 ModelAndView(必须是已经注册到 SpringMVC 容器中的ViewResolver)返回给 DispatcherServlet;
DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
ViewReslover解析后返回具体View。
DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。DispatcherServlet响应用户。
2 SpringMVC 的注解
@Controller @Controller 用于标记在一个类上,使用它标记的类就是一个 SpringMVC Controller 对
象。
@RequestMapping @RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用
于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@Resource 和@Autowired
@Resource 和@Autowired 都是做 bean 的注入时使用,其实@Resource 并不是 Spring 的注解,它的包是
javax.annotation.Resource,需要导入,但是 Spring 支持该注解的注入。
相同点:两者都可以写在字段和 setter 方法上。两者如果都写在字段上,那么就不需要再写 setter 方
法。
不同点:
@Autowired 为 Spring 提供的注解,需要导入包
org.spring.framework.beans.factory.annotation.Autowired;
@Autowired 注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如
果允许
null 值,可以设置它的 required 属性为 false。如果我们想使用按照名称(byName)来装配,可
以结合
@Qualifier 注解一起使用。如下:
public class TestServiceImpl {
@Autowired
@Qualifier(“userDao”)
private UserDao userDao;
}
@Resource
@Resource 默认按照 ByName 自动注入,由 J2EE 提供,需要导入包
javax.annotation.Resource。
@Resource 有两个重要的属性:name 和 type,而 Spring 将@Resource 注解的 name 属性解析
为 bean 的名字,而 type 属性则解析为 bean 的类型。
所以,如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type属性时则使用
byType 自动注入策略。如果既不制定 name 也不制定 type 属性,这时将通过反射机制使用
byName 自动注入策略。
注:最好是将@Resource 放在 setter 方法上,因为这样更符合面向对象的思想,通过 set、get 去
操作属性,而不是直接去操作属性。
@ModelAttribute 和 @SessionAttributes @ModelAttribute 该 Controller 的所有方法在调用前,先执
行此@ModelAttribute 方法,可用于注解和方法 参数中,可以把这个@ModelAttribute 特性,应用在
BaseController 当中,所有的 Controller 继承 BaseController,即可实现在调用 Controller 时,先执
行@ModelAttribute 方法。 @SessionAttributes 即将值放到 session 作用域中,写在 class 上面。
@PathVariable 用于将请求 URL 中的模板变量映射到功能处理方法的参数上,即取出 uri 模板中的变量
作为参数。
@requestParam @requestParam 主要用于在 SpringMVC 后台控制层获取参数,类似一种是
requestgetParameter(“name”), 它有三个常用参数:defaultValue = “0”, required = false, value =
“isApp”;defaultValue 表示设置默认值, required 通过 boolean 设置是否是必须要传入的参数,
value 值表示接受的传入的参数类型。
@ResponseBody 作用:该注解用于将 Controller 的方法返回的对象,通过弁当的
HttpMessageConverter 转换为指定格式后, 写入到 Response 对象的 body 数据区。 使用时机:返回
的数据不是 html 标签的页面,而是其他某种格式的数据时(如 json、xml 等)使用;
@Component 相当于通用的注解,当不知道一些类归到哪个层时使用,但是不建议。
@Repository 用于注解 dao 层,在 daoImpl 类上面注解。
3 SpringMVC组件解析
前端控制器:DispatcherServlet
用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由
它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。
处理器映射器:HandlerMapping
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的
映射方式,例如:配置文件方式,实现接口方式,注解方式等。
处理器适配器:HandlerAdapter
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理
器进行执行。
处理器:Handler (程序员开发)
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由
Handler 对具体的用户请求进行处理。
视图解析器:View Resolver
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。比如 Jsp
视图:View (程序员开发)
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面
4**.常用注解**
@Component 标记在类上,表明是spring的一个组件,会进入IOC容器,如果没有指定id,就会是类的名称首字母小写
@Controller Service Repository
@RequestMapping 是一个用来处理请求地址映射的注解
@RequestParam 将指定的请求参数赋值给方法中的形参,请求参数和方法中的参数名称不一样是
@PathVariable 获取URL中的动态参数resutfull风格,
@RequestBody 读取Request请求的body部分数据
@ResponseBody 将controller方法返回的对象转为json响应给客户端
@RestController 是@Controller 和@ResponseBody 加在一起
@Transactional 写在类上 或者方法上
5 springmvc和struts2的区别
springmvc入口是servlet struts2入口filter
springmvc 是单例 (效率高) struts2 是双例的
6 springmvc三大组件
处理器映射器
处理器适配器
视图解析器
7 springMVC的优点
可以支持各种视图技术,不仅仅是jsp
与spring框架集成,(如IOC容器,和aop)
清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
支持各种请求资源的映射策略