【问题标题】:How to produce valid HTML with JSPX? (not XHTML)如何使用 JSPX 生成有效的 HTML? (不是 XHTML)
【发布时间】:2011-06-06 02:16:27
【问题描述】:

在尝试使用 JSPX 创建 HTML 页面时,您将面临以下困难:

  • JSPX 将我们不希望的标签最小化,例如 <div class="foo"></div> 变为 <div class="foo"/>,浏览器对它的解释不同
  • JSPX 标记必须关闭,而某些 HTML 标记应保持未关闭,例如 <script...>。 IE和Firefox无法识别自闭<script.../>标签。
  • 指定 HTML5 文档类型 (<!DOCTYPE html>)
  • 内联 JavaScript

这个问题是对其他几个问题的回答,这些问题都归结为同一个问题。我找不到全面的答案,所以我发布了我的调查结果。

相关问题:

【问题讨论】:

标签: jsp html jspx


【解决方案1】:

推荐的方式是:

//

    //your javascript goes here
    function myFuncy(){
        if( a > b || a >= b && b && c){
            X;
        }
    }

//]]>

脚本>

【讨论】:

    【解决方案2】:

    JSPX 非常适合生成 HTML 和 XHTML。

    归结为理解这种语言的 XML 特性。 JSPX 是 XML 而 HTML 不是。 其中一个含义是 JSPX 解析器“最小化”空标签,因为 XML 不区分自闭合标签和空标签。这会导致<script...><div></div> 标记问​​题。然而,值得注意的是,虽然 JSPX 文件必须是有效的 XML,但 它们产生的输出却不是。因此,让 JSPX 文件生成 HTML(不仅仅是 XHTML)是完全正确的。事实上,您可以使用 JSPX 来生成任何文本输出,例如 CSV、CSS 或 JS,尽管这样会很不方便。

    考虑到上述情况,最简洁的解决方案似乎是创建一个带有 htmlScript、htmlDiv 等标签的自定义 taglib。这些标签可以这样使用:

    <html:div styleClass="foo" selfClosing="false">${message}<html:div>
    

    无论内容如何,​​它的 HTML 输出都会包含结束标记:

    <div style="foo"></div>
    <div style="foo">Hello</div>
    

    这样的 taglib 可以让您使用 JSPX 构建 HTML 页面,而无需使用相当丑陋的变通方法。

    构建 HTML 页面似乎是 JSPX 最常见的应用之一。没有标准的 HTML 库有点令人惊讶。 JSF 有一个,但如果您使用干净的 JSP,它不会帮助您。可能有一个第三方库可以填补这个空白,但我找不到。

    如果您不想编写自己的 taglib,另一种方法是使用 CDATA:

    <![CDATA[<script type="text/javascript" src="/js/jquery-1.4.4.min.js">]]>
    

    或:

    <![CDATA[<script type="text/javascript" src="/js/jquery-1.4.4.min.js"></script>]]>
    

    相关问题中的其他建议是在&lt;script&gt; 中添加评论或空&lt;jsp:text&gt;,结果相同:

    <script type="text/javascript" src="/js/jquery-1.4.4.min.js"><!-- Prevent self-closing --></script>
    

    (正如 Ralph 指出的,上述内容不适用于 WebSphere) 或:

    <script type="text/javascript" src="/js/jquery-1.4.4.min.js"><jsp:text></jsp:text></script>
    

    CDATA 在其他一些情况下也能派上用场。其中之一是打印 HTML5 文档类型 (&lt;!DOCTYPE html&gt;)。 JSPX 不允许您将 DOCTYPE 声明放在文档中,因为它不是有效的 XML。 JSPX 还定义了 jsp:output 标记,但即使它为空,它也会打印 SYSTEM 属性。一种解决方法是在页面开头将 DOCTYPE 包装在 CDATA 中:

    <![CDATA[<!DOCTYPE html>]]>
    

    CDATA 也可用于封装内联 JavaScript。虽然这会因为“

    <script type="text/javascript">
        var x = 7 < 5;
    </script>
    

    这会很好用:

    <script type="text/javascript">
        <![CDATA[
        var x = 7 < 5;
        ]]>
    </script>
    

    请注意,JSPX 中的 CDATA 会按原样输出所有内容,但仍会评估 EL 表达式。因此如下:

    <![CDATA[
    <jsp:expression>"asd " + "def"</jsp:expression>
    ${1 + 2}
    ]]>
    

    产生:

    <jsp:expression>"asd " + "def"</jsp:expression>
    3
    

    希望这会有所帮助:)

    【讨论】:

    • - - 不适用于 Websphere
    • 第二个
      标签应该是结束标签吗?
      ?我对jspx不熟悉。
    • 请注意,仅“”就足以代替“”。
    • 我第二个 @Ralph 认为这不适用于 WebSphere,有没有人找到 WebSphere 的解决方案?
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 2013-03-01
    • 2012-08-19
    • 2010-10-24
    • 2021-07-05
    • 2011-09-20
    • 2018-07-26
    • 2019-01-24
    相关资源
    最近更新 更多