3

データベースから科目レベルを取得し、ユーザーがコースを編集するための選択オプションとして表示する編集ページがあります。

フォームが送信されると、新しいリクエストが作成されます。ユーザー入力は、XML 検証を使用してcourseBeanによってキャプチャされます。XML 検証が失敗すると、ユーザー入力をキャプチャしたcourseBeanをedit.jspに転送します。

ここに画像の説明を入力

そのため、edit.jspにアクセスするたびに、データベース レコードを取得します。そのようにすればいいのでしょうか?

また、最初にedit.jspを表示するアクションクラスに、サブジェクトlitレベルlitを取得してrequest属性として格納してみました。ただし、ユーザー入力から新しい要求が行われると、データベースから取得したサブジェクト リストレベル リストは使用できなくなります。

コード (edit.jsp):

<%
    Session session2 = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction tx = session2.beginTransaction();
    Query q = session2.createQuery("from Subject");
    List subjectList = q.list();
    List levelList = session2.createQuery("from Level").list();
%>

<div class="control-group">
    <label class="control-label" for="inputPassword">Subject</label>
    <div class="controls">
        <select name="subject_id">
            <%
                for (Object subjectObject : subjectList) {
                    Subject subject = (Subject) subjectObject;
            %>
            <option value="<%=subject.getId()%>"><%=subject.getName()%></option>
            <%  } //end for %>
        </select>
    </div>
</div>

<div class="control-group">
    <label class="control-label" for="inputPassword">Level</label>
    <div class="controls">
        <select name="level_id">
            <%
                for (Object levelObject : levelList) {
                    Level level = (Level) levelObject;
            %>
            <option value="<%=level.getId()%>"><%=level.getName()%></option>
            <%  } //end for %>
        </select>
    </div>
</div>
4

3 に答える 3

7

ScriptletStruts2 を使用すると、 s ( )を使用する必要がなくなります<% stuff %>。それらは古いものであり、悪いものであり、ビュー ページに挿入されたビジネス ロジックであり、使用しないでください。JSTL も必要ありません。Struts2 タグを使用するだけで、任意の結果を得ることができます。

コードと概念をより適切に分離および分離するには、次のものが必要です。

  1. DAO Layer: 単純なクエリのみを実行します。
  2. BUSINESS Layer: (s) を介して DAO レイヤーの結果を公開し、Service複数の DAO 呼び出しを集約し、必要に応じていくつかのビジネス オペレーションを実行します。
  3. PRESENTATION Layer: Struts2 でモデルとして機能するアクション。ここでは、ビジネス層からサービスを呼び出して、JSP が必要とするオブジェクトを取得します。
  4. JSP (VIEW Layer)#session: JSP にはプレーンな HTML が含まれており、アクションのアクセサー (Getter) を介して必要なデータにアクセスし、最終的には値スタック ( 、#requestなど)から必要なその他の要素にアクセスします。

    あなたの例では、このすべて

<% 
   Session session2 = HibernateUtil.getSessionFactory().getCurrentSession();
   Transaction tx = session2.beginTransaction();
   Query q = session2.createQuery("from Subject");
   List subjectList = q.list();
   List levelList = session2.createQuery("from Level").list(); 
%>

と のような 2 つの関数によって公開される DAO/ビジネス層にある必要がgetSubjectList();ありgetLevelList();ます。次に、アクションに次のようなものが必要です。

public class YourAction {

    private List<Object> levelList; // private
    private List<Object> subjectList; // private

    public String execute() throws Exception {      
        // Call the service, load data
        levelList = getMyService().getLevelList();
        subjectList = getMyService().getSubjectList();

        // Forwarding to the JSP
        return SUCCESS;
    }

    public List<Object> getLevelList() {
        return levelList;
    }
    public List<Object> getSubjectList() {
        return subjectList;
    }

}

JSP では、次の代わりに:

<select name="subject_id">
<%
  for (Object subjectObject : subjectList) {
      subject subject = (Subject) subjectObject;
%>
      <option value="<%=subject.getId()%>"><%=subject.getName()%></option>
<%
  } //end for
%>
</select>

次のようにリストにアクセスします(醜いHTML/Struts2の方法が混在しています):

<select name="subject_id">
    <s:iterator value="subjectList">
        <option value="<s:property value="id"/>">
            <s:property value="name"/>
        </option>   
    </s:iterator>
</select>

または、Select の場合は、適切な Struts2 UI Select タグを使用します。

<s:select name = "subject_id" 
          list = "subjectList" 
       listKey = "id" 
     listValue = "name" />

最初にすべてのレイヤーを分離するのが難しすぎる場合は、アクションの最初の 3 つのレベルをフラットにして、Java (アクション) と Struts2 UI タグ (JSP) を分離する方法を理解してください。理解できたら、DAO ロジックをビジネス レイヤー、できれば EJB に移動できます。それが達成されたら、より細かく分割してください...

アクションは次のようになります。

public class YourAction {

    private List<Object> levelList; // private
    private List<Object> subjectList; // private

    public String execute() throws Exception {      
            Session session2 = HibernateUtil.getSessionFactory().getCurrentSession();
            Transaction tx = session2.beginTransaction();
            Query q = session2.createQuery("from Subject");
            subjectList = q.list();
            levelList = session2.createQuery("from Level").list();

        // Forwarding to the JSP
            return SUCCESS;
    }

    public List<Object> getLevelList() {
        return levelList;
    }
    public List<Object> getSubjectList() {
        return subjectList;
    }    
}

リストの複数の読み込みに関する質問については、リストが固定されている場合 (たとえば、1 か月に 1 つ変更される場合) にキャッシュを使用する (タイマーを使用する場合に適しています) か、毎回読み込むことができます。問題はありません。それ。検証が失敗した場合、ValidationInterceptor は、execute() メソッドに到達することなく、INPUT タイプの結果にマップされた JSP にリクエストを転送することに注意してください。そのため、Action から Preparable インターフェイスを実装し、ロードするものをprepare()メソッドに入れ、毎回実行する必要があります。 PrepareInterceptor による

public class YourAction implements Preparable {

    private List<Object> levelList; // private
    private List<Object> subjectList; // private

    public void prepare() throws Exception {
        // Call the service, load data, 
        // every time even if validation fails
        levelList = getMyService().getLevelList();
        subjectList = getMyService().getSubjectList();
    }

    public String execute() throws Exception {      

        // Forwarding to the JSP
        return SUCCESS;
    }

    public List<Object> getLevelList() {
        return levelList;
    }
    public List<Object> getSubjectList() {
        return subjectList;
    }
}

フレームワークは簡単で強力です。Web には多くの例があり、StackOverflow は優れたサポートを提供します...

于 2012-12-12T10:40:42.000 に答える
2

必要なのはキャッシュです。ただし、データベース レコードが頻繁に変更される場合は、お勧めできません。

ただし、問題のクエリが小さい場合 (小さいと思います)、データベースのクエリは大きなパフォーマンスの問題にはなりません。

別の注意として、あなたのJSPを見ると、JSPスクリプトレットの非推奨と誤用が見られます。

タグ struts 2 を追加したので、これは struts 2 Web プロジェクトであると仮定します。スクリプトレットで行われる作業のために、組み込みの struts ui タグを使用することを (強く) 検討してください。

あなたのアプローチは、自由に使える原子炉を持っているときに、たくさんのダイナモを使って都市に電力を供給しているとしか言いようがありません。

ここから始めることをお勧めします: http://struts.apache.org/2.x/docs/home.html

これにより、フレームワークとその完全な機能についての適切なアイデアが得られます。

于 2012-12-12T05:44:06.760 に答える
1

1 つのアドバイスとして、MVC アーキテクチャに固執したい場合は、ビューにビジネス ロジックを含めないでください。MVC アーキテクチャによれば、View を扱う UI エンジニアは、ビジネス ロジックについてまったく知る必要はありません。

JSP ページで HTML と Java コードを混在させると、ビューが複雑になり、コードの保守に問題が発生します。

このチュートリアルを利用して、Struts 2 で CRUD 操作を実装する方法を確認してください。

于 2012-12-12T05:45:39.790 に答える