0

私のアプリケーションでは、リクエストのパラメーターを抽出し、クエリ文字列に出現する順序でコレクションに入れる必要があります。

たとえば、送信者が次のリクエストを行った場合、

http://myapp.com/myrequest?param3=value3¶m2=value2¶m1=value1

要素が次の順序で配置されるコレクションを生成する必要があります: param3、param2、param1。

これを実現するために、まず以下に示す方法を使用してパラメーターの名前を抽出しgetParameterNamesます。

private List<String> getParameterNames(HttpServletRequest aRequest) 
  throws IOException {
    final List<String> parameterNames = new LinkedList<>();
    final BufferedReader reader = aRequest.getReader();
    final String queryString = IOUtils.toString(reader);

    final String[] parameterValuePairs = queryString.split("&");

    for (String parameterValuePair : parameterValuePairs) {
        final String[] nameValueArray = parameterValuePair.split("=");

        parameterNames.add(nameValueArray[0]);
    }
    return parameterNames;
}

問題: このメソッドの呼び出し後、パラメータ名aRequest.getParameterValue(...)が返されます。null

それ以外の場合-最初にパラメーターマップを保存してから呼び出すgetParameterNamesと、その結果はnullになります。

final Map<String,String[]> parameterMap = aRequest.getParameterMap();
final List<String> parameterNames = getParameterNames(aRequest);

私は次のことを試しました:

  1. reader.close()が呼び出されていないことを確認してくださいgetParameterNames(他の場所では、これが問題を引き起こす可能性があることを読んでいます)。
  2. 呼び出しreader.reset()ます。

これはどれも役に立ちませんでした。

からパラメータと値のペアのリストを取得するにはどうすればよいHttpServletRequestですか?

4

1 に答える 1

0

Reader最初のアプローチでは、パラメーターを取得するために使用する必要はありません。代わりに次のようにします。

final List<String> parameterNames = new LinkedList<>();
final String queryString = query.getQueryString(); // get query string from query itself
// rest of your code stays unchanged

うまくいかなかった理由は、リクエスト入力ストリームからのデータが一度しか読み取れないためです。

または、私が間違っていてそうでない場合は、パラメーターとその値をLinkedHashMapに保存できます。

final LinkedHashMap<String, String> parameterValues = new LinkedHashMap<>();
final BufferedReader reader = aRequest.getReader();
final String queryString = IOUtils.toString(reader);

final String[] parameterValuePairs = queryString.split("&");

for (String parameterValuePair : parameterValuePairs) {
    final String[] nameValueArray = parameterValuePair.split("=");
    parameterValues.put(nameValueArray[0], nameValueArray[1]);
}

parameterValuesこれでエントリが出現順にソートされたマップになりました。

于 2013-10-01T14:29:28.520 に答える