[关闭]
@ruoli 2016-08-30T14:51:44.000000Z 字数 6660 阅读 2039

SpringMvc常用注解详解

SpringMvc


1、RequestMapping 注解类

1、RequestMapping注解类的使用方法

示例代码如下:

  1. package controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. @Controller
  6. @RequestMapping("contract")
  7. //类级别,可以不需要,如果要了,下面所有的请求路径前都需要加入/contract,如果没有配置则代表根目录
  8. public class ContractController {
  9. @RequestMapping("form")
  10. // 方法级别,必须有,决定这个方法处理哪个请求
  11. public @ResponseBody String from() {
  12. // 此处省略处理逻辑
  13. return "from";
  14. }
  15. @RequestMapping({"","list"})
  16. // 方法级别,必须有,决定这个方法处理哪个请求,可以写多个
  17. public @ResponseBody String list() {
  18. return "list";
  19. }
  20. }

2、RequestMapping注解类的属性

RequestMapping注解类的属性,分别有 value, method, consumes, produces,
params, headers。

1、value属性

代表具体的请求路径,比如上面的 contract 是value的值,value可以省略,就像例子中一样,直接用 @RequestMapping("form") 的
格式,它等同于@RequestMapping(value = "form"),如下代码:

  1. @RequestMapping(value="view")
  2. public String view() {
  3. return "view";
  4. }

2、method属性

用于标记前端请求的方式,符合要求的method才能进入此方法,常用的method方式有:GET,POST,PUT,DELETE,如果方法不带method属性,则任意method都可以访问,示例如下:

  1. @RequestMapping(value="view",method = {RequestMethod.POST,RequestMethod.GET})
  2. public String view() {
  3. //POST,GET 请求可以访问到此方法。
  4. return "view";
  5. }

3、consumes属性

指定请求的提交内容类型(Content-Type),例如application/json, text/html 它的值既可以是字符串也可以是数组,示例如下:

  1. @RequestMapping(value="view",consumes={"application/json","text/html"})
  2. public String view() {
  3. return "view";
  4. }

4、produces属性

用于指定返回的内容类型,它的值既可以是字符串也可以是数组,如下示例代表返回的类型为文本类型:

  1. @RequestMapping(value="view",produces="text/html")
  2. public String view() {
  3. return "view";
  4. }
  5. //如果需要返回json数据,则只需要设置 produces="application/json"

5、params属性

指定请求中必须包含某些参数值,才会触发这个处理方法,以下例子代表请求参数中必须包含参数myParam,值为myValue才会触发此方法:

  1. @RequestMapping(value="view",params="myParam=myValue")
  2. public String view() {
  3. return "view";
  4. }

参数中除了使用=等号外,还可以使用!=号,表示在参数的值不等于的情况下触发这个方法
也可以不指定具体的值,直接使用 "paramName" 的格式,代表请求中必须包含参数名为 paramName 的参数
直接使用 “!paramName”格式表示请求不能包含名为paramName的请求参数

6、headers属性

请求头Header中必须包含某些指定的参数值,才能让该方法处理请求,如下示例:

  1. @RequestMapping(value="view",headers={"Content-Type=text/*","Referer=http://www.domain.com/"})
  2. public String view() {
  3. return "view";
  4. }

3、定义Ant风格和带占位符的URL

@RequestMapping不仅支持标准的URL,还支持Ant风格和带{xxx}占位符的URL,下面的URL都是合法的:

  1. /user/*/login:匹配/user/aaa/login,/user/任意字符/login
  2. /user/**/login:匹配/user/login /user/aaa/bbb/login 等,中间也可不填
  3. /user/login??:匹配/user/loginAA, /user/loginbb 等,每个问号代表一个字符
  4. /user/{userId}:匹配/user/123 /user/234
  5. /user/**/{userId}:匹配/user/aaa/bbb/123,/user/aaa/234

2、ModelAttribute注解类

@modelattribute标注的方法 会在每个请求之前执行。

如下示例,在页面请求form方法前,会首先执行@ModelAttribute 标注的get方法,get方法中返回一个Leave对象,将会被下面的form对象接收,form方法会把get方法返回的Leave对象和request请求中的参数合并,并且request中的参数优先级更高,从而得到一个全新的Leave对象,一般用于局部修改业务。

  1. @Controller
  2. @RequestMapping(value = "/oa/leave")
  3. public class LeaveController extends BaseController {
  4. @Autowired
  5. private LeaveService leaveService;
  6. @ModelAttribute
  7. public Leave get(@RequestParam(required=false) String id){
  8. Leave entity = null;
  9. if (StringUtils.isNotBlank(id)){
  10. entity = leaveService.get(id);
  11. }
  12. if (entity == null){
  13. entity = new Leave();
  14. }
  15. return entity;
  16. }
  17. @RequestMapping(value = "form")
  18. public String form(Leave leave, Model model) {
  19. model.addAttribute("model", leave);
  20. return "modules/oa/leaveForm";
  21. }
  22. }

3、四大关键注解类

1、如何使用这四个注解类

Component、Controller、Service、Repository
@Component 是通用标注
@Controller 标注 web 控制器
@Service 标注 Servicec 层的服务
@Respository 标注 DAO 层的数据访问

这些注解都是类级别的, 可以不带任何参数,也可以带一个参数,代表bean名字,在进行注入的时候就可以通过名字进行注入了。
在不清楚使用那个注解的时候,可以统统使用Component
为了代码逻辑清晰,还是建议使用具体的注解
在springmvc的配置文件中,通过context:component-scan使注解生效
使用@Resource或@Autowired注解实现注入

2、@Resource和@Autowired注解的异同

@Autowired,默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,
例如:@Autowired(required=false),如果我们想使用名称装配可以结合@Qualifier注解进行使用。

@Resource,默认安装名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource是J2EE标准,@Autowired是Spring提供的。

4、其他注解类

主要包括如下注解类:
PathVariable注解类
RequestParam注解类
CookieValue注解类
SessionAttributes注解类
ResponseBody注解类
RequestHeader注解类

1、PathVariable注解类

@RequestMapping注解中使用占位符的情况下,需要使用@PathVariable注解指定占位符参数,示例如下:

  1. @RequestMapping(value="user/{userId}/roles/{roleId}",method=RequestMethod.GET)
  2. public String getLogin(@PathVariable("userId") String userId,@PathVariable("roleId") String roleId) {
  3. System.out.println("userId:"+userId+",roleId:"+roleId);
  4. return "MyJsp";
  5. }
  6. @RequestMapping(value="user/{regexp:[a-z-]+}",method=RequestMethod.GET)
  7. //使用正则表达式进行参数匹配,所有匹配这个正则表达式的都会进入此方法
  8. public String regexp(@PathVariable("regexp") String regexp) {
  9. System.out.println("regexp:"+regexp);
  10. return "MyJsp";
  11. }

2、RequestParam注解类

1、在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取。

2、@RequestParam有三个属性 value, required, defaultValue;required属性如果没有配置,这默认为true。

3、不带任何参数,表示需要的参数名与标注的变量名相同。

4、可以通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传。

5、参数类型尽量不要使用基本类型int,long等,而应该使用具体的对象类Integer、Long、String等。

示例如下:

  1. @RequestMapping(value="view")
  2. public String view(@RequestParam(value="aa",required=false) String aa) {
  3. return "view";
  4. }

3、CookieValue注解类

读取Cookies中的值,并且赋值给变量,有三个属性 value,required,defaultValue,分别表示Cookie的名字,是否必须有这个Cookie值,如果没有默认值,不带任何参数,表示需要的参数名与标注的变量名相同,示例如下:

  1. @RequestMapping(value="testCookie1")
  2. public String testCookie1(@CookieValue String userName) {
  3. return "testCookie1";
  4. }
  5. @RequestMapping(value="testCookie2")
  6. public String testCookie2(@CookieValue(value="userName") String userName) {
  7. return "testCookie2";
  8. }
  9. @RequestMapping(value="testCookie3")
  10. public String testCookie3(@CookieValue(value="userName",required=false,defaultValue="zhangsan") String userName) {
  11. return "testCookie3";
  12. }

4、SessionAttributes注解类

1、如果希望在多个请求之间公用某个模型属性数据,则可以在控制器类标注一个@SessionAttributes,SpringMVC会将模型中对应的属性暂存到HttpSerssion中
2、除了SessionAttributes,还可以直接用原生态的request.getSession()来处理session数据

5、ResponseBody注解类

使用此注解将会跳过视图解析

1、用于将Controller的方法返回的对象,通过适当的HttpMessageConverter(转换器)转换为指定格式后,写入到Response对象的body数据区
2、返回如json、xml等时使用
3、在springmvc配置文件中通过,给AnnotationMethodHandlerAdapter初始化7个转换器
常用的七大注解类如下:

  1. ByteArrayHttpMessageConverter //读写二进制数据
  2. StringHttpMessageConverter //将请求信息转换为字符串
  3. ResourceHttpMessageConverter //读写org.springframework.core.io.Resource对象
  4. SourceHttpMessageConverter //读写javax.xml.transform.Source类型的数据
  5. XmlAwareFormHttpMessageConverter //处理表鱼中的XML数据
  6. Jaxb2RootEIementHttpMessageConverter //通过JAXB2读写XML消息,将请求消息转换到标注XmlRootElement和XmlType的注解类中。
  7. MappingJacksonHttpMessageConverter //读写JSON数据

6、RequestHeader注解类

@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上,和@RequestParam 用法一样,示例如下:

  1. @RequestMapping(value="showHeaderInfo")
  2. public String showHeaderInfo(@RequestHeader("Accept-Encoding") String encoding, @RequestHeader("Keep-Alive") String keepAlive) {
  3. return "showHeaderInfo";
  4. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注