GWT中的多个“页面”,带有人性化的URL

时间:2010-03-08 13:58:07

标签: java gwt servlets

我正在玩GWT / GAE项目,该项目将有三个不同的“页面”,尽管它不是GWT意义上的页面。顶视图(每个页面一个)将具有完全不同的布局,但是一些小部件将被共享。

其中一个页面是由默认URL(http://www.site.com)加载的主页面,但另外两个页面需要额外的URL信息来区分页面类型。他们还需要一个名称参数,(如http://www.site.com/project/project-name。至少有两个我知道的解决方案。

  1. 使用GWT历史记录机制,让页面类型和参数(例如项目名称)成为历史记录标记的一部分。
  2. 将servlet与url-mapping模式一起使用(例如/ project / *)
  3. 首先看起来似乎很明显,但它有几个缺点。首先,用户应该能够轻松地记住并直接键入URL到项目。很难生成具有历史令牌的人性化URL。其次,我正在使用gwt-presenter,这种方法意味着我们需要在一个令牌中支持子位置,我宁愿避免。第三,用户通常会停留在一个页面上,因此页面信息是“静态”URL的一部分更有意义。

    使用servlet解决了所有这些问题,但也创建了其他问题。

    所以我的第一个问题是,这里最好的解决方案是什么?

    如果我要使用servlet解决方案,会弹出新问题。

    1. 将GWT应用程序拆分为三个独立的模块可能是有意义的,每个模块都有一个入口点。映射到某个页面的每个servlet然后将该请求简单地转发到处理该页面的GWT模块。由于用户通常停留在一个页面,因此浏览器只需要加载该页面的js。根据我所读到的,这个解决方案并不是真正推荐的。
    2. 我也可以坚持使用一个模块,但GWT需要找出它应该显示的页面。它可以查询服务器或解析URL本身。

      1. 如果我坚持使用一个GWT模块,我需要将页面信息保存在服务器端。当然我考虑过会议,但我不确定将页面信息与用户数据混合是否是一个好主意。会话通常存在于用户登录和注销之间,但在这种情况下,它需要不同的行为。通过会议来处理这个问题是不好的做法吗?
      2. 一个GWT模块+ servlet解决方案也会导致另一个问题。如果用户从项目页面进入主页面,那么GWT将如何知道这种情况发生了?该应用程序不会被重新加载,因此它将被视为一个简单的状态更改。每个州的变化都需要检查页面信息似乎相当无效。

        任何人都想引导我走出我周围模糊的黑暗之中吗? : - )

2 个答案:

答案 0 :(得分:3)

我会选择历史记录。这是处理此类情况的标准方法。我不明白,你的意思是“很难用历史令牌制作一个人性化的URL” - 它们对我来说似乎很人性化:)如果你使用servlet处理网址,我想这会导致整个页面需要重新加载 - 我认为你宁愿避免这种情况。

  

其次,我正在使用gwt-presenter和   这种方法意味着我们需要   在一个令牌中支持子位置,   我宁愿避免。

如果你对gwt-presenter不满意(就像我:),请推出自己的类来帮助MVP - 这很简单(你可以从头开始或修改gwt-presenter类)和你'我会得到一个适合您需求的解决方案。我之所以这么做,是因为gwt-presenter似乎对我来说“复杂”/复杂 - 对于泛型,当我需要的只是它提供(或尝试提供)的一部分时。

至于多个模块的想法 - 它是一个很好的,但我建议使用Code Splitting - 这种情况(页面/应用程序可以分为“独立”模块/块)正是它意味着用于,而且你只需要引导你的应用程序一次,因此在页面之间切换时不需要下载额外的代码。 Plus ,以这种方式共享状态应该更容易(例如,通过事件总线)。

答案 1 :(得分:-2)

根据您发布的内容,我认为您来自使用服务器端框架构建网站:JSP, JSF, Wicket, PHP或类似的。 GWT不是构建基于页面的导航网站的解决方案,就像您使用上述框架一样。使用GWT,您可以在浏览器中加载Web应用程序并保留在那里。处理用户事件,与服务器通信并更新小部件;使用gwt-presenter是一件好事,因为你不得不考虑控制器逻辑和视图状态的分离。 您可以真正利用GWT的所有功能来构建浏览器中的高性能应用程序,但它绝对用于构建网站(使用通过服务器会话传输请求参数的超链接页面) )。

这是迄今为止关于GWT的最广泛问题@ StackOverflow :) “我如何在GWT中定义它们之间的页面和导航?”简短的回答:“你没有。”

使用Wicket,它可以在App Engine上运行,并且可以让您定义页面书签以及上面提到的所有内容。看这里:http://stronglytypedblog.blogspot.com/2009/04/wicket-on-google-app-engine.html