いきなりWEBアプリケーションを作成しようとして行き詰ってしまったので、MySQLとJSPの連携部について順を追って確認していく。
Userテーブルのデータを表示
ゴルフスコア管理でMySQLに作成したUserテーブルからデータを抽出して一覧を出力するJPSを作成する。
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.*"%>
<%
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();
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コネクションプーリングのための記述
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&useUnicode=true&characterEncoding=cp932"
/>
</Context>
|
実行結果
ブラウザのアドレスに以下のパスを指定する。
http://localhost:8080/GOLF/TEST/UserList.jsp
すると、Userテーブルのデータ一覧が出力される。
データベースコネクションプーリング(DBCP)の検証
次にデータベースコネクションプーリングの検証を行う。
コンテキストファイル:GOLF.xml
パラメータ | 説明 |
name | リソース名。lookupメソッドで使用する場合は、java:comp/env/を頭につける |
removeAbandoned | タイムアウトの制御を有効にする場合は"true" |
removeAbondonedTimeout | コネクションのタイムアウト時間(秒) |
logAbandoned | タイムアウトの自動クローズ時のログの書き出し |
auth | ユーザー名をTomcatにもたせる場合は"Container"、プログラムに持たせる場合は"Servlet" |
type | リソースタイプ |
maxActive | 同時アクセスのコネクション最大数 |
maxIdle | アイドリング上たでプーリングに残すコネクションの最大数 |
maxWait | コネクション確立の待ち時間。(ミリ秒)この時間を過ぎると例外を返す。 |
username | データベース接続のためのユーザー名 |
password | データベース接続のためのパスワード |
driverClassName | JDBCドライバのクラス名 |
url | データベース接続文字列 |
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&useUnicode=true&characterEncoding=cp932"
/>
</Context>
|
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();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/golf");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
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テーブルのデータ一覧が出力される。
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つ前の画面に戻れるようにする。
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
| |
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;
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ができる。以下、コンパイル方法
※-dオプションはクラスファイルを作成する場所を指定するためのもの。.(ドット)は現在のフォルダを表す。
ログインフォームの作成
アプリケーションフォルダの下にTESTというフォルダを作成し、その中にLoginFormTest.jspファイルを作成する。この画面は、単にユーザーとパスワードの入力エリアがあるシンプルなもの。ログインボタンのアクションによって、LoginProcessTest.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
LoginProcessTest.jspの作成
LoginProcessTest.jspでは、useBeanアクションの指定によりUserTestクラスを宣言する。UserTestクラスのloginメソッドを呼び出してuserマスタの存在チェックを実施し結果を画面に返す。
<jsp:useBean class="produst.test.UserTest" id="user" scope="session"/>
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()\"> 戻る </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>
|
課題
MySQLとJSPの連携の検証は、ゴルフスコア管理のコンパイルエラーの原因を突き止めるために行ってきたが、肝心の原因がわかっていない。。。
とりあえずuserBeanアクションまで確認ができたので、今後は本体のUser.javaのメソッドを1つ1つ確認していきたいと思う。