-
서블릿의 응답과 요청: 헤더값 알아내기Let's Code/Server 2019. 8. 30. 23:26
WAS는 서블릿과 웹 브라우저를 이어주는 중간 관리자 같은 개념인데 서버의 과부하를 막기 위해 고안되었다고 한다. (아마도)
JAVA는 *객체 지향* 즉, 객체를 생성하여 정보를 보관하는 프로그래밍 언어다. (객체 지향의 뜻이 뭘까 고민했는데 생각보다 간단했다)
만약 웹 브라우저가 처음에 요청을 넣으면, HttpServletRequest라는 객체가 생성된 후, 이를 서블릿에 전달한다.
이 때 보관되는 정보는, 1) 헤더정보 2) 파라미터 3) 쿠키 4) URI 5) URL 등이 있다.
반대로 서블릿이 응답하면, HttpServletResponse 객체를 생성한 후, 이를 웹 브라우저에 전달한다.
이 때 보관되는 정보는 1) content type 2) 응답코드 3) 응답 메시지 등이 있다.
헤더 정보를 알아내는 서블릿
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>form</title></head>"); out.println("<body>"); Enumeration<String> headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); String headerValue = request.getHeader(headerName); out.println(headerName + " : " + headerValue + " <br> "); } out.println("</body>"); out.println("</html>"); }
처음 요청을 보낼 때 Content Type을 우선 정해줘야 한다. 이번 경우는 html 텍스트.
두번째 줄은 브라우저로부터 응답을 받을 통로를 get으로 설정한 것이라고 한다. 그 후, html 태그 배열.
Enumeration 메소드는 특정 결과값을 다른 타입으로 바꿔주는 메소드라고 하는데, 이번 경우에서는 헤더의 정보값을 문자열인 String으로 변환하는 데 쓰였다.
getHeader 메소드로 헤더 값 추출, 헤더 이름 : 헤더값 형식으로 출력하도록 지정하였다.
* 이 때, 줄바꿈을 위해 끝에 <br> 태그를 넣어줄 것.
파라미터 값을 알아내는 서블릿
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>form</title></head>"); out.println("<body>"); String name = request.getParameter("name"); String age = request.getParameter("age"); out.println("name : " + name + "<br>"); out.println("age : " +age + "<br>"); out.println("</body>"); out.println("</html>"); }
웹 페이지의 주소창에서 만약 끝맺음이 "?name=kim&age=5" 라면 물음표 다음부터 파라미터다. (지금 쓰고있는 티스토리의 경우 ?type=post&returnURL=~~ 라고 되어있는데 type이라는 이름 값이 post라는 것을 알 수 있다)
여기서는 name이 이름, kim이 값이다. &는 다른 파라미터들을 연결할 때 쓰는 기호인데, 무한정 사용할 수 있다.
처음에 age 값이 분명 5라는 숫자인데 왜 String (문자라는 뜻)이지? 하고 헷갈렸는데 서블릿은 이를 분별하는 능력이 없으며 다 문자로 받는다고! ("name")이라고 명시해주면 찾아내어서 그 값인 kim이 String 다음에 온다고 한다.
만약 접속하는 주소를 ?name=lim&age=7 라고 바뀐다면 응답 결과도 바뀐다. 동적인 페이지니까!
URL, URI 등을 알아내는 서블릿
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>info</title></head>"); out.println("<body>"); String uri = request.getRequestURI(); StringBuffer url = request.getRequestURL(); String contentPath = request.getContextPath(); String remoteAddr = request.getRemoteAddr(); out.println("uri : " + uri + "<br>"); out.println("url : " + url + "<br>"); out.println("contentPath : " + contentPath + "<br>"); out.println("remoteAddr : " + remoteAddr + "<br>"); out.println("</body>"); out.println("</html>"); } }
url에서 포트번호와 프로젝트 명을 제외한 값이 uri.
WAS에 저장된 여러 웹 어플리케이션 중 적절한 경로를 찾아가기 위한 주소가 contentPath인데, 별도의 설정을 하지 않는다면 서블릿의 이름과 같다.
remoteAddr는 클라이언트의 주소.
'Let's Code > Server' 카테고리의 다른 글
서블릿(Servlet)의 라이프싸이클(LifeCycle) (0) 2019.08.30 Eclipse에서 Tomcat 연동하기 / 서블릿 예제 2 (0) 2019.08.27 웹이 구현되는 과정 (0) 2019.08.25 댓글