Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GWT历史传递参数?_Java_Gwt_History_Url Encoding_Gwt History - Fatal编程技术网

Java 使用GWT历史传递参数?

Java 使用GWT历史传递参数?,java,gwt,history,url-encoding,gwt-history,Java,Gwt,History,Url Encoding,Gwt History,我有一个叫Orders的页面和一个叫OrderDetails的页面。如《卓越》中所述,我正在使用历史记录(使用一个中心ValueChangeListener)和一个“事件总线”HandlerManager 我为某人单击订单的事件注册了一个处理程序,它基本上创建OrderDetailPresenter,传入订单ID(包含在ShowOrderDetailEvent中),然后调用History.newItem(“orderDetails”) 这有两个主要缺点:这个新创建的历史步骤不知道传入了哪个订单I

我有一个叫Orders的页面和一个叫OrderDetails的页面。如《卓越》中所述,我正在使用历史记录(使用一个中心ValueChangeListener)和一个“事件总线”HandlerManager

我为某人单击订单的事件注册了一个处理程序,它基本上创建OrderDetailPresenter,传入订单ID(包含在ShowOrderDetailEvent中),然后调用
History.newItem(“orderDetails”)

这有两个主要缺点:这个新创建的历史步骤不知道传入了哪个订单ID。因此,例如,如果有人将订单详细信息页面添加到书签中(或在浏览器中返回然后前进),他们将得到一个没有订单详细信息的空页面


因此,我的问题是:我是否应该改为像
History.newItem(“orderDetails?id=“+id)
,然后在我的值更改侦听器中解析历史标记?如果是这样的话,是否有一个最佳实践、API或库可以用这种方式将参数解析和格式化为字符串?

是的,这就是您应该做的。据我所知,没有图书馆可以让这更容易


不过有一点建议:如果可能的话,应该避免使用要求在历史记录项字符串中使用百分比转义的方案。原因是当
location.href
#3C@%40
结尾时,
location.hash
返回的内容因浏览器而异。例如,Chrome返回
#%3C@%40
;Firefox返回
#实际上GWT考虑了浏览器之间的差异。它甚至可以解决这里没有提到的一些不同的问题。因此,您可以使用上述任何字符。如果您想检查这一点,只需查看
gwt user.jar
(gwt 2.0)文件中的
com.google.gwt.user.client.impl.HistoryImpl
类。它也会进行反编码,这样你就可以传入
@
,它会处理好的。听起来很棒。我确实注意到GMail也有同样的功能,例如,如果我点击一个标签,那么URL就会变成“…#inbox/labelname”。但是,它们对标签名称进行URL编码,所以我对URL.encode和URL.decode也进行了同样的处理,只是为了完整。如果您使用
History.newItem(..)
您不应该解码/编码,因为GWT已经为您完成了这项工作。事实上,如果你这么做,可能会导致Firefox出现上述问题。希尔布兰德:我承认这是理论,但我也要指出,在GWT中处理历史标记中的url编码时,我们发现了很多痛苦。公平地说,我认为在一个浏览器中始终保持一致,但我们想做的一件事是生成指向应用程序特定部分的超链接,这些部分可以被任何浏览器使用。我们无法始终如一地做到这一点——在Chrome中工作的链接在Firefox中不起作用,反之亦然。我们最终只是改变了编码方案,远离任何可能最终被URL编码的东西。