2016-06-25 56 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