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

HttpServletRequest.getParameterValues()中值的排序

  •  20
  • skaffman  · 技术社区  · 16 年前

    HttpServletRequest.getParameterValues() String[] 包含给定HTTP请求参数的所有值。有人知道这个数组中的值的顺序是否由规范保证与请求中传递这些值的顺序相同吗?

    x=1&x=2&x=3 是吗 放心 接受 String[] {"1", "2", "3"} 当我打电话的时候 getParameterValues()

    5 回复  |  直到 16 年前
        1
  •  15
  •   brabster    16 年前

    ServletRequest的javadoc( v2.5 javadoc )没有提到任何关于该方法的值的顺序。因此,我不指望秩序得到维护。


    更新:还检查了2.5的spec文档,包含以下与getParameterValues()相关的信息。它没有提到任何关于查询字符串排序的内容,因此我认为您看到的行为是实现细节,而不是定义为接口的一部分。

    参数存储为一组 名称-值对。多参数 任何给定的值都可以存在 参数名称。以下方法 ServletRequest接口的 可访问参数:

    • 获取参数
    • 获取参数名称

    getParameterValues方法返回 包含所有 参数名称。返回的值 从getParameter方法必须 字符串数组中的第一个值 getParameterMap方法返回 的参数的java.util.Map 参数值作为映射值。

    为了将来的参考,可以从 Sun, I mean Oracle's website . 您可以再次检查您感兴趣的特定servlet版本。

        2
  •  12
  •   yonran    15 年前

    是的,返回值的顺序 getParamterValues(String) 和条目 getParameterMap() 由Servlet规范保证。以下是文章:

    将post body聚合到 数据在正文前显示 使用a=hello的查询字符串生成 以及a=再见&a=世界,

    (这来自Servlet规范“请求”一章中的“HTTP协议参数”部分(版本2.4中的SRV.4.1,版本2.5中的SRV.3.1)

    那里 似乎是一个干净的方式得到的名字秩序( getParameterNames() getQueryString() getInputStream() getParameterValues(String) 得到它的命令。

    <form>
      <ul id=variables>
        <li>
          <input name=hello>hello
          <input type=hidden name=variableOrder value=hello>
        <li>
          <input name=world>world
          <input type=hidden name=variableOrder value=world>
      </ul>
    </form>
    <script src="jquery.js"></script>
    <script src="jquery-ui.js"></script>
    <script>
      jQuery('#variables').sortable().disableSelection();
    </script>
    
        3
  •  8
  •   BalusC    15 年前

    application/x-www-form-urlencoded 章节:

    2.控件名称/值按它们在文档中出现的顺序列出。

    String[] HashSet 先喜欢结构,或者做一个 Collections#shuffle() 字符串[] 之后

    我至少可以从经验中看出,Tomcat的做法是正确的,因此所有构建在Tomcat/Catalina之上的主要容器/应用服务器(ibmwebsphere、jbossas、sunglassfish等)也会这样做。我只是没有Weblogic的实际操作经验,但如果它以不同的方式处理它,我会感到惊讶(阅读:效率较低)。

    姓名 HashMap .


    摘要:参数收集在 HashMap<String, String[]> 哈希图 foo=bar1&foo=bar2&foo=bar3 )然而,由于 ,尽管在Servlet API中没有明确指定。

    为了安全起见,你应该使用不同的方法,例如。

    foos=3&foo[0]=bar1&foo[1]=bar2&foo[2]=bar3
    

    具有

    int foos = Integer.valueOf(request.getParameter("foos"));
    for (int i = 0; i < foos; i++) {
        int foo = Integer.valueOf(request.getParameter("foo[" + i + "]"));
    }
    
        4
  •  2
  •   Bragnikita    12 年前

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.util.Arrays;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    
    public class OrderedRequestMap extends LinkedHashMap<String,String[]> {
    
    private final String encoding;
    
    public OrderedRequestMap(InputStream httpBody, String encoding) throws IOException {
        this.encoding = encoding;
        fill(httpBody);
    }
    
    private void fill(InputStream is) throws IOException {
        final InputStreamReader reader = new InputStreamReader(is, "ASCII");
        int c;
        StringBuilder sb = new StringBuilder(1000);
        while ((c = reader.read()) != -1) {
            char ch = (char)c;
            if (ch == '&') {
                put(sb.toString());
                sb = new StringBuilder(1000);
            } else {
                sb.append(ch);
            }
        }
        put(sb.toString());
    }
    
    private void put(String parameter) throws UnsupportedEncodingException {
        String[] pair = parameter.split("=");
        if (pair.length == 0 )
            return;
        String key = URLDecoder.decode(pair[0], encoding);
        String val = EMPTY_STR;
        if (pair.length > 1)
            val = URLDecoder.decode(pair[1], encoding);
        String[] values = get(key);
        if (values == null)
            values = new String[]{val};
        else {
            values = Arrays.copyOf(values, values.length+1);
            values[values.length - 1] = val;
        }
        put(key, values);
    }
    
    
    private static final String EMPTY_STR = "";
    }
    

    像这样称呼它

    new OrderedRequestMap(request.getInputStream(), request.getCharacterEncoding());
    

        5
  •  0
  •   giri    16 年前

    它取决于HttpServletRequest接口的实现。

    推荐文章