Day70 Java프로그래밍 기초(HTTP)
HttpServlet
1. HttpServlet 정의
Http 방식으로 통신하는 서블릿 컨테이너는 service 메서드를 호출 할 때, 파라미터 값으로 HttpServlet을 전달한다.
- HttpServletRequest, HttpServletResponse을 사용하기 위해서는 GenericServlet을 상속 받아 원래 형변환을 해야한다.
형변환을 줄이기 위해(원래 HttpServlet으로 전달) HttpServlet클래스를 만들어 사용한다.
2. Http의 메서드
- HttpServlet은 요청 메서드에 따라 달리 처리 할 수 있다.
- service를 호출하면 요청 메서드에 따라 메서드를 수행한다.
- service메서드 호출 대신 사용할 메서드를 (doGet,doPost 등)을 바로 호출 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String httpMethod = request.getMethod();ߜ
switch (httpMethod) {
case "GET":
doGet(request, response);
return;
case "POST":
doPost(request, response);
return;
case "PUT":
doPut(request, response);
return;
case "HEAD":
doHead(request, response);
return;
default:
error(request, response);
3. HttpServlet의 구동 방식
- ServletContainer은 Servlet을 구동한다.
- Servlet에
servie(req,res)
를 호출하지만, Servlet에는 없으므로 수퍼클래스에서 찾는다. Servlet의 수퍼클래스인 HttpServlet에
service(req,res)
를 호출한다.1 2 3 4 5 6 7 8 9
Class HttpServlet extends GenericServlet{ HttpServletRequest httpReq = (HttpServletRequest) req; HttpServletResponse httpRes = (HttpServletResponse) res; @Override service(req,res){ this.service(httpReq,httpRes); } }
- this에 담긴 주소는 Servlet 클래스이다.
this.service(httpReq, httpRes)
는 Servlet의 service를 가르킨다.
Load On Startup
1. 서블릿의 생성시기
- 서블릿의 생성시기는 서블릿 컨테이너가 최초 요청 했을때 생성 된다.
- 서블릿이 최초 요청되기 전까지는 서블릿의 오류성 검증이 어렵다.
- 서블릿이 사용하는 자원이 많은 경우 호출 까지 오랜 시간이 걸린다.
- load on startup을 통해 객체 실행 우선순위를 지정할 수 있다 .
2. load on startup
- 어노테이션을 사용하여 설정 할 수 있다.
1
@WebServlet(value = "/ex06/s1", loadOnStartup = 1)
- xml 파일에서 설정 할 수 있다.
1
2
3
4
<servlet>
...
<load-on-startup>1</load-on-startup>
</servlet>
include와 forward
1. getRequestDistpatcher
- 서블릿 컨테이너에서 전달받은 request에 대해 Dispatcher(위임)하여 response를 추가하는 역할을 한다.
include와 forward의 옵션이 있다.
1 2
//DispatchToUrl : req,res를 전달 할 url RequestDispatcher deliver = request.getRequestDispacher("DispatchToUrl");
2. forward
- forward위임 방식은 기존의 res에 담긴 값들과 앞으로 담기는 값들을 무시한다.
- 오직 최종적으로 forward 된 Servlet의 결과만 담긴다.
setContentType()도 최종 forward된 객체에 담겨야 한다.
1 2
RequestDispatcher deliver = request.getRequestDispacher("DispatchToUrl"); deliver.forward(req,res);
3. include
- include는 버퍼의 기존의 res결과값을 담아서 요청을 전달한다.
include된 모든 Servlet의 결과를 담는다.
1 2
RequestDispatcher deliver = request.getRequestDispacher("DispatchToUrl"); deliver.include(req,res);
4. include VS forward
- forward는 req,res를 전달하여 최종적으로 위윔된 Servlet의 res만 출력한다.
- include는 req,res값을 포함하여 전달하여 최종적으로 모든 Servlet res가 출력된다.
refresh와 redirect
1. refresh
- res에 담은 정보와 함께 클라이언트에 응답한다.
- 서버로 부터 받은 컨텐트를 출력한 후 지정시간이 경과되면 url을 자동으로 요청한다.
refresh 정보는 헤더 정보에 포함되어야 한다.
1 2 3 4 5 6 7
//res에 header을 설정 res.setHeader("Refresh","3;url=s100"); //직접헤더를 설정 out.println("<html><head>"); out.println("<meta http-equiv='Refresh' content='3;url=s100'>"); out.println("</head></html>");
2. redirect
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.