# DTOとDAOを使ったアプリケーション ## 課題のためコードのみ掲載 ## 解説はそのうち書きます ## フォルダ構造 ![](https://i.imgur.com/lQhfT0t.png) ## コード一覧↓↓↓↓↓↓ Address.java(サーブレット) ``` package kadai04; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Purchase */ @WebServlet("/Address") public class Address extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Address() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //データベース接続管理クラスの変数宣言 DBManager dbm = new DBManager(); //個人情報取得 AddressDTO[] list = dbm.getData(); //HTTPRequestに格納 request.setAttribute("data", list); //サーブレットの転送 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/address.jsp"); rd.forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); if(!request.getParameter("name").equals("")) { AddressDTO dto = new AddressDTO(); dto.setName(request.getParameter("name")); dto.setAddress(request.getParameter("address")); dto.setTel(request.getParameter("tel")); //データベース接続管理クラスの変数宣言 DBManager dbm = new DBManager(); //個人情報取得 dbm.saveData(dto); } doGet(request, response); } } ``` AddressDAO.java(DAOクラス) ``` package kadai04; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class AddressDAO { // データベース接続に必要な情報 final String DSN = "jdbc:mysql://localhost:3306/kadai04?characterEncoding=utf8"; final String USER = "root"; final String PASSWORD = null; // データベースの接続情報を返す public Connection getConnection(){ Connection conn = null; try { // JDBC ドライバのロード Class.forName("com.mysql.jdbc.Driver"); // データベースへ接続 conn = DriverManager.getConnection(DSN, USER, PASSWORD); }catch(ClassNotFoundException e){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } return conn; } // Connection 型変数が持つデータベースと JDBC リソースの解放 public void close(Connection conn) { if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } // PreparedStatement 型変数が持つデータベースと JDBC リソースの解放 public void close(Statement stmt) { if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } } // ResultSet 型変数が持つデータベースと JDBC リソースの解放 public void close(ResultSet rset) { if(rset != null){ try { rset.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` AddressDTO.java ``` package kadai04; import java.util.Date; public class AddressDTO { private int id; private String name; private String address; private String tel; private Date date; 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 getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } ``` DBManager.java ``` package kadai04; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public class DBManager extends AddressDAO { public AddressDTO[] getData() { Connection conn = null; // データベース接続情報 PreparedStatement pstmt = null; // SQL 管理情報 ResultSet rset = null; // 検索結果 AddressDTO[] datas = null; //個人情報 String sql = "SELECT * FROM address ORDER BY id DESC"; try { // データベース接続情報取得 conn = getConnection(); // SELECT 文の登録と実行 pstmt = conn.prepareStatement(sql); // SELECT 構文登録 rset = pstmt.executeQuery(); //1件1件のデータを格納 ArrayList<AddressDTO> list = new ArrayList<AddressDTO>(); // 検索結果があれば while (rset.next()) { // 必要な列から値を取り出し、個人情報オブジェクトを生成 AddressDTO data = new AddressDTO(); data.setId(rset.getInt("id")); data.setName(rset.getString("name")); data.setAddress(rset.getString("address")); data.setTel(rset.getString("tel")); data.setDate(rset.getDate("date")); list.add(data); } //1件1件のデータを配列にまとめていく datas = new AddressDTO[list.size()]; for (int i = 0; i < list.size(); i++) { datas[i] = list.get(i); } } catch (SQLException e) { e.printStackTrace(); } finally { // データベース切断処理 close(rset); close(pstmt); close(conn); } return datas; } public void saveData(AddressDTO dto) { Connection conn = null; // データベース接続情報 PreparedStatement pstmt = null; // SQL 管理情報 ResultSet rset = null; // 検索結果 String sql = "INSERT INTO address(name,address,tel,date) VALUES (?,?,?,now())"; try { // データベース接続情報取得 conn = getConnection(); pstmt = conn.prepareStatement(sql); //SQL文(追加処理)の作成と実行 pstmt = conn.prepareStatement(sql); pstmt.setString(1, dto.getName()); pstmt.setString(2, dto.getAddress()); pstmt.setString(3, dto.getTel()); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { // データベース切断処理 close(rset); close(pstmt); close(conn); } } } ``` address.jsp ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="kadai04.AddressDTO" %> <% AddressDTO[] list = (AddressDTO[])request.getAttribute("data"); %> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>アドレス帳</title> </head> <body> <h1>アドレス帳</h1> <form method="post" action="Address"> 名前:<input type="text" name="name"><br /> 住所:<input type="text" name="address"><br /> TEL:<input type="text" name="tel"><br /> <input type="submit" value="登録"> </form> <p> <table border=1> <tr> <td>名前</td> <td>住所</td> <td>TEL</td> <td>登録日時</td> </tr> <% for (int i = 0; i < list.length; i++) { out.print("<tr><td>"+ list[i].getName() +"</td>"); //名前 out.print("<td>"+ list[i].getAddress() +"</td>"); //住所 out.print("<td>"+ list[i].getTel() +"</td>"); //電話番号 out.print("<td>"+list[i].getDate()+"</td></tr>"); //日時 } %> </table> </body> </html> ``` ## 実行結果 ![](https://i.imgur.com/ZZHnv5p.png) ![](https://i.imgur.com/0wLVrhV.png)