Java和CGI - 如何从URL正确解析文件名和QUERY_STRING?

时间:2014-02-10 18:06:16

标签: java parsing cgi query-string filenames

在Java中,我希望能够解析URL以将其分解为文件名和QUERY_STRING。

到目前为止,我有以下代码:

if (line != null && !line.trim().equals("")) {
    StringTokenizer st = new StringTokenizer(line);
    if (st.nextToken().equals("GET") && st.hasMoreTokens()) {
        filename = st.nextToken();
        if (filename.startsWith("/")) {
            filename = filename.substring(1);
            if (st.nextToken().equals(".cgi?") && st.hasMoreTokens()) {
                queryString = st.nextToken();
            }
        }
    }
}

我特别想要做的是将URL分解为文件名和QUERY_STRING,因为我可以进行exec调用以使用正确的环境变量运行我的cgi文件。但是,我的解决方案在到达文件名后的问号之前不会终止文件名。有人可以帮我吗?

编辑:基本上,我想从HTTP请求中获取URL,并从URL获取文件名和QUERY_STRING

1 个答案:

答案 0 :(得分:0)

这是java servlet解析GET参数的方法

http://grepcode.com/file/repo1.maven.org/maven2/javax.servlet/servlet-api/2.5/javax/servlet/http/HttpUtils.java#HttpUtils.parseQueryString%28java.lang.String%29

static public Hashtable parseQueryString(String s) {

    String valArray[] = null;

    if (s == null) {
        throw new IllegalArgumentException();
    }
    Hashtable ht = new Hashtable();
    StringBuffer sb = new StringBuffer();
    StringTokenizer st = new StringTokenizer(s, "&");
    while (st.hasMoreTokens()) {
        String pair = (String)st.nextToken();
        int pos = pair.indexOf('=');
        if (pos == -1) {
        // XXX
        // should give more detail about the illegal argument
        throw new IllegalArgumentException();
        }
        String key = parseName(pair.substring(0, pos), sb);
        String val = parseName(pair.substring(pos+1, pair.length()), sb);
        if (ht.containsKey(key)) {
        String oldVals[] = (String []) ht.get(key);
        valArray = new String[oldVals.length + 1];
        for (int i = 0; i < oldVals.length; i++) 
            valArray[i] = oldVals[i];
        valArray[oldVals.length] = val;
        } else {
        valArray = new String[1];
        valArray[0] = val;
        }
        ht.put(key, valArray);
    }
    return ht;
    }

当然,由于此方法是公开的,您可能只想直接使用HttpUtils: - )

更新:对于其他低级别的http解析,我建议http://hc.apache.org/index.htmlhttp://www.java2s.com/Code/Java/Network-Protocol/HttpParser.htm