Struts2的ModelDriven机制

来源:互联网 发布:is语音软件下载 编辑:程序博客网 时间:2024/05/29 06:50

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

   今天这篇博客我们介绍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
原创粉丝点击