제14장 자바 서블릿.

Slides:



Advertisements
Similar presentations
12 장 자바 애플릿. 2 Applet 개요 Applet 프로그램 – 웹 페이지에 포함되어 구동 된다. 웹 브라우저나 애 플릿뷰어 (appletviewer) 에서 실행되는 프로그램 – 웹 브라우저 내에 Applet 을 해석하여 실행할 수 있 도록 Applet 구동용 인터프리터가.
Advertisements

HTTPS Packet Capture Tutorial
Chapter 07 : 서블릿 고급2. chapter 07 : 서블릿 고급2 학습목표 세션 tracking hidden 태그 이용 encodeURL 메소드 사용법 URL 파라미터 이용 쿠키 이용 세션 이용 encodeURL 메소드 사용법.
Chapter 16 : Struts 프레임워크 2. chapter 16 : Struts 프레임워크 2.
네트워크 프로그래밍 및 실습.
4 서블릿의 라이프 사이클.
Oozie Web API 기능 테스트 이승엽.
Introduction to Servlets
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
2 서블릿의 기초.
Power Java 제3장 이클립스 사용하기.
4강. Servlet 맛보기 Servlet 문서 작성 하기 web.xml에 서블릿 맵핑 어노테이션을 이용한 서블릿 맵핑
5강. Servlet 본격적으로 살펴보기-I 프로젝트 만들기 doGet() doPost()
최윤정 Java 프로그래밍 클래스 상속 최윤정
Ch.07-5 xml-rpc 사용하기 김상엽.
Network Lab. Young-Chul Hwang
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
2 서블릿의 기초.
3장. 웹 어플리케이션과 JSP 및 Servlet의 이해 제3장.
자바 서버 API와 서블릿 데이타베이스 실험실 이찬섭, 박용문.
Internet Computing KUT Youn-Hee Han
5 익셉션 처리.
PHP입문 Izayoi 김조흔.
웹 서버 동작 HTTP 클라이언트가 서버와 대화하는 방법과 데이터를 서버에서 클라이언트로 전송 하는 방법을 정의한 프로토콜
웹 프로토콜과 로그의 이해 ★ 웹 프로토콜 ★ 통신 절차 ★ HTTP Request ★ HTTP Response.
4 쿠키와 세션.
forms 객체 입력상자 체크상자, 라디오 버튼 목록상자
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
4장. 웹로직 서버상에서의 JDBC와 JTA의 운용
Java Web Programming 4일차.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
자바 5.0 프로그래밍.
18강. 데이터 베이스 - II JDBC 살펴보기 Statement객체 살펴보기 Lecturer Kim Myoung-Ho
Servlet 서블릿 기초 FORM 처리 서블릿의 API 세션과 쿠키 com.oreilly.servelet 패키지
6강. Servlet 본격적으로 살펴보기-II
Chapter 03 : 서블릿 ( Servlet ) 개요. chapter 03 : 서블릿 ( Servlet ) 개요.
10장. 예외처리.
제 01 장 인터넷 프로그래밍 개요 학기 인터넷비즈니스과 강 환수 교수.
26강. 포워딩(Forwarding) RequestDispatcher 클래스 HttpServletResponse 클래스
7장 JSP페이지의 내장객체(Implicit Object)와 영역(Scope)
속성과 리스너 초기화 파라미터 외 파라미터에 대해 이해한다. 리스너를 생성해보고 사용에 대해 이해한다.
JDBC (Java Database Connectivity)
13. 연산자 오버로딩.
7장 인터페이스와 추상 클래스.
Method & library.
자바응용.
RMI Messenger 지도 : 김정배 교수님 조봉진.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Ⅰ. ASP개체 모델 Ⅱ. Request 개체 그렇다면 프로그래밍 언어를 수행하는 컴퓨터의 개념적인 구조를 살펴 본다면, 프로그래밍 언어가 무엇인지 이해하는데 도움이 될 것입니다. 현재 컴퓨터 구조의 모태가 되고 있는 폰 노이만 구조는 그림에서 보는 것과 같이, 명령어와.
CGI란 무엇인가? CGI(Common Gateway Interface)의 정의
7장. JSP페이지의 내장객체(Implicit Object)와 영역(Scope)
12장 쿠키와 세션 이장에서 배울 내용 : 쿠키와 세션은 웹 페이지 간에 정보를 유지할 때 사용된다. 쿠키와 세션은 사용되는 형태가 비슷하나, 쿠키는 웹 브라우저(클라이언트) 쪽에 저장되고, 세션은 웹 서버 쪽에 저장된다. 이 번장에서는 이들에 대해 학습한다.
15강. 폼 데이터 값 검증 Validator를 이용한 검증 ValidationUtils 클래스
14강. 세션 세션이란? 세션 문법 Lecturer Kim Myoung-Ho Nickname 블스
CHAP 21. 전화, SMS, 주소록.
웹(WWW).
12강. 컨트롤러 컨트롤러 클래스 제작 요청 처리 메소드 제작 뷰에 데이터 전달
Introduction to JSP & Servlet
3장 JSP프로그래밍의 개요 이장에서 배울 내용 : JSP페이지의 기본적인 개요설명과 JSP페이지의 처리과정 그리고 웹 어플리케이션의 구조에 대해서 학습한다.
JSP Programming with a Workbook
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
MIDP 네트워크 프로그래밍 ps lab 김윤경.
Android -Data Base 윤수진 GyeongSang Univ. IT 1.
JSP Programming with a Workbook
6 쿠키와 세션.
7 생성자 함수.
JAVA 프로그래밍 16장 JNLP.
20 XMLHttpRequest.
Presentation transcript:

제14장 자바 서블릿

14.1 서블릿의 기초

CGI (Common Gateway Interface) 환경 웹(Http) 클라이언트 웹 브라우저(Intent Explorer, Netscape Navigator) 웹(Http) 서버 Apachi 웹 서버 CGI 역할 서버가 지정하는 프로그램 실행 클라이언트가 제공하는 데이터를 프로그램에게 입력 변수 CGI 프로그램이 생성하는 결과 값은 웹 클라이언트에 전달 CGI 프로그램 CGI에 의해 구동되는 프로그램으로 웹 클라이언트로부터 입력 정보와 DB 등을 이용하여 HTML 문서 형태의 결과를 낸다.

서블릿이란 ? 자바를 이용해서 작성하는 CGI 프로그램의 일종 멀티 쓰레드를 이용한 성능 향상 서블릿은 클라이언트의 요청이 있을 때마다 프로세스를 생성하는 것이 아니라 쓰레드(thread)를 생성한다. 크게는 33배에서 작게는 5배정도 쓰레드 생성이 빠르다.

CGI와 서블릿의 차이점 둥근 사각형은 프로세스를 의미하고, 회색으로 채워진 둥근 사각형은 쓰레드를 의미한다.

서블릿의 장점 높은 성능 플랫폼 독립성 서버 독립성 확장성 프로그램의 용이성 네트워크를 통한 동적인 로딩 지원

서블릿 엔진 서블릿 엔진 서블릿 엔진의 예 자바 서블릿 프로그램을 실행시켜 줄 환경 자카르타 자바 웹서버 http://jakarta.apache.org/ C:\jakarta-tomcat\ 디렉토리에 설치 자바 웹서버 WebSphere(IBM) Java WebServer (SUN and WebLogic)

서블릿의 구조 역할 클라이언트로부터의 처리요청(Request) 서블릿의 처리결과(Response) 클라이언트로부터의 FORM을 이용한 요청을 받아서 이를 처리한 결과를 다시 클라이언트에 HTML 문서 형태로 전달한다. 클라이언트로부터의 처리요청(Request) FORM을 이용하여 데이터 전달 HttpServletRequest req 서블릿의 처리결과(Response) 클라이언트의 요청을 받아 처리한 HTML 문서 형태의 결과 HttpServletResponse res

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>");

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); }

서블릿 클래스의 위치 서블릿 클래스가 저장되는 디렉토리 위치 결과 <자카르타홈>\webapps\ROOT\WEB-INF\classes 서블릿 엔진에 따라 약간씩 다르다. 결과

14.2 FORM 처리

FORM 처리 HTML의 FORM을 처리 FORM 태그의 형태 FORM 태그를 가지는 HTML 문서 자료를 처리할 수 있는 CGI나 서블릿 프로그램이 필요하다. FORM 태그의 형태 <FORM ACTION=http://host:port/servlet/ServletName METHOD=POST> <INPUT TYPE=TEXT ...> ........ </FORM>

FORM 처리 METHOD 서블릿에는 각각에 대해 doXXX() 함수들이 존재한다. GET 가장 많이 사용되는 것으로, 사이트 방문은 모두 GET 방식을 사용한다. 웹브라우저에서 웹서버에 간단한 데이터를 전송할 때도 사용된다. POST 웹브라우저에서 웹서버에 데이터를 전송할 때 많이 사용된다. HEAD GET과 동일하나 HEAD는 내용은 받지 않고 HTTP 헤더 정보만 받는다. 서블릿에는 각각에 대해 doXXX() 함수들이 존재한다.

FORM 처리 ACTION 자료를 처리할 CGI나 서블릿 프로그램의 이름을 기술한다. <FORM METHOD=POST ACTION=http://host:8080/servlet/FormProcessing>

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 8 public void doGet(HttpServletRequest req, HttpServletResponse res) 9 throws ServletException, IOException { 10 11 res.setContentType("text/html;charset=KSC5601"); 12 PrintWriter out = res.getWriter(); 13 String name = HangulConversion.toKor(req.getParameter("name")); 14 String address = HangulConversion.toKor(req.getParameter("addr"));

GET 방식 이용하는 예 15 out.println("<HTML>"); 16 out.println("<HEAD><TITLE>GET NAME</TITLE></HEAD>"); 17 out.println("<BODY>"); 18 out.println("<CENTER><H3>GET 테스트입니다</H3></CENTER>"); 19 out.println("<LI> 이름 :" + name); 20 out.println("<LI> 주소 :" + address); 21 out.println("</BODY>"); 22 out.println("</HTML>"); 23 } 24 }

예제: 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> 결과

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 8 public void doPost(HttpServletRequest req, HttpServletResponse res) 9 throws ServletException, IOException { 10 11 Enumeration keys; 12 String key, value;

POST 방식 이용하는 예 14 res.setContentType("text/html;charset=KSC5601"); 15 PrintWriter out = res.getWriter(); 16 out.println("<HEAD><TITLE>POST NAME</TITLE></HEAD>"); 17 out.println("<BODY>"); 18 out.println("<CENTER><H3>POST 테스트입니다 </H3></CENTER>"); 19 keys = req.getParameterNames(); 20 while(keys.hasMoreElements()) { 21 key = (String) keys.nextElement(); 22 value = HangulConversion.toKor(req.getParameter(key)); 23 out.println("<li>" + key +" 필드:"+value); 24 } 25 out.println("</BODY>"); 26 out.close(); 27 } 28 }

예제: 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>

14.3 서블릿의 API

서블릿 라이프 사이클과 상속 관계 서블릿은 요청-응답(request-response) 형태의 서비스 안에서 수행되는 모듈이다. 서비스(service)라는 것은 HTTP 등 응용 프로그램 수준의 프로토콜을 구현한 코드를 의미한다. 라이프 사이클

상속 관계

Servlet 인터페이스 Servlet 인터페이스 서블릿이 클라이언트로부터 요청을 받는 경우 서블릿에서 가장 기본이 되는 것으로 모든 서블릿 프로그램들은 이 인터페이스를 직접 혹은 간접적으로 구현한다. Servlet 인터페이스는 서블릿을 관리하고, 클라이언트와 통신할 수 있는 메소드들을 지원한다. 서블릿이 클라이언트로부터 요청을 받는 경우 ServletRequest와 ServletResponse 를 아규먼트로 받는다. ServletRequest 객체는 클라이언트에서 서버로의 통신을 캡슐화 ServletResponse는 서버에서 클라이언트로의 통신을 캡슐화

Servlet 인터페이스에 선언되어 있는 메소드 void init(ServletConfig config) 서블릿을 초기화하고, 서비스에 등록한다. void service(ServletRequest req, ServletResponse res) 서블릿을 초기화한 후에 서비스를 수행한다. void destroy() 서비스에서 서블릿을 삭제한다. ServletConfig getServletConfig() ServletConfig 객체를 리턴한다. ServletConfig 객체는 초기화에 관련된 파라메터를 가지고 있다. String getServletInfo() 서블릿에 관한 간단한 정보를 반환한다.

GenericServlet 클래스 프로토콜에 무관한 기본적인 기능을 제공하는 클래스 서블릿의 라이프 사이클을 지원하기 위해 Servlet과 ServletConfig 인터페이스를 구현한다. 서블릿의 라이프 사이클을 지원하기 위해 init(), destroy() 등의 메소드 ServletConfig 인터페이스의 log() 등의 메소드가 있다. 이 클래스를 상속받아 서블릿을 작성하는 경우 service() 메소드를 재정의해서 서비스 작업을 기술한다.

GenericServlet 클래스의 메소드 void init() 서블릿의 초기화 함수로서, GenericServlet는 ServletConfig 객체를 초기화한다. void init(ServletConfig config) 서블릿을 초기화한다 void destroy() 서블릿을 종료하고, 리소스를 반환한다 abstract void service(ServletRequest req, ServletResponse res) 클라이언트의 요청을 처리한다. String getInitParameter(String name) 초기화 파라메타의 값을 리턴한다. Enumeration getInitParameterNames() 초기화 파라메타의 이름들을 리턴한다.

GenericServlet 클래스의 메소드 ServletConfig getServletConfig() ServletConfig 객체를 리턴한다. ServletConfig는 초기화 파라메타에 관련된 정보를 가지고 있다. ServletContext getServletContext() ServletContext 객체를 리턴한다. ServletContext는 서블릿 엔진에 관련된 정보를 가지고 있다. String getServletInfo() 서블릿에 관련된 정보를 가져온다. void log(String msg) 로그 파일에 서블릿의 오류 메시지들을 기록한다. void log(String message, Throwable t)

HttpServlet 클래스 HTTP 서비스를 위한 기본적인 기능을 제공하는 클래스로, GenericServlet로부터 상속 받는다. HttpServlet의 service() 메소드는 클라이언트의 요청의 종류에 따라 자동적으로 각 각 다른 함수를 호출한다.

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 요청을 처리한다.

HttpServlet 클래스의 메소드 long getLastModified(HttpServletRequest req) 서블릿이 마지막으로 변경된 시간을 리턴한다. void service(HttpServletRequest req, HttpServletResponse resp) 표준 HTTP 요청을 아래의 service() 메소드로부터 받아서 요청에 맞는 doXXX() 메소드를 호출한다. void service(ServletRequest req, ServletResponse res) 요청을 받아서 위에 있는 service() 메소드를 호출한다.

HttpServletRequest 인터페이스 클라이언트의 요청에 관련된 정보들은 HttpServletRequest 인터페이스를 통해 HttpServlet으로 전달된다. HttpServletRequest 인터페이스는 서블릿 엔진에서 구현한다. HttpServletRequest에서 자주 사용되는 메소드 String getAuthType() 서버가 사용하는 인증(authentication) 이름(예: "BASIC", "SSL", null)을 리턴한다. Cookie[] getCookies() 브라이저가 요청과 함께 전달한 쿠키들을 얻어온다. String getHeader(String name) 요청 헤더(request header) 값을 얻어온다. Enumeration getHeaderNames() 요청에 포함된 모든 헤더 이름들을 얻어온다.

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() 세션이 유효한가를 알아본다.

HTTP 서블릿 메소드 일반 CGI 환경 변수와 HttpServletRequest의 메소드들간의 관계

HTTP 서블릿 메소드

HttpServletResponse 인터페이스 HttpServletResponse 인터페이스는 HTTP의 응답을 클라이언트에 전송하는 역할을 한다. HttpServletResponse는 헤더 세팅, 쿠키 설정, URL 인코딩, 에러 전송 등의 기본적인 작업을 자동적으로 수행해준다. HttpServletResponse 인터페이스의 메소드 void addCookie(Cookie cookie) 응답에 쿠키를 추가한다. boolean containsHeader(String name) 응답 헤더에 주어진 필드가 포함되었는지 여부를 알려준다. String encodeRedirectURL(String url) URL을 인코딩해준다. void sendError(int sc) 클라이언트에 상태 코드와 디폴트 메시지를 전송한다.

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) 응답에 상태 코드를 설정한다.

HttpServletResponse의 멤버 필드 중 자주 사용되는 상태 코드

다른 사이트나 서블릿으로 리다이렉트하는 프로그램 예제: RedirectHello.java 1 import java.io.*; 2 import javax.servlet.*; 3 import javax.servlet.http.*; 4 5 public class RedirectHello extends HttpServlet { 6 7 public void doGet(HttpServletRequest req, HttpServletResponse res) 8 throws IOException, ServletException { 9 10 res.setContentType("text/html"); 11 PrintWriter out = res.getWriter(); 12 res.sendRedirect(res.encodeRedirectURL("/servlet/HelloServlet")); 13 } 14 }

병행성 문제 일반적으로 서블릿은 다중 쓰레드 방식으로 수행된다. 공유 자원이 있는 경우 병행성 관련 문제들을 고려해야 한다. 공유 자원이 있는 경우 병행성 관련 문제들을 고려해야 한다. 메모리에 로드되는 변수, 클래스 인스턴스 등과 외부의 파일, 데이터 베이스, 네트워크 컨넥션 등 병행성 문제 해결 방법 synchronized를 사용해서 함수에 락을 걸거나, 서블릿 클래스를 SingleThreadModel 인터페이스를 구현한다. 예: public class NotThreadSafe extends HttpServlet implements SingleThreadModel { ............... ................ }