エンタープライズ:特集 2003/11/28 15:30:00 更新


特集:第2回 実用サンプルコードで理解する「Struts」の基礎 (11/15)

掲示板の一覧表示をしよう−action-mappingの設定

 次に、掲示板の一覧表示をするプログラムを作っていこう。まずは、Read.doというURLが要求された際、KeijiReadActionクラスが実行されるようにstruts-config.xmlファイルを書き換える。以下、List 10の通りだ。

List 10■struts-config.xmlファイルの抜粋
7: <!-- =================================== Action Mapping Definitions -->
8: <action-mappings>
9: <action path="/Write" type="sample.keiji.KeijiWriteAction"
10: name="KeijiWriteForm" scope="request" validate="false">
11: <forward name="success" path="/pages/KeijiWriteSuccess.jsp"/>
12: </action>
13: <action path="/Read" type="sample.keiji.KeijiReadAction">
14: <forward name="success" path="/pages/KeijiReadSuccess.jsp "/>

15: </action>
16: 〜略〜
17: </action-mappings>

 ここでは、フォワード先として、KeijiReadSuccess.jspファイルを定義した。先の掲示板の書き込みの処理と異なり、入力フォームを利用しないためname属性を省略している。

データベースから読み込んでコレクションを作る

 KeijiReadActionクラスでは、データベースから読み込み、それをコレクションとしてKeijiReadSuccess.jspファイルに渡す処理を行う。List 11のようになる。

List 11■KeijiReadAction.javaファイル
1: package sample.keiji;
2:
3: import org.apache.struts.action.*;
4: import org.apache.commons.dbcp.BasicDataSource; 5: import java.sql.*;
6: import javax.servlet.http.HttpServletRequest;
7: import javax.servlet.http.HttpServletResponse;
8:
9: import java.util.ArrayList;
10:
11: public class KeijiReadAction extends Action
12: {
13: public ActionForward execute(
14: ActionMapping mapping, ActionForm form,
15: HttpServletRequest request, HttpServletResponse response)
16: {
17: javax.sql.DataSource dataSource;
18: Connection conn = null;
19: Statement stmt = null;
20: ResultSet rs = null;
21:
22: ArrayList dbdatas = new ArrayList();
23:
24: try
25: {
26: dataSource = getDataSource(request);
27: conn = dataSource.getConnection();
28: stmt = conn.createStatement();
29:
30: rs = stmt.executeQuery(
31: "SELECT * FROM Keiji ORDER BY writedate DESC");
32:
33: // 結果セットの分だけループ
34: while (rs.next())
35: {
36: String username = rs.getString("name");
37: String email = rs.getString("email");
38: if (rs.wasNull())
39: {
40: email = "メールなし";
41: }
42: Timestamp writedate = rs.getTimestamp("writedate");
43: String host = rs.getString("host");
44: if (rs.wasNull())
45: {
46: host = "ホスト不明";
47: }
48: String title = rs.getString("title");
49: String msg = rs.getString("body");
50:
51: // データをコレクションに保存
52: KeijiData kdata = new KeijiData();
53: kdata.setUsername(username);
54: kdata.setEmail(email);
55: kdata.setTitle(title);
56: kdata.setMsg(msg);
57: kdata.setHost(host);
58: kdata.setWritedate(writedate.toString());
59:
60: dbdatas.add(kdata);
61: }
62: }
63: catch (SQLException e)
64: {
65: // エラー
66: getServlet().log("DB Error", e);
67: ActionErrors errors = new ActionErrors();
68: errors.add("dberror.msg",
69: new ActionError("dberror.msg", e.toString()));
70: saveErrors(request, errors);
71: }
72: finally
73: {
74: try
75: {
76: if (stmt != null)
77: {
78: stmt.close();
79: }
80: if (conn != null)
81: {
82: conn.close();
83: }
84: }
85: catch (SQLException e)
86: {
87: getServlet().log("DB Close Error", e);
88: }
89: }
90:
91: // 結果をJSPから読み出せるように設定
92: request.setAttribute("dbdatas", dbdatas);
93:
94: // 結果のページを返す
95: return mapping.findForward("success");
96: }
97: }

 List 11でも、先に示したデータベースへの書き込み例と同様、DBCPを用いている。ここList 11では、レコードを読み取り、その結果をArrayListに設定し、JSPファイルに渡すという個所がポイントだ。まずは、22行目にあるように、ArrayListオブジェクトを用意しよう。

22: ArrayList dbdatas = new ArrayList();

 34行目〜61行目のループ処理においては、次にピックアップしたように1つ1つレコードを読み取り、ArrayListオブジェクトに格納していく。

33: // 結果セットの分だけループ
34: while (rs.next())
35: {
36: String username = rs.getString("name");
37: String email = rs.getString("email");
38〜41: 〜略〜
42: Timestamp writedate = rs.getTimestamp("writedate");
43: String host = rs.getString("host");
44〜47: 〜略〜
48: String title = rs.getString("title");
49: String msg = rs.getString("body");
50:
51: // データをコレクションに保存
52: KeijiData kdata = new KeijiData();
53: kdata.setUsername(username);
54: kdata.setEmail(email);
55: kdata.setTitle(title);
56: kdata.setMsg(msg);
57: kdata.setHost(host);
58: kdata.setWritedate(writedate.toString());
59:
60: dbdatas.add(kdata);
61: }

 ここで利用しているKeijiDataクラスは、username、email、title、msg、host、writedateの6つのプロパティを持つJavaBeansとして利用され、List 12のように構成するものとする。

List 12■KeijiData.javaファイル
1: package sample.keiji;
2:
3: public class KeijiData
4: {
5: private String username, email, title, msg, host, writedate;
6:
7: public void setUsername(String val)
8: {
9: username = val;
10: }
11:
12: public String getUsername()
13: {
14: return username;
15: }
16:
17: public void setEmail(String val)
18: {
19: email = val;
20: }
21:
22: public String getEmail()
23: {
24: return email;
25: }
26:
27: public void setTitle(String val)
28: {
29: title = val;
30: }
31:
32: public String getTitle()
33: {
34: return title;
35: }
36:
37: public void setMsg(String val)
38: {
39: msg = val;
40: }
41:
42: public String getMsg()
43: {
44: return msg;
45: }
46:
47: public void setHost(String val)
48: {
49: host = val;
50: }
51:
52: public String getHost()
53: {
54: return host;
55: }
56:
57: public void setWritedate(String val)
58: {
59: writedate = val;
60: }
61:
62: public String getWritedate()
63: {
64: return writedate;
65: }
66: }

 ループ処理の結果、ArrayListオブジェクトに格納したデータは、次のようにsetAttributeメソッドを呼び出し、requestオブジェクトに登録する。

91: // 結果をJSPから読み出せるように設定
92: request.setAttribute("dbdatas", dbdatas);

 これにより、ArrayListオブジェクトに格納したデータが、dbdatasという名前で結果出力するJSPページから参照できる。後は、次のようにフォワード指定すれば、処理が完了となるのだ。

94: // 結果のページを返す
95: return mapping.findForward("success");

前のページ | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 次のページ

[大澤文孝,ITmedia]