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はnullです

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']

正規表現を壊しているため、パラメーターが受け入れられません。

解決策は次のとおりです: を展開して最後に\wa を追加することにより、括弧内のマイナス記号を受け入れる正規表現を作成します。-

 \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 に答える