서블릿의기초 Servlet & JSP
2/70 Contents 학습목표 서블릿클래스는자바클래스형태로구현되는웹애플리케이션프로그램이며, 일반적인자바클래스를작성할때보다지켜야할규칙이많다. 이장에서는그규칙들을배워보자. 내용 서블릿이란? 웹컨테이너란? 서블릿클래스의작성, 컴파일, 설치, 등록 톰캣관리자프로그램사용하기 웹브라우저로부터데이터입력받기
3/70 1. 서블릿이란? 서블릿이란서블릿클래스로부터만들어진객체 웹컨테이너는서블릿클래스를가지고서블릿객체를만든다음그객체를초기화해서웹서비스를할수있는상태로만드는데, 이작업을거친서블릿객체만서블릿이라고할수있음 인스턴스화 초기화 서블릿클래스서블릿객체서블릿 [ 그림 2-1] 서블릿클래스, 서블릿객체, 서블릿 인스턴스화 (instantiation) 란클래스를가지고객체를만드는행위 웹컨테이너는스레드를생성하여서블릿을실행 멀티스레드 (multithread) 란프로그램의실행흐름이여러갈래 (thread) 로나눠져서동시에실행되는것
4/70 1. 서블릿이란? 멀티스레드모델기반서블릿실행 장점 : 필요한서블릿의수가적기때문에서블릿을만들기위해필요한시스템자원과서블릿이차지하는메모리를절약할수있다. 단점 : 여러스레드가동시에한서블릿을사용하기때문에데이터공유문제에신경을써야한다. [ 그림 2-2] 멀티 - 스레드모델과싱글 - 스레드모델 싱글 - 스레드모델에서는데이터공유문제를걱정할필요가없지만시스템자원과메모 리가더많이소모된다.
5/70 1. 서블릿이란? 웹컨테이너 (Web Container) HTTP 요청에의한서블릿을실행시키며관리하는프로그램 서블릿에는 main 메소드가없다
6/70 1. 서블릿이란? 웹컨테이너의주요역할 통신지원 ( 웹서버 서블릿 ) 서블릿생명주기관리 멀티스레딩지원 보안관리 JSP 지원
7/70 1. 서블릿이란? 웹컨테이너의 HTTP 요청처리과정 (1)
8/70 1. 서블릿이란? 웹컨테이너의 HTTP 요청처리과정 (2)
9/70 1. 서블릿이란? 웹컨테이너의 HTTP 요청처리과정 (3)
10/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿구현및실행 서블릿클래스구현 서블릿클래스배포 서블릿클래스실행 서블릿클래스구현 서블릿클래스작성및컴파일 서블릿클래스배포 서블릿클래스설치및등록 서블릿클래스실행 웹컨테이너실행 웹브라우저에서의실행
11/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스의작성을위한준비 (1) 서블릿클래스를작성할때지켜야할규칙세가지 서블릿클래스는 javax.servlet.http.httpservlet 클래스를상속하도록만들어야한다 doget 또는 dopost 메서드안에웹브라우저로부터요청이왔을때해야할일을기술해야한다 HTML 문서는 doget, dopost 메서드의두번째파라미터를이용해서출력해야한다 구현 Servlet 인터페이스 GenericServlet 클래스 HttpServlet 클래스 상속 우리가작성한 서블릿클래스 [ 그림 2-3] 서블릿클래스의상속 / 구현관계
2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스의작성을위한준비 (2) [ 그림 2-4] Servlet 인터페이스와 GenericServlet, HttpServlet 클래스의 API 규격서 12/70
13/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스작성하기 (1) 서블릿클래스를작성할때지켜야할첫번째규칙 : javax.servlet.http.httpservlet 클래 스를상속받도록만들어야한다. 그리고 public 클래스로만들어야한다. public class HundredServlet extends HttpServlet { } 프로그래머가정한클래스이름 서블릿클래스의슈퍼클래스 서블릿클래스안에 doget 또는 dopost 메서드를오버라이드 (override) 한다 javax.servlet.http.httpservletrequest와 javax.servlet.http.httpservletresponse 타입의파라미터를받는다 예외처리를위해메서드밖으로 javax.servlet.servletexception과 java.io.ioexception을던질수있도록선언해야한다
2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스작성하기 (2) [ 그림 2-5] HttpServlet 클래스의 doget 메서드 14/70
15/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스작성하기 (3) doget 메서드를작성할때는다음과같은골격을만드는것으로시작한다. public class HundredServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { } } HttpServlet 클래스의 doget 메서드와리턴타입, 파라미터변수, 익셉션타입이동일해야한다. doget 메서드를 public으로선언해야하는이유는웹컨테이너가웹브라우저로부터요청을받아서메서드를호출할때필요하기때문이다. doget 메서드의 throws 절에있는 ServletException과 IOException이필요치않으면생략할수도있다. 하지만다른예외 (Exception) 을추가할수는없다.
16/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스작성하기 (4) doget 메서드의골격을만든다음에는안에내용을채워넣는다. 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; } } 1 부터 100 까지의합을구하는명령문 실행결과를출력하는코드는 doget 메서드의두번째파라미터를이용해서작성한다. 두번째파라미터는 javax.serlvet.http.httpservletresponse 인터페이스타입이며, 여기에 getwriter 라는메서드를호출해서 PrintWriter 객체를구한다. PrintWriter writer = response.getwriter(); PrintWriter 객체를리턴하는매서드
17/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스작성하기 (5) PrintWriter 는본래자바프로그램에서파일로텍스트를출력할때사용하는 java.io 패 키지의 PrintWriter 클래스이다. Response.getWriter 메서드가리턴하는 PrintWriter 객체는파일이아니라웹브라우저로 데이터를출력한다. writer.print( <HEAD> ); writer.println( <BODY> ); 웹브라우저로텍스트를출력하는메서드 writer.printf( TOTAL = %d, total);
18/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스작성하기 (6) 계산결과를웹브라우저로출력하는코드 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( 1 + 2 + 3 +... + 100 = %d, total); out.println( </BODY> ); out.println( </HTML> ); } } 계산결과를 HTML 로만들어서웹브라우저로출력하는명령문
19/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스작성하기 (7) 서블릿클래스가완성되었으면, 코드에서사용한여러가지클래스와인터페이스를가 져오는 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( 1 + 2 + 3 +... + 100 = %d, total); out.println( </BODY> ); out.println( </HTML> ); } }
2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스컴파일하기 (1) 서블릿클래스도자바클래스와마찬가지로 javac 명령을이용해서컴파일할수있다. [ 예제 2-1] 의소스코드를저장해놓는디렉터리로가서 javac 명령으로컴파일하면 처음에는다음과같은에러메시지가나온다. 소스코드가있는디렉터리로이동하는명령 서블릿클래스를컴파일하는명령 [ 그림 2-6] 아무옵션도사용하지않고서블릿클래스를컴파일했을때나오는에러메시지 20/70
2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스컴파일하기 (2) 에러메시지가나오는이유는 import한 javax.servlet과 javax.servlet.http 패키지가 JDK의표준라이브러리안에없기때문이다. 서블릿클래스를컴파일할때는 cp옵션을이용해서이두패키지가속하는라이브러리의경로명을명시해주어야한다. javax.servlet.http 패키지에속하는 HttpServlet 클래스의파일입니다 [ 그림 2-7] javax.servlet 과 javax.servlet.http 패키지가들어있는 servlet-api.jar 파일 21/70
22/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스컴파일하기 (3) 서블릿클래스를컴파일할때 cp 옵션으로 servlet-api.jar 파일경로명을지정하면컴파 일에러가발생하지않는다. [ 그림 2-8] 서블릿을컴파일하는방법 (1) 컴파일에실패한다면경로명을입력과정에서실수일수있다. 톰캣의 lib 서브디렉터리에있는 servlet-api.jar 파일을 JDK 설치디렉터리아래의 jre\lib\ext 서브디렉터리로복사한다. [ 그림 2-10] 서블릿을컴파일하는방법 (2)
2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스설치하기 (1) JSP 페이지와달리서블릿클래스는소스코드를설치할필요가없고, 컴파일결과물인클래스파일만설치하면된다. 2 예제서블릿의클래스파일들이저장되어있다. 1examples 웹애플리케이션디렉터리의 WEB-INF\classes 서브디렉터리로가보세요. [ 그림 2-11] 예제서블릿의클래스파일들이저장되어있는디렉터리 23/70
2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스설치하기 (2) 톰캣의 webapps\brain 디렉터리로가서 WEB-INF라는서브디렉터리를만들고, 그아래에 classes라는서브디렉터리를만든후, 컴파일결과물인 HundredServlet.class 파일을저장한다. 2[ 예제 2-1] 의컴파일결과를그디렉터리로복사한다 1 brain 웹애플리케이션디렉터리아래에 WEB-INF\classes 라는서브디렉터리를만든다. 24/70
25/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스등록하기 (1) 서블릿클래스는 JSP 페이지와달리설치뿐만아니라등록과정도필요하다. 웹애플리케이션의디플로이먼트디스크립터 (DD:Deployment Descriptor) 파일에등록해야한다. 웹애플리케이션의 DD파일란웹애플리케이션디렉터리의 WEB_INF 서브디렉터리아래있는 web.xml이라는이름의파일을말한다. 예 : 톰캣의 webapps\examples\ WEB_INF 디렉터리에있는 web.xml 파일 XML 파일이고, 텍스트에디터를이용해서열어볼수있다. 주의 : 톰캣에있는 web.xml 파일중에는 UNIX 포맷으로만들어진것도있는데, 이런파일은메모장으로열면줄바꿈표시가제대로되지않을수있다. 그럴때는메모장대신워드패드처럼기능이풍부한텍스트에디터를이용해서여는것이좋다.
26/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스등록하기 (2) 2 거기에있는 web.xml 파일을텍스트에디터로열어보세요 1 톰캣의 examples 웹애플리케이션의 WEB-INF 서브디렉터리로가세요.
27/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 알아두세요 (XML 문법의기초 ) XML은 HTML과마찬가지로텍스트내용에태그 ( 또는마크업 ) 를첨가하기위해사용되는문법이다. XML과 HTML의서로다른점은다음과같다. 첫째 : XML 문서의제일앞에는 XML 선언이올수있다. XML 선언은 XML 문서의작성에사용된 XML 규격서의버전, XML 문서를저장하는데사용된문자코드의인코딩방식을표시하는역할을한다. <?xml version= 1.0 encoding= ISO-8859-1?> XML 규격서의버전 문자셋의인코딩방식 단, XML 문서가 ASCII 문자로만구성되었을경우에는 XML 선언을생략할수도있다. 둘째 : HTML 에서는모든 HTML 문서의작성방법이동일하지만, XML 에서는 XML 문서의종 류에따라작성방법이달라질수있다.
28/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 알아두세요 (XML 문법의기초 ) 셋째 : HTML 에서는엘리먼트이름과애트리뷰트이름에있는대소문자를구분하지않지만 XML 에서는엄격하게구분한다. HTML 문서 XML 문서 <Body> <body> <servlet> <Servlet> 동일한태그입니다. 서로다른태그입니다. 넷째 : HTML 에서는단독으로사용되는태그가 < 로시작해서 > 로끝나야하지만, XML 에서는 < 로시작해서 /> 로끝나야한다. HTML 문서 <IMG src= /img/car.jpg > XML 문서 <role rolename= admin /> 시작표시 끝표시 시작표시 끝표시
29/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 알아두세요 (XML 문법의기초 ) 다섯째 : HTML 에서는애트리뷰트값을따옴표로묶지않고쓸수도있지만, XML 에서는반드시 따옴표로묶어서써야한다. HTML 문서 <IMG src=/img/car.jpg > XML 문서 <role rolename=admin /> 올바른문법 잘못된문법 여섯째 : HTML 에서는다소문법이맞지않는부분이있으면웹브라우저가이를보정해서처리 하지만, XML 에서는문법에조금이라도맞지않는부분이있으면 XML 문서전체가올바르게처 리되지않는다. HTML 문서 <H1> 회사개요 </H2> XML 문서 <servlet-name>myservlet</servlet-class> 짝이맞지않아도웹브라우저가보정해준다 짝이맞지않으면문서전체가올바르게처리되지않는다.
30/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스등록하기 (3) web.xml 파일은웹애플리케이션디렉터리마다하나씩만만들수있다. web.xml 파일을새로만들때는루트엘러민트인 <web.app> 을만드는일부터시작하는것이좋다. <web-app> </web-app> web.xml 파일의루트엘리먼트 웹서버가웹브라우저로부터 URL 을받았을때서블릿클래스를찾아서호출하기위해 필요한두정보는다음의두엘리먼트안에기록해야한다. <web-app> <servlet> </servlet> <servlet-mapping> </servlet-mapping> </web-app> 서블릿클래스의이름이들어갈부분 서블릿클래스를호출할때사용할 URL 이들어갈부분
31/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스등록하기 (4) <servlet-mapping> 엘리먼트안에는전체 URL 이아니라, 웹서버의도메인이름, 포트 번호, 웹어플리케이션디렉터리이름을제외한나머지부분만써야한다. 전제 URL http://localhost:8080/brain/hundred 서블릿의 URL 패턴 /hundred 웹서버의도메인이름 포트번호웹어프릴케이션디렉터리의이름 <web-app> <servlet> <servlet-class>hundredservlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/hundred</url-pattern> </servlet-mapping> </web-app> 서블릿클래스의이름 서블릿의 URL 패턴
32/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스등록하기 (5) 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> <servlet-name>hundred-servlet</servlet-name> <url-pattern>/hundred</url-pattern> </servlet-mapping> </web-app> 참조
33/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스등록하기 (6) 모든 web.xml 파일안에반드시써넣어야하는두가지정보 web.xml 파일의작성에사용된문법의식별자 <web-app xmlns= http://java.sun.com/xml/ns/javaee xmlns:xsi= http://www.w3.org/2001/xmlschema-instance xsi:schemalocation= http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd version= 2.5 > 그뮨법의버전
2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스등록하기 (7) <web-app> 엘리먼트의시작태그에다음과같은내용을추가하라. web.xml 파일의작성에사용된문법의식별자 그뮨법의버전 <web-app xmlns= http://java.sun.com/xml/ns/javaee version= 2.5 > <servlet> <servlet-name>hundred-servlet</servlet-name> <servlet-class>hundredservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hundred-servlet</servlet-name> <url-pattern>/hundred</url-pattern> </servlet-mapping> </web-app> 1 텍스트에디터로 web.xml 파일을작성하세요 2brain 웹애플리케이션디렉터리의 WEB-INF 서브디렉터리에저장하세요. [ 그림 2-14] 서블릿클래스를 web.xml 파일에등록하는방법 34/70
35/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스등록하기 (8) 서블릿클래스의이름 : 배포명, 실제클래스명, URL 이름
36/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스등록하기 (9) 세종류의서블릿클래스식별자사용 웹어플리케이션의유연성과보안성을향상 HTML 또는서블릿내에서블릿의실제경로와파일명을하드코딩하는경우에다음상황에어려움점을겪게된다. 1. 웹어플리케이션의배포디렉토리구조가변경되는경우 2. 웹어플리케이션의디렉토리구조및파일명을외부에드러내고싶지않은경우
37/70 2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿클래스등록하기 (10) DD 파일의이점 서블릿매핑, 보안역할설정, 오류페이지설정, 항목라이브러리, 초기화구성및관련정보설정등웹어플리케이션운영에필요한사항을설정 이미테스트된소스코드에대한수정을최소화 소스코드가없더라도어플리케이션을목적에맞게수정가능 코드변경이나컴파일을다시하지않아도서버자원을변경가능 접근제어목록, 보안역할등과같은보안에관련된업무도쉽게관리 프로그래머가아닌사람도웹어플리케이션배포하고설정변경이가능 작성한소스코드를수정하지않고도웹어플리케이션을수정할 ( 커스터마이징 ) 후있는 선언적메커니즘 을제공
2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿실행하기 웹브라우저를열고주소창에 http://localhost:8080/brain/hunderd라는 URL을입력했을때나오는 [ 예제 2-1] 의정상적인실행결과이다. [ 그림 2-15] 예제 2-1 의실행결과 성공적인결과 등록과정이잘못되었다면다음과같은에러페이지가나타난다. [ 그림 2-16] 예제 2-1 의실행결과 서블릿의등록이잘못되었을때 38/70
2. 서블릿클래스의작성, 컴파일, 설치, 등록 서블릿실행하기 서블릿클래스의소스코드에서잘못된부분이있다면다음과같은에러페이지가나타난다. [ 그림 2-17] 예제 2-1 의실행결과 서블릿클래스의소스코드가잘못되었을때 39/70
40/70 3. 톰캣관리자프로그램사용하기 톰캣관리자프로그램의사용방법 톰캣의아이디와패스워드가기억나지않는다면톰캣의 conf 디렉터리에있는 tomcat-users.xml 파일을열어서확인한다.
41/70 3. 톰캣관리자프로그램사용하기 한글 HTML 문서를출력하는서블릿클래스 한글이포함된 HTML 문서를출력하려면 doget, dopost 메서드의두번째파라미터인 HttpServletResponse 타입의파라미터에대해다음과같은메서드를호출해야한다. response.setcontenttype( text/html;charset=euc-kr ); 이문서의내용은 HTML 문법으로작성된텍스트이고 euc-kr 문자셋 ( 한글코드 ) 로인코딩되어있음 이명령문은 HTML 을출력하는 print, println, printf 메서드호출문보다앞에와야할 뿐만아니라, response.getwriter 메서드호출문보다도먼저와야한다.
42/70 3. 톰캣관리자프로그램사용하기 한글 HTML 문서를출력하는서블릿클래스 한글을포함한 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> ); } }
43/70 4. 웹브라우저로부터데이터입력받기 웹브라우저로부터데이터를입력받는서블릿클래스 왼쪽웹페이지를통해두수를입력받은후그둘을합한결과를오른쪽웹페이지를통 해보여주는웹애플리케이션이다. [ 그림 2-21] 두수의합을구하는웹애플리케이션의화면설계 1 두수를입력하고더하기버튼을누르면 2 두수의합을보여주는웹페이지가나타난다. 둘이상의웹페이지로구성되는웹애플리케이션을개발할때는먼저화면설계를하고 다음에각화면의 URL 을정하고, 코딩작업에들어가는것이좋다.
44/70 4. 웹브라우저로부터데이터입력받기 웹브라우저로부터데이터를입력받는서블릿클래스 각화면의 URL 은다음과같이정한다. http://localhost:8080/brain/adderinput.html http://localhost:8080/brain/adder [ 그림 2-21] 왼쪽화면 URL [ 그림 2-21] 오른쪽화면 URL 왼쪽화면은 <FORM> 엘리먼트를사용해서구현한다. [ 예제 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> 위문서를 AdderInput.html 이라는이름으로 brain 웹애플리케이션디렉터리에저장한다.
45/70 4. 웹브라우저로부터데이터입력받기 웹브라우저로부터데이터를입력받는서블릿클래스 오른쪽화면을구현하는서블릿클래스는 [ 예제 2-3] 을통해입력된두수를받아서합을계산한후 HTML 문서로만들어서출력해야한다. <FORM> 엘리먼트를통해입력된데이터는 doget, dopost 메서드의첫번째파라미터인 HttpServletRequest 타입의파라미터에대해 getparameter 메서드를호출해서가져올수있다. 각 <INPUT> 서브엘리먼트를통해입력된데이터를가져오기위해서는다음과같은메서드를호출해야한다. String str = request.getparameter( NUM1 ); <INPUT> 엘리먼트의 NAME 애트리뷰트값 이메서드가리턴하는값은수치타입이아니라문자열타입이다.
46/70 4. 웹브라우저로부터데이터입력받기 웹브라우저로부터데이터를입력받는서블릿클래스 덧셈을하기위해서는문자열데이터를수치타입으로변환해야한다. 문자열을 int 타입으로변환하기위해서는 Integer 클래스의 parseint 메서드를, double 타입으로변환하기위해서는 Double 클래스의 parsedouble 메서드를이용하면된다. int num = Integer.parseInt(str); String 타입의데이터를 int 타입으로변환하는메서드
47/70 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> ); } }
48/70 4. 웹브라우저로부터데이터입력받기 웹브라우저로부터데이터를입력받는서블릿클래스 서블릿클래스컴파일후그결과를 brain 웹애플리케이션디렉터리의 WEB-INF\classes 서브디렉터리에저장한다. WEB-INF 디렉터리에있는 web.xml 파일을열어서다음과같이서블릿클래스를등록한다. [ 예제 2-4] 서블릿클래스를등록하는코드 [ 그림 2-22] 예제 2-4 의서블릿클래스를등록하는방법
49/70 4. 웹브라우저로부터데이터입력받기 웹브라우저로부터데이터를입력받는서블릿클래스 두수의합을구하는웹애플리케이션의실행방법은다음과같다. 1 [ 예제 2-3] 의 URL 을입력한다. 2 두수를입력하고더하기버튼을누르면결과화면이나온다. [ 그림 2-23] 예제 2-3, 예제 2-4 의실행결과
50/70 4. 웹브라우저로부터데이터입력받기 POST 메서드를이용한데이터전송 웹페이지를통해입력받은데이터를웹서버쪽에저장한후에또다른웹페이지를통 해저장된결과를보여주는웹애플리케이션이다. 1 이름, 제목, 내용을입력하고저장버튼을누르면 2 데이터가웹서버쪽에저장되고결과화면이나타난다. [ 그림 2-24] 게시판글쓰기애플리케이션화면설계
51/70 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>
52/70 4. 웹브라우저로부터데이터입력받기 POST 메서드를이용한데이터전송 <FORM> 엘리먼트를통해입력된데이터는 URL 다음에오는별도의영역을통해전송되며, URL 앞에는 POST라는단어가붙는다. 웹서버는이단어를보고입력데이터가어디에있는지판단할수있다. [ 그림 2-25] POST 메서드를이용한데이터전송
4. 웹브라우저로부터데이터입력받기 POST 메서드를이용한데이터전송 URL 을정한후 URL 에해당하는 HTML 문서를작성한다. http://localhost:8080/brain/bbsinput.html http://localhost:8080/brain/bbs-post [ 그림 2-24] 왼쪽화면 URL [ 그림 2-24] 오른쪽화면 URL 첫번째화면을구현하는 HTML 문서 [ 예제 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> 이예제를톰캣의 webapps\brain 디렉터리에 BBSInput.html 라는이름으로저장한다. 53/70
54/70 4. 웹브라우저로부터데이터입력받기 POST 메서드를이용한데이터전송 입력데이터를처리하는서블릿클래스의작성방법 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 메서드와리턴타입, 파라미터변수, 익셉션타입이동일합니다 dopost 메서드안에서입력데이터를가져오는방법과 HTML 문서를출력하는방법도 doget 메 서드의경우와동일하다.
55/70 4. 웹브라우저로부터데이터입력받기 POST 메서드를이용한데이터전송 두번째화면을구현하는서블릿클래스 [ 예제 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( -----------<BR> ); out.println( 저장되었습니다. ); out.println( </BODY> ); out.println( </HTML> ); } }
56/70 4. 웹브라우저로부터데이터입력받기 POST 메서드를이용한데이터전송 위예제는다음과같이한글데이터의입력처리가제대로되지않는다. [ 그림 2-26] 예제 2-5, 예제 2-6 의실행결과 문제해결 : dopost 메서드안에서한글데이터를올바르게가져오려면첫번째파라미터인 HttpServletRequest 파라미터에대해 setcharacterencoding 이라는메서드를호출해야한다. request.setcharacterencoding( euc-kr ); 한글코드이름
57/70 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( -----------<BR> ); out.println( 저장되었습니다. ); out.println( </BODY> ); out.println( </HTML> ); } }
58/70 4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 <FORM> 엘리먼트를이용하면텍스트상자외에도라디오버튼, 체크박스, 선택상자 등다양한형태로데이터를입력받을수있다. [ 그림 2-29] 개인정보입력애플리케이션의화면설계 http://localhost:8080/brain/pinfoinput.html http://localhost:8080/brain/pinfo-result [ 그림 2-29] 왼쪽화면 URL [ 그림 2-29] 오른쪽화면 URL
59/70 4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 이름, 아이디항목은 <INPUT> 엘리먼트의 TYPE 애트리뷰트값을 TEXT로지정해서만들수있다. 패스워드는 <INPUT> 엘리먼트의 TYPE 애트리뷰트값을 PASSWORD로지정해서만든다. <INPUT TYPE=TEXT NAME=NAME> <INPUT TYPE=TEXT NAME=ID> <INPUT TYPE=PASSWORD NAME=PASSWORD> PASSWORD 타입으로입력한문자는모니터상에나타나지않는다. 성별항목은라디오버튼으로만들어야한다. 라디오버튼은 <INPUT> 엘리먼트의 TYPE 애트리뷰트값을 RADIO로지정해서만들수있으며, 반드시 NAME, VALUE 애트리뷰트를써야한다. <INPUT TYPE=RADIO NAME=GENDER VALUE=MALE> <INPUT TYPE=RADIO NAME=GENDER VALUE=FEMAIL> 똑같은 NAME 애트리뷰트값 각각다른 VALUE 애트리뷰트값 한항목을선택하면다른항목의선택이해제된다.
60/70 4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 메일수신여부항목은체크박스로만들어야한다. 체크박스는 <INPUT> 엘리먼트의애트리뷰트값을 CHECKBOX로지정해서만들수있으며, NAME 애트리뷰트를써야한다. NAME 애트리뷰트에는각각다른값을지정해야한다. <INPUT TYPE=CHECKBOX NAME=INOTICE> <INPUT TYPE=CHECKBOX NAME=CNOTICE> <INPUT TYPE=CHECKBOX NAME=DNOTICE> 각각다른 VALUE 애트리뷰트값 한번클릭하면선택되고또한번클릭하면해제된다. 직업항목은선택상자로만들어야한다. 선택상자는 <SELECT> 엘리먼트를이용해서 만들수있고, 이엘리먼트의시작태그와끝태그사이에선택항목의이름을포함한 <OPTION> 서브엘리먼트들을써야한다. <SELECT NAME=JOB> <OPTION> 회사원 </OPTION> <OPTION> 학생 </OPTION> <OPTION> 기타 </OPTION> </SELECT>
4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 [ 예제 2-8] 개인정보를입력받는 HTML 문서 <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=FEMAIL><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> 이예제를톰캣의 webapps\brain 디렉터리에 PInfoInput.html 라는이름으로저장한다. 61/70
62/70 4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 서블릿클래스의작성방법 <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 애트리뷰트값
4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 라디오버튼의경우동일한 NAME 애트리뷰트값을갖는모든라디오버튼에대해 getparameter 메서드를한번만호출해야한다. <INPUT TYPE=RADIO NAME=GENDER VALUE=MALE> <INPUT TYPE=RADIO NAME=GENDER VALUE=FEMAIL> String gender = request.getparameter( GENDER ); 선택된항목의 VALUE 애트리뷰트값 NAME 애트리뷰트값 체크박스의경우각각의체크박스에대해 getparameter 메서드를한번씩호출해야한다. <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 애트리뷰트값 63/70
64/70 4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 선택상자의경우 <SELECT> 엘리먼트의 NAME 애트리뷰트값을 getparameter 메서드 에넘겨줘야한다. <SELECT NAME=JOB> <OPTION> 회사원 </OPTION> <OPTION> 학생 </OPTION> <OPTION> 기타 </OPTION> </SELECT> String job = request.getparameter( JOB ); 선택된항목의 <OPTION> 엘리먼트내용 NAME 애트리뷰트값
65/70 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; } }
66/70 4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 서블릿클래스를컴파일해서결과를톰캣의 webapps\brain\web_inf\classes 디렉터리 에저장한후, WEB-INF 디렉터리의 web.xml 파일을열어서서클릿클래스를등록한다.
67/70 4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 다음그림과같이한글문제가생길경우 [ 그림 2-31] 예제 2-8, 2-9 의실행결과 - 잘못된결과 해결방법 : 톰캣의 conf 디렉터리에있는 server.xml 파일은열면 <Connector> 엘리먼트가있는 데, 그중 port 애트리뷰트값이 8080 인것을찾아서그엘리먼트에 URIEncoding 이라는이름의 애트리뷰트를추가하고애트리뷰트값으로 euc-kr 를지정한다.
68/70 4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 [ 그림 2-32] <FORM> 엘리먼트의 GET 메서드로한글을입력받기위해해야할일
69/70 4. 웹브라우저로부터데이터입력받기 다양한형태로데이터입력받기 server.xml 파일을수정해서저장하고, 톰캣을재기동한다음예제를다시실행했을때의 결과 [ 그림 2-33] 예제 2-8, 2-9 의실행결과 - 올바른결과
Servlet & JSP