在实际开发中,页面提交请求参数到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比较简单,只需要提供getset方法
  • Set集合比较特殊,需要再JSP中使用makeNew,格式为变量名.makeNew[索引].属性,同时在Action中对Set字段配置@KeyProperty注解
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐