|
Space Map
|
Dojo Toolkit Basics
Table of Contents
Dojo Toolkit은 무엇이며 왜 써야하는가?
- Dojo Toolkit은 무엇인가?
- 자바스크립트안에 씌어진 오픈소스 DHTML 툴킷이다.
> 자바스크립트 라이브러리들의 한 셋이다.
- DHTML과 함께 다년간의 오래된 문제들을 해결하는것이 목표이다.
> 브라우저 비호환성
- 사용자가 웹페이지들안에 동적인 능력을 쉽게 만들수 있도록 해준다.
> 위젯들
> 애니메이션들
- 서버 기술에 무관하다. 즉 어떤 서버기술이 사용되든 상관 없다. (Server technology agnostic)
- Dojo Toolkit을 왜 써야하는가?
- 사용자의 웹어플리케이션들을 좀더 사용하기 쉽고, 즉각적으로 반응하고, 편리하게 만들기 위해 Dojo를 사용할 수 있다.
> AJAX를 지원한다.
- Dojo는 유연함과 관련된 많은 것들을 제공한다.
> XMLHttpRequest 프로세싱을 숨긴다.
> 브라우저의 비호환성을 조정한다.
- 강력한 개발자 커뮤니티
- Dojo Toolkit의 미래
- 강력한 AJAX기반의 I/O 추상화(리모팅)
- Graceful degradation(우아한 성능 저하)
Graceful degradation
One of the things that keeps a lot of people away from the more modern, dynamic web pages is the question of whether or not users with old machines or accessibility problems will be able to visit your site. With all the books around nowadays citing these issues as a major drawback of new technology, many web developers forgo progressive design because these books have scared them.
This is why dojo's widgets have been designed to work on top of an existing block of code. Most of the widgets add functionality to existing HTML and, in this way, aren't meant to replace the HTML of your page, but extend it.
This means that even when javascript is disabled in the browser (or you are using a browser that doesn't support javascript), the page will still show up and be usable. So if you were using Dojo's Date Picker widget, on a browser without javascript, it would show up as a select box or maybe a input text area. However, with a modern browser you would have a robust graphical calendar.
출처: http://dojotoolkit.org/node/57
브라우저가 자바스크립트를 지원하지 못하더라도 최소한의 화면은 나오게끔 한다는 원칙
- 뒤로가기, 앞으로가기, 북마킹 지원
- 관점 기반의(Aspect-oriented) 이벤트 시스템
- 위젯을 기반으로 UI를 만든다.
- 위젯 프로토타이핑
- 애니메이션
- 많은 유용한 라이브러리들
Dojo Toolket 패키지 시스템
- Dojo Toolkit 패키지 시스템
- Dojo 라이브러리들은 자바라이브러리들과 유사한 패키지들로 구성되어졌다.
- 사용자는 필요로 하는 패키지들을 단지 import 한다.
> dojo.require("dojo.event.*");
> dojo.require("dojo.dnd.*");
- require()는 없앨수 있고, 자바스크립트 코드를 동적으로 회수하고 페이지안에서 그들을 로드한다.
- 사용자는 사용자 자신들의 패키지들을 쓸수 있다.
- Dojo Toolkit 라이브러리들
- dojo.io: 서버와 AJAX 기반으로 통신
- dojo.event: DOM과 프로그램의 이벤트들을 위한 통일된 이벤트 시스템
- dojo.lang: 자바스크립트를 사용을 좀더 쉽게 만들어주기 위한 유용한 루틴들
- dojo.string: String 처리 루틴들
- dojo.dom: DOM 처리 루틴들
- dojo.style: CSS Style 처리 루틴들
- dojo.html: HTML 명확한 조작들
- dojo.reflect: Reflection API
- dojo.date: Date 처리
- dojo.logging.Logger: Logging 라이브러리
- dojo.profile: JS Profiler
- dojo.regexp: Regular Expression generators
- dojo.dad: Drag and Drop
- dojo.collections: Collection data structures
- dojo.crypto: Cryptographic API
- dojo.reflection: Reflection routines
- dojo.math: Mathematic routines
- dojo.storage: Storage routines
- dojo.uri: URL handling routines
- dojo.widget: Widget framework
dojo.io.bind를 통한 리모팅
- dojo.io.bind()
- dojo.io.* 네임스페이스는 네트웍 I/O를 위한 일반적인 API들을 포함한다.
> dojo.io.bind()는 낮은 레벨의 XMLHttpRequest 작업을 숨긴다.
> 브라우저안에서 dojo.io.bind()는 "Ajax" 요청들을 만드는 하나의 방법이다.
- 또다른 처리
> back-button을 차단한다.
> transparent form submission
> 진보한 에러 핸들링
- dojo.io.bind() 구문
- Example #1: Simple Request
- Example #2: Simple Request
- Example #2: Error Handling
- Example #3: Same as Example #2
- mimetype - 응답 포맷 명세
- text/plain
> string format 응답
- text/javascript
> JavaScript format 응답
- text/xml
> XML format 응답
- text/json
> JSON format 응답
- Example #4: 동적 컨텐츠 로딩(자바스크립트 string 얻기)
- Example #5: XMLHTTP 수송의 명백한 명세
- Example #6: 요청을 통한 forms의 Submission
Backward/Forward 버튼, 북마크
- Example #6: 뒤로가기 버튼
- Example #7: Forward Button
- Example #8: Bookmarking
- changeULR 플래그에 true 값을 주어 단순하게 통과한다.
- 사용자의 최상위 페이지에서 마지막에 추가된 새로운 타임스탬프 해시값을 가질 수 있다.
- Example #9: Bookmarking
Dojo DOM 처리
- Dojo DOM 처리(조종) 루틴들
- dojo.byId("someid")
> document.getElementById("someid"); 와 같다.
- dojo.dom.isNode(node)
- dojo.dom.getTagName(node)
- dojo.dom.firstElement(node)
- dojo.dom.lastElement(node)
- dojo.dom.nextElement(node)
- dojo.dom.prevElement(node)
- dojo.dom.moveChildren (srcNode, destNode, trim)
- dojo.dom.copyChildren (srcNode, destNode, trim)
- dojo.dom.removeChildren(node)
- dojo.dom.replaceChildren(node, newChild)
- dojo.dom.removeNode(node)
- dojo.dom.getAncestors(node, filterFunction,returnFirstHit)
- dojo.dom.getAncestorsByTag(node, tag)
- dojo.dom.innerXML(node)
- dojo.dom.createDocumentFromText(str, mimetype):
- dojo.dom.insertAfter(node, reference, force):
- dojo.dom.insertAtPosition(node, reference, position)
- dojo.dom.textContent(node)
> 노드들의 자식을 text만 직렬화하여 구한다.
- dojo.dom.textContent(node, text)
> 노드들의 자식을 text만 직렬화하여 set한다.
Dojo Event System
- Transports
- dojo.io.bind 와 관련된 함수들은 transports를 콜하는 여러 메소드들을 사용하여 서버와 통신할 수 있다.
> XMLHttp
> IFrame I/O
> ScriptSrcIO
- 각각은 확실한 제한을 가지고 있다. 그래서 사용자는 사용자의 상태에 따라 정확하게 작업할 transport을 고를 수 있다.
- 기본 transport는 XMLHttp이다.
- XMLHttp Transport
> 그것은 다양한 케이스에서 만족스럽게 일한다. 하지만, 파일들을 운반할수 없다. 도메인을 가로질러 작업할 수 없다. (ie는 현재의 페이지와 다른 사이트에 연결할 수 없다.)
그리고 file:// 프로토콜을 작업할 수 없다.
- IFrame I/O Transport
> IFrame I/O Transport는 서버로 파일들을 업로드 할 수 있어 유용하다.
- ScriptSrcIO Transport
> 보안의 제약때문에 XMLHttp는 다른 도메인으로부터 데이타를 로드할수 없다.
> ScriptSrcIO Transport는 이것을 하기에 유용하다.
> Yahoo's RPC(Remote Procedure Call) 서비스는 ScriptSrcIO를 사용하여 실행된다.
- Overview
- 자바스크립트 이벤트 핸들링
- 이벤트들은 다음같은 이유로 자바스크립트 컴포넌트들 안에서 주요하다.
> 사용자 인터페이스를 조정한다.
> AJAX 요청의 결과이다.
> 각각 다른 상호작용을 자바스크립트트 컴포넌트들을 허락한다.
- 자바스크립트 이벤트 핸들링의 이슈
- 크로스 브라우저 이벤트 핸들링은 모아둔 것으로부터 쓰기가 어렵다.
> 이벤트 핸들링하는 자바스크립트 안에서 다양한 방법이 있다. 그리고 각각의 브라우저는 그들만의 변덕(버릇)과 이슈들이 있다.
- 증가된 페이지안의 자바스크립트 컴포넌트들의 숫자처럼 컴포넌트 코드들은 좀더 타이트하게 커플이 되어, 적게 유지하려는 경향이 있다.
- 여러 이벤트 핸들러를 등록하는 것은 어렵다.
> 새로운 것을 추가하면 그 전 것은 없어진다.
- 왜 Dojo 이벤트 시스템인가?
- 자바스크립트 이벤트 시스템을 추상화한다.
> 즉 dojo.event.connect()라는 API를 일관되고 간단한 API를 통해서 어떤 액션에도 반응하게 할 수 있다.
- 어떤 함수에 대한 호출도 핸들러가 있는 이벤트로 만들 수 있다.
> 간단한 DOM 이벤트 이상을 핸들링할 수 있다. 즉, DOM 이벤트는 주로 "event"라는 단어와 연관되는데, Dojo는 이벤트에 대한 확장된 시각을 가지고 있다. dojo.event.*라는 패키지 안에 있는 도구를 사용해서 개발자는 어떠한 함수 호출도 이벤트 핸들러로 다뤄질 수 있도록 기반을 만들어 주고 있다.
- 고급 이벤트 핸들링 스키마들을 제공한다.
> 관점지향 - 사용자 이벤트 핸들러는 이전 또는 이후를 호출할수 있다.
- 덜 추잡하다.
> DOM 노드의 경우는 이벤트 핸들러를 등록할려면 마크업 상에 쓸데없이 on*이라는 속성을 명시적으로 적어 줘야 하는데 이는 추잡해 보인다. (역자주: 마치, 심하게 노출하거나 화장을 한 사람을 길거리에서 보면서 눈살을 찌푸리는 것과 같이.. 이런 뉘앙스가 obtrusive란 단어에 있다.)
- dojo.event.connect(srcObj, "srcFunc", "targetFunc")
- 이벤트 핸들링을 위한 일관된 API를 제공한다.
- 브라우저의 차이점들을 추상화 한다.
- 몇몇 브라우저에서 나타나는 메모리 렉을 막아준다.
- 하나의 이벤트 타입의 하나의 이벤트 핸들러(다수의 이벤트 핸들러들)보다 좀더 추가해서 상세히 처리한다.
- Handling DOM events
- Example #1 - DOM 이벤트는 명명된 이벤트 핸들러를 사용한다.
- Example #2 - 이름없는(익명의) 이벤트 핸들러 사용하기
- Example #3 - 이벤트 핸들러처럼 객체의 메소드 추가하기
- Example #3 - 멀티 핸들러 등록
- Chaining function calls
- 다른 함수를 위해 객체의 함수 붙이기
- 사용자가 함수가 호출할때, 다른 함수를 호출하는걸 필요로 할때 사용한다.
> 이벤트의 소스는 DOM 이벤트를 호출하지 않는 함수이다.
- 같은 dojo.event.connect()를 사용한다.
> dojo.event.connect(srcObj, "srcFunc", targetObj, "targetFunc");
- Example #5a: 다른 함수를 위해 객체의 함수 붙이기
- Example #5b: 다른 함수를 위해 객체의 함수 붙이기
- Aspect-Oriented ("before advice" and"after advice")
- Before Advice
- dojo.event.connect()는 소스 함수가 호출되기 전에 리스너를 호출해서 사용할수 있다.
> Aspect Oriented Programming terminology(AOP) 에서 이것은 "before advice"라고 부른다.
- Example: "bar"는 exampleObj.foo가 호출되었을때,"foo" 전에 호출된다.
> dojo.event.connect("before", exampleObj, "foo", exampleObj,"bar");
- "after advice"는 default이다.
- Example #6: Attaching a function of an object to another function - "before"
- Event Handler Wrapper
- 어떤 경우, 사용자는 자바스크립트 컴포넌트의 소스코드를 수정하지 않고, 이벤트 핸들러의 행동이나, 인수들의 수정을 원할수 있다.
> 이벤트 핸들러 리스너들이 충분하지 않을때, "before" 또는 "after"를 추가해라.
- Dojo안에서 이것은 첫번째 인수처럼 "around"와 함께 dojo.io.connect을 통상적으로 사용한다.
> dojo.io.connect("around", ...);
- 그것은 서블릿 필터 스키마처럼 행동한다.
> 요청들을 가로채고, 행동을 수정한다
- Publish/Subscribe Event Handling
- 사용자가 컴포넌트들 사이에서 익명의 이벤트 통신을 필요로 할때 사용한다.
- 좀더 유연한 컴포넌트를 만들기 위해 초기화 파라메터안에서 통과되는 topic 이름을 주기 위해 컴포넌트의 커스터마이징을 허락한다.
- Disconnecting event handlers
- 이벤트들을 위해 dojo.event.disconnect()을 사용해라.
> dojo.event.connect()에서 통과한 것과 동일한 인수들을 정확하게 통과해라.
- topics를 위한 dojo.event.topic.unsubscribe()
> dojo.event.topic.subscribe()# Resources 에서 통과한 것과 동일한 인수들을 정확하게 통과해라.
- Resources
Dojo Widgets 사용
- Widget이 무엇이냐?
- button, text box, scroll bar, calendar, tree 등등 과 같은 UI 엘리먼트이다.
> 위젯들은 DOM API와 함께 처리하면 좀더 쉽다.
- 혼합된 엘리먼트를 만들 수 있다.
- 사용자 스타일을 가질수 있다.
- 이벤트 핸들러들을 등록할수 있다.
> 이벤트 핸들러들을 백엔드 서비스로 호출할 수 있다.
- 브라우저 비호환성을 조절할 수 있다.
- Dojo 위젯 시스템의 미래
- 프로토타입의 능력, 테스트, 컴포넌트 UI의 기능향상과 상호작용
- HTML안에 사용자 UI 빠르게 프로토타입을 사용할수 있는 템플릿들을 제공한다. 그리고 사용자가 포함한 페이지들 위에 마크업처럼 사용자 위젯을 드러낸다.
- 프로토타이핑을 하면서 했던 작업이 배치를 하는 시점에 버려지지 않는다.
> 즉 위젯은 재사용이 용이하다. Dojo 툴킷 또한 디스플레이 페이지에 몇개의 마크업 엘리먼트만 포함하면 바로 사용 가능한 몇개의 유용한 위젯을 포함하고 있다.
- Mechanism
- Dojo 공간 HTML 템플릿들과 파일안의 CSS 일부분들은 위젯이 구조화되었을때 참고한다.
- 이벤트 핸들러의 setup과 DOM 노드들과 관련된 생성은 사용자의 HTML 마크업 위의 약간의 extra 속성을 통해 조절한다.
- 사용자 페이지에 위젯 추가하는 세가지 방법
- 사용자는 세가지 메소드 중에 하나를 사용할 수 있다.
> <dojo:NameofWidget ../>
> <div dojoType="NameOfWidget" ..../>
> <div class="dojo-NameOfWidget" .../>
- Dojo 툴킷 안에 내장된 위젯들(2006년 6월)
- 사용자는 사용자의 html 또는 jsp 페이지안에 추가하여 내장된 위젯을 사용할 수 있다.
- List, Editor, Fisheye, Form, Mail, Tree, contentPane, datePicker, dialog, layoutContainer, rounded, spilitContainer, tabContainer, tooltip, etc.
- 더욱 많은것이 커뮤니티 멤버들에 의해 만들어지고 있다.
- Editor Widget
- Editor Widget 사용법
<script>
dojo.require("dojo.widget.Editor");
</script>
<body>
<div dojoType="Editor" items="formatblock;|;
insertunorderedlist;insertorderedlist;|
;bold;italic;underline;strikethrough;|;createLink;">
...
- FisheyeList & FisheyeListItem Widgets

- FisheyeList & FisheyeListItem Widgets 사용법
<script>
dojo.require("dojo.widget.FisheyeList");
dojo.hostenv.writeIncludes();
</script>
<body>
<div class="dojo-FisheyeList"
dojo:itemWidth="50" dojo:itemHeight="50"
dojo:itemMaxWidth="200" dojo:itemMaxHeight="200"
dojo:orientation="horizontal"
dojo:effectUnits="2"
dojo:itemPadding="10"
dojo:attachEdge="top"
dojo:labelEdge="bottom"
dojo:enableCrappySvgSupport="false"
>
<div class="dojo-FisheyeListItem" onClick="load_app(1);"
dojo:iconsrc="images/icon_browser.png" caption="Web Browser">
</div>
<div class="dojo-FisheyeListItem" onClick="load_app(2);"
dojo:iconsrc="images/icon_calendar.png" caption="Calendar">
</div>
<div class="dojo-FisheyeListItem" onClick="load_app(3);"
dojo:iconsrc="images/icon_email.png" caption="Email">
</div>
<div class="dojo-FisheyeListItem" onClick="load_app(4);"
dojo:iconsrc="images/icon_texteditor.png" caption="Text Editor">
</div>
...
- Form Widget

- datePicker Widget

- Mail Widget
- Tree Widget
- Demo Scenarios
참고문헌
Graceful degradation
|
Comments (3)
5월 02, 2007
conkmj says:
역시 난다가 스타트를 끊었구만.. 요근래 피곤과 스트레스로 제정신이 아니었는데.. 어제 푹 자고 나니 살것 같네.. 도조부터 새로운 마음으로다...역시 난다가 스타트를 끊었구만..
요근래 피곤과 스트레스로 제정신이 아니었는데.. 어제 푹 자고 나니 살것 같네..
도조부터 새로운 마음으로다가...
진달이가 요즘 바쁘다던데... 모든 멤버가 같이 컨텐츠를 만듦이 어떤지~~
5월 03, 2007
이윤정 says:
넹~ 해석이 좀 애매하네요. 이상한 부분은 수정해주세요.. 해석하는게 챕터 이해하는데 도움이 많이돼요... ^^넹~ 해석이 좀 애매하네요. 이상한 부분은 수정해주세요..
해석하는게 챕터 이해하는데 도움이 많이돼요... ^^
5월 10, 2007
이윤정 says:
역시 오빠가 해석하니 더 매끄럽고 좋네요~ 이해도 확 되고~ ^^역시 오빠가 해석하니 더 매끄럽고 좋네요~ 이해도 확 되고~ ^^