将参数附加到GWT中的当前URL

时间:2013-06-30 02:20:02

标签: url gwt

我在我的应用上实现了一个jQuery小部件。我希望在加载时,小部件启动,并且为了使我必须使用一个参数调用我的URL。

所以,就像这个MYURL /?param = value

我现在正在做这件事:

Window.Location.replace(GWT.getHostPageBaseURL()+"?param=value");

工作正常,问题是重新加载应用程序。

有没有办法在不刷新我的网页的情况下执行此操作?

感谢!

2 个答案:

答案 0 :(得分:4)

为了不重新加载页面,您只需要修改散列片段而不是查询字符串。

Window.Location.replace(
   Window.Location.getPath() + Window.Location.getQueryString() +"#whatever");

在大多数浏览器中,有一种名为pushState的新机制,因此您可以在不重新加载页面的情况下将URL更改为任何值。 GWT还没有任何包装器,但您可以通过JSNI使用它,或者如果您希望使用此代码将gwtquery添加到项目中:

import static com.google.gwt.query.client.GQuery.*;

Properties history = JsUtils.prop(window, "history");
JsUtils.runJavascriptFunction(history, 
          "pushState", null, null, "whatever.html?foo=true");

仅供参考,新的gwtproject网站在浏览菜单时使用此机制和gwtquery。源代码位于gwt git

答案 1 :(得分:1)

使用Window.location不是一个正确的方法,因为Philippe Beaudoin(我认为他在谷歌工作)说:

  

据我所知,修改浏览器URL而不插入   浏览器不支持历史记录中的令牌。 GWTP 0.4不会   触摸URL(而0.3触摸它,强制你插入一个新的   历史中的元素)。调用updateHistory()应该具有确切的   效果与0.3相同。

     

我记得有些人说他们能够修改网址   没有插入历史记录而没有重新加载应用程序   使用当前url调用Window.Location.replace()   修改的哈希片段。但是,这没有记录,我会   如果它适用于所有浏览器,我会感到惊讶。

来源:https://groups.google.com/forum/#!topic/gwt-platform/glnowOS_8CM

在GWTP中,您可以非常轻松地完成此任务。

在GWTP中,当您使用eClipse创建一个Presenter说FirstPresenter时,eClipse将为您生成所有必需的类,这些类是:FirstPresenter.java,FirstView.java,FirstView.ui.xml

Gwtp中有一些包(urproject.client.place)有助于管理所有要放置的东西,例如param访问,添加mor param而不刷新页面。

在FirstPresenter.java中,你首先需要注入PlaceManager(把它放在方法之外)&然后创建一个说addParam(String myParam)的函数:

    @Inject PlaceManager placeManager;

    public void addParam(String myParam, String myValue){
       PlaceRequest request = new PlaceRequest(NameTokens.yourNameToken).with(myParam, myValue);
      placeManager.updateHistory(request, true);
    }

注意:如果你想要> 1个参数,你可以使用尽可能多.with.with(myParam, myValue).with(myParam2, myValue2)。你可以通过String val=request.getParameter(myParam,"");获得参数。如果你想在页面初始化时获得参数,那么使用:

    @Override
     public void prepareFromRequest(PlaceRequest request){
    super.prepareFromRequest(request);
    String myVal=request.getParameter("myParam", "");
     }

完成了。你必须使用Gwtp包才能使用该功能,Gwtp是我能建议的最佳框架,它们有很多强大的功能。你只能使用Gwt来管理一个非常复杂的网络应用程序,因为Gwt太有限了。仅适用于小型应用,但大型网络应用需要强大的框架和那就是Gwtp。 Stackoverflow中没有多少人知道Gwtp,所以很难得到答案,但你可以通过观看视频来学习它。

在youtube上有一个非常好的视频供您学习GWTP:

http://www.youtube.com/watch?v=Gm-RO-cmsEQ&list=PL29DDDC847F63AF82

希望这可以帮助你