出于结构清晰的考虑,应该采用单独的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{
//数据模型对象由我们实例化
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只用我们的参数相同即可
用户名:
年 龄:
原理:
其实这时候表单的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.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页面
用户名:
密 码:
生 日:
爱好:篮球
足球
写代码
已婚:
(7)配置 struts.xml
/success.jsp
/msg.jsp