달력

52025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

Mantis 설치 방법 (Windows 에서)...

간단히 적어가자!!!

Mantis 설치하기 위해 필요한 상태는

Windows 경우 IIS 혹은 Apach, Php, MySQL 이 설치 되어야 한다..

하지만!! APM이라는 한번에 설치해주는 프리웨어가 있따!! 이걸 사용한다 !! 정말 간단해짐

http://www.apmsetup.com/ <-- APM  다운 받음 된다!!
http://www.mantisbt.org/ <--Mantis 다운

1. APM 5~7 버전을 다운받아 설치 한다.

2. %APM_SETUP% 기본설치 경로에 htdocs 폴더안에 Mantis를 다운받아 압축을 풀고 복사한다!!
-->%APM설치경로%\htdocs\mantis

3. APM 설치시 자동으로 mysql과 연동되어진다. 연동된 mysql을 Mantis DB로 사용시

phpMyAdmin 페이지로 들어간다. --> http://127.0.0.1/myadmin/

Mantis 사용할 새 데이터 베이스를 만들고 모든 사용권한을 주도록 하자!!

참고할것은 데이터 베이스 만들시 euckr_korean_ci를 선택해야 한글로 나온다는 점이다!! (잘 모름^^;;)

4.
Mantis 폴더 내의 config_defaults_inc.php 파일 내의 DB연동 부분 수정 and config_inc.php 도 수정

ex)
 $g_hostname    = 'localhost:3307';
 $g_db_username   = 'root';
 $g_db_password   = '';
 $g_database_name  = 'bugtracker';
 $g_db_schema   = ''; 
 $g_db_type    = 'mysql';

database_name 최초 Mantis에서 사용할 DB를 명시해준다.
이것을 토대로 아래 인스톨 설정을 맞춰준다!!

http://127.0.0.1/mantis/admin/install.php 로 들어간다.
mantis/admin/install.php <-- %APM설치경로의 htdocs안에 mantis라는 폴더가 있다는 과정하에 작성한것이다%
install.php 화면에서
Type of Database  -------------------MySql
Hostname (for Database Server)-------localhost or localhost:3306 기본 port다 혹 다른 mysql가동시 해당 port
Username (for Database) ----------사용자 계정 or root
Password (for Database) ----------해당 비번
Database name (for Database) ------Mantis DB (bugtracker)로 설정

최소 이부분만 작성후 install/Upgrad Dtatabase 를 클릭 하면 DB 설정 부분도 완료가 된다..

5. 최초 Mantis 접근시 
htdocs안의 admin 폴더 삭제를 요구한다.. 그냥 변경하자 폴더이름을..
또한 Administrator 기본 계정의 비번도 바꾸길 요구한다.. 기본 비번은 root가 된다!!

Mantis 설치 완료.. 한글 설정 및 메일 설정 Wiki 설정은 첨부파일로 참조하기 바란다.

단 한글 모드에서 영문 모드로 보고자 할경우!!! 왜?? Mantis 에서 Error 발생시 한글 모드에서는 정확한 표시가 나오지 않는다.. 그렇기 때문에 영문 모드로 변경..
변경하는 법은 
config_defaults_inc.php 파일내에서 411번줄..정도에
즉 $g_language_choices_arr 배열안에 들어가는 Korean 정보를 변경하면 된다.. 그럼 default로 English 가 설정된다..(편법인가)ㅡㅡ;;



첨부파일은 퍼온것인데.. 어디서 퍼왔는지 기억이 안난다.. 암튼 유용하게 잘 쓰고있어서 감사하다!!
  

Posted by 인천총각
|
여러 방법 시도 ..
DB쪽 문제인지 PHP쪽 문제인지 확실치도 않았다.(내경우)
현 상태 APM으로 설치된 MySQL은 Support 게시판으로 물여있고
Mantis DB는 새로 설치 하여 연결된 상태..

삭제시 혹은 이슈 할당시 즉, 메일 전송 관련 해서 DB작업이 이루어지면
데이터 질의 에러가 나왔다..
3일동안의 사투 끝에 궁극적인 해결은 아니라.. 해결..
문제는 Mantis 에서 시간과 함께 표시는되는 국제 표준 시간대 정보 즉(GMT+09:00)으로 설정 되어 있어야 하는데
Mantis에서 php 부분 로직에서 설정을 잘 못하는 바람에..
시간과 함께 상형문자로 출력되는 형상이 그 원인 이였다.
ex) 2010-07-07 11:01 JST 출력되어야 정상인데 2010-07-07 11:01  &#@*$&@$*@ 등 이상한 상형 문자로 출력됨
그렇기 때문에 DB에 상형문자 인코딩 에러가 발생 되었고, 즉 메일 전송이 불가피해진 상황 이였다.

처음 에러 접근시부터 이러한 것부터 시작했으면 좀더 빨리 해결하지 않았을까?
오랜 시간이 걸렸지만.. 하나하나 배워 나갈수 있어서 뿌듯했다.
하지만 시간은 금.. 명심하자!!
Error이 발생시 최초 로직 부터 하나하나 차근차근 밟아가야 한다는 사실!! 알면서 행하지 않았고, 오히려 더 미궁속으로만 접근을 하다보니 점점 더 해결이 안되었다는 점.. ^^;;;

해결 방법을 보자!!!
Mantis 설정 파일 .. (config_defaults_inc.php)
644번줄

$g_complete_date_format = 'Y-m-d H:i T'; --> $g_complete_date_format = 'Y-m-d H:i';
T--> 제거 (T 표준시간대 정보를 출력해주는 정보! 궁극적으로 로직에서 GMT로 변경해야하나.. 제거로 더이상 상형문자 출력 안되게 수정)

단 이 한줄 코딩작업으로 에러가 해결!!! 하하핫^^;;;




Posted by 인천총각
|

my sql 덤프; 복원;

HomeWork 2010. 7. 7. 09:55

1. 덤프 뜨기

mysqldump -u 사용자 계정 -p 데이터베이스명 테이블명 > 저장될 파일명

ex) mysqldump -u root -p mydb_name > mydb_name.sql
이렇게 하면 mydb_name을 모두 덤프를 뜨게 된다.

테이블만 덤프를 뜨고 싶다면?

ex) mysqldump -u root -p mydb_name member > mydb_name.member.sql
이렇게 하면 원하는 테이블만 덤프를 뜰 수 있다,


2. 복구 하기
mysql -u 사용자계정 -p DB명 < 덤프 파일명
예) mysql -u root -p < 덤프파일명.sql
예) mysql -u root -p mydb_name <덤프파일명.테이블명.sql


Posted by 인천총각
|
매번 찾아서 하기도 힘들더라.. 이참에 정리좀 해야지 ㅎㅎㅎ

mysql root 비밀 번호 분실시..

win 버전 이다

%SQL경로%> mysqld --skip-grant

새 cmd창 띄운다!!

%SQL경로%> mysql -u root -p
비번 물음> 엔터!!!!!!!!!

그다음
use mysql
update user set password=password('root') where user=('root')
변경 하면 끝....

참 쉬운건데도 외워야겠다 ㅎㅎㅎㅎㅎㅎㅎㅎㅎ
Posted by 인천총각
|
1장
현재의 우리는 반복적으로 하는 행동의 결과이다.
그러므로 탁월함이란 행동이 아니라 습관이다. - 아리스토 텔레스

신중하게 습관을 선택하자!!                                              
아이디어를 크게 3영역으로 분리
인프라스트럭처- 편리하게 해주는 소프트웨어(버전관리,빌드,지속적빌드,이슈추적,기능추적,테스트작성)
기술 - 자신의 일이나 팀의 일을 업무 목록으로 정리하여 일일 회의 진행해라 즉, 팀의 동료가 무슨일을 하는지 파악
프로세스 -예광탄 개발

아이디어를 제시하게 전에 팀에 어떤 이득이 되는지 부터 확실하게 해둬야 한다.
팀 전체가 필요한 도구,기술,프로세스에 접근할 수 있도록 해야한다. 무엇이 왜 효과적인지 알아야 팀을 효과적으로 이끌어 나갈수 있다.

기민함?
기민함이란 소프트웨어 개발팀이 변화하는 환경에 재빨리 적응하는 능력을 일컫는다. 이것은 변화하는 요구사항에 맞춰 재설계하는 걸 뜨하기도 하고, 새로운 버그에 신속히 대처하거나 새기술을 빨리 도입하는 걸 뜻할 때도 있다.
- 프로세스나 도구보다는 사람과 상호 작용에
- 포괄적인 문서보다는 실제로 도움이 되는 소프트웨어에
- 계약 협상 보다는 고객과의 협력에
- 계획을 따르는 것보다 변화에 맞추어나가는 것에

2장
코딩하는 시간이 기능을 추가하는 데 소요되는 유일한 비용은 아니다. 훗날 기능 확장이 어려워지는 것도 비용 중 일부이다. 상충되지 않는 기능들을 고르는 게 중요하다. - 존 칼맥

집짓는 두남자 이야기(연장을 구매하고 사용법 익히는 것을 투자한 후 짓는 것과 갖고 있던 연장으로 집을 짓기 시작한 둘의 차이점) 즉 개발자 관점에서 연장은 도구이다!
도구가 일상 업무에 긍정적이 영향을 미칠수 있을지 생각해 봐야 한다. 무턱대고 이미 익숙한 도구를 사용하기 보다는 프로젝트에 필요한 도구를 선택하여 사용하는 것이 훗날 더 좋다!

회사 소스관리는  SCM(소스코드관리시스탬) 을 사용하자! 추천 CVS,SVN 또한 버그추적 관리 (Mantis등) 의 습관을 들여 버그 수정건에 대해서도 쉽게 찾을수 있도록 관리하는 습관을 가지자! 즉 SCM을 도입하므로 불필요한 시간을 제거 할수 있다. 명확히 프로젝트를 진행하는 거랑 활동하는 것이랑은 틀리다는점 !!

모래상자 안에서 개발하기!!!
적당한 시기가 올 때까지 자신이 하는 일때문에 다른 사람이 방해받지 않게 해야한다. 이것을 모래상자 개발이라 한다. 모든 개발자가 자신만의 놀이터에서 놀고, 다른 사람을 귀찮게 하지 않는 것!!
즉, 소스 코드와 기타 파일을 디스크 드라이브를 통해 공유한다면? 누군가 파일 하나를 조금만 수정한다면? 코드를 컴파일 한다면 곧바로 다른 개발자가 그 영향을 받는 다는 뜻이다.
SCM 소스관리 시스템을 사용. 즉 모든 소스코드는 repository(저장소)를 통해 공유 하자! repository를 통해 공유한 자료는 정확한 버전의 파일을 꺼내도록 해준다.
즉, 현 우리가 사용하는  SVN을 사용하여 Commit 하여 복사본 가지고 개발 , 수정후 빌드하고 releases 시키는 것을 모래상자 안에서 개발 한다 라고 정의 할수 있다.

자산을 관리하자!!
필요한 부분이라면 체크인 하자!!
제품을 빌드,배포,실행시키는 데 필요한 모든 것이 소스코드 관리 시스템이 있어야 한다!
활동 없는 저장소, 상용되지 않는 저장소는 쓸모 없는 저장소이다. 개발자 각자가 정기적으로 체크인하고 체크아웃해서, 매 시간마다 활동하는 걸 볼 수 있어야 한다.

빌드를 스크립트화 하자!!
IDE 툴 내에서의 빌드가 아닌 스크립트를 사용하여 제품을 빌드하고 인스톨러를 만들어 테스트를 하자!
즉, 프로젝트 초반에 시간을 투자하여 제품 빌드 스크립트를 만들자! 또한 어떠한 컴퓨터에서라도 빌드가 되도록 만들어야 한다. 추천 JAVA 빌드 스크립트 Ant 가 있다. 

자동으로 빌드하자!
무인빌드= 자동빌드를 말한다
이상적으로 크도가 변경될 때마다 다시 빌드 해야한다. 그렇게 하면 어떤 변경상항이 빌드를 깨트리는 즉시 그 사실을 알 수 있다. 이런 종류의 시스템을 지속적이 통합(Continuous Integration) CI라고 한다.CI 도구는 컴파일되지 않는 코드를 상항 표해시 놓는다. 즉 인간이 곧잘 놓치는 상세 내역을 잡아주는데 도움이 된다.
모든 CI 시스템이 HTML로 결과를 출판 할 수 있고 Email로 보낼수도 있다.
지속적으로 테스트 하자(Junit 사용- Maven(Ant+Junit) 사용하자)

이슈 트래커 사용하자........아 졸립다 내일 정리하자 ㅠㅠ




Posted by 인천총각
|
갑자기 버그 트래커 Mantis에서 메일 전송이 안된다..
어제부터 Mantis 설정 수정하는데.. 구글링 해도 도저히 답이 없음 ㅡㅡ; 뭐가 문제인지..... 찾아보자..
--------------------------------------------------------------------------------------------------------

Mantis mail 설정시-

config_inc.php 파일안에 메일 정보를 추가해 주면 된다는데...

--> 메일 설정 정보 파일은 config_defaults_inc.php 에서 찾아다 붙여 놓음 된다!!

 $g_smtp_host = 'mail.stable.co.kr';
 $g_smtp_username='sowlgns@stable.co.kr';
 $g_smtp_password = 'XXXX';
 $g_phpMailer_method  = 2;
 $g_administrator_email = 'no-reply@stable.co.kr';
 $g_webmaster_email  = 'no-reply@stable.co.kr';
 $g_from_email   = 'no-reply@stable.co.kr';
 $g_from_name   = 'Mantis Bug Tracker';
 $g_return_path_email = 'no-reply@stable.co.kr';

이렇게 추가해도 메일은 여전히 안온다.. 흐음 $g_phpMailer_method  = 2 은 SMTP 방식인데..
SMTP 테스틀 해보자!!!
실행-> cmd
c:\> telnet mail.stable.co.kr 25 입력
.
.
220 Welcome to WHOISMAIL.NET SMTP Server ESMTP
helo me
250 Welcome to WHOISMAIL.NET SMTP Server
mail from:sowlgns@stable.co.kr
250 ok
rcpt to:sowlgns@stable.co.kr
250 ok
Data
354 go ahead
Subject:This is a test

Testing

.
250 ok 1278031394 qp 29598
quit
221 Welcome to WHOISMAIL.NET SMTP Server
--------------------------------------------------------------------------------------------------------
This is a te4sst   Testing 로 메일 수신 확인..
SMTP 문제는 아니다..
흐음....

휴........................

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

프로그램 실행할때 출력됨

File 'NONEXISTENT/charsets/?.conf' not found (Errcode: 2)
Character set '#19' is not a compiled character set and is not specified in the 'NONEXISTENT/charsets/Index' file

혹은

원인 : 소스를 컴파일 한 곳과 컴파일된 바이너리 화일을 실행한 컴퓨터와의 mysql 설정이 달라서 나오는 에러(mysql이 설치된 경로가 다르면 이러한 현상이 발생할수 있다.)

처리방법

  방법 1. 컴파일 하는곳과 실행하는곳의 mysql 경로를 똑같이 해준다

  방법 2. 에러로 출력되는 경로를 심볼릭 링크등으로 연결해준다.

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

웹에서 가져온 추가 설명

이 에러는 mysql command 를 사용할때, php+apache 에서 웹접속을 할때,
php line command 로 사용할때 모두 발생할 수 있는데요..

(apache 로 접속할 경우 페이지에는 에러가 안뜨지만 apache error log에는
이 에러가 계속적으로 쌓입니다. 이래서 disk가 full 이 되는 경우도 있죠..)

원인은 mysql 서버쪽에 character-set을 euc_kr 로 설정을 했을때
mysql client 쪽에는 euc_kr 언어팩이 설치되지 않았기 때문입니다.

~mysql/share/mysql/charsets/Index 에 보면 euc_kr 번호가 19번입니다.

예전에 mysql 을 binary로 깔거나 php 설치시 기본적으로 있는 mysql library를 사용하면
character-set 이 latin1 만 적용되어서 이런문제들이 종종 발생하는거 같네요..

문제를 해결하려면 client 쪽 mysql을 euc_kr 언어팩을 포함해서 설치하면 되구요..

(--with-charset=euc_kr 혹은 --with-extra-charsets=complex 혹은 latin1,euc_kr
요즘엔 바이너리 배포본이 default 가 --with-extra-charsets=complex 로 설정되었다고 하네요
테스트는 안해봤지만 바이너리 배포본을 깔아도 문제가 없을거 같네요..)

현재 client가 PHP 이므로.. PHP 설치패키지에 있는 mysql을 그냥 설치하지 마시고..

mysql을 별도로 상기 옵션으로 설치한 후 PHP 설치할때 "--with-mysql=mysql설치디렉토리"

옵션을 주시면 되겠습니다.


다른 방법으로는 mysql server 쪽의 character-set을 latin1으로 바꿔도 문제는 없어집니다.

(my.cnf 에서 default-character-set=latin1 이라고 하면 되겠죠..)

그런데 이렇게 하면 한글 indexing 이나 order by 가 제대로 먹히지 않게 되므로..

앞의 방법이 좀 더 확실한 방법이라고 생각됩니다.

http://www.andstory.com/zb41/zboard.php?id=tip_board&page=14&page_num=20&select_arrange=reg_date&desc=&sn=off&ss=on&sc=on&keyword=&category=&no=95

퍼옴^^;;

--------------------------------------------------------------------------------------------------------미해결 ㅜㅜ

Apache log에 쌓이는 'NONEXISTENT' Error 는
%SQL경로%\my.ini (리눅스 my.cfg) 파일에서 default-charachter-set=변경
변경해주면 log는 안쌓인다..
하지만 웹페이지마다 데이터 질의 에러는 여전하다.. ㅜ.ㅜ
#33 에러는 utf8 형식
#19 에러는 euckr 형식 에러이다
기본적으로 latin1로 설정해주면 Error Log 는 쌓이지 않으나 궁극적으로 아직 해결 되지 않는다..

아.. 어느 방법을 동원해도 해결이 안되는건가..
결국 재설치를 해야하는 것인가 ㅠㅠ;;;

--------------------------------------------------------------------------------------------------------
해결^-^ 기븐 좋다 아 ~~~ 3일간의 삽질끝에.. 역시나 알고보면 쉬웠는데..
경험 부족 ㅎㅎ

해결 한 법은 따로 올려야겠다^^ ㅋㅋ


Posted by 인천총각
|
이슈 트래커는 원래 버그 트래커(Bug Tracker)에서 출발했다. 즉 소프트웨어 버그 목록을 관리하는 도구였던 것다. 그런데 사용하다 보니 꼭 버그라고는 부를 수 없지만 비슷하게 관리해야 하는 이슈들이 생겼고 그래서 아예 폭을 좀 넓혀 이슈 트래커라고 하고 기능을 약간 확장한 것이다. 맨티스나 버그질라도 처음엔 버그 트래커라고 불렀지만 이제는 이슈 트래커라 부른다.

Mantis 장점-

1, 세부카테고리, 재발생 가능성, 심각성과 같은 벌레보고 기본정보 필드가 잘 정의 되어 있고 추가 필드의 커스터마이징이 편합니다.

2. 심각성 항목의 경우 [새 기능 요구][사소한 벌레][오타][중요한 벌레][중요하지 않은 벌레]... 등으로 세분화되어 구분되어 있는게 마음에 들었습니다.
개발자가 원하는 벌레 정보를 잘 알고 있다는 생각이 자연스럽게 듭니다.

3. 담당자에게 벌레를 할당하면 보고자, 할당받은 담당자 그리고 이 벌레를 모니터링 하겠다고 등록한 사용자들에게 변경사항을 메일로 발송해줍니다.
기본적으로 모두 있는 기능이겠지만 무료 제품이 이정도까지 지원해주는데 놀랐습니다.

4. 벌레에 대해서도 [벌레인정][벌레아님][피드백][해결된 벌레]식의 세부 진행사항 정의가 되어 있어서 자세하게 진행사항을 파악할 수 있습니다.

5. 벌레에 대한 히스토리가 모두 저장되어 진행사항 파악이 편합니다.

6. 내보내기 기능이 잘 되어 있어서 Word, 엑셀로 내보냈을 때 조금만 편집하면 보고용으로 사용할 수 있을 정도입니다.

7. 한글화가 잘 되어 있습니다.
무시못할 장점이겠죠.



1. 버그를 올린 사람은 자신이 포스팅한 버그의 진행사항을 보고, 다음 테스트시에 반영할 수 있다.

2. 개발자는 자신에게 할당된 버그들만 신경 쓰면 되기 때문에, 불 필요하게 버그를 찾아내는 일이 줄어들었다.

3. 관리자는 버그진행상황을 요약해서 볼 수 있으므로 일의 진행 속도를 알수 있다.


나와 상관없는 버그라도 관심있는 버그들을 등록해 놓아 진행되는 사항들을 나에게 메일이나 웹페이지를 통해서 알려주기 때문에 중요한 버그들은. 수정되는 과정중에 개입이 편리하다. 그리고, 과거 버그 수정 시간에 얼마큼의 버그가 밀려 있는지 가늠이 안되던 것들이 갯수별로 중요도별로 요약정리되는 기능이 있어서 보고 하기도 편리해 졌다.. 그리고, 공개프로그램이라는... 장점이 있어서 회사내에서 쓰기도 법적인 제한도 없다! 


참고주소
http://www.darkfox.info/entry/%EB%B2%84%EA%B7%B8%EC%B6%94%EC%A0%81-%EC%8B%9C%EC%8A%A4%ED%85%9C-mantis-%EC%82%AC%EC%9A%A9%EA%B8%B0





이슈 등록-

맨티스의 버그 등록 화면

이슈 검색

맨티스의 이슈 찾기

단순 필터 화면인데 사실 고급 필터를 눌러도 항목은 똑같다.
다만 각 항목에서 선택의 자유도가 좀 더 높아진다. 예를 들면 상태의 경우 단순 필터에서는 새로운 이슈만 본다거나, 해결된 이슈는 제외한다거나 하는 건 가능하지만 폐쇄된 이슈와 검토 중인 이슈만 본다거나 하는 복잡한 조합은 불가능한데 고급 필터에서는 이것이 가능하다. 항목이 너무 많다보니 어지러운 감이 있는데 실제로 사용하는 항목은 얼마 되지 않고 이슈 상태, 우선순위, 할당 정도다. 가끔 날짜로도 검색하면 된다. 다행히 맨티스에는 선택한 검색조건을 저장하는 기능이 있어 필터 저장 버튼을 누르면 현재 검색조건이 저장된다.

이슈 처리 과정

맨티스의 이슈 보기 화면과 수정 화면

맨티스의 이슈 보기 화면과 수정 화면


이슈를 등록하고 찾았으면 이제 해당 이슈에 대한 작업을 해야 한다. 이슈를 읽고 답글을 달거나, 상태를 변경하고 우선순위를 변경하는 등 다양한 작업이 있다. 일단 이 중에 제일 중요한 상태 변경 작업만 살펴보겠다. 맨티스는 이슈를 보는 화면과 수정하는 화면이 위와 같이 분리되어 있는데 이슈를 보는 화면에서는 이슈에 대한 상세한 내용은 수정할 수 없지만 대신 할당이라든지 상태 변경 같은 작업은 할 수 있다. 그래서 실제로 등록된 이슈의 내용을 수정하는 경우가 아니면 이슈 수정화면은 거의 열 필요가 없다. 하지만 변경 작업을 할 때 코멘트를 입력하는 화면으로 넘어가기 때문에 실질적으로 작업이 한 화면에서 일어나진 않는다.

중복된 이슈 다루기-

이슈 트래커에서 또 하나 골치아픈 문제가 바로 중복된 이슈이다. 이슈를 등록하는 사람은 대개 프로젝트팀 외부에 있는 경우가 많다 보니 현재 어떤 이슈가 올라와 있는지에는 관심이 없다. 그러니 같은 이슈라도 계속 등록한다. 따라서 이런 문제를 효과적으로 처리할 수 있는 장치가 필요하고. 이 문제에 대한 처리 방식은  이슈를 중복된 이슈로 설정하고 같은 내용을 담은 원래 이슈 번호를 기록하게 한다. 그리고 그 이슈는 닫고 원래 이슈만 계속 다룬다.

로드맵-

맨티스의 로드맵 기능

목표한 릴리스에 포함될 이슈들을 지정하면 릴리스 스케쥴링을 할 수 있다!..
Posted by 인천총각
|
EL (Expression Language)

- JSP 2.0 스펙에 포함되어 JSP에서 자바 scripting 대신에 데이터를 출력하기 위한 기능이 확장된 표현언어이다!!

- 특징!
      1. 변수와 연산자를 포함할수 있다.
      2. JSP의 scope에 저장된 속성 및 자바 빈 속성도 EL의 변수로 사용 가능하다
      3. EL 자체의 내장객체가 제공된다.
      4. 표현식에는 숫자, 문자열, boolean 값과 null도 포함할 수 있다.

- 방법!
      ${표현식}
- 주의 사항
      기본적으로 EL 사용을 무시하도록 설정됨, 반드시 page Directive에서 isELlgnored = "false" 로 설정한다.

JSP액션 
<jsp:setProperty name="user" property="timezonePref" value='<%=request.getParameter("timezone")%>'>

ex) JSP액션의 애트리뷰느는 정적 캐릭터 스트링이나 익스프레션을 사용하여 지정된다. 위와 같이 <jsp:setProperty>액션의 name과 property 애트리뷰트를 위해 지정된다.반면 익스페레션은 이것의 값 애트리뷰트를 지정하는데 사용된다. 이 액션은 요청 매개변수의 현재 값을 이름이 붙영진 빈 속성으로 할당하는 효과를 갖고 있다. 애트리뷰트 값을 동적으로 지정하기위한 JSP 스팩에 내장된 유일한 메커니즘이다.!! JSP액션은 익스프레션을 사용하여 지정되기 때문에 다른 스크립팅 엘리먼트와 같은 소프트웨어 관리 문제가 일어날 수 있다. 이런 이유로 인해 JSTL 커스텀 태그는 동적 애트리뷰트 값을 지정하기 위한 대안 메커니즘을 지원한다. JSP익스프레션을 사용하는 것보다 JSTL 액션용 애트리뷰트 값이 단순화된 EL을 사용하여 지정 될수 있다. EL은 JSP 컨테이너에 있는 데이터를 검색 및 조작할 식별자, 접근자, 연산자를 제공한다. EL은 객체와 속성들을 검색하면서 간단한 작동을 수행한다. 이것은 프로그래밍 언어도 스크립팅 언어도 아니다. JSTL 태그와 결합하면 간단하고 편리한 표기를 사용하여 복잡한 작동이 표현 될 수 있다!!!!

JSTL액션
<c:out value="${user.firstName}"/>

예제)
EL 사용 
JSP 페이지 선언시 isELIgnored="false" 를 추가하여야 한다!!

<%@ page language="java" import="java.util.*" contentType="text/html;charset=euc-kr" isELIgnored="false"%>
버젼에 따라 명시 유무가 틀리지만 isELIgnored="true" 할 경우에는 지원하지 않는다. 아래오 같이 표현식이 출력된다!!



 isELIgnored="false" 로 설정할 경우!! 아래와 같이 값이 출력되는것을 확인 할수 있음!! (..) source~



<td width="7%" class="a"><span>${m.name}</span></td>
<td width="5%" class="a"><span>${m.age}</span></td>
<td width="11%" class="a"><span>${m.weight}</span></td>
<td width="5%" class="a"><span>${m.height}</span></td>
<td width="7%" class="a"><span><%=m.getSex() %></span></td>

여러개의 익스프레션들과 정적 테스트를 결합하여 스트링 연결을 통해 동적 애트리뷰트 값을 만들 수 있다!
개별 익스프레션들은 식별자,접근자,리터럴,연산자구성되며 식별자는 데이터 센터에 저장된 데이터 객체를 참조하는데 사용된다. EL은 11개의 식별자를 보유하고 있다!! 리터럴은 고정된 값들(숫자,문자,스트링,부울,null)을 나타낸다.
연산자는 데이터와 리터럴이 결합 및 비교될수 있도록 한다.

정적 텍스트와 여러 EL익스프레션을 결합하여 동정 애트리뷰트 값 지정!!
<c:out value="Hello ${user.firstName} ${user.lastName}"/>
EL은 범위 변수 같은 객체들을 검색하는 빌트인을 지원한다. 특히 EL의 내장 객체중 하나라도 상응하지 않는 EL 익스프레션에 있는 식별자는 네 개(page,request,session,application) 의 JSP SCOP 중 하나에 저장된 객체를 참조하는 것으로 자동 간주 된다..!!!

쉬어가자!!! JSP Action!! 이란??
객체 생성 <jsp:useBean>
객체 속성값 setProperty
객체 속성값 알아보기 getProperty
JSP 액션을 통해서 생성된 객체는 그 객체가 사용될 수 있는 Scope 혹은 LifeCycle을 갖는다.
이것은 생성된 객체의 Reference가 어디에 사용 될 수 있고, 언제 삭제될 것인가를 가진다.
생성된 객체의 라이프 사이클은 scope속성에 의해서 결정되며 가장 긴 LifeCycle 은 application 이고, 가자 짧은 LifeCycle는 page다.

# SCOPE 속성
page 단일 클라이언트 요청에 의해서 생성된 페이지 내에서 접근하여 사용될 수 있다. 실질적으로 PageContext 저장
request 단일 클라이언트 요청이 처리되는 동안에 접근하여 사용될 수 있다. 실질적으로 HttpServletRequest 저장
--page vs request : request에서는 forward나 include를 사용해서 다른페이지로 제어가 이동되는 경우에도 접근이 가능
session 사용자의 세션이 유지되는 어느 곳에서나 접근해서 사용할 수 있다. 실질적으로 HttpSession에 저장
application 웹 응용프로그램의 LifeCycle동안에 웹 응용프로그램 에 소속된 임의의 Servlet 과 JSP에서 접근해서 사용할수 있다. 실질적으로 ServletContext에 저장

# EL 내장객체
 Category 식별자  설명 
 JSP  pageContext 현재 페이지의 프로세싱과 상응하는PageContext 인스턴스
 범위  pageScope 페이지 범위 애트리뷰트
   requestScope 요청범위 애트리뷰트
   sessionScope 세션범위
   applicationScope 애플리케이션 범위
 요청 매개변수  param 요청매개변수의 기본값을 이름
   paramValues 요청매개변수의 모든값을 StringArea
 요청 헤더  header 요청헤더의 기본값을 이름
   headerValues 요청헤더의 모든값을 StringArea
 쿠키  cookie 요청에 수단되는 쿠키들을 이름으로
 초기화 매개변수  initParam 초기화 매개변수를 이름으로 지정

# JSP 와 EL 내장객체가 일반적인 하나의 객체를 갖는 반면(pageContext)다른 JSP 내장 객체는 EL에서 접근가능하다.
pageContext가 다른 8개의 JSP내장 개체 모두에 Access 할 수 있는 attribute을 갖고 있기 때문.. 

남아있는 모든 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은 Application 데이터(범위 변수를 통해 노출) 또는 환경 관련 정보(EL 내장 객체를 통해 노출)를 포함하고 있는 객체 계층을 트래버스 할 수 있다.

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

산술 연산자를 사용하는 EL 익스프레션

${item.price * (1 + taxRate[user.address.zipcode])} 

관계형 연산자 및 논리적 연산자를 사용하는 EL 익스프레션

${(x >= min) && (x <= max)}

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

예제)

Scope - application 사용



결과



Source
<jsp:useBean id="m" class="JSTL.MemberBean" scope="application"/>
<td width="7%" class="a"><span>${applicationScope.m.name}</span></td>

Param사용



결과


Source
<td width="7%" class="a"><span>${param.name}</span></td>

initParam 사용


결과


Web-app 초기 설정


Source
<td width="7%" class="a"><span>${initParam.name}</span></td>


커스텀 태그?
EL 이나 JSP의 표준 액션으로 구현하기 어려운 부분을 해결하기 위해 필요해 의해서 만든 태그를 의미한다!

JSTL (JSP Standard Tag Library)
: 가장 일반적으로 많이 사용되는 커스텀 태그를 표준화 시켜 라이브러리 형태로 제공하는 것!(JSP 2.0 에 포함)
, 일반적으로 모든 개발자가 가장 필요로 하는 구현 내용을 표준 태그로 제공


JSTL을 사용하기 위해서 !!! 준비사항 ㅎㅎ

- JSTL 라이브러리를 다운받아 클래스 패스에 설정!
- JSP에서 taglib 태그로 사용할 라이브러리를 지정!

JSTL 구성요소
- CORE : 공통 필수 기능
- XML : XML 문서 처리 관련 기능
- I18N : 국제화 지원 관련 기능
- SQL : JDBC를 이용한 DB처리 기능

JSTL 라이브러리별 taglib URL과 Prefix

 Libray URI  Prefix 
 CORE

http://java.sun.com/jsp/jstl/core

 c
 XML http://java.sun.com/jsp/jstl/xml  x
 I18N(국제화) http://java.sun.com/jsp/jstl/fmt  fmt
 SQL http://java.sun.com/jsp/jstl/sql  sql

페이지 지시어에서 사용법

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

CORE Libary
수식,흐름제어,URL을 통한 자원 접근등 가장 일반적으로 필요한 기능으로 구성




일반적인 것

# <c:out> 화면에 해당 변수값을 출력한다.
<c:out  value="변수명" default="기본값" escapeXml="boolean값"/>
escapeXml 기본값은 true이다. true로 설정되면 값 중에 포함된 < > & ' " 값등을 escpae문자로 출력한다( &lt, &gt ;등)
변수명 값이 null일 경우에는 공백으로 출력 된다.

예제)
JSTL <c:out> 사용 결과


source
1. <%@ page language="java" import="java.util.*" contentType="text/html;charset=euc-kr" isELIgnored="false" %>
2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 사용
3. <jsp:useBean id="m" class="JSTL.MemberBean"/> <jsp:setProperty name="m" property="*"/>
4. <td width="7%" class="a"><span> <c:out value="${m.name}"/> </span></td>

# <c:set> EL 변수에 값을 설정 및 객체의 멤버변수값 설정 ;
   JSP의 setAttribute() 메소드와 같은 역할을 하며 Scope에 속성을 설정한다.
<c:set var="변수명" value="변수값" target="자바빈/Map객체" property="자바빈/Map객체의 속성명" scope="scope중"/>
scope의 기본값은 page이다!!!
기본예)
<c:set var="varName" value=value"/>
<c:set var="varName" value=value" scope="request"/>
<c:set var="varName" value=value" target="ObjectName" property="propertyName" />

예제)
source..
<c:set> 설정부분


<c:out>로 설정된 <c:set> 을 출력!!!


기본 입력 화면.. 내용 입력후 전송!!


결과 화면.. 위 기재한 내용과 틀림..
<c:set>으로 설정된 이름, 나이, 키 가 출력된다!!



# <c:remove> : JSP의 removeAttribute() 메소드와 같은 역할을 하며 scope의 속성값을 제거하다.
<c: remove var="변수명" scope="scope중 하나"/>
var : 삭제할 변수명(필수)
scope : 삭제할 범위(선택)
* scope의 기본값은 page 이다.
* scope가 맞지 않으면 제거 되지 않는다!

예제)
<c:set var="name" value="이동훈" target="JSTL.MemberBean" property="name"/>
<c:remove var="name"/>

# <c:catch> : 예외처리 코드( 바디에서 실행되는 코드의 예외를 잡아낸다)
<c:catch [var="varName">
nested actions
</c:catch>



조건 관련!!

# <c:if> 조건문 사용시 사용 else지원하지 않는다(else 구현은 <c:choose>로 사용)
<c:if test="조건식" var="변수명" scope="scope중하나"/>
if문의 결과값이 var 속성값으로 설정된다!!!

예제)

<c:if test="${m.name==null}" var="aaa">
   <tr>
    <td colspan="5" class="a"><span>이름을 입력하세요!!</span></td>
   </tr>
</c:if>
<c:if test="${!aaa}"> //위 조건식에서 {m.name==null}이 아니면  aaa속성값에 false를 반환한다!!

   <tr>
    <td width="7%" class="a"><span><c:out value="$m.{name}"/></span></td>
    <td width="5%" class="a"><span><c:out value="${m.age}"/></span></td>
    <td width="11%" class="a"><span><c:out value="${m.weight}"/></span></td>
    <td width="5%" class="a"><span><c:out value="${m.height}"/></span></td>
    <td width="7%" class="a"><span><c:out value="${m.sex}"/></span></td>
   </tr>
</c:if>

결과


# <c:choose> 자바의 switch 문과 같다!(조건식에 문자열 사용가능하다)
# <c:when> 자바의 switch 문과 같다!(조건식에 문자열 사용가능하다)
# <c:otherwise> 자바의 switch 문과 같다!(조건식에 문자열 사용가능하다)
<c:choose>
     <c:when test="조건식">body내용</c:when>
     <c:when test="조건식2">body내용</c:when>
     <c:otherwise>body내용</c:when>
</c:choose>
조건식이 만족하면 body내용을 수행한다!!
만족하는 조건식이 없는 경우에는 otherwise를 수행한다.!!

예제)

<c:choose>
    <c:when test="${m.name==null}">
      <tr>
        <td colspan="5" class="a"><span>이름을 입력하세요!!</span></td>
      </tr>
    </c:when>
    <c:otherwise>

      <tr>
        <td width="7%" class="a"><span><c:out value="${m.name}"/></span></td>
        <td width="5%" class="a"><span><c:out value="${m.age}"/></span></td>
        <td width="11%" class="a"><span><c:out value="${m.weight}"/></span></td>
        <td width="5%" class="a"><span><c:out value="${m.height}"/></span></td>
        <td width="7%" class="a"><span><c:out value="${m.sex}"/></span></td>
      </tr>
    </c:otherwise>
</c:choose>



반복 관련!!

# <c:forEach> 반복실행시 사용!! 자바의 for문과 유사하며 가장 유용한 JSTL 태그중 하나다!! 
<c:forEach items="박복할 객체명" begin="시작값" end="마지막값" step="증가값
                                                               var="변수명" varStatus="반복횟수변수명"/>

반복횟수는 varStatus의 변수명 .count 프로퍼티를 이용하여 구한다!!

예제)
<c:forEach var="current" varStatus="status"...>반복횟수를 구하고 싶으면 ${status.count}로 구현
1.    
<c:forEach var="itr" begin="0" end="4" step="1">
     <td><span>반복</span></td>
</c:forEach>

2.
<c:set var="intArray" value="<%= new int[] {1,2,3,4,5} %>"/>
    <c:forEach var="names" items="${intArray}">
        <td><span><c:out value ="${names}"/></span></td>
    </c:forEach>


3.
 <c:set var="totalCount" value="100"/>
 <c:set var="perPage"  value="20"/>
....
<tr>
    <c:forEach var="boundaryStart" begin="0" end="${totalCount-1}" step="${perPage}">
     <td>
      <span>
       <a href="?start=<c:out value="${boundaryStart}"/>">
       [
       <c:out value="${boundaryStart}"/>
       -
       <c:out value="${boundaryStart+perPage-1}"/>
       ]
       </a>
      </span>
     </td>
    </c:forEach>
   </tr>
   <tr>
    <td>
     <c:forEach var="current" varStatus="status" begin="${param.start}" end="${param.start + perPage-1}">
      <tr>
       <c:if test="${param.start != 0}">
        <c:forEach var="tt" begin="1" end="${param.start/20}">
          <td class="a"></td>
        </c:forEach>
       </c:if>
       <td>
        <c:out value="${current}"></c:out>
       </td>
      </tr>
     </c:forEach>
    </td>
   </tr>

....
2번 결과
1번 결과
3번 결과











URL 관련!!

#
<c:import> 내부자원을 포함할 때 사용된다. <jsp:include>액션과 유사
<c:import url="읽어올 자원" var="읽어올 데이터를 저장할 변수명" scope="scope"
  varReader="자원을 Reader객체로 읽어올때 사용" charEncoding="읽어올 데이터의 캐릭터셋지정"/>

예제)
<c:set var="url" value="http://sowlgns.tistory.com"/>//url 지정
..
<c:import url="${url}" var="u" charEncoding="EUC-KR"/>
<c:out value="${url}"/> import하기
 <hr/>
<c:out value="${u}"></c:out> //import 한 url 데이터 출력!!
..
결과)


# <c:url>  : URL  Rewriting 방식으로 URL 정보를 다룬다.
<c:url value="url주소" context="context" var="변수명" scope="scope중 하나"/>

# <c:param>  : import, url,. redirect 태그에서 파라미터 값을 설정 할때 사용한다.
<c:param name="name" value="value/>

# <c:redirect>  : response,sendRedirect 나 <jap:forward> 액션 대신 사용할 수 있다.
<c:redirect url="value" context="현재 웹어플리케이션의 context "/>







'HomeWork' 카테고리의 다른 글

07-02 / Mantis Mail 설정 Error & Mantis DB 질의 Error  (0) 2010.07.03
이슈 트래커- 버그 추적 시스템 Mantis ^^  (1) 2010.02.05
초간단 JSTL 집고 넘어가자!!  (0) 2010.01.19
GridBagLayout~ㅎㅎ  (0) 2010.01.15
Thread ^^;;  (0) 2009.12.23
Posted by 인천총각
|

1. 개요

JSTL(JSP Standard Tag Libray)

JSP에서 자바의 각종 기능을 태그형태로 사용할 수 있도록 정의해서 사용할 수 있는 것을 말합니다.

쉽게 말해서 굳이 자바나JSP언어를 쓰지 않고 태그형태로 HTML상에서 불러다 쓸 수있다는 말이죠.

JSTL은 커스텀태그의 일종입니다. 그렇다면 또 커스텀 태그가 뭐란말인가요;

커스텀태그

자신이 직접 정의할수있는 태그를 말합니다. 평소에 쓰던 태그는 각각기능이 있지만 (HTML쓰시면서 태그좀 쓰신분 많이 있으실겁니다 ㅎ) 하지만 그 기능은 한정되어있고 원하는 기능이 있지만 일반적인 태그의 기능이 한정되었음을 느끼실때가 많으셨을겁니다. 그것을 대비하여 자기 자신이 새로운 태그를 만들어 자신만의 태그를 만들수 있다는거죠.

 커스텀태그의 장점

라이브러리 형태로 만들어서 필요할때마다 쓰기 때문에 개발속도의 향상 업

일반 태그의 한계점 극복

자기가 직접작성한 태그이기 때문에 유지보수 및 가독성 업

반복적 기능을 쉽게 구현이 가능하기 때문에 효율적

 최대한 자바코드를 줄이기 위해 거의 모든 자바 코드를 커스텀태그로 바꾸어 놓은 것을

JSTL이라고 보시면되겠습니다.

 EL(Expression Language)

표현언어를 의미합니다. 자바코드를 대신하여 다른 표현식을 사용합니다.

 <%=age%>   ===>> ${age} 이런형식으로 바꾸어 쓸수있다는겁니다.

쉽게 말해서 저런 형태로 변경해서 쓴다는 개념입니다. 일반태그의  < >사이에 표현식을 쓰게 되면 굉장히 복잡하고 갇고성도 떨어지겠죠. < > 사이에 ${}이런형식이라면 눈에띄고 쉽게 분간이 갈수 있겠죠. EL을 쓸때는 ${변수명} 이런형태로 구성되어 있습니다.

 대체 무슨말일까요. 하시는 분들은 다음 예제를 보시면서 감을 잡아가시기 바랍니다.

JSTL을 이용하여 정말 간단한 예제를 만들어 보겠습니다.

 index.jsp

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form action="el_test.jsp" method="post">  // 버튼을 누르면 name값을가지고 el_test.jsp로 넘어가게 설정
<table border="1">
<tr>
<td>이름 : <input type="text" name="name"></input></td>
<td><input type="submit" value="입력"></input></td>
</tr>
</table>
</form>
</body>
</html>

index,jsp에서 쓴 값을 넘겨 받습니다. 일반적으로 우리는 jsp언어를 이용하여

<%

String name = request.getParameter("name");  //앞에서 넘긴 name값을 받아서 변수에 저장

%>

이런식으로 변수에 넣고 출력시에는 html안에다가

당신의 이름은 <%=name%>입니다

라는 식으로 나타냅니다. JSTL의  EL로 바꿔서 가보도록하겠습니다

el_test.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>

당신의 이름은 ${param.name } 입니다! //EL내장객체중 자주쓰이는 객체인 param이용 index.jsp에서 name값을 바로 넘겨받아서 커스텀태그로 표현

</body>
</html>

대충 이런식으로 쓰입니다. 내장객체역시 여러종류가 있습니다. 그 내장객체를 이용하여 여러가지 값을 참조하고 사용할 수 있습니다.

 2. 다운로드 및 셋팅

http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi

위 링크로 이동하여 zip파일을 다운 받습니다.

압축을 푸시고 lib폴더에 들어있는 jstl.jar 파일과 standard.jar 파일이 있는 확인합니다. 그 두개의 파일을 복사하셔서 톰캣 lib폴더 안에 혹은 생성한 프로젝트 lib폴더에 넣어두시면 셋팅이 끝납니다.

JSTL태그는 방대합니다. 가장 일반적이면서도 기초적인 라이브러리 모음이 Core Library입니다

이 코어 라이브러리는 우리가 맨처음 c언어를 하든java를 입문했던 시절 기능이 고대로 있는 라이브러리 입니다. 예를 들면 출력, 삭제, 변수지정, if문 ,for문 이라고 생각하시면 되겠습니다.

종류

* 일반

<c:out> 출력을 할때 쓰이는 태그입니다. print문이라고 생각하시면 되겠네요.

<c:set> 변수를 지정하는 태그입니다.

<c:remove> 지정된 변수를 삭제하는 태그입니다.

<c:catch> 예외를 처리하는 태그입니다.

* 조건

<c:if>

<c:choose>

<c:when>

<c:otherwise>

 

* URL

<c:import>

<c:url>

<c:redirect>

<c:param>

 

* 반복

<c:forEach>

<c:forEachToken>

지금 알아볼 태그입니다만, 대충 저 태그가 어떤 기능을 하는지 예측을 하신분들도 계실겁니다.

그 예측이 맞다면 정말 여러분들은 대단하신 분들이죠~

우선 JSTL 1편에서 다운로드 및 셋팅을 제대로 하셨다면 위의 태그가 잘 먹힐겁니다. 예제도 하나씩 만들면서 느껴볼 것인데, 셋팅은 안하신 분들은 1편을 참고하시어 다운로드및 셋팅을 해주시면 이 글을 보면서 이해하시는데 수월하실겁니다.

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

위를 해석해 보자면 c라는 별명을 주고 core태그를 사용하겠다 라는 뜻이 됩니다. uri 하고 웹주소가 적혀져서 으잉? 저 사이트에뭔가 불러다 쓰는건가? 인터넷연결안되면 설마;; 사용안되는건가? 라고 생각하시는분도 혹시 계셨을까요?(저는 처음보는순간 그랬습니다 --;) 하지만 저 뜻을 찾아보니 uri형태를 띄는 태그의 이름이었던 것이었습니다.

prefix="c" 의 경우에는 태그를 쓸때 <c:out> 맨앞에 정해주는 닉네임같은걸로 보시면되겠습니다.(물론 저기에 적힌  c를 z나 x 다른 알파벳으로 써도 태그를 쓰실때 똑같이 잘써주신다면 먹히지만 표준상 Core를 쓸때는 Core의 c를 따서 저런형식으로 약속(?)을 한거죠. 그럼 다른것도 알아보겠습니다.

태그

URI

Profix

Core

http://java.sun.com/jsp/jstl/core

c

XML

http://java.sun.com/jstl/xml

x

formating

http://java.sun.com/jstl/fmt

fmt

DB

http://java.sun.com/jstl/sql

sql

 

지금 2편에서 알아볼 태그는 일반적인 코어 태그이기 때문에 코어태그를 쓰기 위해서는 태그라이브러리를 해주어야 겠죠.

이클립스 기준으로  JSP 파일을 하나 생성합니다. 그리고 HTML위쪽으로 JSP범위에

태그라이브러리를 다음과 같이 선언합니다.

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

그럼 본격적으로 각 태그들을 어떻게 쓰는지 어떤 기능이 있는지 예제를 통해서 알아보도록하겠습니다.

<조건부 태그>

1. <c:out>

지정된 값을 출력하는 태그입니다.

<c:out value="출력값" default="기본값" escapeXml="true 또는 false">

보통우리는 가져온값을 출력할때 <%=변수이름%> 이런형식으로 썼었습니다. 태그를 이용해서 출력 해보겠습니다. 

당신의 이름은 <c:out value='${name}' default="jung"> 입니다 //값이 없어도 디폴트값을 지정해서 출력이 가능합니다

결과 -> 당신의 이름은 jung 입니다

디폴트 값을 주어서 출력을 해보았습니다. 쇼핑몰이나 타 사이트에 들어가면 로그인하지 않은 상태를 나타내었을때 'guest 어서오세요' 라고 쓰여진 걸 보셨을 겁니다. 디폴트값을 지정하여 이렇게 써먹을수도 있겠더라구요.

 escapeXml 이것은 boolean타입으로 참과 거짓으로 나뉩니다.

true경우는 html을 xml로 취급하여 태그가 먹히지 않고 그대로 화면상에 노출됩니다.

또한 소스에는 각각 아래와 같이 문자 엔티티 코드로 변환됩니다.

 

 문자

 문자 엔티티코드

 <

 &lt;

 >

 &gt;

 &

 &amp;

 '

 &#039;

 "

 &#034;

 

 escapeXml='true' 경우

<jstl-test.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
   
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<c:out value="<h1>jstl<h1>,<,/"  escapeXml='true'/>
</body>
</html>

결과값을보시면 value값 그대로 화면에 뿌려집니다. 이화면에서 오른쪽버튼을 클릭하시고 '소스보기'를 누르시고 확인을 해보면

소스는 각각 아래와 같이 문자 엔티티 코드로 변환됩니다.

반대로 escapeXml='false' 로 주어보겠습니다.

이제는 html태그가 먹히는군요

 

2. <c:set>

변수지원태그입니다.

기존의 액션태그인<jsp:setProperty>와 비슷한 계열이라고 생각하시면되겠습니다. 그러나 이 액션태그는 오직 빈의 프로퍼티를 설정하는 일밖에 못하죠. 속성을 추가하거나 빈이 아니라 맵을추가 할때

<c:set>을 사용하게 됩니다. 방식은 두가지 입니다 EL변수를 생성하는 것과 객체의 프로퍼티 값을 설정하는 방식입니다.

<c:set> EL변수 생성

기본형식은 

몸체가 없는 형태 <c:set var="변수네임" value="값" scope="영역" />

몸체가 있는 형태 <c:set var="변수네임">값</c:set>

var : 값을 지정할 EL변수의 이름

value : 변수값을 지정. 표현식 ,EL 정적 텍스트를 지정할 수 있음(ex:"aa",%{aa},<%=aa>)

scope : 변수를 저장할 영역을 선택 page,session,application,request 가 올수있습니다. 기본값은 page값을 가집니다.

<c:set> 프로퍼티값 생성

몸체가 없는 형태 <c:set target="대상" property="프로퍼티이름" value="값" />

몸체가 있는 형태 <c:set target="대상"  property="프로퍼티이름">값</c:set>

target : 프로퍼티의 값을 설정할 대상객체 표현식,EL변수 지정. 대상객체는 빈이나 Map이어야 합니다. 또한 절대 null값이어선 안됩니다. 속성id값도 안됩니다.

property : target 빈일경우 프로퍼티이름은 set메소드를 제공해야한다.

예를 들면 target ="setAge()"  property="age" 이런형식

value : 설정할 프로퍼티의 값

예제를 보면서 이해해 보겠습니다.

우선 빈파일을 하나 만들어야 합니다. 간단하게 이름과 나이값을 get,set하는 부분을 만들어보겠습니다. jung이라는 패키지 안에 클래스 네임 'Info'를 생성합니다

<Info.java>

package jung;

public class Info {
 
 private String name;
 private String age;
 
 public void setName(String name){
  this.name=name;
 }

 public void setAage(String age){
  this.age=age;
 }

 public String getName(){
  return name;
 }
 public String getAge(){
  return age;
 }

}

다음은 test_result.jsp 파일입니다.(각각 주석을 달아놓았습니다.)

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="jung.Info" %> <!--jung이라는 패키지안에  Info.java를 포함  -->
<%@ page import="java.util.HashMap" %><!--HashMap기능을 포함  -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!--코어태그를쓰기 위해!  -->
<%
 Info info = new Info(); //프로퍼티를 사용하기 위해 미리 만들어놓은 빈파일을 객체화
 HashMap<String, String> hmap = new HashMap<String, String>(); //해시맵쓸준비
%>
<html>
<body>

<c:set var="info" value="<%= info %>" /> <!--c:set으로 info라는 변수명지정 값은 위쪽에 생성한  빈파일 객체  -->
<c:set target="${info}" property="name" value="살라딘" /> <!--프로퍼티기능으로 info에는 살라딘 라는 값이 등록됨  -->

<c:set var="hmap" value="<%= hmap %>" />
<c:set var="Youage" value="#{hmap.age}" /> <!--Youage라는 변수지정 값은 해시맵객체의 age값  -->

회원 이름: ${info.name} <br></br> <!--빈파일을 통해 등록된 이름을 출력  -->

나이: ${Youage}<Br></Br><!--등록된 나이를  출력(현재는 등록된 값이 없어서 null값임  -->

<c:set target="${hmap}" property="age" value="20" /> <!-- 나이값 지정  -->
나이 값 지정시 출력: ${Youage} 세

</body>
</html>

<결과화면>

회원이름 : 살라딘

나이 :

나이값 지정시 출력 : 20세

3. <c:remove>

 지정된 변수를 삭제하는 태그입니다. 위쪽에서 속성을 지정했던 것을 제거 하기 위한 태그입니다.

위의 태그에 다음과 같은 삭제 태그를 써보고 한번더 출력해 보세요.

<c:remove var= "info"/>
<c:remove var ="hmap"/>

변수명이  info , hmap의 속성을 지운다는 뜻입니다. set했던 값이 뜨지 않는다면 성공적으로 태그가 적용된 것입니다.

4.<c:catch>

예외를 처리하는 태그입니다. 자바에서 예외처리를 하신 기억이 나시나요. 마찬가지고 이 태그는 예외처리를 해서 에러메시지를 출력하는 태그입니다.

간단한 예제를 보겠습니다

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<body>
<c:catch var="myerr"> <!-- 변수지정-->

<%int x = 10/0; %> <!-- 10으로 0을 나눴습니다;; -->

</c:catch>

<c:if test="${myerr !=null}">
${ myerr.message} <!-- 메시지 출력-->
</c:if>
</body>
</html>

*조건태그

 

<c:if>

사용방법

<c:if test="조건>

조건이 참일시 실행되는 부분

</c:if>

if문을 아신다면 그냥 뭐 쉽게 아실겁니다

다음은 if태그를 이용하여 숫자를 비교하는 예제입니다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<% int a =10; %> <!--비교할 숫자를 넣어줌 -->

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<c:set var="age" value="<%=a %>"/> <!--앞서배운 set을이용하여 age변수에 10을 넣어줍니다 -->

${age}

<c:if test="${age}==20"> <!--여기서 값을 비교합니다. -->

숫자가 맞습니다.

</c:if>

숫자가 틀립니다.

</body>

</html>

 <c:choose>

<c:when>

<c:otherwise>

choose태그는 자바의 switch 구문과 if - else부분을 혼합한 형태를 띄고 있습니다.

일단 예제를 보실까요. 간단하게 임의의 숫자를 지정하고 성별을 출력하도록 만들어 보았습니다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<% int a =1; %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<c:set var="sex" value="<%=a %>"/>

<c:choose>

<c:when test="${sex==1}">

당신은 남자

</c:when>

<c:when test="${sex==2}">

당신은 여자

</c:when>

<c:otherwise>

그 외? 중성인가용?

</c:otherwise>

</c:choose>

</body>

</html>

예제를 보시면 바로바로 이해가 되시죠? ㅎㅎ

 URL태그

<c:import>

URL결과를 읽어와서 현재위치에 삽입이 가능합니다 간단하게 한번 알아보죠

<jsp:include>와 비슷한 개념이지만 이 액션태그는 jsp의 동적인 자원을 포함하기 위해 만든것이기에 페이지라고 이해하시면되겠습니다. 가장 두드러지는 차이점은 include의 경우에는 현재 컨테이너 안에 있는 자원만 포함할 수 있지만, import 의 경우에는 외부자원도 가능하다는 겁니다.

<c:import url ="http://www.naver.com"/>

위와 같이쓰고 태그를 실행하면 네이버의 메인페이지가 뜨게 됩니다. 물론 페이지 뿐만아니라 외부적인 그림들도 다뜨죠.

<c:url>

url의 경우는 하이퍼 링크에 관련된 기능이라고 보시면되겠습니다. url을 재작성합니다

<a href=" <c:url value="test.jsp"/>"> test로가기</a>

jsp쪽에도 url액션태그가 있지만 import할 수있는url은 같은 도메인상에 있지 않아도 됩니다. 굳이 http가 아닌 ftp형식도 사용이 가능합니다

<c:redirect>

jsp의 sendRedirect()와 같은 기능을 가집니다.

이 액션은 HTTP 리다이렉트 응답을 사용자 브라우저로 보내는데 사용되며, JSTL의 javax.servlet.http.HttpServletResponse의 sendRedirect() 메소드와 같습니다.

<c:redirect url="test.jsp"/>

<c:param>

말그대로 파라메터 값을 넘기느 태그입니다.

<c:param name="파라미터 명" value="파라미터 값" />

<c:url var="nameSend" value="/test.jsp">

<c:param name="name" value="jung" />

</c:url>

<a href =<c:out value="${nameSend}" />>url</a>

위 소스를 해석해보면 test.jsp에 name값을 함께 파라메터 값을 보내겠다고 해석이 됩니다. 때문에 test.jsp에서는 request.getParameter로 name값을 받을 수 있습니다.

반복태그

<c:forEach>

이 태그는 for문이라고 생각하시면 되겠습니다. 이 태그를 잘 사용하면 배열과 컬렉션데이터를 루프로 돌리는 작업을 간단하게 처리할 수 있습니다.

JSP를 이용해서 포문부분을 먼저 보고 다음 태그부분을 보겠습니다.

String[] items = (String[]) request.getAttribute("tList"); //tList를 속성지정

for(int i=0; i<items.length; I++) { //포문시작

String mo = items[i];

out.println(mo);

<%@ page contentType = "text/html; charset=euc-kr" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

String[] tList ={"aa","bb","cc"} //배열생성

request.setAttribute("tlist",tList); //배열을쓰기위해 속성지정

%>

<html>

<body>

<table border="1">

<c:forEach var="mo" items="${tlist}"><!-- 반복태그지정-->

<tr>

<td> ${mo} </td>

<td> ${mo} </td>

</tr>

</c:forEach>

</table>

</body>

</html>


 

 

'HomeWork' 카테고리의 다른 글

이슈 트래커- 버그 추적 시스템 Mantis ^^  (1) 2010.02.05
EL & JSTL #2 (천천히 배워가자!!)  (0) 2010.01.20
GridBagLayout~ㅎㅎ  (0) 2010.01.15
Thread ^^;;  (0) 2009.12.23
JSON#2(JavaScript Object Notation)  (0) 2009.12.22
Posted by 인천총각
|

GridBagLayout~ㅎㅎ

HomeWork 2010. 1. 15. 17:34

출력된 스크린에서, 버튼들이 어떻게 여러 개의 열과 행에 걸쳐있는지 주목하자. 스크린을 리사이징 해봄으로써 GridBagLayout의 또 다른 특성에 대해서도 알 수 있다. 어느 열과 어느 행이 스크린이 확대됨에 따라 늘어난 공간을 얻을 것인지를 완전히 제어할 수 있다.

GridBagLayout로 레이아웃된 컨테이너에 추가된 각각의 컴포넌트는 컨스트레인트 오브젝트(constraints object)인 GridBagConstraints 와 반드시 연결되어있어야 한다. 이 오브젝트는 각 컴포넌트의 특정 컨스트레인트들을 레이아웃 매니저에 전달한다.

다양한 타입의 컨스트레인트들이 있는데, 각각은 연결된 컴포넌트의 레이아웃을 제어한다. 각 제약은 클래스의 퍼블릭 필드(public field)이다. 제약들은 컨스트럭터를 통해 한번에 모두 설정할 수도 있고, 또는 그 필드에 직접적인 액세스로 개별적으로 설정할 수도 있다. 이러한 필드들에는 세터(setter) 메소드나 게터(getter) 메소드는 없다.

그렇다면, 이제 각 컨스트레인트들에 대해 알아보자.

anchor

앵커(anchor)는 사용 가능한 공간보다 컴포넌트가 더 작을 경우에 컴포넌트가 드리프트(drift)될 방향을 지정한다. 디폴트 값은 CENTER 이다. .8개의 방위는 또다른 설정을 나타낸다. 각각의 설정은 필드에 지정될 수 있는 상수이다. 가능한 설정들은 다음과 같다.

   CENTER
   EAST
   NORTH
   NORTHEAST
   NORTHWEST
   SOUTH
   SOUTHEAST
   SOUTHWEST
   WEST

추가적인 컨트레인트 사항들은 현재의 ComponentOrientation에 기반을 둔 컴포넌트들의 포지션을 가능하게 하는데, 영어에서 보편적으로 쓰이는 수평이면서 왼쪽에서 오른쪽(left-to-right) 방향 맞춤을 위한 설정들은 다음과 같은 상수들로 정해지게 된다.

   FIRST_LINE_END (NORTHEAST)
   FIRST_LINE_START  (NORTHWEST)
   LAST_LINE_END (SOUTHEAST)
   LAST_LINE_START (SOUTHWEST)
   LINE_END (EAST)
   LINE_START (WEST)
   PAGE_START (NORTH)
   PAGE_END (SOUTH)

fill

fill의 값은 더 많은 공간이 사용 가능한 경우 컴포넌트의 리사이징을 제어한다. 만약 fill이 NONE(디폴트 값)으로 설정되어 있다면, GridBagLayout 매니저는 컴포넌트의 적절한 사이즈를 정해주게 된다. 만약 fill이 VERTICAL로 설정되어 있다면, 레이아웃 매니저는 (물론, 추가적인 공간이 있는 경우에만) 컴포넌트의 높이를 리사이징한다. HORIZONTAL의 경우에는 레이아웃 매니저는 폭을 리사이징할 것이고, BOTH로 설정되어 있다면 폭과 넓이에서 사용 가능한 모든 공간을 이용하게 된다.

좀 전의 예제 프로그램 GridBagSampleBOTH를 fill값으로 가진다. VERTICAL, HORIZONTAL, 또는 NONE과 같은 다른 fill 값을 넣어서 프로그램을 한 번 실행해보자. (원하는 결과를 얻기 위한 적절한 fill 설정 라인에 대해서는 설명하지 않겠다.) 예를 들어, 7개의 버튼의 fill을 모두 NONE으로 설정하면 다음과 같은 결과가 나오게 된다.

gridxgridy

gridx와 gridy는 그리드 상의 컴포넌트의 위치를 지정한다. gridx 변수는 컴포넌트의 가장 왼쪽 위치의 셀을 지정하고, gridy 변수는 컴포넌트의 상단 위치의 셀을 지정한다. Cell (0, 0)은 스크린의 초기점에 있는 셀(왼쪽 위)을 의미한다. 컴포넌트들은 다양한 셀들을 합칠 수 있기 때문에 girdx, girdy 위치는 일반적으로 컴포넌트의 시작 셀이다. 명시적으로 셀에 직접 지정할 수도 있지만, RELATIVE 상수를 사용할 수도 있다. RELATIVE 의 gridx 설정은 이전 컴포넌트의 오른쪽에 새로운 컴포넌트를 만들어낸다. girdy의 경우에는, 이전 컴포넌트 아래쪽에 새로운 컴포넌트가 새로운 열을 시작할 것이다.

gridheightgridwidth

gridheight필드와gridwidth 필드는 수평축(gridwidth)과 수직축(gridheight)에 따라 컴포넌트가 점유해야만 하는 셀들의 수를 지정한다. 행과 열에서 셀의 개수를 지정하는 것과 더불어 RELATIVEREMAINDER 클래스 상수들도 사용할 수 있다. 두 개중 어느 한 필드의 RELATIVE 설정을 지정하는 것은 컴포넌트를 행이나(gridheight) 열(gridwidth) 내에서 마지막에서 두번째(second-to-last)로 만드는 결과를 만든다. REMAINDER 설정은 각각의 행이나 열의 맨 마지막 요소를 지정하기 위해 사용한다.GridBagLayout을 사용하는 데 익숙해질 때까지는 RELATIVEREMAINDER보다는 gridx와 gridy, gridheight, gridwidth 설정들을 직접 지정해주는 편이 훨씬 쉬울 것이다. 심지어 익숙해진 단계를 넘어선 후에도, RELATIVEREMAINDER의 사용을 꺼려 하는 당신을 발견할 지도 모른다.

insets

insets 필드는 컴포넌트 주위에 있는 픽셀 내의 외부 패딩(the external padding)을 지정한다. 패딩이란 빈 공간을 뜻하는데, 컴포넌트 주위의 투명한 경계선이라고 보면 되겠다. insets 필드를 설정할 때는 top, bottom, left, right의 패딩 값을 개별적으로 지정해줘야 한다. GridBagSample 프로그램의 insets 설정이 (0, 0, 0, 0) 이었는데, 이는 일반적인 Insets 오브젝트를 위한 설정임을 주의하자.

ipadxipady

ipadx 필드와 ipady 필드는 컴포넌트의 내부 패딩을 지정해준다. ipdax 필드는 컴포넌트의 폭에 패딩을 추가하고, ipady필드는 컴포넌트의 높이에 패딩을 추가한다. 예를 들어, ipadx 설정은 컴포넌트의 양쪽 주위에 여분의 공간을 지정해준다.

weightxweighty

예를 들어 사용자가 스크린을 리사이징 하는 경우처럼, weightx와 weighty 설정을 통해 컨테이너 안에서 공간을 사용할 수 있을 때 어느 컴포넌트의 크기를 키우거나 줄일지 제어할 수 있다. weight 설정은 double이다. (insets을 제외한 다른 모든 설정들은 int 값이다.)

일반적으로, weightx와 weighty 설정은 0.0에서 1.0의 범위 안에서 정한다. 0.0으로 설정한다는 것은 컴포넌트에 여유 공간이 전혀 없음을 의미한다. 1.0으로 설정하는 것은 컴포넌트가 모든 여유 공간을 가지는 것을 의미한다. (혹은 적어도 1.0으로 설정된 다른 컴포넌트들과 그 여유 공간을 공유한다는 것을 의미한다.) 비록 설정값을 0.0에서 1.0의 범위 안에 한정하기는 하지만, 모든 설정값이 다 허용된다. 시스템은 특정 행이나 열을 위한 설정값들의 합에 비례하여 공간을 할당할 것이다. 예를 들자면, 1.0으로 설정한 4개의 컴포넌트는 여유 공간을 균일하게 공유하게 될 것이다. 0.0으로 설정한 컴포넌트 3개와 1.0으로 설정한 컴포넌트 1개의 경우에는 모든 여유 공간을 하나의 컴포넌트에 몰아주게 된다. 1개의 0.0 컴포넌트와 2개의 0.5 컴포넌트, 1개의 1.0 컴포넌트라면, 여유 공간의 절반은 1.0 컴포넌트에 할당되고, 2개의 0.5 컴포넌트가 나머지 여유 공간을 나눠가질 것이다.

스크린의 사이즈가 리사이징이 가능하다면, 어떤 weight 설정이 필요한지 고려하는 것을 잊지 말자. Anchor와 weightx/weighty를 결합하여 효과적으로 사용한다면, 리사이징 시에 컴포넌트들이 스크린의 가장자리를 "감싸안거나" , 스크린의 균형을 유지하면서 컴포넌트의 크기를 비례하여 늘릴 수가 있다.

Try changing some of the GridBagConstraints settings in the GridBagSample program and see what happens. Here's a table that lists the initial GridBagConstraints settings in the program. GridBagSample 프로그램 안에서 GridBagConstraints 설정들을 바꿔보고 어떠한 변화가 일어나는지를 살펴보자. 아래의 표는 그 프로그램의 GridBagConstraints 초기 설정값 목록이다.

Component gridx gridy gridwidth gridheight
One 0 0 1 1
Two 1 0 1 1
Three 2 0 1 1
Four 0 1 2 1
Five 2 1 1 2
Six 0 2 1 1
Seven 1 2 1 1

GridBagLayoutGridBagConstraints의 사용에 대한 더 자세한 정보는 Java Tutorial의 How to Use GridBagLayout을 참조하기 바란다.

GridBagLayout과 그것과 관련된 GridBagConstraints을 활용하기 전에, 방안지를 준비하는 것도 좋다. 여러 개의 행과 열에 걸쳐야 하는 스크린을 디자인하는 경우, 미리 방안지의 그리드에 컴포넌트들을 그려보면 도움이 될 것이다.

'HomeWork' 카테고리의 다른 글

EL & JSTL #2 (천천히 배워가자!!)  (0) 2010.01.20
초간단 JSTL 집고 넘어가자!!  (0) 2010.01.19
Thread ^^;;  (0) 2009.12.23
JSON#2(JavaScript Object Notation)  (0) 2009.12.22
JSON 데이터  (0) 2009.12.22
Posted by 인천총각
|