このチュートリアルでは、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注釈の例]