SpringMVCを使用してWEBを作るには? (実践編) | Java Springの逆引きメモ

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

'2012.03.23 追記

このブログで扱っているSpringMVCのバージョンは2.5で、情報が古くなっています。

現状、アノテーションを使用してかなり柔軟で使いやすくなっていますにひひ

この記事を削除することはしませんが、最新の情報を検索されることをお勧めします。

Spring MVC 3.xについて(日本語の記事)



-----------------------

基礎編ではAbstractCommandクラスを使用しましたが、実際にはSimpleFormControllerを使用することでほとんどのケースで事足ります。

 ・SpringMVCを使用してWEBを作るには? (基礎編)



ここでは、SimpleFormControllerクラスを使用してみましょう。


SimpleFormControllerは、パラメタとオブジェクトのバインドの方法でもあります。

それはJSPファイルとSpring設定ファイルによって簡単に実現できます。

同時にその方法も確認してみてください!ニコニコ



【SimpleFormControllerクラスの動作】

このクラスは、2つの画面を遷移するようなケースがデフォルトの動きです。

もちろん1つの画面に対しても使用できます。


例:

 データ登録画面を考えて見ます。

 ①データの入力項目を入力します。

 ②登録ボタンを押すと登録がされて、登録完了画面が表示されます。


 このとき入力項目がエラーだった場合、①の入力画面に戻って書式エラーを表示します。



上記例におけるSimpleFormControllerの動作:

 ①データ入力画面をshowForm()を使用して表示します。

  SimpleFormControllerはデフォルトでは、参照画面とデータ登録系画面を分けて考えています。

  showForm()は参照系の画面に対して呼ばれます。

  参照系か登録系かの判断は、methodのPOST/GETを利用して決めます。

  GETのときに参照系とみなします。

  また、Validatorも起動しません。


 ②登録完了画面をonSubmit()を使用して表示します。

  このメソッドはPOSTのときに呼ばれます。

  onSubmit()メソッドが呼ばれる前に、Validatorで妥当性チェックと、

  指定のModelクラス(Commandと呼びます)に値を設定する処理が実施されます。

  ValidatorやCommandクラスへの値設定で失敗した場合はエラー画面に遷移します。

 

 このように、基本的にはPOST/GETによって2画面のうちどちらの処理を起動させるかを決めています。



 <補足>

 さきほども書きましたが、1画面に対してもGET/POSTどちらも同じ処理をするようにもできます。

 その方法は、継承したクラスで下記のようにメソッドを上書きすればよいです。


 protected boolean isFormSubmission(HttpServletRequest request) {
  return true;
 }


  isFormSubmissionが2画面の処理のうちどちらの処理を起動するかを決めています。





【SimpleFormControllerサンプル】


package presentation;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import business.domain.CmdTest;

public class TestFormController extends SimpleFormController {
 @Override
 protected ModelAndView onSubmit(HttpServletRequest request,
   HttpServletResponse response, Object command, BindException errors)
   throws Exception {
  //
  CmdTest obj = (CmdTest)command;
  String msg = obj.getMessage() + "すてきなメッセージ☆";

  ModelAndView modelAndView
   = new ModelAndView(getSuccessView(), getCommandName(), command);
  modelAndView.addObject("convertedMsg", msg);
  
  return modelAndView;
 }
 
}




【入力画面(/WEB-INF/jsp/input.jsp)】

パラメタとオブジェクトのバインドについて。

下記の青字の部分がバインドと関係する部分です。

formタグになっていますが、別にformタグでなくとも普通のhtmlタグで大丈夫です。

結局、パラメタ名とオブジェクトのプロパティ名(getterの名前)が同じであればバインドされるのです。


<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"% >
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags " %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form " %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd ">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>入力テスト</title>
</head>
<body>
validatorControllerテスト<br>

<br>
<form:form method="post" >

<form:errors path="*" cssStyle="font-weight: bold; color: red;"></form:errors>
<br><br>

<form:checkbox path="display"/>

メッセージを表示します<br>

<form:input path="message"/>

<input type="submit" value="入力">
</form:form>
</body>
</html>



【完了画面(/WEB-INF/jsp/output.jsp)】

<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"% >

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd ">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>入力テスト</title>
</head>
<body>
CmdControllerテスト<br>
表示がTRUEのときにメッセージを表示します。<br>
<br>
<c:if test="${command.display}">
メッセージ:<c:out value="${convertedMsg}"/>
</c:if>
</body>
</html>




【Spring設定ファイル(一部抜粋)】

<bean id="validatorTestInputController" class="presentation.TestFormController">
<property name="commandClass" value="business.domain.CmdTest" />
<property name="commandName" value="command" />
<property name="validator" >
<bean class="validator.CmdTestValidator"/>
</property>
<property name="formView" value="/WEB-INF/jsp/input.jsp"/>
<property name="successView" value="/WEB-INF/jsp/output.jsp"/>
</bean>



formViewが、参照系の画面showForm()が呼ばれたときに表示するJSP。

successViewが、登録系の画面onSubmit()が呼ばれたときに表示するJSP。



 パラメタとオブジェクトのバインドについて:

  バインドの処理はSimpleFormController が実施しています。

  どのクラスにバインドするかは、commandClassに設定しています。

  バインドするクラスも設定ファイルの記述だけで変更できますね!
  

  バインドするオブジェクトと妥当性チェックの関係は以下の記事を参照ください。

  ・Validatorでパラメタの妥当性チェックをするには?



【その他の設定】

その他のクラスは、CmdTestクラス、Validatorクラスなどがありますが、

ここではその説明はメインではないので、下記の記事を参考にしてください。

そのままコピーして動作するはずです!

 ・Validatorでパラメタの妥当性チェックをするには?





どうでしょう。なんとなく分かりましたでしょうか?



参考:

・トップ

・SpringMVCの機能について

・SpringMVCを使用してWEBを作るには? (基礎編)

・Validatorでパラメタの妥当性チェックをするには?

・Springを使用するには?

・SpringでWEB作成するには?(基本的な作成例)

SpringMVCの基本を知る