文章目录
在SpringMVC中, 基于注解的控制层(Controller),客户端发送来的请求Request中的URL就映射到Controller层的一个方法,因此,在Controller层中,大多数注解都是基于这个方法的。下面就从应用于方法的各种注解进行学习。
一、URL映射Controller的方法返回值
方法的返回值,主要有四种类型
- ModelAndView 表示返回的为数据模型和视图
- String 表示返回的是视图
返回值是String类型的,有三种写法,每种写法所解析的意思都是不一样的
-
普通字符串——>表示视图名称
-
“forward:”+url——>转发 (这种写法:使用的是当前的Request对象,而处理此对象的JSP页面是URL 指定的页面。
-
“redirect:”+url——>重定向(重定向,新的Request和JSP页面对象)
- void 将请求的url作为视图名称,很少使用
- Object 表示返回的是数据模型(一般返回的是json数据)
二、SpringMVC各类注解详解
注解 | 解释 |
---|---|
@Controller | 将类映射为Controller层,添加到IoC容器中 |
@RequestMapping | 配置请求映射路径,即URL |
@RequestParam | 表示参数来源于请求参数 |
@PathVariable | 表示参数来源于URL |
@RequestHeader | 表示参数来源于请求头 |
@CookieValue | 表示参数来源于Cookie |
@RequestBody | 表示参数来源于请求体 |
@ModelAttribute | 将请求数据转换为对象 |
@Valid | 后台校验 |
@InitBinder | 类型转换,注册属性编辑器 |
@ControllerAdvice | 统一异常处理,处理全局异常 |
@ExceptionHander | 异常处理器,处理特定异常的方法 |
@ResponseBody | 结合返回值为Object的方法使用,用来返回JSON数据 |
@RestController | 将类映射为Controller层,默认为所有方法添加@ResponseBody注解 |
(一) @Controller
控制层注解,放在定义的控制层类的上面,表示的意思是此类为Controller层,可以在核心配置文件中扫描得到一个控制层Bean,里面的每个方法都是Request中URL的一个映射。
// TODO: 2021/7/1 基于注解的控制层,一个类中可以有许多个URL映射
@Controller
public class UserActionInation {
// TODO: 2021/7/1 这是基于注解的映射 ,下面的注解接收的是客户端请求的URL
@RequestMapping("/hello")
public ModelAndView sayHello(String name){
ModelAndView modelAndView = new ModelAndView();
System.out.println("hello java");
modelAndView.setViewName("hello");
return modelAndView;
}
}
(二) @RequestMapping
配置请求映射路径,即URL
1.基本用法
该注解可以定义在方法上,也可以定义在类上,表示层级关系
例:当想要访问controller层UserActionInation中的sayHello()方法时,他的层级关系就是contextpath/one/hello
@Controller
@RequestMapping("/one")
public class UserActionInation {
// TODO: 2021/7/1 这是基于注解的映射 ,下面的注解接收的是客户端请求的URL
@RequestMapping("/hello")
public ModelAndView sayHello(String name){
ModelAndView modelAndView = new ModelAndView();
System.out.println("hello java");
modelAndView.setViewName("hello");
return modelAndView;
}
}
<form action="${pageContext.servletContext.contextPath}/one/hello" method="post">
配置URL时以/开头和不以/开头的区别:
- 添加时表示从项目根路径开始查找
- 不添加时表示从当前方法所在层级开始查找
2. path属性或value属性:URL的多种写法
请求映射路径有三种写法:
2.1 Ant风格(较少使用)
- 单层目录 (一个 * 表示)
- 单层或多层目录(两个**号表示)
- 表示单个字符,必须有一个字符(用 ?表示)
2.2 Rest风格
- {变量}表示URL中的占位符,可以结合@PathVariable获取值
// TODO: 2021/7/2 Rest风格的url路径,可以从路径中得到相应的值
@RequestMapping(value = "/hello/{username}/{password}")
public String showhello(@PathVariable String username, @PathVariable(value = "password") String userpassword) {
System.out.println(username + ";" + userpassword);
return "hello";
}
- {变量:正则}表示使用正则表达式来限定值的格式
// TODO: 2021/7/2 用正则表达式限定占位符内值的格式,用{变量:正则表达式} 来确定义
@RequestMapping(value = "/hello/{id:\\d+}/{password}")
public String showhello(@PathVariable int id, @PathVariable(value = "password") String userpassword) {
System.out.println(id + ";" + userpassword);
return "hello";
}
2.3 固定格式
有时候,我们希望通过多个URL来访问Conroller中的方法,这时个,可以用valule 或 path来确定。value和path互为别名,值为数组,可以指定多个值。
@RequestMapping(path = {
"/test3","/test4"})
public String test3(){
return "hello";
}
3. method属性:根据请求方式访问
- 限定请求方式:GET、POST、PUT、DELETE等。主要意思是,通过URL访问controller层方法时,一般都有POST,GET方式,如果想限定这个方法只能是POST 或 都 GET 请求的一种才能访问,这个时候,就需要限请求方式。
- 限定请求方式也是在@RequestMapping()的参数里面,属性类型为method;
- 如果@RequestMapping()里有多个必性,那么必须显示的调用属性;
@RequestMapping(path = "/test5",method = RequestMethod.GET)
@GetMapping(value = "/test5")
public String test5(){
return "hello";
}
@RequestMapping(path = "/test6",method = RequestMethod.POST)
@PostMapping(path = "/test6")
public String test6(){
return "hello";
}
4. @RequestMapping的其他属性(URL的限定属性)
主要是两个属性,这两个属性可以描述为限定属性,意思是只有在URL,或者URL的请求中,只有符合条件的情况下,才能访问controller层中的方法。
- params 限定请求参数,必须符合指定条件;
表达的意思是,有URL路径中,URL必须包容参数,参数的限定条件就是在params属性中定义的。
@RequestMapping(path = "/test7",params = {
"id","username=admin","password!=123"})
public String test7(){
return "hello";
}
- headers 限定请求的头部,必须符合指定条件
@RequestMapping(path = "/test8",headers = {
"Cookie","Accept-Language=zh-CN,zh;q=0.9"})
public String test8(){
return "hello";
}
(三) @SessionAttributes
@SessionAttributes,
从表单提交的数据,传递给控制层方法参数对象,在没有添加@SessionAttributes注解的情况下,每提交一次页面都会产生一个新的自定义方法参数对象,如果想将一个对象贯穿整个会话的始终。那么就得使用@SessionAttributes注解,在注解上添加在方法参数上的对象名。具体用法如下:
- 作用:将模型中指定名称的数据存储到session中
@Controller