Ordering of values in HttpServletRequest.getParameterValues()

后端 未结 5 1680
日久生厌
日久生厌 2020-12-03 01:31

HttpServletRequest.getParameterValues() returns a String[] containing all values of a given HTTP request parameter. Does anyone know if the order o

5条回答
  •  误落风尘
    2020-12-03 02:05

    I've got a problem to extract param-value map from HttpServletRequest in order in accordance with elements on the JSP. I wrote an OrderedRequestMap that parsers an application/x-www-form-urlencoded POST request body.

    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 {
    
    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 = "";
    }
    

    And call it like this

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

    Hope, it helps.

提交回复
热议问题