SpringMVC 获取请求参数

一、通过 ServletAPI 获取

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

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <a th:href="@{/test?userName=zhangSan&password=123456}">测试传值使用问号方式</a><br>
    <a th:href="@{/test(userName='admin',password=123456)}">测试传值使用括号方式</a><br>
</body>
</html>
@Controller
public class RequestMappingController {

    @RequestMapping("/test")
    public String testParam(HttpServletRequest request){
        String username = request.getParameter("userName");
        String password = request.getParameter("password");
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}

二、通过控制器方法的形参获取

        在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在 DispatcherServlet 中就会将请求参数赋值给相应的形参。

        若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串数组或者字符串类型的形参接收此请求参数。

        若使用字符串数组类型的形参,此参数的数组中包含了每一个数据。

        若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <a th:href="@{/testTwo?userName=zhangSan&password=123456}">测试传值使用问号方式</a><br>
    <a th:href="@{/testTwo(userName='admin',password=123456)}">测试传值使用括号方式</a><br>
    <form th:action="@{/test}" method="post">
        用户名:<input type="text" name="userName"><br>
        密码:<input type="password" name="password"><br>
        爱好:<input type="checkbox" name="hobby" value="a">a
        <input type="checkbox" name="hobby" value="b">b
        <input type="checkbox" name="hobby" value="c">c
        <input type="submit">
    </form>
</body>
</html>
@Controller
public class RequestMappingController {

    @RequestMapping("/testTwo")
    public String testParam(String userName, String password){
        System.out.println("username:"+userName+",password:"+password);
        return "success";
    }
    @RequestMapping("/test")
    public String testParam(String userName, String password,String [] hobby){
        System.out.println("username:"+userName+",password:"+password+",hobby"+ Arrays.asList(hobby));
        return "success";
    }

}

三、@RequestParam

        @RequestParam 是将请求参数和控制器方法的形参创建映射关系,当前端传输的参数名称和后端接收的参数名称不一样的时候使用这个注解。这个注解一共有三个属性值,如下所示:

        1、value:指定为形参赋值的请求参数的参数名。

        2、required:设置是否必须传输此请求参数,默认值为 true,若设置为 true 时,则当前请求必须传输 value 所指定的请求参数,若没有传输该请求参数,且没有设置 defaultValue 属性,则页面报错 400。若设置为 false,则当前请求不是必须传输 value 所指定的请求参数,若没有传输,则注解所标识的形参的值为 null

        3、defaultValue:不管 required 属性值为 true false,当 value 所指定的请求参数没有传输或传输的值为 "" 时,则使用默认值为形参赋值。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <a th:href="@{/testTwo?user_Name=zhangSan&password=123456}">测试传值使用问号方式</a><br>
    <a th:href="@{/testTwo(user_Name='admin',password=123456)}">测试传值使用括号方式</a><br>
    <form th:action="@{/test}" method="post">
        用户名:<input type="text" name="user_Name"><br>
        密码:<input type="password" name="password"><br>
        爱好:<input type="checkbox" name="hobby" value="a">a
        <input type="checkbox" name="hobby" value="b">b
        <input type="checkbox" name="hobby" value="c">c
        <input type="submit">
    </form>
</body>
</html>
@Controller
public class RequestMappingController {

    @RequestMapping("/testTwo")
    public String testParam(@RequestParam("user_Name") String userName, String password){
        System.out.println("username:"+userName+",password:"+password);
        return "success";
    }
    @RequestMapping("/test")
    public String testParam(@RequestParam("user_Name") String userName, String password,String [] hobby){
        System.out.println("username:"+userName+",password:"+password+",hobby"+ Arrays.asList(hobby));
        return "success";
    }

}

四、@RequestHeader

        @RequestHeader 是将请求头信息和控制器方法的形参创建映射关系。这个注解一共有三个属性:valuerequireddefaultValue,用法同 @RequestParam 注解。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <a th:href="@{/testTwo?user_Name=zhangSan&password=123456}">测试传值使用问号方式</a><br>
    <a th:href="@{/testTwo(user_Name='admin',password=123456)}">测试传值使用括号方式</a><br>
    <form th:action="@{/test}" method="post">
        用户名:<input type="text" name="user_Name"><br>
        密码:<input type="password" name="password"><br>
        爱好:<input type="checkbox" name="hobby" value="a">a
        <input type="checkbox" name="hobby" value="b">b
        <input type="checkbox" name="hobby" value="c">c
        <input type="submit">
    </form>
</body>
</html>
@Controller
public class RequestMappingController {

    @RequestMapping("/testTwo")
    public String testParam(@RequestParam("user_Name") String userName, String password,@RequestHeader("Host") String host){
        System.out.println("username:"+userName+",password:"+password+",host:"+host);
        return "success";
    }
    @RequestMapping("/test")
    public String testParam(@RequestParam("user_Name") String userName, String password,String [] hobby,@RequestHeader("Host") String host){
        System.out.println("username:"+userName+",password:"+password+",hobby"+ Arrays.asList(hobby)+",host:"+host);
        return "success";
    }

}

五、@CookieValue

        @CookieValue 是将 cookie 数据和控制器方法的形参创建映射关系,这个注解一共有三个属性:valuerequireddefaultValue,用法同 @RequestParam 注解。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <a th:href="@{/testTwo?user_Name=zhangSan&password=123456}">测试传值使用问号方式</a><br>
    <a th:href="@{/testTwo(user_Name='admin',password=123456)}">测试传值使用括号方式</a><br>
    <form th:action="@{/test}" method="post">
        用户名:<input type="text" name="user_Name"><br>
        密码:<input type="password" name="password"><br>
        爱好:<input type="checkbox" name="hobby" value="a">a
        <input type="checkbox" name="hobby" value="b">b
        <input type="checkbox" name="hobby" value="c">c
        <input type="submit">
    </form>
</body>
</html>
@Controller
public class RequestMappingController {

    @RequestMapping("/testTwo")
    public String testParam(@RequestParam("user_Name") String userName, String password,@RequestHeader("Host") String host,
                            @CookieValue("JSESSIONID") String JSESSIONID){
        System.out.println("username:"+userName+",password:"+password+",host:"+host+",JSESSIONID"+JSESSIONID);
        return "success";
    }
    @RequestMapping("/test")
    public String testParam(@RequestParam("user_Name") String userName, String password,String [] hobby,
                            @RequestHeader("Host") String host,
                            @CookieValue("JSESSIONID") String JSESSIONID){
        System.out.println("username:"+userName+",password:"+password+",hobby"+ Arrays.asList(hobby)+",host:"+host+",JSESSIONID"+JSESSIONID);
        return "success";
    }

}

六、通过 POJO 获取请求参数

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

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</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>
@Controller
public class RequestMappingController {
    @RequestMapping("/testpojo")
    public String testPOJO(User user){
        System.out.println(user);
        return "success";
    }
}
public class User {
    private String username;

    private String password;
    private String sex;
    private Integer age;
    private String email;

    // setter、getter、toString
}

        可以看到,成功的接受了前台传过来的参数,只不过出现了中文乱码问题。 

七、解决请求参数乱码问题

        想要解决获取请求参数的乱码问题,可以使用 SpringMVC 提供的编码过滤器 CharacterEncodingFilter,但是必须在 web.xml 中进行注册,即需要在 web.xml 文件中添加如下的内容:

	<!--配置springMVC的编码过滤器-->
	<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>forceResponseEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的小三菊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值