【问题标题】:How to implement GWT PlaceHistoryMapper with custom tokens?如何使用自定义令牌实现 GWT PlaceHistoryMapper?
【发布时间】:2012-11-08 12:15:42
【问题描述】:

我希望我的小型 GWT 应用程序具有以下所有“可书签”Places:

http://www.mywebapp.com                 -->     "home page"
http://www.mywebapp.com/login           -->     login screen
http://www.mywebapp.com/main            -->     main menu, after logged in
http://www.mywebapp.com/start           -->     start of a transactional process
http://www.mywebapp.com/complete        -->     end of transactional process (receipt)

所以我继续创建了 5 个Place 子类,所有这些子类都采用以下形式:

public class LoginPlace extends Place {
    // Intentionally left void because I'm not sure
    // what to implement here...
}

并有相应的分词器:

public class LoginPlaceTokenizer extends PlaceTokenizer<LoginPlace> {
    @Override
    public LoginPlace getPlace(String token) {
        // ???
    }

    @Override
    public String getToken(LoginPlace place) {
        // ???
    }
}

我正在尝试为我的应用实现 PlaceHistoryMapper

@WithTokenizers({
    HomePlaceTokenizer.class,
    LoginPlaceTokenizer.class,
    MainMenuPlaceTokenizer.class
    // etc.
})
public class MyWebAppPlaceHistoryMapper implements PlaceHistoryMapper {
    @Override
    public Place getPlace(String token) {
        // ???
    }

    @Override
    public String getToken(Place place) {
        // ???
    }
}

PlaceTokenizer&lt;T&gt; 子类和 MyWebAppPlaceHistoryMapper 中的配套 getPlace/getToken 方法似乎在做同样的事情。 是吗?如果是,我是否只在它们内部使用相同的代码?如果它们不一样,它们有何不同,我应该如何实现它们?

请记住我希望将 URL 标记作为应用程序中的可收藏位置 - 我不想使用 GWT 的默认 someDisplay:SomePlace 标记。提前致谢!

【问题讨论】:

    标签: java gwt gwt-places


    【解决方案1】:

    您可以使用带有@WithTokenizers 注释的接口并让GWT 从GWT.create(MyWebAppPlaceHistoryMapper.class) 生成实现,或者您“手动”实现PlaceHistoryMapper 接口并且您不需要PlaceTokenizers。

    使用GWT.create(),GWT 将实现getPlacegetToken 方法,以根据令牌的前缀分派到适当的PlaceTokenizer(使用if…else 级联与prefix.equals(...),基于PlaceTokenizers 上的@Prefix 注释或Place 的类型(使用if…elseinstanceof 级联,基于PlaceTokenizers 的通用类型) .

    【讨论】:

    • 感谢@Thomas Broyer (+1) - 这是有道理的。至于自定义标记,我将如何实现getToken(Place place) 方法,以便/login 标记将成为LoginPlace 标记为http://www.mywebapp.com/login 的标记?再次感谢!
    • if (place instanceof LoginPlace) { return "login"; }getPlace 也是如此:if ("login".equals(token)) { return new LoginPlace(); }。但是拥有http://www.mywebapp.com/login 需要使用HTML5 pushStatepopstate 并让您的服务器准备好为许多URL 发送相同的页面;见gist.github.com/1883821
    • 谢谢,我去看看。我将避免询问有关 HTML5 pushState/popState 和您的Html5Historian 的更深入的问题,因为它们与此问题无关,但是:(1)将使用此限制我的网络应用程序的受众仅限于符合 HTML5 的现代浏览器? (2) 是否有任何文档说明为什么这需要 HTML5 pushState/popState?我想我只是很惊讶这不是在 GWT 中为不同位置添加书签的正常方式。一如既往,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多