MySQLの常識を知りセットアップしてJSPからDB操作:Webアプリの常識をJSPとStrutsで身につける(8)(3/4 ページ)
次に、「C:\PKG\Hello\WEB-INF\src」配下に「login」を作成して、下記のJavaファイル「LoginAction.java」を作成してください。
LoginAction.java |
package login;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.*;
import java.sql.*;
import javax.naming.*;
import javax.sql.*;
import login.form.LoginForm;
public final class LoginAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
LoginForm loginForm = (LoginForm)form;
int count = 0;
String status = null;
String id = loginForm.getId();
String password = loginForm.getPassword();
InitialContext ic = null;
DataSource ds = null;
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
ActionMessages errors = new ActionMessages();
try {
// DB情報取得
ic = new InitialContext();
Context envCtx = (Context) ic.lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/mysql");
con = ds.getConnection();
ps = con.prepareStatement(
"select id, password, name from user where id = ?");
ps.setString(1, id);
rs = ps.executeQuery();
// 認証処理
while (rs.next()) {
count++;
if (count == 1) {
// 一致しなければ認証失敗
if (! id.equals(rs.getString("id")) ||
! password.equals(rs.getString("password"))) {
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("errors.login"));
}else{//一致データを取得
loginForm.setName(rs.getString("name"));
}
}
}
// 0件ならば認証失敗
if (count == 0) {
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("errors.login"));
}
} catch (Exception e) {
throw e;
} finally {
con.close();
}
if(rs != null){
return mapping.findForward("success");
}else{
return mapping.findForward("errors");
}
}
} |
ここで、今回のLoginAction.javaのデータベースのアクセス処理について説明します。まず、初期値としてクラスや各種インターフェイスを定義します。
次に、JDBCドライバの情報をTomcatの設定ファイル「server.xml」のコンテキスト(Context)から取得します。
// DB情報取得
ic = new InitialContext();
Context envCtx = (Context)ic.lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/mysql");
|
JDBCドライバの情報の情報を使用して、DBへアクセスします。
con = ds.getConnection();
|
DBにアクセスした状態で、SQL文を作成してIDを条件にセットし、実行した結果を取得します。
ps = con.prepareStatement(
"select id, password, name from user where id = ?");
ps.setString(1, id);
rs = ps.executeQuery();
|
SQL文の「?」は引数を意味し、setStringメソッドで引数をセットしています。また、PreparedStatementは通常のStatementとは異なり、事前にコンパイルされたSQL文を使用するので、Statementよりも処理が高速です。詳細は、記事「準備済みSQL命令でデータベースアクセスを効率化する」を参照してください。
注意すべきポイントとして、DB操作の際はエラー発生の有無にかかわらず、必ずDBとの切断を行わなければなりません。今回は、例外処理の「finally」を使用してDBとの切断を行っています。
} finally {
con.close();
} |
本稿では詳細まで解説しませんが、finally内の処理を含めたDBの切断はとても重要なことですので、記事「データベースに接続したら後始末は確実に」を参照してください。
次ページではいよいよ、DBと連携したWebアプリケーションを実行してみます。
Copyright © ITmedia, Inc. All Rights Reserved.