Struts 2上的ModelDriven

时间:2012-08-01 11:54:56

标签: java jsp struts model-driven struts-action


我正在使用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种方法时,我使它工作。我只是尝试这种方式,因为我想让我的代码清楚,并且只有一个类中没有所有方法。

1 个答案:

答案 0 :(得分:1)

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

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

如果您在堆栈中使用此拦截器,则会在操作前面推送模型,因此您不需要在结果中s:push它。

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

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

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