Bootstrap

SpringMVC学习:控制层(Controller)基于注解详解

文章目录


在SpringMVC中, 基于注解的控制层(Controller),客户端发送来的请求Request中的URL就映射到Controller层的一个方法,因此,在Controller层中,大多数注解都是基于这个方法的。下面就从应用于方法的各种注解进行学习。

一、URL映射Controller的方法返回值

方法的返回值,主要有四种类型

  • ModelAndView 表示返回的为数据模型和视图
  • String 表示返回的是视图
    返回值是String类型的,有三种写法,每种写法所解析的意思都是不一样的
  1. 普通字符串——>表示视图名称

  2. “forward:”+url——>转发 (这种写法:使用的是当前的Request对象,而处理此对象的JSP页面是URL 指定的页面。

  3. “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风格(较少使用)

在这里插入图片描述

  1. 单层目录 (一个 * 表示)在这里插入图片描述
  2. 单层或多层目录(两个**号表示)
    在这里插入图片描述
  3. 表示单个字符,必须有一个字符(用 ?表示)
    在这里插入图片描述
2.2 Rest风格
  1. {变量}表示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";
    }
  1. {变量:正则}表示使用正则表达式来限定值的格式
    在这里插入图片描述

    // 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

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;