通过ServletAPI获取 (很少用)
只需要在控制器方法的形参设置HttpServletRequest类型的形参,
就可以在控制器方法中使用request对象获取请求参数。
controller控制层
@RequestMapping("/param/servletAPI")
public String getParmByServletAPI(HttpServletRequest request){
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println("username:"+username+"passworld:"+password);
return "success";
}
thymeleaf渲染页面
<form th:action="@{/param/servletAPI}" method="post">
用户名:<input type="text" name="username">
密码:<input type="text" name="password">
<input type="submit" value="登录">
</form>
<!--success.html-->
<h1>跳转成功</h1>
通过控制器方法的形参获取请求参数
只需要在控制器方法的形参位置,设置一个形参,
形参的名字和请求参数的名字 (表单name属性值等于value属性值) 一致即可。
controller控制层
@RequestMapping("/param")
public String getParam(String username,String password){
System.out.println("username:"+username+"passworld:"+password);
return "success";
}
特殊情况 形参和请求参数名字不同
RequestParam
@RequestParam:将请求参数和控制器方法的形参绑定
@RequestParam注解的三个属性:①value,②required,defaultvalue
①value:设置和形参绑定的请求参数的名字
②required:设置是否必须传输value所对应的请求参数,
默认值为true表示value所对应的请求参数必须传输,否则页面报错,
若为false,表示value所对应请求参数不是必须传输,
若为传输,则形参值为null。
③defaultValue:设置当没有传输value所对的请求参数时,为形参设置的默认值,
此时和required属性值无关。
controller控制层
@RequestMapping("/param")
public String getParam(
@RequestParam(value = "userName",required = true,defaultValue ="hello")
String username, String password){
System.out.println("username:"+username+"passworld:"+password);
return "success";
}
@RequestHeader
@RequestHeader:将请求头信息和控制器方法的形参绑定
@RequestHeader注解一共有三个属性:value、required、defaultValue,
用法同@RequestParam。
@CookieValue
@CookieValue:将cookie数据和控制器方法的形参绑定
@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam
@RequestMapping("/param/servletAPI")
//当这个请求处理完成后,就会在响应报文里往浏览器响应JSESSIONID,从此之后每次发送请求都会携带cookie
public String getParmByServletAPI(HttpServletRequest request){
// 获取session对象,请求报文中就有cookie数据了
HttpSession session = request.getSession();
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println("username:"+username+"passworld:"+password);
return "success";
}
@RequestMapping("/param")
//cookievalue注解的value值是获取数据cookie数据cookie的键
public String getParam(@CookieValue("JSESSIONID") String jsessionid){
System.out.println("jsessionid:"+jsessionid);
//jsessionid:7B77E41C08EE94041881552DA35AA4C6
return "success";
}
通过POJO获取请求参数
通过控制器方法的实体类型的形参获取请求参数
需要控制器方法的形参位置设置实体类类型的形参,
要保证实体类中的属性的属性名和请求参数的名字一致,
就可以直接把当前请求参数值封装到实体类类型的形参 。
实体类
public class User {
private Integer id;
private String username;
private String password;
public User() {
}
....
}
controller控制层
@RequestMapping("/param/pojo")
public String getParamByPojo(User user){
System.out.println(user);
//输出为:User{id=null, username='...', password='...'}
return "success";
}
thymeleaf渲染页面
<form th:action="@{/param/pojo}" method="post">
用户名:<input type="text" name="username">
密码:<input type="text" name="password">
<input type="submit" value="登录">
</form>
解决获取请求参数的乱码问题
不能用底层javaweb的API解决乱码问题,
因为在springmvc中请求对象是DispatcherServlet给的,所以在DispatcherServlet已经 获取了请求参数,已经不能设置编码问题,设置编码之前,一定不能获取任何请求参数。
web.xml
<!-- 配置springmvc的编码过滤器CharacterEncodingFilter-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 同时设置响应编码-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>