농부와 컴퓨터/PROGRAMMING

[2006.11.10 (금) 맑음] 웹페이지간 파라메터 리스트 request.getParameterMap()으로 받아 정렬하여 추출

금오귤림원 2006. 11. 10. 02:57

SortedMap<String,String[]> sMap = Collections.synchronizedSortedMap(new TreeMap<String,String[]>(request.getParameterMap()));

 synchronized(sMap)
 {
     for(String key : sMap.keySet())
     {
         String[] value = sMap.get(key);
         for(int i=0; i<value.length; i++)
        {
            out.println(key + " : " + value[i] + "<br>");
         }
      }
  }

--------------------------

원시 웹페이지에서 체크박스 또는 라디오 버튼, 그리고 입력상자의 이름을 같은 이름으로 하여
다른 웹페이지로 전달하고자 할 때,
전달 받는 웹페이지에서 처리하는 방법으로,

1. request.getQueryString() 으로 전달받는 방법

    String queryString = request.getQueryString();
    out.print(queryString + "<br><br>----<br><br>");

2. Enumeration 객체를 통해 전달 받는 방법.

    Enumeration e = request.getParameterNames();
    while( e.hasMoreElements())
    {
        String   name   = (String)e.nextElement();
        String[] values = request.getParameterValues(name);
        for(int i=0; i<values.length; i++)
        {
            out.println(name + " : " + values[i] + "<br>");
         }
     }

3. request.getParameterMap()을 통해 전달 받는 방법.

   SortedMap<String,String[]> sMap = Collections.synchronizedSortedMap
                           ( new TreeMap<String,String[]>(request.getParameterMap()));

   synchronized(sMap)
   {
          for(String key : sMap.keySet())
         {
               String[] value = sMap.get(key);
               for(int i=0; i<value.length; i++)
               {
                     out.println(key + " : " + value[i] + "<br>");
                }
           }
     }

---------------

3.번 항목은 request.getParameterMap() 메소드를 통해 전달받은 파라메터 리스트를
TreeMap 객체를 통해 SortedMap 인터페이스를 구현하여, 전달받은 파라메터 리스트의
파라메터 이름순으로 정렬하는 기능까지 한다.
<String, String[]> Generic은 전달받는 파라메터이름과 값들이 모두 String 타입으로 전달
되기 때문에 설정했으며, 특히 <String[]> 제너릭은, SortedMap.get(key) 메소드가
SortedMap에 담겨있는 [값]을 읽어 반환할 때 벡터타입으로 반환하기 때문에 사용했다.

전달되는 파라메터가 String paramertName = String parameterValue 형식이기 때문에
(ex:http://xxx.yyy.zzz?AAA=BBB&CCC=DDD&............)
<String, String> 형태의 제너릭을 사용했었는데, ClassCastException을 발생시켰다.

제너릭과 for(Type variable : Object){}는 JDK 5 이상의 버전에서만 동작한다.

Collections.synchronizedSortedMap, synchronized() 는 객체의 직렬화(멀티 쓰레드간 충돌
방지)를 위해 사용했다.

특히, for( in ) 문장을 통해 Map의 특징인 중복불가에 대한 문제도 함께 해결 할 수 있다.

-------------------

이 외로, 전통적인 방법으로 Iterator 객체를 사용하는 방법도 있다.

Map paramMap = new SortedMap(request.getParameterMap());
Iterator it = paramMap.keySet().iterator();
String key = null;
String[] value = null;
while(it.haNext())
{
    key = it.next();
    value = paramMap.get(key);
    for(int i=0; i<value.length; i++)
    {
        out.println(key + " : " + value[i] + "&ltbr&gt");
    }
}