データの取得
この節では、SQL文の実行結果を操作する方法を見てみましょう。
○ ファイル
ConnectionTest.javaファイルをコピーして、プロジェクトに次のようなServletを追加してください。
パッケージ名 | test.servlet |
---|---|
クラス名 | SelectServlet |
スーパークラス名 | javax.servlet.http.HttpServlet |
○ プログラム
doGetメソッドを追加して、次のようにプログラムを入力してください。
SelectServlet.java
- package test.servlet;
- import java.io.IOException;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
- import java.util.ArrayList;
- 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;
- @WebServlet("/selectdata")
- public class SelectServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String message = null;
- Connection con = null;
- ArrayList<String[]> list = null;
- try{
- //JDBCドライバクラスの指定
- String drivername = "com.mysql.jdbc.Driver";
- //データベースを指定
- String url = "jdbc:mysql://localhost:3306/books?characterEncoding=utf8";
- //ユーザー名
- String username = "root";
- //パスワード
- String password = "";
- //指定したドライバクラスを読み込み
- Class.forName(drivername);
- //データベースに接続
- con = DriverManager.getConnection(url, username, password);
- //Statementオブジェクトを生成
- Statement st = con.createStatement();
- //SQL文を生成
- String sql = "SELECT * FROM users";
- //SQL文を実行
- ResultSet rs = st.executeQuery(sql);
- //結果を格納するArrayListオブジェクトを用意
- list = new ArrayList<String[]>();
- //結果を取得する
- while(rs.next()){
- String[] data = new String[4];
- data[0] = rs.getString("id");
- data[1] = rs.getString("user_name");
- data[2] = rs.getString("password");
- data[3] = rs.getString("name");
- list.add(data);
- }
- //ResutlSetオブジェクトを切断
- rs.close();
- }catch(Exception e){
- //エラーメッセージをセット
- message = "データベースに接続できませんでした。";
- }finally{
- try{
- //データベースに接続されていれば切断する
- if(con != null){
- con.close();
- }
- }catch(Exception e){
- message = "エラーが発生しました。";
- }
- }
- //リクエストオブジェクトにデータをセットする
- req.setAttribute("Users", list);
- req.setAttribute("Message", message);
- //サーブレットコンテキストを取得する
- ServletContext sc = this.getServletContext();
- //リクエストディスパッチャーオブジェクトを取得する
- RequestDispatcher rd = sc.getRequestDispatcher("/SelectData.jsp");
- //違うページに転送する
- rd.forward(req, resp);
- }
- }
○ ファイル
データを表示するJSPファイルを作成します。プロジェクトに次のようなファイルを追加してください。
ファイル名 | SelectData.jsp |
---|
○ プログラム
次のようにプログラムを入力してください。
SelectData.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ page import="java.util.ArrayList" %>
- <%
- //リクエストオブジェクトからデータを取得する
- ArrayList<String[]> data = (ArrayList<String[]>)request.getAttribute("Users");
- String message = (String)request.getAttribute("Message");
- %>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>結果表示</title>
- </head>
- <body>
- <h2>ユーザー情報一覧</h2>
- <%
- if(message != null){
- %>
- <%= message %>
- <%
- }else{
- %>
- <table border="1">
- <tr>
- <th>ユーザーID</th>
- <th>ユーザー名</th>
- <th>パスワード</th>
- <th>氏名</th>
- </tr>
- <%
- for(String[] dt : data){
- %>
- <tr>
- <td><%= dt[0] %></td>
- <td><%= dt[1] %></td>
- <td><%= dt[2] %></td>
- <td><%= dt[3] %></td>
- </tr>
- <%
- }
- %>
- </table>
- <%
- }
- %>
- </body>
- </html>
○ 実行結果
次のURLを入力して実行してみましょう。
http://localhost:8080/WebApp/selectdata
○ 解説
SelectServlet.javaでは、データベースに接続し、データを取得します。データを取得するために47行目で、ConnectionインタフェースのcreateStatementメソッドを使って、データベースにSQL文を発行するオブジェクトを取得します。そして53行目で、StatementインタフェースのexecuteQueryメソッドを使ってデータを抽出します。その際、引数にSQL文を指定します。検索結果のResultSetオブジェクトが返されるので、変数に格納しています。
59行目から67行目までで、検索結果を順番に取り出して、配列に格納しています。この配列(ArrayList)は表示するときに使用しています。86行目から96行目で、その配列をHttpServletRequestオブジェクトにセットし、JSPに転送しています。
SelectData.jspでは、6行目で保存しておいた配列(ArrayList)を取得しています。32行目から41行目で、配列をループして、1件1行のテーブルで表示しています。