💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # @RequestParam **作用:** 把请求中指定名称的参数给控制器中的形参赋值。 **属性:** * value:请求参数中的名称。 * required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错 ~~~ // /abc?name=111 @RequestMapping(path = "/abc") public String sayAbc(@RequestParam(name = "name", required = false) String username) { //把name赋值给username System.out.println(username); return "success"; } ~~~ # @RequestBody **作用** 用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。 get 请求方式不适用。 **属性** required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null。 ~~~ //页面 <form action="word?uname=1111" method="post"> 用户姓名:<input type="text" name="uname"/><br/> 用户年龄:<input type="text" name="age"/><br/> 用户生日: <input type="text" name="date"/><br/> <input type="submit" value="提交"/> </form> //控制器 @RequestMapping(path = "/word") public String sayWord(@RequestBody(required = false) String body) { //hello sayWord: uname=1112e23&age=11&date=2019-08-19 System.out.println("hello sayWord: " + body); return "success"; } ~~~ # @PathVaribale **作用:** 用于绑定 url 中的占位符。例如:请求 url 中 `/delete/{id}`,这个`{id}`就是 url 占位符。 url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。 **属性:** value:用于指定 url 中占位符名称。 required:是否必须提供占位符。 ~~~ //页面 <a href="word/100">pathVariable 注解</a> //控制器 @RequestMapping(path = "/word/{id}") public String sayWord(@PathVariable("id") Integer id) { System.out.println("hello sayWord: " + id); return "success"; } ~~~ # @HiddentHttpMethodFilter **作用:** 由于浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支持,Spring3.0 添 加了一个过滤器,可以将浏览器请求改为指定的请求方式,发送给我们的控制器方法,使得支持 GET、POST、PUT 与 DELETE 请求。 **使用方法:** 第一步:在 web.xml 中配置该过滤器。 第二步:请求方式必须使用 post 请求。 第三步:按照要求提供_method 请求参数,该参数的取值就是我们需要的请求方式 **源码分析** ![](https://img.kancloud.cn/f3/02/f3029ef85b6b35ff7383b946c36b3d92_1360x787.png) ~~~ <!-- 更新 --> <form action="springmvc/testRestPUT/1" method="post"> 用户名称:<input type="text" name="username"><br/> <input type="hidden" name="_method" value="PUT"> <input type="submit" value="更新"> </form> //控制器 @RequestMapping(value="/testRestPOST",method=RequestMethod.PUT) ~~~ web.xml下的web-app下 ~~~ <!-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter,可以吧POST请求转换为PUT或DELETE请求--> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ~~~ # @RequestHeader **作用:** 用于获取请求消息头。 **属性:** value:提供消息头名称 required:是否必须有此消息头 ~~~ @RequestMapping("/useRequestHeader") public String useRequestHeader(@RequestHeader(value="Accept-Language", required=false)String requestHeader){ System.out.println(requestHeader); return "success"; } ~~~ # @CookieValue **作用:** 用于把指定 cookie 名称的值传入控制器方法参数。 **属性:** value:指定 cookie 的名称。 required:是否必须有此 cookie。 ~~~ @RequestMapping("/useCookieValue") public String useCookieValue(@CookieValue(value="JSESSIONID",required=false) String cookieValue){ System.out.println(cookieValue); return "success"; } ~~~ # @ModelAttribute **作用:** 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可 以修饰有具体返回值的方法。 出现在参数上,获取指定的数据给参数赋值。 **属性:** value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。 **应用场景:** 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。 例如: 我们在编辑一个用户时, 用户有一个创建 信息字段,该字段 的值是不允许被 修改的。在提交表 单数 据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。 **ModelAttribute 修饰方法带返回值** ~~~ //页面 <form action="word" method="post"> 用户姓名:<input type="text" name="uname"/><br/> 用户年龄:<input type="text" name="age"/><br/> <input type="submit" value="提交"/> </form> //控制器 //该方法会先执行 @ModelAttribute public User showUser(String uname) { System.out.println("showUser执行了"); User user = new User(); //模拟查询数据库 user.setUname(uname); user.setAge(20); user.setDate(new Date()); return user; } @RequestMapping(path = "/word") public String sayWord(User user) { System.out.println("hello sayWord: " + user); return "success"; } ~~~ **ModelAttribute 修饰方法不带返回值** 把对象放到map中,控制器通过map的key获取对象 ~~~ //该方法会先执行 @ModelAttribute public void showUser(String uname, Map<String, User> map) { System.out.println("showUser执行了"); User user = new User(); //模拟查询数据库 user.setUname(uname); user.setAge(21); user.setDate(new Date()); map.put("abc", user); } @RequestMapping(path = "/word") public String sayWord(@ModelAttribute("abc") User user) { System.out.println("hello sayWord: " + user); return "success"; } ~~~ # @SessionAttribute **只能作用在类上** 提供了一个Model接口org.springframework.ui.Model 也提供了一些实现类 **作用:** 用于多次执行控制器方法间的参数共享。 **属性:** value:用于指定存入的属性名称 type:用于指定存入的数据类型。 控制器类上 ~~~ @Controller @SessionAttributes(value = {"msg"}) //把 msg=xx 存入到session域中 public class HelloController { ~~~ 存值 ~~~ @RequestMapping(path = "/order") public String sayOrder(Model model) { //底层会存储到request域对象中 model.addAttribute("msg", "session-msg"); System.out.println("---model---"); return "success"; } ~~~ 取值 ~~~ @RequestMapping(path = "/Gods") public String sayGods(ModelMap model) { System.out.println(model.get("msg")); System.out.println("---Gods---"); return "success"; } ~~~ 清除 ~~~ @RequestMapping(path = "/del") public String sayDel(SessionStatus status) { status.setComplete(); System.out.println("---del---"); return "success"; } ~~~