SpringMVC获取请求参数~

简介: SpringMVC获取请求参数~

本篇文章的项目配置是在这篇文章的基础上实现的

通过ServletAPI获取

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

举例如下:

第一步:在html文件中创建表单,如下所示:

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>欢迎进入首页!</h1>
<form th:action="@{/param/ServletAPI}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    登录:<input type="submit" value="登录">
</form>
</body>
</html>

第二步:创建控制器方法,如下所示:

浏览器发送的请求被DispatcherServlet处理后,DispatcherServlet会将得到的请求信息和当前控制器中的@RequestMapping的信息进行匹配,如果匹配成功,则调用当前的方法处理当前的请求

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
@Controller
public class ServletAPIController {
    @RequestMapping( value = "/param/ServletAPI",method = RequestMethod.POST)
    //HttpServletRequest是Servlet API提供的一个接口,用于封装HTTP请求的信息,而request即为当前要处理的请求对象
    public String getParamTesting(HttpServletRequest request){
        String username=request.getParameter("用户名");
        String password=request.getParameter("密码");
        System.out.println("username:"+username+",password:"+password);
        return "success" ;
    }
}

重新部署项目,测试结果如下:

表单填写完成后,点击登录

成功跳转到success页面

返回控制台,表单信息也被成功获取


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

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

举例如下:

第一步:创建新的控制器和控制器方法,如下所示:

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class paramTesting {
    @RequestMapping("/param")
    public String getParamTesting(String username,String password){//注意这里的形参名必须与表单中的name相一致
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}

第二步:将变量的值动态的渲染到form表单中

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>欢迎进入首页!</h1>
<form th:action="@{/param}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    登录:<input type="submit" value="登录">
</form>
</body>
</html>

重新部署项目,将浏览器中的表单填写

跳转到如下所示成功的登录页面

打开控制台,获取到的表单中的信息如下所示:

我们会发现username,我们在表单填写时的值为小明,而出现在控制台却是乱码的,解决方法如下所示:

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.UnsupportedEncodingException;
@Controller
public class paramTesting {
    @RequestMapping("/param")
    public String getParamTesting(String username,String password) throws UnsupportedEncodingException {
        //在controller层添加这句话,把jsp前端传过来的字符串改变编码
        username= new String(username.getBytes("ISO8859-1"),"UTF-8");
        password= new String(password.getBytes("ISO8859-1"),"UTF-8");
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}

此时重新部署项目,测试结果如下所示:

乱码问题被解决

上述我们是通过设置和请求参数同名的形参,但是在实际开发中往往都是前后端分离,可能会出现前端命名不规范,或者后端变量名冲突,此时后端获取到的有可能为null,对此我们可手动创建请求参数和形参的关系

@RequestParam注解的使用:

@RequestParam注解源码,如下所示:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@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";
}

@RequestParam注解是Spring MVC框架中的一个注解,用于绑定请求参数到方法的参数上。它的作用是将HTTP请求中的参数值映射到方法的参数上,以便在方法中使用这些参数值。


具体来说,@RequestParam注解可以用于以下几个方面:


1:绑定请求参数的名称:通过@RequestParam注解,可以指定请求参数的名称,将请求中对应名称的参数值绑定到方法的参数上

2:设置参数的默认值:通过@RequestParam注解的defaultValue属性可以设置参数的默认值。如果请求中没有传递对应名称的参数,那么方法的参数将使用默认值。

3:设置参数的必需性:通过@RequestParam注解的required属性,可以指定参数是否为必需的。如果将required属性设置为true(默认值为true),而请求中没有传递对应名称的参数,那么将抛出MissingServletRequestParameterException异常。例如:

但由于我们是表单提交的方式,因此表单中的每个参数名都会被传递,所以为了测试该属性的效果,我们可以手动在地址栏将username删除,只保留password,如下所示:


但是当我们将required的值设置为false时,即使我们手动的在地址栏将请求参数名username删除,只保留password,也不会报错,如下所示:

@RequestHeader注解的使用:

将请求头信息和控制器方法进行绑定

@RequestHeader注解源码如下所示:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
    @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";
}

举例如下:

假设我们现在向获取请求头信息中的referer,如下所示:

获取方法如下所示:

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.UnsupportedEncodingException;
@Controller
public class paramTesting {
    @RequestMapping(value = "/param")
    public String getParamTesting(@RequestParam(required = false,defaultValue = "hello") String username, String password, @RequestHeader("referer") String referer) throws UnsupportedEncodingException {//在控制器方法的形参处创建新的形参名referer,并且给该形参名添加@RequestHeader注解,注解值为请求头信息的参数名
        username= new String(username.getBytes("ISO8859-1"),"GBK");
        password= new String(password.getBytes("ISO8859-1"),"GBK");
        System.out.println("referer:"+referer);
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}

测试后,控制台输出如下所示:

@RequestHeader注解中的defaultvalue属性,当该请求的请求头信息中包含@RequestHeader注解中的value时,那么如上所示,它会直接获取该值,否则,将输出defaultvalue中的值,举例如下所示:


我们将defaultvalue的值设置为"No referer",因此当该请求没有来源地址时,会输出该值

public String getParamTesting(@RequestParam(required = false,defaultValue = "hello") String username, String password, @RequestHeader(value = "referer",defaultValue = "No referer") String referer)

测试方法为:将http://localhost:8080/ServletAPI/param?username=zhangsan&password=123复制在新的浏览器地址栏中打开,控制台输出如下所示:

@CookieValue注解的使用:

将cookie数据和控制器方法进行绑定

@CookieValue注解源码如下所示:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CookieValue {
    @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";
}

通过之前的学习,我们都知道cookie是键值对,因此,当我们想要获取cookie就比较麻烦,首先通过getcookies()方法获取一个类型为cookie的数组,再通过getName和getValue方法进行获取其键名和值,如果我们想获取一个指定的cookie,那么还需要判断它是否属于某个类,属于我们才能获取其值,但在SpringMVC中,我们不需要如此麻烦,我们可以直接通过@CookieValue注解,如下所示:

假设我们想获取该cookie,方法如下:

测试结果如下所示,控制台输出:

通过pojo获取请求参数:

假设我们通过浏览器向服务器传输的数据很复杂,包括姓名,年龄,性别,爱好,邮箱,家庭住址等等,如果我们还是按照上述的方法在控制器方法的参数部分创建形参来接受,这样就会非常麻烦,对此SpringMVC为我们提供了一种简单的方法:只需要在控制器方法的形参位置设置实体类形参,但是需要保证实体类中的属性和请求参数中的名称一致,那么我们才可以直接将请求参数中的值封装到实体类类型的形参中。


举例如下所示:

第一步首先创建实体类:

package Controller.pojo;
public class User {
    private Integer id;
    private String username;
    private String 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;
    }
    public User(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
    public User() {
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

第二步:创建控制器方法

package Controller.pojo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class pojoController {
    @RequestMapping("/param/pojo")
    public String pojoTesting(User user){//在控制器方法的形参位置设置实体类形参
      System.out.println("用户信息为如下所示:");
        System.out.println(user);
        return "success";
    }
}

第三步修改index.html文件

如下所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>欢迎进入首页!</h1>
<form th:action="@{/param/pojo}">
    id:<input type="text" name="id"><br>
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    登录:<input type="submit" value="登录">
</form>
</body>
</html>

在浏览器中填写表单:

页面跳转成功后,控制台输出如下所示:

相关文章
|
3天前
SpringMVC之获取请求参数
SpringMVC之获取请求参数
|
3天前
【SpringMVC】获取 -请求参数- 的多种方式
【SpringMVC】获取 -请求参数- 的多种方式
29 0
|
7月前
|
前端开发 Java Spring
详解 SpringMVC 中获取请求参数
详解 SpringMVC 中获取请求参数
|
6月前
|
JSON 数据格式
[JavaWeb]——获取请求参数的方式(全面!!!)(下)
[JavaWeb]——获取请求参数的方式(全面!!!)
|
6月前
|
前端开发 Java
[JavaWeb]——获取请求参数的方式(全面!!!)(上)
[JavaWeb]——获取请求参数的方式(全面!!!)
|
9月前
|
API
SpringMVC 获取请求参数 的几种方式
SpringMVC 获取请求参数 的几种方式
63 2
|
9月前
|
存储 应用服务中间件 开发者
SpringMVC @RequestHeader @CookieValue 处理获取请求参数的乱码问题
SpringMVC @RequestHeader @CookieValue 处理获取请求参数的乱码问题
66 0
|
11月前
|
Java
springmvc中请求参数的绑定
springmvc中请求参数的绑定
|
前端开发 Java
【SpringMVC】获取请求参数的方式
【SpringMVC】获取请求参数的方式
116 0
【SpringMVC】获取请求参数的方式