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 の部分が厄介ですが、これは JavaRuby on RailsCakePHP と違ってデータベースへのアクセスの仕組みを独自で持っていないことに起因します。まぁその辺は Java への愛で乗り切ってくださいw