adSense 900*70


Jquery serializeArray와 jsp에서 파라미터 처리 JAVA - Collections

오늘도 막상 공부하고 자려니 너무 길어질것 같고 해서 네이버 카페질 중 재밌는 질문이 있어서 한번 프로그램을 짜봤내요. 
요새 웹쪽 일을 하다보니 웹에도 관심을 둘 수 밖에 없는지라 ㅎㅎ. 암튼
Jquery의 serializeArray메서드는 html form의 input 값들을 배열로 전송해주는 메서드입니다.  음 정확히는 배열이라고 하긴 좀 그렇고 Json으로 encoding해주는 표현이 맞겠내요.  자세한 건 jquery api를 참조하시면 됩니다. http://api.jquery.com/serializeArray/

그래서 Json형태로 넘어온 parameter들을 jsp, 혹은 servlet에서 어떻게 처리를 해야할까요? 루핑 돌리면서 하나씩 뺄까요? 아님 String배열 변수를 선언해서 막 담을까요? 근데 String배열에 담을려면 size를 알아야하는데 어떻게 알아낼까요? 어떻게 해야 잘 담아낼 수 있을까요?
전 Map과 List를 사용하기로 생각했습니다. 왜냐면 사이즈 걱정을 안해도 되고 일단 넘어오는 parameter들이 동일한 key값을 가지고 String[]  형태로 넘어오기때문에 이를 잘 처리해줄 구조형이 Map<String,List<String>>형이라고 생각했기때문이죠. 더 좋은 생각 있으면 좀 알려주시구요. 

그럼 제가 짠 코드를 함 살펴보죠. 
먼저 요청을 날리는 requester인 html페이지입니다. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>


<script type="text/javascript" src="/js/jquery-1.8.3.js"></script>

<script type="text/javascript">

  $(document).ready(function(){

    $("#searchForm").submit(function(){

      $(this).serializeArray();

      $(this).attr("action","Test.jsp");

    });

  });

</script>

</head>

<body>

<form name="searchForm" id="searchForm" method="post">

 <input type="hidden" name="type" value="football" />

 <input type="hidden" name="type" value="bascketball" />

 <input type="hidden" name="type" value="ballyball" />

 <input type="hidden" name="name" value="mesh" />

 <input type="hidden" name="name" value="hash" />

 <input type="hidden" name="name" value="sext" />

 <input type="submit" value="submit" />

</form>

</body>

</html>

이거 왜 들여쓰기 기능이 안먹히는건지, 암튼 알아서 잘 보면 되죠. ㅋ 뭐 테스트 페이지다보니 아주 심플합니다. 폼이 있고 서밋버튼이 있고 폼의 input 들을 serializeArray해서 쓩~하고 Test.jsp로 쏘는거죠.


그럼 응답을 받아서 처리하는 오늘의 핵심 코드를 보시죠.

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>

<%@ page import="java.util.*" %>

<%@ page import="java.io.*" %>

<%

//String,String[] 형태의 Map을 request로부터 받음 

Map<String,String[]> params = request.getParameterMap();

//넘어온 파라미터들을 Map<String,List<String>> 형태로 가

Map<String,List<String>> processedMap = getParams(request);

//콘솔에 표시 

System.out.println(processedMap.toString());

%>

<%!

private Map<String,List<String>> getParams(HttpServletRequest req){

//request로부터 parameterMap을 받

Map<String,String[]> params = req.getParameterMap();

//리턴할 Map instance 생성 <String,List<String> 형을 인자로 받

Map<String,List<String>> rtnMap = new HashMap<String,List<String>>();

//parameterMap의 key들을 받을 Iterator 생성 

Iterator<String> it = params.keySet().iterator();

//Iterating 시작 

while(it.hasNext()){

//키를 받아

String key = it.next();

//해당 키에 매칭되는 value 값들(String배열)을 받아옴 

String[] values = params.get(key);

//Arrays의 static method asList로 해당 value배열을 List로 변환

//하여 리턴할 Map 인스턴스에 담는다.

rtnMap.put(key, Arrays.asList(values));

}

return rtnMap;

}

%>


JCF를 좀 아시는 분들은 뭐 졸라 쉬운 예제죠. 친절하게, 좀 오바스럽게 코멘트도 달아놓고. 핵심은 request로부터 parameterMap (String,String[])을 받아와서 Map<String,List<String>>으로 가공해주는 거죠. 그리고 Arrays의 static method asList를 활용해서 한방에

내부적으로는 한방은 아니겠지만, 눈에 보이는건 한줄도 안되는 코드죠. asList로 해당 value 배열을 리스트 만들어서 Map에 담아버리는 겁니다. 이러면 간단하게 Map<String,List<String>>으로 변환이 되는거죠.  그리고 넘어온 parameter key들을 정렬하고 싶다면 HashMap대신 TreeMap을 쓰면 됩니다. 왜 그런지는 api에 다 나와있습니다. ^^


매번 느끼는 거지만 JCF를 잘 알수록 코딩양을 많이 줄 일 수 있고, 또 프로그래밍이 뭐랄까요 효율적이 된다고 할까요. 암튼 JCF는 알면 알수록 굉장히 도움이 됩니다.  만약에  parameter로 넘어온 String value값들을 정렬하고자 할려면 어떻게 할까요? 

Collections 클래스의 sort(List<T extends Comparable> list)를 쓰면됩니다.  어렵게 루프돌리면서 해결하려고 하지 말구요.api에 거의 대부분의 답이 있는것 같습니다. 


오늘은 간단한 예제로 끝~!



덧글

댓글 입력 영역
◀ 다음덧글    이전덧글 ▶


side adsense

adSense 900*70