2016-08-02 127 views
1

我有一組單選按鈕,每個按鈕代表每行都有一個Id的操作。我正在使用價值來複合兩者。我的servlet可以處理這個問題,但我不知道是否有更好的方法將action與id分開,並讓servlet接收它們?表格行上的單選按鈕組

<td class="listData"><input type="radio" value="insert-${data.Id}" name="recordIds${data.Id}" id="${data.Id}"/></td> 
    <td class="listData"><input type="radio" value="update-${data.Id}" name="recordIds${data.Id}" id="${data.Id}"/></td> 
    <td class="listData"><input type="radio" value="delete-${data.Id}" name="recordIds${data.Id}" id="${data.Id}"/></td> 
+0

語法錯誤,請嘗試爲所有單選按鈕避免使用相同的編號 –

+0

我可以更改它。但它並不能解決我的問題。 – johnsam

回答

1

由於Naga Sai A指出,您不應該在HTML文檔中有重複的id值。所以請確保每個輸入都有唯一的ID。

如果我正確理解了你,你不需要爲你的案例中的每一行數據使用不同的值。你需要不同的名字對他們來說只是:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<%@ page import="java.util.List" %> 
<%@ page import="java.util.Arrays" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<html> 
<head> 
    <title>Change Data</title> 
</head> 
<body> 
    <%! 
    public class Data { 
     private int id; 

     public Data(int id) { 
     this.id = id; 
     } 

     public int getId() { 
     return id; 
     } 

     public void setId(int id) { 
     this.id = id; 
     } 
    } 
    List<Data> dataList = Arrays.asList(new Data(10), new Data(11), new Data(12)); 
    %> 

    <% request.setAttribute("dataList", dataList); %> 
    <c:url var="controller" value="/controller"/> 

    <p>Choose your actions for data</p> 
    <form action="${controller}" method="POST"> 
    <table> 
     <thead> 
     <tr> 
      <td>insert</td> 
      <td>update</td> 
      <td>delete</td> 
     </tr> 
     </thead> 
     <tbody> 
     <c:forEach var="data" items="${dataList}"> 
     <tr> 
      <td> 
      <label for="insert-${data.id}">Insert ${data.id}: </label> 
      <input type="radio" name="recordIds${data.id}" value="insert" id="insert-${data.id}"/> 
      </td> 
      <td> 
      <label for="update-${data.id}">Update ${data.id}: </label> 
      <input type="radio" name="recordIds${data.id}" value="update" id="update-${data.id}"/> 
      </td> 
      <td> 
      <label for="delete-${data.id}">Delete ${data.id}: </label> 
      <input type="radio" name="recordIds${data.id}" value="delete" id="delete-${data.id}"/> 
      </td> 
     </tr> 
     </c:forEach> 
     </tbody> 
    </table> 
    <input type="submit" value="Submit actions"> 
    </form> 
</body> 
</html> 

會給你一個形式

enter image description here

,將其輸入重定向到Servlet與doPost()方法

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    Collections.list(request.getParameterNames()).forEach(paramName -> { 
     if (paramName.startsWith("recordIds")) { 
      String id = paramName.substring(9, paramName.length()); 
      String action = request.getParameter(paramName); 
      try { 
       response.getWriter().println("Selected action for data with id=" + id + " is " + action); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    }); 
} 

這打印結果

enter image description here

PS:不這樣定義數據類,the use of scriplets is highly discouraged,您需要單獨創建數據類,並儘量避免在JSP中的Java代碼,我用它僅用於演示目的

+0

的確更好。 'name'用於查找項目(id僅用於保持簡單;)),'value'用於設置操作,'id'是兩者的組合(如果需要'id')。 – AxelH

+0

@AxelH感謝您的建議。如果只有這3個輸入參數(指的是3個無線電輸入),確實會更簡單。但是如果還有其他輸入參數呢?然後,從'request.getParameterNames()'枚舉中抽取這3個參數,您需要以某種方式將它們與其他參數區分開來。這就是爲什麼我沒有從他們的名字中刪除那個'recordIds'後綴的原因。但對於這種簡單的情況,你是對的。 – tarashypka

+0

一般來說,對於更復雜的表/列表,我使用隱藏的輸入作爲id值。我分析包含一個項目的所有輸入的div(具有特定類的div來查找塊)。其他的事情,使用動態名稱可能是一個問題,因爲你分析POST請求的數據。 (剛想過:P) – AxelH