上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流程;模型的作用是,封装用户请求参数和处理结果。