Presentation is loading. Please wait.

Presentation is loading. Please wait.

2 서블릿의 기초.

Similar presentations


Presentation on theme: "2 서블릿의 기초."— Presentation transcript:

1 2 서블릿의 기초

2 학습목표 서블릿 클래스는 자바 클래스 형태로 구현되는 웹 애플리케이션 프로그 램이며, 일반적인 자바 클래스를 작성 할 때보다 지켜야 할 규칙이 많으 므로 이 장에서는 규칙들을 배워보자. 내용 서블릿이란? 서블릿 클래스의 작성, 컴파일, 설치, 등록 톰캣 관리자 프로그램 사용하기 웹 브라우저로부터 데이터 입력받기

3 1. 서블릿이란? 서블릿이란 서블릿 클래스로부터 만들어진 객체이다.
웹 컨테이너는 서블릿 클래스를 가지고 서블릿 객체를 만든 다음 객체를 초기화해서 웹 서비스를 할 수 있는 상태로 만드는데, 이 작업을 거친 서블릿 객체만 서블릿이라고 할 수 있다. 인스턴스화(instantiation)란 클래스를 가지고 객체를 만드는 행위를 말한다. 멀티스레드(multithread)란 프로그램의 실행 흐름이 여거 갈래(thread)로 나눠져서 동시 에 실행되는 것을 말한다. 인스턴스화 초기화 서블릿 클래스 서블릿 객체 서블릿 [그림 2-1] 서블릿 클래스, 서블릿 객체, 서블릿

4 [그림 2-2] 멀티-스레드 모델과 싱글-스레드 모델
1. 서블릿이란? 멀티-스레드 모델의 장단점은 필요한 서블릿의 수가 적기 때문에 서블릿을 만들기 위해 필요한 시스템 자원과 서블릿이 차지하는 메모리를 절약할 수 있으며, 여러 스레드가 동 시에 한 서블릿을 사용하기 때문에 데이터 공유 문제에 신경을 써야 한다. 싱글-스레드 모델에서는 데이터 공유 문제를 걱정할 필요가 없지만 시스템 자원과 메모 리가 더 많이 사용된다. [그림 2-2] 멀티-스레드 모델과 싱글-스레드 모델

5 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스의 작성을 위한 준비
서블릿 클래스를 작성할 때 지켜야 할 규칙 세 가지. 서블릿 클래스는 javax.servlet.http.HttpServlet 클래스를 상속하도록 만들어야 합니다 doGet 또는 doPost 메서드 안에 웹 브라우저로부터 요청이 왔을 때 해야 할 일을 기술해야 한다. HTML 문서는 doGet, doPost 메서드의 두 번째 파라미터를 이용해서 출력해야 합니다. 구현 Servlet 인터페이스 GenericServlet 클래스 상속 HttpServlet 클래스 우리가 작성한 서블릿 클래스 [그림 2-3] 서블릿 클래스의 상속/구현 관계

6 [그림 2-4] Servlet 인터페이스와 GenericServlet, HttpServlet 클래스의 API 규격서
2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스의 작성을 위한 준비 [그림 2-4] Servlet 인터페이스와 GenericServlet, HttpServlet 클래스의 API 규격서

7 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 작성하기
서블릿 클래스를 작성할 때 지켜야 할 첫 번째 규칙은 javax.dervlet.http.HttpServlet 클 래스를 상속받도록 만들어야 하며, 하나 덧붙이면 클래스는 public으로 만들어야 한다. 서블릿 클래스 안에 doGet 또는 doPost 메서드를 선언하며, 두 메서는 javax.servlet.http.HttpServletRequest와 javax.servlet.http.HttpServletResponse 타입의 파 라미터를 받아야 하고 메서드 밖으로 javax.servlet.ServletException과 java.io.IoException을 던질 수 있도록 선언해야 한다. public class HundredServlet extends HttpServlet { } 프로그래머가 정한 클래스 이름 서블릿 클래스의 슈퍼클래스

8 [그림 2-5] HttpServlet 클래스의 doGet 메서드
2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 작성하기 [그림 2-5] HttpServlet 클래스의 doGet 메서드

9 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 작성하기
doGet 메서드를 작성할 때는 다음과 같은 골격을 만드는 것으로 시작한다. doGet 메서드를 public으로 선언해야 하는 이유는 웹 컨테이너가 웹 브라우저로부터 요 청을 받아서 메서드를 호출할 때 필요하기 때문이다. doGet 메서드의 throws 절에서는 ServletException과 IOException이 필요치 않으면 생략 할 수도 있으며, 새로운 익셉션을 추가할 수는 없다. public class HundredServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } HttpServlet 클래스의 doGet 메서드와 리턴 타입, 파라미터 변수, 익셉션 타입이 동일해야 합니다.

10 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 작성하기
doGet 메서드의 골격을 만든 다음에는 안에 내용을 채워 넣는다. 결과를 출력하는 코드를 작성할 때 doGet 메서드의 두 번째 파라미터를 이용해서 작성 한다. 파마리터는 javax.serlvet.http.HttpServletResponse 인터페이스 타입이며, hetWriter라는 메서드를 호출해서 PrintWriter 객체를 구한다. public class HundredServlet extends HttpServlet { public void doGet(doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int total = 0; for (int cnt = 1; cnt < 101; cnt++) total += cnt; } 1부터 100까지의 합을 구하는 명령문

11 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 작성하기
PrintWriter는 자바 프로그램에서 파일로 텍스트를 출력할 때 사용하는 java.io 패키지의 PrintWriter 클래스이다. Response.gerWriter메서드가 리턴하는 PrintWriter 객체는 파일이 아니라 웹 브라우저 데이터를 출력한다. PrintWriter writer = response.getWriter(); PrintWriter 객체를 리턴하는 매서드 writer.print( ”<HEAD> ”); writer.println( ”<BODY> ”); 웹 브라우저로 텍스트를 출력하는 메서드 writer.printf( ”TOTAL = %d ”, total);

12 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 작성하기 계산 결과를 웹 브라우저로 출력하는 코드 이다.
public class HundredServlet extends HttpServlet { public void doGet(doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int total = 0; for (int cnt = 1; cnt < 101; cnt++) total += cnt;? PrintWriter out = response.getWriter(); out.println( ”<HTML> ”); out.println( ”<HEAD><TITLE>Hundred Servlet</TITLE></HEAD> ”); out.println( ”<BODY> ”); out.printf( ” = %d ”, total); out.println( ”</BODY> ”); out.println( ”</HTML> ”); } 계산 결과를 HTML로 만들어서 웹 브라우저로 출력하는 명령문

13 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 작성하기
서브릿 클래스가 완성 되었으면, 코드에서 사용한 여러 가지 클래스와 인터페이스를 가 져오는 import 문을 추가 한다. [예제2-1] 1부터 100까지 더하는 서블릿 클래스 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class HundredServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int total = 0; for (int cnt = 1; cnt < 101; cnt++) total += cnt; PrintWriter out = response.getWriter(); out.println( ”<HTML> ”); out.println( ”<HEAD><TITLE>Hundred Servlet</TITLE></HEAD> ”); out.println( ”<BODY> ”); out.printf( ” = %d ”, total); out.println( ”</BODY> ”); out.println( ”</HTML> ”); }

14 [그림 2-6] 아무 옵션을 사용하지 않고 서블릿 클래스를 컴파일했을 때 나오는 에러 메시지
2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 컴파일하기 서블릿 클래스도 자바 클래스와 마찬가지로 javac 명령을 이용해서 컴파일 할 수 있다. [예제 2-1]의 소스 코드를 저장해 놓는 디렉터리로 가서 javac 명령으로 컴파일을 하면 다음과 같은 에러 메시지가 나온다. 소스 코드가 있는 디렉터리로 이동하는 명령 서블릿 클래스를 컴파일하는 명령 [그림 2-6] 아무 옵션을 사용하지 않고 서블릿 클래스를 컴파일했을 때 나오는 에러 메시지

15 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 컴파일하기
에러 메시지가 나오는 이유는 import한 javax.servlet과 javax.servlet.http 패키지와 JDK 의 표준 라이브러리에 없기 때문이다. 서블릿 클래스를 컴파일할 때는 –cp옵션을 이용해서 두 패키지가 속하는 라이브러리의 경로명을 명시해 주어야 한다. javax.servlet.http 패키지에 속하는 HttpServlet 클래스의 파일입니다

16 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 컴파일하기
서블릿 클래스를 컴파일할 때 파일의 경로명을 –cp옵션으로 지정하면 컴파일 에러가 발 생하지 않는다. 컴파일에 실패한다면 경로명을 입력하는 과정에서 생길 수 있다. 경로는 JDK가 설치되어 있는 디렉터리 jre\lib\ext 서브디렉터리로 가서 톰캣의 lib 서브 디렉터리에 있는 servlet-api.jar 파일을 디렉터리로 복사한다. [그림 2-8] 서블릿을 컴파일 하는 방법(1) [그림 2-10] 서블릿을 컴파일 하는 방법(2)

17 [그림 2-11] 예제 서블릿의 클래스 파일들이 저장되어 있는 디렉터리
2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 설치하기 JSP 페이지와 달리 서블릿 클래스는 소스 코드를 설치할 필요가 없고, 컴파일 결과물인 클래스 파일만 설치하면 된다. ②예제 서블릿의 클래스 파일들이 저장되어 있다. ①examples 웹 애플리케이션 디렉터리의 WEB-INF\classes 서브디렉터리로 가 보세요. [그림 2-11] 예제 서블릿의 클래스 파일들이 저장되어 있는 디렉터리

18 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 설치하기
톰캣의 webapps\brain 디렉터리로 가서 아래에 WEB-INF라는 서브디렉터리를 만들고 그 아래에 classes라는 서브디렉터리를 만든 후 컴파일 결과물인 HundredServlet.class파 일을 디렉터리에 저장한다. ②[예제 2-1]의 컴파일 결과를 그 디렉터리로복사한다 ① brain 웹 애플리케이션 디렉터리 아래에 WEB-INF\classes라는 서브디렉터리를 만든다.

19 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 등록하기
서블릿 클래스는 JSP 페이지와 달리 설치뿐만 아니라 등록을 하는 과정도 필요하다. 웹 애플리케이션의 디플로이먼트 디스크립터 파일에 등록하며, 웹 애플리케이션의 디플 로이먼트 디스크립터 파일은 웹 애플리케이션 디렉터리의 WEB_INF 서브디렉터리 아 래 있는 web.xml이라는 이름이 파일을 말한다. 톰캣의 webapps\examples\ WEB_INF 디렉터리로 가면 web.xml 파일이 있다. XML파일이고, 텍스트 에디터를 이용해서 열어 볼 수 있다. web.xml 파일을 열 때 메모장 대신 워드패드처럼 기능이 풍부한 텍스트 에디터를 이용 하는게 좋으며, web.xml 파일 중에는 UNIX 포맷으로 만들어 진 것 도 있는데 이러한 파 일은 메모장으로 열면 줄 바꿈 표시가 제대로 되지 않는 것에 유의한다.

20 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 등록하기 ②거기에 있는 web.xml 파일을 텍스트 에디터로
열어보세요 ① 톰캣의 examples 웹 애플리케이션의 WEB-INF 서브디렉터리로 가세요.

21 <?xml version= ”1.0 ” encoding= ”ISO-8859-1 ”?>
2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 알아두세요(문법의 기초) XML은 HTML과 마찬가지로 텍스트 내용에 태그(또는 마크업)를 첨가하기 위해 사용되 는 문법이다. XML과 HTML의 서로 다른 점은 다음과 같다. 첫째 : XML 문서의 제일 앞에는 XML 선언이 올 수 있으며, XML 선언은 XML 문서 작성에 사용 된 XML 규격서의 버전과 XML 문서를 저장하는 데 사용된 무자 코드의 인코딩 방식을 표시하는 역할을 한다. XML 문서에서 XML 선언이 생략 될 수도 있는데 XML 문서의 내용이 ASCII 문자로만 구성되었을 경우에는 생략할 수 있다. 둘째 : HTML에서는 모든 문서의 작성 방법이 동일하지만, XML에서는 문서의 종류에 따라 문서 작성 방법이 달라질 수 있다. <?xml version= ”1.0 ” encoding= ”ISO ”?> XML 규격서의 버전 문자셋의 인코딩 방식

22 <IMG src= ”/img/car.jpg ”> <role rolename= ”admin ”/>
2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 알아두세요(문법의 기초) 셋째 : HTML에서는 엘리먼트 이름과 애트리뷰트 이름에 있는 대소문자를 구분하지 않지만 XML에서는 엄격하게 구분한다. 넷째 : HTML에서는 단독으로 사용되는 태그가 <로 시작해서> 로 끝나야 하지만, XML에서는 < 로 시작해스 />로 끝나야 한다. ★HTML 문서★ ★XML 문서★ <Body> <Body> <servlet> <servlet> 동일한 태그 입니다. 서로 다른 태그입니다. ★HTML 문서★ ★XML 문서★ <IMG src= ”/img/car.jpg ”> <role rolename= ”admin ”/> 시작 표시 끝 표시 시작 표시 시작 표시 끝 표시

23 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 알아두세요(문법의 기초)
다섯째 : HTML에서는 애트리뷰트 값을 따옴표로 묶지 않고 쓸 수도 있지만, XML에서는 반드시 따옴표로 묶어서 써야한다. 여섯째 : HTML에서는 다소 문법이 맞지 않는 부분이 있으면 웹 브라우저가 이를 보정해서 처리 하지만, XML에서는 문법에 조금이라도 맞지 않는 부분이 있으면 XML 문서 전체가 올바르게 처 리 되지 않는다. ★HTML 문서★ ★XML 문서★ <IMG src= ”/img/car.jpg ”> <role rolename= ”admin ”/> 올바른 문법 잘못된 문법 ★HTML 문서★ ★XML 문서★ <H1>회사 개요</H2> <servlet-name>MyServlet</servlet-class> 짝이 맞지 않아도 웹 브라우저가 보정해 준다 짝이 맞지 않으면 문서 전체가 올바르게 처리되지 않는다.

24 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 등록하기
Web.xml 파일은 웹 애플리케이션 디렉터리마다 하나씩만 만들 수 있다. Web.xml 파일을 새로 만들 때는 루트 엘러민트인 <web.app>을 만드는 일부터 시작하는 것이 좋다. 웹 서버가 웹 브라우저로부터 URL을 받았을 때 서블릿 클래스를 찾아서 호출하기 위해 필요한 정보를 기록해야 한다. <web-app> web.xml 파일의 루트 엘리먼트 </web-app> <web-app> <servlet> 서블릿 클래스의 이름이 들어갈 부분 </servlet> <servlet-mapping> 서블릿 클래스를 호출할 때 사용할 URL이 들어갈 부분 </servlet-mapping> </web-app>

25 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 등록하기
<servlet-mapping> 엘리먼트 안에 써 넣을 URL은 웹 브라우저의 주소 창에 입력할 전체 URL이 아니라 웹 서버의 도메인 이름, 포트 번호, 웹 어플리케이션 디렉터리의 이름까 지를 제외한 나머지 부분이어야 한다. 전제 URL 서블릿의 URL 패턴 /hundred 웹 서버의 도메인 이름 포트 번호 웹 어프릴케이션 디렉터리의 이름 <web-app> <servlet> <servlet-class>HundredServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/hundred</url-pattern> </servlet-mapping> </web-app> 서블릿 클래스의 이름 서블릿의 URL 패턴

26 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 등록하기
Web.xml 파일에는 나중에 다른 <servlet>, <servlet-mapping> 엘리먼트가 추가 될 수도 있으며, 두 엘리먼트가 서로 찾을 수 있도록 연결시켜야 하는데 방법은 <servlet> 엘리먼 트 안에 서블릿의 식별자로 사용할 이름을 쓰고 <servlet-mapping> 엘리먼트에서 그 이 름을 이용해 <servlet> 엘리먼트를 참조하도록 만든다. <web-app> <servlet> <servlet-name>hundred-servlet</servlet-name> <servlet-class>HundredServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/hundred</url-pattern> </servlet-mapping> </web-app> <servlet-mapping>엘리먼트는 <servlet-name> 엘리먼트의 값을 가지고 <servlet> 엘리먼트를 참조합니다

27 Web.xml 파일의 작성에 사용된 문법의 식별자
2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 등록하기 모든 web.xml 파일 안에 반드시 써 넣어야 하는 두 가지 정보가 포함되어 있는데 web.xml 파일의 작성에 사용된 문법의 식별자와 문법의 버전이다. Web.xml 파일의 작성에 사용된 문법의 식별자 <web-app xmlns= ” ” xmlns:xsi= ” ” xsi:schemaLocation= ” version= ”2.5 ”> 뮨법의 버전

28 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 클래스 등록하기
<web-app> 엘리먼트의 시작 태그에 다음과 같은 내용을 추가하라. Web.xml 파일의 작성에 사용된 문법의 식별자 뮨법의 버전 <web-app xmlns= ” ” version= ”2.5 ”> <servlet> <servlet-name>hundred-servlet</servlet-name> <servlet-class>HundredServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/hundred</url-pattern> </servlet-mapping> </web-app> ①텍스트 에디터로 web.xml 파일을 작성하세요 ②brain 웹 애플리케이션 디렉터리의 WEB-INF 서브디렉터리에 저장하세요. [그림 2-14] 서블릿 클래스를 web.xml 파일에 등록하는 방법

29 2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 실행하기
웹 브라우저를 열주소 창에 URL을 입력하면 [ 예제 2-1]이 정상적으로 실행되는 웹 페이지가 나타난다. 등록 과정이 잘못되었다면 다음과 같은 에러 페이지가 나타난다. [그림 2-15] 예제 2-1의 실행 결과 – 성공적인 결과 [그림 2-16] 예제 2-1의 실행 결과 – 서블릿의 등록이 잘못되었을 때

30 [그림 2-17] 예제 2-1의 실행 결과 – 서블릿 클래스의 소스 코드가 잘못되었을 때
2. 서블릿 클래스의 작성, 컴파일, 설치, 등록 서블릿 실행하기 서블릿 클래스의 소스 코드에서 잘못된 부분이 있다면 다음과 같은 에러 페이지가 나타 난다. [그림 2-17] 예제 2-1의 실행 결과 – 서블릿 클래스의 소스 코드가 잘못되었을 때

31 3. 톰캣 관리자 프로그램 사용하기 톰캣 관리자 프로그램의 사용 방법
톰캣의 아이디와 패스워드가 기억나지 않는다면 톰캣의 conf 디렉터리에 있는 tomcat- users.xml 파일을 열어서 확인한다.

32 response.setContentType( ”text/html;charset=euc-kr ”);
3. 톰캣 관리자 프로그램 사용하기 한글 HTML 문서를 출력하는 서블릿 클래스 한글이 포함된 HTML 문서를 출력하는 서블릿 클래스에 doGet, doPost 메서드의 두 번 째 피라미터인 HttpServletResponse 타입의 파라미터에 대해 setContentType이라는 메서 드를 호출하는 명령문으로 만들어야 한다. 이 명령문은 소스 코드 내에서의 위치도 아주 중요하고, HTML을 출력하는 print, println, printf 메서드 호출문보다 앞에 와야 함은 물론이고, response.getWriter 메서드의 호출문보다 먼저 와야 한다. response.setContentType( ”text/html;charset=euc-kr ”); 문서의 내용은 HTML 문법으로 작성된 텍스트 Euc-kr 문자셋(한글 코드)로 인코딩

33 3. 톰캣 관리자 프로그램 사용하기 한글 HTML 문서를 출력하는 서블릿 클래스
[예제2-2] 1부터 100까지 더하는 서블릿 클래스 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class HundredServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException int total = 0; for (int cnt = 1; cnt < 101; cnt++) total += cnt; response.setContentType( ”text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); out.println( ”<HTML> ”); out.println( ” <HEAD><TITLE>1부터 100까지 더하는 서블릿</TITLE></HEAD> ”); out.println( ”<BODY> ”); out.printf( ”1부터 100까지의 합은 = %d ”, total); out.println( ”</BODY> ”); out.println( ”</HTML> ”); }

34 [그림 2-21] 두 수의 합을 구하는 웹 애플리케이션의 화면 설계
4. 웹 브라우로부터 데이터 입력받기 웹 브라우저로부터 데이터를 입력받는 서블릿 클래스 왼쪽 웹 페이지를 통해 두 수를 입력받은 후 그 둘을 합한 결과를 오른쪽 웹 페이지를 통 해 보여주는 웹 애플리케이션이다. 둘 이상의 웹 페이지로 구성되는 웹 애플리케이션을 개발할 때는 먼저 화면 설계를 하고 다음에 화면의 URL을 정하고, 코딩 작업에 들어가는 것이 좋다. [그림 2-21] 두 수의 합을 구하는 웹 애플리케이션의 화면 설계 ① 두 수를 입력하고 더하기 버튼을 누르면 ②두 수의 합을 보여주는 웹 페이지가 나타난다.

35 4. 웹 브라우로부터 데이터 입력받기 웹 브라우저로부터 데이터를 입력받는 서블릿 클래스 URL 정하는 방법은 다음과 같다.
URL을 정한 후 왼쪽 화면 그림은 <FORM> 엘리먼트를 사용해서 구현하여야 한다. AdderInput.html이라는 이름으로 brain 웹 애플리케이션 디렉터리에 저장한다. [그림2-21] 왼쪽 화면 URL [그림2-21] 오른쪽 화면 URL [예제2-3] 두 개의 수를 입력받는 HTML 문서 <HTML> <HEAD> <META http-equiv= ”Content-Type ” content= ”text/html;charset=euc-kr ”> <TITLE>덧셈 프로그램 - 입력 화면</TITLE> </HEAD> <BODY> <FORM ACTION=/brain/adder> 첫 번째 수: <INPUT TYPE=TEXT NAME=NUM1><BR> 두 번째 수: <INPUT TYPE=TEXT NAME=NUM2><BR> <INPUT TYPE=SUBMIT VALUE= ’더하기 ’> </FORM> </BODY> </HTML>

36 String str = request.getParameter( ”NUM1 ”);
4. 웹 브라우로부터 데이터 입력받기 웹 브라우저로부터 데이터를 입력받는 서블릿 클래스 오른쪽 웹 페이지를 구현하는 서블릿 클래스는 [예제 2-3]을 통해 입력된 두 수를 받아 서 합을 계산한 후 HTML 문서로 만들어서 출력해야 한다. <FORM> 엘리먼트를 통해 입력된 데이터는 doGet, doPost 메서드의 첫 번째 파라미터 인 HttpServletRequest 타입의 파라미터에 대해 getParameter 메서드를 호출해서 가져올 수 있다. <INPUT> 엘리먼트를 통해 입력된 데이터를 가져오기 위해서는 다음 방법으로 메서드 를 호출해야 한다. 메서드가 리턴하는 값은 수치 타입이 아니라 문자열 타입이다. String str = request.getParameter( ”NUM1 ”); <INPUT> 엘리먼트의 NAME 애트리뷰트 값

37 int num = Integer.parseInt(str);
4. 웹 브라우로부터 데이터 입력받기 웹 브라우저로부터 데이터를 입력받는 서블릿 클래스 덧셈을 하기 위해서는 데이터를 수치 타입으로 변환해야 한다. 문자열을 int 타입으로 변환하기 위해서는 Integer 클래스의 parseInt 메서드를 이용하면 되고, double 타입으로 변환하기 위해서는 Double 클래스의 parseDouble 메서드를 이용 하면 된다. int num = Integer.parseInt(str); String 타입의 데이터를 int 타입으로 변환하는 메서드

38 4. 웹 브라우로부터 데이터 입력받기 웹 브라우저로부터 데이터를 입력받는 서블릿 클래스
[예제2-4] 두 수의 합을 구하는 서블릿 클래스 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class AdderServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String str1 = request.getParameter( ”NUM1 ”); String str2 = request.getParameter( ”NUM2 ”); int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2); int sum = num1 + num2; response.setContentType( ”text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); out.println( ”<HTML> ”); out.println( ”<HEAD><TITLE>덧셈 프로그램 - 결과 화면</TITLE></HEAD> ”); out.println( ”<BODY> ”); out.printf( ”%d + %d = %d ”, num1, num2, sum); out.println( ”</BODY> ”); out.println( ”</HTML> ”); }

39 [그림 2-22] 예제 2-4의 서블릿 클래스를 등록하는 방법
4. 웹 브라우로부터 데이터 입력받기 웹 브라우저로부터 데이터를 입력받는 서블릿 클래스 서블릿 클래스 컴파일 후 결과를 brain 웹 애플리케이션 디렉터리의 WEB-INF\classes 서 브디렉터리에 저장한다. WEB-INF 디렉터리에 있는 web.xml 파일을 열어서 다음과 같이 서블릿 클래스를 등록 한다. [예제2-4] 서블릿 클래스를 등록하는 코드 [그림 2-22] 예제 2-4의 서블릿 클래스를 등록하는 방법

40 4. 웹 브라우로부터 데이터 입력받기 웹 브라우저로부터 데이터를 입력받는 서블릿 클래스
두 수의 합을 구하는 웹 애플리케이션이 완성되면 다음과 같다. ① [예제 2-3]의 URL을 입력한다. ② 두 수를 입력하고 더하기 버튼을 누르면 결과 화면이 나온다. [그림 2-23] 예제 2-3, 예제 2-4의 실행 결과

41 [그림 2-24] 게시판 글쓰기 애플리케이션 화면 설계
4. 웹 브라우로부터 데이터 입력받기 POST 메서드를 이용한 데이터 전송 [그림 2-24]는 웹 페이지를 통해 입력 받은 데이터를 웹 서버쪽에 저장한 후 다른 웹 페 이지를 통해 결과를 보여주는 웹 애플리케이션이다. ① 이름, 제목, 내용을 입력하고 저장 버튼을 누르면 ② 데이터가 웹 서버 쪽에 저장되고 결과 화면이 나타난다. [그림 2-24] 게시판 글쓰기 애플리케이션 화면 설계

42 4. 웹 브라우로부터 데이터 입력받기 POST 메서드를 이용한 데이터 전송
URL 뒷부분에 붙은 입력 데이터가 전송 과정에서 잘려나갈 경우에는 URL이 아닌 별도 의 영역을 통해 입력 데이터를 전송해야 한다. <FORM> 엘리먼트의 시작 태그에 METHOD라는 애트리뷰트를 추가하고, 애트리뷰트 값으로 POST를 지정하면 된다. 입력 데이터가 URL이 아닌 별도의 영역을 통해 전송되도록 만드는 METHOD 애트리뷰트 값 <FORM ACTION =/brain/bbs-post METHOD=POST> 이름 : <INPUT TYPE=TEXT NAME=WRITER> 제목 : <INPUT TYPE=TEXT NAME=TITLE> <TEXTAREA NAME=CONTENT> </TEXTAREA> <INPUT TYPE=SUBMIT VALUE= ’저장 ’> <INPUT TYPE=RESET VALUE= ’취소 ’> </FORM>

43 [그림 2-25] POST 메서드를 이용한 데이터 전송
4. 웹 브라우로부터 데이터 입력받기 POST 메서드를 이용한 데이터 전송 <FORM> 엘리먼트를 통해 입력된 데이터는 URL 뒤에 오는 별도의 영역을 통해 전송될 것이며, URL 앞에는 POST라는 단어가 붙고, 웹 서버는 이 단어를 보고 입력 데이터가 어디에 있는지 판단할 수 있을 것이다. [그림 2-25] POST 메서드를 이용한 데이터 전송

44 4. 웹 브라우로부터 데이터 입력받기 POST 메서드를 이용한 데이터 전송
URL을 정한 후 URL에 해당하는 HTML 문서를 작성한다. [그림2-24] 왼쪽 화면 URL [그림2-24] 오른쪽 화면 URL [예제2-5] 게시판 글쓰기 기능의 데이터 입력을 위한 HTML 문서 <HTML> <HEAD> <META http-equiv= ”Content-Type ” content= ”text/html;charset=euc-kr ”> <TITLE>게시판 글쓰기 - 입력 화면</TITLE> </HEAD> <BODY> <H2>글쓰기</H2> <FORM ACTION=/brain/bbs-post METHOD=POST> 이름: <INPUT TYPE=TEXT NAME=NAME><BR> 제목: <INPUT TYPE=TEXT NAME=TITLE><BR> <TEXTAREA COLS=50 ROWS=5 NAME=CONTENT></TEXTAREA><BR> <INPUT TYPE=SUBMIT VALUE= ’저장 ’> <INPUT TYPE=RESET VALUE= ’취소 ’> </FORM> </BODY> </HTML>

45 4. 웹 브라우로부터 데이터 입력받기 POST 메서드를 이용한 데이터 전송
예제를 BBSInput.html로 저장 후 [예제 2-5]가 보낸 입력 데이터를 처리하는 서블릿 클 래스를 작성한다. doGet 메서드를 선언하는 대신 doPost 메서드를 선언하는데 웹 컨테이너는 POST라는 단어가 붙은 URL을 받으면 doGet 메서드가 아니라 doPost 메서드를 호출하기 때문이다 doPost 메서드 작성 방법은 doGet 메서드와 동일하며, public 키워드를 붙여서 선언해야 하고, 파라미터 변수, 리턴 타입, 익셉션 타입도 doGet 메서드와 동일하다. public class BBSPostServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } doGet 메서드와 리턴 타입, 파라미터 변수, 익셉션 타입이 동일합니다

46 4. 웹 브라우로부터 데이터 입력받기 POST 메서드를 이용한 데이터 전송
doPost 메서드 안에서 입력 데이터를 가져오는 방법과 HTML 문서를 출력하는 방법도 doGet 메서드의 경우와 동일하므로 입력된 게시글을 저정하는 서블릿 클래스는 다음과 같이 작성한다. [예제2-6] 게시판 글쓰기 기능을 처리하는 서블릿 클래스 - 미완성 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class BBSPostServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String name = request.getParameter( ”NAME ”); String title = request.getParameter( ”TITLE ”); String content = request.getParameter( ”CONTENT ”); response.setContentType( ”text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); out.println( ”<HTML> ”); out.println( ”<HEAD><TITLE>게시판 글쓰기 - 결과 화면</TITLE></HEAD> ”); out.println( ”<BODY> ”); out.printf( ”이름: %s <BR> ”, name); out.printf( ”제목: %s <BR> ”, title); out.println( ” <BR> ”); out.printf( ”<PRE>%s</PRE> ”, content); out.println( ”저장되었습니다. ”); out.println( ”</BODY> ”); out.println( ”</HTML> ”); }

47 request.setCharacterEncoding( ”euc-kr ”);
4. 웹 브라우로부터 데이터 입력받기 POST 메서드를 이용한 데이터 전송 한글 데이터를 입력했을 때 다음 그림과 같이 제대로 처리되지 않는 문제점이 나타난다. 오류는 doPost 메서드에서 한글 데이터를 올바르게 가져오려면 첫 번째 파라미터인 HttpServletRequest 파라미터에 대해 setCharacterEncoding 이라는 메서드를 호출해야 한다. [그림 2-26] 예제 2-5, 예제 2-6의 실행 결과 request.setCharacterEncoding( ”euc-kr ”); 한글 코드 입력

48 4. 웹 브라우로부터 데이터 입력받기 POST 메서드를 이용한 데이터 전송
setCharacterEncoding 메서드는 getParameter 메서드보다 반드시 먼저 호출해야 한다. [예제2-7] 게시판 글쓰기 기능을 처리하는 서블릿 클래스 - 완성 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class BBSPostServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { request.setCharacterEncoding( ”euc-kr ”); String name = request.getParameter( ”NAME ”); String title = request.getParameter( ”TITLE ”); String content = request.getParameter( ”CONTENT ”); response.setContentType( ”text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); out.println( ”<HTML> ”); out.println( ”<HEAD><TITLE>게시판 글쓰기 - 결과 화면</TITLE></HEAD> ”); out.println( ”<BODY> ”); out.printf( ”이름: %s <BR> ”, name); out.printf( ”제목: %s <BR> ”, title); out.println( ” <BR> ”); out.printf( ”<PRE>%s</PRE> ”, content); out.println( ”저장되었습니다. ”); out.println( ”</BODY> ”); out.println( ”</HTML> ”); }

49 4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기
<FORM> 엘리먼트를 이용하면 텍스트 상자 외에도 라디오 버튼, 체크 박스, 선택 상자 등 다양한 형태로 데이터를 입력 받을 수 있다. [그림 2-26] 예제 2-5, 예제 2-6의 실행 결과 [그림2-29] 왼쪽 화면 URL [그림2-29] 오른쪽 화면 URL

50 4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기
이름과 아이디 항목은 <INPUT> 엘리먼트의 TYPE 애트리뷰트 값을 TEXT로 지정해서 만들 수 있고, 패스워드 항목은 <INPUT> 엘리먼트의 TYPE 애트리뷰트 값을 PASSWORD로 지정해서 만든다. 패스워드는 PASSWORD 타입으로 입력한 문자가 모니터상에 나타나지 않는다. 성별 항목은 라디오 버튼으로 만들어야 하며 애트리뷰트 값을 RADIO로 지정해서 만들 수 있으며 엘리먼트에는 반드시 NAME 애트리뷰트와 VALUE 애티르뷰트를 써야한다. <INPUT TYPE=TEXT NAME=NAME> <INPUT TYPE=TEXT NAME=ID> <INPUT TYPE=PASSWORD NAME=PASSWORD> <INPUT TYPE=RADIO NAME=GENDER VALUE=MALE> <INPUT TYPE=RADIO NAME=GENDER VALUE=F > 똑같은 NAME 애트리뷰트 값 각각 다른 VALUE 애트리뷰트 값 한 항목을 선택하면 다른 항목의 선택이 해제됩니다.

51 4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기
메일 수신 여부를 체크하는 체크 박스를 만들고, 애트리뷰트 값을 CHECKBOX로 지정 해서 만들며 엘리먼트에도 NAME 애트리뷰트를 써야 하는데 라이오 버튼의 경우와 반 대로 다른 값을 지정해야 한다. 직업 선택은 선택 상자로 만들며, 선택 상자는 <SELECT> 엘리먼트를 이용해서 만들고 엘리먼트의 시작 태그와 끝 태그 사이에 선택 항목의 이름을 포함한 <OPTION> 서브 엘리먼트를 써야 한다. <INPUT TYPE=CHECKBOX NAME=INOTICE> <INPUT TYPE=CHECKBOX NAME=CNOTICE> <INPUT TYPE=CHECKBOX NAME=DNOTICE> 각각 다른 VALUE 애트리뷰트 값 한번 클릭하면 선택되고 또 한번 클릭하면 해제됩니다. <SELECT NAME=JOB> <OPTION>회사원</OPTION> <OPTION>학생</OPTION> <OPTION>기타</OPTION> </SELECT>

52 4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기 [예제2-8] 개인 정보를 입력받는 HTML 문서
<HEAD> <META http-equiv= ”Content-Type ” content= ”text/html;charset=euc-kr ”> <TITLE>개인 정보 입력 화면</TITLE> </HEAD> <BODY> <H2>개인 정보 입력</H2> <FORM ACTION=/brain/pinfo-result METHOD=GET> 이름: <INPUT TYPE=TEXT NAME=NAME><BR> 아이디: <INPUT TYPE=TEXT NAME=ID><BR> 패스워드: <INPUT TYPE=PASSWORD NAME=PASSWORD><BR><BR> 성별: 남<INPUT TYPE=RADIO NAME=GENDER VALUE=MALE> 여<INPUT TYPE=RADIO NAME=GENDER VALUE=F ><BR><BR> 메일 수신 여부: 공지 메일<INPUT TYPE=CHECKBOX NAME=INOTICE> 광고 메일<INPUT TYPE=CHECKBOX NAME=CNOTICE> 배송 확인 메일<INPUT TYPE=CHECKBOX NAME=DNOTICE><BR><BR> 직업: <SELECT NAME=JOB> <OPTION>회사원</OPTION> <OPTION>학생</OPTION> <OPTION>기타</OPTION> </SELECT><BR><BR> <INPUT TYPE=RESET VALUE= ”취소 ”> <INPUT TYPE=SUBMIT VALUE= ”확인 ”> </FORM> </BODY> </HTML>

53 4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기
예제를 톰캣의 webapps\brain 디렉터리에 PInfoInput.html 이름으로 저장하고 서블릿 클 래스를 작성한다. <INPUT> 엘리먼트의 TYPE 애트리뷰트 값이 TEXT일 경우와 PASSWORD일 경우 똑 같은 방법으로 입력 데이터를 가져올 수 있다. <INPUT TYPE=TEXT NAME=NAME> <INPUT TYPE=TEXT NAME=ID> <INPUT TYPE=PASSWORD NAME=PASSWORD> String name = request.getParameter( ”NAME ”); String id = request.getParameter( ”ID ”); String password = request.getParameter( ”PASSWORD ”); 텍스트 상자에 입력된 값 NAME 애트리뷰트 값

54 String gender = request.getParameter( ”GENDER ”);
4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기 라디오 버튼의 경우는 동일한 NAME 애트리뷰트 값을 갖는 모든 라디오 버튼에 대해 getParameter 메서드를 한 번만 호출해야 한다. 체크 박스의 경우 각각의 체크 박스에 대해 getParameter 메서드를 한 번씩 호출해야 한 다. <INPUT TYPE=RADIO NAME=GENDER VALUE=MALE> <INPUT TYPE=RADIO NAME=GENDER VALUE=F > String gender = request.getParameter( ”GENDER ”); 선택된 항목의 VALUE 애트리뷰트 값 NAME 애트리뷰트 값 <INPUT TYPE=CHECKBOX NAME=INOTICE> <INPUT TYPE=CHECKBOX NAME=CNOTICE> <INPUT TYPE=CHECKBOX NAME=DNOTICE> String iNotice = request.getParameter( ”INOTICE ”); String cNotice = request.getParameter( ”CNOTICE ”); String dNotice = request.getParameter( ”DNOTICE ”); On 또는 null NAME 애트리뷰트 값

55 4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기
선택 상자의 경우는 <SELECT> 엘리먼트의 NAME 애트리뷰트 값을 getParameter 메서 드에 넘겨줘야 한다. <SELECT NAME=JOB> <OPTION>회사원</OPTION> <OPTION>학생</OPTION> <OPTION>기타</OPTION> </SELECT> String job = request.getParameter( ”JOB ”); 선택된 항목의 <OPTION> 엘리먼트 내용 NAME 애트리뷰트 값

56 4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기
그림 2-29 오른쪽 화면을 구현하는 서블릿 클래스는 다음과 같이 작성한다. [예제2-8] 개인 정보를 입력받는 HTML 문서 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class PersonalInfoServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String name = request.getParameter( ”NAME ”); String id = request.getParameter( ”ID ”); String password = request.getParameter( ”PASSWORD ”); String gender = request.getParameter( ”GENDER ”); if (gender.equals( ”MALE ”)) gender = ”남 ”; else gender = ”여 ”; String iNotice = request.getParameter( ”INOTICE ”); String clNotice = request.getParameter( ”CNOTICE ”); String dNotice = request.getParameter( ”DNOTICE ”); String job = request.getParameter( ”JOB ”); response.setContentType( ”text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); out.println( ”<HTML> ”); out.println( ”<HEAD><TITLE>개인 정보 입력 - 결과 화면</TITLE></HEAD> ”); out.println( ”<BODY> ”); out.println( ”<H2>개인 정보 입력</H2> ”); out.printf( ”이름: %s <BR> ”, name); out.printf( ”아이디: %s <BR> ”, id); out.printf( ”암호: %s <BR> ”, password); out.printf( ”성별: %s <BR> ”, gender); out.printf( ”공지 메일: %s <BR> ”, noticeToHangul(iNotice)); out.printf( ”광고 메일: %s <BR> ”, noticeToHangul(clNotice)); out.printf( ”배송 확인 메일: %s <BR> ”, noticeToHangul(dNotice)); out.printf( ”직업: %s <BR> ”, job); out.println( ”</BODY> ”); out.println( ”</HTML> ”); } private String noticeToHangul(String notice) { if (notice == null) return ”받지 않음 ”; else if (notice.equals( ”on ”)) return ”받음 ”; else return notice;

57 4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기
서블릿 클래스를 컴파일해서 결과를 톰캣의 webapps\brain\WEB_INF\classes 디렉터리 에 저장한 후 WEB-INF 디렉터리의 web.xml 파일을 열어서 서클릿 클래스를 등록한다.

58 [그림 2-31] 예제 2-8, 2-9의 실행 결과 - 잘못된 결과
4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기 다음 그림과 같이 한글 문제가 생길 경우 톰캣의 conf 디렉터리로 가서 server.xml 파일 은 연후 <Connector> 엘리먼트가 있는데 그중에 port 애트리뷰트 값이 8080인 것을 찾 아 그 엘리먼트에 URIEncoding이라는 이름의 애트리뷰트를 추가하고 애트리뷰트 값으 로 euc-kr를 지정한다. [그림 2-31] 예제 2-8, 2-9의 실행 결과 - 잘못된 결과

59 [그림 2-32] <FORM> 엘리먼트의 GET 메서드로 한글을 입력받기 위해 해야 할 일
4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기 [그림 2-32] <FORM> 엘리먼트의 GET 메서드로 한글을 입력받기 위해 해야 할 일

60 [그림 2-33] 예제 2-8, 2-9의 실행 결과 - 올바른 결과
4. 웹 브라우로부터 데이터 입력받기 다양한 형태로 데이터 입력받기 수정한 server.xml 파일을 저장한 후에 톰캣을 재기동하면 변경된 내용이 다음과 같이 나 타난다. [그림 2-33] 예제 2-8, 2-9의 실행 결과 - 올바른 결과

61


Download ppt "2 서블릿의 기초."

Similar presentations


Ads by Google