Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.7.1 模型的作用

Struts 2的模型对象可以封装更多的信息,不仅可以封装用户请求参数,还可以封装Action的处理结果。回忆前面的Action类代码,大致的代码结构如下。

// 处理用户请求的Action类
public class XxxAction implements Action
{
    // 这里的属性既包含了用户请求,也包含了处理结果
    private Type1 attName1;
    private Type2 attName2;
    // Action类里各属性的setter和getter方法
    public void setAttName1(Type1 attName1)
    {
          ...
    }
    // 处理用户请求的execute方法
    public String execute()
    {
          ...
    }
}

相比于Struts 1的Action类,Struts 2的Action承担了太多责任:既用于封装来回请求的参数,也保护了控制逻辑——出于这种考虑,这种模式确实不太清晰。出于结构清晰的考虑,应该采用单独的Model实例来封装请求参数和处理结果,这就是所谓的模型驱动。

所谓模型驱动,就是使用单独的JavaBean 实例来贯穿整个MVC 流程;与之对应的属性驱动模式,则使用属性(Property)作为贯穿 MVC 流程的信息携带者。当然,属性无法独立存在,它必须依附于一个对象,这个对象就是 Action 实例。简单地说,模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果。

出于这种考虑,我们将上面的Action分解成如下两个类。

// 专门封装请求参数和处理结果的VO
public class XxxModel
{
    // 这里的属性既包含了用户请求,也包含了处理结果
    private Type1 attName1;
    private Type2 attName2;
    // Action类里各属性的setter和getter方法
    public void setAttName1(Type1 attName1)
    {
          ...
    }
}

除了这个用于封装请求参数和处理结果的JavaBean之外,还必须提供一个包含处理逻辑的Action类。Action类的代码结构如下:

public class XxxAction implements Action,ModelDriven
{
    // 处理用户请求的execute方法
    public String execute()
    {
          ...
    }
    public Object getModel()
    {
          ...
    }
}

上面的Action相对于使用属性驱动的Action而言,需要多实现一个ModelDriven接口,并要求实现Object getModel()方法——该方法用于关联Action和Model之间的关系。

提示:

模型驱动的含义是,使用模型封装了所有数据,贯穿整个MVC流程;模型的作用是,封装用户请求参数和处理结果。