Struts と MySQL による Web アプリケーション(その 2)
View の作成
今回は新たに検索用の画面を作ります。名前は search.jsp としてください。
<%@ page contentType="text/html; charset=utf-8" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <!doctype html> <html:html> <head> <title>顧客マスタ参照</title> <link rel="stylesheet" href="search.css" type="text/css"> </head> <body> <h1>顧客マスタ参照</h1> <html:form action="search.do" method="post"> <table> <tr><td>顧客ID</td><td><html:text property="id" size="5" /></td></tr> <tr><td>顧客名</td><td><html:text property="name" size="20" readonly="true" /></td></tr> <tr><td>連絡先</td><td><html:text property="phone" size="20" readonly="true" /></td></tr> </table> <p><html:submit value="検索" /></p> </html:form> </body> </html:html>
html:form や html:text などは前にも説明しているので詳細は割愛。
search.css
body { background-color : silver } h1 { font-size : x-large; text-align : center } table { margin : auto } p { text-align : center }
フォーム Bean の作成
新たに SearchtActionForm.java を作成します。
package jp.mydns.akanekodou; import org.apache.struts.action.ActionForm; public class SearchActionForm extends ActionForm { private static final long serialVersionUID = 1L; private int id; private String name; private String phone; public SearchActionForm() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
CustomerDAO.java の修正
package jp.mydns.akanekodou.dao; import javax.sql.DataSource; import java.sql.*; import jp.mydns.akanekodou.model.*; public class CustomerDAO { private static final String SQL = "SELECT * FROM 顧客マスタ WHERE 顧客ID = ?"; private DataSource source; public CustomerDAO() { source = DaoUtil.getSource(); } public Customer find(int id) { Customer cust = new Customer(); Connection con = null; PreparedStatement pst = null; ResultSet rs = null; try { con = source.getConnection(); pst = con.prepareStatement(SQL); pst.setInt(1, id); rs = pst.executeQuery(); if(rs.next()) { cust = getCustomer(rs); } } catch(SQLException se) { se.printStackTrace(); } finally { try { if(rs != null) rs.close(); if(pst != null) pst.close(); if(con != null) con.close(); } catch(SQLException se) { } } return cust; } private Customer getCustomer(ResultSet rs) throws SQLException { Customer c = new Customer(); c.setId(rs.getInt("顧客ID")); c.setName(rs.getString("顧客名")); c.setPhone(rs.getString("連絡先")); return c; } }
前回使った all の代わりに、整数を引数にとってその ID に対応する顧客データを検索する find メソッドを作成します。
SearchAction.java の作成
前回作った InitAction.java の代わりに新たに SearchAction.java を作成します。
package jp.mydns.akanekodou; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import jp.mydns.akanekodou.model.Customer; import jp.mydns.akanekodou.dao.CustomerDAO; public class SearchAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws Exception { SearchActionForm sform = (SearchActionForm)form; int custid = sform.getId(); Customer cust = new CustomerDAO().find(custid); sform.setName(cust.getName()); sform.setPhone(cust.getPhone()); return mapping.getInputForward(); } }
今回はフォームから入力された ID を(整数に変換して)取得し、それをもとに CustomerDAO のメソッドでデータを取得します。取得した Customer クラスのデータをフォームにセットし、View に送ります。
struts-config.xml の修正
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <form-beans> <form-bean name="searchform" type="jp.mydns.akanekodou.SearchActionForm" /> </form-beans> <action-mappings> <action path="/search" name="searchform" type="jp.mydns.akanekodou.SearchAction" input="/search.jsp" /> </action-mappings> </struts-config>
今度はフォーム Bean を自前で作成したので、form-beans 要素内で紐づけをします。
そしてこうなる
こんな画面が出ましたか ? では「顧客ID」の欄にためしに 1 と入力して「検索」ボタンをクリックしてみましょう。
こんな感じでデータを検索するだけのシンプルなアプリケーションですが、フォームも使っているし、前回の一覧表示よりもだいぶアプリケーションっぽくなりましたね。
Web アプリケーションの作り方は大体こんな感じです。順番は任意ですが
- Model を作る
- View を作る
- Controller を作る(フレームワークを使うときは Controller の補助的なプログラムを作る)
- データベースにアクセスする場合は DAO を作る(主に Java の場合)
が基本になります。DAO の部分が厄介ですが、これは Java が Ruby on Rails や CakePHP と違ってデータベースへのアクセスの仕組みを独自で持っていないことに起因します。まぁその辺は Java への愛で乗り切ってくださいw