struts2的属性模型和驱动模型

来源:互联网 发布:英语不好可以学编程吗 编辑:程序博客网 时间:2024/05/17 22:51

一、属性驱动

jsp中的页面每一个form中的name和action中的属性与之对应。

<span style="font-size:18px;"><form action="register.do" name="RegisterForm" method="post">            Username:<input type="text" name="username"><br>            Password:<input type="password" name="password"><br></form></span>

action中的定义类:

<span style="font-size:18px;">public class LoginAction extends ActionSupport {    private String username;    private String password;    public String get username() {        return uname;    }    public void set username(String username) {        this. username = username;    }    public String getpassword() {        return password;    }    public void setpassword(String password) {        this. password = password;    }        @Override    public String execute() throws Exception {                return ActionSupport.SUCCESS;    }}</span>

    from表单中的name属性和action里的属性名字一模一样,这就是属性驱动,当表单提交到action后,struts2将会自动将根据表单的name属性调用Acton中相应的属性setter,去自动赋值。

二、模型驱动

       每个action中有一个POJO对象,用来封装表单属性,也就是把属性放在对象中,更加的面向对象。

<span style="font-size:18px;"><form action="register.do" name="RegisterForm" method="post">            Username:<input type="text" name="username"><br>            Password:<input type="password" name="password"><br></form></span>

     POJO的代码,其实就是普通的Java Bean:

<span style="font-size:18px;">public class User {    private String username;    private String password;    public String get username() {        return uname;    }    public void set username(String username) {        this. username = username;    }    public String getpassword() {        return password;    }    public void setpassword(String password) {        this. password = password;    }}</span>

action中代码:

<span style="font-size:18px;">public class LoginAction extends ActionSupport implements ModelDriven<User> {    private User user = new User();    // 模型驱动必须实现的方法,也是ModelDriven接口中唯一的方法     public User getModel() {        return user;    }    @Override    public String execute() throws Exception {                return ActionSupport.SUCCESS;    }}</span>

和属性驱动的Action有很大的区别:

(1)模型驱动的Action必须实现ModelDriven接口,而且要提供相应的泛型,这里当然就是具体使用的Java Bean了。

(2)实现ModelDriven的getModel方法,其实就是简单的返回泛型的一个对象。

(3)在Action提供一个泛型的私有对象,这里就是定义一个User的user对象,并提供相应的getter与setter。

到底用哪个?建议:

(1)请你统一整个系统中的Action使用的驱动模型,即要么都是用属性驱动,要么都是用模型驱动。

(2)如果你的DB中的持久层的对象与表单中的属性都是一一对应的话,那么就使用模型驱动吧,毕竟看起来代码要整洁得多。

(3)如果表单的属性不是一一对应的话,那么就应该使用属性驱动,否则,你的系统就必须提供两个Bean,一个对应表单提交的数据,另一个用与持久层。

三、实现原理

系统是如何将请求参数封装到LoginAction的model属性中呢?我们再次查看sttuts-default.xml文件:


        上面配置片段中配置了系统的默认拦截器栈,它包含了两个拦截器引用:model-driven和params,这两个拦截器引用又对应系统中的model-driven和params拦截器。其中params拦截器负责提取请求参数,如果使用属性驱动模式,则还负责将请求参数传给Action实例的属性;而model-driven拦截器则负责将请求参数传给模型的属性。

        属性驱动,举个例子,页面上有个标签 name="user"value="admin"。最后提交到后台会以user=admin的形式。被拦截器获悉后,它就会查找action中是否有user这个参数,如果找到就调用setUser将admin赋给user.当请求返回的到jsp页面时 在将jsp编译成servlet,如果页面中有name="user"的标签,或是直接用${user}的时候,拦截器会调用action中user参数的getUser方法将user的值通过Responce发送出去。

四、总结

        SSH中的模型驱动,刚开始不知道什么东西,感觉很神奇,现在一总结,豁然开朗。

 





参考文章:http://www.blogjava.net/jjshcc/archive/2010/06/17/323750.html


1 0