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