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. *** 标记请求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 以及请求请求访问到了。强行访问会报如下错误:
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 所注解的方法中的参数类型,一共有四类:
- HttpServletRequest
- HttpServletResponse
- HttpSession
- 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; } ```