# 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 基本概念 定义:是一种设计思想,把前后端交互的过程中所参与的对象划分成视图、模型、控制三层,并以面像抽象编程的理念进行整合 ![图标](images/mvc.png) ### 模型层 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框架的一个组成部份。 ![图标](images/stack.png) --- ## 使用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提供的前端控制器, 如下: ![DispatcherServlet](images/dispatcher-servlet.png) 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 * 详见案例