1. URL 파라미터란 무엇인가?
클라이언트가 서버로 요청을 할 때는 URL을 통해 요청이 이루어진다. 요청이 다양하기 때문에 URL매핑 만으로는 다양한 요청을 전부 처리할 수 없다. 무수히 많은 정보를 URL매핑을 통해서만 처리할 수 없기 때문에 URL 파라미터를 URL에 담아서 보내는 방법이 고안되었다.
URL 매핑을 통해 요청하는 방법과 URL 파라미터를 URL에 담아서 요청하는 방법은 아래와 같다.
예) URL 매핑을통해 요청하는 방법(boardList를 받아오는 요청)
http://localhost:7777/board/boardList
예) URL 파라미터로 값을 담아 요청하는 방법(특정 글의 정보를 받아오는 요청)
http://localhost:7777/board/boardDetail/?board_no=1&board_title=제목
요청 파라미터에 값을 담아 보낼 때는 "?" 뒤에 키와 값을 담아서 보내면 된다. 파라미터의 갯수가 여러개일 때는 "&"을 기준으로 파라미터를 구분해서 보낸다. 현재 작성중인 이 페이지의 URL은 아래와 같은데 &을 기준으로 키와 값이 반복되는 형태를 볼 수 있다.
2. URL 파라미터를 Java로 가져오는 방법
서버로 들어오는 요청은 서블릿에서 받아서 처리를 하는데 이 때 URL을 받아서 전처리하는 과정이 있다. 때문에 요청에서 URL을 문자열 형태로 일단 가져와서 사용할 수 있도록 해야한다.
getParameter()로 파라미터를 가져오기
@WebServlet("*.do")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//GET요청이 들어왔을 때 처리할 코드
//http://localhost:7777/board/boardDetail/?board_no=1&board_title=제목 =>이 요청이 들어올때
String board_no = req.getParameter("board_no") //결과: 1
String board_title = req.getParameter("board_title")//결과: "제목"
}
}
HttpServletRequest객체를 사용하면 요청으로 들어온 URL과 파라미터를 받아올 수 있다. 요청한 url에 파라미터가 두개이기 때문에 두개의 변수(String)을 선언해서 getParameter메서드를 사용해 값을 넣는다.
3. 만약 파라미터가 많다면?
파라미터가 한 두개인 경우는 위와 같은 방법으로 받아올 수 있지만 파라미터의 갯수가 많아지면 아래처럼 코드가 반복되게 된다.
String board1 = req.getParameter("board1");
String board2 = req.getParameter("board2");
String board3 = req.getParameter("board3");
String board4 = req.getParameter("board4");
String board5 = req.getParameter("board5");
String board6 = req.getParameter("board6");
String board7 = req.getParameter("board7");
String board8 = req.getParameter("board8");
getParameterNames()
이 때 파라미터를 한 번에 받아오기 위해 사용하는 것이 getParameterNames() 메서드다. getParameterNames()은 파라미터를 전부 받아와 데이터셋의 형태로 가지고 있다. 메서드에서 반환되는 객체는 Enumeration 인터페이스를 상속받기 때문에 Enumeration em = req.getParameterNames() 의 형태로 사용할 수 있다.
받아온 데이터를 바로 사용할 수 있긴 하지만 좀 더 사용이 용이하게 하려면 좀더 익숙한 자료구조로 변경해주어야 한다. 안에 들어있는 파라미터의 형태는 키와 값의 형태를 갖기 때문에 Map에 담는것이 가장 적절해 보인다. 그러려면 Map으로 변경해주는 작업이 필요한데 이때 사용되는 메서드가 아래 두가지 메서드이다.
nextElement(): 앞에서부터 값을 차례로 하나씩 반환한다.
hasMoreElements(): 데이터셋에 값이 존재하는지 확인하고 true/false를 반환한다.
Map<String, Object> pMap = new HashMap<>();
Enumeration<String> em = req.getParameterNames();
while(em.hasMoreElements()) {
//키값 꺼내기
String key = em.nextElement();
pMap.put(key, req.getParameter(key));
}
while문의 조건으로 hasMoreElements()을 넣으면 값이 존재하면 반복문이 실행되고 값이 없으면 반복문이 종료된다. 때문에 데이터셋 안에 들어 있는 자료의 갯수만큼 반복문을 실행할 수 있다. 반복문 안에서는 nextElement()를 사용해 Map안에 값을 넣어준다. 반복문이 종료되면 Hashmap객체인 pMap 안에는 URL로 요청한 파라미터의 이름과 값이 key: value의 형태로 저장되게 된다.
getParameter()를 사용하여 일일히 문자열 변수로 사용했던 경우와 다르게 간편하게 파라미터 데이터를 주고받을 수 있다.