Spring MVC
- 前言
- 通过 @RequestParam 注解获取请求参数
- @RequestParam
- 用法
- 通过 ServletAPI 获取请求参数
- 通过实体类对象获取请求参数
- 附
前言
在 Spring MVC 介绍中,谈到前端控制器 DispatcherServlet 接收客户端请求,依据处理器映射 HandlerMapping 配置调用相应的处理器 Controller 。那么,处理器 Controller 具体是如何实现获取请求参数的呢?
通过 @RequestParam 注解获取请求参数
@RequestParam
@RequestParam,用于在处理器 Controller 方法参数上获取 HTTP 请求参数的值。使用 @RequestParam 注解可以获取请求参数的值以及对请求参数进行类型转换或验证。
简单示例:
首先,创建一个 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World</h2>
<form action="${pageContext.request.contextPath}/paramTest" method="post">
账号:<input type="text" name="name" value="" /><br>
密码:<input type="password" name="password" value="" /><br>
<input type="submit" value="提交">
</form>
</body>
</html>
接着,创建一个 accessing.jsp
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2023/7/18
Time: 12:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>提交成功!</h2>
</body>
</html>
然后,获取表单中 name 和 password 参数的值
package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class ParamDemo {
@RequestMapping("/index")
public String index1(){
return "index";
}
@RequestMapping("/paramTest")
//@RequestParam 的 value 值需要与表单中的参数名字(name值)保持一致,而 paramTest() 方法中的参数名字(str1、str2)可以随机填写
public String paramTest(@RequestParam(value = "name") int str1,@RequestParam(value = "password") String str2){
System.out.println("账号 = " + str1);
System.out.println("密码 = " + str2);
return "accessing";
}
}
注:当处理器 Controller 方法中的参数名字与表单中的参数名字不一致时,需要 @RequestParam 的 value 值指定参数名字
最后,测试结果
结果如图:
1.输入账号和密码,点击提交
2.成功提交,跳转到 accessing.jsp
3.获取到相应的参数值
用法
1. 在上面的示例中,Spring MVC 会自动根据参数名字来注入,所以 @RequestParam(value = " ") 的部分可以省略,但需要处理器 Controller 方法中的参数名字与表单中的参数名字(name值)保持一致。
如图:
或者
2. 在上面的示例中,name 为 int 类型,当输入为空时,数据赋值为 null ,页面会报错。
如图:
1.输入为空,直接点击提交
2.页面报错
解决:
1.使用 @RequestParam 注解的 defaultValue 属性设置数据默认值
2.使用 @RequestParam 注解的 required 属性设置值为 false(默认参数赋值为 null ),并将 int 类型改为 Integer 类型
通过 ServletAPI 获取请求参数
使用 ServletAPI 获取参数值
简单示例:
通过 HttpServletRequest 获取参数值
package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
@Controller
public class ParamDemo {
@RequestMapping("/index")
public String index1(){
return "index";
}
//1.使用 @RequestParam 注解获取参数值
@RequestMapping("/paramTest")
public String paramTest(@RequestParam(required = false) Integer name,@RequestParam String password){
System.out.println("账号 = " + name);
System.out.println("密码 = " + password);
return "accessing";
}
//2.使用 HttpServletRequest 直接获取参数值
@RequestMapping("/paramHSR")
public String paramHSR(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException {
req.setCharacterEncoding("UTF-8");
int name = Integer.parseInt(req.getParameter("name"));
String password = req.getParameter("password");
System.out.println("账号 = " + name);
System.out.println("密码 = " + password);
return "accessing";
}
}
另外,index.jsp 中修改路径
结果如图:
通过实体类对象获取请求参数
使用普通 java 对象(POJO)获取参数值
简单示例:
首先,创建一个实体类 ParamUser ,定义账号和密码属性
package cn.edu.springmvcdemo.model;
public class ParamUser {
private int name;
private String password;
public ParamUser() {
super();
}
public ParamUser(int name, String password) {
this.name = name;
this.password = password;
}
public int getName() {
return name;
}
public String getPassword() {
return password;
}
public void setName(int name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "ParamUser{" +
"name=" + name +
", password='" + password + '\'' +
'}';
}
}
接着,通过 ParamUser 对象来调用 get() 方法获取参数值
注:对象属性名字和请求参数名字需要保持一致
package cn.edu.springmvcdemo.controller;
import cn.edu.springmvcdemo.model.ParamUser;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
@Controller
public class ParamDemo {
@RequestMapping("/index")
public String index1(){
return "index";
}
//1.使用 @RequestParam 注解获取参数值
@RequestMapping("/paramTest")
public String paramTest(@RequestParam(required = false) Integer name,@RequestParam String password){
System.out.println("账号 = " + name);
System.out.println("密码 = " + password);
return "accessing";
}
//2.使用 HttpServletRequest 直接获取参数值
@RequestMapping("/paramHSR")
public String paramHSR(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException {
req.setCharacterEncoding("UTF-8");
int name = Integer.parseInt(req.getParameter("name"));
String password = req.getParameter("password");
System.out.println("账号 = " + name);
System.out.println("密码 = " + password);
return "accessing";
}
//3.POJO 传值方式获取参数值
@RequestMapping("/paramUser")
//设置实体类形参
public String paramUser(ParamUser user){
System.out.println("账号 = " + user.getName());
System.out.println("密码 = " + user.getPassword());
return "accessing";
}
}
另外,index.jsp 中修改路径
结果如图:
附
下面简单介绍处理器 Controller 获取前端其他的请求信息的注解,了解即可。
@RequestHeader:用于将 HTTP 请求头中的参数值映射到处理器 Controller 方法参数中
- 常用属性如下:
– name:参数名称
– required:boolean类型,默认为true,即请求头中必须包含此参数
– defaultParameter:为请求头中的参数提供默认值
@CookieValue:用于从 HTTP 请求的 Cookie 中获取指定的值
- 常用属性如下:
– value:参数名称
– required:boolean类型,默认为true,即请求头中必须包含此参数
– defaultValue:设置 Cookie 的默认值