'98..Etc'에 해당되는 글 370건

  1. 2009.04.03 벨로시티(velocity)에서 브라우저 캐쉬없애기
  2. 2009.04.02 웹 접근성 전문교육 [국내 자료]
  3. 2009.04.01 MSTSC 원격데스크탑 접속이 안될 경우
  4. 2009.04.01 MS 2003 Server-원격데스크탑 연결
  5. 2009.04.01 Naming Guidelines
  6. 2009.03.23 Velocity의 Developer's Guide를 따라하면서 정리해본것 입니다.
  7. 2009.03.23 웹언어별 문자열 치환방법
  8. 2009.03.19 google 를 이용해서 SVN 저장소 만들기
  9. 2009.03.18 웹개발 문서 모음
  10. 2009.03.10 서브버전(Subversion) 윈도우 서버 설치
  11. 2009.03.10 X-internet
  12. 2009.03.02 [Tip] 윈도우 탐색기에서 오른쪽버튼으로 커맨드창(cmd..
  13. 2009.03.02 동일한 IIS 프로세스에서 서로 다른 버전의 ASP.NET을 실행할 수 없습니다.
  14. 2009.03.02 Visual Studio 2005 IDE Tip / 단축키
  15. 2009.03.02 Visual Studio(Visual Basic) 2005 tip
  16. 2009.02.27 Velocity-Style Syntax
  17. 2009.02.27 Java application 에서 velocity 사용하기
  18. 2009.02.27 Velocity 소개
  19. 2009.02.27 Velocity UI for Eclipse 1
  20. 2009.02.27 Eclipse Plug-In : Velocity WebEditor 설치 방법 1
  21. 2009.02.27 Oracle WebLogic Server Downloads
  22. 2009.02.27 웹로직 시작시 아래와 같은 InvalidClassException 오류가 발생한다면? 1
  23. 2009.02.27 WebLogic 설치 및 환경설정법 1
  24. 2009.02.26 WebLogic Platform 8.1 Installation Guide (초보자를 위한 웹로직 설치법)
  25. 2009.02.26 JSTL cannot be resolved error
  26. 2009.02.26 Tomcat 5.x, 6.x] JSTL 사용 시 org.apache.jasper.JasperException
  27. 2009.02.25 TortoiseSVN 설치 및 사용방법 1. ToroiseSVN...
  28. 2009.02.25 Subversion을 사용한 소프트웨어 구성 관리에 관한 도움말
  29. 2009.02.25 버전관리 프로그램 Tortoise SVN
  30. 2009.02.25 TortoiseSVN 사용법 정리
98..Etc/velocity2009. 4. 3. 13:00
반응형

$res.setHeader("Pragma", "no-cache");
$res.setHeader("Cache-Control", "no-cache");
$res.setHeader("Expire", "0");


response 객체에다가 이렇게 설정

Posted by 1010
98..Etc/Etc...2009. 4. 2. 12:01
반응형

국내 자료

웹 접근성 전문교육

2007년 정보통신공무원교육원에서 전산담당 공무원을 대상으로 진행된 웹 접근성 전문교육 중 2일차 과정입니다.

웹 접근성 준수 실무 세미나 발표자료

한국정보문화진흥원 주최로 2006년 11월 29일에 진행된 웹 접근성 준수 실무 세미나의 발표 자료

장애인 관련 통계 자료

해외 자료

민간 기업의 웹 접근성 관련 정보

웹 접근성 관련 기사/글

최종수정일 : 2007.05.27 00:03 | 최종작성자 : 백남중 (220.76.101.199)

Posted by 1010
98..Etc/Etc...2009. 4. 1. 18:17
반응형
안녕하세요 향기입니다.

Windows XP에서 원격데스크탑 접속시에 아무런 오류창이나 문구없이 종료되는 현상 발생시에

아래 방법을 확인해 보시기 바랍니다.


1. Client 머신의 개인 방화벽 설정이 있다면 개인방화벽을 해제 후 테스트 해본다.
2. Geforce계열의 그래픽 카드를 사용할 경우 버젼 확인을 해본다.


1의 경우 오류메세지가 출력되겠지만, 제가 경험한 것은 2의 경우입니다.

아무런 메세지없이 종료되어서 DNS DHCP등등 레지스트리의 MSTSC의 원격 포트까지 변경을 하고 접속을
시도해 보았지만 연결이 되지 않았습니다.

이때 그래픽 카드의 버젼이 Nvidia(Geforce)계열의 경우 175.xx경우 다른 버젼으로 드라이버를 변경했더니
접속이 가능하였습니다.

제가 테스트한 Ver. 174.74 였습니다.

아무래도 Linux나 Unix 계열의 Text기반의 원격 접속이면 상관 없겠지만

Windows계열이다보니 GUI환경으로 Display를 해줘야 하는 상황이라 그래픽카드의 문제도 위와 같은
상황으로 연결되지 않나 싶습니다.

설마 했는데 정말 이것으로 해결이 되더군요..

Posted by 1010
98..Etc/Etc...2009. 4. 1. 17:58
반응형
오늘은 원격 데스트탑 연결에 대해서 알아보고자 한다.
클라이언트 컴퓨터는 데스크톱 연결을 통해 웹으로 원격지의 서버로 연결이 가능하다.
물론 터미널 서비스를 이용해서도 가능하다.

먼저 [제어판]-[프로그램  추가/제거]에서 Windows 구성요소 추가/제거를 눌러서 필요한
프로그램을 설치해야 한다.

Windows 구성요소 추가/제거를 눌러서 아래와 같이 응용프로그램 서버를 체크하고 자세히를
누른다.

여기서 자세히를 누르면 아래와 같은 화면이 나오는데 여기서 World Wide Web 서비스에 체크하고
자세히를 누른다.


위에서 자세히를 클릭하면 아래와 같은 화면이 나오고 여기서 원격 데스크탑 웹연결 선택하고
확인하고 설치한다.

이렇게 설치를 마치고 난 후 관리도구에 인터넷 정보서비스(IIS) 관리를 클릭하면 아래와 같이 생성된 것을 볼 수 있다.

여기서 tsweb을 선택하면 아래와 같이 default.htm이라는 파일이 보이는데 이것을 등록해줘야한다.

클라이언트는  원격지의 서버에 있는 터미널 서버에 웹을 이용해서 default.htm이라는 파일을 실행하는 것이다.


웹브라우저에 위에서와 같이 원격지 서버의 주소/tsweb/default.htm을 입력하면


위와 같이 로그인 화면이 나오고 여기에 로그인 정보를 입력하고 확인을 누르면 로컬에 로그온한 것 같이 익스플로어를 이용해서 원격지 서버에 접근이 가능하다.


위와 같이 원격지 서버에 접속한 화면을 볼 수 있다.

퍼옴: http://infomercial.tistory.com/143 

Posted by 1010
98..Etc/Etc...2009. 4. 1. 00:31
반응형
스킨 수정에 참고하기 위헤 스크랩합니다.
원문주소; http://html.nhndesign.com/guidelines/naming/


Naming Guidelines

  1. CSS 파일 네이밍
  2. id/class 선택자 선언 규약
  3. id/class 선택자 네이밍 가이드
  4. Image 네이밍 규약
  5. Image 네이밍 가이드
  6. Update History
  • (X) 허용 안함
  • (△) 예외 허용
  • (O) 적극 권장

1. CSS 파일 네이밍

CSS 파일을 여러개로 나누는 경우 HTTP 요청이 늘어나서 웹페이지 전송속도에 좋지 않은 영향을 주게 되므로 파일의 수는 최소한으로 유지합니다. 사이트 루트 디렉토리에 /css/ 폴더를 생성하고 전역에 쓰이는 파일의 이름은 default.css 으로 지정합니다.

/css/default.css
모든 스타일을 포함하는 파일

/css/popup.css
팝업등 새로운 페이지 유형이 존재하는 경우 별도로 분리

2. id/class 선택자 선언 규약

▲Top

아래와 같이 정형화 된 요소들에 대한 네이밍은 'id/class 선언규약'에 따릅니다. 단, 아래 예는 되도록 복잡한 상황을 재현한 것으로서 특히 #wrap, .colgroup과 같은 그룹핑은 필수적이지 않다면 제외하는 것이 바람직 합니다. 동일한 의미를 지닌 id/class 가 복수로 존재해야 하는 경우 선택자 뒤에 숫자를 붙여서 확장합니다. 예제보기.

#wrap : 감싸기
#header : 헤더
.gnb : Global Navigation Bar
.lnb : Local Navigation Bar
.search : Search Form
#container : 콘테이너
.spot : 강조하는 상위 콘텐츠
.snb : Side Navigation Bar
.account : 계정
.ad : 광고
.colgroup : 컬럼 그룹핑
#content : 본문 표시
.path : 문서 경로 표시
.article or .section
: 기사 또는 섹션 그룹핑
.article or .section
: 기사 또는 섹션 그룹핑
.aside : 곁가지
.ad : 광고

#footer : 풋터
  • #wrap :
    페이지(#header, #container, #footer) 전체를 지정 합니다.
  • #header :
    로고를 포함한 상단 영역(보통 .lnb 포함)을 지정 합니다.
  • #container :
    #header 와 #footer 를 제외한 본문 전체를 지정 합니다.
  • <address> 를 포함한 하단의 보조 네비게이션 영역을 지정 합니다.
  • .gnb :
    최상위 공통 네비게이션(Global Navigation Bar)을 지정합니다. 보통 수평(bar)형태로 표현되며 #header 에 종속된다. 수직으로 표현되는 경우는 거의 드물지만 그러한 경우 #header 에 종속되지 않을 수도 있습니다.
  • .lnb :
    현재 서비스의 지역(Local Navigation Bar) 네비게이션을 지정 합니다. 보통 수평(bar)형태로 표현되며 #header 에 종속된다. 수직으로 표현되는 경우는 거의 드물지만 그러한 경우 #header 에 종속되지 않을 수도 있습니다.
  • .search :
    현재 페이지의 주요 검색영역을 지정합니다.
  • .snb :
    .gnb, .lnb 를 제외한 측면(Side Navigation Bar) 네비게이션 영역을 지정합니다. 보통 #container 에 종속되고 수직으로 표현되지만 수평으로 표현되는 경우도 있으므로 #header 에 종속되는 등 예외의 경우도 있을 수 있습니다.
  • .account :
    로그인 폼 및 로그인 후 개인 계정을 표시하는 영역을 지정합니다.
  • .colgroup :
    컬럼 형태의 내용블럭을 그룹핑 합니다.
  • #content :
    반드시 #container 내부에 종속되며 보통의 경우 .snb 영역과 .aside 영역을 제외한 핵심 콘텐츠 영역을 지정합니다.
  • .aside :
    문서의 주요 부분을 표시하고 남은 콘텐츠 영역(곁가지 메뉴 따위)을 지정합니다.
  • .spot :
    강조하는 상위 콘텐츠이며 항상 #container 에 종속될 필요는 없습니다.
  • .path :
    현재 페이지의 경로를 지정합니다. 보통 #container 또는 #content 에 종속됩니다.
  • 네비게이션 요소를 지정합니다. .gnb, .lnb, .snb 등 어떤 영역 내부에 하나 또는 복수의 네비게이션 요소가 존재할 때 .*nav* 클래스를 지정합니다. '*' 표시는 다른 단어 또는 숫자와 조합할 수 있다는 의미 입니다.
  • .*section* :
    콘텐츠를 분할하거나 그룹핑 하는 블럭 입니다. 보통 #content 내부에 배치한 다음 heading 태그(h1~h6)와 함께 사용하는 것을 권장합니다. '*' 표시는 다른 단어 또는 숫자와 조합할 수 있다는 의미 입니다.
  • .article :
    기사 또는 포스트와 같이 기술된 내용의 콘텐츠를 지정합니다.
  • .ad :
    광고 또는 배너를 지정합니다.
  • etc :
    여기서 기술하지 않은 id/class 네이밍은 이하 'id/class 생성 및 네이밍 가이드'에 따릅니다.

3. id/class 선택자 네이밍 가이드

▲Top
  • id는 화면을 분할 하거나 동적 UI를 구현해야 하는 경우에만 생성합니다. id사용이 필수적으로 요구되지 않는 요소는 class를 생성합니다.
  • 영문 소문자만 사용 가능하며 숫자언더바(_) 사용이 가능합니다. 영문 대문자 및 기타 언어와 특수문자는 사용하지 않습니다.
  • 가능하다면 의미에 적합하고 직관적인 하나의 단어를 사용하고, 화면 배치 또는 시각적 효과를 의미하는 단어의 선택은 지양합니다.
  • 2개 이상의 단어를 조합하는 경우 언더바(_)로 연결합니다. 단어와 숫자를 조합하는 경우 언더바(_)를 생략합니다.
  • 숫자로 시작할 수 없으며 숫자의 증가는 "1" 부터 시작됩니다. 숫자가 없는 단어는 통상 "1" 이라는 숫자가 생략된 것으로 간주합니다.
    .nav01 (X) 클래스 이름을 이용한 스크립트 작성시 1~9까지 예외적으로 "0"을 추가해야 하므로 구현 이슈 발생
    .nav1 (O)
  • 두문자어 또는 약어를 사용하더라도 직관적으로 이해할 수 있는 경우 단어를 축약할 수 있습니다.
  • 보편적인 이름을 지닌 class는 항상 충돌 가능성이 존재하므로 가급적 부모 선택자에 종속 시킵니다.
    (△) .more 라는 클래스 이름을 더 이상 사용할 수 없음
    .more {...}

    (O) .more 라는 클래스 이름을 여러번 재 사용할 수 있음
    .section .more {...}
    .aside .more {...}
  • 모든 영역에 동일한 표현으로 재 사용되는 전역 스타일인 경우 다른 선택자에 종속시키지 않습니다.
    .gnb fieldset{border:none;} (△) 전역 스타일을 특정 영역에 종속시켜 재 사용성이 떨어짐
    fieldset{border:none;} (O) 보통의 경우 fieldset을 이용하여 border를 표현하지 않으므로 어떤 선택자에도 종속시키지 않음

4. Image 네이밍 규약

▲Top

아래 제시된 종류의 이미지 이름들은 각각의 목적에 맞는 형태로 사용될 수 있도록 예약되어 있습니다. 아래 표현들은 다른 목적으로 사용하거나 독창적인 형태로 변형하여 사용하지 않습니다. "*" 표시는 해당 이미지의 의미나 상태를 가장 잘 표현할 수 있는 단어로 치환하거나 또는 생략할 수 있습니다. 네이밍의 순서는 '대분류-중분류-소분류' 또는 '형태-의미-상태' 순입니다. 동일한 용도의 이미지가 여러개인 경우 마지막 단어에 숫자를 붙여서 다르게 네이밍 합니다.

분류 예약어 설명 권장표현
형태 형태+의미+상태
제목 h*_* h_* 불특정 레벨의 제목 제목 태그로 마크업되는 이미지 요소. 전경
h1_* 제목 1
h2_* 제목 2
h3_* 제목 3
h4_* 제목 4
h5_* 제목 5
h6_* 제목 6
문장 p_* p_* 문장 통상 p 요소로 마크업되는 이미지 형태의 텍스트. 전경
네비게이션 gnb_* gnb_* 글로벌 네비게이션 목적의 버튼 또는 탭. 전경
lnb_* lnb_* 로컬
snb_* snb_* 사이드
tab_* tab_* gnb, lnb, snb에 포함되지 않으며 탭으로 분류되는 버튼 또는 버튼의 배경. 전경/배경
버튼 btn_* btn_list_* 목록 모든 종류의 버튼. 전경
btn_read_* 읽기
btn_write_* 쓰기
btn_modify_* 수정
btn_delete_* 삭제
btn_reply_* 답변
btn_cancel_* 취소
btn_search_* 검색
btn_find_* 찾기
btn_registeration_* 등록
btn_confirm_* 확인
btn_submit_* 전송
btn_upload_* 업로드
btn_download_* 다운로드
btn_install_* 설치
btn_file_* 파일
btn_stop_* 정지
btn_play_* 실행
btn_prev_* 이전
btn_next_* 다음
btn_up_* 위로
btn_down_* 아래로
btn_zip_* 우편코드찾기
btn_go_* 페이지 이동
btn_refresh_* 새로고침
btn_open_* 열기
btn_close_* 닫기
btn_zoom_* 확대
btn_reduction_* 축소
btn_spread_* 펼치기
btn_unfold_* 접기
btn_lock_* 잠금
btn_unlock_* 해제
박스 bx_* bx_*_top 상단 상자의 선과 모서리 표현. 배경
bx_*_mid 중앙
bx_*_btm 하단
bx_*_lt 좌상단
bx_*_rt 우상단
bx_*_lb 좌하단
bx_*_rb 우하단
블릿 bu_* bu_square 사각 의미를 포함하지 않는 장식적 bullet/icon 표현. 배경
bu_circle 원형
bu_arrow 화살
bu_star
아이콘 ico_* ico_num* 숫자 의미를 포함하는 장식적 icon 표현. 전경
ico_english_* 영문
ico_korean_* 한글
ico_japanese_* 일어
ico_chinese_* 중어
ico_attention 주의
ico_up 상향
ico_down 하향
ico_point_star 별점
ico_star
ico_new 신규
ico_update 업데이트
ico_reply 댓글
ico_target_blank 새창
line_* line_h 수평 보통 콘텐트를 구분하기 위한 목적의 실선 또는 점선. 배경
line_v 수직
line_s 슬래시
line_bs 역슬래시
line_h_dot 수평 점선
line_v_dot 수직 점선
배경 bg_* bg_body 전체 블릿, 버튼, 선 종류 이외의 배경처리 이미지. 보통 일러스트. 배경
bg_head 상단
bg_container 콘테이너
bg_spot 스팟
bg_footer 풋터
bg_lnb 로컬 네비게이션
상태변화 *_off
*_over
*_on
tab_*_off 비활성 비활성/오버/활성 상태에 대한 표현. 전경/배경
tab_*_over 오버, 포커스
tab_*_on 활성
광고 ad_* ad_* 광고 모든 종류의 배너 광고. 전경
임시 @* @thumb 썸네일 통상 DB에서 불러오게되는 임시 이미지 요소. 전경
@photo 사진
@ad 광고

5. Image 네이밍 가이드

▲Top
  • 명명 순서 :
    큰 범주의 분류에서 작은 범주의 분류 순으로 명명합니다. 분류는 가급적 3단계를 초과하지 않도록 합니다. '대분류_중분류_소분류' 또는 '형태-의미-상태' 순으로 명명합니다.
    추천베스트
    on_recommend_tab1.gif (X)
    tab1_recommend_on.gif (O) 탐색기에서 탭메뉴끼리 정렬되므로 빠르게 찾을 수 있습니다
  • 단어 선택 :
    최대한 직관적이어야 하고 짧을수록 좋습니다. 가능하다면 이미지의 대체텍스트 역할을 수행할 수 있는 네이밍을 우선적으로 고려합니다.
    검색
    btn.gif (X) 어떤 의미의 버튼인지 직관성이 떨어집니다
    btn_search_naver_mail.gif (X) 직관적이지만 지나치게 깁니다
    bnms.gif (X) 너무 짧아서 의미를 유추하기 어렵습니다
    btn_search_mail.gif (O) 적당히 짧으면서도 직관적입니다
  • 허용 문자 :
    영문 소문자(abc)와 숫자(123) 및 언더바(_) 사용이 가능합니다. 영문 대문자 및 기타 언어와 특수문자는 사용하지 않습니다.
    Btn_Search.gif (X) 대문자가 사용되었습니다
    btn-search.gif (X) 언더바 이외의 특수문자가 사용되었습니다
    btn_search.gif (O)
  • 조합 규칙 :
    '단어+단어', 또는 '숫자+숫자'는 언더바(_)로 조합합니다. 단어와 숫자를 조합하는 경우 언더바(_)는 생략합니다.
    tab1recommendon.gif (X) 단어 사이를 언더바로 조합하지 않아서 판독성이 떨어집니다
    tab_1_recommend_on.gif (X) 단어와 숫자 사이의 언더바가 생략되지 않았습니다
    tab1_recommend_on.gif (O) 단어 사이는 언더바로 조합하고 단어와 숫자 사이의 언더바는 생략 하였습니다
  • 숫자 규칙 :
    숫자로는 시작할 수 없으며 숫자의 증가는 "1" 부터 시작됩니다. 숫자가 없는 단어는 통상 "1" 이라는 숫자가 생략된 것으로 간주합니다. 단, "01" 형식으로 시작되는 예외상황도 있을 수 있습니다.
    1btn_search.gif (X) 숫자로 시작되어 이미지의 용도와는 관계없이 탐색기에 정렬됨
    num01.gif (△) 클래스 이름을 이용한 스크립트 작성시 1~9까지 예외적으로 "0"을 추가해야 하므로 구현 이슈 발생하나 예외상황 허용
    btn_search1.gif (O) 동일한 의미를 지닌 이미지가 여러개인 경우 숫자를 붙여서 구분 합니다
    btn_search.gif (O) 동일한 의미를 지닌 이미지가 없다면 숫자는 생략 합니다

 

Posted by 1010
98..Etc/velocity2009. 3. 23. 15:10
반응형

Velocity의 Developer's Guide를 따라하면서 정리해본것 입니다.


Download(다운로드)

우선 Velocity 배포본을 다운로드 받는다.

그리고 Ant 를 다운받는다.


Dependencies(의존성)

개발을 위해서는 Java 2 Standard Edition SDK (Software Development Kit)이 필요하고,

Velocity를 실행시키기 위해서는 Java 2 Standard Edition RTE (Run Time Environment)이 필요하다.(물론 RTE 대신에 SDK를 사용하는것도 가능하다.)


Velocity는 다음 세가지의 패키지에 의존성을 가지고 있다.

Jakarta Commons Collections - 반드시 필요함.

Jakarta Avalon Logkit - 선택적이지만 Velocity에서 파일기반의 logging을 위해서는 필요하다.

Jakarta ORO - 선택적이지만 org.apache.velocity.convert.WebMacro 템플릿 변환 툴을 사용하기 위해서는 필요하다.

이 패키지들은 build/lib 폴더안에 넣거나 classpath에 추가하면 된다.


How Velocity Works(Velocity는 어떻게 움직이는가)

Velocity를 사용하여 어플리케이션이나 서블릿을 개발할 때는 보통 다음과 같은 과정을 거친다.


1. Velocity의 초기화

2. Context 객체의 생성

3. Context에 사용자의 데이터 객체(data objects)를 추가한다.

4. 템플릿을 선택한다.

5. 산출물(output)을 만들기 위해 템플릿과 사용자의 데이터를 병합(Merge)한다.


code로 이 과정을 표현하면 다음과 같다.

이 파일은 org.apache.velocity.app.Velocity.java 인데, 실제 자신이 어플리케이션을 개발할 때에도 이러한 패턴으로 작성하면 된다.

import java.io.StringWriter; 
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.MethodInvocationException;
Velocity.init(); // 1.Velocity의 초기화  
VelocityContext context = new VelocityContext(); 
// 2.Context의 생성
context.put( "name", new String("Velocity") ); 
// 3. Context에 사용자의 데이터 객체(data objects)를 추가한다.


Template template = null;
try { 
template = Velocity.getTemplate("mytemplate.vm");
// 4. 템플릿을 선택한다.
} catch( ResourceNotFoundException rnfe ) {
// couldn't find the template
} catch( ParseErrorException pee ) {
// syntax error : problem parsing the template
} catch( MethodInvocationException mie ) {
// something invoked in the template
// threw an exception
} catch( Exception e ) {}
StringWriter sw = new StringWriter(); 
template.merge( context, sw ); 
// 5. 산출물(output)을 만들기 위해 템플릿과 사용자의 데이터를 병합(Merge)한다.
figure 1. velocity의 작동 과정의 예
 

The Context(컨텍스트)

Velocity에서 Context 라는것은 가장 핵심의 요소면서, 시스템의 부분들사이에서 데이터를

손쉽게 이동시킬 수 있는 일종의 컨테이너(Container)다.

즉, 이말은 Context가 실제 Java Layer와 Template Layer간의 데이터를 주고 받을 때, 그 운반체의 역할을 한다는 말과 같다.

Context는 Java의 Map과 같은 형태를 취한다. key-value의 쌍으로 구성되기 때문에,

Java에서 일반적으로 사용되는 Map을 다룰때와 같이 다루면 된다.


Velocity Template Language(밸로시티 템플릿 언어)

VTL은 Template에서 사용되는 Velocity 고유의 언어를 의미한다.

실제 Template파일을 열어서 코드를 보면 따로 설명을 하지 않아도 충분히 이해할 수 있을만큼 간단한 형태를 보여준다.

example중에서 app_example1의 example.vm을 열어보면 다음과 같은 코드를 볼 수 있다.


## This is an example velocity template

#set( $this = "Velocity")

$this is great! but it's so hard.

#foreach( $name in $list )
    $name is great!
#end

#set( $condition = true)

#if ($condition)
    The condition is true!
#else
    The condition is false!
#end   


figure 2. template의 예

 

 

References(참조형)

variables(변수) - Velocity에서 변수는 다음과 같이 $를 먼저 쓰고 그 뒤에 식별자를 적어주는 방식으로 사용한다.

$foo


property(특성) - 프로퍼티도 다음과 같이 $다음에 식별자를 쓰고, 마침표(.)후에 다시 식별자의 형태로 사용한다.

$foo.name


method(메소드) - 메소드도 역시 $다음에 식별자를 쓰고, 마침표(.)후에 호출할 메소드의 이름을 적는다.

$foo.getName()


Directives(지시형)

#set - reference의 값을 설정한다.

#if/elseif/else - 조건문 제어

#foreach - 반복문 제어

#include - velocity로 파싱(parsing) 되지 않은 파일의 출력

#parse - velocity로 파싱(parsing) 된 파일 출력

#stop - template 엔진의 정지

#macro - 반복적으로 사용할 vm 정의


Comment(주석)

## - 한줄짜리 주석

#* ... *# - 여러줄짜리 주석


The Examples(예제)
Velocity 배포본의 디렉토리 구조는 다음과 같다.

figure 3. velocity 배포본의 디렉토리 구조


일단 실제 Velocity의 소스를 볼 수는 없고 Velocity가 무엇인지 맛부터 보는것이 좋을것이다.

그래서 필요한것이 바로 examples를 이용하는 것이라고 볼 수 있겠다.

우선 앞서 다운받은 Ant가 설치가 되어있어야 한다. Ant의 설치는 별다른게 아니라

압축을 풀고, 자신이 원하는 위치에 이 Ant디렉토리를 위치시킨 다음에

classpath에 ANT_HOME의 이름으로 Ant디렉토리를 등록시켜주면 된다.

(물론 path에 %ANT_HOME%\bin도 추가해줘야한다.)


콘솔창을 이용하여, build 디렉토리로 이동해서

ant examples 명령어를 주면 무언가 작업이 일어난다.

(win98은 실행창에서 command를, nt,2000,xp는 cmd를 입력하면 콘솔창이 뜬다.)

이 명령어가 하는 일은 examples 폴더에 있는 모든 파일을 컴파일 해주는 역할을 한다.

우선 가장 손쉬운 예제부터 보도록 하자.

앞서 얘기가 나온 app_example1부터 살펴보자.



figure 4. 예제 app_example1의 디렉토리 구조


이 예제를 실행시켜보면 다음과 같은 화면이 출력된다.

 
figure 5. 예제 app_example1의 실행 결과
 
-- 이후 작성중 --
네이버

최초작성일 : 2005-02-22

최종수정일 : 2005-02-23

 

이번에는 웹어플리케이션 예제를 한번 분석해보려고 합니다.

다음번에는 이 예제를 조금 더 발전시켜보는 방향으로 해보죠

 

일단 velocity에서 제공해주는 예제중에서 forumdemo라는 예제를 분석해보도록 하겠습니다.

기능은 간단한 forum의 기능을 제공해주는 작은 어플리케이션입니다.

물론 DB는 사용하지 않습니다.

이 어플리케이션은 다음과 같은 폴더 구조를 가지고 있습니다.

 

 

우리가 중요하게 봐야할 곳은 template폴더의 vm들과 WEB-INF/web.xml, WEB-INF/conf/velocity.properties 그리고 소스파일들이지요.

 

template은 명칭 그대로 템플릿을 모아둔 폴더 입니다.

list.vm은 message들의 목록을 출력할 때 쓰이는 템플릿이고,

reply.vm은 해당 message에 reply할 때 사용되는 템플릿이며,

view.vm은 해당 message와 그 하위의 reply들을 화면에 출력할 때 사용되는 템플릿입니다.

 

일단 예제를 한번 돌려보면서 해보는게 좋겠지요?

이전에 ant examples를 했다면 아마도 forumdemo도 모두 컴파일이 되어 있을겁니다.

(안하셨다면 이전 게시물을 참고하시기 바랍니다.)

이 forumdemo폴더 자체를 tomcat이설치된폴더/webapp 밑으로 복사를 합니다.

(물론 ant를 이용하여 자동으로 deploy해도 되겠지만 지금은 일단 복사하는 방법을 선택합니다.)

 

tomcat을 기동하고, 브라우저창에 http://localhost:8080/forumdemo 를 입력하시면 다음과 같은 화면이 나옵니다. 아무거나 클릭을 해볼까요?

 

당황스럽게도 404에러, 즉 페이지를 찾을 수 없다는 에러가 나는데, 이것은 web.xml에서 servlet을 mapping시켜주지 않아서 생기는 현상입니다.

 

 

WEB-INF/web.xml 파일에 다음을 추가시켜 줍니다.

<servlet-mapping>
        <servlet-name>forum</servlet-name>
        <url-pattern>/servlet/forum</url-pattern>
</servlet-mapping>

 

자 tomcat을 재시작 시킨후에 다시 한번 아무 메뉴나 클릭해봅시다.

 

 

이번에는 500에러가 나타납니다. 왜그럴까요? 에러로그를 잘 살펴보시면 template을 가져오지 못했기 때문에 에러를  발생시킨것을 알 수 있습니다.

이것도 역시 WEB-INF/web.xml파일이 잘못되어 있어서 발생하는 현상입니다.

<init-param>
        <param-name>properties</param-name>
        <param-value>/WEB-INF/conf/velocity.properties</param-value>
</init-param>

를 다음과 같이 바꿔줍니다.

 

<init-param>
        <param-name>org.apache.velocity.properties</param-name>
        <param-value>/WEB-INF/conf/velocity.properties</param-value>
</init-param>

 

다시 tomcat을 재시작한 후에 클릭해보면 제대로 나오는것을 확인 할 수 있습니다.

일단 예제가 돌아가기 시작하고 있으니 이제 실제적으로 이 어플리케이션을 분석해보도록 하겠습니다.

 

이 어플리케이션은 모든 서블릿요청은 org.apache.velocity.demo.ControllerServlet 이 담당합니다.

get방식으로 parameter를 받아서 그에 해당하는 action을 org.apache.velocity.demo.action 하위의 클래스들로 실행시켜주는 것이지요.

 

ControllServlet.java

(import는 생략했습니다.)

 

public class ControllerServlet extends VelocityServlet

{
    private static String ERR_MSG_TAG = "forumdemo_current_error_msg";

   
    /**
     *  template path에 대한 정보를 가져오기 위한 메소드 입니다.
     */

    protected Properties loadConfiguration(ServletConfig config )
        throws IOException, FileNotFoundException
    {
        String propsFile = config.getInitParameter(INIT_PROPS_KEY);
       
        /*
         *  webapp root에 대한 절대경로를 통해서 template파일의 위치를 찾습니다.

         *  tomcat과 같은 servlet 2.2 이상의 지원하는 container에서 가능하다고 하네요.
         */

        if ( propsFile != null )
        {
            String realPath = getServletContext().getRealPath(propsFile);
       
            if ( realPath != null )
            {
                propsFile = realPath;
            }
        }
       

       // 설정파일을 load합니다. 500에러가 발생했던 이유가 여기에 있는거지요.

       // 내부적으로는 org.apache.velocity.properties로 정의되어 있었는데,

       // web.xml에서는 properties로 정의되어 있었기때문에 찾지못해서 에러가 발생했던 것이죠.
       Properties p = new Properties();
       p.load( new FileInputStream(propsFile) );
     

       /**
        *  template의 경로와 log의 경로를 설정합니다.

        */

       // 설정파일에 정의되어있는 resource loader(차후에 다시 얘기나옵니다.)의 경로(path)를 찾아서 실제 경로로 바꾸어 다시 정의합니다. [file.resource.loader.path = /template]

       String path = p.getProperty("file.resource.loader.path");

       if (path != null)
       {
           path = getServletContext().getRealPath( path );
           p.setProperty( "file.resource.loader.path", path );
       }
       

       // 역시 설정파일에 정의되어있는 runtime.log의 경로를 실제 경로로 바꾸어 다시 설정합니다. [runtime.log = /forumdemo_velocity.log]
       path = p.getProperty("runtime.log");

       if (path != null)
       {
           path = getServletContext().getRealPath( path );
           p.setProperty("runtime.log", path );
       }

       return p;
    }


    /**
     * 서블릿을 제어하기 위해서 VelocityServlet의 handleRequest메소드를 확장하여 사용합니다.

     * @param VelocityServlet에서 생성된 Context

     * @return template
     */

    public Template handleRequest( Context ctx )
    {
        HttpServletRequest req = (HttpServletRequest)ctx.get(VelocityServlet.REQUEST);
        HttpServletResponse resp = (HttpServletResponse)ctx.get(VelocityServlet.RESPONSE);
        Template template = null;
        String templateName = null;
       
        HttpSession sess = req.getSession();
        sess.setAttribute(ERR_MSG_TAG, "all ok" );

        try
        {
            // processRequest를 통해서 파라미터의 command(list, reply 등등)에 해당하는

            // template의 이름을 받아옵니다.
            templateName = processRequest( req, resp, ctx );
            // template이름을 이용하여 template을 가져옵니다.
            template  = getTemplate( templateName );
        }
        catch( ResourceNotFoundException rnfe )
        {
            String err = "ForumDemo -> ControllerServlet.handleRequest() : Cannot find template " + templateName ;
            sess.setAttribute( ERR_MSG_TAG, err );
            System.out.println(err );
        }
        catch( ParseErrorException pee )
        {
            String err = "ForumDemo -> ControllerServlet.handleRequest() : Syntax error in template " + templateName + ":" + pee ;
            sess.setAttribute( ERR_MSG_TAG, err );
            System.out.println(err );
        }
        catch( Exception e )
        {
            String err = "Error handling the request: " + e ;
            sess.setAttribute( ERR_MSG_TAG, err );
            System.out.println(err );
        }

        return template;
    }
   
    /**
     * command패턴을 이용하여 request에서 넘어온 command에
 해당하는 template의 이름을 반환합니다.

     * 각 command는 org.apache.velocity.demo.action의 하위의 클래스들에 구현되어 있습니다.

     * exec메소드에 각 command가 담당한 부분에 대한 처리가 들어있습니다.

     * 메세지들을 context에 담는다던지하는 것들 말이지요...
     * @param the request
     * @param the response
     * @param the context
     * @return 사용할 템플릿의 이름
     */
    private String processRequest( HttpServletRequest req, HttpServletResponse resp, Context context )
     throws Exception
    {
        Command c = null;
        String template = null;
        String name = req.getParameter("action");
       
        if ( name == null || name.length() == 0 )
        {
            throw new Exception("Unrecognized action request!");
        }
               
        if ( name.equalsIgnoreCase("list") )
        {
            c = new ListCommand( req, resp);
            template = c.exec( context );
        }
        else if ( name.equalsIgnoreCase("post") )
        {
            c = new PostCommand( req, resp );
            template = c.exec( context );
        }
        else if (  name.equalsIgnoreCase("reply") )
        {
            c = new ReplyCommand( req, resp );
            template = c.exec( context );
        }
        else if (  name.equalsIgnoreCase("postreply") )
        {
            c = new PostReplyCommand( req, resp );
            template = c.exec( context );
        }
        else if ( name.equalsIgnoreCase("view") )
        {
            c = new ViewCommand( req, resp );
            template = c.exec( context );
        }
        return template;
    }


    /**
     *  에러가 발생했을때 브라우저 상에 출력하기 위한 메소드입니다.

     *  VelocityServlet의 error메소드를 override하여 사용합니다.

     */
    protected  void error( HttpServletRequest request, HttpServletResponse response, Exception cause )
        throws ServletException, IOException
    {
        HttpSession sess = request.getSession();
        String err = (String) sess.getAttribute( ERR_MSG_TAG );

        StringBuffer html = new StringBuffer();
        html.append("<html>");
        html.append("<body bgcolor=\"#ffffff\">");
        html.append("<h2>ForumDemo : Error processing the request</h2>");
        html.append("<br><br>There was a problem in the request." );
        html.append("<br><br>The relevant error is :<br>");
        html.append( err );
        html.append("<br><br><br>");
        html.append("The error occurred at :<br><br>");

        StringWriter sw = new StringWriter();
        cause.printStackTrace( new PrintWriter( sw ) );

        html.append( sw.toString()  );
        html.append("</body>");
        html.append("</html>");
        response.getOutputStream().print( html.toString() );
    }
}

 

네이버

최초작성일 : 2005-02-23

최종수정일 : 2005-02-25


이번엔 command 클래스들과 om패키지를 조금 살펴볼까 합니다.

이전에 말했듯이 command의 구현체들은 org.apache.velocity.demo.action 패키지안에 있습니다.



command.java의 경우에는 하위 command들을 위한 abstract class(추상클래스)입니다.

우선 ListCommand를 살펴보겠습니다. 생각보단 짧죠?


public class ListCommand extends Command
{
    /** template의 이름을 정의해 둡니다. */
    public static final String LIST = "list.vm";

    // 나중엔 이 변수에 담길 template의 이름을 DB에서 가져오거나 parameter로 받으면 되겠죠?
   

    // 생성자겠지요?
    public ListCommand( HttpServletRequest req, HttpServletResponse resp )
    {
        super( req, resp );
    }
   
    /**
     * 메세지들을 가져와서 context에 담습니다. 이때 메세지들은 Vector의 형태로 묶여 있게 됩니다.
     */
    public String exec( Context ctx )
    {
        Object[] list = ForumDatabase.listAll(); // 메세지를 가져오는 부분입니다.
       
        if ( list == null || list.length == 0 )
        {
            ctx.put("hasMessages", Boolean.FALSE );   
        }
        else
        {
            ctx.put("hasMessages", Boolean.TRUE );
            ctx.put("listall", list ); // 메세지가 존재하면 해당 메세지 list를 context에 담습니다(put)
        }
       
        return LIST; // 그리고 해당하는 템플릿의 이름을 반환해 줍니다.
    }
}


간단하지 않습니까?

사실상 이녀석이 하는 일은 context에 db클래스에서 뽑아낸 정보들을 담는역할밖에 없으니까요.

이 역할자체는 나머지 command 클래스들에서도 공통적으로 나타납니다.

(당연한거겠지요-_-;;)

PostCommand.java를 한번 살펴보겠습니다.

다른곳이라곤 exec메소드 뿐입니다.(이 역시 당연한거겠죠?)


public String exec( Context ctx )
    {

        // 변수에 넘겨받은 값들을 정의합니다.
        String name = request.getParameter("name");
        String subject = request.getParameter("subject");
        String email = request.getParameter("email");
        String content = request.getParameter("content");
       

        // 메세지 객체를 만들고 앞에서 설정한 변수를 이 객체에 담습니다.
        Message message = new Message();
        message.setName( name );
        message.setSubject( subject );
        message.setEmail( email );
        message.setContents( content );
       

        // Database 클래스에 메세지객체를 저장합니다.
        ForumDatabase.postMessage( message );
       

        // 메세지를 저장한 후에 보여줄 화면을 List로 정의하고 있기 때문에

        // list를 생성하여 context에 담습니다.

        Object[] list = ForumDatabase.listAll();
       
        ctx.put("listall", list );
        ctx.put("hasMessages", Boolean.TRUE );
        // 그리고 ListCommand의 List 즉 list.vm을 반환해줌으로써 보여줄 화면을 list.vm으로 설정하게 됩니다.
        return ListCommand.LIST;
    }


ListCommand에서는 말씀드렸던것처럼 db클래스에서 데이터를 가져오는 역할을 했습니다.

PostCommand의 경우에는 메세지를 작성할 때 사용하는 클래스인데, 기본적으로

parameter로 받은 정보들을 message객체에 set하고 그것을 db클래스에 저장하는 역할을 하고 있습니다.


나머지 클래스들도 같은 방법으로 동작하고 있기 때문에 추가적인 설명은 하지 않겠습니다.

Command클래스의 이름으로 대충 파악하실수 있을꺼라 생각합니다.


org.apache.velocity.demo.om 패키지에 있는 두 클래스가 실제적으로 persistence layer를 맡고 있습니다.

Message 클래스는 설명이 필요 없는 Bean 클래스입니다.(실제 소스를 보시면 아시겠지만 set/get만을 하고 있는 클래스입니다)

한가지 특이할만한 점이라고 하면, 한 메세지에 달리는 덧글들은 해당하는 메세지가 가지고 있다는 것입니다.

이는 소스에서 살펴보실수 있듯이 Reply을 Vector형태로 가지고 있기 때문에 가능하게 되는 것입니다.

바로 이 부분이죠. private Vector replies = null;


ForumDatabase는 HashTable에 사용자가 작성한 메세지를 key/value 방식으로 담고 있습니다.

따라서 클래스가 하는 작업은 HashTable에 메세지를 넣고, 빼고, 리스트 정도가 있습니다.


ForumDatabase.java

public class ForumDatabase
{
    private static Hashtable messages = new Hashtable(); // 메세지를 저장할 HashTable
    private static int nextId = 0; // key값입니다. 0부터 시작합니다.
    private static ForumDatabase me = null;
   
    /** 생성자 */
    private ForumDatabase()
    {}
   
    /**
     * 신규 메세지 작성

     */
    public static synchronized void postMessage( Message message )
    {
        Integer nextNumber = new Integer( nextId++ ); // 기존의 key 값에 +1을 해줍니다.

        message.setId( nextNumber ); //  메세지의 key값으로 설정합니다.
        messages.put( nextNumber,  message ); // HashTable에 key와 message를 담습니다.
    }
   
    /**
     * 저장되어 있는 모든 메세지들의 리스트를 반환합니다.

     */
    public static Object[] listAll()
    {
        return messages.values().toArray();
    }
   
    /**
     * 특정한 한 메세지를 가져옵니다.

     */
    public static synchronized Message getMessage( String index )
    {

        // HashTable에서 넘겨받은 key으로 해당하는 메세지를 찾아서 반환합니다.
        return (Message)messages.get( new Integer( index ) );
    }
   
    /**
     * 메세지에 덧글을 추가합니다.
     */
    public static synchronized void postReply( Message reply, String parent )
    {
        Message thread = getMessage( parent );
        thread.addReply( reply );
    }

Posted by 1010
98..Etc/Etc...2009. 3. 23. 13:28
반응형
치환함수에 대해서 알아봅니다.

JavaScript

먼저 자바스크립트에서 문자열 치환방법입니다.
<script language="JavaScript">
str = "대니를 바꿔버립시다."
re = "대니"
newstr = str.replace(re, "전성대");
document.write(newstr)
</script>
출력결과 : 전성대를 바꿔버립시다.

ASP

이번엔 ASP에서 치환을 해봅시다.
<%
str = "대니를 바꿔버립시다."
re = "대니"
newstr = replace(str,re,"전성대")
response.write newstr
%>
출력결과 : 전성대를 바꿔버립시다.

PHP

이번엔 php에서의 문자열 치환입니다.
<?
$str = "대니를 바꿔버립시다.";
$re = "대니";
$newstr = str_replace("대니","전성대",$str)
echo ($newstr);
?>
출력결과 : 전성대를 바꿔버립시다.

JSP

이번엔 jsp에서의 문자열 치환입니다.
<%
String usf_replace(String src, String oldstr, String newstr) {
          if (src == null) return null;

          StringBuffer dest = new StringBuffer("");
          
          try {
                      int  len = oldstr.length();
                      int  srclen = src.length();
                      int  pos = 0;
         
            int  oldpos = 0;

                      while ((pos = src.indexOf(oldstr, oldpos)) >= 0) {
                                  dest.append(src.substring(oldpos, pos));
                                  dest.append(newstr);
                                  oldpos = pos + len;
                      }

                      if (oldpos < srclen)
                                  dest.append(src.substring(oldpos, srclen));
                      
          } catch ( Exception e ) {
                      e.printStackTrace();
          }
          return dest.toString();
}

결과 =  usf_replace( "대니를 바꿔버립시다.", "대니", "전성대");
%>
출력결과 : 전성대를 바꿔버립시다.
Posted by 1010
98..Etc/SVN2009. 3. 19. 14:55
반응형
Posted by 1010
98..Etc/Etc...2009. 3. 18. 14:17
반응형
웹개발 문서 모음

웹사이트 개발시에 필요한 문서 목록입니다.
해당 문서목록의 의견,문제점,궁금하신 점은 Q&A게시판에 올려주십시요.
공유를 원하는 유용한 웹개발문서를 받고 있습니다. 많이 많이 여기로 보내주세요.(다양한 업종의 스토리보드와 제안서 강추)

Q : 파일 다운로드시 한글파일의 경우 다운로드 되지 않거나 글자가 깨집니다.
A : 익스플로러 "도구 > 인터넷 옵션 > 고급 "에서 고급 UTF8옵션 해제하시면 됩니다.

웹로그분석 WSOS

* 버전 : v2.0
* 최종수정일자 : 2008.09.24 10:05:44

Posted by 1010
98..Etc/SVN2009. 3. 10. 12:41
반응형

09 서브버전(Subversion) 윈도우 서버 설치

원문 : http://kkamagui.springnote.com/pages/585605


들어가기 전에...


0.시작하면서...

 개발자라면 한번쯤 소스 관리에 대해서 고민해 봤을 것이다. 특히나 수정이 잦은 프로그램이라면 더욱 더 버전 관리가 중요한데, 이걸 일일이 폴더나 날짜별로 관리하다가는 낭패를 보기 십상이다. 그래서 버전관리 프로그램을 사용하는데, 대표적인 것으로 소스세이프(Source Safe), CVS, Subversion 있다.

 윈도우 프로그래머라면 소스세이프가 굉장히 유용한데(Visual Studio를 설치하면 자동으로 깔리므로... ㅡ_ㅡa..), 사용해보니 속도가 무지 느리고 VC 또한 한참 뒤에 뜨게하는 무시무시한 단점이 있어서 다른 것을 찾다가 서브버전을 선택하게 되었다.

 서브버전의 장점은 인터넷에 잘 나오므로 굳이 이야기하지 않겠고, 실제 윈도우 버전 설치 및 설정에 대해서 알아보자.


1.Tortoise 서브버전(Subversion) 클라이언트 설치

1.1 Tortoise 서브버전(Subversion) 클라이언트 다운로드

 서브버전 서버를 설치한다면서 왜 클라이언트를 설치하는 것일까? 그것은 서버 설치후 나머지 작업을 편리하게 할 수 있기 때문이다.

 서브버전 클라이언트는 http://tortoisesvn.net/downloads 에서 다운 받을 수 있다.

Subversion9.PNG

<Tortoise 서브버전 클라이언트>


1.2 Tortoise 서브버전(Subversion) 클라이언트 설치

 클라이언트 설치는 간단하다. 무조건 "Next" 버튼을 눌러서 완료를 하면 알아서 다 해준다.

Subversion10.PNG 

<Tortoise 서브버전(Subversion) 클라이언트 설치>


 설치 후 탐색기에서 오른쪽 버튼을 클릭했을 때 아래와 같은 메뉴가 뜨면 정상적으로 설치된 것이다.

 Subversion11.PNG

<설치 완료>


2.서브버전(Subversion) 서버 설치

2.1 서브버전(Subversion) 서버 다운로드

 서브버전의 윈도우용 설치 파일은 http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 에서 찾을 수 있다. 위 사이트로 이동하면 아래와 같은 화면을 볼 수 있는데, 최신버전의 설치 파일을 다운받아서 설치하도록 하자.

Subversion1.PNG 

<서브버전 서버 파일 다운로드>


2.2 서브버전(Subversion) 설치

 설치 과정은 아주 간단하다. 윈도우 인스톨 파일을 더블클릭해서 기본 옵션으로 설치하면 된다. "Next" 를 계속해서 클릭하여 완료하자.

Subversion2.PNG 

<인스톨 화면>


--------------------------참고----------------------------------------
 참고..서버 설치후 서버가 시작되었는지 윈도우 서비스에서 확인한다.
윈도우 재시작을 하지 않고 그냥 진행했을 경우...서브버전 서비스가 실행이 안되어서 삽질했음

--------------------------참고  끝------------------------------------

2.3 서브버전(Subversion) 설정

2.3.1 서브버전(Subversion) 데이터 폴더 생성(Repository)

 서버 설치가 끝났으니 데이터를 저장할 폴더를 생성해야한다. 저장소는 하드디스크의 특정 폴더로 하면 되고, 임의의 이름으로 선택 가능하다. 일단 D:\Repository로 해서 생성하자.

Subversion3.PNG

<저장소 생성>


2.3.2 서비스(Service) 등록

 서브버전 서버를 서비스로 등록하여 윈도우 부팅시에 자동으로 실행되도록 하자. 윈도우 서비스 등록은 sc.exe 프로세스로 등록가능하다. cmd.exe를 실행해서 아래와 같이 입력하도록 하자.

 Subversion4.PNG

<서비스 등록>

 아래는 서브버전 서비스를 등록하고 서비스를 해제하는 명령이다.

  • 서비스 등록 : sc create svn binpath= "C:\Program Files\Subversion\bin\svnserve.exe --service -r D:\repository" displayname= "Subversion Server" depend= Tcpip start= auto

  • 서비스 해제 : sc delete svn displayname= "Subversion Server"

 별다른 문제가 없다면 성공적으로 등록했다는 메시지가 출력될 것이다.


2.3.3 방화벽(Firewall) 해제

 서브버전은 TCP 3690 포트와 UDP 3690 포트를 사용한다. 윈도우 방화벽 및 Anti-Virus의 방화벽을 해제하도록 하자.

 아래는 윈도우 방화벽에서 포트를 추가하는 방법이다. TCP와 UDP 각각 등록해서 모두 가능하도록 하자.
Subversion5.PNG

<방화벽 해제>


2.4 저장소(Repository) 생성

 이제 서버 설정이 끝났으니 실제로 소스 또는 데이터를 관리할 저장소(Repository)를 생성해야 한다. 서브버전 관련 데이터는 D:\Repository 에 저장하기로 했으므로 하위 폴더에 저장소를 생성하자.


2.4.1 커맨드 라인(Command Line) 방식

 cmd.exe 를 실행한 뒤 D:\Repository 폴더로 이동하여 아래와 같이 입력한다.

"C:\Program Files\Subversion\bin\svnadmin" create --fs-type fsfs test

 위의 파란색으로 표시된 test를 유의해서 보자. test 대신에 생성을 원하는 폴더명으로 바꿔서 입력하면 된다.

 아래는 위의 명령을 실행한 후 결과 화면이다.

Subversion6.PNG 

<저장소 생성>

2.4.2 Tortois Subversion 클라이언트를 사용한 방식

 Tortois Subversion 클라이언트를 설치했다면 좀더 편한 방법으로 생성할 수 있다. 아래는 Tortoise Subversion 클라이언트를 통해 생성하는 방법이다.

 Subversion7.PNG

<저장소 생성>

 D:\Repository 폴더에 생성할 저장소 이름(Test)의 폴더를 미리 생성한 후 Tortoise Subversion 클라이언트에서 "Create repository here"를 클릭하면 된다.

 파일 시스템을 선택하는 다이얼로그가 뜨면 "Native filesystem(fsfs)"를 선택한 후 OK를 눌러서 생성하면 된다.


2.5 저장소 접근 설정

 저장소를 생성하고 나면 아래와 같은 폴더와 파일들이 생긴다.

Subversion8.PNG

<저장소 폴더 상태>

 이 중에서 접근 권한을 제어하기위해서는 2개의 파일을 손봐야 하는데 다음 항목을 보자


2.5.1 svnserve.conf

  1. ### This file controls the configuration of the svnserve daemon, if you
    ### use it to allow access to this repository.  (If you only allow
    ### access through http: and/or file: URLs, then this file is
    ### irrelevant.)
  2. ### Visit http://subversion.tigris.org/ for more information.
  3. [general]
    ### These options control access to the repository for unauthenticated
    ### and authenticated users.  Valid values are "write", "read",
    ### and "none".  The sample settings below are the defaults.
    anon-access = none     <== 로그인 하지 않은 사용자는 아무것도 못하도록 한다.
    auth-access = write
  4. ### The password-db option controls the location of the password
    ### database file.  Unless you specify a path starting with a /,
    ### the file's location is relative to the conf directory.
    ### Uncomment the line below to use the default password file.
    password-db = passwd   <== ID와 Password를 저장하는 파일 이름
  5. ### The authz-db option controls the location of the authorization
    ### rules for path-based access control.  Unless you specify a path
    ### starting with a /, the file's location is relative to the conf
    ### directory.  If you don't specify an authz-db, no path-based access
    ### control is done.
    ### Uncomment the line below to use the default authorization file.
    #authz-db = authz
  6. ### This option specifies the authentication realm of the repository.
    ### If two repositories have the same authentication realm, they should
    ### have the same password database, and vice versa.  The default realm
    ### is repository's uuid.
    realm = KKAMAGUI Repository   <== 접근했을 때 클라이언트에게 보여줄 저장소 메시지

 위와 같이 파일을 수정한 다음 저장한다.


2.5.2 passwd

  1. ### This file is an example password file for svnserve.
    ### Its format is similar to that of svnserve.conf. As shown in the
    ### example below it contains one section labelled [users].
    ### The name and password for each user follow, one account per line.
  2. [users]
    # harry = harryssecret
    # sally = sallyssecret
    kkamagui = kkamagui

 위와 같이 ID = Password의 형태로 입력한 뒤 저장하면 된다.



3.간단한 서브버전(Subversion) 서버 테스트

 테스트 방법은 간단하다. 탐색기에서 오른쪽 버튼을 눌러서 표시되는 메뉴에서 "Repo-Browser" 를 클릭하여 아래와 같은 창이 뜨면 서브버전 서버가 설치된 주소와 저장소 이름을 같이 입력해주면 된다.

Subversion7.PNG

<Repo-browser 메뉴>


 이제 주소와 저장소의 이름을 입력하자. 주소를 kkamagui.egloos.com, 그리고 저장소를 test라고 가정하고 입력하면 아래와 같이 될 것이다.

Subversion12.PNG 

<서브버전 주소 입력>


"OK" 버튼을 누르면 실제 서버에 접속해서 저장소 정보를 얻어오는데, 아래와 같은 화면이 표시될 것이다. 실제로 정상적으로 접속이 된다면 "test" 항목 아래에 아무것도 표시되지 않을 것이지만 문제가 발생한다면 아래와 같이 에러메시지가 표시될 것이다.

Subversion13.PNG

<Repo-Browser 실행-에러발생>


 위와 같은 에러 메시지가 표시되면 처음 단계부터 설정을 다시 한번 확인하자. 아무런 에러 메시지가 없다면 정상적으로 설치된 경우이므로 열심히 Check-out, commit, update를 반복하면 된다.


4.서브버전(Subversion) 서버를 설치하지 않고 로컬(Local)에서 소스 관리하기

 서브버전 서버가 설치되어있어야 꼭 소스 버전 관리가 가능한 것일까? "답은 그렇지 않다" 이다.

 Tortoise Subversion 클라이언트를 설치했다면 로컬에 저장소를 만들고 file:/// 키워드로 접근하여 소스 버전을 관리하는 것이 가능하다.


4.1 저장소 생성

 위의 "2.4 저장소(Repository) 생성" 부분을 참고해서 로컬에 Tortoise를 이용하여 저장소를 생성하자. 그리고 파일들을 수정해서 특정 유저만 접근가능하도록 수정하자.


4.2 저장소 접근 테스트

 위의 "3.간단한 서브버전(Subversion) 서버 테스트" 부분을 참고하여 "Repo-browser"를 실행하고 주소에 아래와 같이 입력한 후 OK를 누르자.

file:///d:\repository\test

 정상적으로 실행되면 아래와 같은 화면이 표시될 것이다.

 Subversion14.PNG

<Repo-browser 실행>

 아무런 에러가 없으므로 정상적으로 실행되었음을 알 수 있다. 이렇게 함으로써 서버를 설치하지 않고도 로컬에서 소스 버전관리를 할 수 있다.


5.기타 팁

5.1 버전 관리시 무시할 파일 확장자 설정

 소스를 컴파일해서 나오는 object 파일이나 기타 필요없는 부산물들은 버전관리를 할 필요가 없다. 그런 파일들을 일일이 수작업으로 제외하기는 상당히 귀찮은 작업인데, 다행이 Tortoise에서 이것을 편리하게 할 수 있는 옵션이 있다.

 "Settings" 메뉴에 가면 아래와 같은 화면이 표시된다. 여기에 "Global Ignore Pattern" 항목에 무시할 파일의 확장자나 파일명을 입력하면 된다.

*.scc *.sbr *.pch *.pcb *.ilk *.idb *.res *.o *.obj *.ncb *.opt *.plg

Subversion15.png 

<확장자 및 파일명 입력>


6.마치면서...

 이로서 그 지긋지긋하게 느린 소스세이프(SourceSafe)에서 벗어날 수 있게 되었다(이렇게 좋을 수가... ㅜ_ㅜ). 소스 버전 관리를 통해 프로젝트를 보다 효율적으로 관리하고 협업의 능률을 최대한 활용하자. @0@)/~~!!


7.참고 사이트

Posted by 1010
98..Etc/X-internet2009. 3. 10. 10:41
반응형

(쉬프트 정보통신 - 가우스) http://member.shift.co.kr/gauce01.html

(투비 소프트 - 마이플랫폼) http://www.tobesoft.com/new/html/PID&Demo/index.html

(컴스퀘어 - 트러스트폼) http://www.comsquare.co.kr/product/feature.asp

(엘라스틱웨어 - 엔리치클라이언트) http://www.elasticware.com/kr/map.cgi/EnRichClient

_________________________________________________________________________________________________________________________________________________


1. x-internet은 예전 아키텍처에 문제가 있어서 등장했다고 한다. 그렇다면 예전 아키텍처는 어떤문제가 있었나 ?


클라이언트/서버 방식 : 개발자를 위한 개발환경과 최상의 UI기능 구현, 단 덩치가 크고 시스템적으로 유지보수가 어렵다.
WEB 방식 : 시스템 유지보수가 쉬운대신 노가다식 개발환경과 취약한 UI 및 기능성 정리하면 예전 아키텍처는 시스템 유지보수가 쉬우면 개발환경이나 기능성이 취약하고 개발환경이나 기능성이 막강하면 덩치가 커서 유지보수가 어려웠다. 등의 장단점의 차이가 분명했다.


2. 그래서 x-internet 의 등장배경은?
C/S 방식과 WEB 방식의 단점을 극복하기 위해 등장했다.


3. 그럼 명칭이 애매모호한 x-internet의 정의와 장점은 무엇인가?
정의에서 무언가 새로운 개념이 나올것 같았는데 정의는 단순했다.

"x-internet이란 Web 아키텍처와 C/S 아키텍처의 한계를 극복하고 장점만을 수용하기 위한 새로운 인터넷 아키텍처를 의미한다."

단순하게 말해 Web 과 C/S의 장점을 뽑아 새로만든 아키텍처가 x-internet 이라고 한다. 그리고 조금더 들어가면 두가지 뜻이 더 있다.


eXecutable Internet(실행 가능한 인터넷)

- 인터넷 통신과 XML 을 기반으로, 빠르고 작은 모듈들을 사용하여 C/S와 같은 UI를 사용자에서 보여줄수 있는 환경을 말한다.

eXtended Internet(확장된 인터넷)
- 개발환경의 확장성
- 외부모듈과의 인터페이스 확장성
- 멀티 OS를 지원


다시 말해 "WEB과 C/S의 장점만을 골라, C/S와 같은 기능을 인터넷과 XML을 기반으로 가볍고 빠르게 서버에서 사용자에게 제공 하고,
편리한 개발환경과 외부 모듈과의 연동을 통해 확장하기 쉬운 구조를 가진 아키텍처가 x-internet 이다."

라고 정의 할수 있다.

이렇게 x-internet 의 정의가 곧 장점이라고 보면 될것 같다.


4. x-internet은 어떻게 구현하지?
x-internet 에는 대략 3가지 요소가 있다고 정리해 보았다.
- 개발자 : 개발자는 화면과 로직을 개발하여 서버에 올려놓는다.
- 서버 : 서버에서는 각종 화면과 로직과 데이터를 저장하고 사용자의 요청을 다른 서버 로직(JSP,EJB 등) 과 연동하여 처리한다.
- 클라이언트 : 클라이언트는 x-internet 을 사용하기 위한 전용 브라우저, 자동업데이터 등의 구성요소를 설치한다.

서비스 흐름은 사용자가 전용 브라우저로 HTTP 프로토콜등을 통해 서버로 서비스를 요청하면 서버는 화면 XML, 로직 스크립, 데이터 등을 사용자의 전용브라우저로 내려보내고 전용브라우저는 화면 XML 등을 파싱하여 사용자에게 C/S스럽게(?) 보여주는 흐름이다.


5. x-internet 관련 제품 사용효과
정말 효과가 있을까?
우리 회사 : 편리한 개발환경과 확장가능한 구조로 인해 개발 생산성 향상, C/S스럽게(?) 기능을 제공해도 WEB처럼 손쉬운 유지보수 가능,
한마디로 돈은 적게 들이면서 사용자에게 고급스러운 기능 제공 가능하여 사용자의 충성도가 향상되는등의 여러 효과가 있어서
초기 도입/구입 비용이 상쇄 가능할 것이다.
사용자 : 인터넷 HTML상에 구현된 기능의 제약에서 벗어나 C/S 스러운(?) 고급스러운 기능 체험 으로 서비스 만족도가 향상될것이다


6. x-internet 도입이 성공할려면
x-internet 의 장점이 정말 장점이 되야 한다.
- 편리한 개발환경이 정말 편리해야 한다. 처음 개발환경 익힐때 오래걸리고 어느 부분은 오히려 불편하면 곤란하다.
- 확장이 쉽고 유지보수가 정말 편해야 한다. 이런 장점 설명한 제품, 프레임워크가 많지만 막상 자랑대로 되는게 별로 없었다.
- 사용자가 문구 그대로 고급스러운 기능을 써야 한다. 고급스럽다는 기능은 기능도 다양하지만 속도도 빨라야 하는것을 말한다. 기능만 좋고 속도가 느리다면 이것도 문제가 되지 않을까

이 정도로 정리해보았다. 진짜 중요한건 x-internet 을 아는것 보다는 이것을 어떻게 잘써야 x-internet 이 지향하는 효과를 볼수 있을까 를 생각해봐야 되는것 같다.

사용자 삽입 이미지

<클라이언트 기술간의 비용과 생산성 비교>

클라이언트 기술은 과거 메인프레임 시대의 터미널, 클라이언트/서버 환경의 팻 클라이언트, 웹 기반 시스템의 씬 클라이언트로 발전해 왔다.

[그림 1]에서 보듯 클라이언트/서버 환경의 팻 클라이언트, 웹 기반 시스템의 씬 클라이언트로 넘어가면서 애플리케이션에 대한 총비용은 줄어 들었으나(이 부분이 바로 배포에 소요되는 비용이다) 개발 생산성은 오히려 낮아졌다. 즉 서버 측이 더 복잡해지고 유지보수하기 어려워진 것이다. 이제 스마트 클라이언트 기술은 팻 클라이언트가 가진 장점과 씬 클라이언트가 가진 경제성을 동시에 추구할 수 있게 해준다.



[그림 1] 애플리케이션 총비용과 사용자의 생산성 (출처:almnetworks.co.kr)

[출처] X-internet |작성자 hyejin_han

Posted by 1010
98..Etc/Etc...2009. 3. 2. 14:41
반응형
 
프로그램을 하는 사람이라면 이 방법에 무지 감동할 듯 ^^

예전에 선배에게 배운적있었는데.. 그때는 이렇게 을 죽도록 하게될 지 몰랐기에..

흘려들었었던.. 그 스킬..

암튼.. 다시 알게되서 무지 !! ^_______^


아래와 같이 윈도우 탐색기에서 오른쪽 버튼을 눌러 해당 경로로 도스커맨드창을 여는 방법이다.



< 설 정 방 법 >

 

먼저 [시작] - [실행] (윈도우키 + R) 에서 "regedit"를 입력하여 레지스트리 편집기를 띄운다.



레지스트리 편집기를 띄운후 다음의 경로로 이동한다.

"HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell"

"shell" 키에서 오른쪽 버튼을 클릭한 후 "새로만들기 -> 키"를 선택.



그러면 "shell" 아래에 폴더형태로 "새 키 #1"가 생성된다.

이 키의 이름을 "Dos Command"로 바꾼다. (물론 이름은 원하는대로 ^^;)

오른쪽을 보면 "기본 값"이 있는데, 이 값을 더블클릭하여 키의 값을 "Command(&Q)"로 바꾼다.

여기서 &Q는 단축키를 지정하는 방법이다.




새로 생성한 "Dos Command"에서 오른쪽 버튼을 눌러서 "새로만들기 -> 키"를 또 생성.

이 키의 이름은 "command"로 하였다.

새로 생성된 키의 기본값을 더블클릭하여 값을 "cmd /k" 로 바꾼다.

 


 

< 마지막 확인 >

 


자~ 이제.. 탐색기를 띄워 아무 디렉토리에서나 오른쪽 버튼을 클릭해 보자.

방금 만든 "Command(Q)"라는 명령이 보일 것이다.

클릭하면 바로 그 경로로 도스커맨드창이 열린다.

 

ㅋㅑ~ 정말 편리한 방법이지 않은가!! ^^


------------------------------------------

odly75님의 내용을 참고하여 작성하였습니다~

http://blog.naver.com/oldy75/60009781493

Posted by 1010
98..Etc/ASP.NET2.02009. 3. 2. 14:33
반응형
난 지금까지 CS만 해와서 웹에 대해 잘 몰랐다가 요즘 ASP.NET을 사용하면서 곤란했던적이 한 두번이 아니다.
한번은 그냥 간단하게 데이터만 조회하는 페이지를 만들라고 지시를 받았는데..
만드는건 그닥 어렵지 않았다. 인터넷에 자료들이 넘쳐나니..
하지만 문제는 IIS 요녀석....
서버에 기존 웹사이트는 ASP.NET 버전을 1.1로 쓰고 있었고 내가 만든 페이지는 2.0버전이었다.
한창 내가 만든 페이지를 테스트하면서 잘 돌아가 흐믓해 하고 있을때 갑자기 전화가와
아침까지도 잘 접속되던 웹사이트[버전1.1]가 접속이 안된다는것이 었다.
이건 뭥미?? 내가 브라우저로 접속에서 보니 이런 에러가...



이벤트 뷰어에 나타난 오류는 다름 아닌



세상에.. 동일한 IIS 프로세스에서는 서로 다른 버전의 ASP.NET이 실행이 안되는 것이었다.
검색결과 역시 해결책은 있었다.

새 응용프로그램 풀을 만들면 되는 것이 었다.
응용프로그램 풀을 만들었으면 웹사이트 속성에 가상디렉토리 탭에 가서 밑의 그림과 같이 설정해 주면 된다.



응용프로그램 풀을 이용한 해결책 참조 사이트 :
http://www.wssplex.net/TipnTech.aspx?Seq=282
http://technet2.microsoft.com/windowsserver/ko/library/1b758129-e461-4b49-ab63-113c4341133b1042.mspx?mfr=true
Posted by 1010
반응형
SQL문을 쓸때 항상 따옴표를 넣으주는 일이 정말 귀찮은 여러분!!
이 TIP으로 이제 따옴표 넣는 일은 이제 그만!!



본론으로 들어가서 일단 위의 그림 처럼 SQL문을 선택해 주시고 Ctrl+H를 누르시면
빠른 바꾸기 창이 나타납니다.



빠른 바꾸기 창이 나타나면 위에 빨간네모 박스에 표시된것 처럼 설정해주세요...
그리고 모두 바꾸기 버튼을 누르시면..!!



위 그림과 같이 바뀝니다.. 이렇게 편리할 수가..ㅠㅠ
조금 수정해서 ..

완성되었습니다.. ^^

추가로 한가지 더..!!

try / catch 문을 넣고 싶은데 일일이 찍기 귀찮으면 Ctrl+K , S 누르시면 밑의 그림과 같이
코드 감싸기가 나옵니다.


여기서 try를 선택하시고 Enter 키를 누르시면

try / catch문이 자동적으로 들어 갔습니다. 참~~~ 쉽쬬?ㅋ
try / catch문 이외도 많이 있으니 활용하시기 바랍니다.

참고로 다른 단축키라든지 Visual Studio 2005 IDE Tip은 밑의 사이트를 참조하세요..
저도 여기서 많이 배웠습니다. ^^

참조사이트 : http://www.chinhdo.com/20070920/top-11-visual-studio-2005-ide-tips-and-tricks-to-make-you-a-more-productive-developer/
Posted by 1010
반응형

1. 파일 읽어올 때 한글 깨지지 않게 불러오기

Text1.Text = System.IO.File.ReadAllText("경로", System.Text.Encoding.Default)

 

2.  어플리케이션 경로 구하기

vb6.0:  app.path -> vb2005: My.Application.Info.DirectoryPath 

Posted by 1010
98..Etc/velocity2009. 2. 27. 15:52
반응형

The Apache Velocity project introduces an alternative syntax to the familiar JSP expressions and scriptlets. Resin's extension allows the use of Velocity-style syntax in JSP files. The Velocity-style syntax is transformed into JSTL standard tags.

  1. Enabling velocity-style syntax
  2. expressions
  3. scriptlets
  4. if statements
  5. foreach statements

The syntax is based on expressions like ${foo} and scriptlets with #\{...}#. Because the alternative syntax avoids the brackets which fill JSP pages, it can make pages more readable and therefore more maintainable.

Because Resin's Velocity-style syntax is transformed to the JSTL tag library, all JSTL expressions are allowed.

JSP style
<%
int count;
%>

<h3>A sample <%= count %></h3>

<% if ("foo".equals(request.getParameter("a"))) { %>
  <h3>Foo!</h3>
<% } else { %>
  <h3>Bar!</h3>
<% } %>

The same JSP file could be written in Velocity-style as follows. The jsp:directive is required because JSP pages use strict JSP syntax by default.

Velocity style
<jsp:directive.page velocity='true'/>
#{
int count;
}#

<h3>A sample ${count}</h3>

#if ("foo" == params.a)
  <h3>Foo!</h3>
#else
  <h3>Bar!</h3>
#end

The choice between the two is a matter of preferences. An advantage of the velocity style is that expressions and scriptlets avoid using brackets. In large pages, sorting out the HTML or XML from the JSP syntax can become confusing.

Enabling velocity-style syntax

Velocity-style syntax can either be enabled on a per-JSP page with velocity='true' or in the web-app with the <jsp> tag:

Enabling velocity for a page
<jsp:directive.page velocity='true'/>
  ...

Enabling velocity for a web-app
<web-app>
  <jsp velocity='true'/>
  ...
</web-app>

expressions

Expressions are enclosed between "${" and "}", for example '${count}' and '${count + 15}'.

The '${...}' syntax is equivalent to '<c:out value="..."/>'.

#{

${expression}

scriptlets

Scriptlets use the '#{ ... }#' syntax. This is entirely equivalent to '<% ... %>'. (Note, Velocity does not have this syntax because it creates its own language instead of escaping to Java.)

#{
 statements
}#

#{
String key = request.getParameter("key");
if (key.equals("")) {
  response.sendError(500, "Bad key");
  return;
}
}#
...

if statements

The velocity-style syntax directly supports if statements. The syntax is

#if (expr1)
  ...
#elseif (expr1)
  ...
#else
  ...
#end

The expressions can be any JSTL expression. The if statement is transformed into:

<c:choose>
<c:when test="${expr1}">
  ...
</c:when>
<c:when test="${expr2}">
  ...
</c:when>
<c:otherwise>
  ...
</c:otherwise>
</c:choose>

foreach statements

The velocity-style syntax directly supports iteration with a foreach statements.

#foreach (var in expr)
  ...
#end

This style of foreach is transformed into the following:

<c:forEach items="${expr}" var="var">
  ...
</c:forEach>

An example use might be the following:

foreach in Java
<jsp:page.directive velocity='true' import='java.lang.*'/>
#{
  ArrayList list = new ArrayList();
  list.add("foo");
  list.add("foobar");
  pageContext.setAttribute("list", list);
}#
#foreach (value in list)
  <li>${value}
#end

The velocity-style syntax also supports integer iteration.

An example might be the following:

foreach in Java
<jsp:page.directive velocity='true'/>
#foreach (value in [3..9])
  <li>$value
#end

Posted by 1010
98..Etc/velocity2009. 2. 27. 15:15
반응형

웹에서 처럼 Java application 에서 velocity 를 사용한다.

그러면 화면(로그) 구성 로직을 vm 에 옮기고 변화가 많지않은 부분을 java 로 코딩하여

컴파일을 해 놓으면 어떤 로직에 수정이 가해졌을 때 재 컴파일 없이 properties 처럼

Vm 파일만 수정하면 된다. 활용여하에 따라서 효과적이고 유지보수와 개발의 편리성을

제공할수 있을 것 같다.

 

필요한 jar : commons-collections-3.2.jar, commons-lang-2.3.jar, velocity-1.5.jar,

velocity-dep-1.4.jar, velocity-tools-1.3.jar, velocity-tools-generic-1.4.jar,

velocity-tools-view-1.1.jar

 

jdk : 1.4

 

java 소스 상에서 사용하기 위해선 다음과 같은 절차를 따른다.

1: Velocity.init() 메서드를 사용하여 엔진을 초기화 한다.

2: VelocityContext 객체를 생성하는데 이곳에 넘길값을 셋팅한다.

3: methodproperties 를 다루는데 사용하는 Template 객체를 생성한다.

이 객체에 velocity 파일위치를 파라미터로 넘겨주면 리턴값으로 Template 객체를넘겨준다.

그리고 이 Template 객체에 VelocityContext 를 넘겨주면된다.

 

Velocity.init();

Template template=Velocity.getTemplate("./src/velocity/conditionals/if.vm");

VelocityContext context = new VelocityContext();


Writer writer =
new StringWriter();

template.merge(context, writer);

 

System.out.println(writer);

 

소스를 컴파일 하게 되면 console vm 에 대한 로그는 나타나지 않는다.

Velocity.log  파일을 자동으로 만들어 컴파일에 대한 내용을 출력한다.


Posted by 1010
98..Etc/velocity2009. 2. 27. 15:11
반응형

1. 주석 사용
## 로 시작하면 한 줄 코멘트
#* 로 시작하고 *#로 끝나면, 여러 줄 코멘트
#** 로 시작하고 *#로 끝나면, 블록 코멘트.

2. 레퍼런스
$(variable) : 컨텍스트에서 제공되는 변수에 대한 레퍼런스
$(variable.property) : 속성에 대한 레퍼런스
$(cariable.method(arg)) : 메소드에 대한 레퍼런스

예)
$date.format("yyyy-MM-dd", $createTime)

3. 디렉티브
#set : 레퍼런스의 값 설정
#if/#elseif/#else : 조건문 제어
#foreach : 객체 리스트에 댛란 반복 제어
#include : 벨로시티로 파싱되지 않은 로컬 파일 출력
#parse : 벨로시티로 파싱된 로컬 템플릿 출력
#stop : 템플릿 엔진의 동작 정지
#macro : 반복적으로 사용될 VM(velocimacro)

예)
*. set
#set ($val = 1234567)

*. if/elseif/else
#if( $foo == $bar ) -> 등치 연산자
#if( $foo == 42 )
#if( $foo == "bar" )
#if( !$foo ) -> Boolean NOT

*. foreach
$allPages가 List나 Array인 경우
#foreach( $page in $allPages)
   $page
#end

$allPages가 Map이나 Hashtable일 경우

#foreach( $key in $allPages.keySet())
   $key -> $allPages.get($key)
#end

*. include
Velocity에 의해 파싱되지 않는 로컬 파일(들)을 렌더링
#include ("a.html")

*. parse
Velocity에 의해 파싱되는 로컬 템플릿을 렌더링
#parse ("me.vm")

*. macro
편리한 함수를 만들어서 사용 가능함
#**
 * General purpose date formatter. Need to be careful of whitespace.
 * @param dateFormat Date format to be used (see java.text.SimpleDateFormat).
 * @param date Date object to be formatted (see java.util.Date).
 *#
#macro(formatDate $dateFormat $date )
  $utils.formatDate($date, $dateFormat)
#end

4. toolbox.xml(Velocity Tool)을 활용한 사용자 정의 오브젝트의 사용
toolbox.xml에 사용자 정의 클래스를 적용하여 vtl에서 사용할 수 있다. getXX(), setXX(), isXX() 형태로 정의되었을 경우 가능

예)
*. Date Tool
org.apache.velocity.tools.generic.DateTool class를 추가함
$date.format("yyyy-MM-dd HH:mm:ss", $myDate)   -> 2008-06-03 19:11:09

*. Number Tool
org.apache.velocity.tools.generic.NumberTool class를 추가함
$number.format("currency", $val)   -> ₩1,234,567
$number.format("integer", $val)    -> 1,234,567

*. Escape Tool
org.apache.velocity.tools.generic.EscapeTool를 추가함
$javascript                  -> I'm Mimul
$esc.javascript($javascript) -> I\'m Mimul

Posted by 1010
98..Etc/velocity2009. 2. 27. 15:10
반응형

Velocity UI for Eclipse

This project leverages the Eclipse platform (v2.x) by adding support for the template/scripting engine Velocity. It provides the following plugins:
org.apache.velocity
Velocity binaries (currently v1.3.1-final) packaged as an Eclipse plugin
org.vaulttec.velocity.ui
Velocity-aware text editor (associated to files with extensions '*.vsl' or '*.vm') with outline view

Editor Features

  • Syntax-highlight for Velocity Template Language (VTL)
  • Outline view with hierarchy of VTL directives and Velocimacro references
  • Content assist for VTL directives (Screenshot) and references (Screenshot) -> auto-activation after the character '#' or '$' or manually via keyboard shortcut Ctrl+Space
  • Automatic template validation while typing (the first syntax error is show in task list and the according line is marked in annotation column) -> Screenshot
  • Annotation hover with definition of references (Screenshot) and template syntax errors (Screenshot)
  • Go to definition of variable or Velocimacro reference under current cursor position (via context menu or keyboard shortcut F3)
  • Comment and uncomment blocks (via Ctrl+/ and Ctrl+\)
  • Preference pages for definition of Velocity counter name and user-defined Velocity directives (Screenshot)
  • Preference pages for color settings of the editor's syntax highlighting (Screenshot)
  • Preference pages for Velocimacro library (Screenshot)

Installation

Via Eclipse Update Manager

Online updates are available on http://veloedit.sourceforge.net/updates/. Define a site bookmark in Eclipse's Update Manager view (Screenshot), navigate to the update site via this bookmark (Screenshot) and install the Velocity UI feature. This update site can also be downloaded from SourceForge and used locally.

Manually

Download the archives org.apache.velocity_x.x.x.zip and org.vaulttec.velocity.ui_x.x.x.zip from here and unzip them in your Eclipse plugin directory "<eclipse install path>/plugins/".
SourceForge Logo
Posted by 1010
98..Etc/velocity2009. 2. 27. 14:40
반응형
VTL (Velocity Template Language)에 대해서는 여지껏 접해본바 없는 상황인지라 문법 익히기에도 급급하다.
대충 문법 정의 문서를 살펴보니 그리 어려운 언어는 아니라는 결론을 얻었다.

HTML 사용 하는거야 그냥 똑같이 쓰면 되고, 그 안에 스크립트를 끼워 넣는 것인데...
좀 더 쓰다 보면 익숙해지겠지... :-)

자.. 이제 익숙해지는 단계 이전까지는 뭔가 도움이 될만한 것들을 찾아봐야 하는데, 역시나 이클립스를 무시할 수가 없다. Velocity 코드 작성을 위한 Plug-In이 분명 존재할 것이란걸 믿고 찾아봤더니...
세상에나... 정말로 있다!!

Eclipse 사이트의 Plug-In Central 화면 캡춰



이제 설치를 해보자.

Velocity WebEditor - Eclipse Plugin : 아래 다운로드 클릭
상단에 링크된 파일을 다운받아서 압축을 해제하면 plugin 디렉토리가 생성되고 그 안에 실제로 설치에 필요한 디렉토리 및 파일들이 존재한다.


com.hudson.velocityweb_1.0.8 디렉토리를 Eclipse 설치 디렉토리 아래 plugins 디렉토리 하위에 복사.

Eclipse가 실행 중이었다면 재실행 해야 반영된다.


VM 파일을 수정하는 화면이다. 가장 도움이 되는 기능이 Syntex Coloring 과 Code Assist 기능이 지원된다는 것.
이제 눈을 부릅뜨고 코딩하는 일만 남았다.

조금이라도 빨리 퇴근하길 바라는 마음에서... ㅠ_ㅠ
Posted by 1010
98..Etc/weblogic2009. 2. 27. 14:07
반응형
Oracle WebLogic Server Downloads

Thank you for accepting the OTN License Agreement; you may now download this software.


 
Microsoft Windows
Linux
Solaris
HP
Oracle WebLogic Server 10.3 - Net Installer



Oracle WebLogic Server 10.3 - Package Installer

x86: 39 MB
File1



x86: 742 MB
File1

x86: 42 MB
File1



x86: 748 MB
File1
SPARC: 47 MB
File1



SPARC: 463 MB
File1
Itanium: 8 MB
File1



Itanium: 473 MB
File1
Mandatory for 10.3 Net/Package Installers:

- Security Advisory
- Apache Plug-ins zip
- Instructions
Oracle WebLogic Server 10.0 MP1

Oracle WebLogic Server 9.2 MP3


x86: 688 MB
File1

x86: 636 MB
File1
x86: 695 MB
File1

x86: 639 MB
File1
SPARC: 636 MB
File1

SPARC: 598 MB
File1
   
Oracle WebLogic SIP Server 3.1

x86: 371 MB
File1
x86: 379 MB
File1
     
Documentation Library
All    


Additional Fusion Middleware Downloads
 
Microsoft Windows
Linux
Solaris
Oracle Coherence

All versions    
Oracle JRockit

All versions    
Oracle WebLogic Operations Control
All versions
Posted by 1010
98..Etc/weblogic2009. 2. 27. 13:11
반응형
웹로직 시작시 아래와 같은 InvalidClassException 오류가 발생한다면?

serialVersionUID의 값이 다르다는 것으로 보아 웹로직과 JDK가 서로 호환이 되지 않아서 발생하는 문제다.
동일한 클래스일지라도 serialVersionUID가 다르면 다른 클래스로 인식되어 서로 데이터를 주고 받을 수 없다.

There are 1 nested errors:

weblogic.management.ManagementException: [Management:141266]Parsing Failure in c
onfig.xml: javax.xml.namespace.QName; local class incompatible: stream classdesc
 serialVersionUID = 4418622981026545151, local class serialVersionUID = -9120448
754896609940
        at weblogic.management.provider.internal.RuntimeAccessImpl.<init>(Runtim
eAccessImpl.java:122)
        at weblogic.management.provider.internal.RuntimeAccessService.start(Runt
imeAccessService.java:38)
        at weblogic.t3.srvr.ServerServicesManager.startService(ServerServicesMan
ager.java:374)
        at weblogic.t3.srvr.ServerServicesManager.startInStandbyState(ServerServ
icesManager.java:125)
        at weblogic.t3.srvr.T3Srvr.initializeStandby(T3Srvr.java:630)
        at weblogic.t3.srvr.T3Srvr.startup(T3Srvr.java:402)
        at weblogic.t3.srvr.T3Srvr.run(T3Srvr.java:361)
        at weblogic.Server.main(Server.java:67)
Caused by: java.io.InvalidClassException: javax.xml.namespace.QName; local class
 incompatible: stream classdesc serialVersionUID = 4418622981026545151, local cl
ass serialVersionUID = -9120448754896609940
        at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:546)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:155
2)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
699)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
        at java.util.HashMap.readObject(HashMap.java:1066)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:946
)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1809)

        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
719)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:19
08)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832)

        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
719)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
        at java.util.HashMap.readObject(HashMap.java:1067)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:946
)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1809)

        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
719)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:19
08)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832)

        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
719)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
        at com.bea.staxb.buildtime.internal.bts.BindingFile.forSer(BindingFile.j
ava:77)
        at com.bea.staxb.buildtime.internal.tylar.RuntimeTylar.getBindingFiles(R
untimeTylar.java:111)
        at com.bea.staxb.buildtime.internal.tylar.RuntimeTylar.getBindingLoader(
RuntimeTylar.java:90)
        at com.bea.staxb.runtime.internal.BindingContextFactoryImpl.createBindin
gContext(BindingContextFactoryImpl.java:66)
        at com.bea.staxb.runtime.internal.BindingContextFactoryImpl.createBindin
gContext(BindingContextFactoryImpl.java:52)
        at weblogic.descriptor.internal.MarshallerFactory.<init>(MarshallerFacto
ry.java:48)
        at weblogic.descriptor.DescriptorManager$DefaultMarshallerFactorySinglet
on.<clinit>(DescriptorManager.java:40)
        at weblogic.descriptor.DescriptorManager.getDefaultMF(DescriptorManager.
java:116)
        at weblogic.descriptor.DescriptorManager.getMarshallerFactory(Descriptor
Manager.java:125)
        at weblogic.descriptor.DescriptorManager.getDescriptorFactory(Descriptor
Manager.java:153)
        at weblogic.descriptor.DescriptorManager.createDescriptor(DescriptorMana
ger.java:277)
        at weblogic.management.provider.internal.DescriptorManagerHelper.loadDes
criptor(DescriptorManagerHelper.java:52)
        at weblogic.management.provider.internal.RuntimeAccessImpl$IOHelperImpl.
parseXML(RuntimeAccessImpl.java:599)
        at weblogic.management.provider.internal.RuntimeAccessImpl.parseNewStyle
Config(RuntimeAccessImpl.java:230)
        at weblogic.management.provider.internal.RuntimeAccessImpl.<init>(Runtim
eAccessImpl.java:110)
        ... 7 more

>
<2007. 10. 12 오전 10시 32분 56초 KST> <Notice> <WebLogicServer> <BEA-000365> <S
erver state changed to FAILED>
<2007. 10. 12 오전 10시 32분 56초 KST> <Error> <WebLogicServer> <BEA-000383> <A
critical service failed. The server will shut itself down>
<2007. 10. 12 오전 10시 32분 56초 KST> <Notice> <WebLogicServer> <BEA-000365> <S
erver state changed to FORCE_SHUTTING_DOWN>


해결안:

1. setDomainEnv.cmd 파일에
- Dcom.sun.xml.namespace.QName.useCompatibleSerialVersionUID=1.0 추가

2. ant task 수행 중 다음과 같이 ANT_OPT를 설정한다.
Set ANT_OPT=-Dcom.sun.xml.namespace.QName.useCompatibleSerialVersionUID=1.0

3. 모든 ANT 파일의 java 혹은 javac 작업에서 jvmarg를 아래 샘플처럼 적용하라.
<target name="run">
<java classname="examples.webservices.jws_basic.simple.Client" fork="true"
failonerror="true" >
<!--Note the jvmarg tag -->
<jvmarg line="-Dcom.sun.xml.namespace.QName.useCompatibleSerialVersionUID=1.0" />
<classpath refid="client.class.path"/>
<arg line="http://${wls.hostname}:7001/jws_basic_simple/SimpleService" />
</java>
</target>
Posted by 1010
98..Etc/weblogic2009. 2. 27. 12:02
반응형

1. JEUS 5.0 깔끔하게 삭제
(프로그램 추가/제거에서 삭제 후 C:\TmaxSoft 폴더 직접 삭제)


2. WebLogic 설치 (계속 Next 눌러서 설치)
   -> install 이 시작 됨
   -> Install XML Spy 과 Run QuickStart 체크 해제 후 Done

▶▶▶ 설정 하기 ◀◀◀

Configuration Wizard 실행
-> Create a new WebLogic configuration
-> Basic WebLogic Server Domain
-> Express
-> 패스워드 입력 : 12345678 (최소 8자)
-> Development Mode / Bea Supplied SDKs (Sun SDK 1.4.1)
-> Create 클릭

User Project -> mydomain -> Start Server 실행

http://localhost:7001/console 접속
(아이디 weblogic / 비번 12345678)


C:\bea\user_projects\domains\mydomain\applications 에 webtest 폴더 만들기
(webtest가 루트가 됨)


webtest 폴더 밑에 WEB-INF 폴더 생성
WEB-INF 폴더 밑에 classes, lib, src 폴더 생성(총 3개)

* 폴더 구조 *
webtest ─ WEB-INF ─ classes
          └ lib
          └ src


web.xml, weblogic.xml 를 WEB-INF폴더에 카피 후 내용 지우기

<< web.xml 내용 >>
<?xml version="1.0" encoding="UTF-8" ?>
  <!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
</web-app>

<< weblogic.xml 내용 >>
<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE weblogic-web-app
    PUBLIC "-//BEA Systems, Inc.//DTD Web Application 7.0//EN"
    "http://www.bea.com/servers/wls700/dtd/weblogic700-web-jar.dtd" >
<weblogic-web-app>
</weblogic-web-app>


C:\bea\user_projects\domains\mydomain\startWebLogic.cmd 문서 열기
38번 라인 수정 -> set PRODUCTION_MODE=false


▶▶▶ 테스트 하기 ◀◀◀

webtest 폴더 밑에 index.html 생성

서버 재시작

http://localhost:7001/webtest/index.html

Error 404--Not Found 메세지가 뜨면 성공


▶▶▶ Console로 접속해서 설정 하기 ◀◀◀

http://localhost:7001/console 접속

Web Application Modules 클릭

Deploy a new Web Application Module... 클릭

applications 클릭

webtest 체크 후 Target Module 클릭

Deploy 클릭

http://localhost:7001/webtest/index.html 접속 후 페이지 뜨면 성공


▶▶▶ context-root 추가하기 ◀◀◀

<< weblogic.xml 내용 >>
<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE weblogic-web-app
    PUBLIC "-//BEA Systems, Inc.//DTD Web Application 7.0//EN"
    "http://www.bea.com/servers/wls700/dtd/weblogic700-web-jar.dtd" >
<weblogic-web-app>
 <context-root>/</context-root>
</weblogic-web-app>

http://localhost:7001/webtest 로 접속하던 것을
   http://localhost:7001/ 로 접속 가능함


▶▶▶ Servlet 테스트 하기 ◀◀◀

시작 > 실행 > cmd

C:\bea\user_projects\domains\mydomain 디렉토리로 이동
.\setEnv.cmd 실행 (WebLogic 환경에 맞춰서 컴파일 하는 명령어)

서블릿 파일 작성 후 WEB-INF 밑 src 폴더에 저장
C:\bea\user_projects\domains\mydomain\applications\webtest\WEB-INF\src 디렉토리로 이동

javac -d ..\classes HelloWorldServlet.java (컴파일)


▶▶▶ web.xml 에 서블릿 맵핑 하기 ◀◀◀

<< weblogic.xml 내용 (추가) >>
<web-app>
 <servlet>
  <servlet-name>helloworld</servlet-name>
  <servlet-class>examples.HelloWorldServlet</servlet-class>
 </servlet>

 <servlet-mapping>
  <servlet-name>helloworld</servlet-name>
  <url-pattern>/hello</url-pattern>
 </servlet-mapping>
</web-app>

- 서버 재시작 -
http://localhost:7001/hello (접속)


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

DB연결 부분은... 알아서 해석해주세요 ㅡㅡ;; 너무 빨라서 정리를;;

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

-jdbc-
Connection Pools 

Configure a new JDBC Connection Pool...

디비타입 - 오라클
디비드라이버 - 오라클스 드라이버 씬

네임 - OracleConnectionPool

디비네임 - XE

127.0.0.1
1521
scott
tiger
tiger

continue

create deploy

///////////////////////////////////////

Data Sources 
Configure a new JDBC Data Source
네임 - OracleDataSource
jndi네임 - XE

Posted by 1010
98..Etc/weblogic2009. 2. 26. 19:11
반응형
[시스템운영] WAS/WebServer | LECTURE  
WebLogic Platform 8.1 Installation Guide (초보자를 위한 웹로직 설치법)
  작성자 : 조대협 (javastudy) 작성일 : 2004-03-18 17:01:00 (2004-04-07 17:02:52)

 

프린트하기

 


WebLogic Platform 8.1

Installation Guide





BEA Systems Korea [kr.bea.com]

김현수 [?_N_O_SPAM@bea.com]







MS-WORD 형식의 문서입니다.
아래의 첨부파일 목록에서 *.doc 파일을 다운받아 보실 수 있습니다.



 
     

[첨부파일 다운로드]
1. lecture0201_1_3_WebLogic Platform 8.1 Installation Guide and so on.doc (4539KB)
Posted by 1010
98..Etc/JSTL2009. 2. 26. 18:27
반응형
org.apache.jasper.JasperException: This absolute uri (http://java.sun.com/jsp/jstl/core)
cannot be resolved in either web.xml or the jar files deployed with this application


JSTL 을 제대로 연결하지 못하는거 같아 여러 방면으로 찾아보았다.
소스 상에는 문제가 없는데 문제가 생기는건 jar 문제 같았다.
jstl.jar 를 해석하는 standard-1.0.6 을 뜯어서 보니 META-INF 안에 .tld 파일의 URL이
jsp 가 빠진 주소이다 . 하지만 사이트에서는
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 다음과 같이 쓰기 때문에
맞지 않았던것이다.
사용자 삽입 이미지
그래서 아래 주소로 가서 jstl.jar 와 standard.jar 를 새로 받아 넣었더니 제대로 되는 것이다.
http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi
1.1.2 .zip 파일을 받는다.

다음의 주소는 JSTL  지침서 이다. 시간날때 참조하자.
http://java.sun.com/developer/technicalArticles/javaserverpages/faster/
Posted by 1010
98..Etc/JSTL2009. 2. 26. 18:07
반응형

간혹 Jeus에서도 잘 돌던 JSP가 Tomcat에서 500번 에러가 나는 경우가 있는데

대부분의 경우 JSTL을 사용하는 경우이다.

대략 다음과 같은 형태다.



메시지를 자세히 보면 이런 내용이 나온다.

According to TLD or attribute directive in tag file, attribute value does not accept any expressions

요컨데 expression language를 사용할 수 없다는 것


이 내용으로 구글링을 해보면 이런 내용이 나온다.
참고: http://forum.java.sun.com/thread.jspa?threadID=683007&messageID=9423383


내용인 즉 expression을 사용하려면 JSTL 1.1을 써야한다는 내용이 많다.
Struts 1.3.8에 포함된 JSTL은 1.0.2 였기 때문에
일부러 J2EE SDK가 포함된 Sun AppServer를 다운 받아 appserv-jstl.jar 로 교체를 해봤다.
그래도 마찬가지 현상..
 
대략 글을 더 살펴보니 이런 솔루션이 나온다.
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> 를 쓰지말고
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %> 를 쓰라는 것
결과는 잘 나온다.


그런데 Jeus에서도 나오는게 Tomcat에서 저렇게 해야만 한다는게 못내 섭섭하다.
그래서 더 내용을 살펴보니
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 요걸로 하면 다 된단다.


결과는 다음과 같다.

잘 나온다. 
결국 다른 패치 없이 Tomcat 5 이상에서 Struts 1.3.8 만가지고 JSTL 사용 이상 없다.
다행다행 >ㅁ<
Posted by 1010
98..Etc/SVN2009. 2. 25. 00:41
반응형
Posted by 1010
98..Etc/SVN2009. 2. 25. 00:40
반응형

소프트웨어 구성 관리에 관한 도움말

이 사이트의 프로젝트에서는 소프트웨어 구성 관리(SCM) 도구를 사용하여 버전을 관리할 수 있습니다. SCM에서는 CVS를 대체할 향상된 도구로 설계된 공개 소스 버전 관리 도구인 Subversion을 사용합니다. 대부분의 CVS 사용자는 처음이라도 Subversion을 쉽게 사용할 수 있습니다. Subversion을 처음 사용하는 경우라면 실전 경험을 통해 사용법을 익히는 것이 좋습니다. 이 가이드는 빠른 속도로 익힐 수 있도록 도와줍니다.

Subversion 설치

Subversion은 클라이언트 서버 시스템입니다. Subversion 저장소는 프로젝트 웹 서버에서 관리합니다. 사용자의 시스템에서 실행되는 Subversion 클라이언트는 인터넷을 통해 Subversion 서버와 연결됩니다. 이 사이트에서 호스팅되는 프로젝트를 위해 Subversion 서버에 접근하려면 로컬 컴퓨터에 Subversion 클라이언트가 있어야 합니다. 거의 모든 플랫폼에서 클라이언트를 사용할 수 있습니다. Subversion 프로젝트 다운로드 페이지에서 해당 운영 체제에 적합한 클라이언트를 다운로드할 수 있습니다.

어떤 이들은 개발 과정에서 Subversion 명령줄 클라이언트인 svn을 사용하지만, 그래픽 인터페이스를 선호하는 사용자에게는 TortoiseSVN이 적합합니다. 이 가이드에서는 명령줄 Subversion에 대한 지침만 제공합니다.

그 밖의 Subversion 설명서 및 리소스

단계별로 학습하는 경우라면 Version Control with Subversion을 사용하는 것이 좋습니다. 이 사이트에 수록된 도움말 정보 중 상당수는 이 완성된 설명서에서 발췌된 것입니다. Subversion에 대한 추가 정보 및 최신 정보는 Subversion Project 웹 사이트에서 확인하십시오.

Subversion과 CVS의 명령을 비교해 보려면 "Crossover" Guide for CVS Users를 참조하십시오. 프로젝트에서 Subversion을 가장 효과적으로 활용하는 데 도움이 될 팁은 Subversion 최고의 실행 사례를 참조하십시오.

TortoiseSVN에 관한 도움말

  • TortoiseSVN은 널리 사용되는 Windows Subversion 클라이언트로서 Subversion과 동일한 기능을 제공합니다.
  • 이 기능에는 버전 관리 작업을 위한 편리한 대화 상자인 Windows 쉘(탐색기) 통합이 포함됩니다.
  • 사용자 인터페이스는 다양한 언어로 이용할 수 있습니다.

TortoiseSVN 설치

  1. TortoiseSVN 설치 페이지 http://tortoisesvn.net/downloads에서 설치하려는 버전을 다운로드합니다. 최신 버전을 사용하는 것이 좋습니다.
  2. 설치 프로그램 아이콘을 두 번 누르고 다음을 누릅니다. TortoiseSVN을 설치할 디렉토리로 변경하거나 기본값을 사용합니다.
  3. "모든 사용자 대상 설치"를 선택하고 다음을 누릅니다.
  4. TortoiseSVN은 지정된 경로에서 필요한 파일을 설치하기 시작합니다.
  5. 설치를 마치면 컴퓨터를 재시작하라는 메시지가 나타납니다.

    재시작해야 하는 이유는 TortoiseSVN이 통합되는 Windows 탐색기가 시스템을 재시작하지 않으면 갱신될 수 없기 때문입니다.

    참고 - TortoiseSVN은 운영 체제 단계의 응용프로그램입니다.

  6. TortoiseSVN의 작동 과정에 대한 자세한 내용은 http://tortoisesvn.net/docs/release/TortoiseSVN_en/index.html의 도움말 파일을 참조하십시오.
  7. 그 밖에 FAQ, 번역 등에 대한 정보는 http://tortoisesvn.tigris.org/를 참조하십시오.

WebDAV에 관한 도움말

Subversion은 부분적인 DeltaV 서버로서, 일반적으로 Subversion 클라이언트와 같은 DeltaV 클라이언트로부터의 쓰기 요청만 승인합니다. 현재 CEE의 최신 Subversion에서는 "자동 버전 관리(autoversioning)"라는 기능을 지원합니다. 자동 버전 관리가 활성화되면 일반적인 WebDAV 클라이언트는 곧바로 Subversion 저장소에 쓸 수 있으며, 서버는 해당 커밋을 자동으로 수행합니다.

따라서 사용되는 WebDAV 클라이언트 유형에 따라 기술자가 아닌 사용자도 Subversion 클라이언트의 사용법을 학습하지 않고서도 버전 관리의 이점을 누릴 수 있습니다. Subversion 저장소를 대상으로 작업 중임을 인식하지 않은 채로 파일 생성, 편집, 이름 변경, 복사 및 삭제와 같은 작업을 일상적으로 수행할 수 있습니다.

Microsoft Word나 Dreamweaver와 같은 독립형 응용프로그램을 비롯하여 저장소가 네트워크 폴더처럼 마운트될 수 있는 완전한 파일 시스템 구현까지 매우 다양한 WebDAV 클라이언트를 사용할 수 있습니다. 대부분의 최신 운영 체제에서는 제한적인 수준 이상의 WebDAV 기능이 기본적으로 제공됩니다. 다양한 WebDAV 클라이언트에 대한 자세한 내용은 설명서의 이 절을 참조하십시오.

CollabNet 프로젝트에서 이 기능을 활성화하려면

  1. 프로젝트 소유자로 로그인합니다.
  2. "프로젝트 편집" 및 "도구 설정"을 차례로 선택합니다.
  3. 도구 설정 화면에서 "Subversion > 자동 버전 관리" 옆 체크박스를 선택합니다.
  4. 설정을 저장합니다.

이 기능을 활성화하기에 앞서 Subversion 설명서에서 이 기능의 부작용에 대해 확인해야 합니다. 특히 WebDAV 클라이언트에서 수행하는 커밋은 비기술적인 일반 로그 메시지가 있습니다. 또한 WebDAV 클라이언트는 많은 쓰기 작업을 수행하는 편이므로 다량의 커밋 이메일이 생성될 수 있습니다.

자동 버전 관리 기능에 대한 자세한 내용은 Subversion 설명서의 부록 C를 참조하십시오.

Subversion을 사용하는 Eclipse 3.0.2

IDE(Integrated Development Environment)

IDE(Integrated Development environment)는 사용자가 단일 개발 환경에서 컴파일, 테스트 및 디버깅과 같은 작업을 수행할 수 있는 어플리케이션이라고 할 수 있습니다. 모든 작업에 대해 별도 어플리케이션을 다운로드할 필요 없이 동시에 모든 작업을 수행할 수 있습니다. IDE(Integrated Development Environment)의 한가지 예로 Eclipse를 들 수 있습니다.

Eclipse에 관한 도움말

Eclipse는 다양한 기능을 갖춘 플랫폼을 제공하여 매우 잘 통합된 도구를 개발할 때 사용하는 전문 소프트웨어 개발 프로젝트입니다. 또한 Eclipse는 오픈 소스 개발 프로젝트입니다. Eclipse에 대한 자세한 내용은 다음 사이트에서 찾을 수 있습니다.

http://www.eclipse.org/eclipse/faq/eclipse-faq.html#about_8.

Eclipse를 설치하려면

  1. 브라우저에서 http://www.eclipse.org/downloads/index.php로 이동합니다.
  2. 다운로드 페이지에 많은 미러 사이트가 나타납니다. Eclipse는 무료 소프트웨어이므로 전세계 국가에 있는 미러 다운로드 서버에 호스트되어 있습니다. 다운로드할 미러 사이트를 선택합니다. 그러면 파일을 저장할지 또는 파일을 열지를 묻는 상자가 나타납니다. Eclipse 패키지는 zip으로 압축된 파일입니다. 저장을 누릅니다. Eclipse를 다운로드할 경로를 선택합니다.
  3. Eclipse 다운로드를 완료한 후, Eclipse가 다운로드된 디렉토리로 이동하여 Eclipse 아이콘을 두 번 누릅니다. 작업 환경 경로를 묻는 대화 상자가 나타납니다. 작업 환경은 모든 파일 및 폴더를 저장합니다.
  4. 작업 환경 경로를 입력합니다. 체크아웃을 수행할 때 파일이 이 경로에 저장됩니다. 체크아웃은 소스 아카이브의 파일을 수정해야 할 때 수행하는 작업입니다. 체크아웃은 버전 관리 소프트웨어를 사용하여 수행합니다. 체크아웃을 수행하면 다른 사용자가 파일을 수정하지 못합니다.

Subclipse에 관한 도움말

Subclipse

Subclipse는 Eclipse용 플러그인입니다. Subclipse는 Subversion을 Eclipse와 통합합니다. Subclipse 플러그인을 사용하면 이 플러그인이 Subversion의 모든 기능을 Eclipse에 추가하기 때문에 Subversion을 별도로 다운로드할 필요가 없습니다. Eclipse는 다양한 기능을 갖춘 플랫폼을 제공하여 매우 잘 통합된 도구를 개발할 때 사용하는 전문 소프트웨어 개발 프로젝트로 오픈 소스입니다.

Eclispse에 대한 자세한 내용은 http://www.eclipse.org/eclipse/faq/eclipse-faq.html#about_8를 참조하십시오.

Subclipse 다운로드 및 설치:

플러그인은 http://subclipse.tigris.org에서 다운로드할 수 있으며, 사용자는 Eclipse를 사용하여 Subclipse도 다운로드할 수 있습니다.

  1. Eclipse를 다운로드한 위치(예: D:\eclipse-SDK-3.0.2-win32)로 이동하여 Subclipse를 설치합니다.
  2. Eclipse 아이콘을 두 번 눌러 Eclipse를 엽니다.
  3. Subclipse를 다운로드하려면 도움말 > 소프트웨어 갱신 > 찾기 및 설치를 누릅니다.
  4. 설치할 새 기능 검색 옵션을 선택합니다.
  5. 다음을 누릅니다. 표시되는 창에서 새 원격 사이트를 누릅니다. 이름 및 URL 열이 있는 작은 창이 나타납니다.
  6. 이름 열에 Subclipse를 입력하고 URL 영역에 http://subclipse.tigris.org/update를 입력합니다.
  7. 확인을 누릅니다. 설치할 사이트 섹션에 Subclipse가 나열된 것을 볼 수 있습니다. Subclipse를 선택합니다.
  8. 다음을 누릅니다. Subclipse의 버전(예를 들어, 0.9.30)을 선택합니다.
  9. 다음을 누릅니다. [라이센스 계약 조건에 동의합니다]를 선택해야 하는 창이 나타납니다.
  10. 다음을 누릅니다. 설치할 위치를 묻는 창이 나타납니다.
  11. 다음을 누릅니다. 확인 창이 나타납니다.
  12. 설치를 누릅니다. 설치 프로세스가 끝난 후 작업 환경을 재부팅할지 또는 변경사항을 적용할지를 묻는 창이 나타납니다. Subclipse의 설치를 완료하기 위해서는 작업 환경을 재시작하거나 변경사항 적용을 눌러야 합니다.

Subclipse에서 코드 저장소 구성

Subclipse를 사용하여 Subversion 코드 저장소에 대한 작업을 수행할 수 있습니다. 다음 절차는 Subclipse에서 버전 관리 저장소를 구성하는 방법을 설명합니다.

Subclipse에서 코드 저장소를 구성하려면

컴포넌트가 설치되었으면 Eclipse 기본 창으로 이동합니다.

  1. 기본 메뉴에서 Window > Show View로 이동하고 SVN Repository를 선택합니다.
  2. CollabNet에 로그인하고 Subversion을 버전 지정 컴포넌트로 포함한 프로젝트를 작성합니다.
  3. 프로젝트를 작성한 후 Eclipse로 이동하고 Window > Open Perspective > Other > Select SVN Repository Exploring을 차례로 누릅니다.
  4. 확인을 누릅니다. 기본 창의 오른쪽에 SVN Repository 탐색기가 나타납니다. Repository Location을 마우스 오른쪽 버튼으로 누릅니다.
  5. URL(예: http://firstsvn.<domainname>.net/svn/firstsvn)을 입력합니다. 여기서 "firstsvn"은 CollabNet에서 작성한 프로젝트이고, "domainname"은 도메인 이름이고, 마지막의 "firstsvn"은 프로젝트 이름입니다.
  6. finish를 누릅니다.
  7. SVN Repository 탐색기로 이동하여 탐색 메뉴에서 프로젝트를 확장합니다.
  8. 폴더에 나열된 프로젝트의 내용을 볼 수 있습니다.
  9. 이제 폴더를 선택하고 마우스 오른쪽 버튼을 눌러 "Checkout as Project"을 선택합니다.
  10. 기본 창의 오른쪽에서 Resources view를 마우스 오른쪽 버튼으로 눌러 작업 환경으로 이동합니다. 작업 환경은 모든 프로젝트 파일을 저장하고, 수정 작업을 하고, 파일을 커밋하고, 기타 다른 작업을 수행하는 곳입니다. 예를 들어, 작업 환경을 C:\Test로 둘 수 있습니다.

Subclipse를 사용하여 파일을 편집하려면

  1. 기본 메뉴에서 Window > Show View로 이동하고 SVN 저장소를 선택합니다.
  2. SVN 저장소 창에 작성한 프로젝트가 표시됩니다.
  3. 파일을 편집하려면 폴더를 선택하고 폴더의 왼쪽에 있는 더하기 기호를 누릅니다. 폴더가 확장되고 폴더의 내용이 표시됩니다.
  4. 파일의 내용을 변경사항하려면 폴더에서 파일을 선택하여 오른쪽의 편집 창에 엽니다. 변경사항을 적용하고 File > Save를 눌러 파일을 저장합니다.
  5. 파일에 작성한 변경사항을 저장하려면 왼쪽의 네비게이터 메뉴에서 수정한 파일을 선택한 다음 마우스 오른쪽 버튼을 누르고 Team > Commit을 선택합니다.

또한 Subclipse를 사용하여 갱신 및 원상 복귀와 같은 다른 작업을 수행할 수 있습니다.

Subclipse에 대한 질문이 있을 경우 다음 주소의 Subclipse 사이트를 방문하십시오.

이 사이트에는 FAQ 섹션, 플러그인의 갱신에 대한 정보 및 기타 Subclipse와 관련된 상세 내용이 있습니다.

Posted by 1010
98..Etc/SVN2009. 2. 25. 00:37
반응형

개요..

 


소스세이프(Source Safe)보다 좋은 버전관리 프로그램 Tortoise SVN 을 소개해드립니다.


홈페이지 : http://tortoisesvn.net/



버전관리를 통한 소스 관리의 중요성


프로그래머, 개발자라면 반드시 소스의 버전관리를 해야 합니다. (선택이 아니라 필수입니다.)


소스관리 소프트웨어를 사용하는 대표적인 이유는 다음과 같습니다.


- 백업

- 팀 프로젝트 (팀원과 공통 소스 개발)

- 잘못 만들어진 소스 복구



저(Kyuseo) 역시 예전에는 MS 사의 소스세이프(Source Safe)를 10년 가까이 사용하였으나 최근 3년간 Tortoise SVN을 사용해본 결과 이제는 소스세이프를 사용하는 프로젝트는 손까락도 대기 싫습니다. 업무 효율상 20%~30% 이상 이득을 보았다고 생각합니다.


특히 프로그래머, 팀장님들은 꼭!!! SVN 을 적극 활용하시기를 권해드립니다.



tortoise( 터틀스, 거북이) SVN 을 사용해야하는 이유


- 2명 이상의 작업자가 코드 수정이 가능

- 지능적인 자동 Marge

- 무료 공개 소스 프로그램

- 지속적인 업데이트

- 한글 지원

- 탐색기 기반

- 모든 프로그램 호환 (소스코드 뿐만이 아니라 그래픽, 기획자도 사용하기 편리함)

- 프로그램의 안정성

- 세세한 옵션 조정 가능

- 전폭적인 업데이트 로그 관리



스크린샷




Posted by 1010
98..Etc/SVN2009. 2. 25. 00:33
반응형
 
TortoiseSVN 사용법 정리

1. 저장소를 생성한다. ex) d:\RepositoryDir\Project1 에 생성 !

사용자 삽입 이미지

2. SVN 관련 설정 파일들의 설정을 바꾼다.

3. 프로젝트 폴더로 가서 필요한 부분의 파일과 폴더를 임포트한다.

* 주의할 것은 eclpise 로 테스트 해보았는데.. 자칫 모든 것을 한꺼번에 import 하게 되면 컴파일러가 .svn또는 _svn 폴더로 인하여 에러를 나타내는 경우가 있으므로 컴파일러에 맞추어서 import를 해준다.
ex)) Project1\res\layout, Project1\res\value, Project1\src\  폴더와 하위 파일들을 임포트하였다.

사용자 삽입 이미지


4. 저장소 보기를 통해서 svn에 접속.

5. 관련 파일에 관련된 디렉토리 생성.

사용자 삽입 이미지

 
¨Trunk
-프로젝트의 중심이 되는 폴더
-실제 개발 진행은 이곳에서 진행
¨Branches
-Trunk에서 뻗어나온 하나의 프로젝트로서 메인 프로젝트에서 분기하여 따로 개발을 진행
¨Tags
-버전 업이나 특정 시점에서 프로젝트 전체를 복사하여 보관하는

6. Project1_CheckOut 폴더와 같이 체크아웃용 폴더를 만들어서 그 곳의 폴더는 버전관리 프
로젝트에 쓰일 곳으로 하고 만든다.

7. 관련 디렉토리를 생성해주고, 관련 파일들을 체크 아웃을 해줘서 저장소에 있는 것을 그 곳에 복사시켜준다.
* 복사할 때에 _svn 폴더가 생기기 때문에 그 폴더가 생겨도 지장(컴파일러 에러) 없는 곳에다가 체크 아웃을 시켜준다.

8. 소스 하나만 바뀔 때에는 업데이트를 이용해주는 것이 적은 용량을 사용하므로 빠르다.

9. 프로그램이 많이 바뀔 때마다 커밋을 해주어서 적절한 코멘트와 함께 수정한 내역을 알려서 프로젝트에서 바뀐 부분을 알수 있게 해준다.

10. 파일 하나만 바뀌는 경우에는 업데이트 명령어를 해서 그 파일 하나만 저장소에서 빼와서 복사시킨다. 빠른 속도로 바꿀 수 있는 장점이 있다.

Posted by 1010