JSP

 

        out.print("Hello Servlet");

        out.print("

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

package unit01;

 

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 HelloServlet

 */

@WebServlet(description = "/HelloServlet", urlPatterns = { "/hello" })

public class HelloServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

 

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // TODO Auto-generated method stub

        

        response.setContentType("text/html");

        PrintWriter out =response.getWriter();

        out.print("

 

 

 

 

 

4 - 출력 스트림인 PrintWriter 를 사용하기 위해서는 import 를 해야 하는데, 이클립스에서는  (crtl + shift + 오우(알파벳) 을 누르면 자동으로 import 됩니다. 혹시 PrintWriter 를 입력하는 동안에 import 구문이 자동으로 추가될 수도 있으므로 컴파일 에러 메시지가 나타날 경우에만 

(ctrl + shift + 오우(알파벳) 을 눌러 자동 import 하면 됩니다.

20~24 : 서블릿은 실행 결과를 클라이언트에게 HTML 문서로 응답해 주기 때문에 response로 부터 얻어온 출력 스트림인 out 객체의 출력 메소드인 print 에 일일이 하드코딩한 HTML 태그를 기술해 주어야 합니다.

24. 출력 스트림과 같은 자원들은 사용이 끝나면 이를 안전하게 닫아 주어야 합니다.

 

private static final long serivalVersionUID  =1L ; 는 무엇일까요?

자동으로 추가된 14라인은 클래스를 구분하기 위한 값으로 사람에게 주민등록번호와 같은 역할을 합니다.

객체의 직렬화와 같이 객체에 저장된 데이터를 일렬로 입출력 때 JVM 은 같은 클래스 이름과 버전 ID를 가진 객체를 출력합니다. JVM 은 버전 ID 가 다른 객체의 직렬화된 형태와 연결하는 것을 거부합니다. 클래스는 명시적으로 serialVersionUID 필드를 정의해 클래스 버전에 따른 고유 번호를 포함하기 때문입니다.

 

서블릿을 요청하기 위한 URL 은 다음과 같습니다.

http://localhost:8181/web-study-02/hello

 

- web-study-02 : 켄텍스트 패스

- hello : 서블릿 요청 URL 패턴

 

 서블릿을 요청하기 위한 URL 에서 http://localhost 는 웹 서버에 접속하기 위한 IP 주소이고 8181 은 톰캣을 설치하면서 지정한  포트 번호입니다.

그렇기 때문에 http://localhost:8181 은 톰캣 서버에 접속하겠다는 의미입니다.

 컴퓨터가 웹 서버로 동작하도록 하기 위해서 1장에서 WAS 의 한 종류인 톰캣 서버를 설치했습니다. 우리가 작성하는 웹 애플리케이션은 톰캣 서버에 의해서 클라이언트에 서비스가 되는 것입니다.

 하나의 웹 서버는 병원 관리나 학원 관리, 영화 예매 관리, 온라인 쇼핑몰 등 다양한 서비스를 제공할 수 있습니다. 이런한 각각의 서비스는 개별젹인 웹 애플리케이션으로 작성해야 하며 웹 애플리케이션 하나당 하나의 프로젝트를 생성합니다. 병원 관리를 위한 웹 애플리케이션은 병원 관리 프로젝트로 학원 관리 웹 애플리케이션은 학원 관리 프로젝트를 개별적으로 생성합니다. 이클립스에서 생성하는 하나의 프로젝트는 하나의 웹 애플리케이션이 됩니다. http://localhost:8181 까지 입력하여 웹 서버까지 접근했다면 어떤 서비스를 받을지에 따라 그 이후에 기술되는 내용이 달라지는데, 이후에 기술하는 문자열을 컨텍스트 패스라고 하고 이에 의해서 요청되는 웹 애플리케이션이 달라집니다.

 컴텍스트 패스 Context Path란 개념을 다시 정리해서 말하자면 웹 서버에서 제공하는 다양한 웹 애플리케이션을 구분하기 위해서 사용하는 것입니다. 병원 관리를 위한 웹 애플리케이션을 위한 병원 관리 프로젝트를 hospital 이란 이름으로 이클립스에서 생성하면 hospital이란 컨텍스트 패스가 추가되고 외부에서 이 애플리케이션에 접근할 때에는 다음과 같은 URL 을 입력합니다.

http://localhost:8181/hospital  - 병원관리 애플리케이션에 접근하기 위한 컨텍스트 패스

 

 영화 예매 웹 애프리케이션을 movie 란 이름으로 프로젝트를 생성하면 movie 란 컨텍스트 패스가 추가되고 외부에서 이 애플리케이션에 접근할 때에는 다음과 같은 URL 을 입력합니다.

 

http://localhost:8181/movie - 영화예매 애플리케이션에 접근하기 위한 컨텍스트 패스

톰켓 서버에서 클라이언트에게 웹 애플리케이션을 서비스해 주기 위해서는 톰캣서버에 웹 애플리케이션을 등록해야 합니다. 등록 방법은 톰캣 서버의 server.xml 파일의   태그를 사용하여 컨텍스트 패스를 추가합니다.

 

 

 이클립스를 사용하지 않고 웹 애플리케이션을 개발할 때에는 일일이 태그를 개발자가 기술해야 했지만 이클립스는 컨텍스트 패스를 프로젝트 단위로 자동 생성해 줍니다.

 톰캣 서버의 환경 설멍을 위한 server.xml 파일을 열어보면 이클립스에서 자동으로 추가해 주는 컨텍스트 패스를 확인할 수 있습니다.

....

 

 

...

server.xml 을 이클립스에서 열어보면 위와 같이 나오지 않고 1장에서 만든 만 보이고 는 보이지 않습니다.

이런한 현상이 나타나는 이유는 태그가 웹 애플리케이션을 최초로 실행시키면서 추가되는데, 새로운 태그가 이미 존재하는 

태그 뒤에 추가되어 한 줄에 태그가 여러 번 기술되기 때문에 스크롤바를 움직여 오른쪽 끝으로 가야 보입니다.

 

나중에 추가된 웹 프로젝트에 대한 태그를 찾으려면 스크롤바를 움직여 오른쪽 끝으로 가서 확인하는 번거로운 작업을 반복해야 하기 때문에 들여쓰기를 하여태그가 서로 다른 라인에 출력되도록 하면 됩니다.

 하지만 들여쓰기를 개발자가 직접 하는 것이 번거롭다면 [Source ->Format] 메뉴를 선택하거나 단축키인 [Ctrl+Shift+F] 를 사용하면 코드가 자동으로 들여쓰기가 됩니다.

태그에 path 속성이 바로 서블릿을 요청할 때 지정할 URL 에 기술할 가상 패스입니다. 앞의 그림에서 Path 속성값이 프로젝트 이름인 "/web-study-02"/ 로 지정되어 있음을 확인할 수 있습니다. 이클립스에 의해 server.xml 파일에 자동 추가된 태그 덕분에 톰캣이 컨텍스트 패스 "/web-study-02" 를 인식할 수 있게 됩니다.

 이제 위에서 실습한 서블릿 클레스의 구조에 대해서 살펴보도록 합시다.

@WebServlet() 은 서블릿 3.0 에서부터 제공되었으며 서블릿 클래스의 요청을 위한 URL 매핑을 보다 쉽게 자바 클래스에서 설정할 수 있도록 제공되는 어노페이션입니다. 서블릿 3.0 이전에는 web.xml 에서 매핑을 했기 때문에 다소 불편합이 있었습니다.

 

어노테이션(Annotation)

Java 5.0 부터 AT 사인으로 시작하는 어노테이션이 지원되었습니다. 어노테이션은 문장이나 문서에 추가적인 정보를 기입하는 것을 말합니다. 자바 프로그램에 영향을 주는 것이 아니라 컴파일할 때 환경 설정을 변경해 줄 것을 알려주는 주석 형태를 말합니다. 이전에는 환경설정을  XML 파일에서 직접 해왔습니다. 하지만 XML 파일을 열어서 일일이 환경 설정하는 일이 번거롭기도 하고 XML 문법을 시간 내어 학습해야만 하기 때문에 개발자가 직접 XML 파일에서 작업하지 않고 자바 코드에서 어노테이션을 사용하는 방식으로 쉽게 환경을 설정하기 위해 자바 5.0 에서부터 등장하게 된 것입니다. 어노테이션 등장 덕분에 개발 시간이 단축되었습니다.

 

URL Mapping이란 서블릿을 동작시키기 위해서 실제 자바 클래스 명(HelloServlet) 을 사용하는 대신 서블릿을 요청하기 위한 문자열(hello) 을 서블릿 클래스와 매핑시키는 것을 말합니다.

 

그렇다면  URL 매핑을 하는 이유는 뭘까요?

 

실제 서블릿 클래스를 공개하지 않기 위해서 입니다. 실제 호출되는 서블릿 클래스는 HelloServlet이지만 외부에서 이 서블릿을 요청할 때에는 서블릿 클래스 이름이 아닌 서블릿 클래스와 매핑된 URL 인 hello 로 접근합니다.

 

@WebServlet(/hello)

public class HelloServet extends HttpServet{

}

 

개발자가 어노테이션으로 패턴을 지정하는 것과 이클립스에서 직접 패턴을 지정하는 것의 차이가 있나요?

개발자가 URL pattern 을 이클립스 메뉴에서 변경하든 하지 않았든, 사용자가 서블릿을 요청하기 위해서는 브라우저 주소 입력란에 URL pattern 을  기술해야만 서블릿이 요청됩니다.

URL Mapping 없이는 서블릿을 호출하지 못합니다.

개발자는 자신이 만든 서블릿 클래스가 어느 경로에 무슨 이름으로 만들어졌는지 알아야 하지만 클라이언트는 어느 디렉토리에 어느 디텍토리에 어느 파일명으로 존재하는지는 관심 없고 URL 이름을 입력하여 원하는 서비스만 받을 수 있으면 됩니다.

만일 사용자가 서블릿의 실제 경로와 파일 이름을 직접 입력해야 한다면 디렉토리 구조가 바뀌었을 때 사용자에게 일일이 변경된 위치를 통보해 주어야 합니다. 개발자가 아닌 사용자가 실제 개발 구조를 다 알아야만 사용할 수 있다면 수정된 내용을 다 알고 있어야 합니다. 하지만 매핑을 통해 사용자가 접근하는 URL 이름은 실제 물리적인 위치 정보가 아니기에 이런 문제에 유연하게 대처할 수 있게 됩니다. 또한 사용자에게 디렉토리 구조와 파일명을 모두 공개한다는 것은 보안 측면에서도 심각한 문제가 발생할 수 있습니다.

요청은 URL pattern 으로 하고

http://localhost:8181/web-study-02/hello ->서블릿 요청 URL 패턴

이 패턴을 @WebServlet 어노테이션 코드이 URL Mapping 에서 찾아서 일치하면 이 URL Mapping 바로 아래 선언된 서블릿 클래스가 요청됩니다.

 

@WebServlet(/hello)

public class HelloServlet extends HttpServlet{

}

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

당신이 남들에게 범한 작은 잘못은 큰 것으로 보고, 남들이 당신에게 범한 큰 잘못은 작은 것으로 보라. -탈무드

댓글 ( 4)

댓글 남기기

작성

JSP 목록    more