代码之家  ›  专栏  ›  技术社区  ›  MRalwasser

在请求周期之后引用请求参数映射是否可移植?

  •  2
  • MRalwasser  · 技术社区  · 14 年前

    我想知道它是否符合JavaServlet规范2.5以引用/保存 request.getParameterMap() 请求之间。

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

    退换商品 :不可变的 java.util.Map 包含参数名作为键 参数值作为映射值。参数映射中的键是

    但我不清楚:

    • 如果映射只对应用程序不可变,而对应用程序服务器不可变

    编辑: 原因是:

    3 回复  |  直到 14 年前
        1
  •  2
  •   BalusC    14 年前

    如果映射只对应用程序不可变,而对应用程序服务器不可变

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

    如果您想在会话期间收集每个请求的参数,那么您需要自己收集。最好的地方是 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);
    }
    
        2
  •  1
  •   Tassos Bassoukos    14 年前

    无论出于何种目的,都不能修改地图的内容。但是,如果您想保留以供将来参考,您可以始终创建自己的新映射,复制所有键/值对,并将其保留在会话f.e中(如果用户同时打开了两个窗口,则会引起有趣的事情,但该故事将用于另一个时间…)

        3
  •  0
  •   ZZ Coder    14 年前

        parameters = new HashMap();
        parameters = copyMap(getRequest().getParameterMap());
        mergeParameters();
        parsedParams = true;