Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在J2ME中解析URL_Java_Url_Parsing_Java Me - Fatal编程技术网

Java 如何在J2ME中解析URL

Java 如何在J2ME中解析URL,java,url,parsing,java-me,Java,Url,Parsing,Java Me,我试图使用J2ME从URL中提取查询的名称-值对,但这并不容易。J2ME没有java.net.URL类,String也没有split方法 有没有一种方法可以使用J2ME从URL提取名称-值对?任何开源实现都是受欢迎的。URL编码器/解码器非常简单且易于编写。您还可以在internet上查找任何开源HTML到WML转码器代码并对其进行修改。不应该太难。在我脑海中,它会是这样的(警告:未经测试): stringurl=。。。; ints=url.indexOf(“?”)+1; 而(s>0){ int

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


有没有一种方法可以使用J2ME从URL提取名称-值对?任何开源实现都是受欢迎的。

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

在我脑海中,它会是这样的(警告:未经测试):

stringurl=。。。;
ints=url.indexOf(“?”)+1;
而(s>0){
int e=url.indexOf(“=”,s);
字符串名称=url.substring(s,e),值;
s=e+1;
e=url.indexOf(“&”,s);
if(e<0)
value=url.substring(s,e);
其他的
value=url.substring(s,e);
//进程名称、值
s=e;
}

从技术上讲,查询字符串可以用分号而不是符号分隔,比如
name1=value1;名称2=值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]);
stringurl=”http://www.stackoverflow.com?name1=value1&name2=value2&name3=value3";
字符串[]名称=新字符串[10];
字符串[]值=新字符串[10];
int s=url.indexOf(“?”);//获取名字的开始索引
int e=0,idx=0;
而(s!=-1){
e=url.indexOf(“=”,s);//获取名称字符串的结束索引
names[idx]=url.substring(s+1,e);
s=e+1;//获取值字符串的开始索引
e=url.indexOf(&),s);//获取下一对的索引
if(e<0)//最后一对
值[idx]=url.substring(s,url.length());
否则//o.w.继续储存
值[idx]=url.substring(s,e);
s=e;
idx++;
}
对于(int x=0;x<10;x++)
System.out.println(名称[x]+“=”+值[x]);
测试过了,我认为它是有效的。希望有帮助,祝你好运。

我喜欢这个答案,但我只是将数据结构从两个数组更改为一个哈希表。如果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));
    }
stringurl=”http://www.so.com?name1=value1&name2=value2&name3=value3";
哈希表值=新哈希表();
int s=url.indexOf(“?”);
int e=0;
而(s!=-1){
e=url.indexOf(“=”,s);
String name=url.substring(s+1,e);
s=e+1;
e=url.indexOf(“&”,s);
if(e<0){
value.put(name,url.substring(s,url.length());
}否则{
value.put(名称、url.substring(s、e));
}
s=e;
}
for(枚举num=values.keys();num.hasMoreElements();){
字符串键=(字符串)num.nextElement();
System.out.println(key+“”+values.get(key));
}

有一个J2ME实现没有java.net.URL? 它是、、和


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

另外,请注意,URL参数是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));
}

因为javajdk是开源的,所以您也可以从主JDK借用javaurl类并将其添加到您的项目中。这将允许您使用来自Java SE的相同实现:


我认为有一个小问题,当您迭代循环时,名称和值字符串不会被覆盖吗?对不起,我错过了您在那里的评论。我可能错了,但我认为CDC 1.1.2在野外不太常见。CDC1.1缺少那些JSR,AFAICT。根据JSR36(),CDC1.0也有一个java.net.URL类。CDC并没有广泛传播,大多数现代J2ME实现只支持CLDC1.1,还有很多CLDC1.0手机。啊,好的。我本以为制造商会避免使用名称有限的东西,但我不是制造商。如果您要自己实现它,请确保您考虑编码字符。stackoverflow充满了这个问题的半成品错误答案。不过哈希表是不对的;必须允许使用相同名称的多个参数。name1=value1&name1=value2完全有效。你想要更像番石榴的多重地图。

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));
}