使用GWT历史记录传递参数?

时间:2010-02-25 13:40:56

标签: java gwt history url-encoding gwt-history

我有一个名为Orders的页面和一个名为OrderDetails的页面。正如优秀的MVP tutorial中描述的那样,我正在使用History(使用中心ValueChangeListener)和“事件总线”HandlerManager。

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

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

所以我的问题是:我应该做一些类似History.newItem("orderDetails?id="+id)的事情,然后在我的值更改侦听器中解析历史记录吗?如果是这样,是否有最佳实践,API或库用于以这种方式将参数解析并格式化为字符串?

1 个答案:

答案 0 :(得分:9)

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

但是,有一些建议:如果可能的话,你应该避免使用一个需要你在历史项目字符串中使用百分比转义的方案。原因是当location.hash结束时location.href返回,#%3C@%40说明因浏览器而异。例如,Chrome返回#%3C@%40; Firefox返回#<@@。设置location.hash可以具有类似的浏览器特定效果。

GWT的历史记录令牌机制依赖于location.hash,并没有规范化浏览器行为的这种差异。最终的结果是,如果您使用需要百分比转义的内容,您将获得无法在浏览器之间共享的网址 - 如果在其他某个页面上您希望生成跳转到GWT中特定位置的链接,则会出现问题应用程序,或者如果您希望用户共享链接到您的GWT应用程序中的URL。 (或者当您的用户安装Chrome时,从Firefox导入他们的书签,指向您的webapp中的特定位置,并且突然书签不像以前那样工作)

对于偏执狂,我会避免将任何?#&%<>字符放入你的历史令牌字符串。但是,像orderDetails/oid=12313378这样的字符串应该没问题,并且应该是跨浏览器。

(编辑澄清我正在谈论的问题是处理相同的URL在多个不同的浏览器中工作,而不是让历史令牌方法在各种浏览器中都能正常工作)