Http Servlet을 위한 요청(request) 정보를 제공하는 인터페이스로 javax.servlet.ServletRequest를 상속 받는다. 인터페이스나 구현은 컨테이너가 알아서 하기 때문에 메소드만 이용하면 된다.
클라이언트가 요청을 보내면 요청 시 전달된 데이터를 보관한다. 클라이언트가 보낼 때는 key:value형식으로 데이터가 전송되기 때문에 key값을 이용해서 value값을 찾을 수 있다.
getParameter(String)
: 클라이언트가 보낸 데이터 key값과 같은 key값을 반환하는 메소드로 반환형은 String이다.
getParameterNames()
: 클라이언트가 보내준 데이터의 key값들을 불러오는 메소드이다.
getParmeterValues(String)
: 클라이언트가 보낸 데이터의 key에 값이 여러 개인 경우 그 값들을 가져오는 메소드로 반환형은 배열이 된다.
체크박스로 데이터를 보내는 경우 취미라는 key에 저장되는 value가 독서, 영화감상, 음악감상처럼 여러 개일 때 해당 메소드로 값을 가져올 수 있다.
getParameterMap()
: 클라이언트가 보낸 데이터는 key:value형식으로 저장되므로 해당 데이터들을 Map방식으로 불러오는 메소드이다.
setAttribute(String, Object)
: request 객체에 전달하고 싶은 메소드를 String으로 이름을 지정하고 데이터를 Object로 저장하는 메소드이다. 매개변수를 Object로 받기 때문에 모든 자료형을 저장할 수 있다.
getAttribute(String)
: 매개변수로 받은 값과 일치하는 값을 찾아서 해당하는 객체를 반환하는 메소드로 반환값은 Object가 된다. 각 자료형에 맞춰서 형변환 해서 사용해야 한다.
removeAttribute(String)
: 매개변수로 받은 값과 일치하는 값을 찾아서 해당 객체를 삭제하는 메소드이다.
클라이언트로부터 전송받은 request 객체의 값들을 CharatetSet 설정하는 메소드로 매개변수에 “UTF-8”을 넣어주면 해당 방식으로 받아오게 한다. post방식으로 데이터를 전송하는 경우 바이트 단위로 데이터를 잘라서 전송하기 때문에 한글 같은 경우는 깨지게 되는데 이런 정보를 정상적으로 받아와서 처리하기 위해 인코딩할 때 사용한다.
컨테이너 내에서 requst, response 객체를 전송해서 처리할 컴포넌트를 불러오는 메소드로 forword() 메소드와 함께 사용한다.
특정 서블릿 주소를 입력해서 해당 주소로 요청을 넘겨주는 기능이라고 볼 수 있다. 요청을 전송할 때는 forword()
메소드에 클라이언트의 요청 데이터를 함께 넘긴다.
예를 들어 고객센터에서 고객이 “보일러 수리를 위해서 주말에 기사님이 방문해줄 수 있느냐”라고 상담원에게 요청했을 때 상담원은 “수리 가사가 주말에 고객의 집에 방문할 수 있는가”에 대한 응답을 본인이 할 수 없기 때문에 수리 기사에게 연락해서 가능한지 해당 요청을 “전달”하게 된다. 그리고 기사에게 응답을 넘겨 받고 고객에게 “응답”을 하는 건 다시 상담원의 몫일 때 상담원은 요청을 받고 응답은 전부 본인이 했지만 특정 처리를 위해서 요청을 다른 곳에 전달하게 된다. 이렇게 응답 자체는 요청 받은 서블릿이 진행하지만 요청에 대한 처리를 하기 위해서 다른 곳으로 요청 데이터를 전달할 때 해당 메소드를 사용한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>클라이언트 데이터 전송</title>
</head>
<body>
<h3>당신의 개인 취향 테스트</h3>
<p>당신의 취향을 테스트해봐요</p>
<form action="/02_servletdata/testperson.do">
<!-- 절대 경로로 작성하기 위해 앞에 프로젝트명(path명)을 작성해준다. -->
<!-- value, name으로 지정한 값이 data로 넘어간다 -->
<ul>
<li><label>이름 <input type="text" name="name"></label></li>
<li><label>나이 <input type="number" min="0" name="age"></label></li>
<li><label>키 <input type="text" name="height"></label></li>
<li>좋아하는 색
<label><input type="radio" name="color" value="red">빨강</label>
<label><input type="radio" name="color" value="orange">주황</label>
<label><input type="radio" name="color" value="yellow">노랑</label>
<label><input type="radio" name="color" value="green">초록</label>
<label><input type="radio" name="color" value="blue">파랑</label>
<label><input type="radio" name="color" value="navy">남색</label>
</li>
<li>좋아하는 동물
<label><input type="checkbox" name="animal" value="강아지">강아지</label>
<label><input type="checkbox" name="animal" value="고양이">고양이</label>
<label><input type="checkbox" name="animal" value="펭귄">펭귄</label>
<label><input type="checkbox" name="animal" value="기린">기린</label>
<label><input type="checkbox" name="animal" value="라쿤">라쿤</label>
<label><input type="checkbox" name="animal" value="토끼">토끼</label>
</li>
<li>점심메뉴
<select name="lunch">
<option value="마라탕">마라탕</option>
<option value="샤브샤브">샤브샤브</option>
<option value="김치찌개">김치찌개</option>
<option value="훠궈">훠궈</option>
<option value="햄부기">햄부기</option>
</select>
</li>
<li>
<textarea rows="10" cols="50" name="info"></textarea>
</li>
</ul>
<input type="submit" value="제출">
<input type="reset" value="취소">
</form>
</body>
</html>
위 코드로 만든 화면에서 클라이언트가 데이터를 입력하고 [제출] 버튼을 클릭하면 데이터가 전송된다. form의 method 방식을 따로 지정하지 않았기 때문에 Get방식으로 데이터가 전송되는데 이 데이터를 이클립스에서 위에 정리한 메소드들로 확인해볼 수 있다.
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//클라이언트가 보낸 데이터 확인
//1. 단일 데이터 가져오기.
String name=req.getParameter("name");
System.out.println(name); //lee 출력
//2. 다수 데이터 가져오기
String animal=req.getParameter("animal");
//animal이라는 name에 선택된 다수의 value중 하나를 가져오고 끝낸다.
String[] animals=req.getParameterValues("animal");
String lunch=req.getParameter("lunch");
String info=req.getParameter("info");
System.out.println("이름 : "+name);
System.out.println("나이 : "+age);
System.out.println("키 : "+height);
System.out.println("색상 : "+color);
System.out.println("동물 : "+animal);
System.out.print("동물들 : ");
Arrays.asList(animals).stream().forEach(System.out::print);
System.out.println();
// :: 메소드 참조 받는 매개변수를 print뒤에 넣어준다.
System.out.println("점심 : "+lunch);
System.out.println("소개 : "+info);
}
💡 체크박스처럼 하나의 key에 다수의 value가 저장되는 경우 배열에 저장해줘야 한다.
//3.클라이언트가 보낸 key값을 모를 때 key값을 가져오는 방법.
Enumeration<String> paramName=req.getParameterNames();
while(paramName.hasMoreElements()) {//key값을 하나씩 뽑아온다.
String key=paramName.nextElement(); //iterator와 비슷한 방식.
String[] value=req.getParameterValues(key); //단일값도 배열로 받아와도 된다.
System.out.println(key+" : "+Arrays.toString(value));
}
//4. Map방식으로 데이터를 가져오기
Map<String,String[]> param=req.getParameterMap();
for(String key:param.keySet()) {
System.out.println(key+" : "+Arrays.toString(param.get(key)));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//요청 내용을 다른 서블릿으로 전환
System.out.println("requestDispatcher서블릿 실행");.
//페이지에서 저장한 건 parameter로 받아오기 때문에
//key값이 중복되도 상관없지만 혼동되지 않게 주의한다.
request.setAttribute("testData", "개인 취향 테스트에 오신 걸 환영합니다.");
//해당 서블릿에서 저장한 데이터
//MVC의 V에 해당하는 로직을 처리하는 장소를 분할하기 때문에
//해당 장소로 데이터를 넘겨서 서블릿을 전환함.
//RequestDispatcher객체를 이용한 서블릿 이동
//HttpServletRequest.getRequestDispatcher("(서블릿||jsp)주소");
RequestDispatcher rd=request.getRequestDispatcher("/dispatcherView.do");
//해당 주소로 재요청을 보냄.
rd.forward(request, response); //받았던 정보를 그대로 재전송
💡 프로그램이 에러 없이 실행 됐기 때문에 dispatcherView.do
가 응답했어도 url에 requestdispatcher.do
가 바뀌지 않는 이유는 응답 받을 때까지 요청이 requestdispatcher.do에서 보낸 것 하나 뿐이었기 때문이다. 요청은 하나에서 바뀌지 않되 응답 처리하는 부분만 계속 바뀌고, 요청이 바뀌지 않았기 때문에 request의 데이터를 그대로 쓸 수 있다.
갠적으로 포스팅 할 때 value값도 한글보다는 영어 값으로 명확히 써주는거 추천 현업 사람들이 연습도 실제처럼 하는걸 선호하더라