웹서버의 처리순서
p92, [그림 3-1] 서블릿 처리순서
응답정보 처리(HttpServletResponse)
ServletResponse 인터페이스는 클라이언트의 요청에 응답하기 위한 출력스트림을 추출하거나 버퍼의 크기를 설정하고, 응답할 내용의 타입과 문자셋을 설정하는 등의 작업을 수행할 수있다.
HttpServletResponse는 ServletResponse 인터페이스를 상속 받아 웹 애플리케이션을 개발하면서 응답 관련 작업을 수행하기 위한 HTTP 프로토콜 통신 기반의 응답 관련 메소드들도 확장하여 포함하고 있다.
package job.study.web; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.anotation.WebServlet; @WebServlet("/second") public class ThirdServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletExpcetion,IOException { resp.setContentType("text/html;charset=UTF-8"); System.out.println("ThirdServlet!!"); PrintWriter out = resp.getWriter(); out.println("<h1>좋은 하루!<h1>"); out.close() } }
setContentType( )은 클라이언트에게 보내는 데이터의 문서타입과 문자셋을 응답정보 헤더에 설정하는 메소드이다. 만약 문서타입와 문자셋을 명시하지 않으면 기본적으로 text/html, 문자셋은 8859_1으로 처리하게됩니다. 그런데 8859_1은 한글을 지원하지 않기 떄문에 한글이 깨지는 현상이 나타납니다.
getWriter( )은 클라이언트에 응답하기 위한 출력 스트림을 반환한다. 그리고 이 출력 스트림을 이용해 클라이언트에게 응답을 보내게 된다.
마지막으로, 모든 응답을 마친 후에 출력스트림 객체의 close( )메소드를 이용해 스트림을 닫아 줌으로써 클라이언트와 웹서버간에 연결된 출력 스트림을 끊어 줍니다.
자바의 입출력 스트림에 관해 더 알고자 한다면 책의 99페이지를 참고하자.
[Docs] HttpServletResponse 인터페이스의 메소드
https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServletResponse.html
요청정보처리(HttpServletRequest)
클라이언트에서 웹서버로 요청을 보내면 HTTP 요청 규약에 알맞게 다양한 요청 정보들을 전달한다. 이때 클라이언트가 서버로 전달하는 요청정보들은 다음과 같다.
- 클라이언트의 IP 주소, 포트번호
- 클라이언트가 전송한 요청 헤더 정보(클라이언트에서 처리 가능한 문서 타입의 종류, 클라이언트 프로그램 정보, 처리 가능한 문자셋, 쿠키정보
- 요청 방식, 요청 프로토토콜의 종류와 버전, 요청하는 파일의 URI, 요청받은 서버의 정보
- 서버의 호스트이름, 포트 번호
- 사용자가 서블릿 요청시 추가로 전달한 정보
- 질의 문자열
package job.study.web; import java.io.*; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; @WebServlet("/urlInfo") public class URLInfoServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html;charset=EUC-KR"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<head><title>Request 정보출력 Servlet</title></head>"); out.println("<body>"); out.println("<h3>요청 방식과 프로토콜 정보</h3>"); out.println("Request URI : " + req.getRequestURI()+"<br/>"); out.println("Request URL : " + req.getRequestURL()+"<br/>"); out.println("Request Path : " + req.getContextPath()+"<br/>"); out.println("Request Protocol : " + req.getProtocol()+"<br/>"); out.println("Servlet Path : " + req.getServletPath()+"<br/>"); out.println("</body></html>"); out.close(); } }
[Docs] HttpServletRequest 인터페이스의 메소드
https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServletRequest.html