2013-03-20 43 views
1

我是Spring MVC的新手 - 迄今爲止我已經看過大量的教程,但剛開始開發。我剛碰到這個問題:Spring MVC如何在編輯對象時處理綁定

摘要:我有一個表格,其中包含大量用戶從數據庫加載並在春季模型中備份的表格。我想爲每個用戶編輯一個編輯按鈕,並且我想調出另一個表單以編輯該用戶,並且仍然讓該用戶在模型中備份,因此我不必泄露編號或將用戶映射到隨機密鑰。

我有一個List<User>對象,我從數據庫通過@Service豆retrive,然後我通過這個名單我UserController豆。然後,在我的控制器:

@RequestMapping(value="/users", method = RequestMethod.GET) 
public ModelAndView showUsers() {  
    List<User> users = userService.getUserList(); //Get from DB. Returns some users. 
    UserSet uset = new UserSet(); //Custom object backing the list. 
    uset.setUserList(users); 

    return new ModelAndView("users", "userset", uset); 
} 

這種使用形式返回視圖users.jsp並顯示用戶列表中的表:

<form:form action="#" method="post" modelAttribute="userset"> 
    <table> 
     <tr> 
      <th>N.</th> 
      <th>Name</th> 
      <th>Email</th> 
     </tr> 
     <c:forEach var="user" items="${userset.userList}" 
      varStatus="status"> 
      <tr> 
       <td align="center">${status.count}</td> 
       <td><input name="userList[${status.index}].name" 
        value="${user.name}" id="name_${status.index}" /></td> 
       <td><input name="userList[${status.index}].email" 
        value="${user.email}" id="email_${status.index}" /></td> 
       <td><input type="button" value="Ed." id="edbtn${status.index}" 
        class="edbtn" /></td> 
      </tr> 
     </c:forEach> 
    </table> 
    <input type="submit" value="Save" /> 
</form:form> 

現在,你可以看到有一個編輯按鈕<input type="button" value="Ed." id="edbtn${status.index}" class="edbtn" />爲每個用戶。我想要做的是在單擊該按鈕時出現一個新的單用戶表單,並將我的用戶對象綁定到該表單上,這樣,如果更改名稱和電子郵件地址,我仍然可以在服務器端爲了在數據庫中更新它。上面的多用戶表單應該禁用所有字段或顯示爲標籤 - 我不想在那裏更改;我只想在那裏顯示它們,並有按鈕打開彈出式窗口或浮動div,其中包含實際的單用戶窗體。

順便說一句,我試圖捕捉與以下控制器編輯用戶:

@RequestMapping(value="users/edit", method = RequestMethod.POST) 
public String edit(@ModelAttribute(value="user") User user, BindingResult bresult) { 
    /* Do something here with the user */ 
    /* Currently the ID returned from user.getId() is null, but the original user shown in the form has an ID != null */ 
    return "redirect:/users"; 
} 

而且我通過jQuery的發送編輯請求:

jq("#edituserbtn").click(function() { 
     jq.post("users/edit", { 
      name : jq("#edfrm_n").val(), 
      email : jq("#edfrm_e").val(), 
     }, function(data, status) { 
      //jq("#changing").text(data + "; " + status); 
     }); 
    }); 

注意#edfrm_n#edfrm_e將是我想在此使用的單用戶表單的ID,而不是發回整個表單。使用jQuery我也會彈出這個單用戶表單,並將它放置在屏幕中間的所有內容之前。

這是如何實現的?

P.S .:這可能不是編輯功能的最佳方法。在這種情況下,我真的很感激你給我提供了一些提示。

感謝

+0

如果你不告訴它,Spring如何知道你正在編輯的用戶?你必須至少發送一些**信息。 – zeroflagL 2013-07-03 16:46:48

回答

1

我認爲你應該做一下存在的代碼的一些變化。您應該將用戶標識設置爲用戶編輯按鈕的值,您可以編寫一個js函數,其中的參數是用戶標識,用戶名和狀態。將其綁定到按鈕。當你點擊編輯按鈕時,它將運行js函數並在這個對話框中彈出一個新的對話框,你可以得到三個參數並顯示它們。對話框我推薦你使用jQuery對話框,因爲你已經添加了jQuery庫。你應該在這個對話框中添加保存按鈕,並在編輯用戶數據之後,只需點擊保存按鈕並調用ajax將數據發送到服務器,因爲它有id,所以你知道哪一個將被更新。並且服務器將返回更新操作的狀態,在ajax回調函數中,您將使用狀態來做其他事情。如果成功,關閉對話框並刷新主窗口,如果失敗,則彈出警報對話框。

+0

感謝您的評論。這正是我不想做的事情,儘管... Spring提供了一種綁定數據的方式,而不必將數據庫ID全部散佈到**(不管是否隱藏 - 無論如何重新發布),所以這就是我沒有尋找這種方法的原因。確實,發佈id使事情變得更簡單 - 只需捕獲該id並進入數據庫即可。但是我正在討論支持對象,這些對象「神奇地」綁定到視圖的表單和其他數據。我很感謝你的回答,無論如何:) – Azurlake 2013-03-20 13:48:35

+0

我知道你說的是因爲你使用了spring標籤,但是因爲你使用ajax,就像我的經驗一樣,那不是好的方法。 – OQJF 2013-03-20 14:07:22

0

嗯,我以爲春天正在做一些魔法我現在認爲它沒有做。正如zeroflagl所說,Spring需要知道你想要更新什麼,所以必須提供某種類型的ID或實際的DB ID。