エンタープライズ:特集 | 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]