Top > MySQLとJSPの連携

MySQLとJSPの連携

いきなりWEBアプリケーションを作成しようとして行き詰ってしまったので、MySQLとJSPの連携部について順を追って確認していく。

Userテーブルのデータを表示

ゴルフスコア管理MySQLに作成したUserテーブルからデータを抽出して一覧を出力するJPSを作成する。

JSPファイルの作成

  • ファイルのおき場所
    c:\produst\GOLF\TEST\UserList.jsp
fileUserList.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
 
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
 
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/golf"
    + "?user=USER1&password=INIT"
    + "&useUnicode=true&characterEncoding=cp932";
 
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
 
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
 
//SQLコマンドを作成
String strSql = "SELECT * FROM user";
 
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPテスト</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>MySQLデータベースとJSPの連携テスト</H1>
<%while(rs.next()){%>
    <DIV CLASS="section">
    <P>ID=<%=rs.getInt("id")%></P>
    <P>user_name=<%=rs.getString("user_name")%></P>
    <P>password=<%=rs.getString("password")%></P>
    <P>real_name=<%=rs.getString("real_name")%></P>
    <P>priv=<%=rs.getInt("priv")%></P>
    <P>auto_key=<%=rs.getString("auto_key")%></P>
    </DIV>
<%}
stmt.close();
conn.close();
%>
</BODY></HTML>

GOLF.xmlの作成

ブラウザからアクセスできるようにコンテキストファイルを作成する。
※<Resource 以下はDBコネクションプーリングのための記述

  • ファイルのおき場所
    C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost\GOLF.xml
fileGOLF.xml
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="C:/produst/GOLF" path="/GOLF">
    <Resource name="jdbc/golf"
        removeAbandoned="true"
        removeAbandonedTimeout="60"
        logAbandoned="true"
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="20"
        maxIdle="60"
        maxWait="1000"
        username="USER1"
        password="INIT"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost/golf?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=cp932"
    />
</Context>
 

実行結果

ブラウザのアドレスに以下のパスを指定する。

http://localhost:8080/GOLF/TEST/UserList.jsp

すると、Userテーブルのデータ一覧が出力される。

UserList.PNG

データベースコネクションプーリング(DBCP)の検証

次にデータベースコネクションプーリングの検証を行う。

コンテキストファイル:GOLF.xml

パラメータ説明
nameリソース名。lookupメソッドで使用する場合は、java:comp/env/を頭につける
removeAbandonedタイムアウトの制御を有効にする場合は"true"
removeAbondonedTimeoutコネクションのタイムアウト時間(秒)
logAbandonedタイムアウトの自動クローズ時のログの書き出し
authユーザー名をTomcatにもたせる場合は"Container"、プログラムに持たせる場合は"Servlet"
typeリソースタイプ
maxActive同時アクセスのコネクション最大数
maxIdleアイドリング上たでプーリングに残すコネクションの最大数
maxWaitコネクション確立の待ち時間。(ミリ秒)この時間を過ぎると例外を返す。
usernameデータベース接続のためのユーザー名
passwordデータベース接続のためのパスワード
driverClassNameJDBCドライバのクラス名
urlデータベース接続文字列
fileGOLF.xml
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="C:/produst/GOLF" path="/GOLF">
    <Resource name="jdbc/golf"
        removeAbandoned="true"
        removeAbandonedTimeout="60"
        logAbandoned="true"
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="20"
        maxIdle="60"
        maxWait="1000"
        username="USER1"
        password="INIT"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost/golf?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=cp932"
    />
</Context>
 

JSPファイルの作成

  • ファイルのおき場所
    c:\produst\GOLF\TEST\UserListDbcp.jsp
fileUserListDbcp.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*,javax.sql.*,javax.naming.*"%>
<%
 
//コンテキスト初期化
Context ctx = new InitialContext();
//データソースのlookup
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
//コネクションオブジェクト定義
Connection conn = ds.getConnection();
//ステートメントの定義
Statement stmt = conn.createStatement();
 
//SQLコマンドを作成
String strSql = "SELECT * FROM user";
 
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPテスト</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>MySQLデータベースとJSPの連携テスト</H1>
<%while(rs.next()){%>
    <DIV CLASS="section">
    <P>ID=<%=rs.getInt("id")%></P>
    <P>user_name=<%=rs.getString("user_name")%></P>
    <P>password=<%=rs.getString("password")%></P>
    <P>real_name=<%=rs.getString("real_name")%></P>
    <P>priv=<%=rs.getInt("priv")%></P>
    <P>auto_key=<%=rs.getString("auto_key")%></P>
    </DIV>
<%}
stmt.close();
conn.close();
ctx.close();
%>
</BODY></HTML>

実行結果

ブラウザのアドレスに以下のパスを指定する。

http://localhost:8080/GOLF/TEST/UserListDbcp.jsp

すると、Userテーブルのデータ一覧が出力される。

UserList.PNG

useBeanアクションの検証

データベースコネクションプーリングの検証ができたので、次にJPSにおけるuserBeanアクションについて検証する。

BeanとはJSPに組み込んで使用するJavaのクラスのことであると解釈している。(今のところ。。。)Beanを使うメリットは、JSPコードにおけるHTMLとJavaコードの分割しわかりやすくすることだと思う。つまりMVCモデルのデータ操作であるModelの役割りとViewの役割りを明確化すること。Beanはコンパイルして部品化できる。

ここではユーザーとパスワードだけを入力して、ユーザーマスタにデータが登録されているかどうかの結果を返す単純なUserTestクラスを作成し、useBeanアクションによりJSPコードに組み込んで連携させる検証を行う。

UserTestクラスの作成

produst.testというパッケージを宣言してUserTestクラスを作成する。
このクラスはloginメソッドだけをもち、引数で渡されたユーザー名とパスワードでuserテーブルにユーザーの照合をおこなう。userテーブルにデータが登録されている場合は、「ログインしました」、userテーブルにデータが存在していない場合は「ユーザ名またはパスワードが違います。」というメッセージを画面に出力する。ログインに失敗した場合は JavaScriptにより1つ前の画面に戻れるようにする。

fileUserTest.java
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
/*
プログラム名:UserTest.java
作成者:
*/
package produst.test;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
 
public class UserTest {
 
    /** フィールド定義 */
    private int intId=0;
    private int intPriv=0;
    private String strUserName="";
    private String strRealName="";
    private String strUrl=null;
    
    
    /** loginメソッド */
    public boolean login(String strUserName, String strPassword) throws Exception{
        boolean blResult=false;
        Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
        Connection conn = ds.getConnection();
        
        // ユーザーマスタ存在チェック
        String strSql = "SELECT * FROM user " 
                       + "WHERE user_name = ? "
                         + "AND password  = password(?) "
                         + "AND priv != 0 ";
        PreparedStatement pstmt = conn.prepareStatement(strSql);
        pstmt.setString(1, strUserName);
        pstmt.setString(2, strPassword);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
            this.intId = rs.getInt("id");
            this.strRealName = rs.getString("real_name");
            this.intPriv = rs.getInt("priv");
            blResult = true;
        }
        
        // クローズ処理
        pstmt.close();
        conn.close();
        
        // 結果を返す
        return blResult;
    }
}

UserTest.javaのコンパイル方法

クラスファイルは、アプリケーション(ここではGOLF)フォルダのWEB-INF\classesフォルダの下におく必要がある。今回のUserTestクラスはprodust.testパッケージに定義したので、classesの下のprudostフォルダの下のtestフォルダの中にUserTest.classができる。以下、コンパイル方法

  • UserTest.javaファイルがWEB-INF\classesフォルダにある場合
    >javac -d . UserTest.java

※-dオプションはクラスファイルを作成する場所を指定するためのもの。.(ドット)は現在のフォルダを表す。

  • UserTest.classファイルができる場所
    c:\produst\GOLF\WEB-INF\classes\produst\test\UserTest.class

ログインフォームの作成

アプリケーションフォルダの下にTESTというフォルダを作成し、その中にLoginFormTest.jspファイルを作成する。この画面は、単にユーザーとパスワードの入力エリアがあるシンプルなもの。ログインボタンのアクションによって、LoginProcessTest.jspを呼び出す。

fileLoginFormTest.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
<%@ page contentType="text/html; charset=Windows-31J"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理ログイン画面(TEST)</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>ログイン</H1>
<FORM ACTION="LoginProcessTest.jsp" METHOD="post">
    <DIV CLASS="section">
        ユーザ名:    <INPUT TYPE="text" NAME="user_name" SIZE="20" MAXLENGTH="20">
    </DIV>
    <DIV CLASS="section">
        パスワード:<INPUT TYPE="password" NAME="password" SIZE="20" MAXLENGTH="20">
    </DIV>
    <DIV CLASS="section">
        <INPUT TYPE="submit" VALUE="ログイン">
    </DIV>
</FORM>
</BODY></HTML>
http://localhost:8080/GOLF/TEST/LoginFormTest.jsp
LoginFormTest.PNG

LoginProcessTest.jspの作成

LoginProcessTest.jspでは、useBeanアクションの指定によりUserTestクラスを宣言する。UserTestクラスのloginメソッドを呼び出してuserマスタの存在チェックを実施し結果を画面に返す。

<jsp:useBean class="produst.test.UserTest" id="user" scope="session"/>
fileLoginProcessTest.jsp
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
<%@ page contentType="text/html; charset=Windows-31J"%>
<jsp:useBean class="produst.test.UserTest" id="user" scope="session"/>
<%
String strUserName=request.getParameter("user_name");
String strPassword=request.getParameter("password");
String strMessage=null;
 
try{
    boolean blResult = user.login(strUserName,strPassword);
    if(blResult){
        strMessage="ログインしました。";
    }else{
        strMessage="ユーザ名またはパスワードが違います。"
        +"<A HREF=\"javascript:history.back()\">&nbsp;戻る&nbsp;</A>";
    }
}catch(Exception e){
    strMessage=e.getMessage();
}
 
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>ゴルフスコア管理(TEST)</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="../style.css">
</HEAD><BODY>
<H1>ログイン</H1>
<DIV CLASS="section">
<%=strMessage%>
</DIV>
</FORM>
</BODY></HTML>
  • ログインに成功した場合
    LoginFormTestOK.PNG
  • ログインに失敗した場合
    LoginFormTestNG.PNG

課題

MySQLとJSPの連携の検証は、ゴルフスコア管理のコンパイルエラーの原因を突き止めるために行ってきたが、肝心の原因がわかっていない。。。 (T-T

とりあえずuserBeanアクションまで確認ができたので、今後は本体のUser.javaのメソッドを1つ1つ確認していきたいと思う。


添付ファイル: fileUserTest.java 578件 [詳細] fileLoginProcessTest.jsp 617件 [詳細] fileLoginFormTest.jsp 701件 [詳細] fileLoginFormTestOK.PNG 538件 [詳細] fileLoginFormTestNG.PNG 566件 [詳細] fileLoginFormTest.PNG 937件 [詳細] fileUserListDbcp.jsp 663件 [詳細] fileUserList.PNG 716件 [詳細] fileGOLF.xml 826件 [詳細] fileUserList.jsp 760件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2008-01-26 (土) 07:11:00 (5927d)