【问题标题】:Associative array request parameter parsing with Java Servlet使用 Java Servlet 解析关联数组请求参数
【发布时间】:2011-08-06 13:53:38
【问题描述】:

是否可以使用 Java servlet API 解析来自此类请求的字符串键?

http://localhost:8080/?assocArray[key1]=value1&assocArray[key2]=value2&assocArray[key3]=value3

getParameterValues("assocArray") returns ["value3","value1","value1"]

返回数组中值的顺序不是键的顺序(没关系)

已解决:有可能,键被解释为简单的全局键字符串。 Java 不将它们识别为数组。使用正则表达式

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    同一个参数名可能有多个值:

    http://localhost:8080/?param1=value1&param1=value2&param1=value3
    

    在这种情况下,getParameterValues("param1") 将返回一个包含 3 个元素的 String[]"value1""value2""value3"

    在您给出的示例中,您定义了 3 个不同的参数:assocArray[key1]assocArray[key2]assocArray[key3]。 servlet API 会将它们视为 3 个完全不同的参数,它们没有任何共同之处。因此,您必须调用getParameter("assocArray[key1]") 来获取"value1"getParameter("assocArray[key2]") 来获取"value2",等等。

    【讨论】:

      【解决方案2】:

      不直接。 [] 在 HTTP 请求参数中没有特殊含义,并且被 Servlet API 识别为数组键(您可能是一个 PHP 程序员,确实有一个专有的解析器?)。您需要自己循环解析和收集它。

      例如,

      Map<String, String> assocArray = new LinkedHashMap<String, String>();
      
      for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
          String name = entry.getKey();
      
          if (name.startsWith("assocArray[")) {
              String key = name.substring(name.indexOf('[') + 1, name.indexOf(']')); 
              assocArray.put(key, entry.getValue()[0]);
          }
      }
      

      【讨论】:

        【解决方案3】:

        不可能,AFAIK。 http协议只指定key&value,没有key[key]=value

        按索引使用字符串数组 - values[0]values[1] 等。

        你可以做一些预处理——使用request.getParameterMap(..),自己解析foo[bar]语法,然后把它放在Map&lt;String, String&gt;

        【讨论】:

          【解决方案4】:

          已解决:有可能,键被解释为简单的全局键字符串。 Java 不将它们识别为数组。使用正则表达式

          Java 不会将它们识别为数组的(元素),因为 URL / URI 规范没有说它们代表数组。您不应该期望Java(或其他)库来实现您基本上是凭空提出的自定义语法。

          使用正则表达式解析输入通常是个坏主意。对于(完整的)URL,这是一个坏主意,因为 URL 可以通过多种棘手的方式进行编码,而正则表达式很难考虑到这一点。

          (如果您使用正则表达式来拆分单个请求参数,则应该没问题,因为 Servlet 基础架构已经处理了主要的 URL 解析和 %-encoding 等)


          我还想指出,您的查询字符串语法很脆弱。您正在使用 '[' 和 ']' 字符而不转义它们。根据 URL / URI 规范,它们是“保留字符”,在用作“数据”时应该被转义。在大多数情况下,您可能会侥幸成功,但要求严格符合 URI 的应用程序会拒绝您的 URL。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-16
            • 2021-01-18
            • 1970-01-01
            • 2013-10-18
            • 2015-09-16
            • 2019-06-04
            • 1970-01-01
            相关资源
            最近更新 更多