Spring MVCフォームのアノテーションの例を扱う
このチュートリアルでは、Spring MVC Webアプリケーションでアノテーションを使用してフォーム処理を行う方法を説明します。
1. SimpleFormControllerと@Controller
XMLベースのSpring MVC Webアプリケーションでは、 `SimpleFormController`クラスを拡張してフォームコントローラを作成します。
アノテーションベースでは、代わりに
@ Controller
を使用できます。
SimpleFormController
public class CustomerController extends SimpleFormController{ //... }
目立たない
@Controller @RequestMapping("/customer.htm") public class CustomerController{ //... }
2. formBackingObject()とRequestMethod.GET
SimpleFormControllerでは、
formBackingObject()
メソッドでバインディングのコマンドオブジェクトを初期化できます。注釈ベースでは、
@ RequestMapping(method = RequestMethod.GET)
を使用してメソッド名を注釈しても同じことができます。
SimpleFormController
@Override protected Object formBackingObject(HttpServletRequest request) throws Exception { Customer cust = new Customer(); //Make "Spring MVC" as default checked value cust.setFavFramework(new String[]{"Spring MVC"}); return cust; }
目立たない
@RequestMapping(method = RequestMethod.GET) public String initForm(ModelMap model){ Customer cust = new Customer(); //Make "Spring MVC" as default checked value cust.setFavFramework(new String[]{"Spring MVC"}); //command object model.addAttribute("customer", cust); //return form view return "CustomerForm"; }
3. OnSubmit()とRequestMethod.POST
SimpleFormControllerでは、フォーム提出は
onSubmit()
メソッドによって処理されます。アノテーションベースでは、
@ RequestMapping(method = RequestMethod.POST)
でメソッド名を注釈することで同じことができます。
SimpleFormController
@Override protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { Customer customer = (Customer)command; return new ModelAndView("CustomerSuccess"); }
目立たない
@RequestMapping(method = RequestMethod.POST) public String processSubmit( @ModelAttribute("customer") Customer customer, BindingResult result, SessionStatus status) { //clear the command object from the session status.setComplete(); //return form success view return "CustomerSuccess"; }
4. referenceData()と@ModelAttribute
SimpleFormControllerでは、通常、
referenceData()
メソッドを介して参照データをモデルに格納し、フォームビューからアクセスできます。注釈ベースでは、
@ ModelAttribute
でメソッド名を注釈しても同じことができます。
SimpleFormController
@Override protected Map referenceData(HttpServletRequest request) throws Exception { Map referenceData = new HashMap(); //Data referencing for web framework checkboxes List<String> webFrameworkList = new ArrayList<String>(); webFrameworkList.add("Spring MVC"); webFrameworkList.add("Struts 1"); webFrameworkList.add("Struts 2"); webFrameworkList.add("JSF"); webFrameworkList.add("Apache Wicket"); referenceData.put("webFrameworkList", webFrameworkList); return referenceData; }
Springのフォーム
<form:checkboxes items="${webFrameworkList}" path="favFramework"/>
-
注釈**
@ModelAttribute("webFrameworkList") public List<String> populateWebFrameworkList() { //Data referencing for web framework checkboxes List<String> webFrameworkList = new ArrayList<String>(); webFrameworkList.add("Spring MVC"); webFrameworkList.add("Struts 1"); webFrameworkList.add("Struts 2"); webFrameworkList.add("JSF"); webFrameworkList.add("Apache Wicket"); return webFrameworkList; }
Springのフォーム
<form:checkboxes items="${webFrameworkList}" path="favFramework"/>
5. initBinder()と@InitBinder
SimpleFormControllerでは、バインディングを定義するか、
initBinder()
メソッドを使用してカスタムプロパティエディタを登録します。アノテーションベースでは、
@ InitBinder
でメソッド名を注釈しても同じことができます。
SimpleFormController
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); }
目立たない
@InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); }
検証から
SimpleFormControllerでは、XML Bean設定ファイルを介してバリデータークラスをコントローラクラスに登録してマップする必要があり、検証チェックとワークフローは自動的に実行されます。
アノテーションベースでは、バリデータを明示的に実行し、
@ Controller
クラスで検証フローを手動で定義する必要があります。異なるものを見てください:
SimpleFormController
<bean class="com.mkyong.customer.controller.CustomerController"> <property name="formView" value="CustomerForm"/> <property name="successView" value="CustomerSuccess"/> <!-- Map a validator --> <property name="validator"> <bean class="com.mkyong.customer.validator.CustomerValidator"/> </property> </bean>
目立たない
@Controller @RequestMapping("/customer.htm") public class CustomerController{ CustomerValidator customerValidator; @Autowired public CustomerController(CustomerValidator customerValidator){ this.customerValidator = customerValidator; } @RequestMapping(method = RequestMethod.POST) public String processSubmit( @ModelAttribute("customer") Customer customer, BindingResult result, SessionStatus status) { customerValidator.validate(customer, result); if (result.hasErrors()) { //if validator failed return "CustomerForm"; } else { status.setComplete(); //form success return "CustomerSuccess"; } } //...
完全な例
@Controllerの完全な例を参照してください。
package com.mkyong.customer.controller; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.support.SessionStatus; import com.mkyong.customer.model.Customer; import com.mkyong.customer.validator.CustomerValidator; @Controller @RequestMapping("/customer.htm") public class CustomerController{ CustomerValidator customerValidator; @Autowired public CustomerController(CustomerValidator customerValidator){ this.customerValidator = customerValidator; } @RequestMapping(method = RequestMethod.POST) public String processSubmit( @ModelAttribute("customer") Customer customer, BindingResult result, SessionStatus status) { customerValidator.validate(customer, result); if (result.hasErrors()) { //if validator failed return "CustomerForm"; } else { status.setComplete(); //form success return "CustomerSuccess"; } } @RequestMapping(method = RequestMethod.GET) public String initForm(ModelMap model){ Customer cust = new Customer(); //Make "Spring MVC" as default checked value cust.setFavFramework(new String[]{"Spring MVC"}); //Make "Make" as default radio button selected value cust.setSex("M"); //make "Hibernate" as the default java skills selection cust.setJavaSkills("Hibernate"); //initilize a hidden value cust.setSecretValue("I'm hidden value"); //command object model.addAttribute("customer", cust); //return form view return "CustomerForm"; } @ModelAttribute("webFrameworkList") public List<String> populateWebFrameworkList() { //Data referencing for web framework checkboxes List<String> webFrameworkList = new ArrayList<String>(); webFrameworkList.add("Spring MVC"); webFrameworkList.add("Struts 1"); webFrameworkList.add("Struts 2"); webFrameworkList.add("JSF"); webFrameworkList.add("Apache Wicket"); return webFrameworkList; } @InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } @ModelAttribute("numberList") public List<String> populateNumberList() { //Data referencing for number radiobuttons List<String> numberList = new ArrayList<String>(); numberList.add("Number 1"); numberList.add("Number 2"); numberList.add("Number 3"); numberList.add("Number 4"); numberList.add("Number 5"); return numberList; } @ModelAttribute("javaSkillsList") public Map<String,String> populateJavaSkillList() { //Data referencing for java skills list box Map<String,String> javaSkill = new LinkedHashMap<String,String>(); javaSkill.put("Hibernate", "Hibernate"); javaSkill.put("Spring", "Spring"); javaSkill.put("Apache Wicket", "Apache Wicket"); javaSkill.put("Struts", "Struts"); return javaSkill; } @ModelAttribute("countryList") public Map<String,String> populateCountryList() { //Data referencing for java skills list box Map<String,String> country = new LinkedHashMap<String,String>(); country.put("US", "United Stated"); country.put("CHINA", "China"); country.put("SG", "Singapore"); country.put("MY", "Malaysia"); return country; } }
注釈を作成するには、Springのコンポーネント自動スキャン機能を有効にする必要があります。
<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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:component-scan base-package="com.mkyong.customer.controller"/> <bean class="com.mkyong.customer.validator.CustomerValidator"/> <!-- Register the Customer.properties --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="com/mkyong/customer/properties/Customer"/> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix"> <value>/WEB-INF/pages/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> </beans>
ソースコードをダウンロードする
ダウンロードする –
SpringMVC-Form-Handling-Annotation-Example.zip
(12KB)
リファレンス
春のWeb MVCコントローラ2.5]。 link://spring-mvc/spring-mvc-form-handling-example/[Spring MVCフォーム
処理例 – XMLバージョン]。リンク://spring-mvc/spring-mvc-hello-world-annotation-example/[Spring
MVC hello worldアノテーションの例]。リンク://spring-mvc/spring-mvc-multiactioncontroller-annotation-example/[Spring
MVC MultiActionController注釈の例]