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

出于结构清晰的考虑,应该采用单独的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值