1

在使用 History/Activity/Places api 的 GWT 中,您最终会得到这样的 url

http://192.168.0.104:8888/brokerage.html?gwt.codesvr=192.168.0.104:9997#StartPlace参数

其中 params 一词是可以将参数传递到 StartPlace 对象的“令牌”位置。对于我的大多数应用程序来说,一个字符串就足以重新加载我的数据并按下刷新。但是,在一些活动/地点/页面上,我需要将该地点标记拆分为多个名称/值对。

有人对如何处理这个有建议吗?我目前正在编写一个类,该类通过使用 &name=value 以 url 方式分隔名称/值对来构建字符串。如果有人知道可以处理这个或其他东西的类,那就太好了。

4

3 回答 3

3

如何简单地复制/粘贴代码Window.Location用于解析(私有方法buildListParamMap;您也可以使用 JSNI 调用它——它允许绕过 Java 可见性——因为它是一个没有状态的静态方法)和UrlBuilder.buildString序列化?

于 2011-09-01T16:30:34.087 回答
1
String parameters="name1=value1&name2=value2&name3=value3";

HashMap<String, String> parameterMap = new HashMap<String, String>();

String[] parameterPairs = parameters.split("&");

for (int i = 0; i < parameterPairs.length; i++) {
    String[] nameAndValue = parameterPairs[i].split("=");
    parameterMap.put(nameAndValue[0], nameAndValue[1]);
}

……

String name1Value = parameterMap.get("name1");

这都是未经测试的代码,并且它具有未经检查的数组边界!确保没有多余的 '&' 或 '=' 符号,因为它们会弄乱解析。

于 2011-08-31T17:17:21.607 回答
1

这是我想出的,它应该适用于其他人。使用哈希映射是个好主意,我将修改我的代码。

public static String parseNamedParam(String name, String token) {
    if (name == null || "".equals(name) || token == null || "".equals(token)) {
        return null;
    }
    final String[] strNameValuePairs = token.split("&");
    for (String entry : strNameValuePairs) {
        final String[] strNameValuePair = entry.split("=");
        final String decodedName = URL.decodeQueryString(strNameValuePair[0]);
        if (decodedName.equals(name)) {
            return URL.decodeQueryString(strNameValuePair[1]);
        }
    }
    return "";
}

public static String generateTokenString(List<TokenParam> tokenParams) {
    if (tokenParams == null || tokenParams.isEmpty()) {
        return "";
    }
    final StringBuilder sb = new StringBuilder();
    for (int i = 0; i < tokenParams.size(); i++) {
        final TokenParam tokenParam = tokenParams.get(i);
        final String nameEncoded = URL.encodeQueryString(tokenParam.getName());
        final String valueEncoded = URL.encodeQueryString(tokenParam.getValue());
        if (i != 0) {
            sb.append("&");
        }
        sb.append(nameEncoded);
        sb.append("=");
        sb.append(valueEncoded);
    }
    return sb.toString();
}
于 2011-08-31T17:40:37.727 回答