2016-06-25 59 views
0

我嘗試用兩種其他形式填充兩個對象。在控制器中,我只是打印這些對象。 我的代碼: 控制器:在春天填充多個對象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"; 
} 

視圖:

  <%@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> 
在控制器方法

我們有@ModelAttribute( 「設備類型」)DeviceTypeDTO dt和@ModelAttribute( 「馬爾卡」)MarkaDTO馬爾卡。這些裝置哪些對象將與dt和marka實例相關。首先,我填充deviceType字段,並以第二種形式填充marka字段。當我按第一次提交這些領域將去dt(因爲modelAttribute =「deviceType」)。當我按第二次提交這些字段將去marka。(因爲modelAttribute =「marka」)@ModelAttribute是用於決定哪種形式將映射到哪個對象。但它不工作。
我需要同樣的方法,但2 objects.so我不想寫同樣的方法2倍

輸出:

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

的原因是什麼?我該如何解決它?

+0

你問在一個頁面中如何處理多個表單? – ck1

+0

我想通過相同的控制器method.when處理每個窗體,當我發佈第一個窗體時,這將首先modelattribute,當我點擊第二窗體這將去第二modelattribute.but一個名稱字段填充每個對象,雖然我點擊第一表格 – Sarkhan

+0

您的意思是*對於2個不同的請求使用相同的方法* –

回答

0

@ModelAttribute用於決定哪個表單將映射到哪個對象。

不。如果將bean聲明爲模型屬性,Spring MVC將爲您創建Model屬性。它將填充請求中的屬性。

當您提交第一個表單時,使用modelAttribute =「deviceType」 Controller方法仍然會創建2個模型對象,因爲它們被標記爲@ModelAttribute。在創建MarkaDTO對象時,它將能夠匹配名稱字段,因爲它位於請求正文中。但是markaName不在請求中,因此它是null。

我同意@ ck1的建議。

+0

感謝您的答覆。我怎樣才能做到我的目標?在一種方法中映射表單到特定的對象,以避免聲明相同的方法兩次 – Sarkhan

+1

既然你有兩種形式,它會更好地設計每個控制器方法。如果目的相似,則可以通過調用兩個方法中的相同處理方法來重用兩個方法中的業務邏輯。 –

0

我不是你想在這裏做什麼完全清楚,但我相信最有意義是你要麼:

1)整合您的兩種形式爲單一形式,具有單控制器中的@RequestMapping方法和單個DTO對象;或

2)在控制器中定義兩個單獨的@RequestMapping方法,每個表單一個。

+0

控制器方法我們有@ModelAttribute(「deviceType」)DeviceTypeDTO dt和@ModelAttribute(「marka」) MarkaDTO marka 。這意味着哪些對象將與dt和marka實例相關。 。第一種形式是填充deviceType字段,第二種形式是填充marka字段。 當我按第一次提交這些字段將去dt(因爲modelAttribute =「deviceType」)。(因爲modelAttribute =「marka」) @ModelAttribute正在使用決定哪個表單將映射到哪個對象。但它不工作 – Sarkhan

+0

我需要相同的方法,但對於2個objects.so我不想寫相同的方法2次 – Sarkhan