如何让struts2仅在POST上验证

时间:2014-03-28 12:12:38

标签: java struts2

例如,我有一个add方法,在" get"显示表格

和" post"做添加逻辑,即验证,调用服务方法等。

在" get"阶段,我不想要验证

但struts2总是在这两个阶段验证。

如何配置struts2以仅对" post"进行验证? ?

1 个答案:

答案 0 :(得分:3)

忘记REST行为调用相同的URL并根据您习惯的Http谓词执行不同的操作:

@RequestMapping(value = "/foo", method = RequestMethod.GET)
public ModelAndView ReadFoobar(Locale locale, 
                               Model model, 
                               HttpServletRequest request){
    String foobar = getService().loadFoobar();
    ModelAndView mav = new ModelAndView("foobarPage")
    mav.addObject("foobar",foobar);
    return mav;
}

@RequestMapping(value = "/foo", method = RequestMethod.POST)
public String InsertStuff(@RequestParam("stuff") String stuff,
                          Locale loc, 
                          Model model,
                          HttpServletRequest req){
    validate();
    getService().insertStuff(stuff);
    return "stuffPage";
}

那是Spring MVC,这是Struts2。你需要在行动方面进行推理;而不是使用Http动词,使用不同的动作并仅为其中一个定义验证。例如:

代表GET的行动

public class ReadFoobar {

    @Getter private String foobar;

    public String execute(){
        foobar = getService().loadFoobar();
        return SUCCESS;
    }

}

代表POST的行动

public class InsertStuff {

    @Setter private String stuff = "";

    public String execute(){
        getService().insertStuff(stuff);
        return SUCCESS;
    }

    public void validate(){
        if (stuff.length()<3){
            addFieldError("stuff","The mininum length is 3");
        }
    }
}

此时,只将readAction与GET请求相关联:

<s:a action="ReadFoobar">check out this Foobar</s:a>

和insertAction仅用于POST请求:

<s:form action="InsertStuff" theme="simple">
    <s:textfield name="stuff" />
    <s:fielderror fieldName="stuff" />

    <s:submit value="Insert the stuff" />
</s:form>

您可以通过为每个Action类指定不同的XML文件来执行相同的XML验证;您还可以在同一个Action类中使用两个方法,并在方法级别指定不同的XML验证(或不验证),方法是在操作名称后面使用方法名称重命名XML。

最后,如果您仍然希望确保绝对没有请求,即使是为了绕过您的UI,也可以达到例如。在GET模式下的ReadFoobar,您可以编写一个简单的拦截器(如果您不想将GET / POST作为参数传递,则可以编写两个拦截器)并将其应用于所需的动作。

EG。编写一个阻止所有GET请求的BlockGetRequestsInterceptor,并将其应用于InsertStuff Action(通过struts.xml或带注释,如果使用我推荐的Convention插件):

public class InsertStuff {

    @Action(interceptorRefs={
        @InterceptorRef("BlockGetRequestsInterceptor"), 
        @InterceptorRef("defaultStack")})
    public String execute(){
        getService().insertStuff(stuff);
        return SUCCESS;
    }

    // ... 

我也喜欢Spring MVC,但如果您想要/需要/正在使用Struts2,请以正确的方式使用它,它的设计方式,否则它可能变成一场噩梦;)