いろんなJava Webフレームワークで同じ画面を作ってみる(Spring MVC 3.0編)
いろんなJava Webフレームワークで同じ画面を作ってみる(Spring MVC 3.0編)です。
お題は、こちら。
- 公式サイト:15. Web MVC framework
- バージョン: 3.0.3
Spring3.0ベースのものを取り上げています。2.5ベースだと全然違うっぽいです。
app-config.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="webapp" /> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="/WEB-INF/messages/messages" /> <property name="cacheSeconds" value="0" /> </bean> <import resource="mvc-config.xml" /> </beans>
context:component-scan でベースとなるパッケージを指定します。
AddController.java
package webapp; import javax.validation.Valid; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/add") public class AddController { @RequestMapping(method = RequestMethod.GET) public String init(Model model) { model.addAttribute(new AddParam()); return "input"; } @RequestMapping(params = "calculate") public String calculate(@Valid AddParam addParam, BindingResult result, Model model) { if (result.hasErrors()) { return "input"; } model.addAttribute(addParam); model.addAttribute("result", addParam.getArg1() + addParam.getArg2()); return "result"; } }
戻りの型は、ModelAndViewとかにもできるみたいですが、まだ試してません。
リダイレクトとか、"redirect:hogehoge"って書くっぽいです。
バリデーションエラー発生時の画面遷移は、ロジックで書ける。
Controllerは、デフォルトでシングルトン?
リクエストパラメータを引数でもらうっていうのは、Struts1と同じ感じですが、実はこっちのパターンの方が好きかも知れないです。
AddParam.java
package webapp; import javax.validation.constraints.NotNull; public class AddParam { @NotNull private Integer arg1; @NotNull private Integer arg2; public Integer getArg1() { return arg1; } public void setArg1(Integer arg1) { this.arg1 = arg1; } public Integer getArg2() { return arg2; } public void setArg2(Integer arg2) { this.arg2 = arg2; } }
input.jsp
<%@page contentType="text/html;charset=UTF-8"%> <%@page pageEncoding="UTF-8"%> <%@ page session="false"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <html> <head> <META  http-equiv="Content-Type"  content="text/html;charset=UTF-8"> <title>input</title> </head> <body> <form:form modelAttribute="addParam" action="add" method="GET"> <form:errors path="*" /><br/> arg1: <form:input path="arg1"/> <form:errors path="arg1"/><br/> + <br/> arg2: <form:input path="arg2"/> <form:errors path="arg2"/><br/> <input type="submit" name="calculate" /> </form:form> </body> </html>
各フィールドのエラーをまとめて出力すにはどうすれば良いのでしょう?
(2010-11-30追記)
result.jsp
<%@page contentType="text/html;charset=UTF-8"%> <%@page pageEncoding="UTF-8"%> <%@ page session="false"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> <html> <head> <META  http-equiv="Content-Type"  content="text/html;charset=UTF-8"> <title>result</title> </head> <body> ${fn:escapeXml(addParam.arg1)} + ${fn:escapeXml(addParam.arg2)} = ${fn:escapeXml(result)} </body> </html>
動画あります。http://s3.springsource.org/MVC/mvc-showcase-screencast.mov
結構、よさげなんだけど、これも自分なりのベストプラクティスを決めるには、色々調べないといけない。
that's it.