(九)Struts2模型驱动和属性驱动
阅读原文时间:2023年07月08日阅读:4

出于结构清晰的考虑,应该采用单独的Model实例来封装请求参数和处理结果,这就是所谓的模型驱动,

所谓模型驱动,就是使用单独的JavaBean来贯穿整个MVC流程。

所谓属性驱动,就是使用属性来作为贯穿MVC流程的信息携带者,当然属性必须依附于对象,

这个对象就是Action实例。 简单说,模型驱动就是使用单独的javaBean封装请求参数。 属性驱动就是把属性写在Action类中。

我们发现上一章的jsp中的name必须前面得加 user.username。。太过麻烦。我们使用模型驱动来解决这个问题。实际开发中使用这种方式

一、模型驱动的要求

1.动作类实现ModelDriven接口

2.实现接口中的getModel方法,返回我们的数据对象。(实现中用泛型将确定传入模型 implements ModelDriven<?>)

3.数据模型对象必须由我们实例化。

例子:

            public class AdduserAction extends ActionSupport implements ModelDriven<User>{  
                //数据模型对象由我们实例化  
                private User user=new User();

                public User getUser() {  
                    System.out.println("getuser");  
                    return user;  
                }

                public void setUser(User user) {  
                    System.out.println("setuser");  
                    this.user = user;  
                }  
                public String adduser(){  
                    System.out.println(user.getUsername()+":"+user.getAge());  
                    return null;  
                }  
                //实现接口方法,返回我们的数据模型对象  
                public User getModel() {  
                    // TODO Auto-generated method stub  
                    return user;  
                }

            }

 我们在jsp上就能像以前那样 ,name只用我们的参数相同即可 

    <body>  
        <form action="${pageContext.request.contextPath }/action1" method="post">  
            用户名:<input type="text" name="username"><br>  
            年 龄:<input type="text" name="age"><br>  
            <input type="submit" value="提交">  
        </form>  
    </body>

原理:

其实这时候表单的name已经不仅仅是一个简单的字符串了。 

这一系列的操作是由ModelDriven和params拦截器帮我们做的 。 

params拦截器负责提取请求参数,如果是属性驱动模式,则还负责将请求参数传给Action类的属性 

模型驱动的话就只提取请求参数。 

ModelDriven拦截器会先判断我们的动作类是否属于ModelDriven类型  

属于的话,就调用我们实现的getModel方法,获取我们传入的对象 

然后将我们的对象给压入栈中

附:struts2注册案例

(1)我们先创建数据库表

    create database demo;  
    use demo;

    create table user(  
        username varchar(100) primary key,  
        password varchar(100),  
        birthday date,  
        hobby varchar(255),  
        married boolean  
    );

(2)在domain包创建我们的user实体类  

    public class User {  
        private String username;//用户名  
        private String password;//密码  
        private Date birthday; //生日  
        private String hobby; //爱好  
        private boolean married; //是否结婚  
        public String getUsername() {  
            return username;  
        }  
        public void setUsername(String username) {  
            this.username = username;  
        }  
        public String getPassword() {  
            return password;  
        }  
        public void setPassword(String password) {  
            this.password = password;  
        }  
        public Date getBirthday() {  
            return birthday;  
        }  
        public void setBirthday(Date birthday) {  
            this.birthday = birthday;  
        }  
        public String getHobby() {  
            return hobby;  
        }  
        public void setHobby(String hobby) {  
            this.hobby = hobby;  
        }  
        public boolean isMarried() {  
            return married;  
        }  
        public void setMarried(boolean married) {  
            this.married = married;  
        }

    }

(3)完成数据层,我们在Dao层处理数据

    public class UserDao {  
        QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource()); 

        //根据名字查找用户  
        public User findUserByUsername(String username){  
            try {  
                String sql="select \* from user where username=?";  
                return qr.query(sql, new BeanHandler<User>(User.class),username);  
            } catch (Exception e) {  
                throw new RuntimeException(e);  
            }  
        }

        //添加用户  
        public int addUser(User user){  
            String sql="insert into user values(?,?,?,?,?)";  
            Object \[\]params={user.getUsername(),user.getPassword(),user.getBirthday(),user.getHobby(),user.isMarried()};  
            try {  
                return qr.update(sql,params);  
            } catch (SQLException e) {  
                throw new RuntimeException(e);  
            }  
        }

    }

(4)完成业务逻辑层的编写,service层  

    public class UserService {  
        private UserDao userdao=new UserDao();  
        //注册  
        public int regist(User user){  
            return userdao.addUser(user);  
        }  
        //通过用户名查找用户  
        public User findByUsername(String username){  
            return userdao.findUserByUsername(username);  
        }  
    }

(5)创建web层,我们创建web层动作类    

public class UserAction extends ActionSupport implements ModelDriven{  
    private User user=new User();  
    private UserService userservice=new UserService();  

    //注册方法  
    public String regist(){  
        User \_user=userservice.findByUsername(user.getUsername());  
        //判断用户是否存在,存在返回exists字符串  
        if(\_user!=null){  
            return "exists";  
        }  
        //获取注册成功更新的行数  
        int count=userservice.regist(user);  
        //如果>0,返回success  
        if(count>0){  
        return SUCCESS;  
        }  
        return null;  
    }

    public Object getModel() {  
        // TODO Auto-generated method stub  
        return user;  
    }

    public User getUser() {  
        return user;  
    }

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

}

(6)我们编写注册的jsp页面

<body>  
    <form action="${pageContext.request.contextPath }/regist.action" method="post">  
        用户名:<input type="text" name="username"><br>  
        密   码:<input type="password" name="password"><br>  
        生   日:<input type="text" name="birthday"><br>  
        爱好:<input type="checkbox" name="hobby" value="篮球">篮球  
            <input type="checkbox" name="hobby" value="足球">足球  
            <input type="checkbox" name="hobby" value="写代码">写代码<br>  
        已婚:<input type="checkbox" name="married" value="true"><br>  
        <input type="submit" name="注册"><br>  
    </form>

</body>

(7)配置 struts.xml  

    <package name="p1" extends="struts-default">

        <action name="regist" class="com.cad.web.action.UserAction"  method="regist">  
            <result name="success">/success.jsp</result>  
            <result name="exists">/msg.jsp</result>  
        </action>  
    </package>