3

これは、実際に答えられる質問というよりも、暴言かもしれません。まだ分​​からない。多くの人が遭遇する状況かもしれないと思うので、役に立つ質問になることを願っています.

約 40 の異なるステータスになる可能性のある情報を提示する JSP があります。複雑な金融商品のステータスだとしましょう。そのため、ステータスに応じたメッセージを出力したいと考えています。たとえば、ステータス 10 は「製品の有効化が保留中です」、ステータス 15 は「製品は有効です」などです。

したがって、ステータスに応じて適切なメッセージを返す単純なルックアップを作成でき、すべてがうまく機能するように思えます。

しかし実際には、ステータスだけでは適切なメッセージを判断するのに十分ではありません。ステータス 10 (アクティブ化保留中) であるが、アクティブ化から 1 週間以内の場合は、メッセージを赤くします。ステータス 10 (アクティブ化保留中) であるが、それを遅らせる外的理由がある場合、説明ページへのリンクを提供するメッセージが必要です。等々。

そのため、ステータス自体は、メッセージの決定と作成に必要なすべての情報を取得するわけではありません。他にも必要な無関係な情報がたくさんあります。

従来のコードの仕組みでは、これらすべての情報が JSP にロードされ、JSP はこの非ステータス情報に基づいて判断を下します。

サイトをやり直しているので、複数の異なる場所で同じステータス ロジックが必要であるにもかかわらず、異なるラッピング html を出力するという状況に直面しています。

要するに大雑把です。

理想的な答えは、すべての決定が jsps から取り出されるようにリファクタリングすることだと思います。うーん、それを処理する正しい方法が何であるかわかりません。非常に複雑で、どこから始めればよいかわかりません。

問題を明確にするのに十分な詳細を提供したかどうかはわかりませんが、誰かアドバイスがあれば、とても感謝しています..

編集:すべての回答をありがとう!コードは非常に厄介なので、必要な場所にそれらのファイルを含めることができるように、一般的なコードをインクルード ファイルに引っ張って少しリファクタリングしました。あなたが提案するように、関数を使用して物事をさらにカプセル化することを間違いなく検討します。すぐにあなたの答えに戻ります。再度、感謝します。

4

3 に答える 3

3

あなたの既存の JSP は<% // scriptlets %>、最終的なステータス メッセージを達成するために多くのことを使用していると思います。JSP からすべての Java ロジックを除外するカスタム タグを作成することをお勧めします。

メッセージ内容の扱い

Productメッセージの生成に必要なもの (オブジェクト自体など) を属性の 1 つとして受け取るようにタグを実装します。

WEB-INF/status.tld (タグ ライブラリ記述子)

<taglib ... >
  <uri>WEB-INF/status.tld</uri>
  <tag>
    <name>statusMesg</name>
    <tag-class>com.foo.StatusMesgTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
      <name>product</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>com.foo.beans.Product</type>
    </attribute>
  </tag>
</taglib>

Tagスクリプトレットに現在存在する Java コードを使用してクラスを実装します。

pubic class StatusMesgTag extends SimpleTagSupport {

  private Product product;

  public void setProduct(Product product) {
    this.product = product;
  }

  public void doTag() throws JspException, IOException {
    StringBuilder statusMesg = new StringBuilder();

    // process Product info to generate mesg

    getJspContext().getOut().println(statusMesg);
  }
}

次に、次のように JSP で呼び出します (Productページ、リクエスト、またはセッション スコープのいずれかで「製品」としてマップされたオブジェクトを使用)。

<custom:statusMesg product="${product}" />

taglibJSPにディレクティブを追加した後

<%@ taglib prefix="custom" uri"WEB-INF/status.tld" %>

メッセージ レンダリングの処理 (ビュー)

メッセージをレンダリングする色を決定する必要がある部分は、CSSスタイルシートで処理する必要があります。classカスタムタグでメッセージの優先度を決定し、次のような適切な CSS スタイルでメッセージを返すことができます。

<span class="priorityHigh">Needs activation within 1 week</span>

あなたのCSSは、さまざまな優先度をさまざまな色にマップします

.priorityHigh {color: red};
.priorityNormal {color: black};
.priorityLow {color: green};
于 2013-06-11T05:22:20.413 に答える
0

ステータス、日付などUtil classをパラメーターで受け取るメソッドを使用して作成します...したがって、メソッドの戻り値は、jsp がレンダリングするために必要なすべての情報のプロパティを持つオブジェクトになります。このようなもの:

class MyStatusUtil{

    public static StatusInfo getStatusInfo(int status, Date date, etc...){
      StatusInfo info = new StatusInfo();
      if(status==10){
         info.setStatusName("....");
      }

      .....
     if(date==....){
       info.setColor("...");

     }

     if(somethinElse){
       info.setComment("....");
     }
     return info;
    }

}

StatusInfo クラス:

class StatusInfo{
    private String statusName;
    private String color;
    private String comment;

}

jsp:

<% StatusInfo info = MyStatusUtil.getStatusInfo(....) 
  //now render the html based on the StatusInfo data.
%>
于 2013-06-11T04:42:14.070 に答える