SSM项目从零开始到入门048-SpringMVC常用注解浅析

时间:2022-12-10 05:48:47

上文我们做了一个对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.GETmethod=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

功能:用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

示例请参考上边的@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