JSPドキュメント(JSPX)を使用して要素の属性を条件付きで設定する

StackOverflow https://stackoverflow.com/questions/157005

  •  03-07-2019
  •  | 
  •  

質問

HTMLフォームでは、<!> quot; disabled <!> quot;を定義することでボタンを無効にできます。それらの属性、任意の値:

<button name="btn1" disabled="disabled">Hello</button>

ボタンを有効にする場合、無効な属性に設定できる定義済みの値がないため、ボタンが有効のままになるため、属性は存在しないはずです。

これにより、JSPドキュメント(jspx)を使用するときにボタンを有効/無効にしたい場合に問題が発生します。 JSPドキュメントは整形式のXMLドキュメントである必要があるため、次のようなものは無効であるため、この属性を条件付きで含める方法はありません。

<button name="btn1" <%= (isDisabled) ? "disabled" : "" %/> >Hello</button>

目的の効果を得るためにJSTL ifタグを使用してタグを2回複製できますが、特定のケースでは、ボタン(AJAXのjavascriptイベントハンドラー属性のロット)で15個以上の属性が宣言されているため、タグの複製が行われますJSPを非常に乱雑にします。

JSPの可読性を犠牲にすることなく、この問題をどのように解決できますか?出力DOMを操作して属性を親に追加できるカスタムタグはありますか?

役に立ちましたか?

解決

動的属性を持つカスタムJSPタグを使用します。次のように使用します:

<util:element elementName="button" name="btn1" disabled="$(isDisabled ? 'disabled' : '')"/>

基本的に、このタグは、elementNameを使用してXML要素を生成し、タグに存在するすべての属性を配置しますが、空の属性はスキップします。

タグ自体の実装は非常に簡単です。実装の長さはわずか44行です。

他のヒント

<jsp:text>タグを使用して、有効なXMLを使用してこの問題を解決できます。

<jsp:text><![CDATA[<button name="btn1"]]></jsp:text>
    <c:if test="${isDisabled}"> disabled="disabled"</c:if>
    >
    Hello!
<jsp:text><![CDATA[</button>]]></jsp:text>

これは明らかに他のソリューションよりも冗長です。ただし、完全に自己完結型です。カスタムタグは不要です。また、必要な数の属性に簡単にスケーリングします。

@alex 三項演算子を使用するための優れたソリューション。あなたのおかげで、条件の結果を変更しただけです。trueの場合は属性を書き込み、そうでない場合は何も書き込みません

c:ifを避けて、リストにデータを入力し、使用する値を選択します

<select id="selectLang" name="selectLang" >
<c:forEach var="language" items="${alLanguages}" >
    <option value="${language.id}" ${language.code == usedLanguage ? 'selected' : ''} >${language.description}</option>
</c:forEach>

開始時にラジオボタンをチェックしてc:if:

を回避する
<input type="radio" id="id0" value="0" name="radio" ${modelVar == 0 ? 'checked' : ''} />
<input type="radio" id="id1" value="1" name="radio" ${modelVar == 1 ? 'checked' : ''} />
<input type="radio" id="id2" value="2" name="radio" ${modelVar == 2 ? 'checked' : ''} />

この最後の投稿から時間が経過したと思いますが、<select><option selected="selected">タグでまったく同じ問題に遭遇しました。つまり、どのオプションが選択されているかを動的に宣言します。それを解決するために、カスタムtagxを作成しました。詳細を別のこちらから回答

良いショートカットはないという結論に達しました。 ELおよびJSP式は、XML要素属性内(および本文コンテンツ)にのみ存在できます。したがって、次のことを行う必要があります。

<c:choose>
    <c:when test="${isDisabled}"><button name="btn1" disabled="disabled">Hello</button></c:when>
    <c:otherwise><button name="btn1">Hello</button></c:otherwise>
</c:choose>

スクリプトレット表記の使用は、JSPドキュメント(.jspx)では機能しません

自動 jspからjspxへのコンバーターについて知りました<jsp:element>および<jsp:attribute>タグ。正しく理解できれば、次のようなことができるはずです

<jsp:element name="button">
  <jsp:attribute name="someAttribute">value</jsp:attribute>
</jsp:element>

そしてjspエンジン出力を持っています

<button someAttribute="value"/>

またはそのようなもの。上のページで指摘されている唯一の問題は、これが条件付き構造ではうまく機能しないように見えることです。コンバーターの作成者は、いくつかのヘルパータグを作成することを回避しました。ヘルパータグは、私が推測するソースコードのダウンロードを見ることができます。お役に立てば幸いです。

タグライブラリ(.tagx)を作成し、scriptletタグを使用します。

http://code.google.com/p/jatl/wiki/JSPExampleを参照

<?xml version="1.0" encoding="UTF-8" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1">
<jsp:directive.page import="com.googlecode.jatl.Html"/>
<jsp:directive.page import="com.evocatus.product.data.AttributeValue"/>
<jsp:directive.page import="com.evocatus.domain.Product"/>

<jsp:scriptlet>
//<![CDATA[
    final Product p = (Product) request.getAttribute("product");
        new Html(out) {{
           for (AttributeValue v : p.summaryAttributeValues()) {
                   p();
                        strong().text(v.getLabel()).end();
                        text(": " + v.getValue());
                   endAll();
           }
        }};
//]]>
</jsp:scriptlet>

</jsp:root>

ええ、これは不正行為です...しかし、それは仕事を終わらせます。さらに、この方法でツリー構造の本当に厄介な複雑な再帰を行うことができます。

また、ブログとgist.githubにtagxライブラリを使用する別のソリューションを投稿しました: http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on-an-element-with-jspx

<!> lt;%= blah%<!> gt;構文は、JSPドキュメントに必要な正当なXMLではありません。 2つのオプションがあります:

  1. Replace <!> lt;%=(isDisabled)? <!> quot; disabled <!> quot; :<!> quot; <!> quot; %<!> gt; with <!> lt; jsp.expression <!> gt;(isDisabled)? <!> quot; disabled <!> quot; :<!> quot; <!> quot; <!> lt; /jsp.expression <!> gt;
  2. 次のように、Core taglibとELを使用します(isDisabledがページスコープに配置されていることを確認してください):
<c:choose>
  <c:when test="${isDisabled}">"disabled"</c:when>
  <c:otherwise>""</c:otherwise>
</c:choose>

役立つ希望:)

同じ問題に苦労しています。 <jsp:attribute name="disabled"/>内で<c:if>を使用しようとしましたが、コンパイラはdisabled属性をc:if要素にアタッチしようとして失敗します。しかし、私はこれがうまくいくことを発見しました(stripes:submitはストライプで送信タイプのボタンを作成するための要素です):

<stripes:submit name="process" value="Hello">
   <jsp:attribute name="disabled">
       <c:if test="${x == 0}">disabled</disabled>
   </jsp:attribute>
</stripes:submit>

ボディに空白のみが含まれる場合、jsp:attributeは属性をまったく作成しないため、disabled="disabled"を取得するか、まったく取得しないかのいずれかです。

これは、何らかのtaglibを使用してボタンを生成する場合にのみ機能し、タグ要素はdisabled属性をサポートする必要があります(基になるHTML要素に渡す)。 <=>を使用して生のHTML要素に属性を追加することはできません。

私は実際にはJSPを使用していません(かつ、一度返信してから、<!> quot;が有効なXML <!> quot;のことを理解しているときに削除しました)。私が思いつくことができる最もクリーンなのはこれです:

<% if (isDisabled) { %>
  <button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
  <button name="btn1">Hello</button>
<% } %>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top