如何在J2ME中解析URL

时间:2009-01-20 23:00:33

标签: java url parsing java-me

我正在尝试使用J2ME从URL中提取查询的名称 - 值对,但这并不容易。 J2ME没有java.net.URL类,String也没有split方法。

有没有办法使用J2ME从URL中提取名称 - 值对?任何开源实现都会受到欢迎。

7 个答案:

答案 0 :(得分:4)

我喜欢kchau回答,但我刚刚将数据结构从两个数组更改为一个Hashtable。如果URL参数的数量未知,这也将有所帮助。

    String url = "http://www.so.com?name1=value1&name2=value2&name3=value3";

    Hashtable values = new Hashtable();

    int s = url.indexOf("?");  
    int e = 0;

    while (s != -1) {
        e = url.indexOf("=", s);              
        String name = url.substring(s + 1, e);
        s = e + 1;                            
        e = url.indexOf("&", s);              

        if (e < 0) {
            values.put(name, url.substring(s, url.length()));
        } else {        
            values.put(name, url.substring(s, e));
        }

        s = e;
    }

    for (Enumeration num = values.keys(); num.hasMoreElements();) {
            String key = (String)num.nextElement();
            System.out.println(key + "  " + values.get(key));
    }

答案 1 :(得分:2)

这是我对它的抨击,与David的回答有些相似。

    String url = "http://www.stackoverflow.com?name1=value1&name2=value2&name3=value3";

    String[] names  = new String[10];
    String[] values = new String[10];

    int s = url.indexOf("?");  // Get start index of first name
    int e = 0, idx = 0;

    while (s != -1) {
        e = url.indexOf("=", s);              // Get end index of name string
        names[idx] = url.substring(s+1, e);
        s = e + 1;                            // Get start index of value string
        e = url.indexOf("&", s);              // Get index of next pair

        if (e < 0)  // Last pair
            values[idx] = url.substring(s, url.length());
        else        // o.w. keep storing
            values[idx] = url.substring(s, e);

        s = e;
        idx++;
    }

    for(int x = 0; x < 10; x++)
        System.out.println(names[x] +" = "+ values[x]);

经过测试,我认为它有效。希望它有所帮助,祝你好运。

答案 2 :(得分:2)

由于Java JDK是开源的,您还可以从主JDK借用java URL类并将其添加到项目中。这将允许您使用Java SE中的相同实现:

http://www.docjar.com/html/api/java/net/URL.java.html

答案 3 :(得分:1)

在我的头顶,它会像这样(警告:未经测试):

String url = ...;
int s = url.indexOf("?") + 1;
while (s > 0) {
    int e = url.indexOf("=", s);
    String name = url.substring(s, e), value;
    s = e + 1;
    e = url.indexOf("&", s);
    if (e < 0)
        value = url.substring(s, e);
    else
        value = url.substring(s, e);
    // process name, value
    s = e;
}

查询字符串在技术上可以用分号而不是&符号分隔,例如name1=value1;name2=value2;...,尽管我从未在实践中看到它。如果这是你的问题,我相信你可以为它修好代码。

答案 4 :(得分:1)

有一个没有java.net.URL的J2ME实现? 它是Connected Device ConfigurationFoundation ProfilePersonal Basis ProfilePersonal Profile ...

的一部分

编辑:对于记录,这些是CDC 1.1.2链接,但根据JSR36,CDC 1.0也有一个java.net.URL类。

答案 5 :(得分:1)

另外,请注意,url params是URL编码的,所以你可能需要先解码它们(如何做到这是另一个问题)

我以这种方式得到参数:


public String getUrlParam(String url, String param)
{
    int startIndex = url.indexOf(""+param+"=");
    if (startIndex == -1)
        return null;
    int length = (""+param+"=").length();
    int endIndex = url.indexOf("&", startIndex+length);
    if (endIndex == -1)
        endIndex = url.length();
    return URLDecode(url.substring(startIndex+length, endIndex));
}

答案 6 :(得分:-1)

URL编码器/解码器非常简单易读。您还可以在Internet上查找任何开源HTML到WML转码器代码并进行修改。不应该太难。