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ドキュメントであることを意味しているために発生します。そして、JavaServerPages仕様には次のように書かれています。

これは、JSPドキュメントとして識別されたファイルが、整形式で名前空間を認識したXMLドキュメントではない場合の変換時エラーです。

XMLの整形式検証を無効にするようにJasperに指示する方法が見つかりませんでした。

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 に答える