当试图用JSPX创建HTML页面时,您将面临以下困难:
jspx最小化了我们不希望看到的标签,例如<div class="foo"></div>
变成了<div class="foo"/>
浏览器对其进行了不同的解释。
JSPX标记必须关闭,而某些HTML标记应保持未关闭状态,例如<script...>
。ie和firefox无法识别self closed<script.../>
标记。
指定html5 doctype(<!DOCTYPE html>
)
内联JavaScript
这个问题是对其他几个问题的回应,这些问题归结为同一个问题。我找不到一个全面的答案,所以我把我的调查结果贴出来。
相关问题:
jspx script element on GlassFish v3
Keep JSPX from creating self closing tags (<div></div> != <div/>)
最佳答案
JSPX非常适合于生成HTML和XHTML。
归根结底就是理解这种语言的XML性质。JSPx是XML,而HTML不是。其中一个含义是JSPX解析器“最小化”空标记,因为XML不区分自关闭标记和空标记。这会导致标签问题。然而,值得注意的是,虽然JSPX文件必须是有效的XML,但它们生成的输出却不是有效的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>]]>
相关问题中的其他建议是在
<script...>
内添加评论或空的<div></div>
得出相同的结果:<script type="text/javascript" src="/js/jquery-1.4.4.min.js"><!-- Prevent self-closing --></script>
(正如拉尔夫指出的,上面的内容不适用于WebSphere)
或:
<script type="text/javascript" src="/js/jquery-1.4.4.min.js"><jsp:text></jsp:text></script>
在其他一些情况下,CDATA也很有用。其中之一是打印HTML5 doctype(
<jsp:text>
)。JSPX不允许您将doctype声明放入文档中,因为它不是有效的XML。jspx还取消了jsp:output标记的标识,但它会打印系统属性,即使它是空的。解决方法是在页面的开头用CDATA包装doctype:<![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
希望这有帮助:)