例如,我有一个add方法,在" get"显示表格
和" post"做添加逻辑,即验证,调用服务方法等。
在" get"阶段,我不想要验证
但struts2总是在这两个阶段验证。
如何配置struts2以仅对" post"进行验证? ?
答案 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,请以正确的方式使用它,它的设计方式,否则它可能变成一场噩梦;)