Query String Manipulation in Java

前端 未结 5 1458
攒了一身酷
攒了一身酷 2020-11-29 10:12

Does anyone have, or know of, a java class that I can use to manipulate query strings?

Essentially I\'d like a class that I can simply give a query string to and the

5条回答
  •  囚心锁ツ
    2020-11-29 10:44

    If you are using J2EE, you can use ServletRequest.getParameterValues().

    Otherwise, I don't think Java has any common classes for query string handling. Writing your own shouldn't be too hard, though there are certain tricky edge cases, such as realizing that technically the same key may appear more than once in the query string.

    One implementation might look like:

    import java.util.*;
    import java.net.URLEncoder;
    import java.net.URLDecoder;
    
    public class QueryParams {
    private static class KVP {
        final String key;
        final String value;
        KVP (String key, String value) {
            this.key = key;
            this.value = value;
        }
    }
    
    List query = new ArrayList();
    
    public QueryParams(String queryString) {
        parse(queryString);
    }
    
    public QueryParams() {
    }
    
    public void addParam(String key, String value) {
        if (key == null || value == null)
            throw new NullPointerException("null parameter key or value");
        query.add(new KVP(key, value));
    }
    
    private void parse(String queryString) {
        for (String pair : queryString.split("&")) {
            int eq = pair.indexOf("=");
            if (eq < 0) {
                // key with no value
                addParam(URLDecoder.decode(pair), "");
            } else {
                // key=value
                String key = URLDecoder.decode(pair.substring(0, eq));
                String value = URLDecoder.decode(pair.substring(eq + 1));
                query.add(new KVP(key, value));
            }
        }
    }
    
    public String toQueryString() {
        StringBuilder sb = new StringBuilder();
        for (KVP kvp : query) {
            if (sb.length() > 0) {
                sb.append('&');
            }
            sb.append(URLEncoder.encode(kvp.key));
            if (!kvp.value.equals("")) {
                sb.append('=');
                sb.append(URLEncoder.encode(kvp.value));
            }
        }
        return sb.toString();
    }
    
    public String getParameter(String key) {
        for (KVP kvp : query) {
            if (kvp.key.equals(key)) {
                return kvp.value;
            }
        }
        return null;
    }
    
    public List getParameterValues(String key) {
        List list = new LinkedList();
        for (KVP kvp : query) {
            if (kvp.key.equals(key)) {
                list.add(kvp.value);
            }
        }
        return list;
    }
    
    public static void main(String[] args) {
        QueryParams qp = new QueryParams("k1=v1&k2&k3=v3&k1=v4&k1&k5=hello+%22world");
        System.out.println("getParameter:");
        String[] keys = new String[] { "k1", "k2", "k3", "k5" };
        for (String key : keys) {
            System.out.println(key + ": " + qp.getParameter(key));
        }
        System.out.println("getParameters(k1): " + qp.getParameterValues("k1"));
    }
    }
    

提交回复
热议问题