在传统的javaweb中我们获取数据是通过
HttpServletRequest
中的getParameter
或者getHeader
等方法来获取相关的信息。由此我们引出了以下问题:
在SpringMVC中应该如何获取请求提交的数据呢?
在SpringMVC中又应该如何获取请求头信息呢?
在SpringMVC中又应该如何获取客户端提交的Cookie数据呢?
接下来我们将逐一解释上面的三个问题。我们使用idea进行开发。在进行解释之前我们需要准备一个`Register.html`的页面。方便进行表单的提交。`Register.html`代码如下:
问题1 如何获取请求提交的数据?
1.1使用Servlet原生api获取
//方式一采用原生请求方式@PostMapping(value = "/register")public String register(HttpServletRequest req){String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username: "+username+" send a request");return "success";}
如果 System.out.println("username: "+username+" send a request");
语句输出成功,并且浏览器跳转到success.html
页面即为测试成功。
测试结果:
页面跳转:
控制台输出:
1.2采用RequestMapping的Param参数
1.2.1基本使用:
//采用params参数@PostMapping(value = "/register")public String register(@RequestParam("username")String Username,@RequestParam("password")String password){System.out.println("Username: "+Username+" Password: "+password);return "success";}
##### 测试结果:
1.2.2 添加require属性
在注解中添加required
属性并且设置为true
表示请求必须携带该参数,否则无法使用
//采用params参数@PostMapping(value = "/register")public String register(@RequestParam(value = "username" ,required = false)String Username,@RequestParam("password")String password,@RequestParam("sex",required = true)String sex){System.out.println("Username: "+Username+" Password: "+password);return "success";}
1.2.3 defaultValue属性
defaultValue属性用来设置形参的默认值,当没有提供对应的请求参数
或者请求参数的值是空字符串""
的时候,方法的形参会采用默认值。
@PostMapping(value = "/register")public String register(@RequestParam(value = "username" ,required = false)String Username,@RequestParam("password")String password,@RequestParam("sex")String sex,@RequestParam(value = "hobby" ,required = false ,defaultValue = "未知")String hobby){System.out.println("Username: "+Username+" Password: "+password);return "success";}
1.3 依靠控制器方法上的形参名来接收
@RequestParam 这个注解是可以省略的,如果方法形参的名字和提交数据时的name相同,则 @RequestParam 可以省略。
但有一个前提:如果你采用的是Spring6+版本,你需要在pom.xml文件中指定编译参数'-parameter',配置如下:
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.12.1</version><configuration><source>21</source><target>21</target><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin></plugins>
</build>
注意:如果你使用的是Spring5的版本,以上的配置是不需要的。
Controller中的方法只需要这样写:形参的名字必须和提交的数据的name一致!!!!!
@PostMapping(value="/register")
public String register(String username, String password, String sex, ){System.out.println(username + "," + password + "," + sex );return "success";
}
1.4 POJO类/JavaBean接收请求参数(重要)
在我之前的《SpringMVC框架和Servlet开发有啥子区别?》一文中我提到了 SpringMVC架构相对于传统原生的Servlet多了一个使用POJO类/JavaBean接收请求参数。为我们开发提供极大的简便。
当提交的数据非常多时,方法的形参个数会非常多,这不是很好的设计。在SpringMVC中也可以使用POJO类/JavaBean来接收请求参数。不过有一个非常重要的要求:POJO类的属性名
必须和请求参数的参数名
保持一致。SpringMvC底层会使用反射机制创建对象并且调用对象的set方法给User对象的属性赋值。提供以下的JavaBean:
ublic class User {private Long id;private String username;private String password;private String sex;private String[] hobby;private String intro;public User() {}public User(Long id, String username, String password, String sex, String[] hobby, String intro) {this.id = id;this.username = username;this.password = password;this.sex = sex;this.hobby = hobby;this.intro = intro;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String[] getHobby() {return hobby;}public void setHobby(String[] hobby) {this.hobby = hobby;}public String getIntro() {return intro;}public void setIntro(String intro) {this.intro = intro;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", sex='" + sex + '\'' +", hobby=" + Arrays.toString(hobby) +", intro='" + intro + '\'' +'}';}
}
问题二:在SpringMVC中又应该如何获取请求头信息呢?
通过RequestHeader注解可以拿到请求头信息。请求头信息的形式也是key:value
的键值对形式。该注解的作用是:将请求头信息
映射到方法的形参上
。和RequestParam注解功能相似,RequestParam注解的作用:将请求参数
映射到方法的形参
上。当然,对于RequestHeader注解来说,也有三个属性:value、required、defaultValue,和RequestParam一样。
@PostMapping("/register")
public String register(User user, @RequestHeader(value="Referer", required = false, defaultValue = "") String referer){System.out.println(user);System.out.println(referer);return "success";
}
问题三:在SpringMVC中又应该如何获取客户端提交的Cookie数据呢?
我们可以通过CookieValue注解来获取Cookie信息。该注解的作用:将请求提交的Cookie数据
映射到方法形参
上。该注解同样是有三个属性:value、required、defaultValue。
前端代码:
<script type="text/javascript">function sendCookie(){document.cookie = "id=123456789; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";document.location = "/springmvc/register";}
</script>
<button onclick="sendCookie()">向服务器端发送Cookie</button>
后端接收代码
@GetMapping("/register")public String register(User user,@RequestHeader(value="Referer", required = false, defaultValue = "")String referer,@CookieValue(value="id", required = false, defaultValue = "2222222222")String id){System.out.println(user);System.out.println(referer);System.out.println(id);return "success";}