struts 属性驱动与模型驱动

一、属性驱动

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中的模型驱动,刚开始不知道什么东西,感觉很神奇,现在一总结,豁然开朗。

posted @ 2017-08-07 13:50  babyyage  阅读(221)  评论(0编辑  收藏  举报