可以通过使用@PathVariable注解,来获取绑定到URI模板路径变量上的值。一般都是结合着@RequestMapping注解来使用,用于在参数传递的过程中,规范前端发送请求的格式,和数据的验证。
注意的点:@PathVarible注解,如果方法参数为Map@PathVariable Map
。
@PathVariable注解源码:
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
}
使用:
@ResponseBody
@RequestMapping("/role/{name}/{age}")
public Map getParam01(@PathVariable("name") String name,
@PathVariable("age") String age,
@PathVariable Map<String,String> map){
Map<Object, Object> map1 = new HashMap<>();
map1.put("name",name);
map1.put("age",age);
map1.put("map",map);
return map1;
}
可以通过@RequestHeader注解来获取请求标头的一些信息,如果方法参数是Map
@RequestHeader注解源码:
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
注意如果获取请求标头的单个信息,或者部分信息的话@RequestHeader(value=“xxxx”),其中xxx需要是请求标头中有的信息,比如host,connection,user-agent…
使用:
@ResponseBody
@RequestMapping("/headerMap01")
public Map<String, String> getParam02(@RequestHeader Map<String,String> mapHeader){
return mapHeader;
}
@ResponseBody
@RequestMapping("/headerMap02")
public String getParam03(@RequestHeader("host") String host){
return host;
}
@RequestParam注解,作用和原生的request.getParameter()一样,也是获取请求域对象中的参数值。
@RequestParam注解源码:
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Map;
import org.springframework.core.annotation.AliasFor;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
对比@RequestParam注解和request.getParameter() 【基本一样】:
编写表单页面:
<hr>
<form action="/reqParam01" method="post">
<input type="text" name="userName"><br>
<input type="number" name="userAge"><br>
<input type="submit" value="提交--使用注解方式">
form>
<hr>
<form action="/reqParam02" method="post">
<input type="text" name="userName"><br>
<input type="number" name="userAge"><br>
<input type="submit" value="提交--使用request域对象方式">
form>
编写请求映射:
@ResponseBody
@RequestMapping("/reqParam01")
public String getParam04(@RequestParam String userName,@RequestParam int userAge){
return "用户名:"+userName+" 用户年龄:"+userAge;
}
@ResponseBody
@RequestMapping("/reqParam02")
public String getParam05(HttpServletRequest request){
String userName = request.getParameter("userName");
String userAge = request.getParameter("userAge");
return "用户名:"+userName+" 用户年龄:"+userAge;
}
@RequestBody注解用来获取完整的请求体对象并返回。
@RequestBody注解源码:
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.http.converter.HttpMessageConverter;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
boolean required() default true;
}
使用:
做一个表单用来封装请求体:
<hr>
<form action="/reqBody" method="post">
<input type="text" name="user"><br>
<input type="password" name="upwd"><br>
男:<input type="radio" name="sex" value="男">
女:<input type="radio" name="sex" value="女"><br>
<select name="address">
<option value="-----请选择-----" disabled selected>-----请选择-----option>
<option value="内蒙古">内蒙古option>
<option value="山西">山西option>
<option value="湖北">湖北option>
select>
<input type="submit" value="提交">
form>
编写请求映射:
@ResponseBody
@RequestMapping("/reqBody")
public String getParam06(@RequestBody String reqBody){
return reqBody;
}
post方式提交所以不是明文。
@ModelAttribute注解用于将方法的参数或方法的返回值绑定到指定的模型属性上,并返回给Web视图。
@ModelAttribute可用于通过注释@RequestMapping方法的相应参数,使用特定属性名称向web视图显示命令对象。
@ModelAttribute还可以用于通过使用@RequestMapping方法注释控制器类中的访问器方法来向web视图公开引用数据。
@ModelAttribute注解源码:
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
import org.springframework.ui.Model;
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ModelAttribute {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean binding() default true;
}
被@ModelAttribute
注解注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
比如:
@ModelAttribute
public void populateModel(@RequestParam String abc, Model model) {
model.addAttribute("attributeName", abc);
}
@ResponseBody
@RequestMapping(value = "/helloWorld")
public String helloWorld() {
return "helloWorld";
}
在获得请求/helloWorld
后,populateModel方法在helloWorld方法之前先被调用,它把请求参数(/helloWorld?abc=text)
加入到一个名为attributeName的model属性中,在它执行后helloWorld被调用,返回视图名helloWorld和model已由@ModelAttribute方法生产好了。
此时,直接访问helloWolrd请求会出错, Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'abc' for method parameter type String is not present]
.
必须在其请求上添加一个名为abc值为任意的请求参数(例如:http://localhost:8080/helloWorld?abc=text
)
将@ModelAttribute放在方法参数上,会获取到对应的参数的值 @ModelAttribute("xxx") 返回方法参数
html表单:
<hr>
<form action="/model01" method="post">
标题:<input type="text" name="title" ><br><br>
内容:<textarea rows="10" cols="40" name="content">textarea><br>
<input type="submit" value="提交">
form>
请求映射:
@ResponseBody
@RequestMapping("/model01")
public String getParam07(@ModelAttribute("content") String content,@ModelAttribute("title") String title){
return content+"\n"+title;
}
@CookieValue注解主要是将请求的Cookie数据,映射到功能处理方法的参数上。
@CookieValue注解源码:
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CookieValue {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
它将一个HTTP cookie绑定于方法的一个参数。
1、value:绑定的参数名称,String类型。
2、required:是否必须包含value,boolean类型,默认为 true,表示请求参数中必须包含对应的参数;若不存在,将抛出异常。
3、defaultValue:默认值,String类型。当没有传参时将使用此值赋值。
使用@CookieValue注解获取sessionId信息:
@ResponseBody
@RequestMapping("/cookieMap")
public String getParam08(@CookieValue("JSESSIONID")String sessionId) {
return sessionId;
}
启动服务报错了,原因是jsessionId,应该填写实际存在的jsessionid才行(大意了)
将上面的例子修改如下:
@ResponseBody
@RequestMapping("/cookieMap")
public String getParam08(@CookieValue("Idea-37e99455")String sessionId) {
return sessionId;
}
成功访问了: