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

昨日の続き。今週末の起きてる時間の9割は、パソコンの前でWebアプリについて調べたり試したりしてましたね。残りの1割は、食器洗いなどの家事を。さすがに、若干肩とか腰が疲れてきた…><


S2DAO

[ThinkIT] 第9回:O/Rマッパーの利用 (1/4)の通りに試したのですが、diconファイルとかの設定関連でいまいち分かりませんでした。なので、やっぱり本家のドキュメントを参照してみる。

流れ的には、ユーザ定義のdiconファイルからS2DAO標準のdao.diconが読み込まれて、そこにj2ee.diconがインクルードされているみたい。なので、ユーザ定義diconファイルとj2ee.diconを作って(コピーして)やって、あとは設定をいじって自分が使用しているデータベースに向くようにしてやればいいのかな。

ついでに、doltengとかSeasar - DI Container with AOP - も入れてみたけど、いまいち使い方が分かりません・・・

ログイン機能の改修

昨日作ったログイン機能を若干改造してみることに。DAOを自分で作るのではなく、S2DAOを利用してみましょう。ついでに、ユーザ登録機能も追加。

やっぱり設定関連で戸惑った。app.dicon⇒dao.dicon⇒j2ee.diconの流れとか、web.xmlでのS2ContainerServletの設定とか。けど、それさえこなせば後は楽ですね。今回INSERTを追加したけど、自分でデータベース周りを書かなくてすむというのはかなり嬉しい♪

  • ログイン画面

f:id:ikikko:20090706001627p:image

  • ユーザ登録後

f:id:ikikko:20090706001629p:image


やり残したこと

Cubby - 2分間チュートリアルなどを試したことはあるけど、S2DAOとかとの連携はまだ試してないんで。ってか、Cubby自体チュートリアルに沿って打ち込んだだけなんで、自分で組んだことはないし。

Mavenも、Cubbyのチュートリアルの中で使ったことはあるけど、自分で1から試したことはないんで。

Webアプリ開発のお作法は一朝一夕で身につくものではないんで、地道にやるしかないか。もちろん、常に頭の片隅にはおきつつ。


ソースコード

昨日と同じく、ログイン機能のソースコードを載っけておく。

  • ユーザDAO
@S2Dao(bean=User.class)
public interface UserDao {
	@Query("id = ?")
	public User findUser(String id);

	public int insert(User user);
}
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");

//		自前DAO生成
//		UserDao dao = UserDaoFactoryBak.createDao();
//		User user = dao.findUser(id);

//		Seaserコンテナ取得
		S2Container container = S2ContainerServlet.getContainer();
		UserDao dao = (UserDao) container.getComponent(UserDao.class);
		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);
		}

	}

}
public class UserCreateServlet 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");

		S2Container container = S2ContainerServlet.getContainer();
		UserDao dao = (UserDao) container.getComponent(UserDao.class);

		User user = new User();
		user.setId(request.getParameter("id"));
		user.setPassword(request.getParameter("password"));
		dao.insert(user);

		request.setAttribute("info", "ID:" + user.getId() + " が正常に登録されました");
		request.getRequestDispatcher("/userloginform.jsp").forward(request, response);
	}
}
  • diconファイル(app.dicon, UserDao.dicon, j2ee.dicon)
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
	<include path="dao/UserDao.dicon" />
</components>
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
	<include path="dao.dicon"/>
	<component class="dao.UserDao">
		<aspect>dao.interceptor</aspect>
	</component>
</components>
	(〜略〜)

	<!-- for H2 -->
	<component name="xaDataSource"
		class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
		<property name="driverClassName">
			"org.h2.Driver"
		</property>
		<property name="URL">
			<!-- "jdbc:h2:tcp://localhost:9092/demo" -->
			"jdbc:h2:file:/C:/Documents and Settings/ikikko-t/H2/SunEducation"
		</property>
		<property name="user">"sa"</property>
		<property name="password">""</property>
	</component>

	(〜略〜)