`SpringMVC`获取请求参数

文章目录

    • `SpringMVC`获取请求参数
        • 1.通过`ServletAPI`获取
        • 2.通过控制器方法的形参获取请求参数
        • 3.`@RequestParam`注解获取参数【非常重要】
        • 4.`@RequestHeader`获取指定请求头
        • 5.`@CookieValue`获取指定`Cookie`值【重点】
        • 6.通过`POJO`获取请求参数【非常重点】
        • 7.解决获取请求参数的乱码问题【重点】

SpringMVC获取请求参数

1.通过ServletAPI获取

HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象

案例:

地址栏传入参数:**[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M1b4Snci-1652881141091)(D:\typora笔记\springmvc\img\1652677458426.png)]

    // 使用ServletAPI
    @RequestMapping("/param")
    public String getParam(HttpServletRequest request){
        String id = request.getParameter("id");
        String username = request.getParameter("username");
        System.out.println(id+"\t"+username);
        return "param";
    }

2.通过控制器方法的形参获取请求参数

在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求时,匹配到请求映射时,DispatcherServlet中就会将请求参数赋值给相应的形参【意思就是请求参数名必须与控制器中形参参数名一致,前端控制器自动给控制器的形参赋值】

案例:

地址栏:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3J7lxyT3-1652881141093)(D:\typora笔记\springmvc\img\1652685883670.png)]

 // 通过控制器的形参获取参数
    @RequestMapping("/contrParam")
    public String contrParam(String user_name,String password,String[] hobby,Integer age){
        System.out.println(username+"\t"+password+"\t"+ Arrays.toString(hobby)+"\t"+age);
        return "param";
    }
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>控制器方法形参获取请求参数title>
head>
<body>
<form th:action="@{/contrParam}" method="get">
    用户名:<input type="text" name="user_name"><br/>
    密码:<input type="password" name="password"><br/>
    爱好:<input type="checkbox" name="hobby" value="写代码">写代码
    <input type="checkbox" name="hobby" value="听歌">听歌
    <input type="checkbox" name="hobby" value="跑步">跑步<br/>
    年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交">
form>
body>
html>

注意是:复选框一定要有value值,否则提交后没有对应的值

3.@RequestParam注解获取参数【非常重要】

@RequestParam是将请求参数和控制器方法的形参创建映射关系,就是表单中的@RequestParam(value = "username",defaultValue = "海康") String userName,不一致,用于绑定映射的

@RequestParam注解一共有三个属性:

`value`:指定为形参赋值的请求参数的参数名

`required`:设置是否必须传输此请求参数,默认值为`true`
若设置为`true`时,则当前请求必须传输`value`所指定的请求的参数,若没有传输该请求参数,并且没有设置`defaultValue`属性,则页面会报错`400`:Required String parameter 'xxx' is not present;若设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null

如:@RequestParam("username") String username:说明username的属性必须传输,该属性是必须,如果不传输也没有设置`@RequestParam(value = "username",defaultValue = "海康")``defaultValue`属性时,则会报错:400:Required String parameter 'xxx' is not present,如果该值设置为false时,请求参数不是必须传输的


`defaultValue`:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""[空字符串]时,则使用默认值为形参赋值

`@RequestParam(value = "username",defaultValue = "海康")`例如:如果传入的参数为空字符串或不传入值,则使用默认值

案例:

	// 通过控制器的形参获取参数
    @RequestMapping("/contrParam")
    public String contrParam(@RequestParam(value = "user_name",defaultValue = "海康") String userName, String password, String[] hobby, Integer age){
        System.out.println(userName+"\t"+password+"\t"+ Arrays.toString(hobby)+"\t"+age);
        return "param";
    }
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>控制器方法形参获取请求参数title>
head>
<body>
<form th:action="@{/contrParam}" method="get">
    用户名:<input type="text" name="user_name"><br/>
    密码:<input type="password" name="password"><br/>
    爱好:<input type="checkbox" name="hobby" value="写代码">写代码
    <input type="checkbox" name="hobby" value="听歌">听歌
    <input type="checkbox" name="hobby" value="跑步">跑步<br/>
    年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交">
form>
body>
html>

注意是:一般用于表单中name="user_name"和控制器中的形参名@RequestParam(value = "user_name",defaultValue = "海康") String userName不一致,建议在开发中使用这种方式

@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 "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
4.@RequestHeader获取指定请求头

@RequestHeader是将请求头信息和控制器方法的形参创建映射关系

@RequestHeader注解一共有三个属性:valuerequireddefaultValue用法和@RequestParam一样

	// 通过@RequestHeader注解获取指定请求头
    @RequestMapping("/header")
    public String header(@RequestHeader(value = "Connection",required = true,defaultValue = "haha")String host){
        System.out.println(host);
        return "param";
    }
5.@CookieValue获取指定Cookie值【重点】

@CookieValue是将Cookie数据和控制器方法的形参创建映射关系

@CookieValue注解一共有三个属性: valuerequireddefaultValue用法和@RequestParam一样

案例:

   先在服务器中产生一个Session对象
	@RequestMapping("/")
    public String hello(HttpServletRequest request){
        HttpSession session = request.getSession();
        System.out.println(session);
        return "ParamForm";
    }	

	// 通过CookieValue注解获取指定的Cookie值
    @RequestMapping("/cookie")
    public String cookie(@CookieValue(value = "JSESSIONID")String session){
        System.out.println(session);
        return "param";
    }

总结 :@RequestParam @RequestHeader @CookieValue这三个注解的使用一样

6.通过POJO获取请求参数【非常重点】

可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值

POJO实体类

public class User {
    private Integer id;
    private String username;
    private String password;
    private String sex;
    private Integer age;
    private String email;
    
    并提供getter和setter方法
    及 toString方法
}

表单

DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>获取请求参数Pojo方式title>
head>
<body>
<form th:action="@{/testpojo}" method="post">
  用户名:<input type="text" name="username"><br>
  密码:<input type="password" name="password"><br>
  性别:<input type="radio" name="sex" value=""><input type="radio" name="sex" value=""><br>
  年龄:<input type="text" name="age"><br>
  邮箱:<input type="text" name="email"><br>
  <input type="submit">
form>
body>
html>

控制器

	// 通过Pojo类获取请求参数
    @RequestMapping("/testpojo")
    public String pojo(User user){
        System.out.println(user);
        return "param";
    }

注意是:由于是post的请求方式会出现中文乱码问题

7.解决获取请求参数的乱码问题【重点】

解决获取请求参数的乱码问题,可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进行注册

注意是:由于get请求的方式在tomcat中的server.xml中 的Connector port='8080',URIRncoding="UTF-8"中的URIRncoding属性说明所有的get请求已经解决了中文乱码问题

但是由于现在使用的是SpringMVC框架在前端控制器中DispatcherServlet对所有的请求进行处理,所以如果在控制器中使用Response对象中.setCharacterEncoding("utf-8");处理已经不起作用了,因为是前端控制器已经对请求处理并获取了参数,只能在前端控制器加载前设置编号这【前端控制器相当于Servlet】, tomcat服务器执行流程是:监听器—>过滤器—>servlet,可以在过滤器中设置,使用SpringMVC框架的方式:


<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>forceResponseEncodingparam-name>
        <param-value>trueparam-value>
    init-param>
filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilterfilter-name>
    <url-pattern>/*url-pattern>
filter-mapping>

注:SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效

总结:可以理解为最终几种获取参数方式

  1. ServletAPI原始获取
  2. @RequestParam注解
  3. @RequestHeader获取请求头
  4. @CookietValue获取Cookie
  5. 获取POJO参数

你可能感兴趣的:(Spring家庭,java,前端,开发语言)