在GWT Activitie的位置令牌的令牌中编码名称/值对的建议方法

时间:2011-08-31 16:26:26

标签: gwt gwt-mvp gwt-activities

在GWT中使用历史/活动/地点apis,你最终会得到像这样的网址

http://192.168.0.104:8888/brokerage.html?gwt.codesvr=192.168.0.104:9997#StartPlace:的 PARAMS

其中,params这个词是“token”,其中参数可以传递给StartPlace对象。对于我的大多数应用程序,单个字符串足以重新加载我刷新的数据。在一些活动/地点/页面上,我需要将该地方标记拆分为多个名称/值对。

有没有人建议如何处理这个问题?我目前正在编写一个类,通过使用& name = value以url方式分隔它们来构建名称/值对的字符串。如果有人知道一个可以处理这个或类似事情的课程,那就太棒了。

3 个答案:

答案 0 :(得分:3)

如何简单地复制/粘贴来自Window.Location的代码进行解析(私有方法buildListParamMap;您也可以使用JSNI调用它 - 它允许绕过Java可见性 - 假设它是一个静态方法没有),而UrlBuilder.buildString用于序列化?

答案 1 :(得分: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");

这是所有未经测试的代码,它取消选中数组边界!确保你没有无关的'&amp;'或'='符号,因为它们会搞乱解析。

答案 2 :(得分: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();
}