1. 程式人生 > >(九)模型驅動和屬性驅動

(九)模型驅動和屬性驅動

tag rda add struts put username strong get exists

出於結構清晰的考慮,應該采用單獨的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> 

  

 

  

  

(九)模型驅動和屬性驅動