4

使用 JSPX 有条件地打印 html 属性的正确方法是什么?

这些都在 p 标签上引发验证错误:

    /* first try */

<p ${true ? 'name="foobar"' : ''}>hello</p>

    /* second one */

<c:set var="somevar" scope="page">
  <c:if test="${true}">
    name="foobar"
  </c:if>
</c:set>
<p ${somevar}>hello</p>

元素类型“p”必须后跟属性规范“>”或“/>”。在 org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:41)

编辑:附加完整代码

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:field="urn:jsptagdir:/WEB-INF/tags/form/fields" xmlns:form="urn:jsptagdir:/WEB-INF/tags/form" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:spring="http://www.springframework.org/tags" version="2.0">
    <jsp:directive.page contentType="text/html;charset=UTF-8"/>
    <jsp:output omit-xml-declaration="yes"/>

    <p ${true ? 'name="foobar"' : ''}>hello</p>

</div>
4

3 回答 3

3

问题是 Jasper 在处理 EL 之前尝试验证 JSP 的良好形式。

发生这种情况是因为您的文件应该具有的 JSPX 扩展名意味着它是一个 JSP 文档。JavaServer Pages Specification说:

对于被标识为 JSP 文档的文件不是格式良好、名称空间感知的 XML 文档,这是一个翻译时错误。

我找不到任何方法来指示 Jasper 禁用 XML 格式验证。

Tomcat 文档中描述的用于预编译 JSP 文件的 Ant 任务有validateXml参数。但它只是跳过对有效 XML的检查,而不是对格式良好的 XML的检查。

因此,您的选择是将文件重命名为 JSP,或添加<is-xml>false</is-xml>web.xml,或遵循@damo_inc 的建议。

于 2012-02-20T12:05:50.717 回答
1

可能有点简单,但应该可以:

      <c:if test="${true}">
        <p name="foobar">hello</p>
      </c:if>
      <c:if test="!${true}">
        <p>Hello</p>
      </c:if>

编辑:

测试了这个:

<p ${true ? 'name="true"' : 'name="false"'}>hello</p>

......它工作正常。您的页面一定有问题。

编辑2:

这工作正常:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:c="http://java.sun.com/jsp/jstl/core" >
    <jsp:directive.page contentType="text/html;charset=UTF-8"/>
    <jsp:output omit-xml-declaration="yes"/>

    <p ${true ? 'name="foobar"' : ''}>hello</p>

</div>

某些 xmnls 属性有问题。

于 2012-02-20T10:05:35.883 回答
0

我确实找到了一种方法。

我知道自从有人问这个问题以来已经过了很长时间,但我认为有人可以从我的发现中受益。

我想这一个完整的黑客,但它的工作原理。

看这个:

&lt;div id="something1" <c:if test="true">class="hide"</c:if>&gt;
    something2
&lt;/div&gt;

使用&lt;&gt;标记不会被验证。

浏览器的源代码显示:

<div id="something1" class="hide">
    something2
</div>

从这里得到想法。

希望有人觉得它有用

于 2013-10-18T23:21:20.210 回答