码迷,mamicode.com
首页 > 其他好文 > 详细

struts2的属性模型和驱动模型

时间:2016-05-13 04:32:27      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

一、属性驱动

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


struts2的属性模型和驱动模型

标签:

原文地址:http://blog.csdn.net/cwl421/article/details/51338023

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!