当前位置: 首页 > 知识库问答 >
问题:

GWT:格式错误的URI序列

封梓
2023-03-14

我使用的是GWT2.5.1。我在我的项目中有一个小要求。我们在项目中支持本地化。如果用户输入了无效的语言环境(即除支持的语言外的其他语言),则默认情况下,我们将以英语显示。因此,为了从url获取locale参数,我使用了方法com.google.gwt。使用者客户窗地方getParameterMap()。如果用户输入“%”特殊字符作为区域设置参数,则getParameterMap()将引发异常,即:

com.google.gwt.core.client.JavaScriptException: (URIError) @com.google.gwt.http.client.URL::decodeQueryStringImpl(Ljava/lang/String;)([string: '%']): malformed URI sequence
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:249)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.http.client.URL.decodeQueryStringImpl(URL.java)
    at com.google.gwt.http.client.URL.decodeQueryString(URL.java:117)
    at com.google.gwt.user.client.Window$Location.buildListParamMap(Window.java:310)
    at com.google.gwt.user.client.Window$Location.ensureListParameterMap(Window.java:327)
    at com.google.gwt.user.client.Window$Location.getParameterMap(Window.java:230)
    at srdm.cloud.client.sso.WebUISession.checkSession(WebUISession.java:283)
    at srdm.cloud.client.WebUI.onModuleLoad(WebUI.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:406)
    at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:200)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:526)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
    at java.lang.Thread.run(Thread.java:744)

那么,现在我如何通过忽略特殊字符从url获取locale参数呢?

共有1个答案

岳俊雅
2023-03-14

我建议您在GWT项目本地化中阅读并使用GWT国际化和i18n消息。在模块中添加以下区域设置声明。xml文件

<extend-property name="locale" values="en"/>
<extend-property name="locale" values="ja"/>
<!-- below is default -->
<set-property-fallback name="locale" value="ja"/>

(英语为en,日本为ja)

如何获取客户端的可用语言环境?如何获取当前本地?如何保存客户端的首选语言环境?下面是初始化本地列表框的片段。根据需要展开。

public static void initializeLocaleBox(final ListBox localeBox) {
    String currentLocale = LocaleInfo.getCurrentLocale().getLocaleName();
    if (currentLocale.equals("default")) {
        currentLocale = "ja";
    }
    String[] localeNames = LocaleInfo.getAvailableLocaleNames();
    for (String localeName : localeNames) {
        if (!localeName.equals("default")) {
            String nativeName = LocaleInfo.getLocaleNativeDisplayName(localeName);
            localeBox.addItem(nativeName, localeName);
            if (localeName.equals(currentLocale)) {
                localeBox.setSelectedIndex(localeBox.getItemCount() - 1);
            }
        }
    }
    localeBox.addChangeHandler(new ChangeHandler() {
        public void onChange(final ChangeEvent event) {
            String localeName = localeBox.getValue(localeBox.getSelectedIndex());

            Date now = new Date();
            long sevenDays = now.getTime();
            // seven days
            sevenDays = sevenDays + (1000 * 60 * 60 * 24 * 7);
            now.setTime(sevenDays);
            Cookies.setCookie("locale", localeName, now);
            UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", localeName);
            Window.Location.replace(builder.buildString());
        }
    });
}

检查客户端的区域设置

public static boolean isLocaleJapan() {
    String currentLocale = LocaleInfo.getCurrentLocale().getLocaleName();
    return currentLocale != null && currentLocale.equals("ja") ? true : false;
}
public static boolean isLocaleEnglish() {
    String currentLocale = LocaleInfo.getCurrentLocale().getLocaleName();
    return currentLocale != null && currentLocale.equals("en") ? true : false;
}
 类似资料:
  • 我在resygwt上使用API进行了基于REST的服务,如下所示: 我收到此请求的“格式错误的URI序列”: 这很奇怪,因为在JavaDoc中提到,默认情况下应该支持这样的请求: 将HTTP查询参数的值绑定到资源方法参数, 资源类字段或资源类bean属性 值是URL解码的,除非使用{@link-Encoded}禁用此功能 注释。可以使用{@link DefaultValue}指定默认值 注释 我尝

  • 问题内容: 如何在GWT中格式化我的字符串? 我做了一个方法 但它抱怨说 不包括格式化程序吗? 问题答案: 更新:在进一步查看此答案之前,请先查看(并投票)约瑟夫·卢斯特的帖子。 看起来这篇文章没有包含格式化器。但是,他们提出了一些替代方案。

  • 我试图使用RPC连接到我的M12 CordaApp并调用nodeIdentity()方法,我得到了org。bouncycastle。cert.CertIOException证书。我认为Java客户端代码可以工作,我可以看到RPC连接,当我尝试调用getProtocolVersion()时,我看到的是正确的协议版本。 以下是调用nodeIdentity()时的堆栈跟踪: 看起来X509证书序列化有问

  • 在将配置单元外部表从RC格式升级为ORC格式并在其上运行MSCK修复表(当我确实从表中选择全部时)时,我得到以下错误- 将RC格式的历史数据迁移到ORC格式的新定义的过程是什么?

  • 我是漏掉了什么,还是一个虫子?

  • 问题内容: 目前,我正在开发一项功能,该功能涉及解析从另一产品收到的XML。我决定对一些实际的客户数据进行一些测试,看起来其他产品正在允许来自用户的输入被认为是无效的。无论如何,我仍然必须尝试找出一种解析它的方法。我们正在使用,但输入出现错误,如下所示。 如你所知,说明中包含似乎是无效标签的内容。现在,此描述标签被称为是叶子标签,并且其中不应包含任何嵌套标签。无论如何,这仍然是一个问题,并且会在