Talk is cheap , show me your code!
欢迎来到付振南Java博客,让我们一起学习Java吧!

SpringMVC之请求参数绑定

大家好,今天我学习了springMVC的请求参数绑定,那么什么是请求参数呢?比如有些时候,我们在发送请求的时候会在后面加上我们的参数,这就是请求参数,举个简单的例子,我们在前端页面填写了一个超链接,点击超链接get请求提交之后,会带上我们的参数,xxx?username=xxx&password=xxx

那么参数发送了请求之后,我们后端需要拿到这个参数,需要springMVC来做一个绑定。下面我们写一个小demo。

前面我们知道了怎么通过@RequestMapping注解来将http的请求路由映射到后端的方法中,所以我们直接开干。在WEB-INF下面的index.jsp写一个表单,里面包含请求的参数username,password,由于我的controller类路径是params,方法路径是testParams,所以得加上href跳转的地址,代码如下:

<%--
Created by IntelliJ IDEA.
User: fuzhennan
Date: 2020/4/7
Time: 16:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3><a href="/params/testParams?username=fzn&password=123456">请求参数绑定入门点这</a></h3></br>
</body>
</html>

前端页面发送请求成功后,我们在controller中的ParamsController写一个方法来接受这两个参数,如果成功了那么把这两个参数打印出来,并且返回到success页面。

/**
 * 请求参数绑定入门
 * @param username
 * @param password
 * @return
 */
@RequestMapping(path = "/testParams")
public String testParams(String username,String password){
System.out.println("username: "+username);
System.out.println("password: "+password);
return "success";
}

想要成功执行代码,我们需要在配置文件中开启注解扫描,视图解析器和对springMVC的注解支持。

<!-- 开启注解扫描 -->
<context:component-scan base-package="cn.fuzhennan"/>

<!-- 配置视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 指定文件所在路径 -->
    <property name="prefix" value="/WEB-INF/pages/"/>
    <!-- 指定文件后缀名 -->
    <property name="suffix" value=".jsp"/>
<!-- 开始springMVC对注解的支持 -->
<mvc:annotation-driven conversion-service="conversionServicen"/>
</bean>

然后在WEB-INF/pages目录下编写有一个简单的success页面。

<%--
Created by IntelliJ IDEA.
User: fuzhennan
Date: 2020/4/6
Time: 21:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>SUCCESS</h3>
</body>
</html>

大功告成,我们启动tomcat来运行一下。

首先在页面中填写好用户名,密码,点击后页面成功跳转到success,控制台并且打印出我们填写的内容,说明我们的前端请求控制参数和后端绑定上了。

再来加大点难度,这次我们把两个变量变成表单形式自己输入提交,然后把参数变成实体类型来绑定。首先在domain包下建了一个用户实体类Account实现Serializable接口,这Account有两个变量username和password,并且新增加一个money属性,然后我们生成它的setter和getter方法,并且重写toString方法。

然后我们在控制器中写一个保存账户的方法,如果保存成功了打印输出,并且打印account对象,然后跳转到success页面。前面是绑定参数,所以参数列表写的是要绑定的参数,现在我们要绑定实体类,所以参数列表写上我们要绑定的实体类就行。

/**
 * 保存账户
 * @param account
 * @return
 */
@RequestMapping(path = "/saveAccount")
public String saveAccount(Account account){
System.out.println("保存成功!");
System.out.println(account);
return "success";
}

我们在jsp页面中写一个表单来提交请求,注意这里的name属性要和Account对象的三个属性一一对应,这样才能在controller方法中直接传入Account对象。

<form method="post" action="/params/saveAccount">
    用户名:<input type="text" name="username"></br>
    密码:<input type="text" name="password"></br>
    金额:<input type="text" name="money"></br>
    <input type="submit" value="submit"></br>
</form>

我们来启动tomcat服务器运行一下。

注意post提交需要写英文,如何保证中文不乱码请看这篇文章

点击提交,页面跳转到success,并且控制台成功打印出我们的信息。

这就说明我们成功绑定了一个实体类,在实际开发中,假设有这么一个User类,有uname和age两个属性,我们可能在Account类中还有一个User的引用类型,那么我们要怎么去给它传值呢?

其实很简单啦,对象名.属性名就行了!

<form method="post" action="/params/saveAccount">
    User姓名:<input type="text" name="user.uname"></br>
    User年龄:<input type="text" name="user.age"></br>
  <input type="submit" value="submit"></br>
</form>

我们在加大点难度,在Account实体类的基础上增加集合类型List和Map。我们先实例化两个集合类型,然后生成setter和getter方法并且重写toString方法。

private List<User> list;
private Map<String,User> map;

其实仔细想想这也没啥难度的,list泛型里面放的是User类,直接list[0].uname就行,map的key是string类型,value是User类型,我们只需要指定一个key,然后value放user的属性值就行,代码如下:

<form method="post" action="/params/saveAccount">
    List-User姓名:<input type="text" name="list[0].uname"></br>
    List-User年龄:<input type="text" name="list[0].age"></br>
    Map-User姓名:<input type="text" name="map['theUser'].uname"></br>
    Map-User年龄:<input type="text" name="map['theUser'].age"></br>
    <input type="submit" value="submit"></br>
</form>

我们来运行一下,看看会不会是我们想要的结果呢?

很好,我们已经成功拿到值了,说明我们集合类型的请求控制参数也绑定上了。

总结一下,前端页面给什么参数,我们后端接受什么参数就行了,给两个变量,后端方法参数列表放两个变量来接收就行,给实体类的属性值,我们后端方法的参数列表放实体类就行,集合类型也是这个道理,集合类的泛型里面放实体类,后端方法参数放实体类来接收,仔细想想其实也没什么难得,主要想通了就会了。

赞(1) 打赏
未经允许不得转载:付振南Java博客 » SpringMVC之请求参数绑定

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏