Java/JSPのRepeat コントロールについて

前回、Visual C# .NETでRepeaterコントロールを使って、シンプルに繰り返し処理を書く方法を紹介いたしましたが、
今回は、JavaJSPを使って、シンプルに繰り返し処理を書く方法を紹介いたします。

※データベースは、MySQLへの接続で説明しています。

Repeatタグ利用の為の準備

1.WebLogic Serverをダウンロードし、その中の ext ディレクトリの weblogic-tags.jar ファイルを、
  JSP を格納する Web アプリケーションの WEB-INF/lib ディレクトリにコピーします。

2.このタグ ライブラリ記述子を、Web アプリケーション デプロイメント記述子 (web.xml) の 要素で参照します。
  (※web.xmlは、C#Visual C# .NETでと言う、Web.configのような役割をするファイルです。)
  次に例を示します。

  <taglib>
      <taglib-uri>weblogic-tags.tld</taglib-uri>
      <taglib-location>
         /WEB-INF/lib/weblogic-tags.jar
      </taglib-location>
  </taglib>

表示するデータの内容

表示するデータは以下の3件とします。

データベース名:authors
au_id              au_name        au_from       au_hobby      icon
-------------------------------------------------------------------------
tarou_yamamoto     山本 太郎     日本          旅行          1
hanako_yamamda     山田 花子     日本          映画鑑賞      3
micheal_mead       Micheal Mead   アメリカ      ダンス        2

HelloUserServlet.javaの記述

サーブレットでは、データベースへ接続し、取得したデータをリクエストにセットしています。

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Vector;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloUserServlet extends HttpServlet {

  /**HTTP リクエストの処理*/
  public void service(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException{
  {

    String strUrl = "";

    try{
      
      // ユーザーのデータを取得
      Vector vecUser = getAuthors();

      // リクエストにセット
      request.setAttribute("UserList", vecUser);
      
      strUrl = "/jsp/repeat.jsp";
      
    }
    catch(Exception e){
      
      strUrl = "/jsp/error.jsp";

    }
    finally{

      // Jspに対して出力を行う。
      ServletContext sc = getServletContext();
      sc.getRequestDispatcher(strUrl).forward(request, response);
    }
  }


  /**
   * データベースに接続し、ユーザ情報を取得
   * @return Vector
   */
  private Vector getAuthors() throws Exception{

    Connection con = null;
    PreparedStatement ps = null;
    Vector vec = new Vector();

    try {

      // データベースへ接続
      con = DriverManager.getConnection("jdbc:mysql://localhost/authors","root","root");

      // SQL文を作成
      String sql = "select * from authors";

      // ステートメントオブジェクトを生成
      ps = con.prepareStatement(sql);

      // クエリーを実行して結果セットを取得
      ResultSet rs = ps.executeQuery();

      HashMap map = new HashMap();
      // 検索された行数分ループ
      while(rs.next()) {

        // アイコンID名前を取得
        map.put("icon", rs.getString("icon"));

        // 名前を取得
        map.put("au_name", rs.getString("au_name"));

        // 出身地データを取得
        map.put("au_from", rs.getString("au_from"));

        // 趣味を取得
        map.put("au_hobby", rs.getString("au_hobby"));

        // VectorへHashMapをセット
        vec.add(map);

      }
      
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      try {
        // close処理
        if(ps != null){
          ps.close();
        }

        // close処理
        if(con != null){
          con.close();
        }
      } catch(SQLException e){
        e.printStackTrace();
      }
    }
    
    return vec;
  }
}

repeat.jspの記述

1.JSP側では、上部でtaglib ディレクティブの使用を宣言します。
2.リクエストから、サーブレットでセットした、ユーザー情報を取得します。
3.for()文を使わないで、シンプルなコードで繰り返し処理を書くことが出来ます。

<!-- 1.taglib ディレクティブを使用を宣言 -->
<%@ taglib uri="weblogic-tags.tld" prefix="wl" %>
<%
	// 2.リクエストからデータを取得
	Vector vecUser = (Vector)request.getAttribute("UserList");
%>

(中略)

<table class="p" border="1" cellspacing="0" cellpadding="3" width="25%">
<!-- 項目表示 -->
<tr class="ss">
    <th>アイコン</th>
    <th>名前(出身地)</th>
    <th>趣味</th>
</tr>
<!-- 3.繰り返し処理部分 start -->
<wl:repeat id="record" set="<%= vecUser %>" type="java.util.Vector">
<tr align="center">
	<td>
		<!-- アイコン -->
		<img src="./img/<%= ((HashMap)record.get(idx)).get("icon").toString() %>.gif">
	</td>
	<td>
		<!-- 名前 -->
		<%= ((HashMap)record.get(idx)).get("au_name").toString() %>
		<!-- 出身地 --><%= ((HashMap)record.get(idx)).get("au_from").toString() %></td>
	<td>
		<!-- 趣味 -->
		<%= ((HashMap)record.get(idx)).get("au_hobby").toString() %>
	</td>
</tr>
<wl:repeat>
<!-- 繰り返し処理部分 end -->
</table>

画面の表示

データが表示されました。