Presentation is loading. Please wait.

Presentation is loading. Please wait.

자바 서버 API와 서블릿 데이타베이스 실험실 이찬섭, 박용문.

Similar presentations


Presentation on theme: "자바 서버 API와 서블릿 데이타베이스 실험실 이찬섭, 박용문."— Presentation transcript:

1 자바 서버 API와 서블릿 데이타베이스 실험실 이찬섭, 박용문

2 목차 자바 서버 API란 무엇인가? 서블릿 작성하기 java.servlet 패키지 java.servlet.http 패키지
Database Lab. Lee Chan-Seob

3 자바 서버 API란 무엇인가? (1/2) 배경 자바 서버 API 서블릿(Servlet)
HTML, CGI, Applet, Fast CGI, 서버 API, 서블릿 넷스케이프 서버 API(Netscape Server API : NSAPI) 인터넷 인포메이션 서버 API(Internet Information Server API : ISAPI) 자바 서버 API IP서버, 특히 http서버를 개발할 때 사용하는 클래스의 집합 API = Core API + 표준확장 API 서블릿(Servlet) Server-Side Java Applet 자바 서버내에서 서버를 제어 HTTP를 통한 웹 클라이언트의 요청, 해당 작업, 결과 반환 Core API : 모든 자바 플렛폼의 구현에 포함되는 API 서블릿 자체는 형태가 없고, 그래픽 인터페이스가 없으며, 출력을 내보낼 수 있는 출력 스트림도 없다. 서블릿은 프로그램이기 때문에 동적으로 데이터를 생성할 수 있다. (날짜 시간에 따른 페이지 요구와 같은 경우) Database Lab. Lee Chan-Seob

4 자바 서버 API란 무엇인가? (2/2) 서블릿과 CGI 비교 서블릿 실행 요청방법 Jeeves 생략(p.450~451)
클라이언트 요청, 처리후 백그라운드 프로세스로 실행 클라이언트에 있는 애플릿과 직접 통신 가능 클라이언트에서 만들어 질 수 있음 에이전트에 가까움 서블릿 실행 요청방법 서버가 어떤 URL을 미리 정의된 서블릿의 위치와 매핑시키는 것. 즉, 에 있는 파일 요청시 서버는 매핑된 서블릿 실행함 서블릿 자신의 URL을 사용해서 서블릿을 요청. 즉, 처럼 사용 HTML 파일에 <servlet> 태그 삽입 Jeeves 생략(p.450~451) 서블릿과 CGI 비교 클라이언트 요청, 처리후 백그라운드 프로세스로 실행 서버상에서 CGI 프로그램을 작동시키는데 드는 오버헤드 감소 새로운 프로세스 생성이 아니라 쓰레드 사용 다중 사용자 게임 서버의 역할도 가능 클라이언트에 있는 애플릿과 직접 통신 가능 CGI 프로그램은 전송 요청후 접속을 끊는 방식 클라이언트에서 만들어 질 수 있음 클라이언트에서 만들어 서버에 업로드하여 이용가능 에이전트에 가까움 Jeeves는 sun이 서블릿의 능력을 보여주기 위해 시범적으로 만든 HTTP 서버 정적인 문서, 서블릿 시동, HTML에 삽입된 서블릿 시동, CGI 프로그램 시동, 웹마스터의 서버관리등 Database Lab. Lee Chan-Seob

5 서블릿을 위한 환경설정 웹서버(윈도우 NT 서버 4.0상의 IIS)
JDK + JSDK2.1(Java Servlet Development Kit) startserver.bat: 서블릿을 실행시켜 주기 위한 자바 서버 작동 stopserver.bat: 자바 서버 정지 자바서버 작동 후 테스트 서블릿과 CGI 비교 클라이언트 요청, 처리후 백그라운드 프로세스로 실행 서버상에서 CGI 프로그램을 작동시키는데 드는 오버헤드 감소 새로운 프로세스 생성이 아니라 쓰레드 사용 다중 사용자 게임 서버의 역할도 가능 클라이언트에 있는 애플릿과 직접 통신 가능 CGI 프로그램은 전송 요청후 접속을 끊는 방식 클라이언트에서 만들어 질 수 있음 클라이언트에서 만들어 서버에 업로드하여 이용가능 에이전트에 가까움 Database Lab. Lee Chan-Seob

6 서블릿 작성하기 서블릿 구현방법 서버와 서블릿과의 통신 java.servlet.http.HttpServlet
HTTP 서버에 의해서 실행이 되고, HTTP 요청의 MIME헤더를 읽을 수 있는 클래스 java.servlet.GenericServlet HTTP 서버가 제공하는 특별한 기능을 필요로 하지 않는 서블릿을 위한 것 서버와 서블릿과의 통신 Servlet 인터페이스의 메쏘드를 호출하여 통신 사용되는 메쏘드 Init(), ServletRequest, ServletResponse, service(), destroy() 서버는 요청된 서블릿의 바이트 코드를 적재한다. 서버는 서블릿 객체의 인스턴스를 생성한다. 서버는 서블릿의 init() 메쏘드를 호출한다. 서버는 클라이언트의 요청 데이터를 이용해서, ServletRequest인터페이스를 구현하는 request객체를 생성한다. 서버는 ServletResponse 인터페이스를 구현하는 response객체를 생성한다. 서버는 서블릿의 service(request, response) 메쏘드를 호출한다. Service() 메쏘드는 요청을 처리한 후, 데이터를 클라이언트에게 돌려보내기 위해 response의 메쏘드를 호출한다. 클라이언트로부터의 요청이 없으면, 4단계로 되돌아 간다. 서버가 더 이상 서블릿을 필요로 하지 않으면, 서블릿의 destroy() 메쏘드를 호출한다. 반복 Database Lab. Lee Chan-Seob

7 Hello World 서블릿 Import javax.Servlet.*; Import java.io.*;
Public class HelloWorldServlet extends GenericServlet { static String helloString = “Hello, world\r\n”; public void service(servletRequest request, ServletResponse response) { response.setContentLength(helloString.length()); response.setContentType(“text/plain”); try{ PrintStream rs = new PrintStream(response.getOutputStream()); rs.print(helloString); } catch (IOException e) { 작성된 서블릿 모듈(.class file)을 호출하는 방법에는 여러가지가 있는데요, 우선 url 로 바로 호출하는 방법 (예 HTML 의 Form tag 를 이용하는 방법 (예 <Form method=GET action=" ... SSI 를 이용하여 SHTML 내에 servlet tag 를 사용해 호출하는 방법 (예 <SERVLET code=ExampleServlet> </SERVLET> .... HelloWorldServlet은 GenericServlet을 확장했음을 알 수 있다. helloString은 클라이언트에 보낼 Hello, world 데이터를 저장할 변수이고 빨간색의 service 메쏘드는 request 파라메터를 읽고, response 파라메터를 통해 응답하는데 먼저, 헤더의 Content-Length필드에 helloString의 길이를 넣기 위해 setContentLength()를 호출 Content-Type필드를 text/plain으로 채우기 위해 setContentType()을 호출하며 Service() 메쏘드는 response객체로부터 OutputStream을 얻어서 이를 PrintStream에 연결시키고 PrintStream은 데이터를 클라이언트에게 보내기 위해 사용된다. 매핑부분 생략함. Database Lab. Lee Chan-Seob

8 서버측 포함과 서블릿 사용하기 Database Lab. Lee Chan-Seob import javax.servlet.*;
import java.io.*; import java.util.Hashtable; import java.util.Date; public class CounterServlet extends GenericServlet { static int count = 0; static Date start = new Date(); public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { int temp; response.setContentType("text/plain"); PrintStream ps = new PrintStream(response.getOutputStream()); synchronized (this) { temp = count++; } ps.println("This servlet has been accessed " +temp + " times since " + start); <html> <head> <title>Server Side Include Example</title> </head> <body> <h1>Server Side Include Example</h1> This page has been accessed <servlet name="CounterServlet" code="CounterServlet"> </servlet> </body> </html> * .shtml로 저장해야 함 서블릿 SSI는 클라이언트가 서블릿을 호출하여 실행되는 것과는 달리 Html문서에 포함되어 클라이언트로 전송되는 html 문서가 웹 므라우저로 로드되었을 때 서블릿이 자동으로 실행되는 것이다.  html 문서에 서블잇이 포함되어 있다면 HTML의 문서이름은 .shtml로 작성되어야 한다. SSI를 위한 프로그램 필요할 것 같음. Database Lab. Lee Chan-Seob

9 java.servlet 패키지 구성 세 개의 클래스 다섯 개의 인터페이스 하나의 예외
GenericServlet, ServletInputStream, ServletOutputStream 다섯 개의 인터페이스 Servlet, ServletResponse, ServletRequest, ServletContext, ServletStub 하나의 예외 ServletException GenericServlet을 확장하여 서블릿 구현 Servlet인터페이스는 init(), service(), destroy() 메쏘드를 갖고 Service는 init()후 서블릿 요청에 사용되며 두개의 인자(파라메터)가 service() 메쏘드로 전달되는데 첫째는 ServletRequest객체로서 ServletRequest인터페이스를 구현하고 ….한다. ServletContext인터페이스는 서블릿으로 하여금 자신이 어떤 환경에서 실행되고 있으며 어떠한 작업이 가능한지 알수 있게 하고 ServletStub인터페이스는 서블릿 로더를 생성하는데 사용되는데 서블릿만 만들고자 한다면 사용할 필요가 없다.(서블릿 지원 서버를 만들 때 사용) Database Lab. Lee Chan-Seob

10 ServletRequest (1/3) Public abstract string getProtocol()
프로토콜과 버전을 반환 Public abstract int getContentLength() 폼데이터를 POST방식으로 전송하는 경우 컨텐트의 길이 정보도 보내야 하는데 이 때, 이 메쏘드는 컨텐트의 길이를 반환 Public abstract string getContentType() 요청에 데이터 포함시 클라이언트는 데이터의 MIME유형을 알려야 하며 이 때, 이 메쏘드는 MIME유형을 문자열로 반환 Public abstract string getServerName() URL의 호스트 이름 부분에 나타난 정보를 이용해 서버의 호스트 이름을 반환 환경변수의 값을 요청할 수 있는 메쏘드들이 포함 서블릿이 환경 변수의 값을 읽을 수 있도록 메쏘드들을 추가해야 함 서블릿은 ServletRequest객체에 대해 값을 설정하지는 않고 그 값들을 읽기만 함 getContentLength()의 경우 Content-length 헤더가 없거나 GET방식인 경우 –1을 반환 getContentType()의 경우 Content-length 헤더가 없거나 GET방식인 경우 null을 반환 Database Lab. Lee Chan-Seob

11 ServletRequest (2/3) Public abstract int getServerPort()
요청이 접수되는 포트 번호를 반환 Public abstract String getRemoteAddr() 요청을 보낸 클라이언트의 수치형 IP 주소를 반환 Public abstract String getRemoteHost() 요청을 보낸 클라이언트의 호스트 이름을 반환 Public abstract InputStream getInputStream() POST, GET방식의 요청시 전송된 데이터를 읽기 위해 사용되는 InputStream을 반환 Public abstract String getParameter(String name) <PARAM> 태그에서 이름이 name인 파라미터의 값을 String으로 반환 Database Lab. Lee Chan-Seob

12 ServletRequest (3/3) Public abstract Hashtable getParameters()
<PARAM> 태그 안에 들어 있는 모든 파라미터 정보를 담고 있는 Hashtable을 반환 Database Lab. Lee Chan-Seob

13 ServletResponse Public abstract void setContentLength(int length)
컨텐트의 길이를 응답의 일부분으로 포함시킴 Public abstract void setContentType(StringMIMEtype) 응답에 컨텐트 유형 MIME 헤더를 포함시킴 Public abstract OutputStream getOutputStream() 실제 데이터를 응답에 포함시키기 위해 사용할 OutputStream을 반환 클라이언트에게 보내는 응답을 만들기 위해 사용 대개의 경우 MIME유형이 제공되고, 컨텐트의 길이 정보가 뒤를 따르며, 그 다음에 실제 데이터가 온다. 실제 데이터는 response객체로 부터 얻은 OutputStream을 사용한다. Database Lab. Lee Chan-Seob

14 GenericServlet (1/2) Public GenericServlet()
거의 사용되지 않으며 서브클래스의 생성자 Public String getInitParameter(String name) 서블릿의 특정한 초기화 파라미터의 값을 이름으로 찾음 Public Hashtable getInitParameters() <SERVLET> 태그 안에 있는 모든 초기화 파라미터의 정보를 담고 있는 Hashtable을 반환 Public void log(String msg) 특정한 메시지 문자열을 이벤트 로그 파일에 기록 Public String getServletInfo() 서블릿의 서브 클래스가 이 메쏘드를 치환해서 이름, 서블릿의 버전, 저작권 정보를 반환하도록 해야 함. 서블릿 인터페이스를 구현하기 위해 간편하게 사용할 수 있는 수퍼 클래스 GenericServlet은 서버에 의해 인스턴스를 생성시 사용. Database Lab. Lee Chan-Seob

15 GenericServlet (2/2) Public void init()
처음으로 서블릿을 적재할 때 호출 Public void service(ServletRequest request, ServletResponse response) throws Exception 요청에 대해 검토와 응답을 만드는 메쏘드 Public void destroy() 서블릿을 파괴하고, 할당받았던 자원들을 버릴 때 사용 Public final void setStub(ServletStuv stub) 서버 작성시 사용 Public ServletContext getServletContext() 서블릿이 실행되고 있는 환경에 대한 정보제공 및 제어 setStub() – 서블릿을 적재하고 실행시키는 시스템은 ServletStub 를 설정하기 위해 이 메쏘드를 호출하며 구현에 특정한 값들을 얻기 위해 getServletContext()와 getInitParameter()를 제공하고 서블릿을 사용할 때는 사용안함. Database Lab. Lee Chan-Seob

16 ServletContext (1/2) Public abstract Servlet getServlet(String name)
이름으로 서블릿을 찾음 Public abstract Enumeration getServlets() 현재 ServletContext가 접근할 수 있는 서블릿들의 Enumeration을 반환 Public abstract void log(Servlet s, String message) 어떤 서블릿의 로그 파일에 임의의 문자열 message를 기록 Public abstract String getServerInfo() 서버의 이름과 버전을 포함하는 String을 반환 Public abstract String getRealPath(String path) URL에 나타난 사실상의 경로를 취하여 호스트 시스템에서 사용되는 절대 경로를 반환 서블릿으로 하여금 자신이 실행되고 있는 서버의 환경에 대한 정보를 얻을 수 있도록 해줌 getServlet은 찾지 못하면 null 값을 반환 Database Lab. Lee Chan-Seob

17 ServletContext (2/2) Public abstract String getMimeType(String Filename) 요청된 파일의 MIME 유형을 String으로 반환 Database Lab. Lee Chan-Seob

18 ServletStub Public abstract ServletContext getServletContext()
Public abstract String getInitParameter(String name) 이름으로 초기화 파라미터의 값을 요청 Public abstractHashtable getInitParameters() 초기화 파라미터를 모두 담고 있는 Hashtable을 반환 서버의 일부분인 서블릿 로더에 의해서 사용되므로 서버를 만들 때에만 고려되고, 서블릿을 만들 때는 몰라도 됨 getInitParameter는 초기화 값이 없으면 null값을 반환 getInitParameters()는 서블릿이 작성될 때에는 알지 못했던 초기화 파라미터들을 알 수 있다. Database Lab. Lee Chan-Seob

19 java.servlet.http 패키지 서버에서만 실행되는 서블릿을 작성하기 위한 클래스와 인터페이스만 들어 있음 구성
세 개의 클래스 HttpServlet, FormServlet, HttpUtils 두 개의 인터페이스 HttpServletRequest, HttpServletResponse HTTP에서만 실행되는 서블릿을 작성하기 위한 클래스와 인터페이스들이 들어 있다. HttpServletRequest는 웹 브라우저로부터 HTTP에 대한 요청을 나타내는 java.servlet.ServletRequest의 서브 인터페이스 HttpServletResponse는 HTTP서버로 부터 웹 브라우저에 대한 응답을 나타내는 java.servelt.ServletResponse의 서버 인터페이스 HttpServlet은 HTTP 요청과 응답을 위한 GenericServlet의 서브 클래스 FormServlet은 폼에의 입력을 처리하기 위한 HttpServlet의 서브 클래스 HttpUtils는 HTTP와 작동하는 서블릿을 위한 유틸리티 메쏘드를 제공 Database Lab. Lee Chan-Seob

20 HttpServletRequest (1/3)
Public abstract String getMethod() 요청을 받는 HTTP 방식을 반환 Public abstract String getRequestURI() 요청된 자원의 URI를 반환 Public abstract String getServletPath() 요청된 URI의 경로 부분을 반환 Public abstract String getPathInfo() 추가적인 경로 정보를 반환(서블릿 경로와 요청 URI) Public abstract String getPathTranslated() 추가적인 경로 정보를 반환(서버의 파일 시스템상에 있는 실제 경로 반환 웹 브라우저가 웹 서버에게 보내는 요청을 추상화 한것 요청자체/MIME헤더/포트번호, 서버이름, 원격호스트, 인증 유형등의 환경변수 getMethod()의 결과는 get, head, post, put 또는 맞춤형방식등 getRequestURI()에서 URI가 사실 정의되어 있지 않으므로 요청된 자원에 대한 상대 URL임. getPathInfo()는 서블릿의 URI에 요청된 URI의 차이부분만 반환. 없으면 null값. Database Lab. Lee Chan-Seob

21 HttpServletRequest (2/3)
Public abstract String getQueryString() URL에서 ?뒤에 오는 질의 문자열을 반환 Public abstract String getQueryParameter(String name) 질의 문자열 내의 특정한 파라미터의 값을 이름으로 요청하며 반환되는 값은 String (예제 P.470) Public abstract Hashtable getQueryParameter() URL의 질의 문자열 모든 부분을 반환 Public abstract String getHeader(String name) 인자로 넘겨진 name이라는 헤더의 필드값을 구함 Public abstract String int getIntHeader(String name, int default) 숫자 값을 갖는 헤더의 필드 값을 읽음 Database Lab. Lee Chan-Seob

22 HttpServletRequest (예제)
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HelloNameServlet extends HttpServlet { public void service(ServletRequest request, ServletResponse response) { service((HttpServletRequest) request, (HttpServletResponse) response); } public void service(HttpServletRequest request, HttpServletResponse response) { String msg = "<HTML><BODY>"; String name = request.getParameter("firstname"); if(name != null){ msg = ("Hello " + name); else{ msg += "Hello whoever you are. "; Database Lab. Lee Chan-Seob

23 HttpServletRequest (예제)
msg += "</BODY></HTML>"; response.setContentLength(msg.length()); response.setContentType("text/html"); try { PrintStream rs = new PrintStream(response.getOutputStream()); rs.print(msg); } catch (IOException e) { Database Lab. Lee Chan-Seob

24 HttpServletRequest (3/3)
Public abstract long getDateHeader(String name, long default) 날짜로 된 필드 값을 읽음 Public abstract String getHeaderNames(int n) n번째 MIME 헤더의 이름을 반환 Public abstract String getHeader(int n) n번째 MIME헤더의 값을 String으로 반환 Public abstract String getRemoteUser() 웹 브라우저가 MIME 헤더에 사용자의 이름을 전송하는 경우 이 사용자의 이름을 반환 Public abstract String getAuthType() 요청이 인증을 필요로 하면 인증 유형을 반환 Database Lab. Lee Chan-Seob

25 HttpServletResponse Http response codes
Response.setStatus() 메쏘드를 사용해 응답의 헤더에 포함시킴 서버응답코드(P.473~475) Public abstract void setStatus(int code) HTTP 응답의 상태 코드를 설정(수치형 코드를 사용) Public abstract void setStatus(int code, String msg) HTTP 응답의 상태 코드를 설정(수치형 코드+프로그래머의 메시지 포함) Public abstract void setContentLength(int length) Content-Length MIME 헤더를 응답에 포함 Public abstract void setContentType(String MIMEtype) Content-Length MIME 헤더를 응답에 포함(유형을 포함하는 String과 함께) 클라이언트에 응답을 하기 위해 사용, 응답을 만들기 위해 MIME 헤더를 만들고 HTTP상태코드를 추가하고 실제 데이터를 전송한다. Database Lab. Lee Chan-Seob

26 HttpServletResponse Public abstract void setHeader(String name, String value) 임의의 헤더를 설정 Public abstract void setIntHeader(String name, int value) 정수값을 갖는 임의의 헤더 필드를 설정 Public abstract void sendError(int code) throws IOException 상태코드를 설정한 후, HTTP 응답을 클라이언트에게 전송 Public abstract void sendError(int code, String message) throws IOException sendError()와 같으며, 코드에 대해 프로그래머가 설정한 메시지 포함 Database Lab. Lee Chan-Seob

27 HttpServletResponse (Cont’d)
Public abstract void sendRedirect(String url) throws IOException 지정된 URL로 방향 재지정하는 응답을 클라이언트에게 보냄 Database Lab. Lee Chan-Seob

28 HttpUtils parseQuery()
전형적인 CGI 문자열을 넘겨 받으며 Hashtable에 저장되어 Hashtable의 키로 사용됨 Database Lab. Lee Chan-Seob

29 A Form Echoing Servlet Database Lab. Lee Chan-Seob
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class EchoFormServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) { String msg = "<HTML><HEAD><TITLE>\r\n"; msg += "Form Response</TITLE></HEAD><BODY><H1>Form Response</H1>\r\n"; msg += "Method: " + request.getMethod() + "<br>\r\n"; msg += "URI: " + request.getRequestURI() + "<br>\r\n"; msg += "Protocol: " + request.getProtocol() + "<br>\r\n"; msg += "Path Info: " + request.getPathInfo() + "<br>\r\n"; Enumeration e = request.getHeaderNames(); while(e.hasMoreElements()) { String header = (String) e.nextElement(); msg += header + ":" + request.getHeader(header) + "<br>\r\n"; } 상당히 복잡한 데이터 처리를 할 수 있으며 들어온 데이터를 그대로 다시 HTML에 쓰고 있다. Database Lab. Lee Chan-Seob

30 A Form Echoing Servlet Database Lab. Lee Chan-Seob msg += "<P>";
String qs = " "; if(request.getMethod().equals("GET")) { qs = request.getQueryString(); } else if(request.getMethod().equals("POST")) { try { DataInputStream dis = new DataInputStream(request.getInputStream()); String s; while((s = dis.readLine()) != null) { qs += s + "\r\n"; catch (IOException ie) { else { msg += "I can't handle the " + request.getMethod() + " method. <br>"; 상당히 복잡한 데이터 처리를 할 수 있으며 들어온 데이터를 그대로 다시 HTML에 쓰고 있다. Database Lab. Lee Chan-Seob

31 A Form Echoing Servlet Database Lab. Lee Chan-Seob if (qs != null) {
StringTokenizer st = new StringTokenizer(qs, "&"); while (st.hasMoreTokens()) { String temp = st.nextToken(); String name = temp.substring(0, temp.indexOf('=')); String value = temp.substring(temp.indexOf('=') + 1, temp.length()); msg += name + ":" + value + "<br>\r\n"; } msg += "</BODY></HTML>\r\n"; response.setContentLength(msg.length()); response.setContentType("text/html"); try { DataOutputStream rs = new DataOutputStream(response.getOutputStream()); rs.writeBytes("\r\n" + msg); catch (IOException ie) { 상당히 복잡한 데이터 처리를 할 수 있으며 들어온 데이터를 그대로 다시 HTML에 쓰고 있다. Database Lab. Lee Chan-Seob

32 A Form Echoing Servlet Database Lab. Lee Chan-Seob
상당히 복잡한 데이터 처리를 할 수 있으며 들어온 데이터를 그대로 다시 HTML에 쓰고 있다. Database Lab. Lee Chan-Seob

33 Test HelloWorldServlet (P.453) CounterServlet (P.456)
CounterServlet (P.456) HelloNameServlet (P.470) EchoFormServlet (P.479~480) 상당히 복잡한 데이터 처리를 할 수 있으며 들어온 데이터를 그대로 다시 HTML에 쓰고 있다. Database Lab. Lee Chan-Seob


Download ppt "자바 서버 API와 서블릿 데이타베이스 실험실 이찬섭, 박용문."

Similar presentations


Ads by Google