(九)Struts2模型驱动和属性驱动

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

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

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

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

 

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

一、模型驱动的要求

1.动作类实现ModelDriven接口

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

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

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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只用我们的参数相同即可 

1
2
3
4
5
6
7
<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>

  原理:

1
2
3
4
5
6
7
8
9
10
11
12
13
其实这时候表单的name已经不仅仅是一个简单的字符串了。
 
这一系列的操作是由ModelDriven和params拦截器帮我们做的 。
 
params拦截器负责提取请求参数,如果是属性驱动模式,则还负责将请求参数传给Action类的属性
 
模型驱动的话就只提取请求参数。
 
ModelDriven拦截器会先判断我们的动作类是否属于ModelDriven类型 
 
属于的话,就调用我们实现的getModel方法,获取我们传入的对象
 
然后将我们的对象给压入栈中

 

 

 

 

附:struts2注册案例

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

1
2
3
4
5
6
7
8
9
10
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实体类  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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层处理数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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层  

1
2
3
4
5
6
7
8
9
10
11
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层动作类    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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页面

1
2
3
4
5
6
7
8
9
10
11
12
13
<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  

 

1
2
3
4
5
6
7
<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>

  

 

  

  

 

posted @   跃小云  阅读(977)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示