@WebServlet
어노테이션으로 대체HttpServletRequest
및 HttpServletResponse
객체를 생성하여 파라미터로 넘겨준다.
req = HttpServletRequest
resp = HttpServletResponse
컨테이너가 넣어주는것리다이렉트 | 포워드 |
---|---|
resp.sendRedirect("index.html"); | RequestDispatcher dispatcher = req.getRequestDispatcher("index.html"); dispatcher.forward(req, resp); |
너 여기로 요청하는게 아니고 index.html 여기에 요청해야지! | - 요청 받은 서블릿은 response안하고 바로 index.html한테 할일 넘겨버림 - 처리된 다음에 그 화면을 보여주는 것 |
URL변경: O | URL변경: X |
객체 재사용: X | 객체 재사용: O |
시스템(session, DB)에 변화가 생기는 요청(로그인, 회원가입, 글쓰기) | 시스템에 변화가 생기지 않는 단순 조회(리스트보기, 검색) |
예시: - 사용자 : 나 이것좀 암호화 처리해줘 - 서블렛: 오호; 나 할줄모르는데;; 고대로 암호화처리하는 서블릿한테 넘겨야겠당 |
public class T02_ServletTest extends HTTPServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. Post 방식으로 넘어오는 Body 데이터 인코딩 처리
// (get방식은 톰캣의 URIEncoding 설정을 이용함.)
// request 객체에서 값을 가져오기 전(getParameter)에 먼저 설정해야 적용됨 ★
req.setCharacterEncoding("utf-8");
// 2. 요청정보로부터 name값을 가져오기
String name = req.getParameter("name");
System.out.println("name => " + name);
// 3. 응답메시지 인코딩 설정
// (Content-Type의 charset=UTF-8과 동일)
resp.setCharacterEncoding("UTF-8");
// 4. 응답메시지의 Content-Type 설정
resp.setContentType("text/plain");
// 5. 실제 수행할 로직(기능)이 시작되는 부분.
Printwriter out = resp.getWriter();
out.println("name => " + name);
out.println("서블릿 경로 => " + req.getServletPath());
out.println("컨텍스트 경로 => " + req.getContextPath());
//out.flush();
// 방출과 동시에 상대방에게 response하게 되기 때문에 연결 끊어짐 (=>http는 비연결)
// java.lang.IllegalStateException:
// Cannot forward after response has been committed
// 6. 리다이렉트 - URL바뀜, 결과를 아예 다른 걸로 셋팅해서 응답
resp.sendRedirect("index.html"); //T02_Servlet을 요청했는데 요기로 납치
// 7. 포워드
//RequestDispatcher dispatcher = req.getRequestDispatcher("index.html");
//dispatcher.forward(req, resp); // 객체 재사용
}
@Override
protected void doPost(HttpServletRequest res, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp); // doPost로 오던 doGet으로 오던 같은 로직 실행
}
}
getParameter(String param)
: 파라미터 value값이 한개인 경우getParameterValues(String param)
: 파라미터의 value 값이 여러개 (ex: 체크박스)getParameterNames()
: request 객체에 존재하는 모든 파라미터정보(이름)을 가져올 때 사용public class T03_ServletParameterTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 객체에서 꺼내기 전 인코딩 설정
req.setCharacterEncoding("utf-8");
// 2. 요청 객체로부터 파라미터의 데이터 가져오기
String username = req.getParameter("username");
String password = req.getParameter("password");
String gender = req.getParameter("gender");
String hobby = req.getParameter("hobby"); // getParameterValues()로 해줘야 체크한 것 전부 날라옴
String[] food = req.getParameterValues("food");
// 3. 응답 헤더를 위한 인코딩
resp.setContentType("text/html;charset=utf-8");
// 4. 응답해더 출력
PrintWriter pw = resp.getWriter();
pw.println("<html>");
pw.println("<body>");
pw.println("<p>username : " + username + "</p>");
pw.println("<p>password : " + password + "</p>");
pw.println("<p>gender : " + gender + "</p>");
pw.println("<p>hobby : " + hobby + "</p>");
pw.println("<p>rlgn : " + rlgn + "</p>");
if (food != null) {
for (String s : food) {
pw.println("<p>food : " + s + "</p>");
}
}
Enumeration<String> params = req.getParameterNames();
while(params.hasMoreElements()) {
String param = params.nextElement();
pw.println("<p>파라미터 이름 : " + param + "</p>");
}
pw.println("</body>");
pw.println("</html>");
} // doGet()
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// POST로 받아도 GET과 같은 방식으로 처리하고 싶으면 GET으로 보내면 됨
doGet(req, resp);
}
} // class