Using ModelDriven in Struts 2



我正在使用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中,我使用下一个结构创建了3个动作

struts.xml:

<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>

除此之外,我还有一个JSP,其中有3个按钮引用不同的Struts操作,还有几个字段表示3个操作类中使用的模型驱动类中的字段,以及<s:push>标记中的所有字段。

问题是,当我填充字段时,单击任何按钮后,字段中的数据都会丢失。

我试图删除将方法排除在验证之外的3行Struts,但字段不是空的,而是在我第二次按下相同的按钮时,他返回一个输入并重定向到input.jsp

下一个代码来自success.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个方法时,我就实现了。

我之所以尝试这种方式,是因为我想让我的代码变得清晰,不要让所有方法都只在一个类中。

如果要将旧Struts代码迁移到新代码,那么使用ModelDriven操作类的方法非常有用,因此它简化了FormBean的概念。

在较新的Struts 2中,如果您可以使用valueStacktop中的动作bean和在中关联的模型,则不需要使用ModelDriven

注意:在操作配置中重写拦截器配置时,defaultStack将消失。因此,最好创建自己的堆栈或至少引用basicStack,以确保调用必要的拦截器。在您的情况下是modelDriven拦截器。

如果在堆栈上使用这个拦截器,它会将模型推到操作的前面,因此不需要在结果中s:push它。

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

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

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

最新更新