为什么80%的码农都做不了架构师?>>>   

注解的出现终结了使用XML配置文件的年代,它让程序拥有更高的可读性,可配置性与灵活性。上一篇介绍的SpringMVC 2.5版本的注解使用已经发布了很多年了,如今项目中使用的4.0版本发生了很大的变化。今天我们就一起来看看SpringMVC 4.0中那些常用的注解。

1.Controller

Controller控制器是通过服务接口定义的提供访问应用程序的一种行为,它解释用户的输入,将其转换成一个模型然后将试图呈献给用户。SpringMVC 使用Controller注解定义控制器,它还允许自动检测定义在类路径下的组件并自动注册。如想自动检测生效,需在XML头文件下引入 spring-context:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

2.@RequestMapping

RequestMapping 注解将类似 "/admin"这样的URL映射到整个类或特定的处理方法上。一般来说,类级别的注解映射特定的请求路径到表单控制器上,而方法级别的注解只是映射为一个特定的HTTP方法请求("GET","POST"等)或HTTP请求参数。

 @RequiresPermissions("delivery:delivery:view")@RequestMapping(value = { "list", "" })public String list(Delivery delivery, HttpServletRequest request,HttpServletResponse response, Model model) {if (delivery.getState() == null) {delivery.setState(0);}User user = UserUtils.getUser();if (user.getCommunity() != null&& StringUtils.isNoneEmpty(user.getCompany().getId())) {delivery.setCommunity(user.getCommunity());}Page<Delivery> page = deliveryService.findPage(new Page<Delivery>(request, response), delivery);if (delivery != null) {List<Delivery> deliverylist = page.getList();for (int i = 0; i < deliverylist.size(); i++) {delivery = deliverylist.get(i);caculteFee(delivery);}}model.addAttribute("page", page);if (UserAgentUtils.isMobileOrTablet(request)) {if (delivery.getState() == 0) {return "modules/delivery/deliveryList";} else {return "modules/delivery/deliveryRecord";}}return "modules/delivery/deliveryList";}

@RequestMapping 既可以作用在类级别,也可以作用在方法级别。当它定义在类级别时,标明该控制器处理所有的请求都被映射到 /favsoft 路径下。@RequestMapping中可以使用 method 属性标记其所接受的方法类型,如果不指定方法类型的话,可以使用 HTTP GET/POST 方法请求数据,但是一旦指定方法类型,就只能使用该类型获取数据。

@RequestMapping 可以使用 @Validated与BindingResult联合验证输入的参数,在验证通过和失败的情况下,分别返回不同的视图。

@RequestMapping支持使用URI模板访问URL。URI模板像是URL模样的字符串,由一个或多个变量名字组成,当这些变量有值的时候,它就变成了URI。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller
@RequestMapping("admin")
public class LoginController {@RequestMapping(value = "login" , method = RequestMethod.GET , consumes = "text/html")public String toLoginPage(){return "/WEB-INF/jsp/login.jsp";}
}

上述url的访问地址应该是:localhost:8080/proj/admin/login.html
consumes-指定处理请求的提交内容类型Content-Type,例如 application/json,text/html.
produces-指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。
value-指定请求的实际地址,指定的地址可以是URI Template 模式

A) 可以指定为普通的具体值;
B) 可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);
C) 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller
public class BlogController {@RequestMapping(value = "blog/{nick}/{year:20\\d{2}}/{month:1|1[0-2]}/{day:[12][0-9]|30|[1-9]}" , method = RequestMethod.GET)public String toBlogPage(@PathVariable String nick,@PathVariable Integer year,@PathVariable Integer month,@PathVariable Integer day){return "/WEB-INF/jsp/blog.jsp";}
}

params-指定request中必须包含某些参数值是,才让该方法处理。
headers-指定request中必须包含某些指定的header值,才能让该方法处理请求。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller
public class BlogController {//仅处理request的header中包含了指定“Refer”请求头和对应值为“http://my.oschina.net/ljc94/blog”的请求@RequestMapping(value = "getList", headers="Referer=http://my.oschina.net/ljc94/blog" )public String getList(){return "modules/delivery/deliveryList";}
}

3.@PathVariable

在Spring MVC中,可以使用 @PathVariable 注解方法参数并将其绑定到URI模板变量的值上。

  @ResponseBody@RequestMapping(value = { "signDelivery/{id}" })public boolean signDelivery(@PathVariable String id) {Delivery delivery = deliveryService.get(id);delivery.setState(1);delivery.setSignedSysUser(UserUtils.getUser());delivery.setSingedTime(new Date());try {deliveryService.save(delivery);return true;} catch (Exception e) {return false;}}

@PathVariable中的参数可以是任意的简单类型,如int, long, Date等等。Spring会自动将其转换成合适的类型或者抛出 TypeMismatchException异常。当然,我们也可以注册支持额外的数据类型。

如果@PathVariable使用Map<String, String>类型的参数时, Map会填充到所有的URI模板变量中。

@PathVariable支持使用正则表达式,这就决定了它的超强大属性,它能在路径模板中使用占位符,可以设定特定的前缀匹配,后缀匹配等自定义格式。

@PathVariable还支持矩阵变量,不过现实场景中用的不多,有需要可以查看官网的API文档。

4.@RequestParam

@RequestParam将请求的参数绑定到方法中的参数上。其实即使不配置该参数,注解也会默认使用该参数。如果想自定义指定参数的话,可以将@RequestParam的 required 属性设置为false。@RequestParam(value="id",required=false)

5.@RequestBody

@RequestBody是指方法参数应该被绑定到HTTP请求Body上。

6.@SessionAttibutes

@SessionAttibutes可以通过ModelMap对象的put操作设置相关的session同时在attibute对象也会有该对象。

7. @ResponseBody

@ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。@ResponseBody在输出JSON格式的数据时,会经常用到。

    @ResponseBody@RequestMapping(value = { "listNext" })public List<Delivery> listNext(String search, Integer pageNo, Integer state)throws UnsupportedEncodingException {Delivery delivery = new Delivery();delivery.setState(state);User user = UserUtils.getUser();if (user.getCommunity() != null&& StringUtils.isNoneEmpty(user.getCompany().getId())) {delivery.setCommunity(user.getCommunity());}if (StringUtils.isNotBlank(search)) {search = URLDecoder.decode(search, "utf-8");delivery.setOwnerName(search);return deliveryService.findList(delivery);} else {Page<Delivery> page = deliveryService.findPage(new Page<Delivery>(pageNo, 10), delivery);return page.getList();}}

8.@RestController

我们经常见到一些控制器实现了REST的API,只为服务于json,xml或其它自定义的类型内容。@RestController用来创建REST类型的控制器,与@Controller类型。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody

9.@ModelAttribute

@ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性。当作用在方法参数上时,表明该参数可以在方法模型中检索到。如果该参数不在当前模型中,该参数先被实例化然后添加到模型中。一旦模型中有了该参数,该参数的字段应该填充所有请求参数匹配的名称中。这是spring mvc中重要的数据绑定机制,它省去了单独解析每个表单字段的时间。

@ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用。

@ModelAttribute是一种很常见的从数据库中检索属性的方法,它通过@SessionAttributes使用request请求存储。在一些情况下,可以很方便的通过URI模板变量和类型转换器检索属性。

  @ModelAttributepublic Delivery get(@RequestParam(required = false) String id) {Delivery entity = null;if (StringUtils.isNotBlank(id)) {entity = deliveryService.get(id);}if (entity == null) {entity = new Delivery();}return entity;}

@ModelAttribute方法用来在model中填充属性,如填充下拉列表、类型等(用来在HTML表单上呈现数据)。

@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {model.addAttribute("number", number);  // add more ...
}

@ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另一种是该方法接受一个模型并添加任意数量的模型属性。用户可以根据自己的需要选择对应的风格。

10、HttpEntity

HttpEntity除了能获得request请求和response响应之外,它还能访问请求和响应头,如下所示:

@RequestMapping("/something")public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException {String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader"));// do something with request header and body    byte[] requestBody = requestEntity.getBody();    HttpHeaders responseHeaders = new HttpHeaders();responseHeaders.set("MyResponseHeader", "MyValue");    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}

欢迎补充指正!

转载于:https://my.oschina.net/ljc94/blog/735803

SpringMVC 4.0常用注解相关推荐

  1. spring mvc学习(7):springmvc学习笔记(常用注解)

    1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如下特点: 不需要继承任何类, 也不需要实 ...

  2. 【Spring MVC学习】详解spring mvc 3.0常用注解

    Spring mvc的注解功能 1.@Controller--表示控制器 举例: @Controller public class SoftCreateController extendsSimple ...

  3. SpringMVC之Controller常用注解功能全解析

    一.简介 在SpringMVC中,控制器Controller负责处理由DispatcherServlet分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model ...

  4. springMVC中的@ModelAttribute注解

    springMVC小总结 常用注解总结 以下内容是我个人对@ModelAttribute注解的见解,如有错误请批评指正!!! 例子中用到的代码:代码获取 @ModelAttribute注解 1.作用: ...

  5. springmvc整合swagger 与 常用注解说明

    Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使 ...

  6. SpringMVC学习笔记(二)常用注解

    SpringMVC学习笔记(二)常用注解 1.RequestParam 作用: 把请求中指定名称的参数给控制器中的形参赋值. 属性: value:请求参数中的名称. required:请求参数中是否必 ...

  7. springmvc常用注解

    转载自   springmvc常用注解 第一部分 一.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请 ...

  8. springmvc常用注解与类型转换

    springmvc常用注解与类型转换 一:前置 spring -servlet.xml 注入 <!-- 启用spring mvc 注解 --><context:annotation- ...

  9. springmvc php,SpringMVC 常用注解

    SpringMVC 常用注解 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

最新文章

  1. 为什么做小程序的时候要做定制开发小程序?
  2. 数据分析 | 带你零基础入门数据挖掘(附代码)
  3. golang sleep函数 休眠延时
  4. 理解Java NIO
  5. pythonseleniumide使用_selenium第二课(脚本录制seleniumIDE的使用)
  6. 古风一棵桃花树简笔画_运用仿真树装饰效果如此浪漫
  7. [译]GLUT教程 - 笔划字体
  8. MySQL federated引擎试验
  9. 孙鑫VC学习笔记:第十一讲 (一) 坐标空间与各种转换的概念
  10. flashfxpFTP链接显示PASV、列表错误
  11. Springboot+Vue+EasyExcel实现web页面的excel下载
  12. 第二周周报:预备队训练-week2(二分查找)
  13. 浙江大学数据结构第一讲:1.1什么是数据结构
  14. PostgreSQL 连接(JOIN)
  15. Python基础语法知识3
  16. D2D与蜂窝系统间的干扰
  17. 电子烟创业大军,都去卖酒了
  18. 对混淆矩阵、F1-Score
  19. 墨者_密码学加解密实训(摩斯密码第1题)
  20. 开源!!!100多个常用API接口免费分享!建议收藏!

热门文章

  1. JavaScript语言基础12
  2. Worker启动Executor源码
  3. 对ViewPager的理解
  4. php excel parser pro v4.2,php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)...
  5. uniapp中遮罩穿透问题
  6. java 客户端发起http请求2
  7. Ajax操作的四个步骤
  8. [转]php-mobile-detect
  9. JavaScript OOP(2)定义JavaScript类
  10. Eclipse 中 Debug 模式跳转到 exitCurrentThread 的问题解决