2016-06-25 15 views
0

Ich versuche, zwei Objekte in zwei anderen Formen zu füllen. Und im Controller drucke ich nur diese Objekte. meinen Code: Controller:Füllen mehrerer Objekte im Frühjahr mvc

@RequestMapping(value = "/mvcaddDevice", method = RequestMethod.POST) 
public String addDevice(
     @ModelAttribute("deviceType") DeviceTypeDTO dt, 
     @ModelAttribute("marka") MarkaDTO marka, 
     ModelMap model 
) { 
    System.out.println("you send deveiceType=" + dt); 
    System.out.println("you send marka=" + marka); 
    model.addAttribute("dt", dt); 
    model.addAttribute("marka", marka); 
    return "result"; 
} 

Ansicht:

  <%@page contentType="text/html" pageEncoding="windows-1252"%> 
      <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 
      <!DOCTYPE html> 
      <html> 
       <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> 
        <title>JSP Page</title> 
       </head> 
       <body> 
        <h2>${message}</h2> 
        <img src="assets/goodboy.jpg"/> 
        <form:form method="POST" 
           action="/mvcaddDevice" 
           commandName="deviceType" 
           modelAttribute="deviceType" 
           > 
         <table> 
          <tr> 
           <td><form:label path="name">Name</form:label></td> 
           <td><form:input path="name" /></td> 
          </tr> 
          <tr> 
           <td><form:label path="order">order</form:label></td> 
           <td><form:input path="order" /></td> 
          </tr> 
          <tr> 
           <td colspan="2"> 
            <input type="submit" value="Add device type"/> 
           </td> 
          </tr> 
         </table> 
        </form:form> 

        <form:form 
         method="POST" 
         action="/mvcaddDevice" 
         commandName="marka" 
         modelAttribute="marka" 
         > 
         <table> 
          <tr> 
           <td><form:label path="markaName">Name</form:label></td> 
           <td><form:input path="markaName" /></td> 
           <td><form:input path="name" /></td> 
          </tr> 
          <tr> 
           <td colspan="2"> 
            <input type="submit" value="Add marka"/> 
           </td> 
          </tr> 
         </table> 
        </form:form> 
       </body > 
      </html> 

in Controller-Methode haben wir @ModelAttribute ("device") DeviceTypeDTO dt und @ModelAttribute ("marka") MarkaDTO marka .Diese Mittel welches Objekt wird mit dt- und marka-Instanzen in Verbindung gebracht werden. In der ersten Form bearbeite ich DeviceType-Felder und in der zweiten Form fülle ich Marka-Felder. wenn ich zuerst drücke, gehen diese Felder zu dt (wegen modelAttribute = "deviceType"). Wenn ich zweites drücke, gehen diese Felder zu marka. (wegen ModelAttribute = "marka") @ModelAttribute verwendet zur Entscheidung, welches Formular welchem ​​Objekt zugeordnet wird. Aber es funktioniert nicht.
ich brauche gleiche Methode, aber für 2 objects.so i dont wanna gleiche Methode 2 mal schreiben

Ausgang:

Info: you send deveiceType=DeviceTypeDTO{name=test, order=0} 
Info: you send marka=MarkaDTO{markaName=null, name=test} 

was ist der Grund? Wie kann ich es lösen?

+0

Fragen Sie, wie Sie mit mehreren Formularen auf einer Seite umgehen können? – ck1

+0

Ich möchte jedes Formular mit der gleichen Controller-Methode behandeln. Wenn ich das erste Formular posten, wird das erste Modelattribut gehen, und wenn ich auf das zweite Formular klicke, wird das zweite Modelattribut gehen. Aber ein Namensfeld füllt jedes Objekt, obwohl ich zuerst klicke Formular – Sarkhan

+0

Meinst du * mit der gleichen Methode * für 2 verschiedene Anfragen? –

Antwort

0

@ModelAttribute verwendet zur Entscheidung, welche Form welchem ​​Objekt zugeordnet wird.

Nein. Wenn Sie eine Bean als Modellattribut deklarieren, erstellt Spring MVC das Model-Attribut für Sie. Es füllt die Attribute aus der Anfrage.

Wenn Sie das erste Formular mit modelAttribute = "deviceType" eingereicht haben, erstellt die Controller-Methode weiterhin zwei Modellobjekte, da die beiden als @ModelAttribute markiert wurden. Beim Erstellen des MarkaDTO-Objekts könnte das Namensfeld übereinstimmen, da es im Anfragetext enthalten war. Aber markaName war nicht in der Anfrage, also ist das null.

Ich stimme den @ ck1 Vorschlägen zu.

+0

danke für die Antwort.Und wie kann ich mein Ziel? Mapping Formen zu bestimmten Objekt in einer Methode zur Vermeidung zu erklären, die gleiche Methode zweimal – Sarkhan

+1

Da Sie zwei Formen haben, würde es besser sein, eine Controller-Methode für jeden zu haben. Wenn der Zweck ähnlich ist, können Sie die Geschäftslogik innerhalb der beiden Methoden wiederverwenden, indem Sie dieselbe Verarbeitungsmethode in ihnen aufrufen. –

0

Ich bin nicht ganz klar, was Sie hier tun wollen, aber ich glaube, was am meisten Sinn macht für Sie entweder:

1) Konsolidieren Sie Ihre zwei Formen in einer einzigen Form, mit einem einzigen @RequestMapping Methode in Ihrem Controller und ein einzelnes DTO-Objekt; oder

2) Definieren Sie zwei separate @RequestMapping Methoden in Ihrem Controller, einen pro Formular.

+0

in Controller-Methode haben wir @ModelAttribute ("deviceType") DeviceTypeDTO dt und @ModelAttribute ("marka") MarkaDTO marka . Dies bedeutet, welches Objekt wird mit dt und marka Instanzen in Verbindung gebracht werden. In erster Form fülle ich DeviceType Felder und in zweiter Form fülle ich marka Felder. Wenn ich zuerst auf "Senden" drücke, werden diese Felder auf "dt" gesetzt (wegen modelAttribute = "deviceType"). Wenn ich zweite Taste drücken, werden diese Felder zu Marka gehen. (Wegen ModelAttribute = "marka") @ModelAttribute verwendet für die Entscheidung, welches Formular zu welchem ​​Objekt zugeordnet wird. Aber es funktioniert nicht – Sarkhan

+0

Ich brauche die gleiche Methode, aber für 2 objects.so ich möchte nicht die gleiche Methode schreiben 2 mal – Sarkhan