009--Struts2中数据封装(属性和模型驱动)及List Map Set集合数据封装
属性驱动通过属性的set方法编写jsp表单页面编写Action配置struts.xml文件验证结果页面提供表达式方式编写JavaBean文件编写Action类,接收数据配置struts.xml编写JSP文件验证结果模型驱动编写Action类配置struts.xml编写JSP验证结果Struts2中封装集合类型数据封装到List集合中...
在实际开发中,页面提交请求参数到Action,需要在Action中接收参数并对请求参数进行数据封装。一般来讲,封装到JavaBean中,然后将JavaBean传递给业务层。
Struts2将数据封装分为属性驱动
和模型驱动
两种,接下来,就分别介绍一下是如何接收和封装数据的。
属性驱动
在Struts2中,可以在Action中定义Java基本数据类型字段,这些字段名与表单数据相对应,通过这些字段进行数据传递。
属性驱动分为两种,一种为只需要提供属性的set方法
,另一种通过表达式直接封装到对象中
。
通过属性的set方法
在src和web目录下,分别新建datareceive
包,用于存放Action和JSP文件。
编写jsp表单页面
在web/datareceive
目录下,新建property_set01.jsp
文件,如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>属性驱动接收参数方式一</title>
</head>
<body>
<h1>属性驱动方式一:通过set方法</h1>
<form action="${pageContext.request.contextPath}/datareceive/saveInfo.action" method="post">
姓名:<input name="name" type="text"/><br/>
年龄:<input name="age" type="text"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
编写Action
在datareceive
下,新建DataReceiveAction.java
文件,如下
public class DataReceiveAction extends ActionSupport {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String index() {
return SUCCESS;
}
public String saveInfo() {
System.out.println("name:" + name + ",age:" + age);
return NONE;
}
}
配置struts.xml文件
在datareceive
包下,新建struts-property-receive.xml
文件,并在src
下的struts.xml
中引用。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="data" namespace="/datareceive" extends="struts-default">
<action name="index" class="com.happ.demo.datareceive.DataReceiveAction" method="index">
<result name="success">property_set01.jsp</result>
</action>
<action name="saveInfo" class="com.happ.demo.datareceive.DataReceiveAction" method="saveInfo"/>
</package>
</struts>
验证结果
通过浏览器访问http://localhost:8080/datareceive/index
,打开表单页面如下:
输入姓名和年龄后,点击提交按钮,可以看到数据在控制台中打印,如下:
name:xiaoyang,age:18
这样,通过属性驱动的set方法就完成了表单信息的获取。如果有多个属性,那么action中就要提供多个setter
方法,Action类的代码就会越来越庞大啊臃肿,不够简洁,那么应该如何解决呢?
页面提供表达式方式
上面提到,通过属性的set
方法接收数据的话,会造成Action类代码的臃肿庞大,这时候,我们就可以采用页面表达式的方法。
将属性和相应的getter setter
方法从Action中提取出来,单独作为一个值对象,而这个对象提供了这些数据的封装,并且在其他Action中也可以复用。
采用这种方式,一般以JavaBean来实现,所封装的属性和表单的属性一一对应,JavaBean将成为数据传递的载体。
编写JavaBean文件
在datareceive/model
中,新建User.java
文件,如下:
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "name:" + name + ",age:" + age;
}
}
编写Action类,接收数据
在datareceive/action
包下,新建DataReceiveAction2.java
文件,如下:
public class DataReceiveAction2 extends ActionSupport {
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
public String index() {
return SUCCESS;
}
public String propertySecondSaveInfo() {
System.out.println(user.toString());
return NONE;
}
}
切记,对User
提供getter setter
方法。
配置struts.xml
<action name="property_second_index" class="com.happ.demo.datareceive.action.DataReceiveAction2" method="index">
<result name="success">property_bean01.jsp</result>
</action>
<action name="propertySecondSaveInfo" class="com.happ.demo.datareceive.action.DataReceiveAction2"
method="propertySecondSaveInfo"/>
编写JSP文件
在web/datareceive
目录下,新建property_bean01.jsp
文件,如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>属性驱动接收参数方式二</title>
</head>
<body>
<h1>属性驱动方式二:通过页面表单表达式方法</h1>
<form action="${pageContext.request.contextPath}/datareceive/propertySecondSaveInfo.action" method="post">
姓名:<input name="user.name" type="text"/><br/>
年龄:<input name="user.age" type="text"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
验证结果
通过浏览器访问http://localhost:8080/datareceive/property_second_index
,提交表单数据,如下:
通过控制台打印输出,如下:
name:wangcai,age:99
这样,通过属性驱动的页面表单表达式方法,同样完成了数据的获取,并且扩展性和可维护性都要好于第一种。
模型驱动
通过Action类实现ModelDriven
接口来接收请求参数,并重写getModel()
方法,这个方法返回的就是Action所使用的数据模型对象。
模型驱动方式通过JavaBean进行数据传递,只要是普通的JavaBean,就可以充当模型部分,采用这种方式,JavaBean所封装的属性与表单的属性一一对应,JavaBean将成为数据传递的载体。
编写Action类
在datareceive/action
中新建ModelDrivenAction.java
文件,如下:
public class ModelDrivenAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
public String index() {
return SUCCESS;
}
public String saveInfo() {
System.out.println(user.toString());
return NONE;
}
@Override
public User getModel() {
return user;
}
}
配置struts.xml
在struts-property-receive.xml
中对表单的访问和提交请求进行配置,如下:
<action name="modeldriven_index" class="com.happ.demo.datareceive.action.ModelDrivenAction" method="index">
<result name="success">modeldriven_01.jsp</result>
</action>
<action name="modelDriverSaveInfo" class="com.happ.demo.datareceive.action.ModelDrivenAction"
method="saveInfo"/>
编写JSP
在web/datareceive
目录下, 新建modeldriven_01.jsp
,如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>模型驱动接收参数方式</title>
</head>
<body>
<h1>模型驱动方式</h1>
<form action="${pageContext.request.contextPath}/datareceive/modelDriverSaveInfo.action" method="post">
姓名:<input name="name" type="text"/><br/>
年龄:<input name="age" type="text"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
验证结果
通过浏览器访问http://localhost:8080/datareceive/modeldriven_index
,输入姓名和年龄后,点击提交,查看控制台输入为:
name:xiaoqiang,age:88
so,这样就完成了通过模型驱动获取表单数据的功能。
在实际开发中,大部分优先使用模型驱动,但如果页面中有多个对象数据需要封装,就需要使用属性驱动的页面表达式方式了。
Struts2中封装集合类型数据
在实际开发中,有时候需要对数据进行批量处理,比如插入或者删除,就需要将表单数据封装到集合中,一般来说就是List、Map或Set。
封装到List集合中
编写Action类
在datareceive/action
下新建ListAction.java
文件,如下:
public class ListAction extends ActionSupport {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public String saveInfo() {
if (users == null || users.isEmpty()) {
System.out.println("user list is null or empty");
} else {
for (User user : users) {
System.out.println(user);
}
}
return NONE;
}
}
配置struts.xml文件
<action name="list_index" class="com.happ.demo.datareceive.action.ModelDrivenAction" method="index">
<result name="success">list_data_01.jsp</result>
</action>
<action name="listSaveInfo" class="com.happ.demo.datareceive.action.ListAction"
method="saveInfo"/>
编写JSP文件
在web/datareceive
下新建list_data_01.jsp
文件,如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>将数据封装到List集合</title>
</head>
<body>
<h1>将数据封装到List集合</h1>
<form action="${pageContext.request.contextPath}/datareceive/listSaveInfo.action" method="post">
姓名:<input name="users[0].name" type="text"/><br/>
年龄:<input name="users[0].age" type="text"/><br/>
姓名:<input name="users[1].name" type="text"/><br/>
年龄:<input name="users[1].age" type="text"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
验证结果
通过浏览器访问http://localhost:8080/datareceive/list_index
,页面如下:
输入完成后,点击提交按钮,控制台输出如下:
name:aaa,age:12
name:adasda,age:33
如上,完成了List数据的封装。
封装数据到Map集合
编写Action类
在datareceive/action
包下,新建MapAction.java
,如下:
public class MapAction extends ActionSupport {
private Map<String, User> map;
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
public String index() {
return SUCCESS;
}
public String saveInfo() {
if (map == null || map.isEmpty()) {
System.out.println("user map is null or empty");
} else {
Set<Map.Entry<String, User>> entrySet = map.entrySet();
for (Map.Entry<String, User> entry : entrySet) {
System.out.println(entry.getKey() + "===" + entry.getValue());
}
}
return NONE;
}
}
配置struts.xml
<action name="map_index" class="com.happ.demo.datareceive.action.MapAction" method="index">
<result name="success">map_data_01.jsp</result>
</action>
<action name="mapSaveInfo" class="com.happ.demo.datareceive.action.MapAction"
method="saveInfo"/>
编写JSP文件
在web/datareceive
目录下,新建map_data_01.jsp
文件,如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>将数据封装到Map集合</title>
</head>
<body>
<h1>将数据封装到Map集合</h1>
<form action="${pageContext.request.contextPath}/datareceive/mapSaveInfo.action" method="post">
姓名:<input name="map['one'].name" type="text"/><br/>
年龄:<input name="map['one'].age" type="text"/><br/>
姓名:<input name="map['two'].name" type="text"/><br/>
年龄:<input name="map['two'].age" type="text"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
验证结果
通过浏览器访问http://localhost:8080/datareceive/map_index
,在表单中填写如下:
点击提交按钮,查看控制台输出:
one===name:wangcai,age:12
two===name:xiaoming,age:34
如上,就完成了将数据封装到Map集合的功能。
将数据封装到Set集合
编写Action类
在datareceive/action
中新建MapAction.java
文件,如下:
public class SetAction extends ActionSupport {
@KeyProperty("id")
private Set<User> userSet;
public Set<User> getUserSet() {
return userSet;
}
public void setUserSet(Set<User> userSet) {
this.userSet = userSet;
}
public String index() {
return SUCCESS;
}
public String saveInfo() {
for (User user : userSet) {
System.out.println(user);
}
return NONE;
}
}
配置struts.xml
<action name="set_index" class="com.happ.demo.datareceive.action.SetAction" method="index">
<result name="success">set_data_01.jsp</result>
</action>
<action name="setSaveInfo" class="com.happ.demo.datareceive.action.SetAction"
method="saveInfo"/>
编写JSP文件
在web/datareceive
下,新建set_data_01.jsp
,如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>将数据封装到Set集合</title>
</head>
<body>
<h1>将数据封装到Set集合</h1>
<form action="${pageContext.request.contextPath}/datareceive/setSaveInfo.action" method="post">
姓名:<input name="userSet.makeNew[0].name" type="text"/><br/>
年龄:<input name="userSet.makeNew[0].age" type="text"/><br/>
姓名:<input name="userSet.makeNew[1].name" type="text"/><br/>
年龄:<input name="userSet.makeNew[1].age" type="text"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
验证结果
通过浏览器访问http://localhost:8080/datareceive/set_index
,在表单页面中填入信息
点击提交按钮,通过控制台,查看Action输出日志:
uid:0,name:laofuzi,age:999
uid:0,name:zhongkui,age:123
如上,完成将数据封装到Set集合的功能。
总结
- Struts2提供的数据封装分为属性驱动和模型驱动
- List和Map集合数据封装传到Action比较简单,只需要提供
get
和set
方法 - Set集合比较特殊,需要再JSP中使用
makeNew
,格式为变量名.makeNew[索引].属性
,同时在Action中对Set
字段配置@KeyProperty
注解
更多推荐
所有评论(0)