Struts2之ModelDriven

    strus2中获取表单数据有两种方式:属性驱动和模型驱动。

    属性驱动即使用Action的属性元素封装请求参数,我们需要在Action中定义与表单元素对应的所有的属性,因而在Action中会出现

很多的getter和setter方法,使得Action代码量增加了很多,而且不利于封装和继承。

    模型驱动是使用JavaBean来封装来回请求参数,它使得Action更加简洁,可以使Action更加专注于是控制业务逻辑。

Struts2中Action接收参数的方法主要有以下三种:
1.使用Action的属性接收参数(最原始的方式):
  a.定义:在Action类中定义属性,创建get和set方法;
  b.接收:通过属性接收参数,如:userName;
  c.发送:使用属性名传递参数,如:user1!add?userName=jim;
2.使用DomainModel接收参数:
  a.定义:定义Model类,在Action中定义Model类的对象(不需要new),创建该对象的get和set方法;
  b.接收:通过对象的属性接收参数,如:user.getUserName();
  c.发送:使用对象的属性传递参数,如:user2!add?user.userName=mike;
3.使用ModelDriven接收参数(现在用的比较多的方式):
  a.定义:Action实现ModelDriven泛型接口,定义Model类的对象(必须new),通过getModel方法返回该对象;
  b.接收:通过对象的属性接收参数,如:user.getUserName();
  c.发送:直接使用属性名传递参数,如:user2!add?userName=tom


ModelDrivenInterceptor是缺省的拦截器链的一部分,当一个请求经过ModelDrivenInterceptor的时候,在这个拦截器中,会判断当前要调用的Action对象是否实现了ModelDriven接口,如果实现了这个接口,则调用getModel()方法,并把返回值压入ValueStack。

ModelDrivenInterceptor的代码:

public class ModelDrivenInterceptor extends AbstractInterceptor {
    protected boolean refreshModelBeforeResult = false;
    public void setRefreshModelBeforeResult(boolean val) {
    this.refreshModelBeforeResult = val;
   }
   public String intercept(ActionInvocation invocation) throws Exception {
   	 //获取 当前正在运行Action 对象
    	 //public class EmployeeAction implements RequestAware, ModelDriven<Employee>
         Object action = invocation.getAction();

	  //判断 action 是否是 ModelDriven 的实例
          if (action instanceof ModelDriven) {
            //强制转换为 ModelDriven 类型
            ModelDriven modelDriven = (ModelDriven) action;
            //获取值栈
            ValueStack stack = invocation.getStack();
            //调用 ModelDriven 接口的 getModel() 方法
            Object model = modelDriven.getModel();
            if (model !=  null) {
            	//把 getModel() 方法的返回值压入到值栈的栈顶.
            	stack.push(model);
            }
            //在执行result之前是否更新model,默认值为false,如果为true:先把旧的model对象从ValueStack中移除,然后再把新的model对象压入ValueStack!
            if (refreshModelBeforeResult) {
                invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
            }
        }
        return invocation.invoke();
    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值