使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能。
02     之前在使用Struts2实现MVC的注解时,是借助struts2-convention这个插件,如今我们使用Spring自带的spring-webmvc组件来实现同样的功能,而且比之以前更简单。另外,还省掉了整合两个框架带来的不稳定因素。
03     对于Spring
MVC框架,我主要讲一下它的常用注解,再结合一些示例进行说明,方便大家能够快速理解。
04     一、Spring
MVC常用注解说明
05     @Controller
06     在类上面定义,表明该类为控制器,返回字符串与redirect:xxx
07     @RequestMapping
08     在类或方法上面使用此注解,设置URL访问地址。它有两个属性,value指定访问路径,method指定指定请求方式,请求方式在RequestMethod这个类中,全部以常量形式定义,它默认使用GET请求。
09     @RequestParam
10     指定Request请求参数,在方法参数中定义,相当于传统的request.getParameter()。
11     @PathVariable
12     获取URL访问路径变量,这是Spring
MVC 
3.0框架才加入的特性,基于RESTful风格的URL访问路径。
13     @ModelAttribute
14 全局式的方法,在一组URL访问路径中,每次都会执行,方法返回结果保存在module会话中。
15     @Service
16     在类上面定义,指定被注解的类是业务逻辑组件,如果不指定具体的Bean
ID,则采用默认命名方式,即类名的首字母小写。之前在SSH2中,大象曾对Dao组件使用
@Repository,本例只有业务层,所以就只用@Service注解。
17     @Autowired
18     IoC自动注入功能,替换以前的set写法,在SSH2中就已经开始使用了。
19     @Qualifier
20     对同一接口类有不同实现指定具体的实现类。
21     @ResponseBody
22     同样定义在方法上,Ajax调用声明,指定方法返回结果为Ajax回调函数结果。这是Spring
MVC
3.0框架中增加的一个新特性。
23     @InitBinder
24     初始化数据绑定与类型转换,将传入的参数转换为自定义类型,或者对参数进行自定义处理。
25     二、示例
26       
27     @RequestMapping在类名上面定义,相当于指定的URL是此控制器内的所有其它访问路径的父路径。如果在某个方法上面定义@RequestMapping注解,则相对于父路径来说,是其子路径。如果不定义value值,那么按父路径访问就会被默认执行。但请注意,默认的访问方式只能有一个。
28     对于UserController的list方法REST访问URL为http://localhost:8080/ssm3/user,而且它同时接收GET和POST两种请求。另外,Spring
MVC 3.0有一个很灵活的特性,可以自定义方法参数。看看list方法,我设定了两个参数,一个Model,一个User对象。Model是用来渲染数据,生成页面用的。相当于request.setAttribute,你可以这样理解,但不能就这样认为,Model以及另一个ModelMap,都是作为视图模型传递参数的,它们的作用域为request。除此之外,你还可以定义HttpServletRequest、HttpServletResponse等等各种各样的参数。
29 如果一个类还要定义其它资源访问怎么办呢?请看下面的RoleController
30       
31     在RoleController上定义了全局路径/role,这样一来,对于和角色相关的资源都会以/role开头,比如创建角色/role/new;编辑角色/role/edit/{id}等等。
32     上图edit方法中的{id}写法,就是RESTful
URL风格,与
@PathVariable搭配来一起实现该功能。它表示所请求的URL中,可以将变量值作为参数进行动态的传递。例如:http://localhost:8080/ssm3/role/edit/1,另外,除了可以用数字,还可以用字符串,还可以多定义几个变量:/role/edit/{id}/{type}等等。
33     每个方法的返回值,其实都对应着一个结果页面,这一点和struts2-convention这个插件很相像。本例使用FreeMarker模板引擎作为展示层,页面的后缀为.html,页面中除了标准的HTML之外,其余的数据填充,条件判断之类,都要用到FreeMarker指令。
34     对于save方法返回值写法表示的是重定向,相当于执行http://localhost:8080/ssm3/role,而这个URL对应的其实就是RoleController这个类里面list方法。如果要带上参数之类的,一定要符合所定义的REST资源路径才可以。
35       
36
37     @ResponseBody用来标识Ajax方法调用,在上面这个方法中,用到了@RequestParam注解,它的作用就和request.getParameter("name")一样。Spring
MVC框架支持好几种返回格式,例如:String/JSON/XML等等。不过以这种格式的字符串值形式返回是最简便的一种方式,而且利用JavaScript解析也十分方便。页面调用的时候请用jQuery的$.ajax()这种原生方式来定义,这种写法不会出问题,也很灵活,而且其它几种方式最终也是调用它来完成请求。
38       
39     对于拥有相同的一组访问规则的URL,如果都需要获得相同的数据,则使用@ModelAttribute注解。以RoleController为例,上面这个注解与方法的含义,相当于是在它里面所有的访问路径方法中都调用这个写法:module.addAttribute(“allRoles”,roleService.getRoles())。也即,不管是访问create还是edit,都会执行preperList,都会获得allRoles这个List。
40       
41     注册自定义类型编辑器,在Spring
MVC中,对于时间类型,框架不会自动帮你转换绑定,需要你自己来定义属性编辑器。除此之外,还可以对某些特殊字符进行转义符处理,都可以放在
@InitBinder注解的方法中进行。如果所有的Controller都需要注册相同的属性编辑器,则可以实现WebBindingInitializer接口,定义一个全局的属性编辑器。
42     三、在web容器中部署
43     想要让Spring
MVC框架帮助我们完成工作,就需要在Web容器中配置好它。
44       
45     DispatcherServlet是Spring
MVC的核心,是处理一切请求转发的核心控制器。大象曾在本系列的第二篇文章中就详细描述了Spring MVC的流程结构,如果没什么印象的话请再去看看。
46     Spring
MVC有一个默认规则,Web容器启动之后,会自动查找/WEB-INF/<servlet-name>.xml这个Spring类型的配置文件。如果想自定义配置文件路径,就按上面的写法,指定contextConfiglocation这个属性,大象采用maven构建项目,所以servlet-context.xml这个配置文件放在resource目录下。
47     四、MVC配置
48     Spring
MVC 
3.0对使用和配置作了较大的改进,除了提供注解来简化控制器的开发之外,在配置文件上面也进行了简化。
49       
50     基于Spring
MVC注解的配置就是上面这两行,还有一种更简化的配置写法是只写这一句:<mvc:annotation-driven />就可以了,Spring启动的时候会自动注册上面这两个bean。为什么大象要在这里显示的注册两个bean呢?因为,我们在真正使用的时候,一般来说,使用默认的方式满足不了我们的系统或业务要求。比如拦截器,比如数据验证,比如返回消息格式转换等等一些自定义设置。他们都需要配置在这两个bean里面。因为本例是用来作为入门教程,所以这些东西都没有加进来。
51     DefaultAnnotationHandlerMapping这个类是将所有标注了@RequestMapping注解的Controller类,都放到了一个HandlerMapping对象中,当有请求时,就在这个对象中进行查找是否有与之匹配的路径,AnnotationMethodHandlerAdapter是管理所有@RequestMapping注解的方法。

详解:

@RestController :首先我们使用的是Spring 4的新注解 @RestController注解.

此注解避免了每个方法都要加上@ResponseBody注解。也就是说@RestController 自己戴上了 @ResponseBody注解,看以看作是

@Controller 和 @ResponseBody的结合体。

@RequestBody : 如果方法参数被 @RequestBody注解,Spring将绑定HTTP请求体到那个参数上。如果那样做,Spring将根据请求中的ACCEPT或者 Content-Type
header(私下)使用 HTTP
Message converters
 来将http请求体转化为domain对象。

@ResponseBody : 如果方法加上了@ResponseBody注解,Spring返回值到响应体。如果这样做的话,Spring将根据请求中的 Content-Type
header(私下)使用 HTTP
Message converters
 来将domain对象转换为响应体。

ResponseEntity 是一个真实数据.它代表了整个 HTTP 响应(response).
它的好处是你可以控制任何对象放到它内部。

你可以指定状态码、头信息和响应体。它包含你想要构建HTTP Response 的信息。

@PathVariable 此注解意味着一个方法参数应该绑定到一个url模板变量[在'{}'里的一个]中

一般来说你,要实现REST API in Spring 4 需要了解@RestController , @RequestBody, ResponseEntity 和 @PathVariable 这些注解 .另外, spring 也提供了一些支持类帮助你实现一些可定制化的东西。

MediaType : 带着 @RequestMapping 注解,通过特殊的控制器方法你可以额外指定,MediaType来生产或者消耗。

Spring MVC学习总结(2)——Spring MVC常用注解说明的更多相关文章

  1. Spring Boot 学习1-创建Spring Boot应用

    如果使用Maven, 确保先安装好Maven再继续. 创建POM文件 在这里有两种方式: 继承Spring Boot parent的pom. 不继承. 继承Spring Boot pom 1 2 3 ...

  2. spring揭密学习笔记(1) --spring的由来

    1.spring起源于在EJB暴露出各种严重问题的情况应运而生. Spring是于2003年兴起的一个轻量级的Java开发框架, Spring倡导一切从实际出发,以实用的态度来选择适合当前开发场景的解 ...

  3. 【Spring Boot学习之一】Spring Boot简介

    环境 Java1.8 Spring Boot 1.3.2 一.Spring Boot特点1.使用java运行项目,内置tomcat,无需外部容器:2.减少XML配置,使用properties文件和注解 ...

  4. [ SSH框架 ] Spring框架学习之三(AOP开发和注解的使用)

    一.Spring 使用 AspectJ 进行 AOP 的开发:注解的方式 1.1 引入相关的jar包 1.2 引入spring的配置文件 <?xml version="1.0" ...

  5. 【Spring Boot学习之四】Spring Boot事务管理

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.springboot整合事务事务分类:编程事务.声明事务(XML.注解),推荐使用注解方式,springboot默 ...

  6. 【Spring Boot学习之三】Spring Boot整合数据源

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.Spring Boot整合Spring JDBC 1.pom.xml <project xmlns=&quo ...

  7. spring boot学习(3) SpringBoot 之MVC 支持

    第一节:@RequestMapping 配置url 映射   第二节:@Controller 处理http 请求 转发到一个页面,以前是转发到jsp页面,现在使用freemarker: 在pom.xm ...

  8. Spring基础学习(一)—初识Spring

    一.Spring的使用 1.导入jar包 2.编写实体类 Person.java public class Person{ private String name; public void say() ...

  9. Spring框架学习之--搭建spring框架

    此文介绍搭建一个最最简单的spring框架的步骤 一.创建一个maven项目 二.在pom.xml文件中添加依赖导入spring框架运行需要的相关jar包 注意:在引入jar包之后会出现org.jun ...

  10. Spring Data Jpa (五)@Entity实例里面常用注解详解

    详细介绍javax.persistence下面的Entity中常用的注解. 虽然Spring Data JPA已经帮我们对数据的操作封装得很好了,约定大于配置思想,帮我们默认了很多东西.JPA(Jav ...

随机推荐

  1. Xcode HeaderDoc 教程(3)

    打开 MathAPI.h,将第一个 @param 标签的參数名由firstNumber 改动为 thirdNumber,然后编译. 有一个警告发生.甚至提出了改动建议.它不会影响不论什么事情,但有助于 ...

  2. T4语法

    阅读目录   阅读目录 1.什么是T4? 2.vs插件的安装 3.T4初体验 4.T4语法 其实对于“T4模板”的学习,讲得最详细的还是MSDN,下面给出对应的链接,可以点开深入的了解. 回到顶部 1 ...

  3. bzoj3224: Tyvj 1728 普通平衡树(平衡树)

    bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...

  4. TCP打开文件传输(服务器端并发code)

    #include <stdio.h>#include <stdlib.h>#include <arpa/inet.h>#include <sys/types. ...

  5. bzoj4078

    二分+2-sat 枚举第一个权值,二分第二个权值,然后2-sat检查,当第一个权值已经不能形成二分图时,再往下没意义,因为没法分成两个点集.(双指针好像跑得慢) #include<bits/st ...

  6. html5 历史管理

    1.onhashchange:改变hash值来进行历史管理. <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  7. Apache 虚拟主机 配置方法

    打开httpd.conf文件 去掉LoadModule vhost_alias_module modules/mod_vhost_alias.so前面的#号 去掉Include conf/extra/ ...

  8. C - Haiku

    Problem description Haiku is a genre of Japanese traditional poetry. A haiku poem consists of 17 syl ...

  9. retrofit post请求多文件,partMap用法

    1. APIService 定义注解 @Multipart @POST("cyxx/Feedback/add.do") Observable<ResponseBody> ...

  10. JavaScript中字符串运算符的使用

    字符串运算符是用于两个字符串型数据之间的运算符,它的作用是将两个字符串连接起来.在JavaScript中,可以使用+和+=运算符对两个字符串进行连接运算.其中,+运算符用于连接两个字符串,而+=运算符 ...