개발새발

5. [웹 프로그래밍 기초] Servelet - BE 본문

[부스트코스] 웹프로그래밍/웹 프로그래밍 기초

5. [웹 프로그래밍 기초] Servelet - BE

재래김유진 2019. 11. 20. 20:33
728x90
반응형

[자바 웹 어플리케이션 (Java Web Application)]

WAS에 설치(deploy)되어 동작하는 어플리케이션입니다.

자바 웹 어플리케이션에는 HTML, CSS, 이미지, 자바로 작성된 클래스(Servlet도 포함됨, package, 인터페이스 등), 각종 설정 파일 등이 포함됩니다.

 

*프로젝트생성해서 서블릿클래스는 이클립스 내부 런타임 톰캣에 의해 동작되고 이후 브라우저 이용해서 톰캣서버에 요청보내고 화면 띄움 

자바 웹 어플리케이션의 폴더 구조

1) Servlet이란? 

자바 웹 어플리케이션의 구성요소 중 동적인 처리를 하는 프로그램의 역할입니다.

서블릿을 정의해보면 서블릿(servlet)은 WAS에 동작하는 JAVA 클래스입니다. 

서블릿은 HttpServlet 클래스를 상속받아야 합니다.

서블릿과 JSP로부터 최상의 결과를 얻으려면, 웹 페이지를 개발할 때 이 두 가지(JSP, 서블릿)를 조화롭게 사용해야 합니다.

예를 들어, 웹 페이지를 구성하는 화면(HTML)은 JSP로 표현하고, 복잡한 프로그래밍은 서블릿으로 구현합니다.

 

* 응답결과 만들어낼때 out.print해서 일일이 넣을수 없음 그래서 만들어낸게 jsp

 

[생각해보기]

1. 동적인 페이지가 필요한 경우는 어떤 것일까요?

  - 클라이언트가 정보를 요청하고 서버가 응답해줘야할 필요가 있을때

 

 

 

2) Servlet 작성 방법

현재는 프로젝트에서 웹을 개발할 때 서블릿을 직접 써서 개발하지 않고 편하게 사용할 수 있게 도와주는 다양한 프레임워크(spring?)를 사용해서 개발하는 경우가 많다. 하지만 그 프레임워크들도 서블릿 없이는 동작할 수 없기 때문에 서블릿의 기본적인 작성법이나, 라이프 사이클을 이해하고 있으면 웹의 동작을 이해하는데 많은 도움이 된다. 

 

[버전에 따른 Servlet 작성 방법]

1. Servlet 3.0 spec 이상에서 사용하는 방법

  - web.xml 파일을 사용하지 않습니다.

  - 자바 어노테이션(annotation)을 사용합니다.

like this,,어노테이션 사용한 예 

실습쓰

프로젝트 생성할 때
**Ten이라고 할거기 때문에 Ten이라고 수정함.
3.0이상 버전 어노테이션으로 만든 서블릿파일

 

2. Servlet 3.0 spec 미만에서 사용하는 방법

servlet을 등록할 때 web.xml 파일에 등록합니다.

web.xml

 

이건 3.0미만 버전 web.xml. 3.0이상버전에서는 이런일들을 어노테이션이 해줌 

**3.0미만 버전에서는 서블릿 하나 생성하면 무조건 web.xml에 등록해줘야했음

 

3.0미만 버전 web.xml로 만든 서블릿 파일

 

[생각해보기]

1. HelloServlet 클래스 파일을 작성할 때 HttpServlet을 상속하지 않았다면 어떻게 동작할까요? 

  - 일단 에러남

was( 서블릿컨테이너 ) 는 servlet 호출규칙에 따라 서블릿(.class) 을 실행시킵니다.

servlet 규칙에 따라 만들어진 class가 HttpServlet입니다.  즉 HttpServlet 는 서블릿 규칙에 따라 만들어진것입니다. 많은 호출규칙들이 HttpServlet 클래스에 있을것입니다. doGet, doPost 등이 서블릿 호출 규칙입니다. 그런데 HttpServlet을 상속하지 않으면 Servlet 규칙에 어긋나기 때문에 에러가 발생합니다. 

 

3) Servlet 라이프 싸이클

어떤 객체의 생성부터 소멸까지의 과정을 라이프 사이클 (Life Cycle)라고 한다.

(init, destroy, pause이런거? 안드로이드 할때 배움ㅎ)

 

알아볼 내용 : 서블릿이 언제 생성되고 언제 호출이되는가! 

 

[Servlet 생명주기]

  • WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인합니다.
  •  if (메모리에 없음) {
     - 해당 서블릿 클래스를 메모리에 올림
     - init() 메소드를 실행
    }
     - service()메소드를 실행
  • was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행됩니다.

 

[참고링크] 템플릿 메소드  패턴

http://jdm.kr

 

템플릿 메소드 패턴(Template Method Pattern) :: JDM's Blog

이 포스팅은 템플릿 메소드(Template Method) 패턴에 대해서입니다. 간단하게 최종 코드를 먼저 보고 그 뒤 하나씩 구현해보겠습니다. 최종 코드 public class TemplateMain { public static void main(String[] args) { // 전사는 전투 준비를 위해서 // 체력을 단련하고, 검을 닦고, 갑옷을 입습니다. Warrior warrior = new Warrior(); warrior.readyToBattl

jdm.kr

 

4) Request, Response 객체 이해하기

 

자바에서의 객체 = 관련된 정보를 모아서 가지고 있음 

요청과 응답

[요청과 응답]

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

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

[HttpServletRequest]

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

[HttpServletResponse]

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

 

[헤더 정보 읽어들이기]

실습코드

클라이언트가 요청했을 때 가지고 들어온 헤더의 정보를 알아내는 방법

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
package HeaderServlet;
 
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
 
@WebServlet("/header")
public class header extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public header() {
        super();
    }
                        //doGet메서드에 파라미터로 가지고옴
    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>");
                                        //request에 물어보면 나옴 
        Enumeration<String> headerNames = request.getHeaderNames();    //모든 헤더 정보를 문자열 Enumeration반환
        while(headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            String headerValue = request.getHeader(headerName);
            out.println(headerName + " : " + headerValue + " <br> ");
        }        
        
        out.println("</body>");
        out.println("</html>");
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
 
}
 
 

 

[파라미터 읽어 들이기]

실습코드

 

[그외의 요청정보 출력]

"get하고 보면 request 객체 = 클라이언트가 요청할때 보내준 정보들을 모두 추상화해서 가지고 있는 객체고

필요하다면 객체로부터 원하는 값을 받아서 사용할수 있겠구나!"

 

[참고링크] HTTP headers

https://developer.mozilla.org

 

HTTP headers

HTTP headers let the client and the server pass additional information with an HTTP request or response. An HTTP header consists of its case-insensitive name followed by a colon (:), then by its value.

developer.mozilla.org

 

728x90
반응형
Comments