繁体   English   中英

如何让Struts2仅在POST上验证

[英]How to let struts2 only validate on POST

例如,我有一个add方法,该方法在“ get”中显示一个表单

并在“发布”中执行添加逻辑,即验证,调用服务方法等。

在“获取”阶段,我不想验证

但是struts2始终在这两个阶段中进行验证。

如何配置struts2仅在“ post”上验证?

忘了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作为参数,则可以编写两个)并将其应用于所需的Action。

例如。 编写一个BlockGetRequestsInterceptor,它将阻止所有GET请求,并将其应用于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,请以正确的方式使用它,按照设计的方式使用它,否则可能会成为一场噩梦;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM