티스토리 뷰

웹브라우저에 url을 입력하고 엔터를 치면 도메인과 포트번호를 이용해 서버에 접속

 

패스정보, 클라이언트의 다양한 정보를 포함한 요청정보를 서버에 전달한다.

 

클라이언트로부터 요청이 들어오면 WAS는 HttpServletRequest, HttpServletResponse 객체를 생성

요청정보에 있는 패스로 매핑된 서블릿에게 전달한다.

이렇게 전달받은 내용들을 파라미터로 doGet, doPost등에 전달된다.

 

 

요청과 응답

WAS는 웹 브라우저로부터 Servlet요청을 받으면,

  • 요청할 때 가지고 있는 정보를 HttpServletRequest객체를 생성하여 저장합니다.
  • 웹 브라우저에게 응답을 보낼 때 사용하기 위하여 HttpServletResponse객체를 생성합니다.
  • 생성된 HttpServletRequest, HttpServletResponse 객체를 서블릿에게 전달합니다.

 

HttpServletRequest

  • http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용합니다.
  • 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드를 가지고 있습니다.
  • Body의 Stream을 읽어 들이는 메소드를 가지고 있습니다

 

HttpServletResponse

  • WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse객체를 생성하여 서블릿에게 전달합니다.
  • 서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지등을 전송합니다.

 

 

헤더정보 알아내기

클라이언트가 서버에게 요청을 보낼때에는 굉장히 많은 정보들을 함께 가지고 요청을 한다

이때 들어오는 요청 정보들이 어떤것들이 있는 지 알아보자

 

첫번째로 헤더정보가 존재하는데, 웹브라우저가 요청정보에 담아서 보내는 header값을 읽어 들여 브라우저에 출력해보자.

 

http://localhost:8080/httpex/header

pakage name : examples

class name : HeaderServlet

url mapping : /header

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package examples;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * Servlet implementation class HeaderServlet
 */
@WebServlet("/header")
public class HeaderServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HeaderServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<hmtl>");
        out.println("<head><title>form</title></head>");
        out.println("<body>");
        
        //request에 클라이언트의 정보들이 다 담겨있음
        //그럼 request에게 다 물어보면 정보들을 알아낼 수 있음
        Enumeration<String> headerNames = request.getHeaderNames();//request가 가지고 있는 메서드 중에 getHeaderNames()라는 메서드가 있다.
                                                                    //이 메서드는 모든 헤더 이름을 문자열(Enumeration)객체로 반환해준다.
        while(headerNames.hasMoreElements()) {//while문을 통해서 정보들을 알아본다.
            String headerName = headerNames.nextElement();//헤더 네임 알아내기
            String headerValue = request.getHeader(headerName); //헤더의 값 정보 받아내기
            out.println(headerName + " : " + headerValue + "<br>");
        }
        
        out.println("</body>");
        out.println("</html>");
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
 
}
 
cs

 

 

파라미터 읽어들이기

- URL 주소의 파라미터 정보를 읽어 들여 브라우저 화면에 출력한다.

- URL에서 ?를 기준으로 뒤에 있는 것들을 파라미터라고 부른다.

- &를 사용하면 더 많은 파라미터를 사용할 수 있다.

- =의 앞에있는 것은 파라미터 이름, = 뒤가 파라미터 값

- 이름은 김, 나이는 5 이렇게 넘길려고 한다.

- 이 정보들을 읽어들여 사용하는 서블릿 파일을 만들어보자

 

http://localhost:8080/httpex/param?name=kim&age=5

pakage name : examples

class name : ParameterServlet

url mapping : /param

 

그리고 아래 코드 작성

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package examples;
 
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;
 
/**
 * Servlet implementation class ParameterServlet
 */
@WebServlet("/para")
public class ParameterServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ParameterServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>form</title></head>");
        out.println("<body>");
        
        String name = request.getParameter("name");//request의 getParameter메서드를 실행시켜 정보를 가져온다, getParameter("파라미터이름)(현 name)")을 넣으면 String name에 '김'이 들어간다
        String age = request.getParameter("age");//getParameter(파라미터이름(현 age))를 실행, String age에 5가 들어간다.
        
        out.println("name : " + name + "<br>");
        out.println("age : " + age);
        out.println("</body>");
        out.println("</html>");
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
 
}
 
cs

 

실행시키면

name : null

age : null

로 출력된다.

 

그 이유는 요청했던 url을 보면 알 수 있는데, 뒤에 '?값들' 없다

맨 마지막에 ?name=kim&age=5를 작성해주면 값이 담긴다.

 

html 태그중 form 태그를 이용해 (input 속성?) 파라미터를 넘길 수 있다.

 

 

그 외의 요청정보 출력

- request가 가지고 있는 다양한 메서드들을 이용해서 더 다양한 값을 출력해보자

- URI, URL, PATH, Remote host 등에 대한 정보 출력

 

http://localhost:8080/httpex/info

package name : examples

class name : InfoServlet

url mapping : /info

 

*tip

- 앞에 get.. 을 쳐보고 각 메소드들을 실습해보며 공부하는 것도 좋음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package examples;
 
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;
 
/**
 * Servlet implementation class InfoServlet
 */
@WebServlet("/info")
public class InfoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public InfoServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        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>");
    }
 
}
 
cs

 

uri :

url :

contentPath : 웹 어플리케이션과 매핑된 패스, 웹 어플리케이션을 찾아가는 이름

remoteAddr : 클라이언트의 주소 값, 지금은 로컬 컴퓨터로 접속했기 때문에 0:0:0...... ex)악성 댓글..ㅋㅋ 

 

실습때 배운 정보들이 아니더라도 다른 정보들을 다 추상화해서 request가 가지고 있기 때문에

get정보이름() 메서드들을 이용해 확인해 볼 수 있다.

 

참고 사이트 : http://www.edwith.org/



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.

 

' > 부스트코스' 카테고리의 다른 글

[WEB]JSP란?  (0) 2018.05.26
[WEB]Element가 배치되는 과정  (0) 2018.05.20
[WEB]servlet 라이프 사이클  (0) 2018.05.20
[WEB]Servlet 작성 방법  (0) 2018.05.20
[WEB]Servlet이란?  (0) 2018.05.17
댓글