基礎から始めるWebアプリケーション開発

自分でも想像以上にWebアプリについて分かっていなかったことが分かって、かなり凹んでいるikikkoです><*1。考えてみれば、前職の仕事ではまったく絡んでいませんでしたし、趣味でも(何らかのプラグイン作成はあっても)1からWebアプリを作ったことがないので、当たり前と言えば当たり前なのですが…。

とは言っても、このままでもいけないので、週末の空いた時間を使って少しでも詰め込むことにします。


サーブレットJSP・データベース

↑のWTPの環境で、ざっと試してみる。データベースは、HSQLDBではなくて後継のH2 Databaseを試してみました。これも初めて知ったけど、扱いやすくていいですね。

Webアプリ研修の復習

前職の時代に唯一触れたWebアプリ研修でやったことを、簡単に復習。作ったものは、ログイン画面からIDとパスワードを入力したらデータベースに問い合わせて存在するか否かを検証するという、超簡単なログイン認証の画面と仕組み。とりあえず、サーブレットJSP・H2 データベースでベタに作ってみる。なお、写経とかチュートリアルを試すのではなくて、自分で1から考えて作る。

と、ここまでやってて思ったのですが、確か研修の題材ではデータベースについてはほとんど触れてなかったのですよね。すでにデータベースとDAOクラスが用意されてたので、それを利用するだけ。何かデータベース周りのことをやってなかった気がしていたら、そーゆーことですか…orz。なので、この辺を参考にDAOとかも作ってみる。

画面イメージはこんな感じ。ログイン成功時は、(本来なら別処理があるのですが)今回はそこまで実装していません。

  • ログイン画面

f:id:ikikko:20090705125614p:image

  • エラー画面

f:id:ikikko:20090705125615p:image


今日やりたいこと

今日は、[ThinkIT] 第9回:O/Rマッパーの利用 (1/4)とかから手をつけていきます。進み具合にもよるけど、Seasar2 - Seasar2も手出したい。実際の話、ベタでWebアプリを書くことはないだろうから、この辺までは最低限身につけておかないと話にならないと思いますし…><


ソースコード

最後に、今回自分で作ってみたログイン認証のコードを貼り付けておきます。

  • ログイン画面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ログインフォーム</title>
</head>
<body>
<form action="loginServlet" method="post">
	<table border="1">
		<tr>
			<th>ID</th>
			<th>パスワード</th>
			<th></th>
		</tr>
		<tr>
			<td><input type="text" name="id"  /></td>
			<td><input type="password" name="password" /></td>
			<td><input type="submit" / value="送信"></td>
		</tr>
	</table>
</form>

<font color="red">${ error }</font>

</body>
</html>
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");

		String id = request.getParameter("id");
		String password = request.getParameter("password");

		UserDao dao = UserDaoFactory.createDao();
		User user = dao.findUser(id);

		boolean isLogin = (user != null && id.equals(user.getId()) && password.equals(user.getPassword()));
		HttpSession session = request.getSession();
		session.setAttribute("isLogin", isLogin);

		if (isLogin) {
			request.getRequestDispatcher("/meetingform.jsp").forward(request, response);
		} else {
			request.setAttribute("error", "IDかパスワードが間違っています");
			request.getRequestDispatcher("/userloginform.jsp").forward(request, response);
		}

	}
}
  • DAO関連
public class UserDaoFactory {
	public static UserDao createDao() {
		return new UserDaoImpl();
	}
}
public interface UserDao {
	public User findUser(String id);
}
public class UserDaoImpl implements UserDao {

	private static Connection getConnection() {
		try {
			Class.forName("org.h2.Driver");
			return DriverManager.getConnection("jdbc:h2:file:/C:/Documents and Settings/ikikko-t/H2/SunEducation", "sa", "");
		} catch (Exception e) {
			throw new IllegalArgumentException(e);
		}
	}

	public User findUser(String id) {
		Connection connection = null;
		PreparedStatement statement = null;

		try {
			connection = getConnection();

			statement = connection.prepareStatement("SELECT * FROM user WHERE id = ?");
			statement.setString(1, id);
			ResultSet resultSet = statement.executeQuery();

			if (!resultSet.next()) { return null; }

			User user = new User();
			user.setId(resultSet.getString("id"));
			user.setPassword(resultSet.getString("password"));
			return user;

		} catch (SQLException e) {
			throw new IllegalArgumentException();
		} finally {
			if (connection != null) {
				try {
					connection.close();
				} catch (SQLException ignore) {
				}
			}
			if (statement != null) {
				try {
					statement.close();
				} catch (SQLException ignore) {
				}
			}
		}

	}

}

*1:勉強会行けなくてごめんなさい>同期の皆様