【问题标题】:How To Parse a URL in J2ME如何在 J2ME 中解析 URL
【发布时间】:2009-01-20 23:00:32
【问题描述】:

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

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

【问题讨论】:

  • 如果您要自己实现编码字符,请确保考虑到编码字符。

标签: java url parsing java-me


【解决方案1】:

我喜欢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));
    }

【讨论】:

  • 哈希表 是不对的;您必须允许多个具有相同名称的参数。 name1=value1&name1=value2 是完全有效的。你想要更像 Guava 的 Multimap 的东西。
【解决方案2】:

这是我的尝试,与大卫的回答有些相似。

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      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;...,尽管我在实践中从未见过这样做。如果您对此感到担心,我相信您可以修复它的代码。

      【讨论】:

      • 我认为有一个小问题,当您遍历循环时,名称和值字符串不会被覆盖吗?
      • 对不起,我错过了你在里面的评论。
      【解决方案5】:

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

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

      【讨论】:

      • 我可能是错的,但我认为 CDC 1.1.2 在野外很难找到。 CDC 1.1 缺少那些 JSR,AFAICT。
      • 根据 JSR 36 (jcp.org/aboutJava/communityprocess/mrel/jsr036),CDC 1.0 也有一个 java.net.URL 类。
      • CDC 没有广泛传播,大多数现代 J2ME 实现只支持 CLDC 1.1,还有很多 CLDC 1.0 手机。
      • 啊,好的。我原以为制造商会避免使用名称中带有 Limited 的东西,但我不是制造商。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • stackoverflow 充满了对这个问题的半生不熟的错误答案。
        猜你喜欢
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多