Условный HTML-атрибут в JSPX - PullRequest
       40

Условный HTML-атрибут в JSPX

4 голосов
/ 20 февраля 2012

Как правильно распечатать атрибут html условно, используя JSPX?

Они оба выдают ошибки проверки тега 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>

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

Проблема в том, что Jasper пытается проверить правильность формы JSP перед обработкой EL.

Это происходит потому, что расширение JSPX, которое ваш файл предположительно имеет, означает, что это документ JSP.И JavaServer Pages Specification гласит:

Это ошибка времени перевода для файла, который идентифицирован как документ JSP, чтобы не быть правильно сформированным, осведомленным о пространстве имен,Документ XML.

Я не смог найти способ заставить Jasper отключить проверку правильности формы XML.

Задача Ant для предварительной компиляции файлов JSP, как описано в Tomcat Docs имеет параметр validateXml.Но он просто пропускает проверки для правильного XML , а не для правильно сформированного XML .

Таким образом, вы можете либо переименовать файл в JSP, либо добавить *От 1022 * до web.xml, или следуйте совету @ damo_inc.

1 голос
/ 20 февраля 2012

Возможно, немного упрощенно, но должно работать:

      <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.

0 голосов
/ 19 октября 2013

Я нашел способ сделать это.

Я знаю, что прошло много времени с тех пор, как об этом спросили, но я подумал, что кто-то может извлечь пользу из моего открытия.

Полагаю, - это полный взлом, но это работает.

Посмотрите на это:

&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>

Получил идею от здесь .

Надеюсь, кто-нибудь найдет это полезным

...