Scriptlet
Struts2 を使用すると、 s ( )を使用する必要がなくなります<% stuff %>
。それらは古いものであり、悪いものであり、ビュー ページに挿入されたビジネス ロジックであり、使用しないでください。JSTL も必要ありません。Struts2 タグを使用するだけで、任意の結果を得ることができます。
コードと概念をより適切に分離および分離するには、次のものが必要です。
DAO Layer
: 単純なクエリのみを実行します。
BUSINESS Layer
: (s) を介して DAO レイヤーの結果を公開し、Service
複数の DAO 呼び出しを集約し、必要に応じていくつかのビジネス オペレーションを実行します。
PRESENTATION Layer
: Struts2 でモデルとして機能するアクション。ここでは、ビジネス層からサービスを呼び出して、JSP が必要とするオブジェクトを取得します。
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 は優れたサポートを提供します...