如何使用JSPX生成有效的HTML?(不是XHTML)

ooB*_*tez 15 html html5 jsp jspx

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

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

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

相关问题:

ooB*_*tez 24

JSPX非常适合生成HTML和XHTML.

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

考虑到上述情况,最干净的解决方案似乎是创建一个带有标签的自定义标签库,例如htmlScript,htmlDiv等.这些标签可以像这样使用:

<html:div styleClass="foo" selfClosing="false">${message}<html:div>
Run Code Online (Sandbox Code Playgroud)

无论内容如何,​​其HTML输出都将包含结束标记:

<div style="foo"></div>
<div style="foo">Hello</div>
Run Code Online (Sandbox Code Playgroud)

像这样的taglib可以让你使用JSPX构建HTML页面而不使用相当丑陋的变通方法.

构建HTML页面似乎是JSPX最常见的应用之一.有点令人惊讶的是,没有标准的HTML库.JSF有一个,但如果你使用干净的JSP它将无济于事.可能有第三方库填补了这个空白,但我找不到.

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

<![CDATA[<script type="text/javascript" src="/js/jquery-1.4.4.min.js">]]>
Run Code Online (Sandbox Code Playgroud)

要么:

<![CDATA[<script type="text/javascript" src="/js/jquery-1.4.4.min.js"></script>]]>
Run Code Online (Sandbox Code Playgroud)

相关问题中的其他提议是在<jsp:text>内部放置注释或清空,<script>从而得到相同的结果:

<script type="text/javascript" src="/js/jquery-1.4.4.min.js"><!-- Prevent self-closing --></script>
Run Code Online (Sandbox Code Playgroud)

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

<script type="text/javascript" src="/js/jquery-1.4.4.min.js"><jsp:text></jsp:text></script>
Run Code Online (Sandbox Code Playgroud)

CDATA在其他一些案例中也派上用场.其中之一是打印HTML5 doctype(<!DOCTYPE html>).JSPX不允许您将DOCTYPE声明放在文档中,因为它不是有效的XML.JSPX还可以对jsp:output标记进行deifnes,但即使它是空的,它也会打印SYSTEM属性.解决方法是将DOCTYPE包装在页面开头的CDATA中:

<![CDATA[<!DOCTYPE html>]]>
Run Code Online (Sandbox Code Playgroud)

CDATA还可用于封装内联JavaScript.虽然这会因"<"符号而产生解析错误:

<script type="text/javascript">
    var x = 7 < 5;
</script>
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作:

<script type="text/javascript">
    <![CDATA[
    var x = 7 < 5;
    ]]>
</script>
Run Code Online (Sandbox Code Playgroud)

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

<![CDATA[
<jsp:expression>"asd " + "def"</jsp:expression>
${1 + 2}
]]>
Run Code Online (Sandbox Code Playgroud)

生产:

<jsp:expression>"asd " + "def"</jsp:expression>
3
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)

  • 请注意,只需使用“&lt;jsp:text /&gt;”即可代替“&lt;jsp:text&gt;&lt;/jsp:text&gt;”。 (2认同)