2010-08-26 46 views
0

我有一個JSP,我從數據庫顯示日期和描述。每個條目都有唯一的ID,但我沒有在頁面上顯示(顯示覆選框) 使用「logic:iterate」引發了這些條目,因此行數總是根據條目而變化。 現在這些字段顯示爲文本字段,以便用戶也可以更新日期或說明。複選框位於左側,因此 用戶可以選擇他們想要更新的所有值。記住邏輯:迭代上面,複選框必須使用名稱來定義,並且 不能有id。在我的struts行動類錯誤

... 
... 
<logic:notEmpty name="specialResult" scope="request"> 
    <logic:iterate name="specialResult" id="specialResult" indexId="index"> 
     <tr align="center"> 
      <td width="15%"> 
      <input type="checkbox" name="upisActive" property="upisActive" 
           value="<bean:write name="specialResult" property="upId"/>"></input></td> 
      <td width="15%"><input type="text" name="upDate" value="<bean:write name="specialResult" property="upDate"/>" 
           property="upDate" size="20" class="Date" id="Date"></input></td> 
      <td width="15%"><input type="text" name="upDesc" value="<bean:write name="specialResult" property="upDesc"/>" 
           property="upDesc" size="20" id="Desc"/></td> 
     </tr> 
    </logic:iterate> 

... 

我的錯誤是,如果我有三個排,我想更新第三排和第三選擇複選框。我的Action類正在檢索第一行日期和desc。 如何編輯我的操作類以檢查選中的複選框的值?

public ActionForward class(ActionMapping mapping, ActionForm theForm, 
     HttpServletRequest request, HttpServletResponse response) throws IOException, 
     SQLException, ServletException 
{ 
    Connection conn = null; 
    Service Serv = new Service(); 
    List updList = new ArrayList(); 
    Form upForm = (Form) theForm; 
    String[] values = request.getParameterValues("upisActive"); 
    try 
    { 
     conn = getConnection(request, false); 
     for (int i=0;i<values.length;i++){ 
      VO hdvo = new VO(); //Vo class with getters and setters 
      val = values[i]; 
      hdvo.setDate(upForm.upDate[i]); 
      hdvo.setDesc(upForm.upDesc[i]); 
      updList.add(hdvo); 

     } 
     hdServ.updTest(updList, conn); 
     ... 
+0

我不這樣做的Struts,所以這裏只是一個提示,以幫助您一步:在網頁瀏覽器,右擊打開頁面,並選擇*查看源文件*。這一切看起來不錯嗎? – BalusC 2010-08-26 16:09:07

回答

1

問題在於您如何設置頁面。您的所有複選框都具有相同的名稱(標準設置),但您也有upDateupDesc字段也設置了相同的名稱。

這意味着,當您提交表單,在服務器上,你會得到(考慮您的例子)3個upDate值的列表,3個upDesc值的列表和3個upisActive複選框列表。呃...不太好!

的問題是你的複選框,並使用讀值更新的代碼。

首先,如果未選中複選框,請求上不發送複選框。這意味着,根據您的選擇,在服務器上,你會得到一個長度爲0,1,2 upisActive值或者3

二的名單,你就必須在服務器上的代碼:

String[] values = request.getParameterValues("upisActive"); 
... 
for (int i = 0; i < values.length; i++) { 
    ... 
    val = values[i]; 
    hdvo.setDate(upForm.upDate[i]); 
    hdvo.setDesc(upForm.upDesc[i]); 
    ... 
} 

在你的例子中,你檢查第三個複選框並提交你的表單。這意味着String[] values的長度將爲1,因爲只有選定的複選框纔會發送到服務器。但輸入字段始終以3 upDesc和3 upDate發送。

然後你循環它(一次),並提取upForm.upDate[0]upForm.upDesc[0]。這樣,您通過選中第三個複選框來更新第一行。

其他問題:

1)已使用在下面的代碼相同的標識符(它要求麻煩):

<logic:iterate name="specialResult" id="specialResult"... 

2)您使用的經典輸入和加入property屬性給它:

<input type="text" ... property="upDate" />" property="upDate" ... 

3)不知道的是,瀏覽器擔保該字段將被在精確匹配順序每次所以使用單個計數器是發送,我想,只是「希望」相同的順序。

4)此外,閱讀this

+0

感謝您的帖子。我將嘗試按照您的指示進行更改。希望你的建議工作。 – 2010-08-26 21:14:40