Servlet
[HttpServlet]
0. HttpServlet?
- http 통신을 지원하는 자바 기반의 웹 개발 지원 클래스이다.
- 서블릿을 사용하고자하면 HttpServlet 상속이 필수다.
- 네트워크 관련 코드 개발이 불필요하다 HttpServlet이 이를 해결해주기 때문이다.
- 클라이언트에게 서비스하고자 하는 로직 개발만 집중해서 할수 있다.
1. HttpServletRequest
- 정해진 메서드의 인자(=parameter)로 선언이 필수다.
- 접속한 클라이언트의 요청 정보 및 ip 등을 확인 가능하게 해주는 객체이다.
- 로그인
ㅤ
2. HttpServletRespone
- 정해진메서드의 인자 선언 필수
- 접속한 클라이언트에게만 응답하는 객체이다.
[핵심 API]
1. javax.servlet.http.HttpServlet
- get 방식 요청만 처리하는 메서드이다.
doGet()
ㅤ- 호출이 불가하고 클라이언트 요청시 감지한 servlet container(server) 내부의 처리 로직이 이미 구현되어 있음
ㅤ- 그 로직상에서 해당 클라이언트 요청 감지후 자동 호출
- 클라이언트가 전송하는 데이터 반환 메서드
ㅤ- String getParameter()
ㅤ- input tag의 name 속성명
2. javax.servlet.http.HttpServletReequest
- 요청 데이터의 인코딩 설정
ㅤ- 데이터를 추출하기 전에 인코딩 설정은 필수
- 클라이언트가 전송하는 데이터 반환 메서드
ㅤ- String getParameter("input tag name 속성명");
ㅤ- input tag는 클라이언트가 서버에 전송하는 데이터의 고유 이름
- getRequestDispatcher()
ㅤ- forward 방식으로 web page 이동
- setAttribute(key, value)
ㅤ- 요청 객체에 데이터 저장
- getAttribute(key)
ㅤ- 요청 객체로 부터 저장된 데이터 반환
3. javax.servlet.http.HttpServletRespone
- 클라이언트에게 응답하는 포맷 설정 메서드
ㅤ- setContentType("형식;인코딩");
ㅤ- mime type 인터넷 상 데이터 포맷
ㅤㅤ- 표현 스펙이 정해져있다.
- 클라이언트에게 한글 응답 처리 기능의 객체를 생성
ㅤ- PrintWriter getWriter()
ㅤ- 2byte씩 문자 처리 출력 객체이다.
[Servlet 객체 생성 시점]
1. Servlet 객체 생성 시점
- 이미 서버에 바이트코드로는 존재한다.(war)
- 최초 클라이언트가 호출 시 한 번만 바이트 코드를 로딩해서 객체를 생성한다.
2. HttpServletRequest & HttpServletResponse 생성 시점
- 클라이언트 접속 시 해당 클라이언트만을 위한 객체들을 생성한다. -> 메서드 종료시 자동 소멸된다.
[Get, Post]
1. Get
- 보안은 고려하지 않고 적은 데이터를 서버에 전송할 때 Get 방식을 권장한다.
2. Post
- 보안을 고려하고 대량의 데이터를 전송해야할 때 Post 방식을 권장한다.
- method="post"로 요청할 때 필수적으로 요청 방식을 명시해야 post 방식을 사용하게 된다.
3. doGet(), doPost(), service()
- doGet(): get 방식만 자동 처리하는 특화된 메서드
- doPost(): post 방식만 자동 처리하는 특화된 메서드
- service(): get과 post 방식 둘다 처리하는 메서드
4. default 방식?
- method="post" 코드가 없는 것들의 방식은 모두 get으로 호출되는 것을 확인할 수 있다.
- 이 말은 다시 말해서 http의 요청 방식의 기본값이 get 방식인 것을 알수 있다.
[Servlet API을 이용한 이동 방식]
1. servlet 간의 이동시 사용
2. 종류
2-1.포워딩
- url은 고정되어 있고 web page만 변경된다.
- 주로 보안을 고려하거나 인증이 필요한 폐쇄형 서비스 화면에 적합하다.
- servlet간에 이동시 요청 객체와 응답 객체
2-2. 리다이렉트
- 이동시마다 url이 변경된다.
- 주로 개방형 서비스 화면에 적합하다.
[forward VS Redirect]
1. forward 방식
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/one")
public class ServletOne extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servlet One doGet()");
porcess(request,response);
}
protected void porcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("eduName", "uri fisa");
request.getRequestDispatcher("two").forward(request, response);
}
}
package step01;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/two")
public class ServletTwo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servletTwo doGet()");
process(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servletTwo doPost()");
process(request, response);
}
private void process(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("two");
out.println("h1");
out.println("<font color ='red'>");
out.println(request.getAttribute("eduName"));
out.println("</font>");
}
}
- 포워드 방식은 one servlet에서 -> two servlet으로 이동하는데 이때 서블릿은 One Two로 나눠져 있지만 이는 사실 하나라고 봐도 무방하다.
- 같은 요청을 넘겨 받아 사용하고 있기 때문에 setAttribute에 넣어준 값을 이용해 클라이언트에게 응답을 내려줄 수 있다
2. redirect
package step01;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/one")
public class ServletOne extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servlet One doGet()");
porcess(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servletOne doPost()");
porcess(request,response);
}
protected void porcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("eduName", "uri fisa");
response.sendRedirect("two");
}
}
- redirect는 one servlet에서 two servlet으로 요청을 보내는 건 맞지만 이때 바로 보내는 것이 아니다.
- 클라이언트가 서버에게 보낸 최초의 요청을 서버에서는 다시 클라이언트에게 보내 two servlet으로 보내라고 다시 보낸다.
- 그럼 다시 클라이언트는 two servlet으로 해당 요청을 다시 보낸다.