SpringMvc---获取请求参数

SpringMvc获取请求参数

使用HttpRequestServlet获取请求参数

首先要用@Controller注解将类加载到IOC容器里

方法中的形参代表的就是当前请求

在java中

@Controller
public class ServletGetParam {
​
    @RequestMapping("/ServletGetParam")
//    当在处理请求的方法中使用HttpServletRequest做参数,那么他代表的就是当前的请求
//    【即在收到请求时,会由DispatcherServlet调用这个方法处理请求。在一般情况下,我们在方法中设置了参数是由我们自己为参数赋值
//    但是,现在会由DispatcherServlet请求控制器为这个参数赋值,当在处理请求时,DispatcherServlet调用这个方法时检测到这个方法里
//    有一个HttpRequest类型的参数,就会自动将代表当前请求的request对象赋值给处理请求的方法的参数。
//    然后在方法里就能通过requestServlet获取请求中的内容】
    public String testA(HttpServletRequest servletRequest){
        String username = servletRequest.getParameter("username");
        String password = servletRequest.getParameter("password");
        System.out.println("username = " + username+",password:"+password);
        return "Params";
    }
}

 

 

使用SpringMvc注解获取请求参数

当想要获取请求中的参数可以直接在处理请求的方法里添加参数,【参数名和请求传递过来的参数一样】就可以获取到参数值

@RequestParam注解是为了解决当处理请求的方法的参数跟请求传来递过来的参数name不一样时的问题,或者当前参数没有值或参数不存在等问题

value属性是设置映射的请求参数中的某一个值【请求传递过来的参数】使他等于它所修饰的这个值【方法里的参数】

required属性是用来设置是否必须要有这个参数,如果设置了必须要有这个参数,但是请求中不包含这个参数就会报错400

default属性是当参数值为null或者请求中不包含这个参数,在处理请求的方法里用到这个参数时,参数的值就是你设置的这个defaultValue

    @RequestMapping("/testServletAPI")
    public String testServlet(
//            value属性是设置映射的请求参数中的某一个值使他等于它所修饰的这个值
//            required属性是用来设置是否必须要有这个参数,如果设置了必须要有这个参数,但是请求中不包含这个参数就会报错400
//            default属性是当参数值没有或者请求中不包含这个参数,在处理请求的方法里用到这个参数时,参数的值就是你设置的这个defaultValue
//            在使用这个属性后就省去对参数的判断或使用三目运算符来对参数值判断。
            @RequestParam(value = "user_name",required = false,defaultValue = "abccccc") String username,
            String password,
//            对于请求携带的多组同名参数,可以使用String类型的参数接收,这时请求参数之间会被用 ,隔开,也可以使用字符串数组接收
            String[] hobby){
        System.out.println("username:"+username+",password:"+password+",hobby:"+ Arrays.toString(hobby));
        return "Params";
    }

 

 

@RequestHeader注解

这个注解用来获取请求的ip地址端口号请求头信息,如果想要获取Host的信息就必须加这个注解

注解@RequestHeader注解一样有三个属性:value、required、defaultValue,用法要求跟上面的RequestParams注解一样

在java中

@RequestHeader(value = "Host",required = false,defaultValue = "noHost") String Host
 

 

@CookieValue注解

@CookieValue注解用来处理cookie和处理请求参数的映射关系【就是赋值调用】,用来获取cookie值并赋给处理请求的方法的参数,好在方法里搞这个cookie

浏览器产生session对象时会先在响应流中产生一个cookie,他的值就时session的id。这个值会保存在服务器的内存中,当再次发送请求时会在请求头中发现参数Cookie,浏览器会根据cookie的值在服务器中 查找这个session。

这个注解也有三个参数:value、required、default,使用跟@RequestParams注解一样

public String testA(HttpServletRequest servletRequest, @CookieValue("JSESSIONID")String cookie){
    HttpSession session = servletRequest.getSession();
    String username = servletRequest.getParameter("username");
    String password = servletRequest.getParameter("password");
    System.out.println("username = " + username+",password:"+password+",cookie:"+cookie);
    return "Params";
}
 

 

通过实体类获取请求参数

只需要保证请求的参数和实体类里面的属性名一样就可以

实体类里面要有有参和无参构造方法、get和set

在实体类中

package com.xlw.SpringMvc.bean;
​
public class User {
​
    private String username;
​
    private String password;
​
    private String email;
​
    private Integer age;
​
    public User() {
    }
​
    public User(String username, String password, String email, Integer age) {
        this.username = username;
        this.password = password;
        this.email = email;
        this.age = age;
    }
​
    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;
    }
​
    public String getEmail() {
        return email;
    }
​
    public void setEmail(String email) {
        this.email = email;
    }
​
    public Integer getAge() {
        return age;
    }
​
    public void setAge(Integer age) {
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

 

 

在处理方法中

@RequestMapping("/testBean")
public String testBean(User user){
    System.out.println(user);
    return "login";
}

 

 

通过CharacterEncodingFilter处理请求参数乱码问题

get请求乱码

当get请求出现乱码,只需要到tomcat的conf目录下修改server.xml文件,在配置端口号的地方,设置端口号后加上,空格

URIEnconding="UTF-8"

post请求乱码

在web.xml文件中注册CharacterEncodingFilter过滤器【Spring提供的】,通过CharacterEncodingFilter过滤器设置请求和响应参数的编码格式。

首先能看见CharacterEncodingFilter中有三个参数,其中encoding代表编码,另两个分别代表是否强制请求编码格式为xxx,是否强制响应编码格式为xxx。

然后在具体处理过滤请求的方法【doFilterInternal】中,可以看见在设置了encoding后就会将请求编码格式设置为你设置的请求编码格式。

在下面的判断中可以发现,当设置了请求参数后,第一个判断的判断条件中,这个if判断是或判断【两个条件只满足一个就可以】,第一个条件默认是false,并没有对他修改 ;第二个条件也没有设置,他的值为true,这样就把请求编码格式改为UTF-8。

第二个判断,只有一个条件,就是得你自己在filter的初始化参数中定义【forceResponseEncoding】的值,当定义后,响应的编码格式就会变成你设置的格式。

在CharacterEncodingFilter源码【一部分】中:

private String encoding;
private boolean forceRequestEncoding;
private boolean forceResponseEncoding;
​
public CharacterEncodingFilter() {
    this.forceRequestEncoding = false;
    this.forceResponseEncoding = false;
}

 

 

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String encoding = this.getEncoding();
    if (encoding != null) {
        if (this.isForceRequestEncoding() || request.getCharacterEncoding() == null) {
            request.setCharacterEncoding(encoding);
        }
​
        if (this.isForceResponseEncoding()) {
            response.setCharacterEncoding(encoding);
        }
    }
​
    filterChain.doFilter(request, response);
}

 

 

设置如下:

<!--设置请求编码和相应编码解决post请求的乱码问题-->
<!--使用CharacterEncodingFilter解决乱码问题,服务器启动时先初始化监听器在初始化过滤器,所以这个过滤器设置在哪里又不会影响他的初始化-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--设置请求编码,通过设置filter初始化参数,告诉CharacterEncodingFilter类修改请求编码-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
<!--设置响应编码,通过设置forceResponseEncoding的值告诉CharacterEncodingFilter类修改相应编码-->
        <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>
 

 

 

 

 

 

 

 

 

 

posted @ 2021-11-17 18:00  优质水  阅读(223)  评论(0)    收藏  举报