Struts2的ModelDriven机制

    好久没有写博客了,这段时间个人事情实在太多,耽误了学习,心中惶恐不安!

   今天这篇博客我们介绍Struts2中的ModelDriven机制!

        在struts2中提供了一种特殊的领域对象的访问方式ModelDriven,我们可以通过ModelDriven直接操作应用程序中的模型对象,我们可以再不同层中使用相同的对象。使用ModelDriven必须要在action中实现com.opensymphony. xwork2.ModelDriven接口,在这个接口中有一个getModel()方法,这个方法返回一个用于接收用户输入数据的模型对象。下面是一个简单的应用ModelDrivenDemo,通过这个例子我们分析模型驱动的原理以及好处。

   在这个例子中ModelDriven中采用了泛型的方式:

public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
 
    protected T model;
    public T getModel() {
        return model;
    }
}

        这样我们才RoleAction中传递参数为Role,在UserAction中传递参数为User。

   在action中我们可以直接应用model:

/** 添加 */
public String add() throws Exception {
 
     roleService.save(model);
 
     return "toList";
}

        或者利用model获取实体中的属性:

/** 修改页面 */
public String editUI() throws Exception {
     // 准备回显的数据
     Role role = roleService.getById(model.getId());
     ActionContext.getContext().getValueStack().push(role);
 
     return "saveUI";
}

       我们同样也可以在web层面使用model,这样我们在用实体属性的时候只需要使用属性即可,不用再用实体.属性:

<tr>
<td>用户名:</td>  
<td><input type="text" name="username"></td>  
</tr>  
<tr>  
<td>密码:</td>  
<td><input type="password" name="password"></td>  
</tr>

(如果不使用modeldriven,红色部分就应该写好具体的实体.属性,例如user.name,user.password)

    以上就是应用ModelDriven的地方,在实际的编程中确实给我们带来了很多方便,在Action中,我们采用model封装了实体,就不在需要为某个对象提供getter和setter方法,避免了,如果实体属性过多,会导致action中代码冗余,在页面中我们访问对象,不在需要实体.属性来表示,只需要直接写属性即可。

    下面我们分析ModelDriven机制的原理,为什么会允许我们在不同的层中可以用相同的对象,为什么可以直接使用属性就可以使用对应的实体。

    下面这个图是struts2的执行过程:

        在这个图里我们可以看到,在一个请求发出之后,经过action之前会进行拦截,在struts2的默认配置文件中对于拦截器是这样的:

<interceptors>
       ……
       <!--定义属性驱动的拦截器—>
       <interceptor name=”params” class=”com.opensymphony.xwork2.interceptor.ParametersInterceptor” />
       <!--定义模型驱动的拦截器—>
<interceptor name=”model-driven”  class=”com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor” />
       ……
       <!--定义模型驱动的拦截器栈—>
       <interceptor-stack name=”modelDrivenStack”>
              <interceptor-ref name=”model-driven”/>
              <interceptor-ref name=”basicStack”/>
       </interceptor-stack>
……
       <interceptor-stack name=”defaultStack”>
              <interceptor-ref name=”model-driven”/>
              <interceptor-ref name=”params”/>
       </interceptor-stack>
</interceptors>
<!--定义Struts2默认的拦截器栈—>
<default-interceptor-ref name=”defaultStack” />

        从上面的配置中我们可以看到拦截器栈采用的就是ModelDrivenStack,其中params拦截器负责提取请求的参数,如果是使用的属性驱动模式,它还负责将请求参数传给Action实例的属性;而model-driven拦截器则负责把请求参数传给模型的属性。当程序采用getModel()取得结果之后,会把结果放到ValueStack值栈中,Model对象一直处于栈顶的位置,所有从页面提交过来的参数都可以被model接收,也即被model封装,所以我们可以再页面中进行对model的访问, 实现了不同层之间访问相同的对象。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值