2

我想知道它是否符合 java servlet 规范 2.5 来引用/保存request.getParameterMap()请求之间的返回值。

最终规范仅在第 203 页声明:

返回:一个不可变java.util.Map的,包含作为键的参数名称和作为映射值的参数值。参数映射中的键是字符串类型。参数映射中的值是字符串数组类型。

但我不清楚:

  • 如果 Map 仅对应用程序不可变,对应用程序服务器不可变

  • 如果允许应用服务器可以将实例重用于另一个请求(例如,如果参数及其值与前一个请求中的相同)

编辑: 原因:我想保存每个请求的请求映射,并在出现错误时将它们打印出来以进行诊断。

4

3 回答 3

2

如果 Map 仅对应用程序不可变,对应用程序服务器不可变

它在 API 中是不可变的,是的。也有道理,改请求参数映射有什么意义呢?servletcontainer 实现当然可以在“幕后”持有它的可变映射。但是你不应该担心实现的具体细节。

如果允许应用服务器可以将实例重用于另一个请求(例如,如果参数及其值与前一个请求中的相同)

不,服务器不这样做。它只是创建一个新的。参数绑定到特定请求。

如果您想在会话期间收集每个请求的参数,那么您需要自己执行此操作。最好的地方是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 回答