在下面的动作类中,我使用了参数拦截器。
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
@InterceptorRefs(@InterceptorRef(value="store", params={"operationMode", "AUTOMATIC"}))
public final class TestAction extends ActionSupport implements Serializable, ValidationAware, Preparable
{
private static final long serialVersionUID = 1L;
private String param1;
private String param2;
//Getters and setters.
public TestAction() {}
@Action(value = "TestMessage",
results = {
@Result(name=ActionSupport.SUCCESS, type="redirectAction", params={"namespace", "/admin_side", "actionName", "Test"}),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs={
@InterceptorRef(value="paramsPrepareParamsStack", params={"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true"})
})
public String insert() {
// Do something. Add or update a row to the database (one at a time).
addActionMessage("Action message");
addActionError("Error message");
return ActionSupport.SUCCESS;
}
@Action(value = "Test",
results = {
@Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs = {
@InterceptorRef(value = "paramsPrepareParamsStack", params = {"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true", "validation.excludeMethods", "load"})})
public String load() throws Exception {
// This method is just required to return an initial view on page load.
return ActionSupport.SUCCESS;
}
@Override
public void prepare() throws Exception {}
}
以下是<s:form>
:
<s:form namespace="/admin_side" action="Test" validate="true" id="dataForm" name="dataForm">
<s:if test="hasActionMessages()">
<s:actionmessage theme="jquery"/>
</s:if>
<s:if test="hasActionErrors()">
<s:actionerror theme="jquery"/>
</s:if>
<s:hidden name="param1"/>
<s:hidden name="param2"/>
<s:hidden name="extraParam"/>
<s:submit value="Submit" action="TestMessage"/>
</s:form>
在这里,隐藏的表单字段extraParam
没有被声明,因此在 action 类中没有 setter 和 getter。
在这种情况下,当提交此表单时,服务器终端上会出现以下消息。
严重:开发人员通知(将 struts.devMode 设置为 false 以禁用此消息):在“类操作”上设置“extraParam”时捕获意外异常。TestAction:错误设置表达式“extraParam”,值为 ['',]
params.excludeParams
不排除extraParam
动作类中的参数。
我们可以在使用参数拦截器时以某种方式防止此类异常吗?此类消息不必要地添加到操作消息中,并<s:actionmessage/>
在根本不应该显示时通过 显示(如果使用)。
如果在操作类中将其paramsPrepareParamsStack
替换为defaultStack
,则不会出现此类消息。它只是给出如下警告。
警告:参数 [extraParam] 位于模式的 excludeParams 列表中!
请不要只是说,设置struts.devMode
为false
禁用此类消息。