本文源码: GitHub. 点这里 https://github.com/cicadasmile/spring-mvc-parent || GitEE. 点这里 https://gitee.com/cicadasmile/spring-mvc-parent
一, SpringMvc 框架简介
1,Mvc 设计理念
MVC 是一种软件设计典范, 用一种业务逻辑, 数据, 界面显示分离的方法组织代码, 将业务逻辑聚集到一个组件里面, 在改进和个性化定制界面及用户交互的同时, 不需要重新编写业务逻辑, MVC 分层有助于管理和架构复杂的应用程序
M: 代表模型 Model
模型就是数据, 应用程序的核心.
V: 代表视图 View
回显数据的界面, 例如 JSP 就是用来展示模型中的数据.
C: 代表控制器 Controller
控制器的作用就是根据入参, 把不同的响应数据 (Model), 显示在不同的视图(View) 上.
2,SpringMvc 简介
框架描述
SpringMVC 是一种基于 Java 实现的 MVC 设计模式的请求驱动类型的轻量级 web 框架, 出自 Spring 框架全家桶, 与 Spring 框架无缝整合, 使用了 MVC 架构模式的思想, 将 Web 层进行职责解耦.
框架优点
结构松散, 几乎可以在 SpringMVC 中使用各类视图, 各个模块分离而且耦合度非常低, 且易于扩展. 与 Spring 无缝集成, 且简单, 灵活, 容易上手.
二, SpringMvc 执行流程
1, 流程图解
2, 步骤描述
(1), 发起请求到前端控制器 DispatcherServlet;
(2), 前端控制器请求 HandlerMapping 查找, Handler 可以根据 xml 配置, 注解进行查找;
(3), 处理器映射器 HandlerMapping 向前端控制器返回 Handler;
(4), 前端控制器调用处理器适配器去执行 Handler;
(5), 处理器适配器去执行 Handler ;
(6),Handler 执行完成给适配器返回 ModelAndView ;
(7), 处理器适配器向前端控制器返回 ModelAndView,ModelAndView 是 springmvc 框架的一个底层对象, 包括 Model 和 view;
(8), 前端控制器请求视图解析器去进行视图解析, 根据逻辑视图名解析成真正的视图 ;
(9), 视图解析器向前端控制器返回 View ;
(10), 前端控制器进行视图渲染, 视图渲染将模型数据 (在 ModelAndView 对象中) 填充到 request 域中;
(11), 前端控制器向用户响应结果 ;
3, 核心组件
前端控制器
DispatcherServlet: 请求离开浏览器后, 最先到达的就是 DispatcherServlet, 是整个流程控制的中心, 作用接收请求, 响应结果, 相当于转发器, 中央处理器. 减少各个组件之间的耦合度.
处理器映射器
HandlerMapping: 根据请求的 url 路由到指定接口, 用户请求找到 Handler 处理器, springmvc 提供不同类型映射器, 例如: xml 配置方式, 注解方式等.
处理器适配器
HandlerAdapter: 按照特定规则去执行 Handler,SpringMvc 支持多种处理器, 各种处理器中的处理方法各不相同, 为了解决适应多种处理器, 就出现了处理器适配器.
处理器
Handler: 处理用户请求, 涉及具体业务逻辑, 需要程序员根据业务需求开发. 编写 Handler 时按照 HandlerAdapter 的规则开发, 这样适配器才可以正确执行 Handler.
视图解析器
ViewResolver: 负责将请求的响应结果生成 View, 根据逻辑视图名解析成物理视图名, 就是具体页面地址, 生成 View 视图对象, 对 View 进行渲染, 通过页面展示给用户.
视图
View:SpringMvc 框架提供很多的 View 视图类型的支持, 包括: jsp,freemarker,PDF 等. 通过页面标签或页面模版解析模型数据回显到页面, 需要根据业务开发具体页面.
三, 整合 Spring 框架配置
1,spring-mvc 配置
- <!-- 扫描文件 -->
- <context:component-scan base-package="com.spring.mvc.controller" />
- <!-- MVC 默认的注解映射的方式 -->
- <mvc:annotation-driven />
- <mvc:default-servlet-handler/>
- <!-- 视图解析器 -->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/page/" />
- <property name="suffix" value=".jsp" />
- </bean>
2,Web.xml 配置
- <servlet>
- <servlet-name>spring-mvc</servlet-name>
- <servlet-class>org.springframework.Web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-mvc.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>spring-mvc</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
3, 测试接口
- @Controller
- public class HelloController {
- @RequestMapping("/getInfo")
- public @ResponseBody String getInfo (String name){
- return name ;
- }
- }
4, 常用注解说明
@Controller
标记一个类是 Handler, 也就是开发的 Controller, 然后使用 @RequestMapping 或其他相关注解(@GetMapping,@PostMapping,@PutMapping,@DeleteMapping), 用来关联请求和 Controller 方法之间的映射关系, 这样的 Controller 就可以被请求访问.
@RequestMapping
处理请求地址映射的注解, 可作用于类或方法上. 用于类上, 表示类中的所有响应请求的方法都是以类上标注地址作为父路径.
@requestParam
主要用于在 SpringMvc 框架的控制层获取参数, 三个常用参数: defaultValue 表示设置默认值, required 通过 boolean 设置是否是必须要传入的参数, value 值表示传入的参数名称.
@RequestBody
接收请求体中传递给后端的 JSON 字符串数据的, GET 方式无请求体, 所以使用 @RequestBody 接收数据时, 不能使用 GET 方式提交数据, 需要用 POST 方式进行提交.
@ResponseBody
该注解用于方法的返回对象, 可以通过配置转换器为指定数据响应格式, 如果希望返回的数据不是 View 试图页面, 而是指定数据格式的时候使用, 例如: JSON,xml 等.
@Autowired
按照类型 (byType) 装配依赖对象, 默认情况下它要求依赖对象必须存在, 如果允许 null 值, 可以设置它的 required 属性为 false. 如果想使用按照名称 (byName) 来装配, 可以结合 @Qualifier 注解一起使用.
@Resource
按照 ByName 自动注入, 需要导入包 javax.annotation.Resource.@Resource 有两个重要的属性: name 和 type, 而 Spring 将 @Resource 注解的 name 属性解析为 bean 的名字, 而 type 属性则解析为 bean 的类型.
@PathVariable
用于将请求 URL 中的模板变量映射到功能处理方法的参数上, 即取出 uri 模板中的变量作为参数.
四, 常见参数映射
1, 普通映射
- @RequestMapping("/getSum")
- public Integer getSum (int a,int b){
- return a+b ;
- }
测试:
http://localhost:6003/getSum?a=1&b=2
传参名称和方法参数保持一致.
2, 指定参数名
- @RequestMapping("/getInfo")
- public String getInfo (@RequestParam("name") String var1,
- @RequestParam("say") String var2){
- return var1+":"+var2 ;
- }
测试:
http://localhost:6003/getInfo?name=cica&say=hello
传参名和 @RequestParam 指定的参数名要对应.
3, 数组参数
- @GetMapping("/getArray")
- public String getArray (String[] ids){
- return ids[0]+"-"+ids[1] ;
- }
测试:
http://localhost:6003/getArray?ids=2&ids=3
传递并解析数组类型的参数格式.
4,Map 参数
- @RequestMapping("/getMap")
- public String getMap (@RequestParam Map<String,String> paramMap){
- return paramMap.get("name") ;
- }
测试:
http://localhost:6003/getCityEntity?province = 浙江 & name = 杭州
这里以 Post 方式将相关参数传递 CityEntity 实体对象中.
5, 包装参数
- @PostMapping("/getCityEntity")
- public CityEntity getCityEntity (CityEntity cityEntity){
- return cityEntity ;
- }
测试:
http://localhost:6003/getCityEntity?province = 浙江 & name = 杭州
这里以 Post 方式将相关参数传递 CityEntity 实体对象中.
6,REST 风格参数
- @GetMapping("/getId/{id}")
- public String getId (@PathVariable("id") Integer id){
- return "id="+id ;
- }
测试:
http://localhost:6003/getId/1
RestFul 风格参数映射.
五, 源代码地址
GitHub. 地址
https://github.com/cicadasmile/spring-mvc-parent
GitEE. 地址
https://gitee.com/cicadasmile/spring-mvc-parent
Spring 框架基础(06):Mvc 架构模式简介, 执行流程详解
来源: http://www.bubuko.com/infodetail-3319495.html