您的位置:首页 > 编程语言 > Java开发

Struts2数据封装机制

2015-08-10 18:01 435 查看

一,属性驱动的数据封装

示例代码:

[code]public class AttributeAction extends ActionSupport {
    // 属性直接放在action类中,并且每一个属性都得写get和set方法
    private String name;
    private String passwd;

    // 经过struts2的封装,可以直接在这里获取到我们需要的数据
    // 我们并没有自己去设置这些属性的值,都是struts2帮我们做好了
    // 这就是属性驱动的封装机制
    public String execute() {
        System.out.println(name);
        System.out.println(passwd);
        return SUCCESS;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }
}


要使用上面的action我们可以使用下面的form表单来提交:

[code]<%-- 这里action参数写的是action的绝对路径 --%>
<form action="<%=basePath%>normal/AttributeAction" method="post">
    <input type="text" name="name">
    <input type="text" name="passwd">
    <button type="submit">提交</button>
</form>


我们发现这种方法在属性较少的情况下可取,如果属性很多,代码会很乱,所以有了下面的模型驱动

二,模型驱动

(1),不使用struts2标签的模型驱动

[code]// 实现ModelDriven接口,泛型中写我们封装的数据
public class StudentAction extends ActionSupport implements ModelDriven<User> {
    // 我们必须实例化我们封装的数据,struts2会直接使用我们的这个类,将数据set进去
    // 所以我们必须在这个类中写get和set方法
    User u = new User();

    // 实现此接口必须实现的方法,返回我们封装的数据
    @Override
    public User getModel() {
        return u;
    }

    @Override
    // 这种方法我们完全没有设置什么,但是struts2依然为我们将数据放了进去
    // 这里其实是java反射的应用
    public String execute() throws Exception {
        System.out.println(u.getName());
        System.out.println(u.getPasswd());
        return "success";
    }
}


使用这种action的form表单和属性驱动的一模一样

(2)使用struts2标签的模型驱动

示例代码:

[code]// 注意,这里不用实现ModelDriven接口
// 看马士兵说的这叫域模型
public class DomainModelAction extends ActionSupport {

    // 注意,这里不用自己实例化,struts2会帮助我们实例化
    // 所以,user里面必须有不带参数的构造方法
    // 同时,注意下面,我们必须写出user的get和set方法
    User user;

    public String execute() {
        try {
            System.out.println(user.getName());
            System.out.println(user.getPasswd());
        } catch (NullPointerException e) {
            return ERROR;
        }
        return SUCCESS;
    }

    public User getUser() {
        return user;
    }

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


为什么说是标签驱动的呢?看下面的form表单:

[code]<form action="normal/DomainModel_add" method="post">
    <%--注意name属性,必须是我们action中的数据名称.属性名--%>
    <input type="text" name="user.name">
    <input type="text" name="user.passwd">
    <button type="submit">提交</button>
</form>


还可以使用struts2的标签:

[code]<%--这里定位action的方式是和配置struts.xml差不多,使用namespace和action名--%>
<s:form namespace="/normal" action="DomainModel_add" method="POST">
    <%--name属性也必须这样写--%>
    <s:textfield name="user.name"/>
    <s:password name="user.passwd"/>
    <s:submit>提交</s:submit>
</s:form>


这就是struts2的3种数据封装机制,核心的机制是java反射,这个是如何实现的,将在以后的博文中讨论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: