【发布时间】:2009-01-20 23:00:32
【问题描述】:
我正在尝试使用 J2ME 从 URL 中提取查询的名称-值对,但这并不容易。 J2ME 没有 java.net.URL 类,String 也没有 split 方法。
有没有办法使用 J2ME 从 URL 中提取名称-值对?也欢迎任何开源实现。
【问题讨论】:
-
如果您要自己实现编码字符,请确保考虑到编码字符。
我正在尝试使用 J2ME 从 URL 中提取查询的名称-值对,但这并不容易。 J2ME 没有 java.net.URL 类,String 也没有 split 方法。
有没有办法使用 J2ME 从 URL 中提取名称-值对?也欢迎任何开源实现。
【问题讨论】:
我喜欢kchau 的回答,但我只是将数据结构从两个数组更改为一个哈希表。如果 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));
}
【讨论】:
这是我的尝试,与大卫的回答有些相似。
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]);
测试过,我认为它有效。希望对你有帮助,祝你好运。
【讨论】:
由于 Java JDK 是开源的,您还可以从主 JDK 中借用 java URL 类并将其添加到您的项目中。这将允许您使用 Java SE 中的相同实现:
【讨论】:
在我的脑海中,它会变成这样(警告:未经测试):
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;...,尽管我在实践中从未见过这样做。如果您对此感到担心,我相信您可以修复它的代码。
【讨论】:
有没有 java.net.URL 的 J2ME 实现? 它是Connected Device Configuration、Foundation Profile、Personal Basis Profile 和 Personal Profile 的一部分...
编辑:为了记录,这些是 CDC 1.1.2 链接,但根据JSR36,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));
}
【讨论】:
URL 编码器/解码器非常简单且易于编写。您还可以在 Internet 上查找任何开源 HTML 到 WML 转码器代码并对其进行修改。应该不会太难。
【讨论】: