2

現在、エラーメッセージが表示される可能性のある各フィールドに対して次のようなことを行っています。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:choose>
  <c:when test="${message == null}">
    <label>Field name</label>
    <input type="text" name="field-name">
  </c:when>
  <c:otherwise>
    <label class="error">Field name</label>
    <input type="text" name="field-name">
    <small class="error">${message}</small>
  </c:otherwise>
</c:choose>

このコードを乾燥/改善する方法は?別の分野で必要になるたびに、これらすべてを繰り返したくはありません。

4

3 に答える 3

1

単純な JSP (追加のフレームワークなし) を使用している場合は、独自のカスタム JSP タグを作成することをお勧めします。fieldタグとタグmessage。多くのフレームワークがそのようなものを提供しているため、これが唯一の要件である場合は、試してみることができます。

独自のタグを作成する方法についての Sun のチュートリアルがあります。少し古いですが、内部はそれほど変わっていません。さらに、標準の一部であるため、どのサーブレット コンテナーでも機能します。

簡単なタグを作成するために必要な手がかりを提供します。必要に応じmessageて独自のタグを作成できるとfield思います。

基本的な考え方

TagSupport抽象クラスを拡張する基本クラスの作成を開始し、doEndTag()メソッドをオーバーライドします。message現在の pageContext に属性があるかどうかを確認し、存在する場合は、タグの出力ストリームを介してそのエラー メッセージを出力します。

public class MessageTag extends TagSupport {

    public int doEndTag() {
        String message = pageContext.findAttribute("message");
        if (message != null) {
            StringBuilder output = new StringBuilder();
            output.append("<small class=\"error\">").append(message).append("</small>");
            JspWriter out = pageContext.getOut();
            out.println(output.toString());
        }
        return EVAL_PAGE;
    }

}

次に、前のチュートリアルの手順に従って、Web アプリケーションでタグ ライブラリを定義し、それを JSP で使用します。

<label>Field name</label>
<input type="text" name="field-name">
<mytags:message />

現実の世界

それが最も簡単な方法でしょう。しかし、実際のシナリオでは、検証しているフィールドに応じて異なるエラー メッセージを表示したいので、属性name(または同様のもの) をタグ クラスに追加し、それに応じて異なるメッセージを検索できるようにします。その属性の値:

public class MessageTag extends TagSupport {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void release() {
        super.release();
        name = null;
    }

    public int doEndTag() {
        String lookupAttr = (name != null ? name : "message");
        String message = pageContext.findAttribute(lookupAttr);
        if (message != null) {
            StringBuilder output = new StringBuilder();
            output.append("<small class=\"error\">").append(message).append("</small>");
            JspWriter out = pageContext.getOut();
            out.println(output.toString());
        }
        return EVAL_PAGE;
    }

}

そうすれば、特定のフィールドごとにタグを再利用できます。

<label>Field name</label>
<input type="text" name="field-name">
<mytags:message name="field-name" />

タグ ライブラリにも属性定義を追加する必要があることに注意してください。

明らかに、これを必要に応じて複雑にすることができます (つまりstyle、INFO、WARNING、または ERROR メッセージなどを表示できるようにする属性を追加します)。

于 2012-08-20T11:16:10.563 に答える
1

繰り返していることを見て、それを統一してください。<label><input>要素を繰り返しています。一度だけ見せてください。メッセージがある場合は、 にクラスを追加し<label>、追加要素を追加するだけです。

<label class="${not empty message ? 'error' : ''}">Field name</label>
<input type="text" name="field-name">
<c:if test="${not empty message}"><small class="error">${message}</small></c:if>

<c:if>メッセージがない場合は、altogeter を省略することもできます。その場合<small>、UI にはまったく表示されません。

<label class="${not empty message ? 'error' : ''}">Field name</label>
<input type="text" name="field-name">
<small class="error">${message}</small>

この目的で後者を使用することは推奨されないため、<span>代わりにa のみを使用します。<small>

<label class="${not empty message ? 'error' : ''}">Field name</label>
<input type="text" name="field-name">
<span class="error">${message}</span>
于 2012-08-21T00:34:21.953 に答える
0

このように何かを行う必要があります<input type="text" name="user" value="user">。次に、使用するフォームの値を読み取ります。setAttribute()メソッドとgetAttribute()メソッドを使用して、新しいフォームの値を取得できます。

于 2012-08-20T10:04:49.233 に答える