我正在使用hibernate,struts2和spring开发一个项目,但我的问题是struts
我已经创建了3个扩展ActionSupport的类,并且正在为所有类中的同一个类实现modeldriven。我已经实现了一些在调用动作时执行的方法
类的结构类似于(Class1Action.java):
public class Class1Action extends ActionSupport implements ModelDriven<ModelDrivenClass> {
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个动作:
<action name="actionName1" method="methodName" class="Class1Action">
<interceptor-ref name="validation">
<param name="excludeMethods">methodName</param>
</interceptor-ref>
<result name="success" >success.jsp</result>
<result name="input" >input.jsp</result>
</action>
除此之外,我有一个带有3个按钮的JSP,用于引用不同的struts操作,以及几个字段,用于表示3个操作类中使用的模型驱动类的字段,以及<s:push>
标记内的所有字段。
问题是当我填充字段时,只需点击任何按钮后,字段中的数据就会丢失。
我试图删除从验证中排除方法的3个struts行,但是不是字段是空的,第二次我按下相同的按钮时他返回一个输入并重定向到input.jsp。
下一个代码来自success.jsp,即起始页面:
<form method="post" >
<s:push value="modelDrivenClass">
<s:textfield label="FieldLabel1" name="modelDrivenClassAttribute1" />
<s:textfield label="FieldLabel2" name="modelDrivenClassAttribute2" />
<s:textfield label="FieldLabel3" name="modelDrivenClassAttribute3" />
<s:textfield label="FieldLabel4" name="modelDrivenClassAttribute4" />
<s:textfield label="FieldLabel5" name="modelDrivenClassAttribute5" />
</s:push>
<s:submit action="actionName1" name="Submit1" value="Submit1" />
<s:submit action="actionName2" name="Submit2" value="Submit2" />
<s:submit action="actionName3" name="Submit3" value="Submit3" />
</form>
我不知道这是否是正确的方法,但是当我只使用一个实现modeldriven的类并且这个类具有所有3种方法时,我使它工作。我只是尝试这种方式,因为我想让我的代码清楚,并且只有一个类中没有所有方法。
答案 0 :(得分:1)
如果要将旧的Struts代码迁移到新的代码,那么使用模型驱动的动作类非常有用,因此它简化了表单bean的概念。如果你可以使用价值堆栈的ModelDriven
中的动作bean以及与其名称前缀相关联的模型,那么在较新的Struts 2中使用top
是不必要的。
注意,当在动作配置中覆盖拦截器配置时,defaultStack
消失。因此,最好至少创建自己的堆栈或引用basicStack
,以确保调用必要的拦截器。在你的情况下一个modelDriven
拦截器。
如果您在堆栈中使用此拦截器,则会在操作前面推送模型,因此您不需要在结果中s:push
它。
模型对象应初始化为模型类的实例,并由模型的getter返回。还要考虑在模型的验证字段时使用访问者验证程序。
在调用之间共享数据的三个操作需要使用Preparable
准备模型以填充session
中的字段,或使用会话对象引用为字段提供默认值以保存它们。
注意使用prepare
需要更改拦截器调用的顺序,以便在填充模型之前推送模型。