2010-07-20 65 views
2

我有一個可以輸入購買的頁面,以及購買的所有foos。 我有一個HTML文檔中的三個元素被解析成逗號分隔的格式。通過Spring填充請求的集合?

function submitStuff() 
{ 
//grab each cells value from dynamically built table based on user entries 
//appending comma 
    document.form.ids.value=Ids; 
    document.form.price.value=prices; 
    document.form.qtys.value=qtys; 
    document.form.submit(); 
} 

一旦打散,每個ID /價格/數量應填充到一個對象...

public class foo{ 
private int id; 
private BigDecimal price; 
private int qty; 
//set&get; 
} 

可以屬於作爲一個集合到另一個對象...

public class purchase{ 
private Date date; 
private int buyId; 
private List<foo> purchases; 
//set&get; 
} 

我知道我可以抓住請求參數並逐個構建foo對象。我認爲在購買對象上執行數據綁定時有更好的方式來填充該列表,因爲它正確地填充了所有其他屬性。

+0

什麼是您網站的網址?我一直想知道我可以在哪裏買到「foo」。 :-) – 2010-07-20 03:45:02

回答

0

除了將事件連接成一個逗號分隔的參數並將其拆分到服務器端(這是一個非常誠實的nasty方法),您也可以只使用相同的參數名稱發送多個參數值。然後它將作爲參數名稱上的HttpServletRequest#getParameterValues()作爲String[]數組提供。

我不做春天,所以這裏是一個普通的HTML/Servlet的例子給想法:

<table> 
    <tr> 
     <td>ID: 12<input type="hidden" name="id" value="12"></td> 
     <td>Qty: <input type="text" name="qty"></td> 
     <td>Price: $100.00<input type="hidden" name="price" value="100.00"></td> 
    </tr> 
    <tr> 
     <td>ID: 54<input type="hidden" name="id" value="54"></td> 
     <td>Qty: <input type="text" name="qty"></td> 
     <td>Price: $200.00<input type="hidden" name="price" value="200.00"></td> 
    </tr> 
    <tr> 
     <td>ID: 8<input type="hidden" name="id" value="8"></td> 
     <td>Qty: <input type="text" name="qty"></td> 
     <td>Price: $500.00<input type="hidden" name="price" value="500.00"></td> 
    </tr> 
</table> 

的Servlet:

String[] ids = request.getParameterValues("id"); 
String[] qtys = request.getParameterValues("qty"); 
String[] prices = request.getParameterValues("price"); 

for (int i = 0; i < ids.length; i++) { 
    Long id = Long.parseLong(ids[i]); 
    Integer qty = Integer.parseInt(qtys[i]); 
    BigDecimal price = new BigDecimal(prices[i]); 
    // ... 
} 

然而,我非常質疑是否有必要發送從客戶端到服務器的價格也是如此。我寧願(重新)計算服務器端的價格,因爲客戶端可以完全控制它發送的請求參數,因此可以改變表單控制之外的參數值。

+0

我一定會把它改成一個參數名,以節省我把逗號放在客戶端。我已經有了類似的控制器代碼,並且可以驗證它。 這是一個純粹的數據輸入屏幕,所以不用擔心客戶修改價格......因爲他們正在進入它! – ClutchDude 2010-07-20 16:00:29

0

您需要創建一個列表。然後創建購買並確保使用setter方法在購買之前設置foo列表,然後將其綁定到表單或將其添加到模型映射(取決於您是使用simpleform還是註釋控制器)。

0

你可以使用Spring的「本地」綁定機制。

樣品控制器:

@Controller 
public class OrderController { 
    @ModelAttribute("purchase") 
    public Purchase getPurchase(@RequestParam("purchase-id") int purchaseId) { 
     // create purchase object 
    } 

    @RequestMapping(...) 
    public void processPosting(@ModelAttribute("purchase") Purchase purchase) { 
     // process order 
    } 
} 

示例HTML:

<spring:form commandName="purchase"> 
    <table> 
     <c:forEach var="item" items="${purchase.items}" varStatus="status"> 
      <spring:nestedPath path="purchase.items[${status.index}]"> 
       <tr> 
        <td>ID: 8 <form:hidden path="id" /> 
        <td>Quantity: 8 <form:text path="quantity" /> 
       </tr> 
      </spring:nestedPath> 
     </c:forEach> 
    </table> 
    <input type="submit" /> 
</spring:form> 

方法getPurchase()將被稱爲在每次請求,並提供默認購買這將隨後與從請求值填充。此方法接受常規註釋,如演示@RequestParam,這將幫助您創建正確的購買對象。

購買將作爲名稱purchase的請求屬性提供。

表單遍歷所有purchease項目並創建一個使用索引訪問購買項目列表的嵌套路徑,因此請確保項目的順序始終相同!

然後將請求參數命名爲purchase.items[0].quantity,用於第一個項目等等。Spring會將這些參數名稱綁定到模型屬性purchase,屬性items,索引0,屬性quantity,就像常規屬性路徑一樣。

希望這可以幫助你完成你的任務。

+0

gozie的好處:你應該初始化你購買的列表:'private final List items = new LinkedList();'。 – 2010-12-07 11:34:52