Struts 2上的ModelDriven

我正在使用hibernate,struts2和spring开发一个项目,但我的问题是struts。
我创建了3个扩展ActionSupport的类,并在所有类中为同一个类实现了modeldriven。 我已经实现了一些在调用操作时要执行的方法。
类的结构类似于(Class1Action.java):

public class Class1Action extends ActionSupport implements ModelDriven { private ModelDrivenClass modelDrivenClass; // getter and setter for modelDrivenClass public String methodName() { System.out.println("Entrou!"); return SUCCESS; } @Override public Sensor getModel() { return getSensor(); } } 

在struts.xml上,我使用下一个结构(struts.xml)创建了3个动作:

   methodName  success.jsp input.jsp  

除此之外,我有一个带有3个按钮的JSP,用于引用不同的struts动作,以及几个字段,用于表示3个动作类中使用的模型驱动类的字段,以及标记内的所有字段。 问题是当我填充字段并且在单击任何按钮之后,字段中的数据丢失。 我试图删除从validation中排除方法的3个struts行,但是不是字段是空的,在第二次我按下相同的按钮时,他返回一个输入并重定向到input.jsp。
下一个代码来自success.jsp,即起始页面:

 

我不知道这是否是正确的方法,但是当我只使用一个实现modeldriven的类时,我使它工作,并且这个类有所有3个方法。 我只是尝试这种方式,因为我想让我的代码清楚,并且只有一个类中没有所有方法。

如果要将旧的Struts代码迁移到新的代码,那么使用模型驱动的动作类的方法非常有用,因此它简化了表单bean的概念。 而在较新的Struts 2中,如果您可以使用值堆栈top的动作bean以及与其名称前缀相关联的模型,则不必使用ModelDriven

注意,当在动作配置中覆盖拦截器配置时, defaultStack消失。 因此,最好至少创建自己的堆栈或引用basicStack ,以确保调用必要的拦截器。 在你的情况下是一个modelDriven拦截器。

如果你在堆栈上使用这个拦截器,它会在动作前面推送模型,所以你不需要s:push在结果中s:push它。

模型对象应初始化为模型类的实例,并由模型的getter返回。 还要考虑在模型的validation字段时使用访问者validation程序。

在调用之间共享数据的三个操作需要使用Preparable准备模型以填充session的字段,或者使用会话对象引用为字段提供默认值以保存它们。

注意,使用prepare需要更改拦截器调用的顺序,以便在填充模型之前推送模型。