2016-07-22 52 views
0

我正在使用Spring MVC和JSP。Spring MVC/JSP - 如何從選擇表單傳遞對象的嵌套列表到控制器

我有一個包含組實體列表的用戶實體。關係是多對多(一個組實體包含一個用戶實體列表)。

在我的用戶控制器中,我有一個返回添加用戶頁面的方法,其中包含一個空的User實體和一個可用的Group實體列表。

@RequestMapping(value = "/add", method = RequestMethod.GET) 
public ModelAndView loadUserAdd() { 
    ModelAndView mv = new ModelAndView("user/userAdd"); 
    mv.addObject("user", new User()); 
    try { 
     mv.addObject("groups", gr.listGroups()); 
    } catch (TestException e) { 
     mv.addObject("error", e.getMessage()); 
     e.printStackTrace(); 
    } 

    return mv; 
} 

在userAdd頁面上,我想從可用組列表中選擇用戶將擁有的組。

<div class="row"> 
    <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"> 
     <select id="availableGroups" class="form-control" multiple onclick="shuttle('availableGroups', 'selectedGroups')"> 
      <c:forEach items="${groups}" var="group"> 
       <option value="${group.id}">${group.id}: ${group.name}</option> 
      </c:forEach> 
     </select> 
    </div> 
    <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"> 
     <select id="selectedGroups" class="form-control" multiple onclick="shuttle('selectedGroups', 'availableGroups')"> 
      <c:forEach var="group" items="${user.groups}" varStatus="status"> 
       <option value="${group.id}">${group.id}: ${group.name}</option> 
      </c:forEach> 
     </select> 
    </div> 
</div> 

請注意,「穿梭」功能會將一個組從一個選擇元素移到另一個選擇元素。例如。從可用組到所選組,反之亦然。這工作。

提交時,我希望在用戶實體中設置選定的組,以便它將到達addUser方法。

@RequestMapping(value = "/add", method = RequestMethod.POST) 
public ModelAndView addUser(@ModelAttribute("user") User user) { 

取而代之的是,用戶實體包含一個空的組列表。我相信我的JSP是錯誤的,所以如果有人能指出我的方向是正確的,那將是非常好的。任何關於改進的建議都會很好,因爲我正在做這個學習練習。謝謝。

+0

嗯,對我的問題沒有反饋,但 - 這是一種通常的做法?有人想提供替代品嗎? – MooMoo

回答

0

一所學院提出了一種解決這個問題的方法。所提供的解決方案使用單個選擇字段而不是兩個選擇字段,其中穿梭將可用值從可用值選擇到選擇值,反之亦然。

在JSP中,我已經更換了兩個選擇字段只有一個:

<div class="row"> 
    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3"> 
     Groups 
    </div> 
    <div class="col-xs-9 col-sm-9 col-md-9 col-lg-9"> 
     <form:select 
       path="groups" 
       items="${availableGroups}" 
       multiple="true" 
       itemValue="id" 
       itemLabel="name" 
       class="form-control" /> 
    </div> 
</div> 

這種形式:在可用組選擇迭代併爲每個創建一個選項元素。選擇屬性爲:
path - 使用值'groups'映射到視圖模型(modelAndView.addObject(「users」,users);)中用戶實體上的getGroups getter方法。 項目 - 是系統中所有可用組的列表。這在控制器的模型中設置。請參閱下面的註釋。 itemValue - 是將成爲select的選項值的值。 'id'映射到當前組的getId getter方法。 itemLabel - 是將成爲選擇選項的可見標籤的值。 'name'映射到當前組的getName getter方法。 窗體:如果用戶設置了選項,select也會將選項標記爲選中狀態。

這裏是一個示例輸出,其中組是1,2,3,4(都在id和名稱),用戶有組1,2。

<div class="col-xs-9 col-sm-9 col-md-9 col-lg-9"> 
    <select id="groups" name="groups" class="form-control" multiple="multiple"> 
     <option value="1" selected="selected">1</option> 
     <option value="2" selected="selected">2</option> 
     <option value="3">3</option> 
     <option value="5">4</option> 
    </select> 
    <input type="hidden" name="_groups" value="1"/> 
    </div> 

,使「availableGroups」可我用:

@ModelAttribute("availableGroups") 
public List<Group> initializeGroups() { 
    return us.listGroups(); 
} 

這使得提供給控制器的每個視圖可供組的列表。

在提交時,爲了使用選定的組更新用戶(添加或刪除組,因爲這也適用於編輯),我使用了Converter(org.springframework.core.convert.converter.Converter)。

@Component 
public class GroupConverter implements Converter<String, Group> { 
    @Autowired 
    GroupService groupService; 
    public User convert(String element) { 
     User user = null; 
     if(element != null) { 
      int id = Integer.parseInt(element); 
      user = userService.fetchUser(id); 
     } 
     return user; 
    } 
} 

Converter接收組的id並從數據源中獲取它,然後在控制器被調用之前神奇地將其設置在用戶實體中。

轉換器是在WebMvcConfigurationSupport設置...

@Autowired 
GroupConverter groupConverter; 

@Override 
public void addFormatters(FormatterRegistry registry) { 
    registry.addConverter(groupConverter); 
} 
相關問題