我正在尝试从参数列表中排除提交操作。以下是动作类。
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@InterceptorRefs({
@InterceptorRef(value="validation", params={"excludeMethods", "test"}),
@InterceptorRef(value="params", params={"excludeParams", "action:postAction"})})
public final class TestAction extends ActionSupport implements Serializable, ValidationAware
{
private static final long serialVersionUID = 1L;
private static final String SUCCESS = "success";
private String name;
@Action(value = "test", results = {
@Result(name="success", location="Test.jsp"),
@Result(name = "input", location = "Test.jsp")})
public String test() throws Exception
{
System.out.println("name = "+name);
return SUCCESS;
}
@Action(value = "postAction", results = {
@Result(name="success", location="Test.jsp"),
@Result(name = "input", location = "Test.jsp")})
public String postAction()
{
System.out.println("Post invoked");
System.out.println("name = "+name);
return SUCCESS;
}
@RequiredStringValidator(type= ValidatorType.FIELD, message = "The name is required.")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void validate()
{
if(!hasErrors()&&name.length()<2)
{
addFieldError("name", "The name must compose of 2 letters.");
}
}
}
Test.jsp
页面:
<s:form namespace="/admin_side" action="test" validate="true">
<s:textfield id="name" name="name" label="Name"/>
<s:submit id="btnSubmit" name="btnSubmit" value="Submit" action="postAction"/>
</s:form>
生成的<s:submit>
HTML代码如下所示。
<input type="submit" id="btnSubmit" name="action:postAction" value="Submit"/>
班级上方的@InterceptorRef
@InterceptorRef(value="params", params={"excludeParams", "action:postAction"})
似乎不起作用。永远不会调用方法postAction()
,从而导致发出以下警告。
2013年12月24日下午10:49:16 com.opensymphony.xwork2.interceptor.ParametersInterceptor警告 警告:参数[action:postAction]位于excludeParams列表中 图案!
在struts.properties
文件中,到目前为止,我有以下属性。
struts.enable.DynamicMethodInvocation=false
struts.devMode=false
struts.ui.theme=simple
struts.convention.package.locators=actions
struts.convention.action.suffix=Controller
struts.convention.action.mapAllMatches=true
struts.convention.result.path=/WEB-INF/content //No need. It is the default.
struts.mapper.action.prefix.enabled=true
我正在使用Struts 2.3.16。
为什么不排除提交按钮的参数?单击postAction()
时如何调用<s:submit>
方法?
答案 0 :(得分:3)
为什么不排除提交按钮的参数?
因为此参数位于excludeParams
中params
拦截器的defaultStack
列表中,默认情况下会引用您的操作。
单击
<s:submit>
时如何调用postAction()方法?
在这个问题中,你会问如何调用方法(而不是动作)。第一个操作和方法之间的区别使用命名空间和操作名称映射到指定的URL。因此,要调用除操作之外的方法,您应该打开DMI。 Struts,从2.3.16开始就关掉了这个选项。要在struts.xml
中使用以下配置常量:
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
并使用method
属性而不是action
属性。
<s:form namespace="/admin_side" action="test">
<s:submit value="Submit" method="postAction"/>
</s:form>
正如我在this回答中所说的那样。
如果您不想使用DMI,则可以选择为参数启用action:
前缀
<constant name="struts.mapper.action.prefix.enabled" value="true"/>
并使用映射到方法postAction
<s:form namespace="/admin_side" action="test">
<s:submit value="Submit" action="postAction"/>
</s:form>
并使用不带params.excludeParams
的注释。
@InterceptorRef(value="defaultStack" params={"validation.excludeMethods", "test"})
action:postAction
参数在排除列表中的警告仍然存在,但仅在struts.devMode=true
时出现。您不应该担心它,因为它会警告通过的excludeParams
列表中的所有参数。要关闭devMode
,您应该设置
<constant name="struts.devMode" value="false" />