如何配置动态"输入"结果是Struts2

时间:2015-03-30 15:45:24

标签: struts2 struts-validation

假设我使用Struts2验证框架在我的操作中配置了“per method”验证(在我的带有注释的示例中,但是与xml相同)。 假设我的行动中有三个公开的方法:

public class MyAction extends ActionSupport {

    @Override
    public String execute() throws Exception {

        //some code here...
    }

    @Validations(
        customValidators = {@CustomValidator(type="myCostomValidator", fieldName="myFieldName", shortCircuit=true, message="")}         
    )
    public String info() {

        //some code here...
    }

    @Validations(
        customValidators = {@CustomValidator(type="myCostomValidator", fieldName="anotherFieldName", shortCircuit=true, message="")},
        visitorFields = {@VisitorFieldValidator(context="update_context", fieldName="anObjectField", message="", shortCircuit=true)}            
    )
    public String update() {

        //some code here...
    }

    //getters, setters and other...
}

现在,可以调用这三种方法中的每一种,并进行不同的验证。如果验证失败,框架会将结果“input”设置为struts.xml:

<action name="myAction_*" method="{1}" class="com.test.gui.action.test.MyAction">
    <result name="success">result1.jsp</result>
    <result name="edit">result2.jsp</result>
    <result name="input">result3.jsp</result>
</action>

如何为每种操作方法提供不同的“输入”结果?例如,如果对于info()方法的验证失败,我想要访问一个页面,如果update()方法的验证失败,我想要访问另一个页面。 谢谢。

2 个答案:

答案 0 :(得分:2)

我找到了这个解决方案:使用@InputConfig注释。

使用此注释,您可以为验证错误设置“每个方法”结果名称。因此,在struts.xml中,您可以为每个结果名称配置要访问的页面。

示例:

@InputConfig(resultName="input_update")
public String update() {
    // perform action
    return SUCCESS;
}

并在struts.xml中:<result name="input_update">jsp/input_update.jsp</result>

或:

@InputConfig(methodName="inputMethod")
public String update() {
    // perform action
    return SUCCESS;
}
public String inputMethod() {
    // perform some data filling
    return INPUT;
}

struts.xml:<result name="input">jsp/myInput.jsp</result>

请参阅struts.apache.org/docs/inputconfig-annotation.html

上的文档

也可以通过设置'workflow'拦截器的参数来设置struts.xml中的输入结果名称,但它会影响操作中的所有方法:

<interceptor-ref name="workflow">
    <param name="inputResultName">custom_input_result</param>
</interceptor-ref>

请参阅此处的文档struts.apache.org/docs/default-workflow-interceptor.html

答案 1 :(得分:0)

您不必修改返回的结果名称。您正在为您的操作使用通配符映射,因此也将它用于JSP文件名。

<action name="myAction_*" method="{1}" class="com.test.gui.action.test.MyAction">
    <result name="success">success.jsp</result>
    <result name="input">result_{1}.jsp</result>
</action>