Spring MVCフォームのアノテーションの例を扱う

Spring MVCフォーム処理アノテーションの例

このチュートリアルでは、Spring MVC Webアプリケーションで注釈を使用してフォーム処理を行う方法を示します。

Note
この注釈ベースの例は、最後のSpring MVCform handling XML-based exampleから変換されています。 だから、違いを比較して見つけてください。

1. SimpleFormControllerと@Controller

XMLベースのSpringMVC Webアプリケーションでは、SimpleFormControllerクラスを拡張してフォームコントローラーを作成します。

注釈ベースでは、代わりに@Controllerを使用できます。

SimpleFormController

public class CustomerController extends SimpleFormController{
      //...
}

アノテーション

@Controller
@RequestMapping("/customer.htm")
public class CustomerController{
      //...
}

2. formBackingObject()vs 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()vs 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()vs @ModelAttribute

SimpleFormControllerでは、通常、referenceData()メソッドを介してモデルに参照データを配置し、フォームビューがそれにアクセスできるようにします。 アノテーションベースでは、メソッド名に@ModelAttributeアノテーションを付けることで同じことができます。

SimpleFormController

    @Override
    protected Map referenceData(HttpServletRequest request) throws Exception {

        Map referenceData = new HashMap();

        //Data referencing for web framework checkboxes
        List webFrameworkList = new ArrayList();
        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;
    }

春の形

    

アノテーション

    @ModelAttribute("webFrameworkList")
    public List populateWebFrameworkList() {

        //Data referencing for web framework checkboxes
        List webFrameworkList = new ArrayList();
        webFrameworkList.add("Spring MVC");
        webFrameworkList.add("Struts 1");
        webFrameworkList.add("Struts 2");
        webFrameworkList.add("JSF");
        webFrameworkList.add("Apache Wicket");

        return webFrameworkList;
    }

春の形

    

5. initBinder()vs @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

    
                
        

        
        
            
        
    

アノテーション

@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.example.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.example.customer.model.Customer;
import com.example.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 populateWebFrameworkList() {

        //Data referencing for web framework checkboxes
        List webFrameworkList = new ArrayList();
        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 populateNumberList() {

        //Data referencing for number radiobuttons
        List numberList = new ArrayList();
        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 populateJavaSkillList() {

        //Data referencing for java skills list box
        Map javaSkill = new LinkedHashMap();
        javaSkill.put("Hibernate", "Hibernate");
        javaSkill.put("Spring", "Spring");
        javaSkill.put("Apache Wicket", "Apache Wicket");
        javaSkill.put("Struts", "Struts");

        return javaSkill;
    }

    @ModelAttribute("countryList")
    public Map populateCountryList() {

        //Data referencing for java skills list box
        Map country = new LinkedHashMap();
        country.put("US", "United Stated");
        country.put("CHINA", "China");
        country.put("SG", "Singapore");
        country.put("MY", "Malaysia");

        return country;
    }
}

注釈を機能させるには、Springでコンポーネントの自動スキャン機能を有効にする必要があります。



    

    

    
    
        
    

    
              
                 /WEB-INF/pages/
              
              
                 .jsp
              
        

ソースコードをダウンロード

ダウンロード–SpringMVC-Form-Handling-Annotation-Example.zip(12KB)