# spring-04-mvc
**Repository Path**: stevenye/spring-04-mvc
## Basic Information
- **Project Name**: spring-04-mvc
- **Description**: spring MVC框架的学习使用案例
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2017-01-11
- **Last Updated**: 2020-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#spring mvc 学习案例
## MVC 基本概念
定义:是一种设计思想,把前后端交互的过程中所参与的对象划分成视图、模型、控制三层,并以面像抽象编程的理念进行整合

### 模型层 Model
主要是针对后端来说,做为数据的载体存在,这个数据由模型层(又可细划为业务层+持久层+DB)负责,在由控制层
传递给视图层时会根据前端的需求转换成一种MIME类型,比如json,xml,html或是其它的格式
### 控制层 Controller
主要是负责调度请求和处理请求,如果使用spring MVC框架,框架本身提供了一个前置的控制器,开发者只需要
开发后端控制器,并通过XML或注解方法告诉框架即可,配置很灵活。
### 视图层 View
主要是负责前端的显示,它显示的内容由控制层负责填充,甚至客户请求的跳转也都是由控制器负责
---
## Spring MVC的优点
1. Decoupling views and models
2. Reduces the complexity of design
3. Makes code more flexible and maintainable
---
## Spring MVC简介
* 一个开源的MVC框架(Model-view-Controller)
* 简化Java Web开发复杂度
* 与Spring核心IOC容器集成度良好
* 控制器生命周期由容器管理,可以单元测试【这是非常好的优点】
* 基于注解,配置简单,功能强大【当然,也支持XML】
* 支持JAVAEE中JSR303的验证机制
* 支持各种视图技术【JSP,TILES, FreeMarker, 等页面技术】
* 支持RESTful和HTTP协议细节
* 貫徹很多软件设计原则,如:SRP, DRY, COC...
## 技术栈
Spring MVC来自于spring框架,它做为Spring框架的一个组成部份。

---
## 使用Spring MVC 建立一个web 项目的步骤【基于maven】
1. 以maven管理的结构建立一个 web 项目
2. 编写pom.xml,详见 [Spring-04-mvc的pom文件](http://git.oschina.net/stevenye/spring-04-mvc/blob/master/pom.xml?dir=0&filepath=pom.xml&oid=f1402a2a6438f9ff511407861f0637a4716f53d4&sha=2133ceea97aa4fc0d4e668d026442d5993a2890a)
3. 在 web.xml 中配置spring提供的前端控制器, 如下:

4. 配置好后,web.xml 如下:
com.tz.listener.ContextPathListener
EncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
EncodingFilter
/*
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextClass
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
contextConfigLocation
com.tz.config.WebMvcConfig
1
DispatcherServlet
/
index.jsp
5. 编写 WebMvConfig 类,本案例是通过 注解配置的
详见 代码
6. 开发自已的后端控制器
使用 @Controller 注解
使用 @RequestMapping 注解
7. 开发 hello.jsp 页面
8. 可选:配置自己的全局应用的监听器, 详见代码
9. 运行和调试
* 打成war包,部署到tomcat中访问
> mvn clean package
* 直接使用 tomcat7 插件
> mvn tomcat7:run
---
## Spring MVC的常用注解
* @Controller
> 负责注册一个控制器的Bean到spring上下文中
* @RequestMapping
> 注解为控制器可以处理哪些URL请求,可以加上类上面,也可以在方法上,或两者都加
* @RequestBody
> 该注解用于读取request请求的body部份数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上,再把HttpMessageConverter返回的对象数据绑定到Controller中方法的参数上
* @ResponseBody
> 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到ResponseBody对象的body数据区
* @ModelAttribute
> 在方法定义上使用@ModelAttribute注解后,SPring MVC在调用目标处理方法之前,会先逐個调用在方法级上标注了@ModelAttribute的方法
> 在方法的参数上使用@ModelAttribute注解后, 可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数-绑定到对象中,再传入参数将方法参数对象添加到模型中
* @RequestParam
> 在处理方法入参处使用@RequestParam 可以把请求参数传递给请求方法
* @PathVariable
> 绑定URL占位符到参数中
* @ExceptionHandler
> 注解到方法上,出现异常时会执行该方法
* @ControllerAdvice
> 使一个Controller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常.
## 控制器的编写
使用@Controller注解
## 控制器的测试
在 pom.xml中,添加 mockito 组件
org.mockito
mockito-core
2.2.9
org.hamcrest
hamcrest-core
1.2.1
在测试类中,使用
@ContextConfiguration(classes = WebMvcConfig.class)
@WebAppConfiguration //获取 WebApplicationContext 上下文
public class AjaxControllerTest extends AbstractTestNGSpringContextTests {
@Autowired
private WebApplicationContext wac; // web spring 容器实例
private MockMvc mockMvc; //控制器单元测试入口
@BeforeClass
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = webAppContextSetup(wac).build();
}
即可。
## 其它的辅助功能列表
### json格式或xml格式数据的响应
1. json格式响应
> 使用@ResponseBody 注解,并且在 @RequestMapping中,指定produces = "application/json;charset=UTF-8"
> 需要注意:如果你自己把java对象转换成json字符串,则spring不参与
> 如果你想使用spring自带的json处理器,则需要在 pom.xml中,导入:
com.fasterxml.jackson.core
jackson-core
2.6.0
com.fasterxml.jackson.core
jackson-databind
2.6.0
com.fasterxml.jackson.core
jackson-annotations
2.6.0
2. xml格式响应
> 使用@ResponseBody 注解,并且在 @RequestMapping中,指定produces = "application/xml;charset=UTF-8"
> 需要注意:在实体类上打上 @XmlRootElement 注解,否则出现 406错误
### 文件上传
文件上传是WEB应用常见的功能,Spring MVC提供MultipartResolver 接口来处理
* 需要配置 commons-fileupload 组件,如下:
commons-fileupload
commons-fileupload
1.3.1
* 配置 MultipartResolver 实现类
/*****************
* 解决文件上传的处理Bean
* @return
*/
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
//设置相关的属性
multipartResolver.setDefaultEncoding("UTF-8");
multipartResolver.setMaxUploadSize(20*1024*1024); //20M
//返回
return multipartResolver;
}
* Form 表单
> 注意:
> input type="file"
> enctype必需申明,它的值:enctype='multipart/form-data' 而且表单的method一定是post,
* 控制器
> 详见 代码
### 文件上传和下载
* Servlet 是“万能"的, 可以返回所有标准文件格式,比如:text,html,json,xml, pdf, mp3,word,视频等
* spring MVC思路和Servlet实现是一样的,都是设置响应内容为具体文件类型再将文件写入输出注即可
* 详见案例
### 拦截器 Interceptor
spring MVC 允许你通过拦截器去拦截用户的请求
* 详见案例
### Bean Validatioin [JSR303]
* 详见案例
### RESTful风格的Spring MVC
* 详见案例