読者です 読者をやめる 読者になる 読者になる

いろんなJava Webフレームワークで同じ画面を作ってみる(Spring MVC 3.0編)

Java

いろんなJava Webフレームワークで同じ画面を作ってみる(Spring MVC 3.0編)です。
お題は、こちら

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 &#160;http-equiv="Content-Type" &#160;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追記)
とすればよいとのことです。hiroisojpさんからコメント頂きました。ありがとうございます!

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 &#160;http-equiv="Content-Type" &#160;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.