上文我们做了一个对SpringMVC做了一个简单的了解,并列举了一个HelloWorld的小例子。
本文我们开始介绍SpringMVC常用注解。
1. @Controller
功能:@Controller 将一个类标记为Controller。注册一个bean到spring 上下文中。
用法:
@Controller public class UserController { }
2 . @RequestMapping
功能:@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
属性:
1. value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
2. method: 指定请求的method类型, GET、POST、PUT、DELETE等;
3. consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
4. produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
5. params: 指定request中必须包含某些参数值是,才让该方法处理。
6. headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
其中value的uri值为以下三类:
1. 可以指定为普通的具体值;
2. 可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);
3. 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);
示例1:
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/") String get() { return "HelloWorld"; } @RequestMapping("/sayHello") public String sayHello(ModelMap model) { model.addAttribute("message", "sayHello say HelloWorld"); return "HelloWorld"; } }
上述例子定义个俩个方法 其中 :
当访问路径为 /user 会执行get()方法。
当访问路径为 /user/sayHello的请求会交给方法sayHello去处理。
示例2:
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value = { "", "/index", "index*", "index/*"}) String indexView() { return "index"; } }
上述定义了处理多个 URI的方法
当访问如下時都可以執行方法indexView()
/user /user/index /user/indexTest /user/index/test
示例3:
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/getUser/{userId}", method=RequestMethod.GET) public String findUserByUserId(@PathVariable Integer userId, Model model) { System.out.println("获取URL中userId为:"+userId); return "detail"; } @RequestMapping(value="/getUser/dept/{deptId}/user/{userId}/", method=RequestMethod.POST) public String findUserByDeptIdAndUserId(@PathVariable Integer deptId,@PathVariable Integer userId, Model model) { System.out.println("获取URL中deptId为:"+deptId + ",获取URL中userId为:"+userId); return "detail"; } }
上诉例子使用了REST风格的参数 (REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。),使用@PathVariable 映射 URL绑定的占位符(获得请求url中的动态参数{xxx})。
其中第一个方法使用了一个参数,第二个例子使用的多个参数。
method=RequestMethod.GET与method=RequestMethod.POST的意思是指定方法请求类型。如果不匹配会报405错误
当访问 /user/getUser/6 控制台会打印:获取URL中userId为:6
当访问 /user/getUser/dept/3/user/6 控制台会打印:获取URL中deptId为:3,获取URL中userId为:6
示例4:
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value="/{portName:[a-z-]+}.{portNumber:[\\d]+}") public String regularExpression(@PathVariable String portName,@PathVariable String portNumber){ System.out.println("端口名称为: " + portName +"端口名称为:" + portNumber); return "index"; } }
上述示例定义了正则表达式的URL
当访问 url 为: /user/mstsc.3306 则控制台打印:端口名称为: mstsc ,端口名称为:3306
示例5:
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value = "/addUser", method = RequestMethod.POST, consumes="application/json") public void addUser(@RequestBody User user, Model model) { //只接收json类型 } @RequestMapping(value = "/getUser/{userId}", method = RequestMethod.GET, produces="application/json") @ResponseBody public User getUserById(@PathVariable Integer userId, Model model) { //接收id并返回json类型的对象 return null; } @RequestMapping(value = "/login") @ResponseBody // 将ajax(datas)发出的请求写入 User 对象中,这样就不会再被解析为跳转路径,而是直接将user对象写入 HTTP 响应正文中 public User login(@RequestBody User user) { return user; } }
consumes="application/json 指定了自动接收json转换映射到DTO实体
produces="application/json" 表示将功能处理方法将生产json格式的数据,此时根据请求头中的Accept进行匹配,如请求头“Accept:application/json”时即可匹配
@ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
3.@Autowired
功能:它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过@Autowired的使用来消除 set ,get方法。
applicationContent.xml添加扫描<context:component-scan base-package="包名" />
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
示例:
public class UserController{ // 使用@Autowired注入 @Autowired private UserService userService; //使用set注入 private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } }
@Autowired和@Resource都是做bean的注入时使用。
@Resource不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
示例:
public class UserController{ // 下面两种@Resource只要使用一种即可 // 用于字段上 @Resource(name="userService") private UserService userService; // 用于属性的setter方法上 @Resource(name="userService") public void setUserService(UserService userService) { this.userService = userService; } }注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。
4. @PathVariable
示例请参考上边的@RequestMapping例子。
5. @CookieValue
功能:用来获取Cookie中的值;
参数: value:参数名称 required:是否必须 defaultValue:默认值
示例:
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/cookieValue") public String getCookieValue(@CookieValue("sessionId") String sessionId) { System.out.println("Cookie中sessionId值为:" + sessionId); return "index"; } }
6.@RequestParam
功能:用于将请求参数区数据映射到功能处理方法的参数上。
区别:
@RequestParam 和 @PathVariable 注解是用于从request中接收请求的,两个都可以接收参数。
@RequestParam 是从request里面拿取值
@PathVariable 是从一个URI模板里面来填充
示例:
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/getRequestParam") public String getRequestParam(@RequestParam("id") int id) { System.out.println("得到的id为:" + id); return "index"; } }
7.@SessionAttributes
功能:默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。
参数:
1、names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
2、types:根据指定参数的类型,将模型中对应类型的参数存储到session中
3、value:其实和names是一样的。
示例:
@SessionAttributes(value={"names"},types={Integer.class}) @Controller public class UserController { @RequestMapping("/test") public String test(Map<String,Object> map){ map.put("names", Arrays.asList("aaa","bbb","ccc")); map.put("age", 18); return "index"; } }
8.@ResponseBody
功能:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用。
示例:
@RequestMapping("/login") @ResponseBody public User login(User user){ return user; }例如User字段为:userName passWord
那么在前台接收到的数据为: {"userName":"xxx","passWord":"xxx"}
效果等同于如下代码:
@RequestMapping("/login") public void login(User user, HttpServletResponse response){ response.getWriter.write(JSONObject.fromObject(user).toString()); }
e f eww ew e