2

request.getParameterMap()リクエスト間の戻り値を参照/保存するために、Javaサーブレット仕様2.5に準拠しているかどうかを知りたいです。

最終仕様は203ページにのみ記載されています。

戻り値:キーとしてのパラメーター名とマップ値としてのパラメーター値を含む不変。java.util.MapパラメータマップのキーはString型です。パラメータマップの値は、String配列型です。

しかし、それは私には明らかではありません:

  • マップがアプリケーションサーバーに対してではなく、アプリケーションに対してのみ不変である場合

  • アプリケーションサーバーがインスタンスを別のリクエストに再利用できる場合(たとえば、パラメータとその値が前のリクエストと同じである場合)

編集: この理由:各リクエストのリクエストマップを保存し、エラーが発生した場合は診断目的でそれらを印刷したいと思います。

4

3 に答える 3

2

Map がアプリケーション サーバーではなく、アプリケーションに対してのみ不変である場合

はい、APIでは不変です。また、リクエスト パラメータ マップを変更する意味は何ですか? サーブレットコンテナの実装はもちろん、「舞台裏で」その変更可能なマップを保持できます。ただし、実装固有の詳細について心配する必要はありません。

アプリケーション サーバーが別のリクエストでインスタンスを再利用することが許可されている場合 (たとえば、パラメータとその値が前のリクエストと同じである場合)

いいえ、サーバーはそれを行いません。新しいものを作成するだけです。パラメータは特定のリクエストにバインドされます。

セッション中にすべてのリクエストのパラメーターを収集する場合は、自分で行う必要があります。これに最適な場所はFilter.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    HttpServletRequest hsr = (HttpServletRequest) request;
    List<Map<String, String[]>> allParameters = (List<Map<String, String[]>>) hsr.getSession().getAttribute("allParameters");
    if (allParameters == null) {
        allParameters = new ArrayList<Map<String,String[]>>();
        hsr.getSession().setAttribute("allParameters", allParameters);
    }
    allParameters.add(hsr.getParameterMap());
    chain.doFilter(request, response);
}
于 2010-08-02T15:03:29.590 に答える
1

すべての目的と目的のために、マップの内容を変更することはできません。ただし、将来の参照用に保持したい場合は、いつでも独自の新しいマップを作成し、すべてのキーと値のペアをコピーして、Session feに保持できます(ユーザーが2つのウィンドウを開いている場合はファンキーになります同時に、しかしその話はまた別の時間です...)

于 2010-07-28T13:28:29.433 に答える
0

次のリクエストのために安全に保存できると思います。私はいつもこれをします。

他の実装についてはよくわかりません。Tomcatのすべてのリクエストに対して新しいHashMapを作成します。

    parameters = new HashMap();
    parameters = copyMap(getRequest().getParameterMap());
    mergeParameters();
    parsedParams = true;
于 2010-07-28T13:27:20.140 に答える