JavaWeb获取表单数据的三种方式(属性封装,表达式封装,模型驱动封装)

前言

在JavaWeb中,常常会遇到用户注册、提交表单数据等等,这个时候使用Struts2框架怎么获取页面的数据呢?传统的有通过域对象的方法来挨个使用getParameter方法来获取表单数据再进行操作(比如封装到一个JavaBean等等),本文主要使用Struts2框架来获取表单数据。

在首先会通过最传统的方法通过Servlet来获取表单数据,接着会介绍三种获取表单数据的方式,最后会对这几种方式来进行比较。

本文各类环境如下:

Struts2版本:struts-2.5.16-all
IDE:Intellij IDEA 2018.1

此外关于添加Struts2 jar包不再叙述。

Servlet域对象获取表单数据

此处使用的是最原始的方式获取表单数据,主要是操作request域来获取数据的。

方法步骤

  • 编写一个JavaBean(User),属性值为username、password。
  • 新建一个JSP页面。
  • 在action中通过ServletActionContext来获取request对象,通过request的getParameter方法来获取数据。
  • 将属性值封装到JavaBean中。

具体实现

1、编写JavaBean User
新建一个包:com.dimple.entity,然后新建一个Class,名为User。

1
2
3
4
5
6
7
public class User {
private String username;
private String password;
/**
* 省略部分get和set方法。
*/
}

2、新建一个JSP页面,名为login
导入标签库:

1
<%@ taglib prefix="s" uri="/struts-tags" %>

新建一个form表单,body内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<body>
<s:form label="登陆" action="login">
<tr>
<td>
账号:
</td>
<td>
<input type="text" name="username"/>
</td>
</tr>
<tr>
<td>
密码:
</td>
<td>
<input type="text" name="password"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="登陆"/>
</td>
</tr>
</s:form>
</body>
</html>

3、新建一个包名为:com.dimple.actin,新建一个LoginAction类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class LoginAction extends ActionSupport {

@Override
public String execute() throws Exception {
//获取Request对象
HttpServletRequest request = ServletActionContext.getRequest();
//获取表单属性
String password = request.getParameter("password");
String username = request.getParameter("username");
//将表单数据封装到JavaBean中
User user = new User();
user.setPassword(password);
user.setUsername(username);
//输出获取到的内容
System.out.println(user.toString());
return NONE;
}
}

4、配置struts.xml

1
2
3
4
5
6
7
<struts>
<package name="login" extends="struts-default" namespace="/">
<action name="login" class="com.dimple.action.LoginAction">
<!--因为设置的返回值为none,所以不需要配置result标签-->
</action>
</package>
</struts>

PS:别忘了还有web.xml的filter标签哦。

结果如下:
输入账号密码后:

QQ截图20180331202250

output页面显示:

QQ截图20180331202307

属性封装

属性封装是一种比原始方式好一点的一种做法,但是在实际工作中的使用和原始方式一样,用的不是特别多。是一种直接将表单属性封装到action属性的一种方法。

实现步骤

  • 在action类中定义属性变量(注意:必须和jsp页面的属性值保持一致)
  • 生成get和set方法

具体实现

PS:直接在上一个示例上修改。

修改loginAction代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class LoginAction extends ActionSupport {
//定义变量
private String username;
private String password;
//生成对应的get和set方法
/**
* 省略get和set方法
*/
@Override
public String execute() throws Exception {
//将变量值封装到对象中
User user=new User();
user.setUsername(getUsername());
user.setPassword(getPassword());
System.out.println(user.toString());
return NONE;
}
}

结果如下:

QQ截图20180331203115

QQ截图20180331203100

框架实现原理分析

只能是最简单的白话文的分析:
在action类中通过request域对象来获取变量名称和值,然后与action类中的成员变量名称进行比对,如果属性名一样,那么就调用set方法将值写入。

模型驱动封装

模型驱动封装是要实现Model Driven接口。

实现步骤

  • 让action类继承Model Driven接口
  • 实现接口中的方法getModel();
  • 在action中创建JavaBean类对象

具体实现

action中代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class LoginAction extends ActionSupport implements ModelDriven<User> {
//创建实体类对象
User user=new User();

@Override
public String execute() throws Exception {
System.out.println(user.toString());
return NONE;
}
//实现接口中的方法,返回user
@Override
public User getModel() {
return user;
}
}

实现截图

QQ截图20180331204004
QQ截图20180331203952

表达式封装

表达式封装是用的比较多的,具体的原因后面的比较会说到。

实现步骤

  • 在action类中声明JavaBean【注意只是声明,没有实现】
  • 生成实体类的get和set方法
  • 在JSP页面的form表单中使用表达式形式

具体实现

action类代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class LoginAction extends ActionSupport  {
//只是声明并不实现
User user;

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

@Override
public String execute() throws Exception {
System.out.println(user.toString());
return NONE;
}

}

Jsp页面中的body部分(注意和前面的进行比较):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<s:form label="登陆" action="login">
<tr>
<td>
账号:
</td>
<td>
<input type="text" name="user.username"/>
</td>
</tr>
<tr>
<td>
密码:
</td>
<td>
<input type="text" name="user.password"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="登陆"/>
</td>
</tr>
</s:form>
</body>

实现截图

QQ截图20180331204604

QQ截图20180331204556

模型封装和表达式封装比较

共同点:这两种方式都能够将数据直接封装到实体类中去。

不同点:

  • 使用模型驱动封装的方式,由于在实现接口的时候,就指明了泛型为user,这样就只能够将数据封装到一个实体类中。
  • 使用表达式封装,在JSP页面就已经设置了该数据传入的对象,所以是可以将数据封装到多个实体类中的,只不过是在action方法中再多生成几个get和set方法而已。

总结

获取表单数据,这样就能与用户进行数据交互。同时,表达式封装还可以封装List、Map等等。其实方法都一样,生成对应的额get和set方法,区别主要是在JSP页面中的写法,比如封装到List中,那么JSp页面可能就要这样写了

1
<input type="text" name="list[0].password"/>

同理,封装到Map呢?map是键值对的结构,那么肯定是不能按照list(类似于数组)的方式来。通过使用键来获得值:

1
<input type="text" name="map['key'].password"/>

-------------本文结束感谢您的阅读-------------
na,给我一个棒棒糖!