1,常用的参数:

参数: 作用:
@RequestMapping (类/方法注解) 7种作用(位置与参数不同有不同的作用)
@RequestParam (参数注解) 3种作用
@PathVariable (参数注解) 映射 URL 绑定的占位符;
@RestController(类注解) 是 @Controller 和 @ResponseBody 的结合,一个类被加上@RestController 注解,数据接口中就不再需要添加 @ResponseBody ,更加简洁。
@Controller (类注解) 表示该类是一个控制器类,用于和前端进行数据交互
@ResponseBody
@GetMappping,@PostMapping, @PutMapping, @DeleteMapping 结合@RequestMapping使用, 是Rest风格的, 指定更明确的子路径.
@EnableWebMvc 开启WebMVC功能

@RequestMapping:各作用如下:(仅举例常用的5种)

主要用于控制器类中;

  1. 1. *** 标记请求URL:**
  • 在方法上添加注解:

      @Autowired
      private HelloService helloService;
    
      @RequestMapping("/hello")
      public ModelAndView hello() {
          ModelAndView mv = new ModelAndView("hello");
          mv.addObject("name", helloService.hello("Lang"));
          return mv;
      }
    

    其中,地址可以是多个,就是可以多个地址映射到同一个方法。 这个配置,表示 /hello 和 /hello2 都可以访问到该方法。

    2. *** 请求窄化:**
    
  • 同一个项目中,会存在多个接口,例如订单相关的接口都是 /order/xxx 格式的,用户相关的接口都是 /user/xxx 格式的。为了方便处理,这里的前缀(就是 /order、/user)可以统一在一个 Controller 上面处理。

    在控制器类上添加注解

@Controller
@RequestMapping("/user")
public class MyController {
    @Autowired
    private HelloService helloService;

    @RequestMapping(value = {"/hello", "/hello2"})
    public ModelAndView hello() {
        ModelAndView mv = new ModelAndView("hello");
        mv.addObject("name", helloService.hello("Lang"));
        return mv;
    }
}

当类上加了 @RequestMapping 注解之后,此时,要想访问到 hello ,地址就应该是 /user/hello 或者 /user/hello2

  3. **请求方法的绑定:(使用RESTful风格)**
  • 默认情况下,使用 @RequestMapping 注解定义好的方法,可以被 GET 请求访问到,也可以被 POST 请求访问到,但是 DELETE 请求以及 PUT 请求不可以访问到
      @RequestMapping(value = "/hello", method = RequestMethod.POST)
      public ModelAndView postHello() {
          ModelAndView mv = new ModelAndView("hello");
          mv.addObject("name", helloService.hello("Lang"));
          return mv;
      }
    

    但是一般这些请求在前端就定义好了格式,后端只要用对应的Mapping注解获取即可;

通过 @RequestMapping 注解,指定了该接口只能被 POST请求访问到,此时,该接口就不可以被 GET 以及请求请求访问到了。强行访问会报如下错误: image.png

  4. **定义返回值:**
  • 如果是前后端不分的开发,大部分情况下,我们返回 ModelAndView,即数据模型+视图

    @Controller
    @RequestMapping("/user")
    public class HelloController {
      @RequestMapping("/hello")
      public ModelAndView hello() {
          ModelAndView mv = new ModelAndView("hello");
          mv.addObject("username", "javaboy");
          return mv;
      }
    }
    

    Model 中,放我们的数据,然后在 ModelAndView 中指定视图名称

    5. **重定向与转发:**
    - **重定向:**
    
    @RequestMapping("/hello5")
    public String hello5() {
      return "redirect:/user/hello";
    }
    
    - **转发:**
    
    @RequestMapping("/hello5")
    public String hello5() {
      return "forward:/jsp/hello.jsp";
    }
    

    在目前来说,转发的页面一般由前端进行控制,因为使用了异步框架(AJAX);所以这个不推荐;

    6. **返回字符串:**
    
  • 返回逻辑视图名
    前面的 ModelAndView 可以拆分为两部分,Model 和 View,在 SpringMVC 中,Model 我们可以直接在参数中指定,然后返回值是逻辑视图名:

    @RequestMapping("/hello5")
    public String hello5(Model model) {
      model.addAttribute("username", "javaboy");//这是数据模型
      return "hello";//表示去查找一个名为 hello 的视图
    }
    
    7. **真的返回一个字符串:**
    
  • 上面返回的字符串,都是有特殊含义的,如果一定要返回一个字符串,需要额外添加一个注意:@ResponseBody ,这个注解表示当前方法的返回值就是要展示出来返回值,没有特殊含义。

    @RequestMapping("/hello5")
    @ResponseBody
    public String hello5() {
      return "redirect:/user/hello";
    }
    
  • 上面代码表示就是想返回一段内容为 redirect:/user/hello 的字符串,他没有特殊含义。注意,这里如果单纯的返回一个中文字符串,是会乱码的,可以在 @RequestMapping 中添加 produces 属性来解决:

    @RequestMapping(value = "/hello5",produces = "text/html;charset=utf-8")
    @ResponseBody
    public String hello5() {
      return "Java 语言程序设计";
    }
    

    默认支持的参数类型 默认支持的参数类型,就是可以直接写在 @RequestMapping 所注解的方法中的参数类型,一共有四类:

    1. HttpServletRequest
    2. HttpServletResponse
    3. HttpSession
    4. Model/ModelMap

    这几个例子可以参考上一小节。


@RequestParam :

  1. *** 给变量/参数取别名:**
  • 表单中字段的 name 属性要和接口中的变量名一一对应,才能映射成功,否则服务端接收不到前端传来的数据。有一些特殊情况,我们的服务端的接口变量名可能和前端不一致,这个时候我们可以通过 @RequestParam 注解来解决。

    @RequestMapping("employee")
    @ResponseBody
    public void doAdd(@RequestParam("name") String bookname, String author, Double price, Boolean ispublic) {
      System.out.println(bookname);
      System.out.println(author);
      System.out.println(price);
      System.out.println(ispublic);
    }
    

    这里的参数就是与URL中的参数/变量同名;

    2. **设置变量是否必填和给变量设置默认值:**
    
  • 在这个注解中,还可以添加 required 属性和 defaultValue 属性,如下:
    @RequestMapping(value = "/doAdd",method = RequestMethod.POST)
    @ResponseBody
    public void doAdd(@RequestParam(value = "name",required = true,defaultValue = "三国演义") String bookname, String author, Double price, Boolean ispublic) {
      System.out.println(bookname);
      System.out.println(author);
      System.out.println(price);
      System.out.println(ispublic);
    }
    

    required 属性默认为 true,即只要添加了 @RequestParam 注解,这个参数默认就是必填的,如果不填,请求无法提交,会报 400 错误(在设置默认值的情况下),如果这个参数不是必填项,可以手动把 required 属性设置为 false。但是,如果同时设置了 defaultValue,这个时候,前端不传该参数到后端,即使 required 属性为 true,它也不会报错。


@PathVariable :映射 URL 绑定的占位符;

  • 带占位符的 URL Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义
  • 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。 ```java

//@PathVariable可以用来映射URL中的占位符到目标方法的参数中 @RequestMapping(“/testPathVariable/{id}”) public String testPathVariable(@PathVariable(“id”) Integer id) { System.out.println(“testPathVariable:”+id); return SUCCESS; } ```