【问题标题】:How can I switch easily between an Ajax-based website and a basic HTML website?如何在基于 Ajax 的网站和基本的 HTML 网站之间轻松切换?
【发布时间】:2011-02-05 17:36:16
【问题描述】:

我有一个网站(基于 JSP/Servlets,使用 MVC 模式),我想支持基于 Ajax 的网站和基本的基于 HTML 的网站。网站访问者应该能够将浏览模式从 Ajax 更改为基本 HTML,反之亦然,因为它适用于 Google 邮件。

问题:

  • 轻松实现此目标的最佳方法是什么?
  • 我应该为每个页面设计两个视图吗?

我使用jQuery和JSON作为this answer的结果。

【问题讨论】:

    标签: html ajax design-patterns jsp servlets


    【解决方案1】:

    您需要Unobtrusive JavaScript,它是progressive enhancement 的一部分。

    首先,开始创建一个功能齐全的网络应用程序没有任何 JavaScript 行。一旦你让它工作,然后开始编写 JavaScript 代码“接管”原始 HTML 工作 不更改任何 HTML/CSS 行。在服务器端代码中,您需要 add 逻辑来识别请求是否已被 JavaScript 触发并相应地返回响应。您可以通过在 Web 浏览器中启用/禁用 JavaScript 来测试这两种情况。在 Firefox 中,使用 Web Developer Toolbar 很容易。

    例如,您有一个包含所有 HTML 链接的邮件列表,这些链接应显示邮件正文:

    <a href="mail/show/1" class="show">Message title</a>
    

    如果没有 JavaScript,这将向 servlet 发出 HTTP 请求,该 servlet 加载由 1 标识的邮件,将请求转发给 JSP,该 JSP 在视图中隐藏消息列表并在视图中显示邮件。

    使用 JavaScript/jQuery,您需要编写与 Ajax 完全相同的代码,例如:

    $('a.show').click(function() {
        $.getJSON(this.href, callbackFunctionWhichHidesListAndShowsMail);
        return false;
    });
    

    在服务器端,你必须区分普通请求和ajax请求,以便你可以相应地返回响应。

    boolean ajax = "XMLHttpRequest".equals(request.getHeader("x-requested-with"));
    
    // ...
    
    if (ajax) {
        writeJson(response, mail);
    } else {
        request.setAttribute("mail", mail);
        request.getRequestDispatcher("/WEB-INF/mail.jsp").forward(request, response);
    }
    

    最后,为了给用户一个手动切换模式的选项,你必须设置一个 cookie 或者最好(因为 cookie 是可禁用的)在 URL 中传递一些信息(路径信息或请求参数),这会强制服务器禁用发射&lt;script&gt; 行。

    【讨论】:

    【解决方案2】:

    将 HTML 版本视为基础。首先构建它。

    然后将附加的 Ajax 功能作为可选层覆盖在此之上,必要时拦截默认的 HTML 行为。不需要两个视图,只需一个视图即可根据可用技术和/或用户偏好逐渐添加增强功能。

    【讨论】:

      【解决方案3】:

      您非常明智地尝试progressive enhancement。有一篇很棒的文章,A List Apart: Understanding Progressive Enhancement,我必须感谢 StackOverflow 的回答; Graceful degradation - when to consider.

      我认为优雅降级是看待支持不同浏览器功能问题的更消极的方式; What is the difference between progressive enhancement and graceful degradation?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 2014-03-06
        • 1970-01-01
        • 2012-02-12
        • 2019-06-08
        • 1970-01-01
        • 2020-07-13
        相关资源
        最近更新 更多