簡単な登録画面を作成してみる。
仕様
- メニューの登録画面リンクをクリックしたら登録画面へ遷移する
- 登録画面でユーザ名を入力し登録ボタンを押したら登録処理が走る
- 登録に失敗した場合は、エラーメッセージを表示して登録画面に遷移する
- 登録に成功した場合は、登録完了画面を表示する
メニュー作成
SpringでもTilesを使えるみたいだけど、今回はシンプルにメニューを作る。
//menu.jsp <ul> <li><a href="<%= request.getContextPath() %>/reg.form">登録画面</a></li> </ul>
登録画面作成
テキストボックスは1つのシンプルな画面。エラー時はこの画面に戻るので、エラーメッセージを表示する実装を行っている。Formの値はSimpleFormContorollerを使って処理する。
//reg.jsp <h1>登録画面</h1> <c:if test="${errorMsg != null}"> <div style="color:red"><c:out value="${errorMsg}" /></div> </c:if> <form:form commandName="userCommandReg"> <table> <tr> <th>ユーザ名:</th> <td><form:input path="userName" /></td> <td><input type="submit" value="登録" /></td> </tr> </table> </form:form>
登録完了画面
成功メッセージを表示するだけのページ。
//complete.jsp <c:if test="${successMsg != null}"> <div style="color:blue"><c:out value="${successMsg}" /></div> </c:if>
UserControllerの作成
登録処理では入力された値をつかってビジネスロジッククラスを呼び出して処理する設計にしておく。Controllerは修正でも使えそうなのでビジネスロジッククラスを差し替えれるように作成。
//UserController.java public class UserController extends SimpleFormController { private IUserLogic userLogic; public IUserLogic getUserLogic() { return userLogic; } public void setUserLogic(IUserLogic userLogic) { this.userLogic = userLogic; } protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException bind) throws Exception { AppLogger.debug("UserController.onSubmit"); AppLogger.debug("bind.getModel() = " + bind.getModel()); UserCommand userCommand = (UserCommand) command; ModelAndView mav = null; if(this.userLogic.execute(userCommand)){ AppLogger.debug("処理成功"); mav = new ModelAndView(getSuccessView(), bind.getModel()); mav.addObject("successMsg", "処理に成功しました。"); }else{ AppLogger.debug("処理失敗"); mav = new ModelAndView(getFormView(), bind.getModel()); mav.addObject("errorMsg", "処理に失敗しました。"); } return mav; } }
ビジネスロジッククラス
登録と修正で使えるように、インタフェースを決定しておく。
//IUserLogic.java public interface IUserLogic { public boolean execute(UserCommand command); }
上記インタフェースを実装。
//UserRegLogic.java public class UserRegLogic implements IUserLogic { public boolean execute(UserCommand command) { AppLogger.debug("UserRegLogic.execute"); String userName = command.getUserName(); AppLogger.debug("UserName = " + userName); // UserNameが入力されていない場合はエラーとする if (userName == null || "".equals(userName)) { return false; } else { return true; } } }
Bean定義ファイル
//DispatcherServler-servlet.xml <bean id="userRegLogic" class="com.daipresents.spring204.logic.UserRegLogic" /> <bean name="/reg.form" class="com.daipresents.spring204.controller.UserController"> <property name="formView" value="/WEB-INF/jsp/reg.jsp" /> <property name="successView" value="/WEB-INF/jsp/complete.jsp" /> <property name="commandClass" value="com.daipresents.spring204.command.UserCommand"/> <property name="commandName" value="userCommandReg"/> <property name="userLogic" ref="userRegLogic"/> </bean>
動作イメージ
メニューをクリックすると登録画面に遷移する。
名前を入力して登録ボタンを押すと・・・
登録完了画面へ遷移する。
名前を入力しない場合は、登録画面へ遷移してエラーメッセージを表示する。
感想
Springのドキュメントは一例しか書いていないので、Javadocメインで調べることになったのがしんどかった。また、Springはとてもリッチなフレームワークなので、もっと便利なControllerなどがたくさんあると思うが調べるのが大変そう。
この便利さをどこまで使えるかが問われる気がする。(僕はもうあきらめかけてStruts2を調べようかと。。。)