본문 바로가기

Language/Java / JSP

[JSP] checkbox 값 받기와 전송순서에 대하여

반응형

웹에서 데이터를 주고 받을때 사용하는 html태그들은 한정적이다. input box, radio, selectbox, checkbox 등이 있다.

이 중에서도 checkbox의 경우 동일한 태그 이름(name, id)로 구성을 하고 다중으로 체크한뒤 전송하게 되면
받는쪽에서는 체크되어있던 값들만 전송이 된다.

위에서 말했듯이 동일한 이름이 다중으로 넘어오면 받는쪽에서도 역시 다중으로 받을수 있게 처리해줘야 한다.


일반적인 방법으로는 request.getParameterValues 를 이용하여 배열로 받으면 된다.


[보내는 쪽]

 <checkbox name="type" id="type" value="M" />
 <checkbox name="type" id="type" value="S" />
 <checkbox name="type" id="type" value="W" />



[받는쪽]

String[] type = request.getParameterValues("type") ;




위와같이 작성하면 체크한 값들만 전송되므로 해당 값들을 이용하여 다음 로직들을 작성하면 된다.



아래 내용은 아래 "나그네"님의 댓글에 따라 잘못된 내용이므로 삭제합니다.

(결론 : 체크박스 순서에 따라 전송되는 순서도 동일하다)




만약 위 소스처럼 받아온 값들이 어떠한 순서를 가지고 있고, 그 순서대로 값이 들어오길 바란다면 해당 방법은 사용 안하는게 좋다.

위에서 전송되는 순서는 사실 순서보장이 될 수도 있고, 보장이 되지 않을수도 있다.
순서가 100번 보장이 된다하더라도 단 1번 안되면 그것은 오류로 연결되므로 문제가 있다.

체크박스의 값들이 순서대로 전송이 되느냐 아니냐는 예전부터 많은 이야기가 있었다.
해당 내용에대한 명백한 결론은 없지만, 개발자들 사이에서 내린 결론은 순서를 보장해야 하는 경우

체크박스나 다른 전송되는 type의 태그 이름을 동일한 이름(name, id)로 처리하지 말자였다.

위에서 말했듯이 100번중에 1번 잘못 전송되면 오류다.

조그마한 확률이라도 오류가 발생하면 문제가 되는만큼 애초에 걱정할거리를 없애는게 맞다.


나 같은경우 순서가 보장되어야 하는 경우 보통은 아래처럼 개발한다.



[보내는 쪽]

 <checkbox name="type_0" id="type_0" value="M" />
 <checkbox name="type_1" id="type_1" value="S" />
 <checkbox name="type_2" id="type_2" value="W" />



[받는쪽]

ArrayList arrType = new Arraylist();
 for(int i=0; i < 3; i++){
    String tmpType = request.getParameter("type_" + i);

    if(tmpType != null && !"".equals(tmpType)
        arrType.put(tmpType);
 }




결국은 순서가 보장되어야 하는 태그 이름뒤에 순차적으로 숫자를 부여한 후 받는쪽에서 값이 있는 녀석들만 arrayList 같은곳에 담아 사용하면 된다.

위 두가지의 케이스는 상황에 따르게 적절하게 사용해야 한다.

순서가 보장이 안되도 상관없는 일반적인 상황이라면 request.getParameterValues 를 사용하는게 좋다.
불필요한 코드를 추가할 필요도 없으며 편하게 사용이 가능하니까 말이다.