【问题标题】:Wicket and a rich ajax website: easiest way to do it?Wicket 和丰富的 ajax 网站:最简单的方法是什么?
【发布时间】:2011-02-20 06:58:43
【问题描述】:

我想使用 Wicket 构建一个应用程序,但我有一些设计人员想编写/维护 javascript,他们基本上希望每页 1 个 JS 段和一个全局 JS 文件。 我认为在 wicket 中添加 javascript 最自然的方法是按组件(而不是按页面)添加它,这会给那些设计者带来问题(分段的 javascript,并且必须将其编写在 java 文件中)。有没有更好的方法来解决这个问题? (当然,我希望在部分刷新后一切正常。)

他们想要(实际上我也想要)的第二个(相关)事情是可以通过静态链接请求 JSON 格式的信息,这在 Wicket 中是否可行?

【问题讨论】:

    标签: ajax wicket rich-internet-application


    【解决方案1】:

    我从 JSON 开始,让检票页面返回 JSON,但很快意识到有更好的工具来完成这项工作,尤其是如果您将拥有完整的 Web 服务层。如果你只是需要一点 JSON,总是通过 GET,那么当然,只需创建一个 Wicket 页面。

    我最终在 Wicket 旁边使用了 JerseyJackson。 Jersey 简化了 URL 的配置,这些 URL 可以使用不同的 http 方法(GET/POST/PUT/DELETE)执行不同的操作,以及轻松解析查询字符串等。我会考虑走这条路线以满足更重的 JSON 需求。

    只需一点 web.xml 配置,您就可以轻松地在同一个 Web 应用程序中同时运行 Wicket 和 Jersey。

    【讨论】:

      【解决方案2】:

      Wicket 内置的 AJAX 支持始终是有状态的,因此可以通过不断变化的 URL 进行访问。如果您的设计师不打算使用 Wicket 的 JS 库,那么挂载 JSON 页面非常简单:

      public class JsonReturningPage extends WebPage {
        public JsonReturningPage(PageParameters params) {
          String json = "{foo: 4711}";
          IRequestTarget t = new StringRequestTarget("application/json", "UTF-8", json);
          getRequestCycle().setRequestTarget(t);
        }
      }
      

      或者,您也可以实现自己的 AbstractRequestTargetUrlCodingStrategy 以直接从 IRequestTarget decode(RequestParameters params) 返回 IRequestTarget 并将其挂载到您的应用程序中。

      关于 JS 文件,我会尝试教育他们每个组件使用一个文件。这当然具有更少的复制粘贴代码和更简单的维护的优点。此外,我当然不鼓励 Java 代码中的 JS。通常只需要将数据或配置传递给 JS ,无论是作为变量定义还是方法调用。由于这些数据通常使用 Java 并且 JS 是由设计师编写的,因此是时候让设计师和程序员合作了。

      【讨论】:

      • 是的,那个 json-thingy 正是我在寻找的东西(替代方案听起来也不错,但很难),并且对我对 JS 文件的想法的一些确认也非常好,谢谢。
      • @sfussenegger 我如何访问该页面?!!!找不到网址!!如果没有 HTML,该页面的 url 是什么。它为我返回 404 :( 我已经尝试了我能想到的所有可能的 url。例如:localhost:7001/MyApp/JsonReturningPage
      【解决方案3】:

      对第二个问题的快速回答是肯定的,这是可能的。使用 bookmarkable links 访问返回 JSON 数据的资源。

      【讨论】:

      • 嗯,我知道可收藏链接。但是我不知道如何在这样的 URL 上返回 JSON,我应该有一个用于可收藏链接的页面,对吧?
      【解决方案4】:

      您可以轻松地使用以下代码与 Wicket 进行动态通信:

      AbstractDefaultAjaxBehavior callme = new AbstractDefaultAjaxBehavior(){
              @Override
              protected void respond(AjaxRequestTarget target) {
              }
      };
      page.add(callme);
      
      
      //From any ajaxrequesttarget you can simply append the following code:
      target.appendJavascript("wicketAjaxGet('"+callme.getCallbackUrl()+");");
      

      这样你就可以有一个 ajaxlink 等...将 ajaxrequest 传输到 Wicket 端。如果您想传递数据(虽然静态链接听起来不像),请执行以下操作:

      "wicketAjaxGet('"+callme.getCallbackUrl()+"&x='+value_to_pass_back''";
      //to Read the value in the respond:
      String x = RequestCycle.get().getRequest().getParameter("x");
      

      所以回调的 url 是动态生成的(因为回调 url 是特定于会话的),但它的形成方式与任何其他 url 一样......

      对我来说,这比在 wicket 上构建 JSON 系统而不是使用内置的 JSON 系统简单 10 倍……我一直都在使用它,至少它对我来说很好用。如果您的解决方案不同/更好,我想知道为什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 2013-08-05
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多