0

我在一个循环中有一些这样的输入:

<s:hidden name="sequence['%{#currentEvent.idChain}']" value="%{#currentEvent.sequenceSpace}"/>

而且,在我的java文件中,我有

private HashMap<String, String> sequence;
public HashMap<String, String> getSequence() {
    return sequence;
}
public void setSequence(HashMap<String, String> sequence) {
    this.sequence = sequence;
}

但是,对于我的 jsp 中生成的每个输入,我的控制台显示:

Parameter [sequence['df18df5e-31ca-457e-89c1-14c0ab84e25c']] didn't match acceptedPattern pattern!

所以我的 HashMap 为

4

1 回答 1

1

在 Struts 2 中,参数由Parameters Interceptor处理。

查看源代码,你会看到

public static final String ACCEPTED_PARAM_NAMES = "\\w+((\\.\\w+)|(\\[\\d+\\])|(\\(\\d+\\))|(\\['\\w+'\\])|(\\('\\w+'\\)))*";

这意味着它使用以下正则表达式来验证输入:

\w+(
    (\.\w+)     |
    (\[\d+\])   |
    (\(\d+\))   |
    (\['\w+'\]) |
    (\('\w+'\))
)*

在 Java中,

\w代表“单词字符”。它总是匹配 ASCII 字符[A-Za-z0-9_]

, 然后它接受 ASCII字母数字下划线,仅此而已。

哈希中间的减号

sequence['df18df5e-31ca-457e-89c1-14c0ab84e25c']

正在破坏正则表达式,导致参数不被接受。

解决方案是:创建一个正则表达式,它将接受括号内的减号,方法是扩展 the并在末尾\w添加 a :-

 \w+(
    (\.\w+)                 |
    (\[\d+\])               |
    (\(\d+\))               |
    (\['[A-Za-z0-9_\-]+'\]) |
    (\('[A-Za-z0-9_\-]+'\))
)*

在 Java 中是

"\w+((\.\w+)|(\[\d+\])|(\(\d+\))|(\['[A-Za-z0-9_\\-]+'\])|(\('[A-Za-z0-9_\\-]+'\)))*"

您现在要做的就是通过将自定义正则表达式作为参数传递给 Interceptor 来覆盖默认正则表达式(该示例使用约定插件,但使用 struts.xml 时相同):

@Action( value = "yourAction", 
         results = @Result( location = "/yourPage.jsp" ),
         interceptorRefs = @InterceptorRef ( 
                            value = "defaultStack", 
                           params = { "params.acceptParamNames", 
                                      "\w+((\.\w+)|(\[\d+\])|(\(\d+\))|(\['[A-Za-z0-9_\\-]+'\])|(\('[A-Za-z0-9_\\-]+'\)))*"
                                    }
                           )
       )
于 2014-02-12T14:52:33.393 回答