目录
3 . 在TestParamController类里面写getParamByServletAPI
4 . @RequestMapping注解的其他属性之required = true
5 . @RequestMapping注解的其他属性之defaultValue = "hello"
3 在TestParamController类中写getParamByPojo方法
一 通过ServletAPI获取
1 . 新建TestParamController类
package com.atguigu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/*1.通过servletAPI获取
* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
* 就可以在控制器方法中使用request对象获取请求参数
*
*
* */
@Controller
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParamByServletAPI(HttpServletRequest request){
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:"+username+",password:"+password);
return "success";
}
}
2 . index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a><br>
<form th:action="@{/hello}" method="post">
<input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性</a><br>
<a th:href="@{/aaa/test/ant}">测试@RequestMapping注解支持ant风格的路径</a><br>
<!--<a th:href="@{/test/rest/1}">测试@RequestMapping注解的value属性中的占位符</a><br>-->
<a th:href="@{/test/rest/admin/1}">测试@RequestMapping注解的value属性中的占位符</a><br>
<hr>
<form th:action="@{/param/servletAPI}" method="post">
用户名:<input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit" value="登录"><br>
</form>
<hr>
</body>
</html>
3 . 在TestParamController类里面写getParamByServletAPI
用得不多 因为我们已经用了springmvc 就不用在用原生来获取
springmvc封装的是Servlet,然后我们现在作为控制层 就是一个pojo 就是一个普通的java类 我们并没有让他去实现任何的接口 也没有让他去继承任何的类 所以在getParamByServletAPI这个方法里面要获取请求参数的话,如果按照之前Servlet的思路 必须得有请求对象 也就是要有requset对象,可是现在这里面没有 因为目前这个类是一个普通的java类 没有任何的继承和没有任何的实现
当我们的浏览器发送请求 让DispatcherServlet处理之后 他会拿着请求信息和控制层的@RequestMapping里面的信息进行匹配 如果匹配成功,则调用getParamByServletAPI,处理当前的请求 所以在调用getParamByServletAPI方法的时候也要查看参数的类型 如果我们设置一个 HttpServletRequest request类型的参数 那么在调用getParamByServletAPI方法的时候就会为参数request进行赋值
也就是说我们这里的request表示的是当前要处理的请求对象 换句话说 如果你想用Servlet的API
那我们直接在的控制器方法getParamByServletAPI里面去设置就可以
package com.atguigu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParamByServletAPI(HttpServletRequest request){
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:"+username+",password:"+password);
return "success";
}
}
4. 测试 重新部暑
总结:
通过servletAPI获取 * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参 * 就可以在控制器方法中使用request对象获取请求参数
二 通过控制器方法的形参获取请求参数
1 . index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a><br>
<form th:action="@{/hello}" method="post">
<input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性</a><br>
<a th:href="@{/aaa/test/ant}">测试@RequestMapping注解支持ant风格的路径</a><br>
<!--<a th:href="@{/test/rest/1}">测试@RequestMapping注解的value属性中的占位符</a><br>-->
<a th:href="@{/test/rest/admin/1}">测试@RequestMapping注解的value属性中的占位符</a><br>
<hr>
<form th:action="@{/param}" method="post">
用户名:<input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit" value="登录"><br>
</form>
<hr>
</body>
</html>
2 . TestParamController
package com.atguigu.controller;
/* * 获取请求参数的方式:
* 1、通过servletAPI获取
* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
* 就可以在控制器方法中使用request对象获取请求参数
* 2、通过控制器方法的形参获取
* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
*
* */
@Controller
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParamByServletAPI(HttpServletRequest request){
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:"+username+",password:"+password);
return "success";
}
@RequestMapping("/param")
public String getparam(String username,String password){
System.out.println("username:"+username+",password:"+password);
return "success";
}
}
3. 测试
三 @RequestParam
1 .如果当前请求参数的名字 和形参的名字不一样
比如下图
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a><br>
<form th:action="@{/hello}" method="post">
<input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性</a><br>
<a th:href="@{/aaa/test/ant}">测试@RequestMapping注解支持ant风格的路径</a><br>
<!--<a th:href="@{/test/rest/1}">测试@RequestMapping注解的value属性中的占位符</a><br>-->
<a th:href="@{/test/rest/admin/1}">测试@RequestMapping注解的value属性中的占位符</a><br>
<hr>
<form th:action="@{/param}" method="post">
用户名:<input type="text" name="userName"><br>
密码: <input type="password" name="password"><br>
<input type="submit" value="登录"><br>
</form>
<hr>
</body>
</html>
2. 解决办法 加@RequestParam注解
@RequestParam解释
专门用来设置请求参数和控制器方法的形参 的映射关系的
@RequestParam里面的属性
@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;
}
加上注解后
/* * 获取请求参数的方式:
* 1、通过servletAPI获取
* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
* 就可以在控制器方法中使用request对象获取请求参数
* 2、通过控制器方法的形参获取
* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
*3、@RequestParam:将请求参数和控制器方法的形参绑定
* @RequestParam注解的三个属性:value、required、defaultValue
* value:设置和形参绑定的请求参数的名字
* required:设置是否必须传输value所对应的请求参数
* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
* 400 - Required String parameter 'xxx' is not present
* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
*
* */
@Controller
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParamByServletAPI(HttpServletRequest request){
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:"+username+",password:"+password);
return "success";
}
@RequestMapping("/param")
public String getparam(
@RequestParam("userName") String username,String password
){
System.out.println("username:"+username+",password:"+password);
return "success";
}
}
3 .测试
4 . @RequestMapping注解的其他属性之required = true
required = true 默认值是 true 是否必须传出value所对应的请求参数 如果不传 则直接报错
/* * 获取请求参数的方式:
* 1、通过servletAPI获取
* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
* 就可以在控制器方法中使用request对象获取请求参数
* 2、通过控制器方法的形参获取
* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
*3、@RequestParam:将请求参数和控制器方法的形参绑定
* @RequestParam注解的三个属性:value、required、defaultValue
* value:设置和形参绑定的请求参数的名字
* required:设置是否必须传输value所对应的请求参数
* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
* 400 - Required String parameter 'xxx' is not present
* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
*
* */
@Controller
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParamByServletAPI(HttpServletRequest request){
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:"+username+",password:"+password);
return "success";
}
@RequestMapping("/param")
public String getparam(
@RequestParam(value = "userName",required = true) String username,String password
){
System.out.println("username:"+username+",password:"+password);
return "success";
}
}
required:设置是否必须传输此请求参数,默认值为true
若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为 null
5 . @RequestMapping注解的其他属性之defaultValue = "hello"
required属性值为true 无传输
自己总结:
@RequestParam:将请求参数和控制器方法的形参绑定 * @RequestParam注解的三个属性:value、required、defaultValue * value:设置和形参绑定的请求参数的名字 * required:设置是否必须传输value所对应的请求参数 * 默认值为true,表示value所对应的请求参数必须传输,否则页面报错: * 400 - Required String parameter 'xxx' is not present * 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null * defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
四 @RequestHeader


/* * 获取请求参数的方式:
* 1、通过servletAPI获取
* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
* 就可以在控制器方法中使用request对象获取请求参数
* 2、通过控制器方法的形参获取
* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
*3、@RequestParam:将请求参数和控制器方法的形参绑定
* @RequestParam注解的三个属性:value、required、defaultValue
* value:设置和形参绑定的请求参数的名字
* required:设置是否必须传输value所对应的请求参数
* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
* 400 - Required String parameter 'xxx' is not present
* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值 无关
*4、@RequestHeader:将请求头信息和控制器方法的形参绑定
* 5、@CookieValue:将cookie数据和控制器方法的形参绑定
* */
@Controller
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParamByServletAPI(HttpServletRequest request){
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:"+username+",password:"+password);
return "success";
}
@RequestMapping("/param")
public String getparam(
@RequestParam(value = "userName",required = false,defaultValue = "hello") String username,String password,
@RequestHeader("referer") String referer
){
System.out.println("referer:"+referer);
System.out.println("username:"+username+",password:"+password);
return "success";
}
}
五 @CookieValue
/* * 获取请求参数的方式:
* 1、通过servletAPI获取
* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
* 就可以在控制器方法中使用request对象获取请求参数
* 2、通过控制器方法的形参获取
* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
*3、@RequestParam:将请求参数和控制器方法的形参绑定
* @RequestParam注解的三个属性:value、required、defaultValue
* value:设置和形参绑定的请求参数的名字
* required:设置是否必须传输value所对应的请求参数
* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
* 400 - Required String parameter 'xxx' is not present
* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
*4、@RequestHeader:将请求头信息和控制器方法的形参绑定
* 5、@CookieValue:将cookie数据和控制器方法的形参绑定
* */
@Controller
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParamByServletAPI(HttpServletRequest request){
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:"+username+",password:"+password);
return "success";
}
@RequestMapping("/param")
public String getparam(
@RequestParam(value = "userName",required = false,defaultValue = "hello") String username,String password,
@RequestHeader("referer") String referer,
@CookieValue("JSESSIONID") String jsessionId
){
System.out.println("referer:"+referer);
System.out.println("jsessionId:"+jsessionId);
System.out.println("username:"+username+",password:"+password);
return "success";
}
}
Path=/springMVC; HttpOnly 有效路径
总结:
@RequestHeader:将请求头信息和控制器方法的形参绑定 @CookieValue:将cookie数据和控制器方法的形参绑定
六 通过POJO获取请求参数
1.创建实体类
package com.atguigu.pojo;
public class User {
private Integer id;
private String username;
private String password;
public User() {
}
public User(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
2. index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>index.html</h1>
<a th:href="@{/hello}">测试@RequestMapping注解所标识的位置</a><br>
<a th:href="@{/abc}">测试@RequestMapping注解的value属性</a><br>
<form th:action="@{/hello}" method="post">
<input type="submit" value="测试@RequestMapping注解的method属性">
</form>
<a th:href="@{/hello?username=admin}">测试@RequestMapping注解的params属性</a><br>
<a th:href="@{/hello(username='admin')}">测试@RequestMapping注解的params属性</a><br>
<a th:href="@{/aaa/test/ant}">测试@RequestMapping注解支持ant风格的路径</a><br>
<!--<a th:href="@{/test/rest/1}">测试@RequestMapping注解的value属性中的占位符</a><br>-->
<a th:href="@{/test/rest/admin/1}">测试@RequestMapping注解的value属性中的占位符</a><br>
<!--<hr>
<form th:action="@{/param}" method="post">
用户名:<input type="text" name="userName"><br>
密码: <input type="password" name="password"><br>
<input type="submit" value="登录"><br>
</form>
<hr>-->
<hr>
<form th:action="@{/param/pojo}" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录"><br>
</form>
<hr>
</body>
</html>
3 在TestParamController类中写getParamByPojo方法
/* * 获取请求参数的方式:
* 1、通过servletAPI获取
* 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参
* 就可以在控制器方法中使用request对象获取请求参数
* 2、通过控制器方法的形参获取
* 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
*3、@RequestParam:将请求参数和控制器方法的形参绑定
* @RequestParam注解的三个属性:value、required、defaultValue
* value:设置和形参绑定的请求参数的名字
* required:设置是否必须传输value所对应的请求参数
* 默认值为true,表示value所对应的请求参数必须传输,否则页面报错:
* 400 - Required String parameter 'xxx' is not present
* 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null
* defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
*4、@RequestHeader:将请求头信息和控制器方法的形参绑定
5、@CookieValue:将cookie数据和控制器方法的形参绑定
6、通过控制器方法的实体类类型的形参获取请求参数
* 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致
* 可以通过实体类类型的形参获取请求参数
* */
@Controller
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParamByServletAPI(HttpServletRequest request){
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:"+username+",password:"+password);
return "success";
}
@RequestMapping("/param")
public String getparam(
@RequestParam(value = "userName",required = false,defaultValue = "hello") String username,String password,
@RequestHeader("referer") String referer,
@CookieValue("JSESSIONID") String jsessionId
){
System.out.println("referer:"+referer);
System.out.println("jsessionId:"+jsessionId);
System.out.println("username:"+username+",password:"+password);
return "success";
}
@RequestMapping("/param/pojo")
public String getParamByPojo(User user){
System.out.println(user);
return "success";
}
}
4 测试
总结
通过控制器方法的实体类类型的形参获取请求参数 * 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致 * 可以通过实体类类型的形参获取请求参数
七 解决获取请求参数的乱码问题
1 .配置springMVC的编码过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置Spring的编码过滤器-->
<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>
<!--
配置SpringMVC的前端控制器DispatcherServlet 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理
SpringMVC的配置文件默认的位置和名称:
位置:WEB-INF下
名称:<servlet-name>-servlet.xml,当前配置下的配置文件名为SpringMVC-servlet.xml
url-pattern中/和/*的区别:
/:匹配浏览器向服务器发送的所有请求(不包括.jsp)
/*:匹配浏览器向服务器发送的所有请求(包括.jsp)
-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 通过初始化参数指定SpringMVC配置文件的位置和名称 -->
<init-param>
<!-- contextConfigLocation为固定值 -->
<param-name>contextConfigLocation</param-name>
<!-- 使用classpath:表示从类路径查找配置文件,例如maven工程中的src/main/resources -->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--
作为框架的核心组件,在启动过程中有大量的初始化操作要做
而这些操作放在第一次请求时才执行会严重影响访问速度
因此需要通过此标签将启动控制DispatcherServlet的初始化时间提前到服务器启动时
将DispatcherServlet的初始化时间提前到服务器启动时
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--
设置springMVC的核心控制器所能处理的请求的请求路径
/所匹配的请求可以是/login或.html或.js或.css方式的请求路径
但是/不能匹配.jsp请求路径的请求
-->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
过滤器CharacterEncodingFilter的源码
CharacterEncodingFilter extends OncePerRequestFilter
OncePerRequestFilter extends GenericFilterBean
GenericFilterBean implements Filter
整合
CharacterEncodingFilter extends OncePerRequestFilter
OncePerRequestFilter extends GenericFilterBean
GenericFilterBean implements Filter
Alt + 7 查看类中结构 源码问题这里面不讲
2 .测试
总结:
解决获取请求此参数的乱码问题 * 在web.xml中配置Spring的编码过滤器CharacterEncodingFilter
全部总结
/** * 获取请求参数的方式: * 1、通过servletAPI获取 * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参 * 就可以在控制器方法中使用request对象获取请求参数 * 2、通过控制器方法的形参获取 * 只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可 * 3、@RequestParam:将请求参数和控制器方法的形参绑定 * @RequestParam注解的三个属性:value、required、defaultValue * value:设置和形参绑定的请求参数的名字 * required:设置是否必须传输value所对应的请求参数 * 默认值为true,表示value所对应的请求参数必须传输,否则页面报错: * 400 - Required String parameter 'xxx' is not present * 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null * defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关 * 4、@RequestHeader:将请求头信息和控制器方法的形参绑定 * 5、@CookieValue:将cookie数据和控制器方法的形参绑定 * 6、通过控制器方法的实体类类型的形参获取请求参数 * 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致 * 可以通过实体类类型的形参获取请求参数 * 7、解决获取请求此参数的乱码问题 * 在web.xml中配置Spring的编码过滤器CharacterEncodingFilter */