2

我想知道它是否符合java servlet规范2.5以在请求之间引用/保存返回值request.getParameterMap()在请求周期之后引用请求参数映射是否便携?

最终规范仅在203页指出:

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

但它不是我清楚:

  • 如果地图仅仅是不可变的应用程序,而不是应用程序服务器

  • ,如果它允许应用程序服务器可能会重新 - 使用另一个请求的实例(例如,如果参数及其值与前一个请求中的值相同)

编辑: 这样做的原因: 我想保存每个请求的请求映射,并在出现错误的情况下打印出来用于诊断目的。

+0

这是一个设计的气味。请详细说明功能要求:)有可能比这更好的解决方案。 – BalusC 2010-07-28 16:00:53

+0

@BalusC:我想保存每个请求的请求地图,和在发生错误的情况下,我想打印出用于诊断目的的每个参数映射(以及其他内容)。 – MRalwasser 2010-07-28 22:25:33

回答

2

如果地图仅仅是不可变的应用程序,而不是应用程序服务器

它在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); 
} 
0

我想你可以安全地保存下一个请求。我一直这样做。

不确定其他实现。它为Tomcat中的每个请求创建一个新的HashMap,

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

你的代码的前两行很奇怪。首先你初始化一个变量,然后你立即重新分配一些东西?这不可能是你的意思... – 2010-07-28 13:47:33

+0

代码来自Tomcat。如果在copyMap()中使用了参数,但它没有使用它可能会很有用。 – 2010-07-28 14:30:16

1

对于所有意图和目的,您不能修改地图的内容。但是,如果您想保留以供将来参考,则始终可以创建自己的新映射,复制所有键/值对,并将其保留在Session f.e.中。 (这将导致funkiness如果用户有2个窗口同时开放,但这个故事是另一个时间...)

+0

这就是我现在要做的安全。但是,当然,效率比直接使用实例要低。这就是我为什么问这个问题的意图。 – MRalwasser 2010-08-01 10:54:49