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
需要更改拦截器调用的顺序,以便在填充模型之前推送模型。