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

  • 相关阅读:
    Git 如何优雅地回退代码?
    如何让自己的技能变现?
    读了100本书,总结出读遍万卷书的 7 大方法
    08月10日总结
    08月09日总结
    08月08日总结
    08月06日总结
    08月04日总结
    08月03日总结
    剑指offer52 两个链表的第一个公共节点
  • 原文地址:https://www.cnblogs.com/wangyage/p/7298748.html
Copyright © 2020-2023  润新知