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

Как правильно распечатать атрибут 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)

EDIT: добавлен полный код

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

person gpilotino    schedule 20.02.2012    source источник
comment
Я только что попробовал ваш оригинальный <p ${true ? 'name="foobar"' : ''}>hello</p> на Tomcat 6.0.26, и он сработал, значит, что-то еще не так с вашим кодом/сервером.   -  person Oleg Mikheev    schedule 20.02.2012
comment
Я только что попробовал то же самое: ‹p ${true ? 'name=true' : 'name=false'}›hello‹/p›, и это работает нормально в Tomcat 7   -  person damo_inc    schedule 20.02.2012
comment
но я не думаю, что это веская причина для голосования: кто-то еще столкнется с этим в будущем и, возможно, сочтет это полезным.   -  person damo_inc    schedule 20.02.2012
comment
Проблема в том, что компилятор Jasper JSP пытается проверить XML перед обработкой EL. Я не смог найти способ отключить проверку XML.   -  person Oleg Mikheev    schedule 20.02.2012
comment
действительно код не работает с включенной проверкой. Я ищу способ отключить его.   -  person gpilotino    schedule 20.02.2012
comment
@damo_inc: я думаю, это будет работать в простом jsp, но не в jspx, так как он использует синтаксис xml. Какой из них вы пробовали?   -  person Jörn Horstmann    schedule 20.02.2012


Ответы (3)


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

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

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

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

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

Таким образом, вы можете либо переименовать файл в JSP, либо добавить <is-xml>false</is-xml> к web.xml, либо последовать предложению @damo_inc.

person Oleg Mikheev    schedule 20.02.2012
comment
is-xml по умолчанию имеет значение true при использовании jspx -› onjava.com/onjava/ 2004/04/21/JSP2part3.html здесь говорится, что внутри jspx невозможно использовать такую ​​конструкцию - person gpilotino; 20.02.2012
comment
если я отключу поддержку документов jsp, либо изменив расширение на .jsp, либо используя is-xml=false, я больше не смогу запускать теги jsp (т. е. выдает ошибку об использовании jsp: output и т. д.). поэтому я предполагаю, что окончательный ответ заключается в том, что невозможно условно напечатать атрибут внутри jspx. это то, что мы получаем бесплатно после 10 лет использования спецификаций j2ee. - person gpilotino; 20.02.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.

person damo_inc    schedule 20.02.2012
comment
это нормально, но таким образом, если у меня есть 10 условных атрибутов, я должен написать 10! возможные переключатели =) - person gpilotino; 20.02.2012
comment
это работает внутри jsp, но не внутри jspx (т.е. с проверкой xml) - person gpilotino; 20.02.2012

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

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

Думаю, это полный хак, но он работает.

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

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

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

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

person elysch    schedule 18.10.2013