目录
一 通过ServletAPI获取
1 . 新建TestParamController类
2 . index.html
3 . 在TestParamController类里面写getParamByServletAPI
4. 测试 重新部暑
二 通过控制器方法的形参获取请求参数
1 . index.html
2 . TestParamController
3. 测试
三 @RequestParam
1 .如果当前请求参数的名字 和形参的名字不一样
2. 解决办法 加@RequestParam注解
3 .测试
4 . @RequestMapping注解的其他属性之required = true
5 . @RequestMapping注解的其他属性之defaultValue = "hello"
四 @RequestHeader
五 @CookieValue
六 通过POJO获取请求参数
1.创建实体类
2. index.html
3 在TestParamController类中写getParamByPojo方法
4 测试
七 解决获取请求参数的乱码问题
1 .配置springMVC的编码过滤器
2 .测试
全部总结

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";}}
首页
index.html
测试@RequestMapping注解所标识的位置
测试@RequestMapping注解的value属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解支持ant风格的路径
测试@RequestMapping注解的value属性中的占位符
用得不多 因为我们已经用了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对象获取请求参数

首页
index.html
测试@RequestMapping注解所标识的位置
测试@RequestMapping注解的value属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解支持ant风格的路径
测试@RequestMapping注解的value属性中的占位符

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

比如下图

首页
index.html
测试@RequestMapping注解所标识的位置
测试@RequestMapping注解的value属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解支持ant风格的路径
测试@RequestMapping注解的value属性中的占位符
@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 无传输


自己总结:
required:设置是否必须传输此请求参数,默认值为true 若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400:Required String parameter 'xxx' is not present; 若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,但是有设置defaultValue属性,则会输出defaultValue属性值 若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为 null defaultValue:不管required属性值为true或false,当value所指定的请求参数有传输 则有值 如果没有传输 则使用默认值为形参赋值 总结:@RequestParam:将请求参数和控制器方法的形参绑定 * @RequestParam注解的三个属性:value、required、defaultValue * value:设置和形参绑定的请求参数的名字 * required:设置是否必须传输value所对应的请求参数 * 默认值为true,表示value所对应的请求参数必须传输,否则页面报错: * 400 - Required String parameter 'xxx' is not present * 若设置为false,则表示value所对应的请求参数不是必须传输,若为传输,则形参值为null * defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
注: 若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串 数组或者字符串类型的形参接收此请求参数 若使用字符串数组类型的形参,此参数的数组中包含了每一个数据 若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果 @RequestParam是将请求参数和控制器方法的形参创建映射关系 @RequestParam注解一共有三个属性: value:指定为形参赋值的请求参数的参数名 required:设置是否必须传输此请求参数,默认值为true 若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置 defaultValue属性,则页面报错400:Required String parameter 'xxx' is not present;若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null defaultValue:不管required属性值为true或false,当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属性值 无关*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;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}
首页
index.html
测试@RequestMapping注解所标识的位置
测试@RequestMapping注解的value属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解的params属性
测试@RequestMapping注解支持ant风格的路径
测试@RequestMapping注解的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属性值无关*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";}}


总结
通过控制器方法的实体类类型的形参获取请求参数 * 需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致 * 可以通过实体类类型的形参获取请求参数
CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true CharacterEncodingFilter /* SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml 1 SpringMVC /
过滤器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*/