2016-08-02 5 views
1

각 라디오 버튼 그룹은 각 행에 대해 ID가있는 작업을 나타냅니다. 나는 두 가지를 합성하기 위해 가치를 사용하고 있습니다. 내 서블릿은 이것을 처리 할 수 ​​있지만 ID와 액션을 분리하고 서블릿에서 수신하도록하는 더 좋은 방법이 있는지 궁금하다.테이블 행의 라디오 버튼 그룹

<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

구문 오류, 시도 모든 라디오 버튼에 대해 동일한 ID를 사용하지 마십시오 –

+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> 

당신의 doPost와 서블릿에 입력을 리디렉션 형태

enter image description here

을 줄 것이다() 메소드

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

시 : 이 같은 데이터 클래스를 정의하지 않습니다는 the use of scriplets is highly discouraged, 당신은 별도로 데이터 클래스를 생성하고 JSP에서 자바 코드를 피하려고합니다 나는 데모 목적을 위해 그것을 사용에만

+0

사실이게 낫습니다. 'name'은 항목 (id는 단순하게 유지하기 위해 id 만 찾는다)),'value'는 동작을 설정하고'id'는 양쪽 모두의 조합입니다 ('id'가 필요하다면). – AxelH

+0

@AxelH 의견을 보내 주셔서 감사합니다. 실제로 3 개의 입력 파라미터 (3 개의 라디오 입력 참조) 만 있으면 더 간단합니다. 그러나 다른 입력 매개 변수가 있다면 어떨까요? 그런 다음이 3 개의 매개 변수를'request.getParameterNames()'열거 형에서 가져 오면 다른 매개 변수와 구별해야합니다. 그래서 그 이름에서'recordIds' 접미사를 제거하지 않았습니다. 그러나이 간단한 경우에 당신이 옳습니다. – tarashypka

+0

일반적으로 더 복잡한 테이블/목록의 경우 id 값에 숨겨진 입력을 사용합니다. 그리고 한 항목 (div를 특정 클래스로 찾아 블록)에 대한 모든 입력을 포함하는 div를 분석합니다. 다른 것은 동적 이름을 사용하면 POST 요청의 데이터를 분석하는 데 문제가 될 수 있습니다. (그냥 그것에 대해 생각 : P) – AxelH

관련 문제