目录
3 . 在TestParamController类里面写getParamByServletAPI
4 . @RequestMapping注解的其他属性之required = true
5 . @RequestMapping注解的其他属性之defaultValue = "hello"
3 在TestParamController类中写getParamByPojo方法

- 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";
- }
-
-
- }
-
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>首页title>
- head>
- <body>
- <h1>index.htmlh1>
- <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/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>
用得不多 因为我们已经用了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";
- }
-
-
- }


总结:
通过servletAPI获取 * 只需要在控制器方法的形参位置设置HttpServletRequest类型的形参 * 就可以在控制器方法中使用request对象获取请求参数

- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>首页title>
- head>
- <body>
- <h1>index.htmlh1>
- <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/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>

- 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";
- }
-
-
- }

比如下图

- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>首页title>
- head>
- <body>
- <h1>index.htmlh1>
- <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/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>
@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";
- }
-
- }

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属性值无关
- /* * 获取请求参数的方式:
- * 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";
- }
-
- }



-
- /* * 获取请求参数的方式:
- * 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数据和控制器方法的形参绑定
- 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 + '\'' +
- '}';
- }
- }
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>首页title>
- head>
- <body>
- <h1>index.htmlh1>
- <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/admin/1}">测试@RequestMapping注解的value属性中的占位符a><br>
-
- <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>

- /* * 获取请求参数的方式:
- * 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";
- }
-
-
-
- }


总结
通过控制器方法的实体类类型的形参获取请求参数 * 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致 * 可以通过实体类类型的形参获取请求参数
- "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">
-
-
-
- <filter>
- <filter-name>CharacterEncodingFilterfilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
- <init-param>
- <param-name>forceEncodingparam-name>
- <param-value>trueparam-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>CharacterEncodingFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
-
-
-
-
-
-
- <servlet>
- <servlet-name>SpringMVCservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
-
- <init-param>
-
- <param-name>contextConfigLocationparam-name>
-
- <param-value>classpath:springmvc.xmlparam-value>
- init-param>
-
-
- <load-on-startup>1load-on-startup>
- servlet>
-
-
- <servlet-mapping>
- <servlet-name>SpringMVCservlet-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 查看类中结构 源码问题这里面不讲

总结:
解决获取请求此参数的乱码问题 * 在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 */