基礎から始める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を追加したけど、自分でデータベース周りを書かなくてすむというのはかなり嬉しい♪
- ログイン画面
- ユーザ登録後
やり残したこと
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> (〜略〜)