20

HTMLフォームでは、ボタンに「disabled」属性を任意の値で定義することにより、ボタンを無効にできます。

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

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

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

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

JSTL ifタグを使用してタグを2回複製して目的の効果を得ることができますが、特定のケースでは、ボタンに15を超える属性(AJAXのJavaScriptイベントハンドラー属性が多数)が宣言されているため、タグを複製するとJSPは非常に厄介です。

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

4

11 に答える 11

12

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

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

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

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

于 2008-10-16T09:11:39.537 に答える
6

タグを使用して、<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>

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

于 2009-04-22T00:43:15.493 に答える
3

jsp から jspx への自動コンバーターについて読んでいると、<jsp:element><jsp:attribute>タグに出会いました。私がそれを正しく理解しているなら、あなたは次のようなことができるはずです

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

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

<button someAttribute="value"/>

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

于 2008-10-15T11:10:46.007 に答える
2

タグ ライブラリ (.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 ライブラリを使用する別のソリューションを投稿しました。

于 2011-07-15T22:52:57.823 に答える
0

私はちょうど同じ問題に苦しんでいます。<jsp:attribute name="disabled"/>insideを使用してみ<c:if>ましたが、コンパイラは無効な属性を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 を使用してボタンを生成している場合にのみ機能し、tag 要素は disabled 属性をサポートする必要があります (基になる HTML 要素に渡します)。jsp:attribute生の HTML 要素に属性を追加するために使用することはできません。

于 2011-06-15T02:56:14.957 に答える
0

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

  1. <%= (isDisabled) を置き換えますか? "disabled" : "" %> with <jsp.expression>(isDisabled) ? "無効" : ​​""</jsp.expression>
  2. Core taglib と EL を次のように使用します (isDisabled がページ スコープに含まれていることを確認してください)。
<c:選択>
  <c:when test="${isDisabled}">"無効"</c:when>
  <c:そうでなければ>""</c:そうでなければ>
</c:選択>

それが役立つことを願っています:)

于 2008-10-04T05:46:28.377 に答える
-2

私は実際には JSP を使用していません (一度返信した後、「有効な XML である必要がある」ということを理解したときに削除しました)。私が思いつくことができる最もきれいなものはこれです:

<% if (isDisabled) { %>
  <button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
  <button name="btn1">Hello</button>
<% } %>
于 2008-10-01T10:45:59.697 に答える