JSPX中的条件HTML属性

时间:2012-02-20 09:59:12

标签: java jsp jstl jspx

使用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”必须后跟属性规范,“&gt;”或“/&gt;”。     在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>

3 个答案:

答案 0 :(得分:3)

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

这是因为你的文件所谓的JSPX扩展意味着它是一个JSP文档。 JavaServer Pages Specification说:

  

对于标识为JSP的文件,它是转换时错误   文档不是格式良好的,名称空间感知的XML文档。

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

Tomcat docs中所述,预编译JSP文件的Ant任务已获得validateXml参数。但它只是跳过valid XML的检查,而不是well-formed XML

因此,您可以选择将文件重命名为JSP,或将<is-xml>false</is-xml>添加到web.xml,或者关注@ damo_inc的建议。

答案 1 :(得分: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属性出了问题。

答案 2 :(得分: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>

here获得了这个想法。

希望有人发现它有用