34.SpringMVC获取请求参数

SpringMVC获取请求参数

通过ServletAPI获取

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

index.html

html 复制代码
    <form th:action="@{/test/param}" method="post">
        用户名:<input type="text" name="username">
        密码:<input type="password" name="password">
        <input type="submit" value="提交">
    </form>

TestParamController.java

java 复制代码
package com.atguigu.SpringMVC.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;

@Controller
public class TestParamController {
    @RequestMapping("/test/param")
    public String getParamByServletAPI(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username为:"+username+",password为:"+password);
        return "success";
    }
}

成功获取到表单提交的信息,这是采用原生Servlet的方式获取

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

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

index.html

html 复制代码
    <form th:action="@{/testParam}" method="post">
        用户名:<input type="text" name="username">
        密码:<input type="password" name="password">
        <input type="submit" value="提交">
    </form>

TestParamController.java

java 复制代码
    @RequestMapping("/testParam")
    public String getParam(
            //@RequestParam注解以键值对的方式获取到值并赋值给变量
            @RequestParam("username") String name,
        	//自动匹配
            String password){
        System.out.println("username为:"+name+",password为:"+password);
        return "success";
    }

成功获取到表单提交的信息(可以省略@RequestParam注解,SpringMVC匹配到请求映射 时就会自动为参数赋值)

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

  • value:指定为形参赋值的请求参数的参数名
  • required:设置是否必须传输此请求参数,默认值为true,表示当前请求必须传输value所指定的请求参数(只要有请求参数即可,值为空都没问题) ,若没有传输该请求参数,且没有设置defaultValue属性 则会报错:400:Required String parameter 'xxx' is not present,为false时没有获取到请求参数时值为null
  • defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输 或传输的值为""时,则使用默认值为形参赋值

@RequestHeader :将请求头信息控制器方法的形参创建映射关系,属性和用法同@RequestParam

  • 获取来源信息:@RequestHeader("referer") String referer
    • 输出结果:http://localhost:8080/SpringMVC/

@CookieValue :将cookie数据控制器方法的形参 创建映射关系,属性和用法同@RequestParam,因为session里面存储的数据就是cookie的形式,所以获取session对象之后就有cookie数据了

  • 获取cookie的JSESSIONID信息:

    java 复制代码
    			xxx(HttpServletRequest request,@CookieValue("JSESSIONID") String jsessionId)
java 复制代码
			HttpSession session = request.getSession();//获取session对象即可
			System.out.println(jsessionId);
  • 输出结果:B096EFFCB054BC496DCD805203C49690

通过POJO获取请求参数

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

index.html

html 复制代码
    <!--根据映射匹配,get方式和post方式都可以匹配成功-->
	<form th:action="@{/testPOJO}">
        ID:<input type="text" name="id">
        用户名:<input type="text" name="username">
        密码:<input type="password" name="password">
        年龄:<input type="text" name="age">
        成绩:<input type="text" name="gender">
        邮箱:<input type="email" name="email">
        <input type="submit" value="提交">
    </form>

TestPOJOController.java

java 复制代码
    @RequestMapping("/testPOJO")
    public String testPOJO(User user){
        System.out.println(user);
        //User{id=6, username='yxx', password='123', age=18, gender='97', email='156899@qq.com'}
        return "success";
    }

解决获取请求参数乱码问题

在JavaWeb中解决乱码问题采用request.setCharacterEncoding("UTF-8")的语句解决,在SpringMVC中因为会在访问地址对应方法之前就自动获取了请求参数 ,而上述语句需要在获取前设置才有效,为了解决获取请求参数的乱码问题,可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter ,使用前必须在web.xml中先进行注册

Tomcat8及以上对于以get方式提交表单的表单信息获取参数默认为UTF-8的编码方式,只有post方式需要设置,而Tomcat7两种方式都要设置

web.xml

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>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中处理编码的过滤器一定要配置到其他过滤器之前,否则无效,且由于配置是全局生效,无论get还是post方式都不会再乱码

相关推荐
w_31234545 分钟前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安7 分钟前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA11 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
北辰浮光12 分钟前
[spring]XML配置文件标签
xml·spring
Q_192849990618 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟35 分钟前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S1 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python