作为此问题的扩展,我正在尝试将Javascript插入到<h:commandButton/>的onclick属性中,就像action已经渲染ajax表一样。
<h:commandButton/>
onclick
action
我想做的事情:在列表框中获取选定的项目,并将它们变成要在JSF中使用的参数FileServlet。即para2=value1¶m=value2¶m=value3
FileServlet
para2=value1¶m=value2¶m=value3
这是我所拥有的:
<script type ="text/javascript"> function myScript() { var box = document.getElementbyId('myForm:box'); var length = box.options.length; var paramstring = ""; for (var i = 0; i < length; i++) { if (i != (length - 1) { if (box.options[i].selected) { paramstring = paramstring + "param=" + box.options[i].value + "&"; } } else { paramstring = paramstring + "param=" + box.options[i].value; } } if (document.getElementById('myForm:checkbox').checked) { window.location='fileServlet? + paramstring; } } </script>
页面加载后得到的内容: javax.servlet.ServletException: Error Parsing /page.xhtml: Error Traced[line:15] The content of elements must consist of well-formed character data or markup.
javax.servlet.ServletException: Error Parsing /page.xhtml: Error Traced[line:15] The content of elements must consist of well-formed character data or markup.
什么不会触发异常:
<script type ="text/javascript"> function myScript() { var box = document.getElementbyId('myForm:box'); var length = box.options.length; var paramstring = ""; if (document.getElementById('myForm:checkbox').checked) { window.location='fileServlet? + paramstring; } } </script>
一旦添加,for (var i = 0; i <length;i++)甚至for(vari=0;i<10;i++)页面将无法加载。为什么不喜欢for循环?
for (var i = 0; i <length;i++)
for(vari=0;i<10;i++)
Facelets是基于XML的视图技术,它使用XHTML+XML生成HTML输出。XML具有五个特殊字符,XML解析器对其进行了特殊处理:
<
>
"
'
&
;
在这种情况下<,XML解析器会隐式地寻找标签名称和结束标签>。但是,在您的特定情况下,您使用的<是JavaScript运算符,而不是XML实体。这完全解释了您遇到的XML解析错误:
元素的内容必须包含格式正确的字符数据或标记。
本质上,您在错误的位置编写了JavaScript代码,而不是JS文件而不是JS文件,因此您应该相应地转义所有XML特殊字符。在<必须进行转义为<。
<
因此,基本上,
for (var i = 0; i < length; i++) {
必须成为
for (var i = 0; i < length; i++) {
使它对XML有效。
但是,这使JavaScript代码更难以阅读和维护。如Mozilla开发人员网络出色的文档“为XHTML编写JavaScript”所述,您应该将JavaScript代码放在字符数据(CDATA)块中。因此,按照JSF的说法,它将是:
<h:outputScript> <![CDATA[ // ... ]]> </h:outputScript>
XML解析器将把块的内容解释为“plain vanilla”字符数据而不是XML,因此将XML特殊字符“按原样”解释。
但是,更好的方法是将JS代码放在自己的JS文件中,该文件应由<scriptsrc>或以JSF的形式包含在其中<h:outputScript>。
<scriptsrc>
<h:outputScript>
<h:outputScript name="functions.js" target="head" />
这样,您无需担心JS代码中的XML特殊字符。