Spring MVC-Formular zur Bearbeitung von Anmerkungsbeispielen

Beispiel für eine Spring MVC-Annotation zur Formularverarbeitung

In diesem Tutorial zeigen wir Ihnen, wie Sie die Formularverarbeitung mithilfe von Anmerkungen in der Spring MVC-Webanwendung durchführen.

Note
Dieses auf Anmerkungen basierende Beispiel wird aus den letzten Spring MVCform handling XML-based example konvertiert. Vergleichen und erkennen Sie die Unterschiede.

1. SimpleFormController vs @Controller

In einer XML-basierten Spring MVC-Webanwendung erstellen Sie einen Formularcontroller, indem Sie die KlasseSimpleFormControllererweitern.

In annotationsbasiert können Sie stattdessen@Controller verwenden.

SimpleFormController

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

Anmerkung

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

2. formBackingObject () vs RequestMethod.GET

In SimpleFormController können Sie das Befehlsobjekt für die Bindung in der MethodeformBackingObject()initialisieren. In annotationsbasiert können Sie dasselbe tun, indem Sie den Methodennamen mit@RequestMapping(method = RequestMethod.GET) kommentieren.

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;
    }

Anmerkung

        @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

In SimpleFormController wird die Formularübermittlung von der MethodeonSubmit()behandelt. In annotationsbasiert können Sie dasselbe tun, indem Sie den Methodennamen mit@RequestMapping(method = RequestMethod.POST) kommentieren.

SimpleFormController

       @Override
    protected ModelAndView onSubmit(HttpServletRequest request,
        HttpServletResponse response, Object command, BindException errors)
        throws Exception {

        Customer customer = (Customer)command;
        return new ModelAndView("CustomerSuccess");

    }

Anmerkung

    @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

In SimpleFormController fügen Sie die Referenzdaten normalerweise über die MethodereferenceData()in das Modell ein, damit die Formularansicht darauf zugreifen kann. In annotationsbasiert können Sie dasselbe tun, indem Sie den Methodennamen mit@ModelAttribute kommentieren.

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;
    }

Frühlingsform

    

Anmerkung

    @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;
    }

Frühlingsform

    

5. initBinder () vs @InitBinder

In SimpleFormController definieren Sie die Bindung oder registrieren den benutzerdefinierten Eigenschaftseditor über die MethodeinitBinder(). In annotationsbasiert können Sie dasselbe tun, indem Sie den Methodennamen mit@InitBinder kommentieren.

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));
    }

Anmerkung

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    }

Aus der Validierung

In SimpleFormController müssen Sie die Validator-Klasse über eine XML-Bean-Konfigurationsdatei registrieren und der Controller-Klasse zuordnen. Die Validierungsprüfung und die Arbeitsabläufe werden automatisch ausgeführt.

In annotationsbasiert müssen Sie den Validator explizit ausführen und den Validierungsfluss in der Klasse@Controllermanuell definieren. Siehe die verschiedenen:

SimpleFormController

    
                
        

        
        
            
        
    

Anmerkung

@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";
        }
    }
    //...

Vollständiges Beispiel

Sehen Sie sich ein vollständiges @Controller-Beispiel an.

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;
    }
}

Damit Anmerkungen funktionieren, müssen Sie die Funktion zum automatischen Scannen von Komponenten in Spring aktivieren.



    

    

    
    
        
    

    
              
                 /WEB-INF/pages/
              
              
                 .jsp
              
        

Quellcode herunterladen

Laden Sie es herunter -SpringMVC-Form-Handling-Annotation-Example.zip (12 KB)