12. 컨텐트 핸들러

Preview:

DESCRIPTION

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

Citation preview

1Computer Network Lab.

12. 컨텐트 핸들러

2000. 6. 9

임정목 국중옥

컴퓨터 네트워크 실험실

2Computer Network Lab.

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

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

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

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

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

3Computer Network Lab.

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

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

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

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

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

4Computer Network Lab.

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

URLImageSource 객체를 반환

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

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

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

5Computer Network Lab.

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

putStream 을 반환

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

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

6Computer Network Lab.

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

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

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

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

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

7Computer Network Lab.

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

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

3. URL 의 연결

4. URLConnection 의 getContent() 를 호출

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

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

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

8Computer Network Lab.

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

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

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

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

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

9Computer Network Lab.

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

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

URL 생성 getContent() 호출

컨텐트핸들러서브클래스

생성ContentHandlerFactoryContentHandlerFactory

설치설치

10Computer Network Lab.

ContentHandler 클래스

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

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

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

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

11Computer Network Lab.

생 성 자 public ContentHandler()

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

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

12Computer Network Lab.

getContent 메소드

public abstract Object getContent(URLConnection uc) throw IOExcption

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

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

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

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

레코드필드

14Computer Network Lab.

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

public class address {

String name;

String street;

String suite;

String state;

String city;

String zip;

}

getContent 메소드 ( 계속 )

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 에 추가된다 .

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 는 이 배열을 반환한다 .

17Computer Network Lab.

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

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

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

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

컨텐트 핸들러 생성기

18Computer Network Lab.

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

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

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

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

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

19Computer Network Lab.

createContentHandler 메소드

Public abstract ContentHandler createContentHandler(String mimetype)

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

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

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 메소드 (계속 )

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 메소드 (계속 )

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 라는 유형을 반환하는지 확인한다

23Computer Network Lab.

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

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

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

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

생성하는데 사용

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;

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

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

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

Recommended