25
1 Computer Network Lab. 12. 컨컨컨 컨컨컨 2000. 6. 9 컨컨컨 컨컨컨 컨컨컨 컨컨컨컨 컨컨컨

12. 컨텐트 핸들러

Embed Size (px)

DESCRIPTION

12. 컨텐트 핸들러. 2000. 6. 9. 임정목 국중옥 컴퓨터 네트워크 실험실. 컨텐트 핸들러란 무엇인가 ?. 컨텐트 핸들러의 필요성 개발자들이 자바에서 가장 흥미를 가지는 개념 HTML 만 이해하는 최초의 브라우저에서 PDF 나 VRML 과 같은 플러그 인을 읽을 수 있는 새로운 컨텐트 유형이 발표됨 . 새로운 컨텐트의 웹 문서를 만나면 그 유형을 볼 수 있는 코드를 자동로드로 받게됨 플러그 인을 한꺼번에 처리할 각각의 플랫폼별의 컨텐트 핸들러 필요성 고취. - PowerPoint PPT Presentation

Citation preview

Page 1: 12.  컨텐트 핸들러

1Computer Network Lab.

12. 컨텐트 핸들러

2000. 6. 9

임정목 국중옥

컴퓨터 네트워크 실험실

Page 2: 12.  컨텐트 핸들러

2Computer Network Lab.

컨텐트 핸들러란 무엇인가 ?

컨텐트 핸들러의 필요성 개발자들이 자바에서 가장 흥미를 가지는 개념 HTML 만 이해하는 최초의 브라우저에서 PDF 나 VR

ML 과 같은 플러그 인을 읽을 수 있는 새로운 컨텐트 유형이 발표됨 .

새로운 컨텐트의 웹 문서를 만나면 그 유형을 볼 수 있는 코드를 자동로드로 받게됨

플러그 인을 한꺼번에 처리할 각각의 플랫폼별의 컨텐트 핸들러 필요성 고취

Page 3: 12.  컨텐트 핸들러

3Computer Network Lab.

컨텐트 핸들러란 무엇인가 ?(계속 )

컨텐트 핸들러의 개요 java.net.ContentHandler 의 서브 클래스 InputStream 을 통해 들어온 데이터를 유용한 자바의

객체로 변한 컨텐트 핸들러의 기능

URLConnection 으로부터 데이터를 읽어서 , 컨텐트 유형에 적합한 데이터로 부터 객체를 생성

서브 클래스들은 특수하게 관련된 MIME 일반 유형과 세부 유형들을 처리한다 .

Page 4: 12.  컨텐트 핸들러

4Computer Network Lab.

컨텐트 핸들러의 세부 유형 image/gif 컨텐트 핸들러

URLImageSource 객체를 반환

text/plain 컨텐트 핸들러 String 객체를 반환

데이터베이스 컨텐트 핸들러 데이터베이스 또는 레코드 객체를 반환 현재 만들어져 있지 않으므로 프로그래머가 직접 작성

컨텐트 핸들러란 무엇인가 ?(계속 )

Page 5: 12.  컨텐트 핸들러

5Computer Network Lab.

컨텐트 핸들러와 프로토콜 핸들러의 관계 URLConnection 클래스의 getContent() 메소드는 In

putStream 을 반환

아스키 코드를 반환하기만 하는 프로토콜에서 반환하는 입력 스트림을 처리하는 프로토콜이 FTP, gopher 또는 HTML 일 경우 동작이 잘 이루어 지지 않음

컨텐트 핸들러란 무엇인가 ?(계속 )

Page 6: 12.  컨텐트 핸들러

6Computer Network Lab.

반환되지 않는 다른 유형의 컨텐트를 처리하는 요령 getContent() 가 데이터의 MIME 유형을 조사

매칭을 위한 컨텐트 핸들러를 생성하기 위해 ContentHandlerFactory의 createContentHandler() 를 사용

데이터에 알맞은 컨텐트 핸들러들을 만들어야 한다 .

ContentHandeler 가 존재할 경우 URLConnection 의 getContent() 메소드는 ContentHandler 의 getContent() 메소드를 호출하고 , 이 메소드는 반환할 자바 객체를 생성한다 .

컨텐트 핸들러란 무엇인가 ?(계속 )

Page 7: 12.  컨텐트 핸들러

7Computer Network Lab.

컨텐트 핸들러를 이용한 자바 객체 생성 순서1. URL 의 생성

2. 객체 반환을 위한 URL 의 getContent() 호출

3. URL 의 연결

4. URLConnection 의 getContent() 를 호출

5. URLConnection.getContent() 는 컨텐트핸들러를 찾기 위해 URLConnection.getContentHandler() 를 호출

6. getContentHandler() 는 적합한 핸들러를 찾고 URLConnection.getContent() 에게 반환 ( 새로운 웹 문서로 이동할 경우 흔한 컨텐트핸들러를 다운로드 받지 않아도 된다 )

컨텐트 핸들러란 무엇인가 ?(계속 )

Page 8: 12.  컨텐트 핸들러

8Computer Network Lab.

컨텐트 핸들러를 이용한 자바 객체 생성 순서7. getContentHandler() 는 createContentHandler 메소드를 호출

8. 새로운 인스턴스를 생성하는데 실패하면 자바는 sun.net.www.content.type.subtype 이라는 컨텐트 핸들러 클래스를 찾는다 .

9. ContentHandler 객체가 생성되면 ContentHandler 의 getContent() 메소드를 호출하고 , 컨텐트 유형에 적합한 객체를 반환

10. 반환된 객체가 호출되어 URL.getContent() 를 호출한 메소드에 도달한다 .

컨텐트 핸들러란 무엇인가 ?(계속 )

Page 9: 12.  컨텐트 핸들러

9Computer Network Lab.

Application 이 컨텐트 핸들러를 찾는 방법

컨텐트 핸들러란 무엇인가 ?(계속 )

URL 생성 getContent() 호출

컨텐트핸들러서브클래스

생성ContentHandlerFactoryContentHandlerFactory

설치설치

Page 10: 12.  컨텐트 핸들러

10Computer Network Lab.

ContentHandler 클래스

컨텐트 유형에 적합한 객체를 반환하기 위해 getContent() 메소드를 치환

메소드의 복잡 여부는 컨텐트 유형의 복잡도에 의해 결정 text/plain 컨텐트 핸들러는 간단

txt/rtf 컨텐트 핸들러는 복잡 미래의 컨텐트 핸들러는 임의 유형 객체를 반환

컨텐트와 자바의 객체를 매칭하여 주는 표준화 기대

Page 11: 12.  컨텐트 핸들러

11Computer Network Lab.

생 성 자 public ContentHandler()

ContentHandler 클래스는 생성자를 제공하지 않는다 .

추상클래스이므로 이 생성자를 명시적으로 호출하지 않는다 .

Page 12: 12.  컨텐트 핸들러

12Computer Network Lab.

getContent 메소드

public abstract Object getContent(URLConnection uc) throw IOExcption

getConnection() 메소드 안에서만 이 메소드를 호출할 수 있다 .

getContent() 는 객체를 생성하기 위해 URLConnection 의 InputStream 을 사용

ContentHandler 는 컨텐트 그 자체만 책임지며 URLConnection 이 서버와 필요한 핸드셰이킹을 수행하고 , 서버에서 온 헤더를 해석

Page 13: 12.  컨텐트 핸들러

13Computer Network Lab.

Text/tab-separated-values 컨텐트 유형을 처리하는 ContentHandler 를 작성하기 탭으로 구분된 문자열들은 데이터베이스나 스프레드시트 시스템에서 작성

getContent 메소드 ( 계속 )

JPE Associates 341 Lafayette St.Suite 1025 Nowhere NY 10012

O’ Relly & Associates 103 Morris Str. Sute A Sebastopol CA 95472

레코드필드

Page 14: 12.  컨텐트 핸들러

14Computer Network Lab.

탭으로 구분된 문자열들을 자바의 객체중에서 변환하기 위해 String 배열로 만들고 , 연속적인 레코드들은 Vector에 저장하여 ContentHandler 를 작성한 다음 클래스 정의

public class address {

String name;

String street;

String suite;

String state;

String city;

String zip;

}

getContent 메소드 ( 계속 )

Page 15: 12.  컨텐트 핸들러

15Computer Network Lab.

text/tab-separated-values 컨텐트 핸들러 코드import java.net.*;import java.io.*;import java.util.*;public class tabSeparatedValueHandler extends ContentHandler { public Object getContent(URLConnection uc) { String theLine; Vector v = new Vector(); try { DataInputStream dis = new DataInputStream(uc.getInputStream()); while ((theLine = dis.readLine()) != null) { String[] linearray = lineToArray(theLine); v.addElement(linearray); } } catch (IOException e) { } return v; }

getContent 메소드 ( 계속 )

Vector 의 인스턴스를 만든다 .

URLConnection uc 로 부터 InputStream 을 얻고 DataI

nputStream 으로 연결

각 줄은 lineToArray() 메소드에 연결되어 String 배열로 분리

각각의 String 배열은 Vector 에 추가된다 .

Page 16: 12.  컨텐트 핸들러

16Computer Network Lab.

getContent 메소드 ( 계속 )

text/tab-separated-values 컨텐트 핸들러 코드 (계속 )

private String[] lineToArray(String line) {

StringTokenizer st = new StringTokenizer(line, “\t"); int numFields = st.countTokens(); String[] fields = new String[numFields]; for (int i = 0; i < numFields; i++) { fields[i] = st.nextToken(); } return fields; }

}

구분자 탭 (\t) 를 가진 String 으로 부터 StringTocknizer

를 생성

String 내에서토큰의 개수에 따라 설정된다 .

배열은 numFields 를 갖는 필드들에 의해 만들어지고

각 토큰들을 채운다 .

lineToArray 는 이 배열을 반환한다 .

Page 17: 12.  컨텐트 핸들러

17Computer Network Lab.

ContentHandler 를 프로그램에서 사용하는 방법 연구하기 MIME 유형을 갖는 파일은 gopher, FTP, HTTP

서버로 부터 탭으로 분리되어 전송 (확장자는 .tsv)

서버는 전송된 파일이 text/tab-separated-values인것을 인지

MIME 유형중에서 – ( 하이픈 ) 이 들어 있는 경우 _(밑줄 ) 로 수정되어 인식

컨텐트 핸들러 생성기

Page 18: 12.  컨텐트 핸들러

18Computer Network Lab.

Application 이나 Browser 에서 ContentHandler 찾기 ContentHandlerFactory 는 ContentHandler

클래스가 저장될 곳을 정하는 규칙을 정의한다 . ContentHandlerFactory 를 구현하는 클래스를

작성하고 이 클래스의 creatContentHandler() 메소드가 작성한 ContentHandler 의 인스탄스를 생성한다 .

ContentHandlerFactory 를 설정하는 URLConnection의 setContentHandlerFactory() 메소드를 호출한다 .

컨텐트 핸들러 생성기 ( 계속 )

Page 19: 12.  컨텐트 핸들러

19Computer Network Lab.

createContentHandler 메소드

Public abstract ContentHandler createContentHandler(String mimetype)

URLStreamHandlerFactory 인터페이스의 creatURLStreamHandler() 메소드는 적합한 프로토콜 핸들러를 찾아내어 적재한다 .

ContentHandlerFactory 인터페이스의 creatContentHandler() 메소드는 주어진 MIME 유형에 적합한 ContentHandler 를 찾아내어 적재한다 .

Page 20: 12.  컨텐트 핸들러

20Computer Network Lab.

text/tab-separated-values 컨텐트 핸들러 코드를 이용하여 text/tab-separated-values 파일을 다운로드하고 출력하는 클래스의 예제

import java.io.*;import java.net.*;import java.util.*;

public class tsvContentTester implements ContentHandlerFactory {

String theURL;

createContentHandler 메소드 (계속 )

Page 21: 12.  컨텐트 핸들러

21Computer Network Lab.

public static void main (String[] args) {

if (args.length == 1) { tsvContentTester ct = new tsvContentTester(args[0]); URLConnection.setContentHandlerFactory(ct); ct.test(); } else { System.err.println("Usage: java tsvContentTester url"); } }

public tsvContentTester(String s) { theURL = s; }

createContentHandler 메소드 (계속 )

Page 22: 12.  컨텐트 핸들러

22Computer Network Lab.

public ContentHandler createContentHandler(String type) {

if (type.equalsIgnoreCase("text/tab-separated-values")) {

return new tabSeparatedValueHandler();

}

else {

return null;

}

}

}

createContentHandler 메소드 (계속 )

.tsv 파일을 전송하는 서버가 text/tab-separated-valued 라는 유형을 반환하는지 확인한다

Page 23: 12.  컨텐트 핸들러

23Computer Network Lab.

몇몇 컨텐트 핸들러들 Application/x~time

time 프로토콜은 1900년 1월 1 일 0 시 부터 경과된 초를 32비트 부호있는 숫자로 반환

컨탠츠 핸들러는 java.util.Date 객체로 반환 부호있는 32비트 정수를 readInt() 메소드로

자바의 int 로 변환 결과값은 getContent() 가 반환할 Date 객체를

생성하는데 사용

Page 24: 12.  컨텐트 핸들러

24Computer Network Lab.

time 컨텐트 핸들러import java.net.*;import java.io.*;import java.util.*;

public class timeContentHandler extends ContentHandler {

public Object getContent(URLConnection uc) { Date now = null;

몇몇 컨텐트 핸들러들 ( 계속 )

Page 25: 12.  컨텐트 핸들러

25Computer Network Lab.

try {

DataInputStream dis = new DataInputStream(uc.getInputStream()); int theTime = dis.readInt(); // 86400 seconds a day // midnight January 1970 = 2,208,988,800 seconds since midnight January 1, 1900 long secondsSince1970 = theTime - 2208988800L; long millisecondsSince1970 = secondsSince1970 * 1000L; now = new Date(millisecondsSince1970); } catch (IOException e) { } return now; }}

몇몇 컨텐트 핸들러들 ( 계속 )