Download presentation
Presentation is loading. Please wait.
1
제14장 자바 서블릿
2
14.1 서블릿의 기초
3
CGI (Common Gateway Interface)
환경 웹(Http) 클라이언트 웹 브라우저(Intent Explorer, Netscape Navigator) 웹(Http) 서버 Apachi 웹 서버 CGI 역할 서버가 지정하는 프로그램 실행 클라이언트가 제공하는 데이터를 프로그램에게 입력 변수 CGI 프로그램이 생성하는 결과 값은 웹 클라이언트에 전달 CGI 프로그램 CGI에 의해 구동되는 프로그램으로 웹 클라이언트로부터 입력 정보와 DB 등을 이용하여 HTML 문서 형태의 결과를 낸다.
4
서블릿이란 ? 자바를 이용해서 작성하는 CGI 프로그램의 일종 멀티 쓰레드를 이용한 성능 향상
서블릿은 클라이언트의 요청이 있을 때마다 프로세스를 생성하는 것이 아니라 쓰레드(thread)를 생성한다. 크게는 33배에서 작게는 5배정도 쓰레드 생성이 빠르다.
5
CGI와 서블릿의 차이점 둥근 사각형은 프로세스를 의미하고, 회색으로 채워진 둥근 사각형은 쓰레드를 의미한다.
6
서블릿의 장점 높은 성능 플랫폼 독립성 서버 독립성 확장성 프로그램의 용이성 네트워크를 통한 동적인 로딩 지원
7
서블릿 엔진 서블릿 엔진 서블릿 엔진의 예 자바 서블릿 프로그램을 실행시켜 줄 환경 자카르타 자바 웹서버
C:\jakarta-tomcat\ 디렉토리에 설치 자바 웹서버 WebSphere(IBM) Java WebServer (SUN and WebLogic)
8
서블릿의 구조 역할 클라이언트로부터의 처리요청(Request) 서블릿의 처리결과(Response)
클라이언트로부터의 FORM을 이용한 요청을 받아서 이를 처리한 결과를 다시 클라이언트에 HTML 문서 형태로 전달한다. 클라이언트로부터의 처리요청(Request) FORM을 이용하여 데이터 전달 HttpServletRequest req 서블릿의 처리결과(Response) 클라이언트의 요청을 받아 처리한 HTML 문서 형태의 결과 HttpServletResponse res
9
GET 요청을 수행하는 간단한 서블릿 프로그램
예제: HelloServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); try { PrintWriter out = res.getWriter(); out.println("<HTML>");
10
GET 요청을 수행하는 간단한 서블릿 프로그램
out.println("<HEAD><TITLE>Hello Servlet</TITLE></HEAD>"); out.println("<BODY>"); out.println("Hello Servlet!!"); out.println("</BODY>"); out.println("</HTML>"); out.close(); } catch(Exception e) { getServletContext().log("Error in HelloServlet:", e); }
11
서블릿 클래스의 위치 서블릿 클래스가 저장되는 디렉토리 위치 결과
<자카르타홈>\webapps\ROOT\WEB-INF\classes 서블릿 엔진에 따라 약간씩 다르다. 결과
12
14.2 FORM 처리
13
FORM 처리 HTML의 FORM을 처리 FORM 태그의 형태 FORM 태그를 가지는 HTML 문서
자료를 처리할 수 있는 CGI나 서블릿 프로그램이 필요하다. FORM 태그의 형태 <FORM ACTION= METHOD=POST> <INPUT TYPE=TEXT ...> </FORM>
14
FORM 처리 METHOD 서블릿에는 각각에 대해 doXXX() 함수들이 존재한다.
GET 가장 많이 사용되는 것으로, 사이트 방문은 모두 GET 방식을 사용한다. 웹브라우저에서 웹서버에 간단한 데이터를 전송할 때도 사용된다. POST 웹브라우저에서 웹서버에 데이터를 전송할 때 많이 사용된다. HEAD GET과 동일하나 HEAD는 내용은 받지 않고 HTTP 헤더 정보만 받는다. 서블릿에는 각각에 대해 doXXX() 함수들이 존재한다.
15
FORM 처리 ACTION 자료를 처리할 CGI나 서블릿 프로그램의 이름을 기술한다. <FORM METHOD=POST ACTION=
16
GET 방식 이용하는 예 예제: GetName.java 1 import java.io.*;
2 import java.util.*; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 6 public class GetName extends HttpServlet { 7 public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 10 res.setContentType("text/html;charset=KSC5601"); PrintWriter out = res.getWriter(); String name = HangulConversion.toKor(req.getParameter("name")); String address = HangulConversion.toKor(req.getParameter("addr"));
17
GET 방식 이용하는 예 15 out.println("<HTML>");
out.println("<HEAD><TITLE>GET NAME</TITLE></HEAD>"); out.println("<BODY>"); out.println("<CENTER><H3>GET 테스트입니다</H3></CENTER>"); out.println("<LI> 이름 :" + name); out.println("<LI> 주소 :" + address); out.println("</BODY>"); out.println("</HTML>"); } 24 }
18
예제: getName.html 결과 1 <form method=GET action=/servlet/GetName>
2 이름 <input type=input name=name><br> 3 주소 <input type=input name=addr> <br><br> 4 5 <input type=submit value=전송> 6 <input type=reset value=취소> 7 </form> 결과
19
POST 방식 이용하는 예 예제: PostName.java 1 import java.io.*;
2 import java.util.*; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 6 public class PostName extends HttpServlet { 7 public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 10 Enumeration keys; String key, value;
20
POST 방식 이용하는 예 14 res.setContentType("text/html;charset=KSC5601");
PrintWriter out = res.getWriter(); out.println("<HEAD><TITLE>POST NAME</TITLE></HEAD>"); out.println("<BODY>"); out.println("<CENTER><H3>POST 테스트입니다 </H3></CENTER>"); keys = req.getParameterNames(); while(keys.hasMoreElements()) { key = (String) keys.nextElement(); value = HangulConversion.toKor(req.getParameter(key)); out.println("<li>" + key +" 필드:"+value); } out.println("</BODY>"); out.close(); } 28 }
21
예제: postName.html 1 <form method=POST 2 action=servlet/PostName>
3 4 이름 <input type=input name=name><br> 5 주소 <input type=input name=addr> <br><br> 6 7 <input type=submit value=전송> 8 <input type=reset value=취소> 9 </form>
22
14.3 서블릿의 API
23
서블릿 라이프 사이클과 상속 관계 서블릿은 요청-응답(request-response) 형태의 서비스 안에서 수행되는 모듈이다.
서비스(service)라는 것은 HTTP 등 응용 프로그램 수준의 프로토콜을 구현한 코드를 의미한다. 라이프 사이클
24
상속 관계
25
Servlet 인터페이스 Servlet 인터페이스 서블릿이 클라이언트로부터 요청을 받는 경우
서블릿에서 가장 기본이 되는 것으로 모든 서블릿 프로그램들은 이 인터페이스를 직접 혹은 간접적으로 구현한다. Servlet 인터페이스는 서블릿을 관리하고, 클라이언트와 통신할 수 있는 메소드들을 지원한다. 서블릿이 클라이언트로부터 요청을 받는 경우 ServletRequest와 ServletResponse 를 아규먼트로 받는다. ServletRequest 객체는 클라이언트에서 서버로의 통신을 캡슐화 ServletResponse는 서버에서 클라이언트로의 통신을 캡슐화
26
Servlet 인터페이스에 선언되어 있는 메소드
void init(ServletConfig config) 서블릿을 초기화하고, 서비스에 등록한다. void service(ServletRequest req, ServletResponse res) 서블릿을 초기화한 후에 서비스를 수행한다. void destroy() 서비스에서 서블릿을 삭제한다. ServletConfig getServletConfig() ServletConfig 객체를 리턴한다. ServletConfig 객체는 초기화에 관련된 파라메터를 가지고 있다. String getServletInfo() 서블릿에 관한 간단한 정보를 반환한다.
27
GenericServlet 클래스 프로토콜에 무관한 기본적인 기능을 제공하는 클래스 서블릿의 라이프 사이클을 지원하기 위해
Servlet과 ServletConfig 인터페이스를 구현한다. 서블릿의 라이프 사이클을 지원하기 위해 init(), destroy() 등의 메소드 ServletConfig 인터페이스의 log() 등의 메소드가 있다. 이 클래스를 상속받아 서블릿을 작성하는 경우 service() 메소드를 재정의해서 서비스 작업을 기술한다.
28
GenericServlet 클래스의 메소드
void init() 서블릿의 초기화 함수로서, GenericServlet는 ServletConfig 객체를 초기화한다. void init(ServletConfig config) 서블릿을 초기화한다 void destroy() 서블릿을 종료하고, 리소스를 반환한다 abstract void service(ServletRequest req, ServletResponse res) 클라이언트의 요청을 처리한다. String getInitParameter(String name) 초기화 파라메타의 값을 리턴한다. Enumeration getInitParameterNames() 초기화 파라메타의 이름들을 리턴한다.
29
GenericServlet 클래스의 메소드
ServletConfig getServletConfig() ServletConfig 객체를 리턴한다. ServletConfig는 초기화 파라메타에 관련된 정보를 가지고 있다. ServletContext getServletContext() ServletContext 객체를 리턴한다. ServletContext는 서블릿 엔진에 관련된 정보를 가지고 있다. String getServletInfo() 서블릿에 관련된 정보를 가져온다. void log(String msg) 로그 파일에 서블릿의 오류 메시지들을 기록한다. void log(String message, Throwable t)
30
HttpServlet 클래스 HTTP 서비스를 위한 기본적인 기능을 제공하는 클래스로, GenericServlet로부터 상속 받는다. HttpServlet의 service() 메소드는 클라이언트의 요청의 종류에 따라 자동적으로 각 각 다른 함수를 호출한다.
31
HttpServlet 클래스의 메소드 void doGet(HttpServletRequest req, HttpServletResponse resp) HTTP의 GET 요청을 처리한다. void doPost(HttpServletRequest req, HttpServletResponse resp) HTTP의 POST 요청을 처리한다. void doPut(HttpServletRequest req, HttpServletResponse resp) HTTP의 PUT 요청을 처리한다. void doDelete(HttpServletRequest req, HttpServletResponse resp) HTTP의 DELETE 요청을 처리한다. void doOptions(HttpServletRequest req, HttpServletResponse resp) HTTP 1.1의 OPTION 요청을 처리한다. void doTrace(HttpServletRequest req, HttpServletResponse resp) HTTP 1.1의 TRACE 요청을 처리한다.
32
HttpServlet 클래스의 메소드 long getLastModified(HttpServletRequest req)
서블릿이 마지막으로 변경된 시간을 리턴한다. void service(HttpServletRequest req, HttpServletResponse resp) 표준 HTTP 요청을 아래의 service() 메소드로부터 받아서 요청에 맞는 doXXX() 메소드를 호출한다. void service(ServletRequest req, ServletResponse res) 요청을 받아서 위에 있는 service() 메소드를 호출한다.
33
HttpServletRequest 인터페이스
클라이언트의 요청에 관련된 정보들은 HttpServletRequest 인터페이스를 통해 HttpServlet으로 전달된다. HttpServletRequest 인터페이스는 서블릿 엔진에서 구현한다. HttpServletRequest에서 자주 사용되는 메소드 String getAuthType() 서버가 사용하는 인증(authentication) 이름(예: "BASIC", "SSL", null)을 리턴한다. Cookie[] getCookies() 브라이저가 요청과 함께 전달한 쿠키들을 얻어온다. String getHeader(String name) 요청 헤더(request header) 값을 얻어온다. Enumeration getHeaderNames() 요청에 포함된 모든 헤더 이름들을 얻어온다.
34
HttpServletRequest에서 자주 사용되는 메소드
String getMethod() HTTP 메소드 이름(예: GET, POST, PUT)을 얻어온다. String getPathInfo() URL에서 추가적인 패스 정보를 얻어온다. String getPathTranslated() 서블릿 이름에서부터 쿼리(query) 스트링 전까지의 추가적인 패스 정보를 얻는다. String getQueryString() 쿼리(query) 스트링을 얻어온다. String getRemoteUser() HTTP 인증을 통해 로그인 한 경우에 사용자의 이름을 얻어온다. String getRequestedSessionId() 클라이언트의 세션 ID를 얻어온다. String getRequestURI() URI 값을 얻어온다. HttpSession getSession() 현재 세션을 리턴한다. HttpSession getSession(boolean create) 현재 세션을 리턴하거나 필요한 경우에 새로운 세션을 생성한다. boolean isRequestedSessionIdValid() 세션이 유효한가를 알아본다.
35
HTTP 서블릿 메소드 일반 CGI 환경 변수와 HttpServletRequest의 메소드들간의 관계
36
HTTP 서블릿 메소드
37
HttpServletResponse 인터페이스
HttpServletResponse 인터페이스는 HTTP의 응답을 클라이언트에 전송하는 역할을 한다. HttpServletResponse는 헤더 세팅, 쿠키 설정, URL 인코딩, 에러 전송 등의 기본적인 작업을 자동적으로 수행해준다. HttpServletResponse 인터페이스의 메소드 void addCookie(Cookie cookie) 응답에 쿠키를 추가한다. boolean containsHeader(String name) 응답 헤더에 주어진 필드가 포함되었는지 여부를 알려준다. String encodeRedirectURL(String url) URL을 인코딩해준다. void sendError(int sc) 클라이언트에 상태 코드와 디폴트 메시지를 전송한다.
38
HttpServletResponse 인터페이스의 메소드
void sendError(int sc, String msg) 클라이언트에 상태 코드와 메시지를 전송한다. void sendRedirect(String location) 주어진 URL로 리다이렉트하도록 한다. void setHeader(String name, String value) 응답 헤더에 필드와 값을 추가한다. void setIntHeader(String name, int value) 헤더 필드에 주어진 이름과 정수 값을 설정한다. void setStatus(int sc) 응답에 상태 코드를 설정한다.
39
HttpServletResponse의 멤버 필드 중 자주 사용되는 상태 코드
40
다른 사이트나 서블릿으로 리다이렉트하는 프로그램
예제: RedirectHello.java 1 import java.io.*; 2 import javax.servlet.*; 3 import javax.servlet.http.*; 4 5 public class RedirectHello extends HttpServlet { 6 public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { 9 res.setContentType("text/html"); PrintWriter out = res.getWriter(); res.sendRedirect(res.encodeRedirectURL("/servlet/HelloServlet")); } 14 }
41
병행성 문제 일반적으로 서블릿은 다중 쓰레드 방식으로 수행된다. 공유 자원이 있는 경우 병행성 관련 문제들을 고려해야 한다.
공유 자원이 있는 경우 병행성 관련 문제들을 고려해야 한다. 메모리에 로드되는 변수, 클래스 인스턴스 등과 외부의 파일, 데이터 베이스, 네트워크 컨넥션 등 병행성 문제 해결 방법 synchronized를 사용해서 함수에 락을 걸거나, 서블릿 클래스를 SingleThreadModel 인터페이스를 구현한다. 예: public class NotThreadSafe extends HttpServlet implements SingleThreadModel { }
Similar presentations