JSPドキュメント(JSPX)を使用して要素の属性を条件付きで設定する
質問
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つのオプションがあります:
- Replace <!> lt;%=(isDisabled)? <!> quot; disabled <!> quot; :<!> quot; <!> quot; %<!> gt; with <!> lt; jsp.expression <!> gt;(isDisabled)? <!> quot; disabled <!> quot; :<!> quot; <!> quot; <!> lt; /jsp.expression <!> gt;
- 次のように、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>
<% } %>