GWT - 如何获取值并决定加载哪个页面
Posted
技术标签:
【中文标题】GWT - 如何获取值并决定加载哪个页面【英文标题】:GWT - How to get a value and decide which page load 【发布时间】:2011-05-13 02:00:09 【问题描述】:我需要知道(通过使用 GWT)如何根据 HTTP GET 值加载某个类而不是其他一些类的策略。
例子:
// Main.gwt.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.7.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.0/distro-source/core/src/gwt-module.dtd">
<module>
<inherits name="com.google.gwt.user.User"/>
<entry-point class="org.sinfonet.client.PageLoader"/>
</module>
// PageLoader
package org.sinfonet.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.RootPanel;
public class PageLoader implements EntryPoint
public void onModuleLoad()
FlowPanel pageloader=new FlowPanel();
pageloader.add(new MainHomePage());
RootPanel.get().add(pageloader);
如果我的GET
是@987654321@
,我想加载MainHomePage()
;
否则,如果我的GET
是@987654322@
,我想加载MainAnotherClass()
;
我需要在 PageLoader 类、XML 或哪里实现它?我想在xml上,因为PageLoader是一个客户端类……这里没办法做决定。
附:我想加载另一个页面(别名,另一个主类),而不是动态加载它。
我尝试过的示例
感谢this 的Chris Boesing
解决方案,我找到了一段简单的代码,可以满足我的需要。不幸的是,有些东西是错误的,因为它调用了.clear()
方法,但它没有附加我的新容器。就是代码:
public class PageLoader implements EntryPoint, ValueChangeHandler<String>
private FlowPanel pageloader;
private GWTServiceAsync rpcService;
public void onModuleLoad()
pageloader=new FlowPanel();
rpcService=GWT.create(GWTService.class);
pageloader.add(new HomepageContext(rpcService));
RootPanel.get().add(pageloader);
History.addValueChangeHandler(this);
if(!History.getToken().isEmpty())
changePage(History.getToken());
public void onValueChange(ValueChangeEvent event)
changePage(History.getToken());
public void changePage(String token)
if(History.getToken().equals("apartment"))
pageloader.clear();
pageloader.add(new ApartmentContext(rpcService));
else
pageloader.clear();
pageloader.add(new HomepageContext(rpcService));
怎么了?
【问题讨论】:
我相信servlet容器是根据URL选择加载哪个页面的程序。我什至不知道这是否可能,但这取决于您使用的服务器?你在用Tomcat吗?盖伊?老板? Tomcat :) 但是哪个是 GWT 中的主要 servlet?我想我不能直接用 GWT 管理它,或者我不知道...... 【参考方案1】:我想你会想要实现一个 ValueChangeHandler ,并使用 History ( History.addValueChangeHandler( changeHandler )。
然后,在您的 valuechangehandler 实现中,您可以获取请求的令牌并选择要显示的视图。
希望这会有所帮助:)
【讨论】:
嗯..这个方法对我来说不是很清楚。所以我添加了一个例子,如果你有时间和耐心,也许你可以帮助我:)谢谢你的努力!【参考方案2】:为此,您应该首先添加一个 servlet(而不是静态 html 页面)来为您的 gwt 应用程序提供服务。
第一步可能只是添加一个 servlet,它使用 gwt iframe 返回当前的静态 html 页面。当然,您还需要更改 web.xml。
第二步是根据 url 更改返回的 html 以显示一个 gwt 模块或另一个。 如果您想根据 url 显示 2 个不同的 gwt 应用程序(又名模块),这是唯一的解决方案。
无论如何,如果我理解你的问题,你想要做的只是使用 url 显示不同的数据,为此我推荐另一种解决方案:使用 # 符号。
使用 GWT 可以很容易地使用这种语法显示不同的页面(在单个 GWT 模块中)。 http://localhost:8084/GWT/index.html http://localhost:8084/GWT/index.html#page=2 http://localhost:8084/GWT/index.html#searchFor=foo 等等
在 GWT 文档中查找事件和历史。 这也是拥有 RESTish url 的一个很好的起点: http://code.google.com/webtoolkit/articles/mvp-architecture.html
【讨论】:
嗯...我不知道我是否很了解这些文章...但我认为这不是我需要的!当我从 GET 获取值时,我需要加载一个新的“页面”(不加载其他类而不是我拥有的类)。我认为这在 GWT 中是可能的,对吧?事实上,我想“改变”上下文,比如旧 Web 应用程序中的 swith 页面(加载 apartment.php 而不是 index.php ,你知道我的意思吗?)。但我必须考虑这一点,因为也许在 GWT 上使用它自己的方法更好:) 在 gwt 中没有“页面”,从技术上讲,所有 gwt 应用程序都是一个页面,因此添加另一个页面意味着添加另一个 gwt 应用程序(具有不同入口点的模块)。这是我在答案的第一部分中指定的。 我认为您只想更改当前页面,而不是实际离开它。为此,您只需要在页面 DOM 中工作。 private void loadWelcomeView() final Label welcomeMsg = new Label("welcome"); welcomeMsg.addStyleName("welcomeMsg"); RootPanel.get().clear(); RootPanel.get().add(welcomeMsg);例如,此代码将删除页面中的所有内容并替换为标签。当用户单击按钮或插入 url 时,您必须调用此方法(查看 GWT 历史和事件) 是的,事实上我正在使用这种方法。如果我需要在客户端创建所有代码并从服务器上传到客户端,或者仅在需要时调用 runAsyncCall 方法来上传它,我不喜欢什么。否则,这是浪费资源,不是吗? 如果您不需要第一次调用中的所有代码,您可以使用一种称为 CodeSplitting 的技术,该技术允许您仅在需要时加载代码。见code.google.com/webtoolkit/doc/latest/…以上是关于GWT - 如何获取值并决定加载哪个页面的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jquery 获取页面上的值并使用 php 将其回显到页面上
vue中刷新页面后如何获取cookie值并放入Vuex store
如何通过 jQuery+Codeigniter 获取值并显示在输入字段中?