Česky   |  Deutsch   |  English   |  Español   |  Français   |  Indonesia   |  日本語   |  한글   |  Polski   |  Português (BR)   |  Türkçe   |  中文   |  正體中文   |  Your Language  
PlanetNetbeans
플래닛 NetBeans는 여러분들의 NetBeans 관련 Blog에 작성된 생각들을 모아 함께 공유하는 곳입니다.
피드
[RSS 1.0 Feed] [RSS 2.0 Feed]
[FOAF Subscriptions] [OPML Subscriptions]
NetBeans에 관해 블로그를 작성하시나요? 여러분의 Blog를 PlanetNetBeans에 추가하십시오.
피드 구독

Powered by:    Planet

Last updated:
May 09, 2012 08:33 AM
All times are UTC

Sponsored by
sponsored by Oracle

visit NetBeans website
Netbeans-Korean by 강여사 - July 04, 2010 04:13 PM
넷빈(NetBeans)6.9에서 모듈(설치 프로그램 XX.exe 포함) 만들기-02-WordApp

이번 게시물 역시 넷빈즈 플랫폼에 대한 프로젝트 입니다.

이번에는 좀더 확장하여 4개의 모듈을 사용하는 모듈 어플리케이션을 작성하고 이 어플리케이션에 대한 브랜딩(아이콘, 스플래시스크린 및 기타 정보 설정)과 빌드 인스톨러(.exe 만들기)를 통해 넷빈 6.9에서 새롭게 선보이는 편리한 기능들에 대해서도 알아보겠습니다.

작업환경은 다음과 같습니다.

넷빈 6.9
JDK 5 이상 (저는 JDK6update20 사용중입니다)

우선 새 프로젝트를 만듭니다. 프로젝트 창에서 마우스 오른쪽 클릭 - 새 프로젝트
카테고리에서 넷빈즈 모듈을 선택한 후 이번에는 넷빈즈 플랫폼 어플리케이션(NetBeans Platform Application )을 선택합니다 - 다음
프로젝트 이름은 WordApp
경로는 적당히
프로젝트 플랫폼을 선택할 수 있는데, 플랫폼을 미리 여러개 등록해 놓으면(플랫폼 등록은 상단의 도구 메뉴에서 넷빈즈 플랫폼을 선택한 후 팝업창에서 본인 컴퓨터에 설치되어 있는 여러 넷빈즈 플랫폼을 선택하시면 됩니다. 저는 그림처럼 여러개가 선택되어 있어 해당 사항이 뜬거고, 게시물을 위해서는 그냥 넷빈 6.9를 선택하여 진행하겠습니다) - 다음
만들어진 모듈 어플리케이션의 모듈 노드에서 오른쪽 마우스를 클릭하면 새로 추가가 뜹니다. 클릭
새 모듈 프로젝트창이 팝업으로 뜨는데,
첫번째 모듈 프로젝트 이름은 WordEngine
경로는 기본사항대로 - 다음
모듈에 대한 고유 이름을 지정해야 하는데 이걸 코드 이름 베이스 라고 합니다.
이 모듈의 코드 이름 베이스는 org.demo.wordengine 으로 줬습니다.
나머지 사항은 기본대로 - 마침
만들어진 모듈 (WordEngine) 에서 마우스 오른쪽을 클릭하여 새로 만들기 - other
카테고리에서 모듈 개발을 선택한 후 창(Window Component) 를 새 파일 유형으로 선택합니다 - 다음
기본 설정이 뜨는데 output 으로 설정하고 다음
클래스의 접두사 이름을 "Text" 로,
패키지 이름은 "org.demo.wordengine" 으로 줍니다.
이 설정으로 마법사가 아래 만들어지는 폼과 자바 파일, 그리고 XML 파일들을 자동 생성되는 걸 확인할수 있습니다.
마침
그럼 가운데 편집기에 디자인 편집창이 나타납니다. 오른쪽 파레트에서 버튼 하나와 텍스트영역(TextArea) 하나를 각각 드래그 해서 아래 그림 처럼 놓습니다. 버튼 이름은 Filter! 로 변경하고(오른쪽 파레트 아래 속성에서 text 항목을 편집하면 됩니다).
텍스트영역을 마우스로 클릭한 후 오른쪽 마우스를 열면 변수 이름 변경 메뉴가 있습니다. 클릭
변수 이름을 text 라고 변경합니다. (텍스트영역의 id 를 바꾸는 작업입니다)
그런 다음 버튼을 더블 클릭하면 아래 그림처럼 소스 창으로 자동 전환됩니다. 그럼 해당 메소드에 다음 코드를 작업합니다. (굵은 글씨 참고)
=================================================================
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
s = s.toUpperCase();
text.setText(s);

}
=================================================================
이제 어플리케이션에서 마우스 오른쪽을 클릭하여 실행합니다. 모듈이 설치되어 있는 넷빈즈 플랫폼 어플리케이션 WordApp 가 시작됩니다.
아래 그림 처럼 넷빈즈 플랫폼 기반 어플리케이션 WordApp 가 뜨는데 이 때 창을 클릭하면 좀전에 만든 창 컴포넌트 Text 가 보입니다. 클릭
그럼 아래쪽에 Text Window 가 나타나고 아래 텍스트 영역과 버튼이 제시됩니다. 그림처럼 hello world 라고 적고 Filter! 버튼을 클릭하면,
작성한 글씨가 모두 대문자로 바뀌어 텍스트 영역에 나타납니다.
***********************************************************************
이제 2개의 부가 모듈을 만들어 보도록 하겠습니다. 처음 만들 모듈은 서비스로, 그리고 다음 모듈은 앞서 정의한 모듈을 제공하는 모듈입니다.
다시 WordApp 의 모듈 노드에서 마우스 오른쪽을 클릭하고 새로 추가를 선택합니다.
새 모듈 프로젝트 이름을 TextFilter 라고 줍니다. 경로는 기본대로 - 다음
코드 이름 기본(code name base):는 org.demo.textfilter 로 나머지는 기본 사항대로 - 마침
그런 다음 TextFilter 모듈에서 마우스 오른쪽을 클릭하여 자바 인터페이스를 새로 만듭니다. 새로 만들기-자바 인터페이스 클릭
인터페이스 이름은 TextFilter , 패키지는 org.demo.textfilter 마침
다음 메소드 선언을 추가합니다.
==========================================================
package org.demo.textfilter;

public interface TextFilter {

String process(String s);
}
==========================================================
TextFilter 모듈에서 마우스 오른쪽을 클릭하고, 맨 아래 등록정보를 선택합니다
등록정보의 카테고리에서 API 버전제어를 선택하고 아래 그림처럼 공개 패키지에 체크합니다. OK
3번째 모듈을 새로 만듭니다. 모듈에서 마우스 오른쪽 클릭 - 새로 추가
프로젝트 이름: MyFilter 기본대로 - 다음
코드 이름 기본에 "org.demo.myfilter" 라고 줍니다. 나머지는 기본 사항대로 - 마침
만들어진 MyFilter 모듈에서 다시 마우스 오른쪽을 클릭하여 등록정보를 누릅니다
프로젝트 창의 라이브러리에 새로 만들어진 MyFilter 모듈에 TextFilter 모듈을 추가하기 위해 다음과 같이 작업합니다.
우선 라이브러리를 클릭하고, 모듈 의존성탭에서 새 의존성 추가(Add Dependency...) 클릭하고,
팝업창이 뜨면 맨위 필터에서 TextFilter 를 입력합니다.
그럼 아래에 모듈이 찾아지는데 이걸 OK
확인
같은 방법으로 이번에는 Lookup 을 입력하여 찾아보기(Lookup API) 모듈을 추가합니다. ok
그럼 아래 그림처럼 표시 됩니다. 확인
이제 2번째 모듈의 인터페이스에서 정의했던 메소드를 구현하기 위한 클래스 작업을 합니다.
마우스 오른쪽 클릭 - 새로 만들기 - 자바 클래스
클래스 이름: UpperCaseFilter
패키지: org.demo.myfilter
마침
클래스를 아래 내용으로 작성합니다.
============================================================
package org.demo.myfilter;

import org.demo.textfilter.TextFilter;

@ServiceProvider(service=TextFilter.class)

public class UpperCaseFilter implements TextFilter {

public String process(String s) {
return s.toUpperCase();
}

}
============================================================
@ServiceProvider 어노테이션은 컴파일시,TextFilter 인터페이스의 구현을 등록하는 파일과 함께 META-INF/services 폴더를 만들게 됩니다. 보다 자세한 내용은 JDK 6 ServiceLoader 메카니즘을 살펴보시기 바랍니다.
임포트 문제는 여백에서 마우스 오른쪽을 클릭 - 가져오기 고정(fix import)
임포트 및 코드 확인
이번엔 WordEngine 에 TextFilter 작업을 하기 위해 다음과 같이 합니다. 우선 WordEngine 에서 마우스 오른쪽 클릭 - 등록 정보 선택
WordEngine 등록정보 창에서 카테고리에 라이브러리를 선택 후 모듈 의존성에 새 종속성 추가 버튼을 클릭한 후 팝업창에서 TextFilter 를 입력하여 모듈을 찾은 후 ok
아래 그림처럼 TextFilter 가 라이브러리에 추가되었음을 확인합니다. ok
아까 버튼의 메소드 부분을 다음과 같이 변경합니다. (굵은 글씨 참고)
================================================================
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);
if (filter != null) {
s = filter.process(s);
}
text.setText(s);
}
================================================================
임포트 문제는 역시 여백에서 마우스 오른쪽 클릭 가져오기 고정(fix import) 클릭
이로써, 버튼의 기능은 같지만, 새 모듈 디자인을 추가함으로써 필터 구현과 그래픽 유저 인터페이스 간의 분리를 제공하게 됩니다.
이제 4번째 모듈을 만듭니다. 이 모듈은 첫번 째 모듈에서 만든 "Filter!" 버튼을 클릭할 때 마다 동적으로 텍스트를 받습니다.
우선 첫번째 모듈(TextTopComponent.java) 생성자 부분에서 아래 코드 내용(굵은 글씨)을 추가합니다.
======================================================================= private InstanceContent content;

private TextTopComponent() {
initComponents();
setName(NbBundle.getMessage(TextTopComponent.class, "CTL_TextTopComponent"));
setToolTipText(NbBundle.getMessage(TextTopComponent.class, "HINT_TextTopComponent"));
// setIcon(Utilities.loadImage(ICON_PATH, true));

content = new InstanceContent();
associateLookup(new AbstractLookup(content));

}
=======================================================================
임포트 문제는 마우스 오른쪽 클릭 - 가져오기 고정(fix import) 클릭
그런 다음, 버튼 클릭시마다 InstanceContent 객체가 추가될 수 있도록 소스를 변경합니다(굵은 글씨)
================================================================
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);
if (filter != null) {
content.add(s);
s = filter.process(s);
}
text.setText(s);
}
================================================================
이번에는 히스토리를 관리하는 모듈을 새로 만듭니다.
역시 모듈 노드에서 마우스 오른쪽 클릭 - 새로 추가
모듈 프로젝트 이름은 History
나머지는 기본 사항대로 - 다음
코드 이름 기본: com.demo.history
나머지는 기본 사항대로 - 마침
이 히스토리 모듈 역시 윈도우 컴포넌트를 만듭니다.
History 모듈에서 마우스 오른쪽 클릭 - 새로 만들기 - 창 (window component ) 선택
기본 설정은 output 나머지 그대로 - 다음
클래스 이름 접두사는 History
패키지는 com.demo.history 를 선택
마침
디자인 편집창이 뜨면 역시 파레트에서 텍스트 영역(TextArea)를 드래그해서 그림처럼 적당히 크기를 조절하고, 거기서 마우스 오른쪽을 클릭하여 변수 이름을 변경합니다.
새 변수 이름은 historyText - OK
이제 HistoryTopComponent 클래스의 생성자 부분에 다음 코드를 추가합니다.(굵은 글씨 참고)
===================================================================
private Lookup.Result result;

private HistoryTopComponent() {

...

result = org.openide.util.Utilities.actionsGlobalContext().lookupResult(String.class);
result.addLookupListener(new LookupListener() {
public void resultChanged(LookupEvent e) {
historyText.setText(result.allInstances().toString());
}
});

}
===================================================================
임포트 문제는 fix import (가져오기 고정)로
소스 코드 확인
이제 프로젝트(WordApp)를 실행합니다.
아까와 마찬가지로 창을 누르면 이번에는 History 창이 추가 작업되어 있음을 알 수 있습니다. 클릭
히스토리 창은 말그래도 작업한 내용에 대한 히스토리가 나타나는 창입니다.
아래 filter 된 내용이 순서대로, hello, netbeans 6.9 cool 이렇게 2개 작업했고 그 내용이 히스토리 창에 나타나 있습니다

********************************************************************************
그럼 이제 넷빈 6.9에 새로 추가된 내용인 브랜딩(branding)에 대해 알아 보겠습니다.
프로젝트 WordApp 에서 마우스 오른쪽 클릭 - 브랜딩(branding) 클릭
해당 모듈 어플리케이션에 대한 브랜딩 작업으로 제목이나 아이콘 등을 작업하는 기본 화면,
어플리케이션이 시작되기 전에 표시되는 스플래시 스크린 등 기타 여러 내용이 보다 손쉽게 작업되도록 구성되어 있습니다.
기본으로는 넷빈 아이콘이 사이즈 별로 제시되어 있는데 적당히 인터넷에서 해당 사이즈의 아이콘 등을 찾아 연결해 줬습니다. ^^;
두번째 탭은 스플래시 화면에서는 현재 맥 OS 10인 스노우 레오퍼드 이미지를..ㅋㅋ 원래는 역시 넷빈 6.9 이미지가 되어 있습니다. 원하는 이미지를 찾아보기 버튼을 눌러 바꿔주시면 됩니다.
윈도우 시스템 탭의 내용입니다
자원 번들 탭의 내용입니다. 확인 후 - OK
이제 새로 브랜딩 된 내용을 반영하기 위해 프로젝트를 모두 지우고 빌드(clean and build) 합니다
그리고 이 브랜딩 된 내용의 프로젝트를 .exe 로 만들기 위해 WordApp 프로젝트에서 마우스 오른쪽 클릭 - 빌드 인스톨러(build installer)를 선택합니다.
출력창으로 모든 작업이 완료되면(build successfully) 파일 탭을 열고 dist 를 확장하면 안에 프로젝트의 설치 exe 프로그램이 들어 있습니다.
이제 윈도우 탐색기를 열어 좀전의 해당 XXX.exe 를 더블클릭하면 아래 그림처럼 설치 마법사가 시작됩니다. - Next
설치될 경로 확인하고 next
설치 시작 - install
성공적으로 설치가 완료되었습니다. finish
바탕화면에 새로이 WordApp 단축키가 만들어집니다. 더블 클릭하면 아까 설정한 스플래시 화면(아래 그림)과 함께 프로그램이 시작됩니다.
역시 브랜딩에서 작업했던 아이콘(구글 안드로이드 보이)이 프로그램 화면 왼쪽 상단에 그리고 , 작업표시줄에도 나타납니다. 내용은 아까 실행해서 본 대로 윈도우에 histroy, text 등을 선택하여 테스트 해볼 수 있습니다.
Help의 about 을 클릭하면 아래처럼 스플래시 화면과 함께 정보 내용이 표시됩니다. 음..눈표범..이뽀요..ㅎㅎ

이상이 2번째로 만들어본 넷빈즈 플랫폼 프로그램입니다.
특히나 플러그인 생성 및 인스톨러의 강화는 앞으로 이쪽을 활성화할수 있는 좋은 기능들 인 거 같습니다. 넷빈에도 드뎌 돈되는 플러그인이??? 쿄쿄쿄
다음엔 OSGi 번들 및 메이븐과의 작업등도 천천히 함 살펴 보겠습니다.
긴 글에 수고하셨습니다. *^^*

Netbeans-Korean by 강여사 - July 03, 2010 01:39 PM
넷빈(NetBeans)6.8에서 Wicket 사용하기-01-설치 및 샘플프로그램

이번에는 Wicket 프레임워크를 사용하는 방법에 대해 알아 보고자 합니다.

Wicket은 Apache 프로젝트로, 마크업/로직 분리, POJO 데이터 모델,그리고 XML 을 최소로 함으로써,
웹 어플리케이션을 보다 단순화, 계층화 시켜주는 프레임워크입니다.

Wicket은 개념적으로 JavaServer Faces 나 Tapestry 와 비슷하게 자바 프로그래밍 언어를 위해 경량급의 콤포넌트 기반 웹 어플리케이션 프레임워크입니다.

각 컴포넌트들은 하나의 자바 클래스와 하나의 HTML 파일로 구성됩니다. 이러한 컴포넌트 기반 방식의 Wicket은 스트러츠, 스트링과 같은 XML 구성 파일에 의존하는 프레임워크와 달리, XML 구성 파일 대신 홈페이지 식별과 같은 어플리케이션-범위 설정을 위한 자바 클래스를 사용합니다.

웹 어플리케이션의 각 위젯은 하나의 자바 클래스에서 만들어지고 HTML 페이지에서 렌더됩니다. 따라서 자바 클래스와 HTML 페이지는 반드시 같은 이름을 가지고,또 같은 소스 구조에 존재해야 합니다.

현재 Apacke Wicket 은 1.4.9 가 릴리즈 되어 있고,(http://www.apache.org/dyn/closer.cgi/wicket/1.4.9 ) 새 버전은 메이븐 폼(pom)에 다음과 같이 업그레이드 해서 사용될 수도 있습니다.
================================================
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket</artifactId>
<version>1.4.9</version>
</dependency>
================================================
보다 자세한 내용은 아파치 Wicket 홈페이지에서 확인하시고, 이제 넷빈에서 Wicket을 사용하는 방법에 대해 본격적으로 알아 보겠습니다.

현재(이글 쓰는 시점)로 Wicket 플러그인이 넷빈 6.9에서는 정상 설치가 안되고 있습니다.
해서 넷빈 6.7에서 만들어지고 6.8까지 설치 가능한 플러그인으로 진행, 제목에서도 명시했다시피 넷빈 6.8에서 진행합니다.

본 게시물의 작업환경은 다음과 같습니다.
넷빈 6.8 (또는 6.7)
JDK 6 (저는 6up20 입니다. 그러나 JDK5에서도 돌아갑니다)
글래스피시 2.1 이상 (넷빈 6.8에 기본 설치되는 글래스피시로 작업했습니다) 혹은 톰캣 6.x
Wicket 플러그인 (최신버전다운로드 )

우선 바로 위 플러그인 링크에서 최신 버전을 다운로드 받습니다.
플러그인 설치를 위해 도구-플러그인 선택
다운로드 받은 플러그인 설치를 위해서는 다운로드 탭을 누르고 아래 플러그인 추가 버튼을 누릅니다.
그럼 팝업창이 뜨고 위에서 다운로드 받은 파일(3개)을 모두 선택하여 열기를 누릅니다
3개의 Wicket 모듈이 올라옵니다. 왼쪽 아래 설치를 눌러 설치를 진행합니다.
설치 진행은 지시사항에 따라 계속합니다. 다음
동의를 체크하고 설치
서명경고가 뜨지만 무시하고 계속
IDE 재시작 - 마침
IDE가 다시 시작되면 이제 컴포넌트 기반 Wicket 프로그램을 만듭니다. 프로젝트 창에서 마우스 오른쪽 클릭, 새 프로젝트
카테고리에서 Java Web, 프로젝트는 Web Application - 다음
프로젝트 이름은 HelloWicket , 경로는 적당히 - 다음
서버설정인데, 저는 그냥 기본설정으로 진행했습니다.
사실 Wicket 은 J2EE 1.4 , EE5 모두 지원하므로 어느 버전이나 그리고 톰캣이건 글래스피시건 아무거나 하셔도 됩니다. - 다음
프레임워크 설정인데 Wicket 1.4 를 체크합니다.
그럼 Wicket 1.4 구성 내용이 그림과 같이 설정됩니다.
참고로 Wicket Filter name 은 web.xml 에 정의된 필터 이름이고,
Wicket URL Pattern 은 web.xml 에 URL 패턴으로 정의된 서블릿 매핑이고,
Wicket Application Class 는 홈페이지처럼, 어플리케이션-범위 설정이 있는 클래스 이름을 지정합니다.
Wicket Home Page 는 홈페이지 이름을 지정하는데, 해당 이름의 파일은 XXX.java 와 XXX.html 2개로 구성되게 됩니다.
Main Package 는 위 사항들이 들어갈 자바 패키지 설정입니다 - 마침
IDE가 자동으로 만들어주는 파일들을 모두 자세히 살펴 보도록 합니다. 우선 HomePage.html 이 편집기 창에 제시됩니다.
이 Wicket 이 읽혀지기 위해서는 Wicket 의 유일한 xml 관련 파일인 web.xml 에 해당 설정이 있습니다. 프로젝트의 web.xml 을 열어 다음 내용을 확인합니다
-------------------------------------------------------
<filter>
<filter-name>WicketApplication</filter-name>
<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
<init-param>
<param-name>applicationClassName</param-name>
<param-value>com.myapp.wicket.Application</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>WicketApplication</filter-name>
<url-pattern>/wicket/*</url-pattern>
</filter-mapping>
-------------------------------------------------------
위의 XML 에 보면 Wicket 필터가 com.myapp.wicket.Applciation 클래스를 파라미터 값으로 초기화하도록 되어 있습니다. 필터 매핑은 /wicket/* 이구요.
즉 이 자바 파일, Application.java 에 스트러츠의 struts-config.xml 나 JSF의 faces-config.xml 처럼 어플리케이션-wide 설정이 제공되게 됩니다.
파일을 보면 getHomePage() 메소드가 정의되어 있는데, 이 메소드가 어플리케이션-범위의 최고단위(필수)입니다. 간단히 말하자면 어플리케이션이 배포될 때 홈페이지(즉, 최초 페이지)를 지정하는 거죠.
그럼 다음으로 여기 return 되는 HomePage.java를 열어 봅시다.
HomePage.java 는 현재 비어 있습니다(기본).
나중에 이 파일의 생성자에 컴포넌트들을 추가하게 됩니다.
HomePage.java 와 같은 소스 구조에 같은 이름,즉 HomePage.html 파일에서 Wicket 위젯의 렌더링을 합니다.
HomePage.java는 BasePage를 상속받는데, HomePage.html 에서 wicket:id 속성은, 자바 파일에 의해 뭔가 만들어졌다는 걸 알려주는 표시자 입니다.
IDE에 의해 자동 생성된 CSS는 BasePage.java 에 참조(StyleSheetReference)되어 있습니다.
여기에 보면 아까 wicket:id 로 설정된 "mainNavigation" 이 헤더 패널로, 모든 웹 페이지에 동일한 헤더가 추가됨을 알 수 있습니다. 그럼 다음으로 HeaderPagel.java 에 대해 살펴봅시다.
HeaderPanel.java 를 열면 다음과 같이 되어 있습니다. 여기에 보면 Wicket Label 위젯이 추가되어 있습니다.
이렇게 자바에서 만들어진 위젯은, HTML 사이드에서 렌더됩니다. HeaderPanel.java 짝인 HeaderPanel.html 에 해당 내용이 나타나게 되는 거죠.
그럼 제시된 기본 내용을 조금 바꿔 보겠습니다. 기본으로 작성된 exampleTitle 대신 아래 내용으로 고칩니다.
=================================================
add(new Label("exampleTitle", "My Very First Component Based Application"));
=================================================
HeaderPanel.html 을 엽니다. 안의 내용을 보면 웹페이지의 HTML 로 렌더될 위젯이 지정되어 있음을 알 수 있습니다.
팁(Tip): 여기 <span wicket:id="exampleTitle"... 의 exampleTitle에 Ctrl 키를 누른채 마우스를 대면 하이퍼 링크 아이콘을 바뀝니다.(파란색으로), 이걸 클릭하면 해당 자바(HeaderPanel.java)로 페이지가 이동되고, 반대로 소스코드에서 HTML 페이지로 이동하려면 Alt+왼쪽화살표를 누르면 빠르게 이동할 수 있습니다 ^^;
파일을 저장하고, 프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭-실행
브라우저에 다음과 같은 내용이 표시됩니다.
********************************************************
이제 이번에는 여기에 새 위젯을 추가해보도록 하겠습니다.
하나의 위젯은 하나의 자바파일과 같은 이름, 같은 경로에 HTML 파일로 구성됩니다.
자바에서 위젯을 만들고, HTML 에서 위젯을 렌더합니다.
위의 팁에서 살펴봤듯이 이 둘 사이는 하이퍼링크 및 단축키 등으로 둘 사이를 빠르게 이동할 수 있구요 ^^;
HomePage.html 을 열어 다음 내용(굵은 글씨)를 추가합니다.
================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title></title>
<link wicket:id='stylesheet'/>
</head>
<body>
<span wicket:id='mainNavigation'/>
<span wicket:id="message1">this text will be replaced</span>
</body>
</html>
================================================================
왼쪽 아래 네비게이터에서 Wicket Tag 목록을 누르면 아래 그림 처럼 태그 개요를 볼 수 있습니다. (3개)
이제 HomePage.java 를 열어, HTML 에 추가한 이름의(message1)의 라벨을 추가합니다. (굵은 글씨 참조)
==========================================================
public HomePage() {

setModel(new CompoundPropertyModel(this));
add(new Label("message1","Hello world!"));
}

==========================================================
그럼 새로 추가한 Label 의 임포트 문제때문에 오류가 뜨는데 해결 방법은 왼쪽 아이콘 모양을 누르면 제시안이 나옵니다. 여기서 org.apache.wicket.markup.html.basic.Label 을 임포트(가져오기 추가)를 클릭합니다.
그런 다음 프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행(run)
브라우저에 Wicket Label인 Hello world! 가 나타납니다.
이 Hello world! 에 H2 태그를 적용하려면 HomePage.html 에 span 을 h2 태그로 감싸 프로젝트를 다시 배포하면 됩니다.
==================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title></title>
<link wicket:id='stylesheet'/>
</head>
<body>
<span wicket:id='mainNavigation'/>
<H2>
<span wicket:id="message1">this text will be replaced</span>
</H2>
</body>
</html>
=================================================
프로젝트를 다시 실행시키면 아래 그림처럼 h2 태그가 적용되었음을 확인할 수 있습니다.
이와 같은 작업방식은 SPAN 태그와 같은 placeholder를 만들어, 이 HTML 파일을 웹 디자이너에게 넘기고, 여러분은 자바 사이드에서 해당 위젯을 독립적으로 만들면 된다는 뜻입니다. 이로써 Wicket의 철저한 "관심사 분리:separation of concerns" 라는 핵심 포커스가 이루어지는 거죠.
이번에는 Wicket 의 또다른 강점이라고 할 수 있는 "재사용 가능한 컴포넌트" 컨셉에 대해 살펴 보겠습니다.
이 작업에서는 Wicket 패널을 하나 만들어(하나라고는 하지만 해당 자바와 HTML 한 쌍이 만들어집니다) 헤더패널과 짝이 될 수 있는 풋터(FootPanel)을 만들어 헤더처럼 웹 사이트에 재사용될 수 있도록 페이지에 추가해보도록 하겠습니다.
우선 작업을 위해 새 파일을 만듭니다. 이때 패키지에서 마우스 오른쪽을 클릭해서 새파일을 만들게 되면 해당 경로가 자동 작업이 되기 때문에 경로 선택에 대한 수고를 덜 수 있죠.
패키지(com.myapp.wicket)에서 마우스 오른쪽 클릭 - 새파일
카테고리는 web, 파일 유형은 Wicket Panel 선택 - 다음
파일 이름을 FooterPanel 이라고 줍니다.
그럼 아래 그림에서 처럼 2개의 파일(FooterPanel.java 와 FooterPanel.html) 파일이 생성됩니다. - 마침
우선 FooterPanel.html 파일을 열어 기본 내용을 살펴 봅니다. 기본에는 span 태그가 주석을 감싸여 있는데, 이 주석을 제거 합니다.
그리고 FotterPanel.java로 이동하는데, 프로젝트 창에서 해당 파일을 직접 열거나, 아니면 아까 위에 팁에서 처럼 Wicket id 값(title)에서 Ctrl 버튼을 누른채 마우스를 대면 하이퍼링크가 나타나는데 그때 클릭하면 바로 자바 파일로 이동합니다.
FooterPanel.java 파일 기본 내용은 다음과 같습니다.
여기에 (super(id);) 아래 다음 내용(굵을 글씨)을 작성합니다.
=====================================================
package com.myapp.wicket;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;

final class FooterPanel extends Panel {
FooterPanel(String id) {
super (id);
add(new Label("title","I am a reusable component!"));
}
}
=====================================================
아까와 마찬가지로 Label의 임포트 문제는 앞의 아이콘을 눌러 org.apache.wicket.markup.html.basic.Label 를 가져오기 추가를 선택합니다.
임포트 확인
이제 이 패널을 홈페이지에 추가하면 됩니다. 방법은 HomePage.java 를 열어 FooterPanel의 새 인스턴스를 추가해줍니다. 굵은 글씨 내용을 추가합니다.
============================================
...
public class HomePage extends BasePage {

public HomePage() {
add(new Label("message1", "Hello world!"));
add(new FooterPanel("footerPanel"));

}
}
============================================
자바에서 추가된 패널을 이번엔 HTML 에서 렌더해야 합니다. HomePage.html 을 열어 footerPanel에 대한 placeholder 를 추가합니다. (굵은 글씨 참고)
=================================================================
...
<body>
<span wicket:id='mainNavigation'/>
<h2>
<span wicket:id="message1">this text will be replaced</span>
</h2>
<span wicket:id='footerPanel'/>
</body>
...
=================================================================
파일을 저장하고 프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행(run)
아래 그림 처럼 footerPanel의 내용이 잘 나타나는 걸 보실 수 있습니다.
주: Wicket 용어에서, 패널은 재사용가능한 컴포넌트입니다. 이러한 패널을 활용한다면 원하는 만큼의 웹 페이지를 원하는 곳에 재사용 가능하게 만들 수 있습니다.
************************************************************
이제 이 게시물의 마지막으로 AJAX 기능에 대해 만들어 보겠습니다.
Wicket 에서는 AJAX 기능을 추가하기 위해 자바스크립트를 사용하는 대신, AJAX 를 캡슐화한 자바 컴포넌트 모델을 만들어 사용합니다. 이번 게시물에서는 위의 FooterPanel에 AJAX 의 autocomplete 위젯을 추가하도록 하겠습니다.
autocomplete 위젯은 플러그인 설치 jar 에 포함되어 있지 않은 extension jar 이므로 따로 다운로드 받아 사용시 프로젝트 라이브러리에 추가해줘야 합니다.
우선 이 extension jar 파일을 grepcode.com에서 다운로드 합니다. 아래 그림의 사이트에서 binary download 를 선택하면 됩니다.
그런 다음 프로젝트의 library 에서 마우스 오른쪽을 클릭하여 JAR/폴더 추가를 클릭합니다.
팝업창이 뜨면 아까 받은 jar (wicket-extensions-1.4.0.jar 파일을 선택하고, 열기를 클릭합니다)
이제 FooterPanel.java 파일을 열어 생성자 아래 다음 내용(굵은 글씨)을 작성합니다.
=======================================================
...
public final class FooterPanel extends Panel {
FooterPanel(String id) {
super(id);
add(new Label("title", "I am a reusable component!"));
}
final AutoCompleteTextField field = new AutoCompleteTextField("countries", new Model("")) {
@Override
protected Iterator getChoices(String input) {
if (Strings.isEmpty(input)) {
return Collections.EMPTY_LIST.iterator();
}
List choices = new ArrayList(10);
Locale[] locales = Locale.getAvailableLocales();
for (int i = 0; i < locales.length; i++) {
final Locale locale = locales[i];
final String country = locale.getDisplayCountry();
if (country.toUpperCase().startsWith(input.toUpperCase())) {
choices.add(country);
if (choices.size() == 10) {
break;
}
}
}
return choices.iterator();
}
};

}
========================================================
그런 다음 생성자 부분에서 라벨 대신 field 변수를 추가합니다
=======================================================
...
public FooterPanel(String id) {
super(id);
//add(new Label("title", "I am a reusable component!"));
add(field);
}
...
=======================================================
임포트 문제를 해결하기 위해 편집기 여백에서 마우스 오른쪽 클릭 - 가져오기 수정(fix import)
아래 그림을 참고하여 임포트 할 클래스를 선택합니다.

임포트 확인
----------------------------------------------------
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.string.Strings;
----------------------------------------------------
이제 FooterPanel HTML 에서 자바 클래스에서 만든 위켓을 연결합니다.
Wicket id는 "countries" 를 사용하여 입력 텍스트 필드를 추가합니다.
==============================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:wicket>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>FooterPanel</title>
</head>
<body>
<wicket:panel>

<!--<span wicket:id="title">title here</span>-->
<input type="text" wicket:id="countries" size="50"/>

</wicket:panel>
</body>
</html
==============================================
자바 파일을 수정했기 때문에 원칙적으로 다시 빌드를 해야 합니다. (다만 여기서 예전 파일이 deploy 되어 있는 상태에서 clean and build 가 정상 동작하지 않을 수도 있기 때문에 그런 경우 해당 서버를 중지시키고, file 탭으로 가서 build와 dist 폴더를 삭제하거나, 아니면 아예 넷빈을 다시 껐다가 켜서 해당 프로젝트를 clean and build 하는 게 좋습니다)
프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행(run)
브라우저에 텍스트 필드가 나타나면 "대"라고 입력합니다.
그럼 그림과 같이 아래 대만,대한민국이 제시됩니다.

*************************************************************
추가분: (문제상황점검)
현재 나라에 대한 설정을 잘 살펴보면 우선 10개씩만 나타나도록 되어 있습니다. 이 문제도 수정을 해야 하고.. 또 하나, 로케일에 관한 사항인데 현재 소스로는 한글로 입력시에 해당 로케일에 대해 나옵니다만 영어로 하는 경우에는 영문 로케일을 반영하지 않기 때문에 아무 제시어도 나타나지 않습니다.
그럼 영어로 나라이름을 적었을 때 나타나게 하려면 어떻게 소스를 수정해야 할까요? 또하나 10개의 제한을 없애려면?
-------------------------------------------------------------
해답: 아까의 FooterPanel.java 의 코드 부분을 다음과 같이 수정합니다.
===================================================
public final class FooterPanel extends Panel {

...

final AutoCompleteTextField field = new AutoCompleteTextField("countries", new Model("")) {
@Override
protected Iterator getChoices(String input) {
if (Strings.isEmpty(input)) {
return Collections.EMPTY_LIST.iterator();
}
List choices = new ArrayList(10);
Locale[] locales = Locale.getAvailableLocales();
for (int i = 0; i < locales.length; i++) {
final Locale locale = locales[i];
locale.setDefault(Locale.ENGLISH);
final String country = locale.getDisplayCountry();
if (country.toUpperCase().startsWith(input.toUpperCase())) {
choices.add(country);
/*
if (choices.size() == 10) {
break;
}
*
*/

}
}
return choices.iterator();
}
};
...
=================================================================
파일을 저장하고 프로젝트를 다시 clean and build 한 후 실행시키면 아래 그림처럼 영어로 입력시 나라이름이 제시됩니다. a 로 시작되는 나라들
s 로 시작되는 나라들..(south korea ㅋㅋㅋ)

이상 간단히 알아본 Wicket 이었습니다.
나중에 좀더 다양한 형태의 Wicket 위젯들에 대해 알아보도록 하겠습니다.
수고하셨습니다. *^^*

Netbeans-Korean by 강여사 - July 03, 2010 01:39 PM
넷빈(NetBeans)6.9에서 모듈(.exe 나 플러그인) 만들기-01-googletoolbar

넷빈 플랫폼은 아시다시피 모듈 아키텍처 입니다. 더욱이 넷빈즈 플랫폼은 자바로 사용자 인터페이스를 만들어주는 공식 툴킷인 Swing UI 툴킷에 기반한 "Matisse' GUI 빌더와 결합되어 있습니다.

넷빈에서 모듈을 만들게 되면 독립적인 실행 프로그램으로(넷빈 기반의 Swing UI)가능하고, 또 넷빈의 플러그인 형태를 만들어 낼 수도 있습니다.

따라서 이번에는 넷빈 플랫폼을 기반으로 하는 넷빈 모듈 프로젝트를 만드는 방법에 대해 알아보고, 보다 쉽게 나만의 넷빈 플러그인을 만들어 봅시다.이번 게시물에서는 아니지만 특히나 넷빈 6.9에서 제공되는 설치 프로그램 브랜딩에 대해서도 살펴보도록 하겠습니다.

우선 작업환경은 다음과 같습니다.

넷빈 6.7 이상 (저는 넷빈 6.9에서 작업했습니다)
JDK 5이상 (저는 JDK6up20입니다)

그럼 이제 간단한 넷빈 모듈 플랫폼 어플리케이션을 만들어 보도록 하겠습니다.
프로젝트 창에서 마우스 오른쪽 클릭 - 새 프로젝트
카테고리에서 넷빈즈 모듈을, 프로젝트에서 Module 을 선택합니다. - 다음
프로젝트 이름은 GoogleToolbar ,(앞으로 구글 검색 바 만듭니다 ^^;)
경로는 적당히
독립실행형(standalone 프로그램) 등 기본 설정 그대로 - 플랫폼 옆에 관리 버튼을 누르면 다른 플랫폼도 추가 ,선택 가능합니다.
플랫폼 이름 및 폴더 이름 확인 후 그냥 닫기
원래 창으로 돌아와서 다음을 누르면 아래 그림과 같이 뜨는데 여기서는 기본 모듈 구성에 관한 내용을 설정합니다.
코드 이름 기본: org.myorg.googletoolbar 로,
"Generate XML Layer" 선택, org/myorg/googletoolbar 패키지안에 저장될 로컬화된 번들 및 XML 레이어 파일들의 위치를 확인후 마침
그럼 아래 그림과 같이 모듈에 관련된 일련의 파일이 만들어집니다. 프로젝트는 소스코드와 프로젝트 메타데이터 등으로 구성되어 있습니다. 해당 파일을 열어 논리적 파일을 살펴본 후 Ctrl+2 키를 누르면 파일 윈도우창으로 변경됩니다. 파일 탭창에 나타나는 파일은 실제 물리적인 파일 및 구조들 입니다. 확인
프로젝트 창으로 와서 중요한 파일(Important Files) 노드에서 Module Manifest(모듈 매니페스트)를 열어 다음 내용을 확인합니다.
------------------------------------------------------
Manifest-Version: 1.0
OpenIDE-Module: org.myorg.googletoolbar
OpenIDE-Module-Layer: org/myorg/googletoolbar/layer.xml
OpenIDE-Module-Localizing-Bundle: org/myorg/googletoolbar/Bundle.properties
OpenIDE-Module-Specification-Version: 1.0
------------------------------------------------------
이제 모듈에 코드작업을 하기 위해 다음을 진행합니다. 우선 프로젝트에서 오른쪽 마우스를 클릭하여 새로 만들기(new File)- action (만약 액션(작업) 메뉴가 보이지 않으면 other 를 선택한 후, module development 를 선택하면 action 이 있습니다)
Action Type 창에서 기본 설정대로 항상 활성화를 그대로 확인하고 다음을 진행합니다. 이렇게 되면 자동 ActionListener 가 서브클래스로 만들어집니다
GUI 등록 패널에서 아래 그림처럼 범주 기타 등등을 설치하는데, 이 대목에 시간이 꽤 걸릴 수 있습니다..느긋하게..--; 범주는 파일로, 전역메뉴아이템 체크는 해제하고, 아래 전역 툴바 버튼은 체크합니다. (그림 참고)
아래 그림처럼 설정하고 다음
이름, 아이콘 및 위치를 설정합니다. 클래스 이름은 GoogleAction 으로 주고 , 아이콘 작업은 할 수도 안할 수도 있는데, 만약 하게 되면 16x16, 24x24 픽셀 사이즈의 아이콘이 2개 필요하며 해당 이미지 파일을 찾아보기를 통해 연결하면 됩니다. 모든 작업이 정상적으로 진행되면 아래 그림처럼 생성되는 파일과 수정 파일에 내용이 표시됩니다. - 마침
이번에는 디자인 작업을 위해 JPanel 을 만듭니다. 프로젝트에서 마우스 오른쪽 클릭 - 새로만들기 - Other
팝업창이 뜨면 카테고리에서 Swing GUI 폼 , 파일 유형은 JPanel 폼 을 선택합니다 - 다음
패널 클래스 이름은 GooglePanel 로 주고 패키지는 같은 패키지를 드롭다운 리스트에서 찾아 선택해 줬습니다 - 마침
가운데 디자인 창에 JPanel 이 나타나는데 아래 그림처럼 마우스 커서로 드래그해서 적당히 사이즈를 줄입니다
그런 다음 오른쪽 팔레트에서 JLabel 하나를 끌어 Google: 이라고 입력하고 왼쪽에, 그리고 오른쪽에는 JTextField 를 하나 끌어다가 역시 드래그해서 적당히 사이즈를 맞춰줍니다. 그리고 안의 내용은 오른쪽에 등록정보 창에 text 내용을 지우고 엔터키를 치면 내용이 지워집니다.
이제 텍스트 필드에 코드를 입력해야 하는데 왼쪽 인스펙터(검사기?-만약 안보이면 상단의 창 메뉴에서 - 네비게이션-인스펙터를 클릭)에서 JTextField 에서 마우스 오른쪽을 클릭하면 Events - key- keytypes 를 차례로 선택하여 클릭하면 자동으로 소스 코드로 전환됩니다.
전환된 메소드에 다음 내용(굵은 글씨)를 작업합니다.
==================================================================
private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {
int i = evt.getKeyChar();
if (i==10){//The ENTER KEY
// we display the google url.
try{
URLDisplayer.getDefault().showURL
(new URL("http://www.google.com/search?hl=en&q="+jTextField1.getText()+"&btnG=Google+Search"));
} catch (Exception eee){
return;//nothing much to do
}
}

}
==================================================================
임포트 문제 해결은 여백에서 마우스 오른쪽을 클릭하여 가져오기 고정(fix import)를 선택합니다
임포트 클래스 확인 - OK
플러스: 만약 URLDisplayer 가 작업되지 않으면 org.openide.awt 패키지에 문제가 있습니다. 따라서 이 경우 다음과 같이 해결할 수도 있습니다. 우선 프로젝트에서 오른쪽 마우스를 클릭한 후 등록정보를 선택합니다.
라이브러리를 누르고 모듈 종속성에서 UI 유틸리티 API를 추가해주면 됩니다. 오른쪽의 추가 버튼을 누르고 팝업창이 뜨면 필터에 URLDisplayer 를 입력하면 관련 모듈이 제시됩니다. - OK
이렇게 진행 완성된 임포트를 보면 아래 그림과 같습니다
---------------------------------------------------------
import java.net.URL;
import org.openide.awt.HtmlBrowser.URLDisplayer;
---------------------------------------------------------
이제 Presenter.Toolbar 를 구현해보도록 하겠습니다. JPanel에 구글 툴바가 표시될 실제 컴포넌트를 만들려면 Presenter.Toolbar 를 구현해야 합니다. 작업은 GoogleAction.java 에서 다음 코드를 작성합니다. 굵은 글씨 참고
========================================================
package org.myorg.googletoolbar;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public final class GoogleAction implements Presenter.Toolbar, ActionListener {

Component comp = new GooglePanel();

@Override
public void actionPerformed(ActionEvent e) {
// TODO implement action body
}

@Override
public Component getToolbarPresenter() {
return comp;
}

}
========================================================
역시 임포트 문제는 마찬가지로 fix import(가져오기 고정)으로 해결합니다.
layer.xml 을 열어 내용을 확인합니다. 여기서는 Action 클래스의 인스턴스를 만들 필요가 없기 때문에 "instanceCreate" 속성은 제거합니다. (주석처리).
JPanel 에 JTextField 에서 엔터키를 입력하면 Google Search 로 내용이 보내집니다. HTML 브라우저에 열리고 Google Search 의 결과가 나타나게됩니다.
프로젝트를 저장하고, 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행
모듈이 빌트되고 IDE에 새 인스턴스가 설치된 넷빈이 시작되면서 아래 그림 처럼 구글패널이 나타납니다. 텍스트필드에 " netbeans ruby on rails" 를 입력하고 엔터키를 누릅니다
브라우저 창에 해당 내용의 구글 서치가 표시됩니다.
그럼 이제 이 모듈을 넷빈 플러그인 형태로 만들어 보겠습니다. 프로젝트에서 마우스 오른쪽을 클릭하여 NBM 모듈을 선택합니다.
작업이 성공적으로 마쳐지면(출력창에서 build successfully.) 파일 탭을 눌러 파일 창에 보면 해당 모듈이 만들어진 걸 확인할 수 있습니다.
이 모듈을 지금 넷빈에 설치해보도록 하겠습니다. 도구-플러그인
다운로드 탭을 선택하고 플러그인 추가 버튼을 눌러 GoogleToolbar 프로젝트의 build 폴더 안에 XX.nbm 을 선택하여 엽니다.
플러그인 내용이 표시됩니다. 확인후 왼쪽 아래 설치 버튼을 눌러 진행합니다.
설치 프로그램이 요구하는 대로 진행합니다. - 다음
라이센스에 동의(체크)후 설치 클릭
서명 경고 무시하고 계속
설치가 완료되면 마침
이제 좀전에 만든 모듈이 플러그인 설치로 왼쪽 상단에 보면 구글서치툴바가 설치된 걸 확인할 수 있습니다.
팁. 설치한 모듈을 해제 및 비활성화하려면 도구-플러그인-설치됨(installed)에서 해당 플러그인을 찾아서 해제나 비활성하면 됩니다.
이상이 간단히 넷빈 모듈 프로젝트를 만들어 본 예제입니다.
앞으로 다양한 넷빈 모듈 프로젝트에 대해 올려보겠습니다.
특히나 넷빈 6.9에는 이 대목을 적극 홍보하는 거 보면 넷빈의 플러그인 개발을 유도하는 듯 하는 느낌이..ㅋㅋ
아무튼 수고하셨습니다. ^^

Netbeans-Korean by 강여사 - July 01, 2010 11:08 AM
넷빈(Netbeans)6.8에서 JSF 2.0 사용하기-소개-03

이제 JSF 템플릿을 사용해보도록 하겠습니다.
우선 템플릿이 될 파일을 만듭니다.
프로젝트에서 마우스 오른쪽 클릭 - new - other

JavaServer Faces 에서 Facelet Templates 을 선택합니다.
다음 클릭

템플릿 이름은 template 으로 주고
아래 css 레이아웃에 아래쪽 3번째를 선택했습니다.
마침 클릭

기본 작업되어 있는 내용이 제시됩니다.
이번 예제에서는 계속 쓰던 css 를 이 템플릿을 이용하여 사용할 것이기 때문에 만들어진 내용을 다 지우고
아래 소스로 바꿔넣습니다.
=========================================================================
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">

<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="css/stylesheet.css" rel="stylesheet" type="text/css" />
<title><ui:insert name="title">Facelets Template</ui:insert></title>
</h:head>
<h:body>
<div id="mainContainer">
<div id="left" class="subContainer greyBox">
<ui:insert name="box">Box Content Here</ui:insert>
</div>
<div id="right" class="subContainer">
<img src="duke.png" alt="Duke waving" />
</div>
</div>
</h:body>
</html>
=========================================================================

그리고 이 파일을 실행해보면 (프로젝트를 다시 실행하고 주소 표시줄에 해당 파일 이름을 입력하면 됩니다)
다음 그림과 같이 css 가 잘 작업되어 나옵니다.

이제 템플릿의 클라이언트 파일을 만들도록 하겠습니다.
프로젝트에서 마우스 오른쪽 클릭 - new - other

JavaServer Faces 에서 Facelets Template Client 를 선택
다음 클릭

파일 이름은 greeting 이라고 주고
아래쪽의 template 파일에서 browse... 버튼을 눌러 좀전에 작성한 template.xhtml 파일을 선택합니다(select file) 클릭.

그런 다음 만들어진 greeting.xhtml 에서 <ui:define> 안의 내용을 title -> Greeting 으로 바꿉니다.

그리고 body 부분에다가 다음 소스로 바꿔 넣습니다.
============================================================================
<ui:composition template="./template.xhtml">
<ui:define name="title">
Greeting
</ui:define>
<ui:define name="box">
<h4>Hi, my name is Duke!</h4>
<h5>I'm thinking of a number
<br/>
between
<span class="highlight">0</span> and
<span class="highlight">10</span>.</h5>
<h5>Can you guess it?</h5>
<h:form>
<h:inputText size="2" maxlength="2" value="#{UserNumberBean.userNumber}" />
<h:commandButton id="submit" value="submit" action="response" />
</h:form>
</ui:define>
</ui:composition>
============================================================================

이제 response.xhtml 에서도 템플릿을 적용하도록 하겠습니다.
다음 내용으로 바디 부분을 변경합니다.
-----------------------------------------------------------------------------
<ui:composition template="./template.xhtml">
<ui:define name="title">
Response
</ui:define>
<ui:define name="box">
<h4><h:outputText escape="false" value="#{UserNumberBean.response}"/></h4>
<h:form prependId="false">
<h:commandButton id="backButton" value="Back" action="greeting" />
</h:form>
</ui:define>
</ui:composition>
-----------------------------------------------------------------------------

이제 첫 화면을 greeting이 뜨도록 하기 위해 web.xml 에서 다음과 같이 수정합니다.
web.xml 을 열어 Pages 탭을 누르면 welcome files 이 index.xhtml 로 되어 있습니다. 이를 greeting.xhtml 으로 바꿉니다.

그런 다음 프로젝트를 실행 (run) 합니다.(css 까지 잘 적용된 그림)

8을 주고 submit 버튼을 눌렀을 때 입니다. Yay~ 가 잘 나오는군요..

back 버튼도 잘 작동하는 지 확인해봅시다~


수고하셨습니다. *^^*

Netbeans-Korean by 강여사 - July 01, 2010 11:07 AM
넷빈(Netbeans)6.8에서 JSF 2.0 사용하기-소개-02

이제 페이지에 좀전에 작성한 빈을 연결하도록 하겠습니다.

우선 기본으로 만들어진 index.xhtml 을 엽니다.
바디부분에 다음과 같은 내용을 작성해서 넣습니다.
------------------------------------------------------------------
<h:body>
<h5>Can you Guess It?</h5>
<h:form>
<h:inputText size="2" maxlength="15" >
</h:inputText>
<h:commandButton id="submit" value="submit" >
</h:commandButton>
</h:form>

------------------------------------------------------------------
태그를 동적으로 만들어 놓고 빈과의 연결을 시도합니다.
-------------------------------------------------------------------
<h:body>
<h5>Can you Guess It?</h5>
<h:form>
<h:inputText size="2" maxlength="15" value="#{UserNumberBean.userNumber}">
</h:inputText>
<h:commandButton id="submit" value="submit" >
</h:commandButton>
</h:form>
-------------------------------------------------------------------

-------------------------------------------------------------------
<h:body>
<h5>Can you Guess It?</h5>
<h:form>
<h:inputText size="2" maxlength="15" value="#{UserNumberBean.userNumber}">
</h:inputText>
<h:commandButton id="submit" value="submit" action="response" >
</h:commandButton>
</h:form>
-------------------------------------------------------------------

이제 페이지 네비게이션을 위한 구성파일을 만들도록 하겠습니다.

이전과는 달리 JSF 프레임워크를 선택하였더라도 facelets를 선택했다면 face-config.xml 은 기본 작업되지 않습니다. 따라서 이 파일을 만들어야 합니다.

프로젝트에서 마우스 오른쪽 클릭 - new - other

JavaServer Faces 를 선택하고 JSF Configuration File 을 선택합니다.
다음 클릭

파일 이름으로 faces-config 를 줍니다
마침 클릭

만들어진 구성파일에 네비게이션 룰을 다음과 같이 작성하여 넣습니다.
--------------------------------------------------------------------
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>

<navigation-case>
<from-outcome>response</from-outcome>
<to-view-id>/response.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
--------------------------------------------------------------------

이제 response.xhtml 파일을 만들도록 하겠습니다.
프로젝트에서 오른쪽 마우스 클릭 - new - other

JavaServer Faces 에서 JSF Page 선택
다음 클릭

이름은 response 라고 줍니다.
마침 클릭

그리고 body 부분에 다음과 같이 작성해 넣습니다.
==================================================================
<body>
<div id="mainContainer">
<div id="left" class="subContainer greyBox">
<h4><h:outputText value="#{UserNumberBean.response}"/></h4>
<!--<form action="index.xhtml">
<input type="submit" id="backButton" value="Back" />
</form>-->
<h:form>
<h:commandButton id="backButton" value="Back" action="index" />
</h:form>
</div>
<div id="right" class="subContainer">
<img src="duke.png" alt="Duke waving" />
<!--<h:graphicImage url="/duke.png" alt="Duke waving" />-->
</div>
</div>
</body>
===================================================================

이번 예제에서 사용할 stylesheet.css 를 해당 폴더(css)에 넣습니다. - 첨부파일 참조

프로젝트를 실행합니다.
숫자를 입력할 수 있는 칸이 뜹니다.
3으로 입력하고 submit 버튼을 누릅니다.

잘못된 추측이라고 나옵니다.

현재 이 상태에는 약간의 오류가 있는데 첫번째는 <p> 태그가 그냥 나온다는 점이고, 두번째는 back 버튼이 정상 동작하지 않습니다.
따라서 아까의 부분에 다음의 내용을 추가합니다.
-----------------------------------------------------------------------------
<h4><h:outputText escape="false" value="#{UserNumberBean.response}"/></h4>
-----------------------------------------------------------------------------

-----------------------------------------------------------------------------
<h:form prependId="false">
-----------------------------------------------------------------------------

이제 다시 프로젝트를 실행(run)한 후 서버(server.log)창에서 적혀있는 값을 확인하여 그 값을 넣어줍니다.

그럼 다음 그림과 같이 맞다고 나옵니다.

이제 다음에는 여기에 템플릿을 사용해보도록 하겠습니다. 계속...

Netbeans-Korean by 강여사 - July 01, 2010 11:05 AM
넷빈(Netbeans)6.8에서 JSF 2.0 사용하기-소개-01

JavaServer Faces 2.0 소개

JSF는 자바 웹 어플리케이션의 사용자 인터페이스(User Interface:UI) 프레임워크 입니다.

서버사이드에서 대상 클라이언트에게 UI를 렌더해주는데 손쉬운 작성과 유지가 가능케하는데 디자인에 촛점을 두고 있습니다.

* 재사용가능한 UI 컴포넌트로부터 UI를 구축하는데 쉽고
* UI에서 응용프로그램 데이터 이관(migration)이 심플화되며
* 서버 요청에 걸쳐 UI 상태를 관리를 지원하고,
* 서버사이트 어플리케이션 코드에 클라이언트-생성 이벤트를 연결하는데 심플 모델을 제공
* 커스텀 UI 컴포넌트 허용

더 자세히는 튜토리얼 참조. Java EE 6 Tutorial, Chapter 5: JavaServer Faces Technology.

이번 게시물에서는 넷빈즈에서 JSF 2.0 지원에 대해 기본 웹 어플리케이션 작성을 통해 다음과 같은 내용들을 살펴보고자 합니다

* 요청 데이터를 핸들링하기 위해 JSF 매니지드 빈 만들기
* 웹 페이지에 매니지드 빈 연결하기
* Facelet template file 에 웹 페이지 컨버팅하기

이 작업을 위한 환경은

넷빈 6.8
서버 글래스피시 v3 도메인
EE 6 버전입니다.

우선 새 프로젝트를 만듭니다.
파일 - 새 프로젝트(new project)
Java Web - Web application

다음 클릭
프로젝트 명에 JSF20 이라고 줬습니다.
경로는 적당히
다음 클릭 서버를 글래스피시 v3 도메인
EE 버전은: Java EE 6 Web
다음 클릭 프레임워크에서 JavaServlet Faces 를 선택합니다.
라이브러리는 글래스피시 v3 도메인에 기본으로 사용 오른쪽의 configuration 탭을 누르면 JSF 구성에 대해 나옵니다.
Preferred Pages에 Facelets 으로 할 건지, JSP로 할 건지 선택이 가능합니다. (기본은 Facelets으로 되어 있습니다)
마침 클릭 이제 JSF Managed Bean 을 만들도록 하겠습니다.
작업을 위해 프로젝트 오른쪽에서 마우스 클릭
new - other JavaServer Faces 에서 JSF Managed Bean 을 선택합니다.
다음 클릭
클래스 이름은 UserNumberBean
패키지 이름은 guessNumber
scope 는 session 으로 줬습니다.
마침 클릭


생성자 부분에 다음과 같은 내용을 추가하고, 임포트 관련 문제 해결은 편집기에서 오른쪽 마우스를 클릭하여 가져오기 고정(fix import)를 클릭하면 됩니다.
------------------------------------------------------------------------------------
public class UserNumberBean {
Integer randomInt;
/** Creates a new instance of UserNumberBean */
public UserNumberBean() {
Random randomGR = new Random();
randomInt = new Integer(randomGR.nextInt(10));
System.out.println("Duke's number: " + randomInt);
}
}
-------------------------------------------------------------------------------------
임포트 관련 참고: java.util.Random
이 상태로 (SessionScope)로 수행(Run) 해보면 그림과 같이 배포(deploye)수행 시간이 나옵니다.
JSF는 기본적으로 lazy instantiation을 사용하므로 UserNumberBean 객체가 만들어지지 않습니다.

즉, 특정 scope를 가진 빈은 어플리케이션에 의해 필요할 때 만들어지고 초기화된 다는 것을 의미합니다.
이 소스를 다른 건 그대로 두고 ApplicationScope로 바꾸면 어떻게 되는 지 살펴봅니다.
------------------------------------------------------------------------------
@ManagedBean(name="UserNumberBean", eager=true)
@ApplicationScoped
public class UserNumberBean {
-----------------------------------------------------------------------------
임포트 관련 문제는 위와 같이 fix import(가져오기 고정)으로 해결합니다.

임포트 참조: javax.faces.bean.ApplicationScoped
이번에는 아까와는 달리 생성자가 호출되며 객체가 만들어진 걸 볼 수 있습니다.

다시 아까와 같이 SessionScope로 원상태로 고칩니다.
----------------------------------------------------------------------------------
@ManagedBean(name="UserNumberBean")
@SessionScoped
public class UserNumberBean {
----------------------------------------------------------------------------------

세션 스코프를 가지기 위해 java.io.Serializable 인터페이스를 구현합니다.
---------------------------------------------------------------------------------
@ManagedBean(name = "UserNumberBean")
@SessionScoped
public class UserNumberBean implements Serializable {
---------------------------------------------------------------------------------
임포트 참고: java.io.Serializable
변수를 하나 더 추가하고 이에 대한 getter/setter도 같이 작업합니다.(getter/setter는 편집기에서 오른쪽 마우스 클릭- 코드 삽입(insert code)을 선택하면 getter/setter 메뉴가 그림과 같이 제시됩니다. 클릭
------------------------------------------------------------------------------------
Integer userNumber;
------------------------------------------------------------------------------------
getter/setter 에서 userNumber 를 체크 (그림 참조) 하고 생성 버튼 클릭
문자열을 하나 추가하고 메소드를 작성합니다(아래 코드 및 그림 참조 )
------------------------------------------------------------------------------------
String response;

public String getResponse() {
if ((userNumber != null) && (userNumber.compareTo(randomInt) == 0)) {

//invalidate user session
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
session.invalidate();

return "Yay! You got it!";
} else {

return " Sorry, " + userNumber + " isn't it."
+ " Guess again...";
}
}
------------------------------------------------------------------------------------
임포트 참고:
javax.servlet.http.HttpSession
javax.faces.context.FacesContext
이 다음은 page에 대해 알아보도록 하겠습니다. 계속...

Netbeans-Korean by 강여사 - July 01, 2010 11:03 AM
넷빈(NetBeans)6.9에서 Google Web Toolkit 사용하기 03 - AJAX 랜덤 격언 생성기

이번에는, 웹 페이지에서 AJAX 로 랜덤하게 격언이 표시되는 프로그램을 만들어보겠습니다.
이 랜덤 격언은 서버에 저장된 일련의 격언들이 선택되어, 매초마다 탐색되어, 페이지 리로딩 없이 AJAX 스타일로 웹 페이지에 나타나게 됩니다.

이 기능을 생성하는게 GWT RPC(Remote Procedure Call) 서비스를 사용합니다.

우선 서비스 스텁을 생성합니다.

넷빈즈 GWT 플러그인에 이 RPC 서비스 생성 마법사가 들어 있습니다. 따라서 새 파일에서 항목을 선택하여 마법사를 진행하면 됩니다. (그림 참조)
프로젝트에서 마우스 오른쪽 클릭 - 새파일 - Other

카테고리 Google Web Toolkit 에서 GWT RPC 서비스 선택 - 다음
제시된 기본 내용에 서브패키지만 sampleservice 라고 채워줍니다 - 마침
그럼 관련 스텁들이 자동으로 생성됩니다. (그림 참조)
이제 이 자동생성된 클래스들에 대해 좀더 자세히 살펴보도록 하겠습니다.

GWTService: 서비스의 클라이언트사이드 정의입니다. 이 인터페이스는 RemoteService 를 상속받아 처리합니다(RPC)
-------------------------------------------------------
package org.yournamehere.client.sampleservice;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

@RemoteServiceRelativePath("sampleservice/gwtservice")
public interface GWTService extends RemoteService {
public String myMethod(String s);
}
-------------------------------------------------------
GWTServiceImpl: GWTService 인터페이스를 구현받는 서블릿 클래스로, RPC를 통해 랜덤으로 격언문장들을 탐색하기 위한 기능을 제공하는 myMethod(XX)가 구현되어 있습니다.
==========================================================
package org.yournamehere.server.sampleservice;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import org.yournamehere.client.sampleservice.GWTService;

public class GWTServiceImpl extends RemoteServiceServlet implements GWTService {

public String myMethod(String s) {
// Do something interesting with 's' here on the server.
return "Server says: " + s;
}

}
==========================================================
GWTServiceAsync : 비동기 인터페이스로 GWTService 인터페이스 기반에 서버와 클라이언트간 비동기 통신을 가능케 하는 콜백 객체가 제공됩니다.

GWTServiceUsageExample : 테스트 클라이언트로 자동생성된 샘플 유저 인터페이스입니다.
서비스 호출에 사용되죠.

이제, GWTServiceUsageSample 객체를 초기화하여 서비스를 호출하기 위한 엔트리 포인트 클래스를 수정하도록 하겠습니다.
MainEntryPoing.java 의 메인 엔트리 포인트의 onModulLoad() 메소드를 수정합니다.
기존의 기본 샘플의 GWT 라벨 및 버튼 작업을 모두 지우고(주석처리), GWTServiceUsageExample 인스턴스를 추가합니다.
-----------------------------------------------
public void onModuleLoad() {
RootPanel.get().add(new GWTServiceUsageExample());
}
-----------------------------------------------
참고 : sampleservice.GWTServiceUsageExample 임포트 문제가 생깁니다. 이러한 임포트 문제 해결은 왼쪽 칼럼에 작게 나타나는 HINT(전구모양아이콘)을 눌러 add import... 등을 사용하시거나 아니면 편집기 창 여백에서 마우스오른쪽을 클릭하여 fix import 메뉴를 사용하셔도 됩니다.
프로젝트에서 마우스 오른쪽을 클릭하여 실행
브라우저에 아래 그림처럼 텍스트 입력박스와 버튼이 제시됩니다.
메시지를 넣고(예, Why not? )버튼을 누르면 아래 Server says: Why not? 이 보여집니다.
이제 GWT RPC 마법사를 사용하여 GWT RPC 서비스를 만드는 방법에 대해 살펴봤습니다.

*************************************************************************

이제 다음 세션에서는 이 자동생성된 클래스를 확장하여 서비스를 커스텀하는 작업과 호스트 페이지에 스타일시트를 덧붙이는 방법등에 대해 알아 보겠습니다.

자동 생성된 클래스 확장하기 위해 현재 작업된 서블릿 내용에 대해 다시 한번 점검해보도록 합시다.
web.xml 에 가면 서블릿과 서블릿 매핑 내용이 나옵니다. 확인
-------------------------------------------------------
<servlet>
<servlet-name>GWTService</servlet-name>
<servlet-class>org.yournamehere.server.sampleservice.GWTServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GWTService</servlet-name>
<url-pattern>/org.yournamehere.Main/sampleservice/gwtservice</url-pattern>
</servlet-mapping>
-------------------------------------------------------

이 클래스에서 랜덤 격언 생성자를 만들기 위해, GWTServiceImpl 인터페이스에 다음 내용을 작성합니다.
=======================================================
public class GWTServiceImpl extends RemoteServiceServlet implements GWTService {

private Random randomizer = new Random();
private static final long serialVersionUID = -15020842597334403L;
private static List quotes = new ArrayList();

static {
quotes.add("No great thing is created suddenly - Epictetus");
quotes.add("Well done is better than well said - Ben Franklin");
quotes.add("No wind favors he who has no destined port - Montaigne");
quotes.add("Sometimes even to live is an act of courage - Seneca");
quotes.add("Know thyself - Socrates");
}

public String myMethod() {
return (String) quotes.get(randomizer.nextInt(5));
}

}
=======================================================
임포트 관련 문제가 오류로 나타나니 해결방법은 편집기 여백에서 마우스 오른쪽을 클릭하고
fix import (가져오기 고정 --;)을 선택합니다. 그럼 2개 이상의 임포트 선택권이 있는 경우
팝업창이 제시됩니다.
그림을 참고하여 맞는 클래스를 선택합니다.
List - java.util.List
ArrayList - java.util.ArrayList
Random - java.util.Random - OK
MainEntryPoint 클래스, 어플리케이션의 엔트리 포인트 클래스로부터 직접 서비스를 호출하도록 다음과 같이 소스 작업을 추가합니다. (getService() 메소드)
=====================================================
public class MainEntryPoint implements EntryPoint {

/**
* Creates a new instance of MainEntryPoint
*/
public MainEntryPoint() {
}

public static GWTServiceAsync getService() {
// Create the client proxy. Note that although you are creating the
// service interface proper, you cast the result to the asynchronous
// version of the interface. The cast is always safe because the
// generated proxy implements the asynchronous interface automatically.

return GWT.create(GWTService.class);
}

...
=====================================================
역시 임포트문제는 fix import (가져오기 고정)으로 해결 (확인)
import com.google.gwt.core.client.GWT;
import org.yournamehere.client.sampleservice.GWTService;
import org.yournamehere.client.sampleservice.GWTServiceAsync;

onModulLoad() 메소드를 다음과 같이 변경합니다.
================================================
public void onModuleLoad() {

final Label quoteText = new Label();

Timer timer = new Timer() {

public void run() {
//create an async callback to handle the result:
AsyncCallback callback = new AsyncCallback() {

public void onFailure(Throwable arg0) {
//display error text if we can't get the quote:
quoteText.setText("Failed to get a quote");
}

public void onSuccess(Object result) {
//display the retrieved quote in the label:
quoteText.setText((String) result);
}
};
getService().myMethod(callback);
}
};

timer.scheduleRepeating(1000);
RootPanel.get().add(quoteText);

}
================================================
역시 임포트 문제는 fix import (가져오기 고정)으로 해결
Timer - com.google.gwt.user.client.Timer
AsyncCallBack - com.google.gwt.user.client.rpc.AsyncCallback
Label - com.google.gwt.user.client.ui.Label (확인)
String 매개변수를 받는 기존 myMethod 을 변경합니다.
GWTService 에서는
========================================================
public interface GWTService extends RemoteService {
public String myMethod();
}
========================================================
GWTServiceAsync 클래스에서는,
========================================================
public interface GWTServiceAsync {
public void myMethod(AsyncCallback callback);
}
========================================================
그런 다음 GWTServiceUsageExample 클래스에서 onClick(XXX) 메소드를 수정합니다 (그림 참조)
========================================================
기존의 54라인을 주석처리하고 55라인 추가
//getService().myMethod(txtUserInput.getText(),callback);
getService().myMethod(callback);
...
========================================================
프로젝트 - 실행
브라우저가 열리고 서버에서 매초마다 보내진 격언(인용) 문장이 랜덤으로 제시됩니다.
이제 다음 게시물에서는 여기에 스타일 시트를 추가하여 인용 문장의 외관모양을 좀더 좋게 바꿔보도록 하겠습니다.
to be continued...

Netbeans-Korean by 강여사 - July 01, 2010 11:03 AM
넷빈(NetBeans)6.9에서 Google Web Toolkit 사용하기 01 - 설치

이번에는 GWT를 설치 사용해보도록 하겠습니다.

GWT는 Google Web Toolkit 의 첫글자로 자바를 사용, 높은 성능의 AJAX 어플리케이션을 쉽게 만들어내도록 해주는 오픈 소스 웹 개발 프레임워크입니다. (자세한 내용은 역시 GWT 홈페이지에서 ^^;; http://code.google.com/webtoolkit/ )

GWT를 사용하면, 여러분은 자바로 앞단을, 그리고 여러분의 소스 코드는 최적화된, 브라우저 호환 자바스크립트 및 HTML로 컴파일됩니다. GWT 홈페이지에 가면 어쩌구 저쩌구 더 잘 써있습니다. 꼬옥 가서 보시길 ^^;

이번에는 넷빈즈 IDE에 GWT를 어떻게 설치 연결하여 사용하는 지와 기타 여러가지를 살펴볼 예정입니다.

우선 필요환경에 대해서 살펴보면,

넷빈즈 6.9 (6.9로 진행했습니다만 6.5/7/8/9) 다 됩니다. (뭐 약간 내용상 틀릴수는 있지만 ^^;)

물론 JDK 5 이상이 설치되어 있어야 하구요 (저는 JDK 6update20 입니다)

서버:글래스피시 2.1 ~ 3.0.1 까지 다 됩니다 (저는 glassfish 3.0.1 로 진행했습니다), 또는 톰캣으로 진행하서도 됩니다. 톰캣 버전은 6.x 이상

그리고 GWT SDK 가 있어야 합니다. GWT 홈페이지에 가서 다운로드 받아 압축을 푸는 게 설치의 다 입니다. 따로 인스톨러는 없습니다. (게시물 중간에 나옵니다. 버전은 1.5 이상이시면 됩니다. 오늘 시점의 가장 최신 버전으로 받았습니다)

그리고 넷빈즈 GWT 플러그인. 위의 SDK 말고 넷빈즈 연결 플러그인이 필요합니다. 이건 넷빈즈 GWT 프로젝트홈페이지에서 받아 설치합니다. 게시물에 바로 아래 나옵니다)

위에서 설명한 대로 플러그인이 필요합니다. 그거부텀 시작해보겠습니다.

https://gwt4nb.dev.java.net/

GWT 플러그인을 제공하는 사이트 입니다.
물론 원래 플러그인은 넷빈즈 IDE의 플러그인 매니저에서도 다운로드 받을 수 있도록 되어 있지만 현재 넷빈즈 6.9 에서 돌아가기 위한 버전은 아직 업데이트 센터에 안 올라와서(조만간 올라올겁니다) 직접 받도록 하겠습니다.
(오늘 시점에 플러그인 매니저로 설치되는 버전은 직접 다운로드 받는 거의 하위 버전입니다)

downloads를 누릅니다.
그럼 release 들이 제시되는데 맨 아래 2.8.0 버전을 선택하여 다운로드 받습니다.
이제 IDE를 시작하여 도구- 플러그인 을 클릭합니다

다운로드 받은 플러그인을 설치하려면 다운로드 탭을 누르고 아래 플러그인 추가 버튼을 클릭하면 그림과 같이 팝업창이 제시됩니다.
그럼 팝업창에서 다운로드 받은 nbm 파일을 찾아 엽니다.
아래 그림처럼 제시되면 왼쪽 아래에 설치 버튼을 누릅니다
설치 프로그램에 따라 계속 실행하시면 됩니다. - 다음
인증 서명 경고가 뜨지만 무시하고 계속
성공적으로 설치되면 마침
이제 샘플 프로젝트를 만들어 보도록 하겠습니다.
프로젝트 창에서 마우스 오른쪽을 클릭하여 새 프로젝트

카테고리에서 Java Web - 프로젝트는 Web Application 선택
다음

프로젝트의 이름은 HelloGWT 로
경로는 적당히
다음
서버 설정인데 이번 예제는 뭐 꼭 굳이 Glassfish 3.1 에서 할 필요는 없습니다, EE 6도.
저야 그냥 기본적으로 잡혀있는 이 2개로 진행했습니다.
다음

프레임워크 설정이 뜨는데 여기서 GWT(Google Web Toolkit)을 선택합니다.
그럼 원래는 SDK를 설치한 적이 없어 SDK 위치를 찾아 적으라고 나옵니다.
물론 경로(here)도 서비스되죠. here의 하이퍼 링크를 따라갑니다.

http://code.google.com/intl/ko-KR/webtoolkit/

http://code.google.com/intl/ko-KR/webtoolkit/download.html
위의 SDK를 받아 적당한 곳에 저장후 압축을 풉니다. (오늘 시점의 최신 버전은 GWT-2.0.3.zip 이네요)
그럼 압축을 해제한 경로를 SDK로 맞춰줍니다. (저는 c 드라이브에 downdloads 경로에 풀어 아래 그림 처럼이 경로입니다. 아래 그림 참조) - 마침
참고로 GWT 프레임워크 선택시에는 2가지 필드 설정이 있습니다.
GWT 설치 폴더: GWT 가 설치되어 있는 워크스테이션의 경로. (없으면 빨강색의 에러메시지가 뜨죠)
GWT 모듈: 프로젝트 이름과 위치 설정입니다. 프로젝트 모듈은 GWT 어플리케이션을 구성하는 XML 파일입니다. 기본적으로 패키지 이름과 프로젝트 모듈 이름이 제시되어 나타나는데 기본으로는 org.yournamehere 이 패키지, Main 이 프로젝트 모듈 이름으로 잡혀 있습니다. 나중에는 알아서 변경하시면 됩니다.

그럼 잠시 후 일련의 소스 구조 GWT 어플리케이션이 만들어집니다. 전 이래서 넷빈이 좋습니다. ㅋㅋ 뭘 공부해야할 지를 한눈에 알려준다는..--;

나중에 하나씩도 살펴보겠지만 일단 GWT 관련 JAR 파일들이 포함되고, GWT 모듈 프로젝트 구성 파일, 자바 entry point 와 같은 표준 아티팩트들도 포함되어 있습니다. 플러그인이 없다면 수동으로 하나씩 하면 됩니다. 노가다로.. --;
플러그인 설치가 괜히 필요한 게 아닙니다. 마법사..좋아요..쿄쿄쿄

그럼 자동생성된 내용이 어떤 건지 보기위해 프로젝트를 바로 실행합니다.
프로젝트에서 마우스 오른쪽 클릭 - 실행
브라우저에 아래 그림처럼 나타납니다. 버튼을 클릭하면 Hello, GWT 라는 텍스트가 사라집니다.

일단, 여기서 끊죠.. 여기까지가 GWT 설치 및 기본 이었습니다.
이어서 GWT 어플리케이션의 소스 구조를 살펴보고 AJAX 어플리케이션도 만들어보겠습니다.
to be continued...

Netbeans-Korean by 강여사 - July 01, 2010 11:03 AM
넷빈(NetBeans)6.9에서 Vaadin 웹 프레임워크 사용하기-01-설치 및 기본

이번엔 Vaadin 에 대해 소개해 보고자 합니다.

Vaadin...ㅋㅋ 이건 원래 영어가 아닙니다. 핀란드말로 female reindeer(암순록)를 뜻하죠.. 그래서인지 Vaadin의 기본 스타일시트 이름이 바로 reindeer 입니다.
역시 이 동네(IT)네이밍 센스는 언제봐도 놀랍습니다. 쿄쿄

아무튼~
Vaadin은 한마디로 RIA(Rich Internet Application)을 위한 오픈 소스 웹 어플리케이션 프레임워크입니다.

자바스크립트 라이브러리와 브라우저 플러그인 기반 솔루션과 대조적으로, Vaadin은 서버-사이드 아키텍처로, 따라서 로직의 대다수는 서버에서 실행된다는 걸 의미합니다. AJAX 테크롤로지는 사용자의 경험을 풍부하고 인터랙티브하게 만들어주는 브라우저-사이드에서의 사용입니다. Vaadin의 클라이언트-사이드는 GWT위에 빌트인되며 확장 가능합니다.

Vaadin의 코어는 자바 라이브러리로, 웹-기반 사용자 인터페이스의 하이 퀄리티를 쉽게 생성하고 유지보수할 수 있도록 설계되었습니다. Vaadin의 서버-주도 프로그래밍 모델의 주요 아이디어는 웹이 아닌, 마치 AWT,Swing 또는 SWT과 같은 보편적인 툴킷을 가진 자바 데스크탑 어플리케이션을 프로그래밍 하듯 사용자 인터페이스를 쉽게 만들어줍니다. 이 서버-주도 프로그램 모델로, Vaadin은 브라우저와 서버사이에 브라우저 및 AJAX 커뮤니테이션에 있어 UI 관리를 케어합니다. Vaadin 방식을 사용하게 되면 더이상 HTML 이나 자바스크립트와 같은 브라우저 기술을 배우거나 디버그 할 필요가 없습니다. ^^;

Vaadin 라이브러리는 사용자 인터페이스 프리젠테이션과 로직을 명확히 분리하여 각각 독립적으로 개발할 수 있도록 해줍니다. 어플리케이션의 비주얼 외양은 themes 를 사용하여 접근하고 있습니다. Themes는 CSS 와 HTML 페이지 템플릿을 사용하여 사용자 인터페이스 외양을 관리합니다. Vaadin은 기본 테마(reindeer) 뿐 아니라, 사용자 지정 테마를 만들수도 있습니다. 백엔드에서는, GWT(Google Web Toolkt)를 사용하여, 브라우저에서 사용자 인터페이스를 렌더링하고 있습니다. GWT 프로그램은 자바로 만들어, 자바스크립트로 컴파일됩니다. Vaadin이 실제 어플리케이션 로직을 서버에서 핸들링하는 동안, GWT는 향상된 사용자 인터페이스 컴포넌트(GWT 용어로 위젯)와 브라우저에서의 인터랙션 로직을 구현에 이상적입니다. Vaadin은 확장 가능하도록 설계되어있는제, 실제 써드파티 GWT 컴포넌트들과 쉽게 사용되며, Vaadin 에서 제공된 컴포넌트 레파토리에 추가할 수도 있습니다. GWT의 사용은 필요로 하는 모든 코드를 순수 자바로 쓸 수 있다는 걸 의미합니다.

좀더 자세한 Vaadin의 기능들은 다음을 참고 Vaadin features page 하시기 바랍니다.

이제 Vaadin 플러그인을 넷빈에 설치하고 간단한 어플리케이션을 만들어 보도록 하겠습니다.

작업환경은 다음과 같습니다.

넷빈(NetBeans 6.9)
JDK 6
Vaadin Plugin for NetBeans IDE 현재 최신 버전 (0.1.1): 아래 다운로드 참조
글래스 피시 v 3.0.1 (또는 톰캣 서버 6.x 이상)

우선 Vaadin 플러그인을 다운로드 받습니다.
다운로드 링크는 다음입니다.
http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=21965
넷빈즈 IDE를 위한 Vaadin 플러그인은 Kenai 에서 액세스가능한 오픈소스, 플러그인 프로젝트 입니다.
위 해당 사이트로 이동하여 Download 버튼 클릭후 저장


넷빈-도구-플러그인 선택
다운로드 받은 플러그인 설치시에는 탭의 다운로드를 클릭한 후,
아래 플러그인추가 버튼을 눌러 해당 다운로드 받은 nbm 파일을 열어 줍니다 - 열기
Vaadin 플러그인에 대한 내용이 올라옵니다. 왼쪽 아래 설치를 눌러 진행합니다
설치 프로그램의 지시사항에 따라 진행- 다음
약관에 동의(체크)- 설치
서명에 대한 경고가 뜨는데 무시하고 계속
마침
이제 Vaadin 자바 웹 어플리케이션 프로젝트를 만들도록 하겠습니다
프로젝트창에서 마우스 오른쪽 클릭 - 새 프로젝트
카테고리에서 Java 웹 - Web Application - 선택 후 다음
프로젝트 이름은 적당히...HelloVaadin 으로 줬습니다
경로도 적당히..
다음
서버설정인데 사실 지금 프로젝트는 글래스피시, 톰캣 상관없고 버전 역시 EE6, EE5 상관없습니다.
해서 그냥 기본으로 잡히는 글래스피스 v3.0.1 에, EE6 Web 그대로 잡아줬습니다 - 다음
프레임워크 설정 페이지에서 Vaadin 6.1.3 을 선택합니다
선택체크후 아래 구성 내용이 제시됩니다. (기본내용확인)
Vaadin Servlet Name: VaadinApplication
Vaadin URL 패턴: /Vaadin/*
Vaadin Applicatoin Class: MyApplication
Main Package : com.example.vaadin
마침
이제 심플한 Vaadin Web Application 이 만들어집니다. 프로젝트 창에서 프로젝트의 구조를 보면 일반 웹 어플리케이션 프로젝트와 Vaadin Web Application 과 차이점을 발견할 수 있습니다.
* Vaadin 프로젝트에는 기본 JSP 파일이 없습니다.
* 그대신, Vaadin 프로젝트는 기본 자바 파일이 있습니다.
* Vaadin 프로젝트는 당연 Vaadin 라이브러리가 잡혀 있습니다.
* 어떤 자바스크립트나 기타 XML 파일들이 추가되어 있지 않습니다.
그럼 src 에 있는 MyApplication.java 파일을 열어 내용을 확인합니다.
맨 위 import 를 보면 Vaadin에 대한 application 과 ui 패키지가 임포트 되어 있는 걸 볼 수 있습니다. 이 내용이 전형적인 JSP 등의 페이지 사용을 대신하게 됩니다.
이 내용을 확인하기 위해 프로젝트를 바로 실행시킵니다. 프로젝트 창에서 마우스 오른쪽 클릭 - 실행.
글래스피시 서버가 구동되고 프로젝트가 컴파일, 배포 과정을 거친후 브라우저에 내용이 표시됩니다.
브라우저에 표시된 내용은 다음과 같습니다. (주소표시줄의 의미나 텍스트, 아이콘 등에 대해 좀더 자세히 살펴 보시기 바랍니다 ^^)
우선 여기에 스타일시트를 작업하기 위해 간단히 버튼을 하나 추가 하겠습니다.
MyApplication.java 에 init()메소드에서 다음 내용(굵은 글씨)를 추가합니다.
======================================================
...
public class MyApplication extends Application {
@Override
public void init() {
Window mainWindow = new Window("MyApplication");
Label label = new Label("Hello Vaadin user");
mainWindow.addComponent(label);
Button button = new Button("My Button");
mainWindow .addComponent(button );

setMainWindow(mainWindow);
}
======================================================
저장후 프로젝트를 다시 빌드하고 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 지우고 빌드
프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행
브라우저에 텍스트 아래 버튼이 나타납니다.
바로 아래에서 스타일시트를 변경해보면 알지만 버튼에 대한 기본적인 스타일시트가 이미 설정되어 있고, 이 스타일시트가 바로 reindeer 입니다.
그럼 이제 스타일시트를 바꿔보도록 하겠습니다.
MyApplication.java 의 init() 메소드에서 Ctrl+Space 키를 누른후 철자(sett...)를 치면 그림처럼 API 가 올라옵니다.
선택할 메소드는 setTheme(String theme)입니다.
Vaadin에서는 themes 를 이용하여 로직과 UI 외형을 분리하는데, Themes 는 CSS 스타일시트, 커스텀 HTML 레이아웃 뿐만 아니라 필요로 하는 각종 그래픽 등을 포함할 수 있습니다.
Vaadin 프레임워크 6.1.3 에는 기본적으로 2개의 빌트인 테마가 들어있는데, 하나는 reindeer 와 runo 가 그것이고, 넷빈즈 IDE Vaadin 플러그인이 vaadin jar 파일로부터 이러한 테마를 동적으로 로드합니다.
어찌됐던 코드부분은 다음과 같습니다.
====================================
setTheme("runo");
====================================
팁: 나중에 reindeer 로 바꿔보면 원래 적용됐던 기본 테마와 같은 모양인 걸 알 수 있습니다.
프로젝트에서 마우스 오른쪽 클릭 - 지우고 빌드(clean and build)
프로젝트에서 마우스 오른쪽 클릭 - 실행
그럼 아까와 다른 모양의 버튼 및 배경 등이 나타나는 걸 확인할 수 있습니다. (runo 적용)
이제 커스텀, 사용자 정의 Vaadin Theme를 만들어 보도록 하겠습니다.
사용자 정의 테마는 반드시 웹폴더(Web Pages)아래 VAADIN/themes 구조아래 폴더를 만들어야 합니다.
따라서 이 규칙으로 만약 angel 이라는 사용자 정의 테마를 만든다면 web/VAADIN/themes/angel 로 경로가 만들어져야 합니다.
그리고 모든 테마는 반드시 styles.css(철자 주의) 라는 이름의 스타일시트 파일을 포함해야 합니다.
이 두 가지(path와 stylesheer)를 제외하고 기타 다른 내용은 적절히 알아서 작업하면 됩니다.
참고로 보통 이미지에 관한 사항은 imgs, 레이아웃 관련해서는 layouts , 그리고 추가 스타일시트는 css로 보통 서브폴더 작업을 하는게 네이밍 컨벤션이라고 할 수 있겠습니다.
우선 하나씩 폴더를 만듭니다. 일단 프로젝트의 Web Pages에서 마우스 오른쪽 클릭, 새로만들기 - other
카테고리에서 기타, file types 에 보면 맨아래 폴더가 있습니다. 다음
폴더 이름은 VAADIN 으로, 그리고 경로는 web 으로 지정합니다. 마침
그리고 다시 VAADIN 폴더 아래 themes 폴더를 또 만들어야 하므로 같은 절차로 진행합니다.
프로젝트 창의 좀전에 만든 VAADIN 폴더에서 마우스 오른쪽 클릭, 새로만들기-폴더
폴더 이름은 themes , 경로는 web/VAADIN 으로 맞춥니다. 마침
이제 마지막으로 본인 테마 폴더를 만듭니다. 역시 좀전에 만든 themes 에서 마우스 오른쪽 클릭, 새로만들기 - 폴더
폴더 이름을 mytheme 라고 줬습니다. 경로는 web/VAADIN/themes 로 설정되어 있습니다.
마침
그럼 이제 이 mytheme에서 이번엔 스타일시트 파일을 만듭니다.
마우스 오른쪽을 클릭하여 새로 만들기 - 종속형 파일(CSS)
파일이름은 반드시 styles 라고 줍니다.
해당 파일의 경로를 확인하면 다음과 같습니다.
web/VAADIN/themes/mytheme
마침
그럼 안에 내용을 작성합니다.
==============================================================
@import "../runo/styles.css";
/* Import the runo theme for components not described in your CSS files*/
.v-button {
display: inline-block;
zoom: 1;
text-align: center;
text-decoration: none;
border: 2px outset #fff;
background: #f00;
cursor: pointer;
white-space: nowrap;
margin: 0;
padding: .2em 1em;
color: inherit;
font: inherit;
line-height: normal;
-khtml-user-select: none;
-moz-user-select: none;
-ie-user-select: none;
user-select: none;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
/* this is the Vaadin CSS class for a button client */
==============================================================
그럼 작성된 테마를 설정하기 위해 MyApplication.java 파일을 열어 runo 대신 mytheme 라고 바꿔줍니다. (그림 참고)
그리고 다시 프로젝트를 빌드 합니다. 프로젝트에서 마우스 오른쪽 지우고 빌드
해당 프로젝트를 실행합니다
스타일시트에 제공된 대로 버튼의 배경(background)가 빨강색으로 바꿔져 있는걸 확인할 수 있습니다.
그럼 이제 여기서 좀더 Vaadin UI 컴포넌트와 리스터를 결부시켜 복잡한 어플리케이션을 만들어 보도록 하겠습니다.
우선 새창에 관한 클래스 설계를 위해 자바클래스를 추가합니다.
프로젝트의 src 아래 com.example.vaadin 패키지에서 오른쪽 마우스 클릭 (이렇게 하면 해당 위치가 경로로 자동으로 들어가기 때문에 이렇게 하는 거고, 그냥 하면 나중에 드래그 메뉴등으로 경로를 선택해주면 됩니다), 새로 만들기-자바 클래스
클래스 이름은 MyFirstWindow,
패키지 이름은 com.example.vaadin 으로 선택합니다. - 마침
아래 내용을 작성합니다. 굵은 글씨
==============================================================
package com.example.vaadin;
public class MyFirstWindow extends Window{
public MyFirstWindow(String windowName){
this.setCaption(windowName);
this.setPositionX(100);
this.setPositionY(100);
this.setWidth(500, Window.UNITS_PIXELS);
this.setHeight(500, Window.UNITS_PIXELS);
this.addComponent(new Button("Button 1"));
this.addComponent(new Button("Button 2"));
}

}
==============================================================
그리고 임포트 오류문제는 fix import(가져오기 고정, 단축키 Ctrl+Shift+I)로 해결합니다.
버튼과 라벨에 대해 임포트 클래스를 묻는데 모두 vaadin 것으로 선택합니다. OK
코드 확인
다시 MyApplication.java 파일로 돌아가서(Ctrl+tab키를 이용하면 편합니다). 아래 내용으로 바꿉니다.
=======================================================================

...
public class MyApplication extends com.vaadin.Application implements Button.ClickListener{
private Button b;
public void init() {
setTheme("mytheme");
Window main = new Window("Hello NetBeans ");
setMainWindow(main);
main.addComponent(new Label("Hello World!"));
b=new Button("My Button");
main.addComponent(b);
b.addListener(this);
}

//When the client clicks button b, the browser shows a window in the client zone
public void buttonClick(ClickEvent event) {
if(event.getButton()==this.b){
this.getMainWindow().addWindow(new MyFirstWindow("This is my first window!"));
}
}
}
========================================================================

ClickEvent 의 임포트 문제를 해결하려면 앞의 전구모양의 아이콘을 마우스로 클릭하면 해결에 대한 팝업창이 나타납니다. 첫번째에 있는 com.vaadin.ui.Button.ClickEvent 에 대해 가져오기 추가를 클릭하면 임포트가 자동 작성됩니다.
저장하고, 프로젝트를 다시 빌드(지우고 다시 빌드) 한 후, 실행합니다
왼쪽 상단의 버튼을 클릭하면 가운데 새로운 창이 나타납니다. (버튼 클릭시 마다 창이 계속 겹쳐지고, 이 창들은 마우스로 옮기거나 크기를 변경할 수도 있습니다. 각자 해보십시오 ^^;)
************************************************************
그럼 마지막으로 디버깅 작업을 해보도록 하겠습니다. 뭐 방법은 다른 디버깅과 별 차이가 없습니다.
MyApplication 클래스에서 Window main = new Window("Hello Netbeans");
에서 Ctrl+F8를 누르거나 왼쪽 라인표시 있는 곳에 마우스를 클릭하면 디버깅 브레이크포인트(중단점)이 핑크색 줄로 표시됩니다.
역시 마찬가지 방법으로 아래 if(event.getButton() == this.b) { 이곳에도 중단점을 표시합니다.
그런 다음 프로젝트 디버깅을 하는데 만약 이 프로젝트가 메인 프로젝트면 Ctrl+F5 키, 위의 메뉴에 디버그 아이콘 등을 사용하시거나, 메인 프로젝트가 아니라면 프로젝트에서 마우스 오른쪽 클릭해서 디버그 메뉴를 서낵합니다.
디버그 창이 열리고 디버그 콘솔등이 출력됩니다. 중단점에서 정지되며 녹색으로 표시됩니다.
아래 Debugger Console 을 보면 해당 내용이 제시되고, 계속 진행하려면 F5키나 continue 아이콘을 누르면 다음으로 진행됩니다.
그런 다음 브라우저에서 버튼을 누르면 다시 2차 중단점으로 이동하고 buttonClick 메소드의 중단점이 녹색으로 나타납니다.
기타 step over, into, out 등은 아이콘을 적절히 사용하시면 됩니다.
디버그 세션 종료 단축키는 Shift+F5 입니다.

이상 간단하게 Vaadin 프레임워크 설치 및 기본 사용법을 알아봤습니다.
추후 시간되는 대로 여러 편리한 컴포넌트 사용이나 JSON 메시지 사용 등에 대해서도 올려드리겠습니다. ^^;
수고하셨습니다.

Netbeans-Korean by 강여사 - July 01, 2010 11:03 AM
넷빈(NetBeans)6.9에서 스프링3.0 사용하기-01-소개

이번 게시물에서는 스프링 프레임워크를 사용해 간단한 웹 MVC 어플리케이션을 만들어보도록 하겠씁니다.

어플리케이션은 이름을 받아서 ok를 하면 2번째 페이지에 인사메시지와 함께 내용이 표시되는 샘플예제입니다.

예전에도 이 내용의 게시물은 올려놨었습니다.

다만 이번에 또 소개하는 이유는 넷빈 6.9에서 기본적으로 탑재되는 스프링 3.0 때문이죠. ^^;

현재 IDE에는 스프링 프레임워크 3.0과 2.5가 둘다 기본으로 빌트인 되어 있습니다.

프로젝트에서 프레임워크를 선택하면 자동으로 여러 필요 설정들이 기본적으로 구축되구요.(이런 마법사 기능이 없다면 노가다 --; 로 하면 됩니다. 안될건 없죠.)

구성설정은 스프링 웹 MVC DispatcherServlet 의 이름 및 매핑 등을 제공합니다. JSTL 라이브러리가 옵션으로 등록될 수 있고, 스프링 XML 빈 설정 파일들이, 다음 기능들도 포함해서 함께 제공됩니다.

* 코드 완성. 스프링 XML 설정 파일에서 빈 참조뿐만 아니라 자바 클래스를 위한 호출
* 내비게이션. 기타 스프링 빈 참조에 하이퍼링크뿐만 아니라, 스프링 빈 정의에서 언급된 자바 클래스나 속성에도 하이퍼링크 제공
* 리팩토링. 스프링 XML 설정 파일에서 자바 클래스 참조 이름 바꾸기 제공.

뭐 자세한 내용은 항상 스프링 홈페이지 (http://www.springsource.org/) 및 Spring Framework Reference DocumentationSpring Framework API documentation 를 참고하시기 바랍니다.

그럼 다시 주제로 돌아가서 넷빈 6.9에서 간단한 스프링 웹 MVC 지원에 대해 알아보겠습니다.

환경은 다음과 같습니다.

넷빈즈 6.9
JDK 6 (현재 저는 JDK6update20 입니다)
글래스피시 v 3.0.1 (넷빈 6.9에 기본)

우선 새 프로젝트를 만듭니다. 프로젝트 창에서 마우스 오른쪽 클릭 - 새 프로젝트
카테고리에서 Java Web, 프로젝트는 Web Application - 다음
프로젝트 이름은 적당히.. 저는 HelloSpring 으로 줬습니다.
경로 역시 적당히..
다음
서버는 기본 설정대로 진행합니다.
글래스피시 3.0.1
버전 EE6 Web
다음
프레임워크 선택에서 Spring Web MVC 를 선택합니다.
그럼 아래 스프링 프레임워크 라이브러리 버전 선택이 있습니다.
현재 빌트인으로 들어있는 버전은 그림과 같이 2종류 입니다. (3.0과 2.5)
그림처럼 Spring Framework 3.0.2 Release 를 선택하도록 하겠습니다.
아래 보면 JSTL(JavaServer Pages Standard Tag Library) 라이브러리가 기본적으로 포함되도록 되어 있습니다. 사실 이 예제에서는 JSTL 을 쓸 일이 없기 때문에 해제 하셔도 됩니다.
또한 예전게시물처럼 Spring 2.5를 선택해서 진행해도 이 샘플 예제는 문제 없이 돌아갑니다.
그렇게되면 당연지사 Spring 3.0.x 의 새 기능들은 못 쓰겠죠 ^^; (이번 게시물을 작업한 이유는 스프링의 3.X 새 기능들을 프로젝트에서 어떻게 작업하느냐의 환경 구축이 의의라 그점을 중점으로 보시면 됩니다. 아무튼~)
마침.
옆에 탭을 눌러 스프링 Web MVC 구성에 대해 확인합니다.
기본적으로 스프링 디스패처 서블릿의 이름과 매핑은 그림과 같이 작업되어 있습니다. 이 내용은 프로젝트의 여러 xml의 설정 등에 자동으로 작업되어 들어갑니다.
마침
완료후, IDE 가 마법사(프로젝트의 ant 빌드 스크립트)에 의해 여러가지 내용을 작업하게 됩니다.
우선적으로 프로젝트의 Library 를 살펴보면 선택한 스프링 프레임워크 버전 라이브러리가 자동으로 클래스패스에 포함되어 있습니다.
그럼 이렇게 작업된 기본 샘플 스프링 프로젝트가 어떤 내용인지 우선 실행시켜 보겠습니다.
프로젝트에서 오른쪽 마우스 클릭 - 실행
서버가 자동으로 시작 실행되고, 프로젝트 컴파일 후 서버에 배포된 다음, 브라우저가 자동으로 호출되어 프로젝트의 홈페이지가 나타나게 됩니다.
아래 그림으로 보이는 내용은 스프링의 웰컴 페이지로 경로는 (/WEB-INF/jsp/index.jsp) 입니다.
여기서 약간 이상한건 해당 내용이 적혀 있는 페이지는 위의 경로에 있지만 정작, 주소 표시줄에는 *.htm 으로 되어 있습니다.
이 내용은 스프링의 디스패처 서블릿에 대한 모든 요청에 대한 URL 매핑 패턴에 의한 것으로 해당 내용 확인은 프로젝트의 web.xml 에 서블릿 부분을 살펴 보시면 됩니다.
--------------------------------------------------------------
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
--------------------------------------------------------------

그리고 index.htm 에 대한 요청은 redirect.jsp 페이지에 다음으로 리다이렉트 되구요.
--------------------------------------------------------------
<% response.sendRedirect("index.htm"); %>
--------------------------------------------------------------
여기서 숙제(또는 질문) 이 스프링 디스패처서블릿의 패키지 포함 풀 네임 및 소속 패키지는 어디일까요? ㅎㅎㅎ (힌트 : 그림 참조)

이 디스패처서블릿은 dispatcher-servlet.xml 에 구성 설정을 기반으로 요청을 처리합니다.
아래 그림 처럼 어느 위치에서 어떤 식으로 부르면 어떻게 매핑하겠다의 내용을 구성할 수 있고, 아래 그림이나 코드에 보이는 내용은 기본으로 설정되어 있는 사항입니다.
---------------------------------------------------------------
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index.htm">indexController</prop>
</props>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
<bean name="indexController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" p:viewName="index" />
---------------------------------------------------------------
이 파일에는 3개의 빈이 정의되어 있습니다 : indexController, viewResolver, urlMapping.
디스패처서블릿이 index.htm 와 같은 *.htm 과 일치하는 요청을 받게 되면, 요청을 처리하는 urlMapping안의 controller 를 따라가게 되어 있습니다.
기본 설정은 SimpleUrlHandlerMapping 이어서 /index.htm 으로 요청이 오게되면 indexController 로 매핑 되죠. 그리고 아래 indexController는 ParameterizableViewController를 상속하구요.
그리고 viewResolver 에 의해 앞에 /WEB-INF/jsp/ 를 접두사로, 뒤에 .jsp를 접미사로 갖는, 논리적 뷰 이름 p:viewName="index" 으로 지정된 파일이 뷰로 리턴되게 됩니다. 해서 /WEB-INF/jsp/index.jsp 가 웰컴페이지 뷰와 응답하게 되는 거죠.

*****************************************************************************
그럼 이번엔 여기에 2개의 JSP 페이지를 만들어 하나는 HTML 폼에서 이름을 입력하는 텍스트 필드를, 다른 페이지에서는 앞서 입력값을 헬로우 메시지와 함께 전달 표시하는 뷰를 만들어 보도록 하겠습니다.

뷰는 controller에 의해 관리되고, 이 컨트롤러는 어플리케이션에서 요청을 받아 다시 리턴해주는 일을 처리합니다. 또한 뷰에 표시될 정보(소위 모델이라고 하는)를 전달합니다. 이 어플리케이션의 컨트롤러는 HelloController 입니다.

그리고 비즈니스 로직 핸들링에 있어서, 복잡한 웹 어플리케이션에서는 비즈니스 로직을 컨트롤러에 직접 포함한다기 보다, 필요시 컨트롤러에 의해 사용되는 또다른 엔티티, 소위 서비스(service)를 사용합니다. 해서 이런 취지로 이번 어플리케이션에서는, HelloService 를 만들어 비즈니스 로직은 헬로우 메시지를 전달하는 내용으로 작성해 보도록 하겠습니다.

뭐 뭐가 됐건간에 일단 자바 클래스니 프로젝트에서 자바 클래스를 새로 만듭니다.
프로젝트에서 오른쪽 마우스 클릭-새 파일-자바 클래스
클래스 이름은 HelloService
패키지 이름은 service
마침

HelloService 는 매우 간단한 서비스로, 이름 스트링을 인자로 받아, 적절한 메시지 문자열과 함께 다시 스트링으로 리턴하는 sayHello() 메소드가 다입니다.
굵은 글씨를 복사해서 붙여 넣습니다.
================================================
public class HelloService {
public String sayHello(String name) {
return "Hello " + name + "!";
}

}
================================================
이제 페이지에서, 사용자 데이터를 핸들링하고 리턴될 뷰를 결정하기 위해 컨트롤러와 모델을 구현해보도록 하겠습니다.
이번에 사용할 컨트롤러는 SimpleFormController 입니다.
프로젝트에서 오른쪽 마우스 클릭 새파일 - other

카테고리 Spring Framework
파일 유형은 Simple Form Controller 선택
다음

클래스 이름은 HelloController 로,
패키지는 controller 로 입력합니다.
마침.
클래스 템플릿에 의해 기본적으로 내용이 작업됩니다.
여기서 setXXX 부분의 4줄을 모두 주석 해제를 하고 클래스명이나 이름등에 대해 다음 내용을 바꿔 넣습니다.
=================================================
public HelloController() {
setCommandClass(Name.class);
setCommandName("name");
setSuccessView("helloView");
setFormView("nameView");

}
=================================================
FormView 를 설정하는 건 폼을 표시하는데 있어 사용될 이름을 설정하는 내용입니다. 이 내용에는 이름을 입력할 텍스트 필드가 포함될 페이지구요.
마찬가지로 SuccessView를 설정하는 건 성공적으로 서브밋(제출)되었을 떄 나타나는 뷰 이름을 설정하는 내용입니다.
CommandName 은 모델에서 명령의 이름을 지정하는 것으로, 요청 파라미터를 가진 폼 객체와 바인딩되는 command 이름을 설정하는 내용이고,
마지막으로 CommandClass 는 command 클래스 이름을 설정하는 내용입니다.
클래스들이 없으니 오류뜨는 건 당연하고..앞으로 만들어야죠 --;
프로젝트에서 마우스 오른쪽 클릭 , 새파일 - 자바 클래스
클래스 이름에 Name
패키지는 controller (드랍다운메뉴에 있습니다. 선택)
마침
그런 다음 아래 굵은 글씨 내용을 작성합니다
==============================================
public class Name {
private String value;
}
=============================================
팁: pr 하고 tab 키를 누르면 private 이 자동 작성됩니다. 이러한 내용은 편집기의 코드 템플릿 기능인데, 이러한 내용을 편집하거나, 보려면 도구-옵션-편집기-코드 템플릿으로 이동하시면 됩니다.
편집은 아니고 그냥 전체 리스트만 보고자 하면 도움말-키보드 shortcut 카드 를 이용하실수도 있습니다.
그리고 이 value 변수를 이용해서 getter 와 setter 메소드도 작업하기 위해 value 에 마우스를 놓고 마우스 오른쪽을 클릭하여 Insert Code 메뉴를 (혹은 단축키로는 Alt+Insert) 하면 아래 그림처럼 팝업창이 뜹니다.
거기서 Getter 와 Setter 선택
팝업창이 뜨면 value 앞을 체크하여 ok
그러면 아래 그림 처럼 setValue() 와 getValue() 메소드가 작성됩니다.
=======================================================
public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}
=======================================================
그런 다음 Ctrl+Tab 키를 눌러 HelloController 로 전환합니다.
이전에 Name 클래스때문에 떳던 오류는 이제 없어져 있을 겁니다.
아래 doSubmitAction() 메소드를 지우고(주석처리거나),
다음 onSumbit() 메소드를 작성합니다. (주석을 해제하고 쓰거나 바로 작성하시면 됩니다)
=======================================================
@Override
protected ModelAndView onSubmit(Object command) throws Exception {
Name name = (Name)command;
ModelAndView mv = new ModelAndView(getSuccessView());
mv.addObject("helloMessage", helloService.sayHello(name.getValue()));
return mv;
}

=======================================================
이 onSubmit() 메소드는 여러분의 ModelAndView 를 만드는데 사용됩니다.
command 가 Name 객체로 다시 캐스트해놓고
ModelAndView 인스턴스를 만들어, SimpleFormController 에서 getter를 사용하여 얻어지는 성공시 뷰를 가져와 저장합니다.
addObject() 메소드로 헬로우 메시지라는 글과 헬로우서비스의 sayHello 메소드를 더해서 모델뷰 객체에 저장합니다.
임포트 오류는 적당한 편집기 여백에서 마우스 오른쪽을 클릭하여 Fix import(가져오기 고정)메뉴를 클릭합니다.
여기서 ModelAndView에 스프링 클래스, org.springframework.web.servlet.ModelAndView 를 선택합니다
그리고 HelloController 안에, HelloService 변수를 선언합니다.
===========================================
private HelloService helloService;
===========================================
역시 아까와 같은 방법으로 helloService에서 마우스 오른쪽을 클릭하여 insert code 메뉴를 선택하고
이번엔 setter 를 선택하여 setXXX 메소드를 만듭니다.
팝업창에서 그림과 같이 체크(확인)
----------------------------------------------
public void setHelloService(HelloService helloService) {
this.helloService = helloService;
}
---------------------------------------------
임포트 문제 에러는 마우스 오른쪽 클릭으로 fix import(가져오기 고정) 수정.
위에 자동으로 import service.HelloService; 추가됨
그리고 헬로우서비스를 xml 에 등록합니다.
applicationContext.xml 파일에서 HelloService 를 등록.
방법은 다음 내용을 복사해서 붙여넣습니다.
==================================================
<bean name="helloService" class="service.HelloService" />
==================================================
팁: IDE는 xml 구성파일에서 스프링의 코드 완성 기능을 제공합니다. 따라서 작성중에 Ctrl+Space 를 적절히 이용하면 해당 여러 패키지, 클래스 및 속성들을 보다 손쉽게 작업할 수 있습니다.)
이제 dispatcher-servlet.xml 에서 HelloController 를 등록합니다.
dispatcher-servlet.xml 파일을 편집기에서 열러 다음 빈 선언을 작성해 붙여넣습니다.
==================================================================
<bean class="controller.HelloController" p:helloService-ref="helloService"/>
==================================================================
***************************************
이제 2개의 뷰 페이지를 만들어 보도록 하겠습니다.
하나는 nameView.jsp 로 웰컴과 함께 이름을 입력받도록 하는 페이지이고,
다른 하나는 helloView.jsp 로, 인사 메시지와 함께 입력받은 파라미터 값이 메소드를 호출해 표시되는 페이지 입니다.
우선 프로젝트에서 특히 WEB-INF/jsp 노드에서 오른쪽 마우스를 클릭하여 새 파일-JSP 를 선택합니다.
(만약 그냥 프로젝트에서 새패일-JSP로 하면 경로를 WEB-INF/jsp 로 찾아가면 됩니다)
파일 이름은 helloView
폴더는 WEB-INF/jsp - 마침
자동으로 편집된 내용에서 다음 굵은 글씨를 참고로 타이틀과 본문의 제목으로 헬로우컨트롤러에서 만들어진 ModelandView 객체의 헬로우 메시지를 바인딩하도록 코드를 수정합니다.
=============================================================
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello</title></head>
<body>
<h1>${helloMessage}</h1>
</body>
=============================================================
다른 페이지는 nameView 를 만듭니다. 방법은 아까와 마찬가지로 해당 위치에서 새파일-jsp
2번째 JSP 파일 이름은 nameView
경로는 WEB-INF/jsp 아래
마침
nameView.jsp 에서는 스프링 태그 라이브러리 선언을 위에 추가합니다
============================================================
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
============================================================
h1 제목태그 아래 다음 내용을 복사해 넣습니다.
=============================================================
<spring:nestedPath path="name">
<form action="" method="post">
Name:
<spring:bind path="value">
<input type="text" name="${status.expression}" value="${status.value}">
</spring:bind>
<input type="submit" value="OK">
</form>
</spring:nestedPath>
=============================================================
이제 프로젝트를 실행합니다. 프로젝트에서 마우스 오른쪽 클릭 - 실행
이름에 jin 이라고 입력하고 OK 버튼을 눌렀습니다.
헬로우라는 메시지와 함께 파라미터로 넘겨받은 이름이 성공적으로 출력됩니다.
자, 그럼 여기서 숙제~ 한글을 이름으로 입력하면 어떻게 될까요?
물론 깨집니다. 그럼 이 한글문제를 또 어떻게 해결하면 될까요?
예전에 게시물로 올려드린적 있습니다만 정답 보기전에 최대한 본인이 한번 천천히 고민해보시기를~

수고하셨습니다. ^^

Netbeans-Korean by 강여사 - July 01, 2010 11:03 AM
넷빈(NetBeans)6.9에서 Google Web Toolkit 사용하기 02 - 소스 구조 살펴보기

앞서 게시물에 이어 기본으로 만들어진 GWT 어플리케이션의 소스 구조에 대해 살펴보도록 하겠습니다.

일단..

Main.gwt.xml : 프로젝트 모듈 파일로, 프로젝트 루트 패키지에 있습니다. GWT 프로젝트의 필수 어플리케이션 구성이 들어있죠.
기본 내용은 다음과 같습니다.
=================================================
<?xml version="1.0" encoding="UTF-8"?>
<module>
<inherits name="com.google.gwt.user.User"/>
<entry-point class="org.yournamehere.client.MainEntryPoint"/>
<!-- Do not define servlets here, use web.xml -->
</module>
=================================================
inherits: 이 모듈이 상속받은 모듈, 여기서는 GWT 프레임워크에 내장된 User 모듈을 제공받고 있습니다. 이러한 모듈 상속은 프로젝트가 복잡해질수록 더욱 재사용성이 좋죠.
entry-point: 모듈이 로드될 떄 GWT프레임워크에 의해 초기화되는 클래스 참조 (보다 자세한 내용은 http://code.google.com/webtoolkit/doc/1.6/DevGuideOrganizingProjects.html#DevGuideModuleXml 참고 )

이번엔 MainEntryPoint.java : 어플리케이션의 메인 엔트리 포인트로 , Main.gwt.xml 에 지정됩니다. EntryPoing 클래스를 상속받아, GWT 모듈이 프레임워크에 의해 로드될 때, 이 클래스가 초기화되고, onModuleLoad() 메소드가 자동으로 호출됩니다.
기본 내용은 다음과 같습니다.
=================================================
package org.yournamehere.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;

public class MainEntryPoint implements EntryPoint {

/** Creates a new instance of MainEntryPoint */
public MainEntryPoint() {
}

/**
The entry point method, called automatically by loading a module
that declares an implementing class as an entry-point
*/
public void onModuleLoad() {
final Label label = new Label("Hello, GWT!!!");
final Button button = new Button("Click me!");

button.addClickListener(new ClickListener(){
public void onClick(Widget w) {
label.setVisible(!label.isVisible());
}
});

RootPanel.get().add(button);
RootPanel.get().add(label);
}

}
=================================================
넷빈이 제공하는 기본 샘플에는 onModuleLoad() 메소드에 다음 2개의 컴포넌트가 추가되어 있습니다.
Label: GWT 라벨이 만들어지고, 'Hello, GWT!!' 라고 표시됩니다. 이 라벨은 RootPanel 에서 추가됩니다. RootPanel.get().add(label).
Button: GWT 버튼이 만들어지고, 역시 'Click me!' 라고 문자가 표시됩니다. 이 버튼에는 버튼 리스너가 동작하는데 ClickListner 에 의해 구현되어 있습니다. 아래 소스처럼 버튼 클릭시 라벨이 숨겨지는 동작을 처리하도록 되어 있습니다. 버튼 역시 RootPanel 에서 추가되었습니다.
================================================
public void onClick(Widget w) {
label.setVisible(!label.isVisible());
}
================================================

이번에는 welcomeGWT.html 입니다 : 자동생성된 HTML 호스트 페이지는 어플리케이션의 welcome 페이지로 설계되어 있습니다. 당연 web.xml 에 해당 파일이 welcome-file 엘리먼트에 지정되어 있겠구요.
이 호스트 페이지는 자바스크립트 소스 코드를 참조하고 어플리케이션의 스타일 시트를 참조할 수 있습니다.
기본 내용은 다음과 같습니다.
================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta name='gwt:module' content='org.yournamehere.Main=org.yournamehere.Main'>
<title>Main</title>
</head>
<body>
<script language="javascript" src="org.yournamehere.Main/org.yournamehere.Main.nocache.js"></script>
</body>
</html>
================================================
meta : 어플리케이션 프로젝트 경로를, 이 태그가 HTML 페이지와 어플리케이션 간의 링크를 제공합니다.
script: GWT 프레임워크의 자바스크립트 파일로부터 코드 임포트(불러오기). 이 파일은 GWT 프레임워크를 부트스트립하는데 필수 코드를 포함하고 있습니다. 프로젝트 모듈안의 구성을 사용하여 동적으로 어플리케이션을 나타내는 엔트리 포인트를 컴파일하여 만든 자바 스크립트를 로드하게 됩니다.
따라서 어플리케이션이 호스트된 모드로 실행되거나 어플리케이션을 컴파일 할때, GWT 프레임워크에 의해서 자바스크립트 파일이 자동생성됩니다.

이상이 간단하게나마 살펴본 GWT 조사내용입니다.

이제 다음 예제에서는 여기서 AJAX random 글을 표시하는 어플리케이션을 붙여보도록 하겠습니다.

to be continued...

Netbeans-Korean by 강여사 - July 01, 2010 11:03 AM
넷빈(NetBeans)6.9에서 Google Web Toolkit 사용하기 04 - css로 외형 커스터마이즈하기

이번 게시물에서는 HTML 호스트 페이지에 스타일시트를 첨부해보도록 하겠습니다.

당연 엔트리 포인트 클래스에 이 css 가 참조되어야 하며,
스타일시트에 스타일 이름에,
엔트리 포인트 클래스에 라벨의 스타일 이름이 설정되어야 합니다.

실행시, GWT는 라벨에 스타일을 연결하여 커스터마이즈된 라벨을 표시합니다.

일단, CSS 파일을 만들어야 합니다.

프로젝트에서 마우스 오른쪽 클릭
새파일 - other

카테고리의 기타에서 CSS(종속형시트? --;)파일 선택 - 다음
CSS 파일 이름을 줍니다. welcomeGWT 라고 줬습니다.
폴더에 옆의 brose 버튼을 클릭하여 web 을 설정합니다.(아니면 직접 적어도 됩니다)
마침

내용을 복사해서 붙여넣습니다.
====================================================
.quoteLabel {
color: white;
display: block;
width: 450px;
padding: 2px 4px;
text-decoration: none;
text-align: center;
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
border: 1px solid;
border-color: black;
background-color: #704968;
text-decoration: none;
}
====================================================
이제 이 스타일시트를 미리보기 및 빌더를 하려면 다음과 같이 하시면 됩니다.
위의 메뉴에서 창- other 를 따라가면 CSS 미리보기와 CSS 스타일 Builder 가 있습니다.

이 2개를 각각 열어주시면 편집기창에 CSS 아래쪽에 스타일 빌더와 오른쪽에 미리보기가 나타납니다.
현재 지정된 색으로 오른쪽에 미리보기가 보여집니다.
이제 welcomeGWT.html 로가서 스타일시트를 연결시키면됩니다. 그림을 참고하여 굵은 글씨 부분을 추가합니다.
======================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<meta name='gwt:module' content='org.yournamehere.Main=org.yournamehere.Main'>
<link rel="stylesheet" type="text/css" href="welcomeGWT.css">
<title>Main</title>
</head>

<body>
<script language="javascript" src="org.yournamehere.Main/org.yournamehere.Main.nocache.js"></script>

<p>This is an AJAX application that retrieves a random quote from
the Random Quote service every second. The data is retrieved
and the quote updated without refreshing the page!</p>

</body>
</html>
======================================================================
그리고 MainEntryPoint.java (엔트리 포인트 클래스)의 onModuleLoad() 메소드에 성공시에 라벨에 적용할 스타일을 다음과 같이 지정해줍니다.
=======================================================
public void onSuccess(Object result) {
//display the retrieved quote in the label:
quoteText.setText((String) result);
quoteText.setStyleName("quoteLabel");}
=======================================================
이제 다시 프로젝트를 실행합니다.
그럼 아래 그림처럼 이번에는 라벨에 커스텀 스타일(위에서 만든 스타일시트 사용)이 보여집니다.
다음 게시물에서는 GWT의 컴파일과 디버깅에 대해 자세히 살펴보도록 하겠습니다.
to be continued...

Netbeans-Korean by 강여사 - July 01, 2010 11:02 AM
netbean 6.8에서 JSTL -(glassfish v3, tomcat 6)

JSTL 1.2 와 데이터베이스를 연동하는 예제입니다.

DB는 JavaDB(Derby의 sample)을 사용
WAS 로는 glassfish v3 preview를
WS 로는 tomcat 6.0.20 을 사용합니다.

EE버전은 모두 5이고, JSTL 1.2 (1.1사용) 입니다.

우선 웹 프로젝트를 만듭니다.
new project

JavaWeb 에 Web application 선택 , 다음 클릭
프로젝트의 이름은 JSTL를 끝에다 붙였습니다(적당히), 다음 클릭
서버는 일단 glassfish v3 preview에서 먼저 작업하고 나중에 tomcat 으로 변경할 예정입니다.
따라서 기본설정된대로 glassfish v3 도메인 선택, 마침 클릭
기본작업이 된 index.jsp 파일에서 오른쪽 파레트의 databases를 확장한 후 DB Report를 Hello World 아래 끌어다 놓습니다.

그럼 데이터에 대한 설정이 나오는데 여기 Data Source 에는 jdbc/sample 을 쿼리문에는 select * from customer 를 입력합니다. (derby의 sample 데이터베이스의 customer 조회이며, glassfish에 jdbc/sample 이라는 이름으로 데이터소스 처리되어 있습니다.)
그런 다음 web.xml (본인 프로젝트)에서 resource 작업을 합니다. resource 뷰를 선택합니다.
resource ref 에서 add 버튼을 누르고 resource name을 jdbc/sample 로 기타는 기본 설정으로 OK 합니다. (만약 이 대목이 작업되지 않으면 jar 가 해당위치에 있어도 no suitable driver 에러가 납니다).
실행(run)
정상 수행결과입니다.

이번에는 서버를 톰캣으로 변경해보겠습니다. 톰캣에는 glassfish 와는 달리 여러가지가 작업이 안되어 있으므로 추가 설정해야 할 게 많습니다. 일단 해당 프로젝트에서 서버 변경부터 시작하겠습니다.
프로젝트에서 오른쪽 마우스 클릭 - properties 선택
RUN 에서 서버를 Apache Tomcat 6.0.20 으로 변경합니다.
확인 클릭
톰캣으로 변경하면 프로젝트에 자동으로 context.xml 작업이 되는데 META-INF 안에 있습니다.
해당 파일을 연 후, 마지막에 /> 이 부분을 > 으로 바꾸고, 그 안에 다음 내용을 작업해 넣습니다.
===================================================================
<Context antiJARLocking="true" path="/WebApplicationJSTL">
<Resource name="jdbc/sample" auth="Container" type="javax.sql.DataSource"
maxActive="100 maxIdle="30" maxWait="10000"
username="app" password="app" driverClassName="org.apache.derby.jdbc.ClientDriver"
url="jdbc:derby://localhost:1527/sample"/>
</Context>
===================================================================

그런 다음 derby의 드라이버를 tomcat_home/lib 안에 복사해 넣습니다. (derby.jar, derbyclient.jar, derbynet.jar 3개)
그리고 JSTL 관련파일을 프로젝트의 라이브러리에 추가합니다.
프로젝트의 library 에서 오른쪽 마우스 클릭 - 라이브러리 추가 를 선택합니다

라이브러리에서 JSTL 1.1 을 선택하여 아래 추가 버튼을 누릅니다.
그런 다음 deploy 를 합니다(이때 base에 context.xml 이 반영됩니다)
이제 run (실행) 합니다
톰캣에서도 정상적으로 수행됩니다

Netbeans-Korean by 강여사 - July 01, 2010 10:51 AM
넷빈(Netbeans)6.8에서 EE6 (esp. JavaServlet 3.0) 웹 어플리케이션 만들기

이번 게시물에서는 넷빈 6.8에서 EE6 그중에서도 특히 이번에 새로 추가된 자바 서블릿 3.0 에 대해 작성해보도록 하겠습니다.

이 Java Servlet 3.0은 그동안의 기본 웹 개념을 왕창 흔들만큼 중요한 내용들을 담고 있어서 반드시 스펙을 꼼꼼히 살펴보셔야 합니다.

일례로 그간 웹 프로젝트라면 반드시 있어야 하는 web.xml 역시 optional 입니다. 또한 web.xml 의 내용의 부분을 단편화한 fragment 들(web-fragment.xml)의 작성으로 보다 portable 한 작성이 가능하면, 뿐만 아니라 이 일을 가능케한 새로운 어노테이션 API 등 새롭고 흥미로운 게 많죠. ^^;; (좋은 쪽으로는..나쁜 쪽으로는 그만큼 공부할 게 왕창 늘어났다는..ㅠㅠ)

아무튼 그럼 이 EE6 시리즈로 웹 어플리케이션을 만들어 봅시다.

파일 - 새 프로젝트 Java Web - Web Application

다음 클릭 프로젝트의 이름은 기본 제공되는 거 뒤에 Servlet3 이라고 붙여줬습니다.

경로는 적당히

다음 클릭 서버는 EE 6 Web 이 적용되는 글래스피시 v3 도메인으로

버전 역시 EE6 Web 으로

마침 클릭 기본적으로 index.jsp 파일이 만들어집니다.

그러나~~ 자세히 보면 뭔가가 틀리다는..

Configuration Files 에 web.xml 이 없.습.니.다~~ (즉, optional 입니다. 만들어도 되고, 안 만들어도 되고.. )


진짜 이것만으로 동작하는 지 실행해봅시다.

프로젝트 오른쪽마우스 클릭 - run (실행) 서버가 시작되고

웹브라우저가 호출되면서 Hello World 가 잘 나옵니다. 확인
그럼 이제 서블릿을 만들어 보도록 하겠습니다.

여기서 만드는 서블릿은 Java Servlet 3.0으로 작업됩니다.

프로젝트에서 오른쪽 마우스 클릭 - new - other

Web 카테고리에서 Servlet 을 선택합니다.

다음 클릭

서블릿 이름은 기본대로 그냥..

패키지 명은 a 로 줬습니다.

다음 클릭
예전과는 달리 web.xml 에 설정내용 반영이 기본적으로는 체크되어 있지 않습니다(예전에는 기본이 체크상태 였음)

클래스 이름과 서블릿 이름, URL Pattern 은 기본 내용 그대로 줬습니다.

마침 클릭

그럼 기본 서블릿이 만들어집니다.

여기서 중요한 내용은 @WebServlet 입니다.

web.xml 이 생략되는 대신 어노테이션이 그 자리를 대신하죠.

좀전 서블릿의 설정은 @WebServlet 의 작성으로 서블릿쪽에서도 이제 POJO 기반으로 작업이 됨을 알 수 있습니다.
=======================================================

@WebServlet(name="NewServlet", urlPatterns={"/NewServlet"})

=======================================================
나머지야 서블릿 기본 내용이므로 아래 주석부분을 해제합니다. 그리고 해당 서블릿을 실행합니다.

서블릿의 URL 패턴 확인창이 뜹니다.

그대로 OK 웹 브라우저에서 서블릿의 내용이 정상적으로 나옵니다.

주소표시줄에 URL 패턴 역시 지정한 그대로구요. 웹 서블릿 클래스의 위치를 library 에서도 찾아보시기 바랍니다.

(import 에 명시된 패키지 내용을 참조하시면 보다 쉽게 찾을 수 있습니다) 수고하셨습니다. *^^*

Netbeans-Korean by 강여사 - July 01, 2010 10:51 AM
넷빈(netbeans)6.8에서 프로파일링(profiling) 사용법 - overview

이번 예제는 넷빈에서 프로파일링 하는 방법에 대해 알아보겠습니다.

우선 샘플 프로젝트 생성을 위해 다음과 같이 작업합니다.

프로젝트창에서 - (마우스 오른쪽 클릭)- 새 프로젝트 선택

카테고리에서 샘플- 프로젝트에서 Anagram Game 을 선택합니다

다음

프로젝트 이름과 위치에 대한 지정을 합니다.

저는 프로젝트 이름은 그대로 위치는 c:\ 로 줬습니다.

마침 프로젝트가 만들어지면 바로 실행 합니다.

프로젝트에서 마우스 오른쪽 클릭 - 실행

이 샘플 프로젝트는 언어 맞추기 게임입니다. 위에 엉클어진(스크램블) 단어를 추측하여

아래 텍스트필드에 넣습니다. 아래 그림처럼 틀리면 저런 메시지가..--;

맞으면 이런 메시지가 나옵니다 ^^

new word 버튼을 누르면 새 단어가 나오구요.


이제 이 프로젝트를 프로파일링 해보도록 하겠습니다.

상위 메뉴에서 profile - 그리고 첫번째 메뉴인 profile Main Project 를 선택합니다.

(아니면 그냥 프로젝트(왼쪽창의 Anagram)에서 마우스 오른쪽을 클릭하면 profile 메뉴가 있습니다. 그걸 눌러서 진행해도 지금은 같습니다 ). 프로파일링이 진행되면서 프로젝트와 시작/종료 등을 일치하고자 build 를 수정하게 됩니다. 이에 대한 알림 메시지고 나중에 원상태로 복귀하려면 프로파일의 Advanced commands - Unintegrate Profiler 메뉴를 선택하면 됩니다.

OK

그럼 맨처음 저렇게 창이 나옵니다. 왼쪽 3개의 큰 버튼이 각각 해당 프로파일링을 선택할 수 있습니다.
모니터를 누르면 모니터 프로파일링을 위해 해당 버튼이 커지고 오른쪽 설정이 나타납니다
역시 아래 메모리 버튼을 누르면 메모리 프로파일링 옵션들이 제시됩니다
그럼 모니터 프로파일링부터 시작하겠습니다. 모니터 버튼을 누르고 오른쪽 설정에 스레드 모니터링 활성화를 체크합니다.

실행

프로파일링 통합으로 게임프로그램이 실행되면서 뒤쪽으로 프로파일러 컨트롤 패널과(왼쪽), 스레드 모니터링(오른쪽)이 나타납니다. 그리고 하단부에는 VM Telemetry 가 3개 overview로 보여집니다.
이번엔 CPU 모니터링을 해보도록 하겠습니다.

다시 profile- profile main project (혹은 프로젝트에서 profile)을 선택합니다. (이 때 이전 프로파일링 세션이 종료되지 않았으면 확인 팝업창이 뜹니다. ok)

이번에는 CPU 버튼을 눌러 CPU 프로파일링을 선택하고 성능 분석에 Entire Application 을 선택합니다.

실행

역시 게임 프로그램이 시작되고 프로파일러 컨트롤 패널(왼쪽)과 스레드 모니터링(오른쪽)이 나타납니다. 현재 비활성되어 있기때문에 작은 아이콘을 누르면 스레드 모니터링이 활성화됩니다.
스레드 모니터링 활성화(뒤쪽)된 그림
프로그램을 종료하면 스냅샷을 찍을 것인지에 대한 확인창이 뜹니다.

예 선택

좀전 CPU 프로파일링에 대한 스냅샷입니다.
마지막으로 메모리 프로파일링에 대해 알아보겠습니다.

profile - profile main project (혹은 프로젝트의 profile 선택)

메모리 모니터링을 누르고 오른쪽 설정에서 객체 생성과 가비지 컬렉션 모두 기록을 선택하고, 할당을 위한 스택 추적 기록을 역시 체크 합니다.

실행

마찬가지로 게임프로그램이 시작되고 뒤편으로 할당 객체들이 나타납니다. (안보이시면 라이브 결과(왼쪽 패널)를 누르시면 됩니다.
프로그램을 종료하면 메모리 프로파일링에 대한 스냅샷 확인창이 뜹니다.

예 선택
스냅샷은 다음과 같습니다.


지금까지 넷빈즈 프로파일링에 대해 개략적으로 살펴 봤습니다.

다음 예제는 이 프로파일링에 대한 세부 설정과 여러 상황별 사용 방법에 대해 살펴보겠습니다.

계속...

Netbeans-Korean by 강여사 - July 01, 2010 10:51 AM
넷빈(netbeans)6.8에서 HeapWalker 사용하기

본 예제의 샘플 프로젝트는 다음 경로에서 다운받을 수 있습니다.

http://docs.google.com/leaf?id=0B55-rdrBfsK5ODA2MzBmZTgtYzJiYS00NWQ4LWFiODAtMjUxMWI2MTg5NDNk&hl=ko

이번 예제에서는 프로파일링 시 OOM(Out Of Memory) 발생시 힙 덤프를 자동 생성하며, 해당 덤프에 대한 분석을 가능하게 해주는 HeapWalker 기능에 대해 알아 보겠습니다.

이번 예제에서 사용할 프로젝트는 PrimeNumbers (SE) 입니다.

우선 해당 프로젝트를 실행하여 어떤 내용의 프로젝트인지 살펴보겠습니다.

프로젝트를 실행시키면 아래와 같은 프로그램이 제시되는데 입력한 값에 대한 소수를 구해줍니다. 그럼 다음과 같이 1000000 을 입력하고 아래 버튼을 누릅니다. 계산된 소수는 999983 입니다.
다시 한번 Calculate Prime Numbers 버튼을 클릭하면 출력창에 OOM 이 떨어집니다. java heap size
그럼 이제 이 문제에 대해 프로파일을 해보도록 하겠습니다.

프로젝트 - 프로파일

메모리 프로파일을 선택하고 객체 생성과 가비지 컬렉션 모두 기록과 할당을 위한 스택 추적 기록을 체크 한 후 실행합니다.
프로파일 컨트롤 패널에서(왼쪽) 라이브 결과를 누르고 프로그램을 아까와 같이 1000000 을 입력한 후 계산 버튼을 클릭합니다.
아까와 마찬가지로 다시 한번 버튼을 클릭하면 아까처럼 OOM 이 떨어집니다.
해당 프로그램을 종료하면 스냅샷 찍기 여부에 관한 팝업창이 뜹니다.

예 선택

프로파일링 도중 OOM 이 떨어져서 자동으로 힙 덤프가 생성되어 해당 덤프 분석을 위한 HeapWalker 동작 여부에 대한 확인창이 제시됩니다.

예 선택

아래 그림이 힙덤프에 대한 힙워커(heapwalker) 분석 내용입니다.

아래쪽에 보면 스레드 보기 링크가 있습니다. 클릭 클릭하면 관련 클래스에 대한 링크들이 제시됩니다.
HeapWalker의 클래스 탭을 누른 후 크기로 정렬 합니다.
가장 큰 크기를 차지 하고 있는 int[] 에서 마우스 오른쪽을 클릭하여 인스턴스 뷰에서 보기를 선택합니다.
아래 그림이 인스턴스 뷰인데 오른쪽 필드 부분을 확장하면 묶음 단위의 숫자가 진행되면서 소수가 아닌 수는 -1 로 소수는 소수대로 값이 나타납니다.
아래 참조쪽에서 this 에서 오른쪽 마우스를 클릭하여 가장 근접한 GC루트 보기를 선택합니다.
해당 내용에 가장 근접한 GC 루트는 complete_ ... 라고 되어 있습니다.
그럼 그림과 같이 해당 위치에서 다시 마우스 오른쪽을 클릭하여 소스로 이동을 선택합니다.
소스쪽에 오면 해당 complete_가 Map 으로 되어 있는데 이에 대한 사용을 찾으려면 다음과 같습니다.
complete_ 에서 마우스 오른쪽을 클릭하고 find usage (사용법 찾기)를 선택합니다.
아래 그림과 같이 팝업창이 나타나는데 현재 프로젝트인 PrimeNumbers를 찾아 선택합니다.

찾기

그럼 아래창으로 caller와 callee 가 각각 왼쪽 아이콘에 따라 나타납니다.

아래 그림은 callee가 표현된 그림입니다.

....put(XX) 제시된 해당 메소드를 더블 클릭하면 소스로 이동됩니다. 바로 이 부분이 OOM 발생의 문제 부분입니다.
넷빈에서는 프로파일시 OOM 이 발생하면 자동으로 힙덤프를 생성하고 HeapWalker가 동작합니다.

만약 기존에 작성된 힙 덤프가 있다면 profile - load heap dump 메뉴를 사용하면 됩니다.

이번 예제에서는 넷빈 6.X 의 새 기능인 HeapWalker에 대해서 알아 봤습니다.

그동안 힙 덤프 분석을 위해서 여러 툴 들이 제시됐지만 많이 불편했는데 이 HeapWalker는 나름 또 쓸만하네요.

계속...

Netbeans-Korean by 강여사 - July 01, 2010 10:51 AM
넷빈(NetBeans)6.9에서 ICEfaces-01-dataTable 사용하기

넷빈(6.9)에서 ICEfaces-01-dataTable 사용하기

이번 게시물에서는 이번에 새로 나온 넷빈즈(NetBeans 6.9)에서 ICEfaces를 설치 및 활용하여 dataTable 를 사용해보도록 하겠습니다.

ICEfaces 는 간단히 웹 프레임워크 중 하나로, JSF 기반 자바 테크롤로지를 사용하여 RIA를 구축해주는 포괄적인 개발 프레임워크라 할 수 있습니다. 또한 Ajax Push 를 사용하여 실시간 적 협업이 가능한 것도 장점으로 뽑을 수 있구요.

예전 넷빈즈 6.5.1 버전때 기본으로 들어있던 Visual Web JSF 와 연결 Visual Web ICEfaces 는 그야말로 비주얼로 웹페이지를 디자인 해주는 좋은 기능이었죠. (이 VW ICEfaces는 넷빈즈 6.5.1 까지 지원되며 그 이상 넷빈즈에서 프로젝트를 이관(Migration)할 수는 있습니다만..

일단 현재 ICEfaces에서 공급하는 넷빈즈 플러그인에서는 VW ICEFaces 플러그인은 공급하고 있지 않습니다.

우선 작업환경은 다음과 같습니다. 넷빈즈 6.9 ICEfaces NetBeans 6.9 플러그인 (http://www.icefaces.org/) 에서 다운로드 (ICEfaces 계정 필요)
서버는 넷빈즈 6.9에 있는 GlassFish v3 로 진행합니다.

우선 가장 먼저 ICEfaces 에서 넷빈즈 6.9 플러그인을 다운로드 받고 넷빈즈 IDE 와 통합해야 합니다.
ICEfaces 홈페이지로 이동합니다.
http://www.icefaces.org/
음..좋군요. ^^
그럼 위에 메뉴에서 두번째 Downloads 를 누른 후 아래 제시된 조그만 팝업창에 Download Index를 클릭합니다.

ICEfaces 의 각종 다운로드가 있습니다.
현재 ICEfaces 버전은 1.8.2 와 2.0.0 으로 되어 있습니다.

이는 JSF의 1.2 버전과 2.0 버전의 차이점 때문이기도 합니다. 당연 지원되는 서버도 차이가 있습니다. 자세한 내용은 각자..^^;;

그럼 2번째 진한 파랑색 줄의 Tools Support 에서 NetBeans 앞의 주황색 삼각형을 클릭하여 아래를 확장 한 후 NetBeans-6.9 모듈(ICEfaces-2.0.0.Alpha3-Netbeans-6.9-modules.zip)을 다운로드 받습니다.

이때 다운로드 받으려면 ICEfaces 에 가입되어 있어야 합니다.
가입 절차는 생략하겠습니다.
적당한 곳에 다운로드 받은 압축파일을 풀고 넷빈에서 플러그인 추가를 진행합니다.

넷빈을 시작하고 위의 도구에서 플러그인을 선택 클릭합니다.

앞서 다운로드 받은 넷빈 플러그인 파일이 있기 때문에 탭의 다운로드를 선택한 후 아래 플러그인 추가 버튼을 클릭하여 아까 압축을 푼 (nbm 경로) 아래 넷빈 플러그 인 파일을 선택합니다.
2개의 파일 선택 후 열기 클릭

2개의 플러그인이 창으로 올라옵니다.
그럼 왼쪽 아래 설치를 눌러 진행합니다.

플러그인 설치 진행화면에 따라 계속합니다. 다음

동의 체크후 설치

인증서 서명 신뢰 경고가 뜨지만 무시하고 계속

마침

이제 ICEfaces 프로젝트를 만들어 보도록 하겠습니다.
프로젝트 창에서 마우스 오른쪽을 클릭하여 새 프로젝트 선택

카테고리에서 Java Web 을 프로젝트는 Web Application 선택 - 다음

프로젝트 이름은 적당히 저는 prjIceFaces 라고 줬습니다.역시 경로도 적당히..다음

서버는 넷빈 6.9 를 설치하면 GlassFish Server 3 이 설치됩니다.
그냥 그거에 JavaEE Version은 EE5로 맞췄습니다.
지금은 굳이 EE6 으로 할 필요는 없어서리. - 다음

프레임워크에서 ICEFaes 를 선택합니다.
페이지 설명 언어는 2가지 유형이 있는데 JSPX로 지정했습니다.
나머지 Libraries 탭을 눌러 추가되는 라이브러리 버전도 확인 - 마침

그럼 스켈레톤 페이지라고 할 수 있는 웰컴페이지가 자동으로 만들어집니다. welcomeICEFaces.jspx 그리고 오른쪽 파레트(파레트가 자동으로 보이지 않으면 창에서 Palette를 선택하시면 됩니다) 에 ICEfaces 관련 컴포넌트들이 제시됩니다.

기본적으로 만들어지는 페이지가 어떤지 바로 실행해보도록 하겠습니다.
프로젝트에서 오른쪽 마우스 클릭 - 실행

서버가 시작되고 웹 브라우저에 다음과 같은 내용이 보입니다.
주소표시줄에 표시된 호출법도 잘 살펴보시기 바랍니다. http://localhost:8080/prjIceFaces/welcomeICEfaces.iface

다시 툴로 돌아와서 이번엔 JSF 백킹 빈(Managed Bean)을 만들도록 하겠습니다.프로젝트에서 마우스 오른쪽 클릭 - 새로만들기 - Other

JavaServer Faces 카테고리에서 JSF Managed Bean 을 선택합니다. - 다음

이번에 만들 내용은 테이블 예제 실습이므로 클래스 이름도 이렇게.. TableBean 으로 줬습니다.
아래 제시 이름은 inventoryList 로
패키지는 com.icesoft.icefaces.tutorial.component.table.basic
scope는 session ,
설명은 Backing bean for tree example 이렇게 줬습니다.- 마침

그럼 이제 Tablebean 의 내용을 복사해서 붙여넣습니다.
=================================================
package com.icesoft.icefaces.tutorial.component.table.basic;
/**
* A basic backing bean for a ice:dataTable component. This bean contains a
* Collection of IventoryItem objects which is used as the dataset for a
* dataTable component. Each instance variable in the InventoryItem obejct
* is represented as a column in the dataTable component.
*/
public class TableBean {
// List of sample inventory data.
private InventoryItem[] carInventory = new InventoryItem[]{
new InventoryItem(58285, "Dodge Grand Caravan", " Sto&Go/Keyless", 43500, 21695),
new InventoryItem(57605, "Dodge SX 2.0", "Loaded/Keyless", 28000 ,14495),
new InventoryItem(57805, "Chrysler Sebring Touring", "Keyless/Trac Cont", 31500, 15995),
new InventoryItem(57965, "Chrysler PT Cruiser Convertible", "Touring/Loaded", 7000 , 22195),
new InventoryItem(58095, "Chrysler Pacifica AWD", "Heated Lthr/19' Alloy", 43500, 31995),
new InventoryItem(58165, "Jeep Liberty Sport", "Loaded/Keyless", 31000, 26995),
new InventoryItem(58205, "Dodge SX 2.0", "Loaded/Keyless", 19500, 15495),
new InventoryItem(58245, "Chrysler Pacifica AWD", "Moonroof/DVD", 15500, 35695),
new InventoryItem(58295, "Pontiac Montana SV6 Ext", "Loaded/Quads", 40000, 22695),
new InventoryItem(58355, "Jeep Grand Cherokee", "Laredo/Trailer", 26500, 27495),
new InventoryItem(58365, "Jeep Grand Cherokee", "Laredo/Trailer", 27000, 28595),
new InventoryItem(58375, "Chrysler PT Cruiser", "Cruise/KeylessD", 29500, 17795),
new InventoryItem(58425, "Dodge Durango SLT", "Leather/3rd row", 32500, 26695),
new InventoryItem(58475, "Dodge Grand Caravan", "Quads/Rear AC", 52000, 19895),
new InventoryItem(58455, "Chrysler Sebring Touring", "Keyless/Trac Cont", 34000, 16695),
new InventoryItem(58465, "Chrysler Sebring Touring", "Keyless/Trac Cont", 32500, 15995),
new InventoryItem(58495, "Chrysler Sebring Touring", "Keyless/Trac Cont", 22500, 16695),
new InventoryItem(58155, "GM G2500 Cargo Van", "Extended/Auto/Air", 34000, 27795),
new InventoryItem(58275, "Dodge Dakota Q.C. SLT", "4x4/Loaded/Alloys", 22500, 27995),
new InventoryItem(58265, "Chrysler 300 Touring", "Heated Leather", 40500, 26495)
};
/**
* Gets the inventoryItem array of car data.
* @return array of car inventory data.
*/
public InventoryItem[] getCarInventory() {
return carInventory;
}
/**
* Inventory Item subclass stores data about a cars inventory data. Properties
* such a stock, model, description, odometer and price are stored.
*/
public class InventoryItem {
// slock number
int stock;
// model or type of inventory
String model;
// description of item
String description;
// number of miles on odometer
int odometer;
// price of car in Canadian dollars
int price;
/**
* Creates a new instance of InventoryItem.
* @param stock stock number.
* @param model model or type of inventory.
* @param description description of item.
* @param odometer number of miles on odometer.
* @param price price of care in Canadian dollars.
*/
public InventoryItem(int stock, String model, String description, int odometer, int price) {
this.stock = stock;
this.model = model;
this.description = description;
this.odometer = odometer;
this.price = price;
}
/**
* Gets the stock number of this iventory item.
* @return stock number.
*/
public int getStock() {
return stock;
}
/**
* Gets the model number of this iventory item.
* @return model number.
*/
public String getModel() {
return model;
}
/**
* Gets the description of the this iventory item.
* @return description
*/
public String getDescription() {
return description;
}
/**
* Gets the odometer reading from this iventory item.
* @return odometer reading.
*/
public int getOdometer() {
return odometer;
}
/**
* Gets the price of this item in Canadian Dollars.
* @return price.
*/
public int getPrice() {
return price;
}
}
}
=================================================

이제 이 빈을 사용하는 태그를 만들 차례인데 welcomeICEfaces.jspx 을 편집기로 엽니다.
그런다음 오른쪽 파레트의 ICEfaces 의 Data Table 을 편집기 창에 드래그하면 ice:dataTable 태그가 작성됩니다.
그럼 태그 안에서 스페이스바를 누를때마다 속성들이 올라옵니다.

작성할 전체 내용은 다음과 같습니다.
=====================================================
<ice:dataTable value="#{inventoryList.carInventory}" var="item">
<!-- Stock number -->
<ice:column>
<f:facet name="header">
<ice:outputText value="Stock #"/>
</f:facet>
<ice:outputText value="#{item.stock}"/>
</ice:column>
</ice:dataTable>
=======================================================

확인 후 해당 프로젝트를 build 하고 run 합니다.
프로젝트에서 오른쪽 마우스 클릭하여 빌드 하고 난후 실행

그럼 아래 그림처럼 브라우저에 해당 내용이 나옵니다.

음..뭔가 밋밋..--;; 이럴땐 스타일 시트입니다.
다시 넷빈으로 돌아와 헤드 부분에 다음 태그를 추가합니다.
------------------------------------------------------------------------------------
<link href="./xmlhttp/css/xp/xp.css" rel="stylesheet" type="text/css"/>
------------------------------------------------------------------------------------

다시 실행시켜보면 아래 그림처럼 스타일시트가 적용됨을 알 수 있습니다.

이러한 스타일 시트는 프로젝트의 라이브러리에 보시면 몇몇 가지가 더 있습니다. (잘 찾아보십시오 ^^ ) 그 중 royale 로 바꿔보겠습니다.

------------------------------------------------------------------------------------
<link href="./xmlhttp/css/royale/royale.css" rel="stylesheet" type="text/css"/>
------------------------------------------------------------------------------------

자 그럼 여기서 숙제 ^^;위의 Stock 을 참고로 아래 그림과 같이 다른 칼럼들도 출력해보시기 바랍니다.

여기까지.. ^^
수고하셨습니다.
다음엔 예전 넷빈 6.5.1 에서 VisualWeb ICEFaces 에 대해서도 알아보겠습니다.
to be continued...

Netbeans-Korean by 강여사 - May 08, 2010 03:04 PM
넷빈(netbeans) 6.8에서 프로파일링(profiling) 사용법2 - Advanced

프로파일링은 프로젝트의 규모가 클수록 발생하는 오버헤드가 많아지기 때문에 필요한 부분을 적절히 기획하여 실행하는 것이 중요합니다.

앞서 넷빈에서의 프로파일링 기본 사용에 이어 이번에는 좀더 세분화된 방법에 대해 알아보고자 합니다.

1. 이번에 알아볼 내용은 루트 메소드 추가 입니다.

다시 프로파일링 선택

이번에는 CPU 프로파일링에서 전체 어플리케이션이 아닌 부분(Part of application)을 선택하고, 프로파일링을 진행할 Root 메소드를 선택합니다.

루트메소드 선택은 define 링크를 누르면 나타나는 팝업창에 선택가능합니다.

팝업창에서 Add from Project 클릭 루트 메소드 선택

해당 프로젝트(AnagramGame)의 소스쪽의 com.toy.anagrams.lib.WordLibrary 를 체크하고 확인을 누릅니다

위에 선택한 내용이 표시됨을 확인할 수 있습니다. 이러한 루트 메소드의 지정은 아래 노트에도 나오듯이 소스 편집기에서 직접 추가할 수도 있습니다. (편집기에서 오른쪽 마우스 클릭 - 프로파일링- 루트 메소드 추가)
본 창으로 돌아오면 Part of application 버튼 옆에 1 root method ...edit 라고 표시됩니다.

실행 CPU 프로파일링이 진행되면서 게임 프로그램이 시작되고 (뒤쪽의 프로파일링 패널에서 라이브 결과를 누르면 루트 메소드로 지정한 WordLibrary 에서의 프로파일링만 나타나는 걸 확인할 수 있습니다)
역시 게임 프로그램을 종료하면 스냅샷 여부에 대한 확인창이 뜹니다.

예 선택

CPU 스냅샷 입니다.
2. 이번에는 프로파일링 포인트 삽입에 대해 알아보겠습니다.

프로젝트창으로 와서 해당 프로젝트에서 UI를 담당하고 있는 Anagram.java의 소스를 엽니다.

소스의 line 55 에 가면 initComponent() 메소드가 있습니다. 해당 메소드에서 마우스 오른쪽을 클릭하고 profile - insert profiling point 를 선택합니다. 그럼 그림과 같은 새 프로파일링 창이 뜨는데 결과 초기화를 선택하고 다음을 누릅니다.
프로파일링 포인트에 대한 지정 이름과 기타를 확인하고 마침을 누릅니다.
다시 라인 64의 screensize.height 부분에서 위와 같은 방법으로 마우스 오른쪽을 클릭, profile- insert profiling point 를 선택합니다.
이번에는 대상 스냅샷(스냅샷 찍기)를 선택하고 다음을 누릅니다.
역시 해당 내용을 확인하고 마침을 선택합니다.
소스코드로 돌아와보면 그림처럼 파란색으로 2부분이 프로파일링 포인트로 선택되었음을 알 수 있습니다. (이 2부분이 실행될 때 각각 해당 프로파일링(결과초기화/스냅샷 찍기)가 진행될 것입니다.
다시 프로파일링 선택 (profile)
CPU 프로파일링에서 Entire Application (전체 응용 프로그램)으로 바꾸고 아래쪽 프로파일링 포인트 사용을 체크한 후 이 내용을 다시 확인하려면 활동중인 프로파일링 포인트 보기를 클릭하면 아래 그림과 같이 작업된 2개의 포인트가 보입니다.

실행

역시 게임 프로그램이 시작되고 아래 프로파일링 포인트 창이 출력됩니다.

2개의 포인트에서 결과가 각각 오른쪽에 링크로 제공됩니다.
첫번째 보고를 누르면 결과 초기화에 대한 내용이 표시됩니다.
두번째 보고 링크를 누르면 대상 스냅샷에 대한 내용과 함께 스냅샷 바로가기 링크가 나타납니다.
포인트에서 지정된 바에 따라 진행된 스냅샷입니다. (스냅샷 링크 클릭)
맨 위에 initComponent() 에서 마우스 오른쪽을 클릭하면 소스로 이동 메뉴가 있습니다. 클릭
소스편집기에 initComponent() 메소드가 바로 제시됩니다.
이상 프로파일링에 대한 보다 세분화된 방법에 대해 알아봤습니다.

이후로 여러 문제 있는 프로젝트들을 통해 넷빈의 프로파일링이 어떻게 찾아내는 지 하나씩 살펴 보도록 하겠습니다.

계속...^^

Netbeans-Korean by 강여사 - May 08, 2010 03:04 PM
넷빈(netbeans)6.8에서 프로파일링 - 스레드 진단

본 예제에서 제시된 샘플 프로젝트는 다음 경로에 있습니다.

http://docs.google.com/leaf?id=0B55-rdrBfsK5YWUyNGQ3ZGUtYmE4Zi00ZWU3LTk2NDEtMTZjMzFmODM4NWUw&hl=ko

이번에 할 작업은 UI 프로그램에서 스레드 상태를 진단하고 문제가 되는 지점을 찾아 내는 방법에 대해 알아보겠습니다.

프로젝트 열기 (MonitoredThreads)

실행 해당 프로그램은 버튼이 2개 있는 간단한 UI 프로그램입니다.
그러나, 이때 Start! 버튼을 누르게 되면 일정 시간이 지날때까지 아무 것도 동작하지 않습니다.
아래 그림 처럼 경과시간이(30초) 지나야만 기타 다른 버튼 (Exit 혹은 X) 등이 동작합니다.
왜 이런일이 생긴 걸까요?

이제 프로젝트를 프로파일링 해보겠습니다.

프로젝트 - 프로파일

우선 모니터를 선택하여 스레드 모니터링 활성화에 체크(확인)를 하고 실행합니다
프로그램이 시작되면서 뒤편으로 스레드가 상태별로 보여집니다. (각 색상은 해당 상태에 대한 내용입니다. 녹색-실행중, 보라-휴면, 노랑-대기, 빨강-모니터)
그러다 Start버튼을 누르면 이 중 변화하는 스레드가 있습니다.

AWT-EVENTQUEUE-0 입니다. 대기에서 실행으로 바뀌는 군요.

다시 30초가 경과되면 팝업창이 나타나고 그때 스레드 상태 역시 다시 대기상태로 빠집니다.
해당 프로그램을 종료하면 아래 그림과 같은 정보 알림창이 뜹니다. OK
AWT_EVENTQUEUE-0 를 더블클릭하면 해당 스레드에 대한 좀더 자세한 내용이 도식화됩니다.

AWT-EVENTQUERE-0 는 원래 이벤트 큐를 대기하는 일을 담당하는 스레드 입니다.

그럼에도 불구하고 Start! 버튼 클릭시 상태가 실행중으로 바뀌는 바람에 프로그램이 먹통이 된거지요. 이번에는 모니터링이 아니라 분석을 위해 다시 프로파일링을 시작합니다.
CPU 성능 분석을 실행합니다.
스레드 화면이 뒤에 나타나면 아까와 마찬가지로 프로그램에서 Start! 버튼을 눌러 상태 변화를 확인합니다.

프로그램을 종료하면 수행된 결과의 스냅샷을 찍는 정보창이 나타납니다.

예 선택

스냅샷에 AWT-EVENTQUERE-0 에 jButton1ActionPerformed 메소드에서 마우스 오른쪽을 클릭하여 소스로 이동을 선택합니다.
jButton1ActionPerformed 아래 while 문을 살펴보면 잘못 작성되어 있음을 발견할 수 있습니다.
위의 그림에 해당 내용을 주석처리합니다.
프로파일링을 다시 시작합니다.
CPU 성능분석 - 실행
이번에는 Start! 버튼을 눌러도 AWT-EVENTQUEUE-0 상태에는 변화가 없습니다.
물론 다른 버튼을 누르면 바로 반영됩니다. (Exit 나 X)

다시 소스를 열어 아래 주석으로 되어 있는 SwingWorker 부분을 주석 해제를 합니다. (그림 참조)
작성된 SwingWorker.java 의 내용은 같은 패키지 안에 있습니다.
다시 프로파일을 시작합니다.
CPU 성능분석 - 실행
프로그램을 시작했을 때 스레드는 다음과 같습니다.
그러다 Start! 버튼을 누르면 AWT-EVENTQUEUE-0 는 여전히 대기상태로 진행되면서, SwingWorker 스레드가 새로 실행됩니다.
프로그램을 종료하면 스냅샷 찍기에 대한 확인창이 뜹니다.

예 선택
Call Tree 확인
이상 스레드 모니터링에 대한 간단한 예제 였습니다.

계속...

Netbeans-Korean by 강여사 - January 06, 2010 12:36 PM
솔라리스(Solaris)10 에서 자바 6 패키지 기반(package-based)으로 설치

솔라리스 10 u7 을 기본 설치하게되면 자바 5 버전이 번들로 설치되어 있다.

따라서 이 환경에다 자바 6 버전을 패키지 기반(package-based)으로 설치해보고자 한다.

우선 http://java.sun.com/ 의 download (http://java.sun.com/javase/downloads/index.jsp)에서 적절한 파일을 다운로드 받는다.

현재(2009.09.03) 자바 6 버전은 업데이트 16 며, 패키지 기반 설치를 위해서는 *tar.Z 을 다운로드 받는다.

관련 링크: (*tar.Z)

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter

다운로드후 다음과 같이 처리

# chmod +x jdk-6-solaris-i586.tar.Z

# zcat jdk-6-solaris-i586.tar.Z | tar -xf -




압축이 풀리면 다음과 같이 패키지 추가
# pkgadd -d . SUNWj6rt SUNWj6dev SUNWj6cfg SUNWj6man SUNWj6dmo

팁. 기존에 6 버전이 설치되어 있다면 삭제방법
# pkgrm SUNWj6rt SUNWj6dev SUNWj6cfg SUNWj6man SUNWj6dmo






패키지 설치 후 심볼릭링크 걸기
# cd /usr
# rm java
# ln -s jdk/jdk1.6.0_16 java
# java -version



자바버전 확인
# java -version

Netbeans-Korean by 강여사 - December 22, 2009 03:22 PM
넷빈(Netbeans)6.8에서 stateless 세션과 servlet 3.0 연동하기 - basic

이번 예제에서는 서블릿 3.0 에다 EJB 무상태 세션 빈(Stateless Session Bean)을 연결해보도록 하겠습니다.

우선 작업환경은 다음과 같습니다.

넷빈: 6.8
서버: 글래스피시 v3 도메인
버전: EE 6 Web

그럼 프로젝트를 새로 만듭니다.

파일 - 새 프로젝트

Java Web - Web Application 선택
다음 클릭

프로젝트 명은 StatelessServlet 이라고 줬습니다.
경로 적당히
다음 클릭

서버를 글래스피시 v3 도메인으로
버전은 EE 6 Web 으로 줍니다.
마침 클릭

그럼 기본 웹 어플리케이션이 만들어집니다.
여기에 서블릿을 새로 만들도록 하겠습니다.
프로젝트에서 오른쪽 마우스 클릭 - new - other

Web - Servlet 선택
다음 클릭

이름을 StatelessServlet 이라고 줬습니다.
패키지는 stateless 라고 줍니다.
다음 클릭

역시 자바 서블릿 3.0 에서는 web.xml 이 옵션가능이므로 체크가 해제되어 있습니다.
기본 그대로
마침 클릭

만들어진 서블릿 소스에
@WebServlet 어노테이션과 함께 지정된 내용들이 작성되어 있는 것을 확인해볼 수 있습니다.
==================================================================

@WebServlet(name="NewServlet", urlPatterns={"/NewServlet"})
public class NewServlet extends HttpServlet {

==================================================================

자 그럼 이 서블릿에서 호출할 무상태 세션빈을 만들도록 하겠습니다.
프로젝트에서 오른쪽 마우스 클릭 - new - other

Java EE - Session Bean 선택
다음 클릭

클래스 이름은 NewSessionBean
패키지 이름은 stateless
유형에 Stateless 를 선택합니다.
다음 클릭

만들어진 세션 빈 소스에서 주석에 나온대로 메소드를 추가하기 위해 소스 삽입(insert code: ALT+INSERT)를 선택합니다. 그럼 그림처럼 add business method 메뉴가 나타납니다.
클릭

팝업창이 뜨면 그림과 같이 작성합니다.
메소드 이름 sayHello
리턴유형 java.lang.String
파라미터 추가(add)버튼을 눌러
파라미터 변수 이름에 name (<-parameter대신) 바꿉니다.
OK

작성된 코드에서 return null; 부분을 다음과 같이 바꿉니다.
==========================================================
return "Hello, " + name + "!\n";

==========================================================

이제 서블릿 소스로 다시 돌아와 좀전에 작성한 EJB 비즈니스를 호출하도록 하겠습니다.
서블릿 소스에서 소스 삽입(insert code:ALT+INSERT)를 선택하면 메뉴 중 call Enterprise Bean 메뉴가 있습니다.
클릭.

팝업창에 EJB 빈이 나타나는데 확장해서 위에 작성한 NewSessionBean 을 선택합니다.
OK 클릭

그럼 다음 소스와 같이 작성됩니다.(확인)
--------------------------------------------------------------------------------
@EJB
private NewSessionBean newSessionBean;
--------------------------------------------------------------------------------

이번에는 게시물의 try 안의 주석으로 되어 있는 부분 대신 다음 코드를 복사해서 붙여넣습니다. (직접 작성하셔도 됩니다. ^^)
================================================================================
out.println("<html>");
out.println("<head>");
out.println("<title>무상태 세션 빈 연동 서블릿 테스트</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>이름을 넣어주십시오</h1>");
out.println("<form method=\"POST\">");
out.println("<TABLE>");
out.println("<tr><td>Name: </td>");
out.println("<td><input type=\"text\" name=\"name\"> </td>");
out.println("</tr><tr><td></td>");
out.println("<td><input type=\"submit\" name=\"sub\"> </td>");
out.println("</tr>");
out.println("</TABLE>");
out.println("</form>");
String val = request.getParameter("name");
if ((val != null) && (val.trim().length() > 0)) {
out.println("<FONT size=+1 color=red> Greeting from StatelessSessionBean: </FONT> "
+ newSessionBean.sayHello(val) + "<br>");
}
out.println("</body>");
out.println("</html>");

================================================================================

이제 이 서블릿을 실행해야 하는데 프로젝트에서 서블릿으로 바로 호출되도록 등록정보를 수정하겠습니다.
프로젝트에서 오른쪽 마우스 클릭 - 등록 정보(properties)

Run 부분에서 그림과 같이 relative URL 값에다 /NewServlet 를 적어줍니다.

프로젝트 실행 (RUN)

그럼 브라우저에서 입력박스가 나타납니다.
적당히 abc 라고 줍니다.

해당 내용이 무상태 세션 빈을 통해 다시 서블릿으로 출력됩니다.


수고하셨습니다.

자 그럼 퀴즈~~

여기서 값을 "가나다"로 온전히 출력하려면 어떻게 하면 될까요? ㅎㅎ

아시는 분은 답글을..

Netbeans-Korean by 강여사 - December 21, 2009 01:33 AM
넷빈(Netbeans)6.8에서 JSF 2.0 사용하기-basic

IDE의 새 JSF 2.0은 이전의 JavaServer Faces는 물론, Facelets 페이지를 위한 향상된 편집 기능을 포함하며, 엔티티 클래스와 함께 작업 가능한 다양한 기능들 및 일반 개발 작업을 위한 JSF 마법사 슈트, 예를들어, JSF 매니지드 빈, Facelets 템플릿 및 콤포지트 컴포넌트 등을 제공합니다.

이번 예제는 간단히 넷빈즈 IDE 6.8 에서 JSF 2.0 에 대해 알아보고자 합니다.

환경은 넷빈즈 6.8
서버는 글래스피시 v3 도메인

파일 - 새 프로젝트
Java Web - Web application

다음 클릭

프로젝트 명은 기본 설정에 EE6 을 붙여줬습니다. (적당히)

경로 적당히

다음 클릭 서버를 글래스피시 v3 도메인으로

자바 EE 버전은 EE6 Web 으로

다음 클릭 여기서 JavaServer Faces 를 선택합니다(체크)

하면 아래 JSF 2.0 이 사용될 거라는 표시가 보입니다(기본)

확인후 마침 클릭

만들어진 파일을 살펴보면 예전 JSF 1.2 에서는 welcome.jsp가 만들어졌지만

JSF 2.0 에서는 index.xhtml 이 만들어진 걸 볼 수 있습니다. 확인 그럼 이제 엔티티와 엔티티 클래스로부터 세션 퍼세이드(Session Facade)를 만들도록 하겠습니다.

우선 엔티티 클래스를 만듭니다.

프로젝트에서 오른쪽 마우스 클릭 - new - other 정보보존(Persistence) - 엔티티 클래스 (Entity classes)

다음 클릭 클래스 이름은 Message 로

패키지는 entities 로 줬습니다

그리고 퍼시스턴스 유닛을 만들기 위해 아래 퍼시스턴스 유닛만들기 버튼을 클릭합니다 이름은 기본 그대로

데이터 소스에서 New Datasource 를 선택하고, 이름을 jdbc/mysample 라고 줍니다. (현재는 없습니다, 나중에 자동으로 만들어질 겁니다)

테이블 생성전략에 생성(create)를 선택합니다.

생성
만들어진 Message 클래스에 private String message 를 추가하고 이에 대한 getter/setter 를 만듭니다(insert code: 코드 삽입 (Ctrl+I)을 사용하면 쉽게 만들수 있습니다)
-----------------------------------------------

private Long id;
private String message;
-----------------------------------------------
코드 부분은 그림을 참조 하십시오
그리고 persistence.xml 을 열어서 JTA 로 잘 설정되어 있는 지도 확인합니다.

(transaction-type="JTA").
이는 엔티티 클래스의 생명 주기가 컨테이너에 의해 관리된다는 것을 의미합니다.
이제 세션 퍼세이드(Session Facade)를 만들도록 하겠습니다.

프로젝트에서 오른쪽 마우스 클릭 - new - other Java EE 카테고리에서 - Session Beans for Entity Classes 를 선택합니다.

다음 클릭

참고: 이번 예제에서는 메시지 엔티티를 위한 무상태 세션 퍼세이드(Stateless Session Facade) 생성 마법사를 사용할 예정입니다. EJB 3.1 스펙에서 세션 빈을 위한 비즈니스 인터페이스는 현재 옵션(optional)입니다.
빈에 접근하는 클라이언트가 로컬인 이번 응용 프로그램에서는,따라서 로컬 인터페이스를 사용하거나,아니면 인터페이스 뷰를 사용하지 않거나 여러분 맘입니다. --;; 사용가능한 엔티티에 앞서 작성한 entities.Message 가 올라옵니다.

그럼 추가를 선택해 오른쪽으로 옮깁니다

다음 클릭

패키지명을 boundary 로 줬습니다.

마침 클릭

만들어진 소스 부분을 확인하면
다음과 같은 Stateless 와 PersistenceContext 가 작업되어 있습니다.
===========================================================

@Stateless
public class MessageFacade {
@PersistenceContext(unitName = "WebApplicationEE6PU")
private EntityManager em;
===========================================================
IDE가 엔티티를 생성, 삭제, 변경, 및 찾기 등을 위한 일련의 메소드를 자동 작업해놓은 것을 확인할 수 있습니다.
=========================================================================
public List findAll() {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
cq.select(cq.from(Message.class));
return em.createQuery(cq).getResultList();
}

public List findRange(int[] range) {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
cq.select(cq.from(Message.class));
Query q = em.createQuery(cq);
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
return q.getResultList();
}

public int count() {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
Root rt = cq.from(Message.class);
cq.select(em.getCriteriaBuilder().count(rt));
Query q = em.createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
}
======================================================================확인
그럼 이제 JSF 페이지들을 만들도록 하겠습니다.

프로젝트에서 오른쪽 마우스 클릭 - new - other

JavaServer Faces 에 JSF Managed Bean 선택
다음 클릭
클래스 이름을 MessageView 로 주고

패키지 명은 my.presentation 으로 줍니다

마침 클릭
만들어진 클래스를 살펴보면 다음과 같이 되어 있습니다.
====================================================

@ManagedBean(name="MessageView")
@RequestScoped
public class MessageView {

/** Creates a new instance of MessageView */
public MessageView() {
}
}
====================================================
편집기의 적당한 공백에서 마우스 오른쪽을 클릭하여 코드 삽입(insert code: Ctrl+I) 을 선택합니다.
그리고 Call Enterprise Bean 을 선택합니다. 프로젝트 아래 MessageFacade를 선택하고

참조 인터페이스에서는 no 를 선택합니다

OK 클릭
그럼 아래 그림과 같이 @EJB 가 작성됩니다.
=======================================

@EJB
MessageFacade messageFacade;
=======================================
다음 코드를 붙여넣습니다.
===================================================================
// Creates a new field
private Message message;

// Creates a new instance of Message
public MessageView() {
this.message = new Message();
}

// Calls getMessage to retrieve the message
public Message getMessage() {
return message;
}

// Returns the total number of messages
public int getNumberOfMessages(){
return messageFacade.findAll().size();
}

// Saves the message and then returns the string "theend"
public String postMessage(){
this.messageFacade.create(message);
return "theend";
}
===================================================================
임포트 관련 문제 발생은 마우스 오른쪽을 눌러 가져오기 고정(fix import)를 선택합니다.
Message 관련해서 팝업창이 뜨는데 그림과 같이 선택하고 OK 클릭
작성된 코드 확인
이제 페이지를 수정하도록 하겠습니다.
======================================================================
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets
<f:view>
<h:form>
<h:outputLabel value="Message:"/><h:inputText value="#{MessageView.message.message}"/>
<h:commandButton action="#{MessageView.postMessage}" value="Post Message"/>
</h:form>
</f:view>

</h:body>
</html>
======================================================================= 그림 참조
이제 다른 JSF 파일을 만들도록 하겠습니다.

프로젝트에서 오른쪽 마우스 클릭 - new - other

JavaServer Faces - JSF Page 선택
다음 클릭 파일 이름에 theend 라고 줍니다.

마침 클릭 다음 내용을 작업합니다.
==================================================

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets : RESULTS
<h:outputLabel value="Thanks! There are "/>
<h:outputText value="#{MessageView.numberOfMessages}"/>
<h:outputLabel value=" messages!"/>
</h:body>
</html>
==================================================
그림 참조
실행하면 다음 그림과 같이 뜹니다.

그럼 메시지 부분에 적절히 단어를 입력합니다.

hi,nice 2 meet u 라고 주고 버튼을 클릭했습니다 결과가 1개 있다고 나오네요.
해당 내용은 다시 데이터베이스에서 확인할 수 있습니다.

Services 탭으로 가서 sample 데이터베이스의 MESSAGE 에서 데이터를 조회해보면 나옵니다.

수고하셨습니다. *^^*

Netbeans-Korean by 강여사 - December 20, 2009 05:02 AM
넷빈(Netbeans)6.8에서 jax-rs 서버와 클라이언트 작성하기 02 - 클라이언트

이제 클라이언트 프로젝트를 작성하도록 하겠습니다.

새로 프로젝트를 만듭니다.
파일 - 새 프로젝트
Java Web - Web application 선택

다음 클릭
프로젝트의 이름은 CustomerTestApp 라고 줬습니다.

경로는 적당히

다음 클릭 서버는 역시 글래스피시 v3 도메인

버전은 EE6 으로 줬습니다. (EE5 도 당연 가능합니다)

마침 클릭 이제 REST 클라이언트 스텁을 만들도록 하겠습니다.

프로젝트에서 오른쪽 마우스 클릭 - new - other Web Service - RESTful Web Service Client Stubs 선택
다음 클릭 REST 웹 서비스 프로젝트를 선택합니다.

Add project 버튼을 눌러 좀전에 작성한 서버 프로젝트(CustomerDB)를 선택합니다.

그리고 원래 창으로 돌아오면 그림과 같이 되어 있습니다.

마침 클릭 프로젝트의 web page 안에 rest 폴더 안에 보면 teststub.html 있습니다.

run file 로 이 파일을 실행합니다. 아래 그림과 같이 정상적으로 나와야 다음 작업이 가능합니다.

이제 여기서부터는 노가다..--; 대충 만들었습니다. 각자 알아서 할것

저는 자바스크립트 하나를 추가하고 해당 함수 호출을 index.jsp 수정을 통해 진행했습니다.

프로젝트에서 오른쪽 마우스 클릭 - new - other Web - javascript 선택

다음 클릭 파일 이름에 customerapp 라고 주고

마침 클릭 해당 자바 스크립트 내용으로 다음을 붙여 넣습니다.

==============================================


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

//Change this url value if necessary
var baseUrl = 'http://localhost:8080/CustomerDB/resources/';
var customersObj;
var discountCodesObj;

function getCustomers() {
if(customersObj == null)
customersObj = new Customers(baseUrl+'customers/');
return customersObj;
}

function getDiscountCodes() {
if(discountCodesObj == null)
discountCodesObj = new DiscountCodes(baseUrl+'discountCodes/');
return discountCodesObj;
}

//function to show all customers
function showCustomers() {
var customersObj = getCustomers();
var customers = customersObj.getItems();
document.write("<table border=1>");
for(i=0;i<customers.length;i++) {
var customer = customers[i];
document.write("<tr>");
document.write("<td>"+customer.getName()+"</td>");
document.write("<td>"+customer.getCustomerId()+"</td>");
document.write("</tr>");
}
document.write("</table>");
}

==============================================
그림 참조

그런 다음 index.jsp 파일을 수정합니다.

=======================================================
<%--
Document : index
Created on : 2009. 12. 16, ?ㅽ썑 8:49:11
Author : Administrator
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>JSP Page</title>
<!-- JS_DECLARE_START - DO NOT REMOVE-->
<script type="text/javascript" src="./rest/Support.js"></script>
<script type="text/javascript" src="./main.js"></script>
<script type="text/javascript" src="./rest/customerdb/CustomerDB.js"></script>
<script type="text/javascript" src="./rest/customerdb/Customers.js"></script>
<script type="text/javascript" src="./rest/customerdb/Customer.js"></script>
<script type="text/javascript" src="./rest/customerdb/DiscountCodes.js"></script>
<script type="text/javascript" src="./rest/customerdb/DiscountCode.js"></script>
<script type="text/javascript" src="./customerapp.js"></script>
<!-- JS_DECLARE_END - DO NOT REMOVE-->
</head>
<body>
<h1>Hello World!</h1>
<script type="text/javascript">
showCustomers();
</script>

</body>
</html>

======================================================
그림 참조

프로젝트를 실행하여 다음과 같이 뜨면 정상 출력입니다.


나머지 클라이언트 시리즈는 나중에..또는 각자 알아서.. --;

Netbeans-Korean by 강여사 - December 18, 2009 01:52 AM
jmaki+jpa+glassfishv3(eclipselink)+pagination

이전에도 이 주제에 대해 하긴 했는데..다시 겸사겸사에 그때 안했던거랑..함 정리차..

그럼 시작..

일단 현재 작업조건은

netbeans 6.7.1 (windows)
jdk 1.6 update 14
db는 javadb (sample)

의 기본팩에서부터 시작

기본팩에는 일단 jmaki 가 설치되어 있지 않기 때문에 우선 jmaki 플러그인부터 설치합니다.
플러그인 설치를 위해서는 도구(tools)-플러그인(plugin) 클릭


jmaki 관련 플러그인이 현재 2가지.. 체크후 아래있는 설치(install) 클릭


팝업창의 진행대로 계속 진행
다음


체크후 설치 클릭
마침 버튼을 누르면 IDE가 재시작된다.


재시작된 IDE에서 새 프로젝트 만들기
new project

java web - web applciation 다음
이름을 적당히 (jmaki_ytable_gv3) 로 줬습니다.


경로도 적당히 다음


이번에는 glassfish v3 로 진행했습니다. glassfish v2 로 진행해도 같습니다. (glassfish v2의 경우 orm의 service provider를 toplink 로, glassfish v3인 경우는 eclipselink가 default 로 되더군요)


jmaki ajax framework 를 선택하고 아래 레이아웃은 standard로 진행
마침(finish)를 누릅니다.

오른쪽 파레트에서 jmaki yahoo - datatable를 클릭하여 index.jsp의 main content 에다 넣습니다.

샘플데이터를 보기위해 바로 실행

run file

실행하면 다음과 같이 제시됩니다.
그럼 일단 여기에 추가 설정을 하도록 하겠습니다.
index.jsp로 돌아와서 pagenated 의 false를 true로 바꾸고 엔터키를 칩니다. (반드시 엔터키를 쳐야 반영됩니다)
그럼 위 그림처럼 pagenated에 대한 기본 상황이 제시됩니다.

yahoo의 페이지네이션에서 기본 제공되고 있는 걸 보면 10,20,50,100 등 기본값이 제시되어 있습니다.

이 값을 수정하기 위해서(여기에는 약간의 버그도 있슴..현재 jmaki에서 rowsPerPage 등의 설정이 바로 반영되지 않습니다. 하여 기타등등 여러가지 수정을 위해서 소스 편집.
resources-yahoo-datatable-component.js 를 열면 355줄에 있는 사항을 다음과 같이 변경.

기본상황

rowsPerPage : 10,
rowsPerPageOptions: [10,20,50,100],
pageLinks :5,

을 다음과 같이 변경

rowsPerPage : args.rowsPerPage,
rowsPerPageOptions: [1,2,5,10],
pageLinks : args.pageLinks,

(그럼 jmaki에 설정한 대로 제시)



pagination 1차 완성



이제 데이터베이스로부터 동적 테이블과의 페이지네이션이 2차..

Netbeans-Korean by 강여사 - December 18, 2009 01:52 AM
넷빈 6.5 에서 profiler 사용하기 - 03

Live Profiling Results 창은 그때까지 수집된 프로파일링 데이터를 표시합니다. 표시된 데이터는 기본으로 몇 초마다 갱신되구요. CPU 성능을 분석할 때, Live Profiling Results 창은 각 메소드에 소요된 시간과 각각 메소드의 호출 수에 대한 정보를 표시하게 됩니다.

실시간 결과 분석 창(Live Profiling Results)에서 바로 프로젝트의 소스까지 직접 다이렉트하게 갈 수 있습니다. ^^ 그래야 프로파일링 툴답죠.

나타난 메소드 이름에서 오른쪽 마우스를 클릭하면 Go to Source 메뉴가 있는데 클릭하면 바로 소스코드의 해당 메소드로 갑니다.




프로젝트의 getDefault() 로...

그럼 마지막으로 메모리 분석을 위해 다시 프로파일링 세션을 종료합니다.
profile - stop profiling session 클릭



이번엔 Memory 박스를 누르고 메모리 분석을 하고자 합니다.



이때 기본적으로 선택된 사항으로 진행하면 오버헤드가 적습니다만, 스택 추적이나 GC 등을 위해 다른 방법을 진행하도록 하겠습니다.

객체생성과 GC 모두를 분석하기 위해 라디오 버튼을 2번째 걸로.
Record Both object creation and garbage collection 으로 클릭



이 옵션을 선택하게 되면, 어플리케이션 프로파일링은 어플리케이션 데이터 뿐만 아니라, 어떤 유형의 얼마나 많은 객체가 살아있는지, 그들의 사이즈나 평균 수명 등과 같은 객체의 생명에 관계된 정보를 제공해 줍니다.



또,
풀 콜 스택을 기록하기 위해 Record stack traces for allocation 을 선택 합니다. (체크박스에 체크)
이 옵션을 선택함으로써, 메모리 스냅샷을 취할 경우, 메소드가 할당된 객체를 호출하는 역 call tree를 볼 수 있습니다.

역시 프로그램을 자동 시작하고, 프로파일링 결과가 보여집니다.



실시간 결과를 보기 위해 Live Profiling Results 를 클릭하면, 결과창이 보여지는데,
프로젝트에 할당된 객체의 수와 사이즈 등에 대한 정보가 제시됩니다.



기본적으로 결과는 Live Bytes, 수에 의해 정렬되어 나타나는데, 각 칼럼을 선택하면 재정렬 할 수 있습니다.
또한 아래 filter 칸에 클래스 이름을 적어 결과를 필터링 할 수도 있습니다.

Netbeans-Korean by 강여사 - December 18, 2009 01:52 AM
jmaki+jpa+glassfishv3(eclipselink)+pagination 2

예전 게시물 올렸을 때에는 버튼을 이용하여 각각 페이지 앞뒤로의 이동을 올렸었는데,
이번에는 좀전의 yahoo의 pagination을 이용하여 페이징을 해보고자 한다.

일단 데이터베이스에서의 작업을 위해 JPA 관련 작업을 시작.

프로젝트에서 오른쪽 마우스 new - Entity Classes from Database 선택 (만약 이 메뉴가 안보이면 option (팝업창)- persistence 카테고리에 있다)

Data Source 는 jdbc/sample


선택할 테이블은 customer 를 add
다음
패키지 이름은 data


그리고 persistence unit 를 새로 작성해야 하므로 아래 버튼(create persistence unit) 클릭


이름 : 프로젝트이름+PU
프로바이더: eclipselink(v3 기본값)
나머지는 옵션대로
create
확인후 다음

그럼 자동생성된 customer.java 에 json 객체화 작업을 추가
다음내용 코드 작성
----------------------------
public JSONObject toJSON() throws Exception {
JSONObject thisJSON = new JSONObject();
thisJSON.put("name", this.getName());
thisJSON.put("city", this.getCity());
thisJSON.put("state", this.getState());
thisJSON.put("zip", this.getZip());
return thisJSON;
}
----------------------------
임포트 문제 해결
마우스오른쪽 클릭-fix import
원래 여기 이 대목에서 2개의 클래스 (하나는 서블릿, 다른 하나는 일반 자바 클래스) 를 작성해야 하는데 예전에 했던 대목인지라 작성 상세 내용은 skip 하고 이전 프로젝트의 파일 복사로 진행 (다만 파일만 복사되는 상태이므로 나머지 설정사항들은 수동으로 해줘야 함)

예전 프로젝트의 service 패키지 전체를 복사해서 source package 아래 붙여넣기
참고 1 ( Catalog.java)
-----------------------------

/*
* To change this template, choose Tools Templates
* and open the template in the editor.
*/
package service;

import data.Customer;

import java.util.List;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.json.JSONArray;
import org.json.JSONObject;

/**
*
* @author carol mcdonald
*/
public class Catalog {

/** Creates a new instance of Catalog */
public Catalog() {
}
private Customer customer;

private EntityManager getEntityManager() throws Exception {
EntityManager em = (EntityManager) (new InitialContext()).lookup("java:comp/env/persistence/em");
return em;
}
private int batchSize = 5;
private int firstItem = 0;

public Customer getCustomer() {
return customer;
}

public void setCustomer(Customer customer) {
this.customer = customer;
}

public List getCustomers() throws Exception {
EntityManager em = getEntityManager();

Query q = em.createQuery("select object(o) from Customer as o");
//////kj 2009-10-01
int count = ((Long) em.createQuery("select count(o) from Customer as o").getSingleResult()).intValue();
q.setMaxResults(count);
// q.setMaxResults(batchSize);
q.setFirstResult(firstItem);
return q.getResultList();
}

public JSONArray getNextCustomersJSON(int page) throws Exception {
if (page < firstitem =" 0;" firstitem =" page" customersjson =" new"> customers = getCustomers();
for (Customer customerData : customers) {
JSONObject customerJSON = customerData.toJSON();
customersJSON.put(customerJSON);
}
return customersJSON;
}

public Customer findCustomer(String id) throws Exception {
EntityManager em = getEntityManager();
try {
Customer o = (Customer) em.find(Customer.class, id);
return o;
} finally {
em.close();
}
}

public int getItemCount() throws Exception {
EntityManager em = getEntityManager();
try {
int count = ((Long) em.createQuery("select count(o) from Customer as o").getSingleResult()).intValue();
System.out.println("size:"+ count);
return count;
} finally {
em.close();
}
}

public int getFirstItem() {
return firstItem;
}

public int getLastItem() throws Exception {
int size = getItemCount();
return firstItem + batchSize > size ? size : firstItem + batchSize;
}

public int getBatchSize() {
return batchSize;
}
}


------------------------------
참고2 CatalogServlet.java
------------------------------
/*
* To change this template, choose Tools Templates
* and open the template in the editor.
*/
package service;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONArray;

/**
*
* @author carol mcdonald
*/
public class CatalogServlet extends HttpServlet {

/**
* Processes requests for both HTTP GET and POST methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

int page = 0;
int rowsonly = 0;
Catalog catalog = new Catalog();
response.setContentType("text/plain;charset=UTF-8");

String temp = request.getParameter("page");
if (temp != null) {
page = Integer.parseInt(temp);
}
temp = request.getParameter("rowsonly");
if (temp != null) {
rowsonly = Integer.parseInt(temp);
}

try {

// JSONArray array = catalog.getNextCustomersJSON(page);
JSONArray array = catalog.getCustomersJSON();
if (rowsonly == 1) {
out.println(array.toString());
} else {
out.println("{columns : [" +
"{ label : 'Company', id : 'name'}," +
"{ label :'City', id : 'city'}," +
"{ label : 'State', id : 'state'}," +
"{ label : 'Zip', id : 'zip'}" +
"],");
out.println("rows: ");
out.println(array.toString());
out.println(" }");
}
} catch (Exception e) {
out.println(e);
} finally {
out.close();
}
}

//
/**
* Handles the HTTP GET method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Handles the HTTP POST method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}//
}
-----------------------------
(이전프로젝트에서 service 패키지 복사)
(지금프로젝트의 source package 에 붙여넣기)
그런 다음 이 중 CatalogServlet 은 서블릿이므로 web.xml 을 열어 수동으로 편집
web.xml 을 연후 Servlet 탭을 클릭
오른쪽 아래 Add Servlet Element 버튼 클릭
팝업창에서 이름은 CatalogServlet 으로
클래스는 찾기에서 service - CatalogServlet 찾아서 선택
아래 URL Pattern 에는 /CatalogServlet (그림 참고)
OK
index.jsp 에서 yahoo datatable 위젯 수정

(내용은 그림 참고)source package 의 CatalogServlet.java 에서 다음 수정

47라인
// JSONArray array = catalog.getNextCustomersJSON(page);
JSONArray array = catalog.getCustomersJSON();
Catalog.java 의 50라인 수정

int count = ((Long) em.createQuery("select count(o) from Customer as o").getSingleResult()).intValue();
q.setMaxResults(count);
// q.setMaxResults(batchSize);



web.xml 에 persistence 관련 추가

그림 참고

프로젝트 실행(run)

Netbeans-Korean by 강여사 - December 18, 2009 01:51 AM
넷빈에서 jquery 사용하기-basic

이번에는 넷빈 6.7.1에서 jquery(ajax framework)를 사용해보도록 하겠습니다.
이 시리즈는 일단 기본 jquery와 나중에 jmaki-jquery 로도 살펴볼 예정입니다.

우선 프로젝트를 새로 만듭니다.
new project

java web - web application
프로젝트 이름은 적당히 (jqueryproject)


경로도 적당히 - 다음 클릭

서버는 웹 지원이면됩니다. (저는 glassfish v3 선택)
마침

그럼 이번 프로젝트에서 사용할 jquery 다운로드를 위해 jquery 사이트로


http://jquery.com/


사이트의 오른쪽에 보면 download 버튼이 있고, 그 위에 2가지 형태로 공급


2번째의 development 를 체크하고 다운로드 버튼을 누르면 다운로드 사이트로 진행됩니다.


jquery-1.3.2.js 다운
스크립트 파일들을 저장할 공간으로 폴더를 새로 만듬


프로젝트에서 new - folder 폴더 이름은 js


경로는 browse 버튼을 눌러 web 아래로 위치
확인후 마침 클릭
그럼 만들어진 js 폴더에 아까 다운로드 받은 파일을 복사해 놓는다(이 작업은 탐색기에서 프로젝트 폴더로 직접 한다)


스크립트 추가


헤드부분에 jquery 스크립트 추가 - 그림 참고


<script type="text/javascript" src="js/jquery-1.3.2.js"></script>

==============================================
$(document).ready(function(){
$("h1").click(function(){
$(this).addClass("blue");
});
});
==============================================
<style type="text/css">
.blue { color: blue; }
</style>
=============================================
실행(run file)


나타난 화면에서 JSP Page 를 클릭하면 파란색으로 바뀜

addClass("blue"). <- 점을 찍으면 아래 그림과 같이 api가 제공된다. fadeOut("slow")를 선택

기타 여러 사항 추가

==============================
$(document).ready(function(){
$("h1").click(function(){
$(this).addClass("blue").fadeOut("slow");
});
$("a").click(function(event){
alert("나~자바~봐~~~라");
event.preventDefault();
$(this).hide("slow");
});
});
====================================

팁) 만약 메소드들에 있어 브라우저 호환때문에 경고메시지가 뜨거나 함수들에 줄이 그어져있으면 브라우저 설정을 변경한다.


도구-옵션-기타-JavaScript 에서 internet explorer 7 and later 로 변경 - OK


이번에는 jquery의 UI 중 하나인 accordion을 사용해보자.


우선 다음 사이트에서 UI 관련파일을 다운로드한다.


http://jqueryui.com/download (적당한 경로에 다운로드후 압축을 푼다) 스타일 작업 추가 - 그림 참조
UI 아코디온을 위한 자바스크립트 추가 - 2개 - 그림 참고
<script type="text/javascript" src="js/ui.core.js"></script>
<script type="text/javascript" src="js/ui.accordion.js"></script>
============================================
바디부분에 어코디온 내용 추가
div id="infolist">
<h3><a href="#">Mary Adams</a></h3>
<div>
<img src="pix/maryadams.jpg" alt="Mary Adams">
<ul>
<li><h4>Vice President</h4></li>
<li><b>phone:</b> x8234</li>
<li><b>office:</b> 102 Bldg 1</li>
<li><b>email:</b> m.adams@company.com</li>
</ul>
<br clear="all">
</div>
<h3><a href="#">John Matthews</a></h3>
<div>
<img src="pix/johnmatthews.jpg" alt="John Matthews">
<ul>
<li><h4>Middle Manager</h4></li>
<li><b>phone:</b> x3082</li>
<li><b>office:</b> 307 Bldg 1</li>
<li><b>email:</b> j.matthews@company.com</li>
</ul>
<br clear="all">
</div>
<h3><a href="#">Sam Jackson</a></h3>
<div>
<img src="pix/samjackson.jpg" alt="Sam Jackson">
<ul>
<li><h4>Deputy Assistant</h4></li>
<li><b>phone:</b> x3494</li>
<li><b>office:</b> 457 Bldg 2</li>
<li><b>email:</b> s.jackson@company.com</li>
</ul>
<br clear="all">
</div>
<h3><a href="#">Jennifer Brooks</a></h3>
<div>
<img src="pix/jeniferapplethwaite.jpg" alt="Jenifer Applethwaite">
<ul>
<li><h4>Senior Technician</h4></li>
<li><b>phone:</b> x9430</li>
<li><b>office:</b> 327 Bldg 2</li>
<li><b>email:</b> j.brooks@company.com</li>
</ul>
<br clear="all">
</div>
</div>
============================================

전체코드
===========================================
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<!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=UTF-8">
<title>JQuery Test</title>
<script type="text/javascript" src="js/jquery-1.3.2.js" ></script>
<script type="text/javascript" src="js/ui.core.js"></script>
<script type="text/javascript" src="js/ui.accordion.js"></script>

<script type="text/javascript">
$(document).ready(function(){
$("h1").click(function(){
$(this).addClass("blue").fadeOut("slow");
});
//$("a").click(function(event){
// alert("나~자바~봐~~~라");
// event.preventDefault();
// $(this).hide("slow");
//});
$("#infolist").accordion({
autoHeight: false
});
});
</script>
<style type="text/css">
.blue { color: blue; }
</style>
<style type="text/css">
ul {list-style-type: none}
img {padding-right: 20px; float:left}
#infolist {width:500px}
</style>
<link rel="stylesheet" href="css/jquery-ui-1.7.2.custom.css" type="text/css">
</head>
<body>
<h1>JSP Page</h1>
<a href="http://jquery.com/">jQuery</a>
<div id="infolist">
<h3><a href="#">Mary Adams</a></h3>
<div>
<img src="pix/maryadams.jpg" alt="Mary Adams">
<ul>
<li><h4>Vice President</h4></li>
<li><b>phone:</b> x8234</li>
<li><b>office:</b> 102 Bldg 1</li>
<li><b>email:</b> m.adams@company.com</li>
</ul>
<br clear="all">
</div>

<h3><a href="#">John Matthews</a></h3>
<div>
<img src="pix/johnmatthews.jpg" alt="John Matthews">
<ul>
<li><h4>Middle Manager</h4></li>
<li><b>phone:</b> x3082</li>
<li><b>office:</b> 307 Bldg 1</li>
<li><b>email:</b> j.matthews@company.com</li>
</ul>
<br clear="all">
</div>
<h3><a href="#">Sam Jackson</a></h3>
<div>
<img src="pix/samjackson.jpg" alt="Sam Jackson">
<ul>
<li><h4>Deputy Assistant</h4></li>
<li><b>phone:</b> x3494</li>
<li><b>office:</b> 457 Bldg 2</li>
<li><b>email:</b> s.jackson@company.com</li>
</ul>
<br clear="all">
</div>
<h3><a href="#">Jennifer Brooks</a></h3>
<div>
<img src="pix/jeniferapplethwaite.jpg" alt="Jenifer Applethwaite">
<ul>
<li><h4>Senior Technician</h4></li>
<li><b>phone:</b> x9430</li>
<li><b>office:</b> 327 Bldg 2</li>
<li><b>email:</b> j.brooks@company.com</li>
</ul>
<br clear="all">
</div>
</div>
</body>
</html>
================================================
pix폴더와 그 안에 이미지까지 복사해서 위치한 후 실행(run)
부가로, 스타일시트를 수정하기 위해 다운로드 받은 UI 압축 푼 폴더 중 css 폴더를 복사해서 프로젝트에 붙여넣습니다.

스크립트링크 추가
<link rel="stylesheet" href="css/jquery-ui-1.7.2.custom.css" type="text/css">
다시 실행(run)

Netbeans-Korean by 강여사 - December 18, 2009 01:51 AM
jmaki의 accordion들 사용하기(dojo,jquery,jmaki)-advanced

이번에는 jmaki 위젯의 accordion들을 프레임워크별로 사용해보도록 하겠습니다.
참고로 jmaki는 기본 설치에는 포함되어 있지 않기때문에 사전에 jmaki 플러그인을 설치후 진행하도록 합니다. (jmaki 플러그인 설치 방법은 다른 게시물에도 여러번 소개했기에 자세한 사항은 생략하겠습니다. 도구-플러그인-사용가능한 플러그인-jmaki 관련2개의 플러그인 설치-IDE 재시작)
그럼 새로이 프로젝트를 하나 만듭니다.
new project

java web - web application
프로젝트명: jmakiJqueryProject (적당히)

경로도 적당히

다음

서버는 웹이 지원되면 됩니다. 저는 glassfish v3 로 진행했습니다.

다음

jMaki Ajax Framework 체크

아래 CSS에서 3개의 칼럼과 풋터(three column with footer)를 선택합니다.

마침

만들어진 index.jsp 페이지에서 left slider 글씨를 지우고 대신 파레트의 jmaki dojo 의 accordion을 드래그해서 놓습니다.
이번에는 right slider 대신 역시 파레트의 jmaki jquery 의 accordion 을 드래그해서 놓습니다.
다시 main content 대신 jmaki widgets 의 accordion 을 드래그 해서 놓습니다

(물론 파레트에 보면 다른 accordion 위젯도 있습니다. 그건 각자 알아서 살펴보시기 바랍니다. 이번에는 이렇게 3개...^^;;)

dojo의 accordion 위젯 내용을 보면 test.jsp 페이지로 내용을 호출하는 예제가 있습니다. 그걸 위해서 test.jsp 를 만듭니다.

프로젝트에서 오른쪽 마우스 클릭 new - jsp

이름 test

마침

바디부분에 this is test page 라고 적었습니다
프로젝트 실행(run)
아래 그림이 jmaki 를 사용한 각 위젯들의 기본 예제입니다.

왼쪽이 dojo, 가운데가 jmaki, 그리고 오른쪽이 jquery 의 accordion 들입니다. 아까 작성한 test.jsp가 dojo(왼쪽)의 magazines 의 내용으로 나타납니다.

dojo나 jquery의 기타 여러 옵션들은 해당사이트의 데모와 문서 등을 통해 더 자세히 살펴볼 수 있습니다. (http://dojotoolkit.org/ http://jqueryui.com/)

그럼 이번엔 jmaki의 widgets의 accordion의 테마를 변경해보도록 하겠습니다. 테마 변경을 위해서는 index.jsp 페이지의 적당한 공백에서 마우스 오른쪽을 클릭하면 jmaki 메뉴가 나타납니다.

jmaki-themes-kame(Green) 을 차례로 선택합니다 그런 다음 다시 실행하면 가운데 위젯의 테마가 변경되어 있는 것을 보실 수 있습니다. (다른 테마로의 변경은 각자)
약간 살펴보면...

config.json에 테마변경이 추가되어 있는 것을 보실 수 있습니다. 사실 이는 페이지에 대한 설정테마가 글로벌로 변경된 것인데 jmaki의 accordion 위젯은 잘 변화되어 나타났지만 전체 페이지는 변경이 없습니다. 이는 css가 정상 동작하지 않아 그렇습니다 위 설정에 있는 경로 즉, resources/css/themes/kame/theme.css 가 현재는 비어 있습니다.

따라서 이 내용을 채우면 됩니다. (현재 작성되어 있는 orange의 theme.css를 복사하여 적당히 변경합니다. 녹색으로..--;)


샘플
============================================================
.jmakiTitleBar {
background:#ACCCD5;
}
.jmakiBackround {
background:#47c620;
}
.jmakiBackroundHover {
background:#ecf7e9;
}
.jmakiFont {
color : #FFFFFF;
}
.jmakiFontHover {
color : #e8f5e4;
}
.jmakiShadow {
color : #e8f5e4;
}
body {
background : #FFFFFF;
}
#outerBorder {
background : #FFFFFF;
}
#header {
color : #000000;
background : #47c620;
}
#subheader, #subheader div a {
color : #FFFFFF;
}
#subheader {
border :0;
}
#main {
}
#content {
background : #FFFFFF;
}
#leftColumn {
background : #FFFFFF;
}
#rightColumn {
background : #FFFFFF;
}
#leftSidebar {
background : #FFFFFF;
}
#banner {
}
#footer {
color : #000000;
background : #e8f5e4;
}
============================================================

다시 실행
이제 페이지의 테마가 그린으로 바뀌었슴을 알 수 있습니다. (다른 테마도 같은 방법으로 변경)
그럼 이제 나머지 actions 에 대한 테스트를 해보도록 하겠습니다.
샘플로 제시된 actions 내용은 다음과 같습니다.
=============================================
{label: 'Actions',
menu: [
{ label : 'Select',
action :{topic: '/foo/select',
message: { targetId : 'bar'}}
},
{ label :'Set Content',
action :{topic: '/foo/setContent',
message: { value : 'test.jsp'}}
}
]}
]
}"
=============================================
간단한 action 구현을 위해 footer부분에 dojo 의 table을 드래그해서 놓습니다.(dojo의 table 샘플에 보면 bar 부분이 있습니다. 확인)
그럼 actions 동작을 위해 glue.js 에 다음 코드를 추가 작업을 합니다.
====================================================
jmaki.subscribe("/foo/select", function(args) {
jmaki.publish("/table/select", { targetId: 'bar' });
});
jmaki.subscribe("/foo/setContent", function(args) {
jmaki.log("in mytopic");
var row = {
id : 'new',
title: 'Book Title 3',
author : 'Author 3',
isbn : '4413',
description : 'A Some long description'
};
jmaki.publish("/table/addRow",{ value: row });
jmaki.publish("/table/select", { targetId: 'new' });
});
====================================================
다시 실행한후 (run) 가운데 accordion에서 actions 의 select 를 클릭하면 dojo 테이블의 2번째 칼럼이 선택된다. (그림의 노란색)

그리고 setContent를 클릭하게 되면 테이블에 새로운 row 가 추가됩니다. (그림의 노란색)

이상이 간단히 살펴본 jmaki accordion 들이었습니다.

Netbeans-Korean by 강여사 - December 18, 2009 01:50 AM
넷빈 6.7.1 의 새 변경사항 (release notes) 정리

=======================================================
6.7.1에 새 변경사항:
=======================================================
6.7과 비교
-------------------------------------------------------
JavaFX SDK 1.2 포함
넷빈 6.7에 잘 알려진 버그 수정

6.5.1와 비교
-------------------------------------------------------

  • POM과 J2EE 지원뿐 아니라 플러그인 및 웹 서비스 생성을 위한 Maven 지원
  • IDE안에서 Kenai 주관 프로젝트 생성 편집 가능한 Kenai 통합
  • Selenium 지원 및 SQL 코드 완성을 포함한 PHP 향상
  • 프로파일링, Qt 라이브러리, 코드 리팩토링 및 매크로 확장을 위한 C++ 지원
  • 응용 프로그램에 웹 APIs consumption을 가능케하는 웹 API Gateway 플러그인
  • Java ME SDK 3.0 번들에 CDC 프로젝트를 위한 Java ME 지원

=======================================================
지원 기술
=======================================================
지원 기술들:
-------------------------------------------------------
  • Java EE 5 and J2EE 1.4
  • JavaFX 1.2
  • Java ME SDK 3.0
  • Struts 1.2.9
  • Spring 2.5
  • Hibernate 3.2.5
  • Java API for RESTful Web Services (JAX-RS) 1.0
  • Java API for XML-based RPC (JAX-RPC) 1.6
  • PHP 5.2
  • Ruby 1.8
  • JRuby 1.2
  • Rails 2.1
  • Groovy 1.5
  • Grails 1.1
  • VCS
  • CVS: 1.11.x, 1.12.x
  • Subversion: 1.3.x, 1.4.x, 1.5.x
  • Mercurial: 1.x
  • ClearCase V7.0

테스트된 어플리케이션 서버들:
-------------------------------------------------------
  • Sun Java System Application Server 9.0 (GlassFish V1)
  • Sun GlassFish Enterprise Server v2.1 (GlassFish V2.1)
  • Sun GlassFish Enterprise Server v3 Prelude
  • Sun Java System Application Server PE 8.2
  • Tomcat 5.5
  • Tomcat 6.0.18

(글래스피시 어플리케이션 서버 사용시에는 썬 글래스피시 엔터프라이즈 서버 v2.1 사용 권장)

=======================================================
시스템 요구사항
=======================================================
최소 하드웨어 설정
-------------------------------------------------------
Microsoft Windows XP Professional SP3:
Processor: 800MHz Intel Pentium III or equivalent
Memory: 512 MB
Disk space: 750 MB of free disk space

Microsoft Windows Vista:
Processor: 800MHz Intel Pentium III or equivalent
Memory: 512 MB
Disk space: 750 MB of free disk space

Ubuntu 9.04:
Processor: 800MHz Intel Pentium III or equivalent
Memory: 512 MB
Disk space: 650 MB of free disk space

Solaris OS version 10 (SPARC):
Processor: UltraSPARC II 450 MHz
Memory: 512 MB
Disk space: 650 MB of free disk space

Solaris OS version 10 (x86/x64 Platform Edition):
Processor: AMD Opteron 1200 Series 1.8 GHz
Memory: 512 MB
Disk space: 650 MB of free disk space

Macintosh OS X 10.5 Intel:
Processor: Dual-Core Intel
Memory: 512 MB
Disk space: 650 MB of free disk space

Macintosh OS X 10.5 PPC:
Processor: PowerPC G4
Memory: 512 MB
Disk space: 650 MB of free disk space

For more information, see <a href="http://www.netbeans.org/kb/articles/mac.html">Using NetBeans on Mac OS X</a>.


권장 하드웨어 설정
-------------------------------------------------------
Microsoft Windows XP Professional SP3:
Processor: 2.6 GHz Intel Pentium IV or equivalent
Memory: 2 GB
Disk space: 1 GB of free disk space

Microsoft Windows Vista:
Processor: 2.6 GHz Intel Pentium IV or equivalent
Memory: 2 GB
Disk space: 1 GB of free disk space

Ubuntu 8.x:
Processor: 2.6 GHz Intel Pentium IV or equivalent
Memory: 2 GB
Disk space: 850 MB of free disk space

Solaris OS version 10 (SPARC):
Processor: UltraSPARC IIIi 1 GHz
Memory: 2 GB
Disk space: 850 MB of free disk space

Solaris OS version 10 (x86/x64 platform edition):
Processor: AMD Opteron 1200 Series 2.8 GHz
Memory: 2 GB
Disk space: 850 MB of free disk space

Macintosh OS X 10.5 Intel:
Processor: Dual-Core Intel
Memory: 2 GB
Disk space: 850 MB of free disk space

Macintosh OS X 10.5 PPC:
Processor: PowerPC G5
Memory: 2 GB
Disk space: 850 MB of free disk space

For more information, see <a href="http://www.netbeans.org/kb/articles/mac.html">Using NetBeans on Mac OS X</a>.

이외 넷빈즈 IDE 실행 플랫폼
===============================================
  • OpenSolaris 2008.11
  • Java Desktop System 2
  • Microsoft Windows 2000 Professional SP4
  • Mac OS X 10.4.11 Intel/Power PC
  • Various other Linux distributions, such as Ubuntu 8.x, Red Hat Enterprise Linux and many others.

필수 소프트웨어
===============================================
넷빈즈 IDE는 JDK 기반 위에서 구동됩니다.

이 릴리즈를 위한 테스트된 JDK 는 다음과 같습니다.

  • JDK 6 Update 14
  • JDK 5 Update 19

참고 : JDK 다운로드 사이트 목록
---------------------------------------------------------------------------------------
  • Solaris: http://java.sun.com/javase/downloads/index.jsp
  • Windows: http://java.sun.com/javase/downloads/index.jsp
  • Linux: http://java.sun.com/javase/downloads/index.jsp
  • Mac OS X: http://www.apple.com/support/downloads/javaformacosx105update2.html
for Mac OS X 10.5.4 and higher (includes Java SE 6, version 1.6.0_07 for 64-bit Intel-based Macs (Core2Duo processors))
For users running Mac OS X 10.4.11 and higher, a Java update (J2SE 5, version 1.5.0_16) is available at http://www.apple.com/support/downloads/javaformacosx104release7.html.

Note. Java upgrades for Mac OS X are also available via Apple's Software Update mechanism.
Open VMS: http://h18012.www1.hp.com/java/download/index.html

이전 넷빈즈와의 호환성
===============================================================
넷빈즈 4.1 이하에서 작성된 프로젝트의 경우 프로젝트로 불러올 수 없을 수도 있습니다.


UML, SOA 와 Visual Web 모듈 사용
===============================================================
위 모듈은 현재 빠져있습니다. 따라서 이 모듈을 추가하고자 하면 도구-플러그인 에서 각각 UML, SOA 혹은 Visual Web 의 플러그인 이름을 통해 설치할 수 있습니다. 이 모듈들은 현재 Beta Update Center 에서 사용가능합니다.

SOA 기능을 활성화하려면
------------------------------------------------
1. 썬 글래스피시 엔터프라이즈 서버 v3 프렐루드는 SOA 모듈과 작업되지 않기 떄문에 썬 글래스피시 엔터프라이즈 서버 v2.1 과 함께 번들된 넷빈즈 IDE 6.7.1 을 다운로드 받아 설치합니다.
2. OpenESB 프로젝트 다운로드 페이지에서, 넷빈즈 6.7 다운로드 번들을 위한 글래스피시 ESB v2.1을 설치합니다. 글래스피시 ESB 설치를 위한 디렉토리로 넷빈즈 6.7 설치 경로를 선택합니다.

SQL 편집기 및 데이터베이스
===============================================================
  • 업데이트된 드라이버: 넷빈즈 IDE에 내장된 MySQL 드라이버가 5.1.6으로 업데이트 되었습니다.

  • 테스트된 드라이버: 정식으로 테스트되었습니다.

Driver
VersionExample URL
JavaDBDerby 10.4.1.3jdbc:derby://localhost:1527/sample (Network)
OracleOracle Database 10g Release 2 (10.2.0.2)jdbc:oracle:thin:@//localhost:1521:ora9i
PostgreSQL8.3 Build 603jdbc:postgresql://jsmith.mycompany.com:5432/postgres
MySQLMySQL Connector/J 5.1.6jdbc:mysql://localhost:3306/sample

  • 기타 드라이버: 정식으로 테스트되지는 않았습니다만, 경험에 기반해 작동됩니다.
DriverVersionExample URL
Microsoft Microsoft SQL Server 2005 JDBC Driver 1.2.2828.100 jdbc:sqlserver://localhost:1433;databaseName=travel;selectMethod=cursor
IBMRedistributable DB2 JDBC Type 4 driver v8 fixpack 13 jdbc:db2://localhost:50002/sample
jTDS jTDS 1.2.1 jdbc:jtds:sqlserver://test-mycompany.com:1433/travel
DataDirect DataDirect Connect for JDBC - 3.6 DataDirect Connect for JDBC - 3.6.07jdbc:datadirect:oracle://localhost;SID=ora9i
jdbc:datadirect:sqlserver://localhost:1433;DatabaseName=travel;SelectMethod=cursor
jdbc:datadirect:db2://localhost:50002;databaseName=sample
Pointbase 5.2 ECF build 294
jdbc:pointbase://localhost:29092/sample


Netbeans-Korean by 강여사 - December 18, 2009 01:50 AM
넷빈즈 IDE 6.7 에서 자바 어플리케이션에 JMX Instrumentation 추가하기

아래 게시물의 선수지식 등을 사용하여 JMX 기술 및 Instrumentation 등에 대해 공부하시기 바랍니다. ^^ 이번 게시물에서는 제목대로 자바 어플리케이션에다 사용자 정의 MBean 및 MBean 인터페이스, 속성, 오퍼레이션, 통지 등에 대해 생성, 구현, 설정 하고 테스트하는 방법에 대해 알아 보고자 합니다.

우선 작업환경은 다음과 같습니다.

넷빈즈 IDE 6.5/ 6.7 이상
JDK 5 나 6 이상
JMX 플러그인 - 설치 (넷빈즈 플러그인으로 설치 진행)
JConsole 플러그인 - 설치 (넷빈즈 플러그인으로 설치 진행)
-------------------------------------------------------
플러그인 설치부터 진행합니다.

도구 - 플러그인 클릭

범주를 클릭해서 Management 를 정렬하면 JConsole과 JMX 가 있습니다. 체크하고 아래쪽의 설치 버튼을 눌러 설치를 진행합니다.



이제 작업에 사용될 자바 어플리케이션을 만듭니다. (샘플 프로젝트 사용)
file - new project

프로젝트의 Samples 카테고리의 Java - Anagram Game 이 있습니다. 선택하고 -다음

프로젝트 명은 그대로, 경로도 적당히 , 마침

프로젝트의 소스/포맷 레벨 조정 및 확인 등을 위해 프로젝트에서 마우스 오른쪽을 클릭 맨 아래 properties 클릭

Sources 카테고리를 누르면 JDK 포맷이 나타납니다(기본적으로 1.4 로 되어 있을 듯) 그럼 이를 JDK 5 이상으로(5나 6) 변경합니다. (이는 추후 JMX 기타 관련 작업을 위해서입니다 ) - OK

프로젝트에서 오른쪽 마우스를 눌러 새 파일을 만듭니다. 오른쪽 클릭 - new - other 선택

파일 유형에 JMX 카테고리를 선택하면 관련 파일 유형이 나오는데 이 중 Standard MBean 을 선택합니다. 아래 설명에도 있듯이 JMX 표준 MBean 을 생성하고자 합니다. - 다음

이름은 AnagramStats
패키지는 com.toy.anagrams.mbeans
설명(description)에는Monitoring and Management of the Anagrams Game
마침

이제 이 MBean의 속성(attributes), 오퍼레이션(Operations), 통지(Notification) 등을 추가할 예정입니다.
만들어진 AnagramStats.java 에서 오른쪽 마우스를 클릭 (아니면 편집기 창에서 오른쪽 마우스 클릭) 하면 JMX 메뉴가 있습니다. 다시 이안에 "Add MBean attibutes..." 메뉴가 있습니다. 클릭

팝업창에 다음의 내용을 반영합니다(각 텍스트필드 작성후 엔터키로 반영)
일단 Add Attribute 버튼을 누르고 나타난 예제를 다음으로 변경합니다.

Attribute Name : LastThinkingTime
Type: int
Access: ReadOnly (드랍다운메뉴 선택)
Description: Elapsed time to solve last anagram

다시 Add Attribute 버튼을 누르고 다음 내용 추가
Attribute Name: NumSolvedAnagrams
Type: int
Access: ReadOnly
Description: Number of solved anagrams
OK

OK 를 누르면 이렇게 해서 만들어진 소스 코드를 볼 수 있습니다. 다시 나머지 3개의 변수 추가를 위해 같은 작업을 합니다.


변수 이름 유형 액세스 설명
MinThinkingTime int ReadOnly Minimum elapsed time to solve an anagram
MaxThinkingTime int ReadOnly Maximum elapsed time to solve an anagram
CurrentAnagram String ReadOnly Current anagram to solve
OK

이번에는 MBean 오퍼레이션을 추가하도록 하겠습니다.
역시 AnagramStats.java 에서 마우스 오른쪽클릭- JMX - Add Mbean Operation... 선택

add operation 버튼을 클릭하여 샘플예시를 다음으로 변경합니다.
Operation Name: resetAll
Return Type: void
Parameters: (leave empty)
Exceptions: (leave empty)
Description: Reset MBean state
OK

이번에는 이벤트 발생시 통지를 위한 Notification 인터페이스 구현 작업을 하겠습니다.
AnagramsStats.java 에서 다시 마우스 오른쪽 클릭 - JMX - "Implement NotificationEmitter interface..." 선택

위의 2개 모두를 선택하고 (자동생성)
아래 통지에는 다음과 같이 작업합니다.
Notification Class :(드랍다운메뉴에서 선택) javax.management.AttributeChangeNotification
Notification Type: (자동선택됨) ATTRIBUTE_CHANGE)
Description: Anagram is Solved
OK

만들어진 코드 확인

이번에는 오퍼레이션의 내용을 채우겠습니다. 작성된 모두를 초기화하도록 다음 코드를 resetAll() 안에 붙여 넣습니다. (굵은 글씨 참고)
=========================================
public void resetAll() {
minThinkingTime = 0;
maxThinkingTime = 0;
lastThinkingTime = 0;
numSolvedAnagrams = 0;
}
=========================================

이제 몇몇 구현 코드를 추가합니다. 구현 코드 내용은 사용자가 문제를 풀기위해 얼마나 걸렸는지 thinking 시간을 계산하고, 푼 문제 갯수를 증가시키고, 문제를 풀때 통지를 만들어 보내는 등에 대한 내용입니다. 다음 코드를 AnagramStats.java 에 붙여넣습니다.



===============================================================================



/*
* Methods exposed to Anagrams application to feed management with data.
*/

//Stores the time at which a new anagram is proposed to the user.
private long startTime;

/**
* A new Anagram is proposed to the user: store current time.
*/
public void startThinking() {
startTime = System.currentTimeMillis();
}

/**
* An Anagram has been resolved.
*/
public void stopThinking() {

//Update the number of resolved anagrams
numSolvedAnagrams++;

// Compute last, min and max thinking times
lastThinkingTime = (int) (System.currentTimeMillis() - startTime) / 1000 ;
minThinkingTime = (lastThinkingTime < minThinkingTime minThinkingTime == 0) ?
lastThinkingTime :
minThinkingTime;
maxThinkingTime = (lastThinkingTime > maxThinkingTime) ?
lastThinkingTime :
maxThinkingTime;

//Create a JMX Notification
Notification notification = new Notification(AttributeChangeNotification.ATTRIBUTE_CHANGE,
this,
getNextSeqNumber(),
"Anagram solved: " + currentAnagram);

// Send a JMX notification.
broadcaster.sendNotification(notification);
}

/**
* Set latest anagram which has been computed by the Anagram application
*/
public void setCurrentAnagram(String currentAnagram) {
this.currentAnagram = currentAnagram;
}



===============================================================================

이제 운영과 어플리케이션을 연결하기 위해 GUI 로 쓰인 Anagrams.java 를 엽니다.(com.toy.anagrams.ui 안에 있습니다)

여기에 다음 코드를 추가합니다.
------------------------------------------------------------------------------
/**
* JMX initialization:
* Create and register Anagrams MBean in Platform MBeanServer.
* Initialize thinking time and current anagram.
*/
private void initManagement() throws Exception {

}
------------------------------------------------------------------------------

그런 다음 이 메소드를 생성자의 마지막에 호출합니다. (그림 참고)
==================================================================
//JMX Management initialization
initManagement();
==================================================================

이 작업을 하면 2군데 Exception 관련 오류가 납니다.
왼쪽의 빨강전구표시를 눌러 add throws Exception 으로 둘다 처리합니다.

그럼 이제 initManagement() 메소드 안에 MBean 등록 코드를 추가하기 위해 다음과 같이 마법사를 사용합니다. 일단 initManagement() 메소드 안에서 오른쪽 마우스를 클릭하고 JMX - "Generate MBean Registration..." 를 선택합니다.

그럼 팝업창이 뜹니다. 여기서
Register Existing MBean 을 선택하고 브라우저 버튼을 눌러 AnagramStats 를 선택합니다.

다음 내용이 자동 작업됩니다. (기본대로)
OK

생성된 코드에서 다음 내용을 추가합니다. 클래스 아래에 다음 변수를 추가
=========================================================================
// Reference to the AnagramsStats MBean
private AnagramsStats mbean;
=========================================================================

그런 다음 아래 메소드 안에 생성과 생성된 인스턴스 사용을 위해 소스를 추가, 수정합니다. (굵은 글씨 참고)
=============================================================================
private void initManagement() throws Exception {
try { // Register MBean in Platform MBeanServer
mbean = new AnagramsStats();
ManagementFactory.getPlatformMBeanServer().
registerMBean(mbean, new ObjectName("com.toy.anagrams.mbeans:type=AnagramsStats"));
} catch (JMException ex) {
ex.printStackTrace();
}
=============================================================================


그런 다음 메소드 아래에 다음 내용 추가
=============================================================================
// When the Anagrams game is first displayed, a word is proposed to the user.
// We must start time computing and set the current anagram
mbean.startThinking();
mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
=============================================================================

그런 다음 nextTrialActionPerformed() 메소드에 다음 내용을 추가합니다.
========================================================================
//Update management statistics and values
try {
mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
mbean.startThinking();
} catch (Exception e) {
e.printStackTrace();
}
========================================================================

이번에는 guessedWordActionPerformed() 메소드의 if 문 안에 다음 내용을 추가합니다. (그림 참조)
==============================================================================
//Update management stats
try {
mbean.stopThinking();
} catch(Exception e) {
e.printStackTrace();
}
==============================================================================

모두를 저장하고 이제 JConsole과 함께 프로그램을 실행해보도록 하겠습니다.
위의 메뉴바에 보면(도움말 아래) "Run Main Project with Monitoring and Management..." 버튼이 있습니다. 이 아이콘을 누릅니다.

build.xml 업데이트에 대한 대화상자가 나타납니다. OK

차례로 어플리케이션 GUI 와 JConsole 이 나타납니다.


JConsole 에 MBean 탭을 누르고, 왼쪽 트리에서 com.toy.anagram.mbeans 를 누르면 작성한 내용이 보입니다. (AnagramsStats)
속성 (attributes) / 오퍼레이션 (operations) / 통지 (notification)에 대해 확인

그럼 통지 (Notification)노드를 선택하고 오른쪽에 보면 Subscribe 버튼이 있습니다. 이벤트 발생시(문제를 풀었을 때마다) 통지를 받겠다는 이야기입니다.

GUI 로 돌아가 문제를 풉니다. (abstraction, ambiguous, arithmetic, backslash, ...)




문제를 풀때마다 통지가 수신됩니다.
Attributes(속성) 노드를 눌러 업데이트된 내용을 살펴볼 수 있습니다.

점검이 다 끝나면 저장된 내용을 삭제하는 오퍼레이션에 대해 호출해봅니다.
Operations - resetAll 버튼 클릭

메소드가 정상적으로 호출되었다는 팝업창이 뜨면서 해당 값들이 초기화되었음을 알 수 있습니다.


이상이 자바 어플리케이션에 JMX 조정을 사용해본 예제였습니다.

다음 게시물은 JMX Manager 어플리케이션에 대해 알아 보겠습니다.

수고하셨습니다. ^^

Netbeans-Korean by 강여사 - December 18, 2009 01:50 AM
넷빈 6.7에서 JMX 매니저 개발 및 원격 JMX Agent 연결하기

이번 넷빈 JMX 모듈에 있는 JMX Manager 를 개발하고 원격 JMX Manager를 연결하는 방법등에 대해 다뤄보겠습니다.

작업 환경:
넷빈즈 6.5/6.7 이상
JDK 5 나 6
JMX 플러그인 - 설치
JConsole 플러그인 - 설치
(두 플러그인의 설치 방법은 이미 전 게시물에 언급했기때문에 자세한 내용은 생략하겠습니다. 도구 - 플러그인 - 해당 2개의 모듈 설치)

매니저먼트 샘플 Anagram 프로젝트를 생성합니다.
File - new project


Samples - JMX - Anagram Game Managed with JMX 선택 - 다음
이름 그대로 (기본) 경로 적당히 - 마침

원격 관리를 위한 원격 JMX Agent 를 위해서 프로젝트 소스 포맷은 반드시 1.5 이상이어야 합니다.
프로젝트에서 오른쪽 마우스 클릭 - Properties 클릭 Sources 카테고리 선택 후 오른쪽 아래 Source/Binary Format JDK는 5 이상으로 맞춥니다.
OK
카테고리에서 Monitoring and Management 를 선택하고 오른쪽의 Enable RMI Remote Access 를 체크합니다.
원격 포트로 기본 포트인 1099를 그대로 선택합니다.
OK
"Run Main Project with Monitoring and Management 클릭
프로그램GUI가 제시되고 ,
이어 JConsole 이 표시됩니다.
이번에는 Manager Project 를 만들도록 하겠습니다.

File - new project

Java - Java Application 선택

프로젝트 이름: JMXAnagramManager
경로는 적당히
메인 프로젝트로 설정 (Set as Main Project)는 체크되고
create main class 는 해제합니다.
마침
프로젝트에서 마우스 오른쪽 클릭 - new - other
JMX - JMX Manager 선택 - 다음

클래스 이름: AnagramsManager
패키지 이름: com.toy.anagrams.manager
아래 3개모두 선택(기본)
다음
JMX Agent URL 의 Edit 버튼을 클릭하면 다음 그림과 같이 팝업창이 뜹니다.
프로토콜로 RMI JVM Agent 선택 , 호스트 localhost , 1099 , URL 기본 대로
OK

다음 JMX Agent URL 텍스트박스가 업데이트 됩니다.
인증 연결 체크 - 인증을 위한 샘플 코드 자동 생성
마침

AnagramsManager.java 파일에서 주석이 되어 있는 부분을 주석을 제거해서 풉니다.(참고)
======================================================================
public static void main(String[] args) throws Exception {

//Manager instantiation and connection to the remote agent
AnagramsManager manager = AnagramsManager.getDefault();

// SAMPLE MBEAN NAME DISCOVERY. Uncomment following code:
Set resultSet =
manager.getMBeanServerConnection().queryNames(null, null);
for(Iterator i = resultSet.iterator(); i.hasNext();) {
System.out.println("MBean name: " + i.next());
}

// Close connection
manager.close();
System.out.println("Connection closed.");
}
======================================================================
import 문제 해결을 위해 fix import
java.util.Set 과 java.util.Iterator 클래스 선택

메인 프로젝트 실행
위의 메뉴바에 run- run main project

매니저가 수행되며 원격 agent 연결, output 창에 MBean 이름 출력하고 커넥션을 닫게 됩니다.
====================================================================== init:
deps-jar:
compile:
run:
MBean name: java.lang:type=MemoryManager,name=CodeCacheManager
MBean name: java.lang:type=Compilation
MBean name: java.lang:type=MemoryPool,name=PS Perm Gen
MBean name: com.sun.management:type=HotSpotDiagnostic
MBean name: java.lang:type=Runtime
MBean name: com.toy.anagrams.mbeans:type=AnagramsStats
MBean name: java.lang:type=ClassLoading
MBean name: java.lang:type=Threading
MBean name: java.lang:type=MemoryPool,name=PS Survivor Space
MBean name: java.util.logging:type=Logging
MBean name: java.lang:type=OperatingSystem
MBean name: java.lang:type=Memory
MBean name: java.lang:type=MemoryPool,name=Code Cache
MBean name: java.lang:type=GarbageCollector,name=PS Scavenge
MBean name: java.lang:type=MemoryPool,name=PS Eden Space
MBean name: JMImplementation:type=MBeanServerDelegate
MBean name: java.lang:type=GarbageCollector,name=PS MarkSweep
MBean name: java.lang:type=MemoryPool,name=PS Old Gen
Connection closed.
BUILD SUCCESSFUL (total time: 1 second)
======================================================================
수고하셨습니다. *^^*

Netbeans-Korean by 강여사 - December 18, 2009 01:50 AM
넷빈(Netbeans)6.8에서 jax-rs 서버와 클라이언트 작성하기 01 - 서버

이번 예제에서는 넷빈 6.8에서 jax-rs 서버와 클라이언트를 둘다 해보도록 하겠습니다.

(현재 jax-rs 작성시 약간의 버그가 있습니다..버그는 수정될 꺼고..해서 문제를 피해 예제 샘플을 만들어보도록 하겠습니다).

우선 지난번 예제처럼 jax-rs 서버(RESTful Web Service)를 진행할텐데.. 나중에 소스 붙여넣기 좋도록 해당 프로젝트 명을 일치시켜 주시기 바랍니다.

이번 프로젝트에서 사용할 환경은

넷빈 6.8
글래스피시 v3 domain (EE6)
자바 DB (Derby의 sample 데이터베이스)

우선 새로 프로젝트를 만듭니다
파일- 새 프로젝트(new project)





Java Web - Web application , 다음 클릭


프로젝트 이름을 CustomerDB 라고 줍니다.


경로는 적당히


다음 클릭


서버를 글래스피시 v3 도메인으로 줬습니다.


EE 6 으로 (EE5와 EE6 모두 가능합니다)


마침 클릭


REST 웹 서비스를 데이터베이스에서 만들 예정인지라, 일단 퍼시스턴스 유닛부터 작성합니다.


프로젝트에서 오른쪽 마우스 클릭 - new - other



정보보존(persistence)에서 퍼시스턴스 유닛을 선택합니다,
다음 클릭



이름은 기본대로


이번엔 퍼시스턴스 제공자를 TopLink 로 줬습니다. (뭐 EclipseLink 로 줘도 상관없습니다)


테이블 전략은 없음으로


마침 클릭




이제 REST 웹 서비스를 만들도록 하겠습니다.


프로젝트에서 오른쪽 마우스 클릭 - new - other


Web Services - RESTful Web Services from Database 선택,


다음 클릭


데이터소스로 jdbc/sample (드래그 메뉴),


사용가능한 테이블에서 customer 만 추가 합니다. (그럼 discount_code는 자동 선택됩니다)


이 대목에서 모든 테이블을 선택해서 진행할 경우 purchaseorder 관련 버그가 있습니다. (EE6 에서)


다음 클릭



패키지 명이 필요합니다.
적당히 a 라고 줬습니다.
다음 클릭



헬퍼클래스가 각각의 패키지로 작업됩니다.


마침 클릭

EE6 의 경우 넷빈즈가 관련 서브클래스를 자동 생성하게 됩니다. 확인 창
OK


프로젝트를 서버에 배포(Deploy)합니다.

그런 후 프로젝트의 오른쪽 마우스를 클릭하여


Test RESTful Web Service 메뉴를 클릭합니다.



테스트페이지가 뜨면 customer 아래를 계속 확장하여 customerID에 1 값을 넣고 test 버튼을 누른 후 그림과 같이 아래 내용이 정상 출력되면 해당 REST 웹 서비스가 서비스되고 있다는 뜻입니다.


이제 다음 게시물에서 이 서비스를 사용한 클라이언트를 작성하도록 하겠습니다.

Netbeans-Korean by 강여사 - December 15, 2009 01:56 PM
넷빈(NetBeans) 6.8 설치(install) & 활성화(activate)

넷빈 설치를 시작하겠습니다.

우선, 다운로드를 해야겠죠. http://netbeans.org


다운로드 버튼 클릭



넷빈 6.7부터는 한국어판이 들어가고 있습니다. 저와 몇몇분들이 주도로..이번 6.8에는 비록 64%밖에 완성하질 못해서(좀 바빴습니다.--;;) 안타깝습니다만, 다음에는 더욱 노력하도록 하죠.

아무튼 적절히 언어판을 선택해서(그래도 한국어로 선택했습니다,저는.. ^^)본인 워크스테이션에 적절히 저장.(전체라고 되어 있는 걸 받고 설치시 취사선택할 수 있습니다)

그럼 저장이 완료되면 더블클릭합니다.


설치하고자하는 내용을 커스터마이즈 할 수 있습니다. '사용자화' 로 취사선택.. (버튼클릭)

톰캣은 기본에서 체크해제되어있어서 이거역시 설치시 설치하기 위해 체크했습니다. 확인

다시 재설정된 요약화면. 다음 클릭

약관에 동의(체크)하고 다음 클릭


넷빈만 따로 받을 경우(java.sun.com의 번들이 아닌 경우) 반드시 사전에 JDK가 설치되어 있어야 합니다. 그림에서처럼 제 컴퓨터에는 JDK6 update 17 이 설치되어 있고, 자동 탐지됩니다.

설치관련요약화면. 설치 클릭

톰캣의 위치 확인후 다음 클릭


글래스피시 v3 preview 설치 위치 확인후 클릭

이상이 설치입니다.

넷빈 6.7.1 과 비교하면 서버(runtime)이 썬 글래스피시 v3 preview 가 설치되고 따라서 v2.1.1 은 없어졌습니다. 기본 모듈로는

자바 SE
JavaFX
자바 웹과 EE
Java ME
루비
C/C++
그루비
PHP
번들 서버
Sun GlassFish Enterprise Server v3
Apache Tomcat 6.0.20

이군요..음..SOA?? --;;(플러그인 업데이트센터에도 없는..헐)

조만간 좀더 지켜봐야 겠습니다. ^^;; Fuji가 올라올지 어쩔지는..

아무튼, 설치는 저렇고. 설치가 완료되면 등록페이지등이 뜨는데 도움주면 넷빈이 기뻐할 사항이고, 안한다고 뭐라는 안합니다.

그보다, 예전과는 다른게 활성화인데.. 넷빈을 시작하고 무슨 프로젝트던 프로젝트를 시작(new project)를 해야 활성화(activate)가 됩니다. 설치되어 있어도 최초 시작시점까지는 활성화를 안하고 있죠.

javafx 를 하려면 new project로 javafx 카테고리에서 javafx application을 선택하면 activating...이 진행되며 잠시후 관련 모듈들이 정상 동작하게 됩니다. (이 대목에서 관련 메뉴가 늘어날 수도 있습니다.)

그럼 자 넷빈 6.8에 빠져봅시다~!

Netbeans-Korean by 강여사 - December 15, 2009 01:55 PM
넷빈(Netbeans)6.8에서 JAX-RS 사용하기(from Database)

이번에는 JAX-RS 에 대해 배워보도록 하겠습니다.
JAX-RS는 웹 서비스의 Resource 포커스인 RESTful Web Service를 위한 자바의 신기술입니다. 본격적으로 지원되는 건 JavaEE6 버전이지만 부분적으로 EE5 에서도 사용 가능합니다.

그럼 넷빈에서는 어떻게 사용하는 지 알아봅시다.

이번 예제에서는 데이터베이스로부터 JAX-RS까지의 작업을 일괄로 할 예정입니다.
데이터베이스는 JavaDB인 Derby의 sample 을 사용할 예정입니다.
그럼 우선 JavaDB를 시작합니다.
서비스-데이터베이스-JavaDB 오른쪽 마우스 클릭 - 서버 시작 을 누릅니다


JAX-RS를 공급할 서버 프로그램을 만듭니다. (프로젝트 탭으로 다시 돌아와서)
new project (새 프로젝트) JavaWeb - Web Application 선택 , 다음 클릭 이름은 적당히(자동으로 잡히는 이름에 끝에 jaxrs 라고 줬습니다 --;)



경로도 적당히 , 다음 클릭



서버는 글래스피시 V3 도메인으로 잡고, JavaEE 6 web으로 잡았습니다.
(하지만, EE5로 잡으셔도 이 작업은 정상적으로 됩니다)
마침 클릭
이제 JAX-RS를 위한 작업을 시작하도록 하겠습니다.



이번 예제에서는 데이터베이스에서 RESTful Web Service 를 바로 만들 예정인지라, 해당 작업을 위해서는 persistence.xml 이 사전에 작업되어 있어야 합니다.



따라서 persistence.xml 을 먼저 작업합니다.



프로젝트에서 오른쪽 마우스 클릭 - new - other persistence(정보보전)카테고리에서 persistence unit (퍼시스턴스 유닛) 선택



다음 클릭



이름이 해당 프로젝트 명+PU 라고 붙습니다. 그냥 그대로



제공자가 toplink(default:이전)에서 EclipseLink(JPA 2.0-default-새거)로 바꿨군요. 뭐..그냥 그대로,



데이터소스는 jdbc/sample (WAS인 글래스피시에 기본적으로 작업된 데이터소스입니다. )주고,



이미 있는 데이터베이스 테이블을 사용할 예정인지라 테이블 생성 전략(Table Create Strategy)는 none (없음)으로..



마침 클릭 이제 JAX-RS를 만들도록 하겠습니다.



다시 프로젝트에서 오른쪽 마우스 클릭 new - other 클릭



웹 서비스(Web Services)에 보면 RESTful Web Service from Database 가 있습니다.



선택 후 다음 클릭


데이터소스로 jdbc/sample을 지정하면 아래 사용가능한 테이블에 해당 스키마의 테이블들이 올라옵니다. 그럼 그 중 필요한 테이블들을 선택하면 됩니다

( 음.. 이 대목에서 캡처에 실수가..ㅋㅋ MYTABLE은 sample 에 원래 들어있는게 아니라 다른 예제때문에 들어간 거라는.. 넘 자세히 보시지 마세용~ ㅎㅎ) 아무튼 저는 모두 추가로 하고 다음 클릭


데이터베이스의 테이블에서 엔티티 클래스로의 전환이 표시 됩니다.



표시된 내용 확인 한후 적절한 패키지 명을 줍니다



(저는 그냥 a 라고 줬습니다) 다음 클릭 Helper 들이 만들어질 패키지 명 (헬퍼 클래스로는 service/와 converter/ 시리즈가 만들어집니다)


마침 클릭 그럼 다음과 같은 팝업창이 뜨는데, REST 리소스에 대한 구성입니다.



모든 REST 리소스들을 자동으로 넷빈이 생성해주는 첫번째가 디폴트고 이번엔 이걸로 그냥 작업했습니다.


경로 확인(/resource) OK 클릭


그럼 한참을 작업한 후 (자동 작업중 중간에 오류들이 올라올 수도 있습니다만, 그건 만들어지면서 서로 찾는 거라 다 끝나면 모든 오류없이 저렇게 구성되어 있습니다.



여기서 Source 패키지 안에 만들어진 java 를 열어 편집기에서 내용을 본 거고, 아래 RESTful WebServices 경로를 확장시켜 놓은 그림입니다.


이제 서버에 배포..Deploy




배포작업이 끝나면 해당 웹 서비스를 테스트 해볼 수가 있습니다.



프로젝트에서 오른쪽 마우스 - TEST RESTful Web Services 메뉴 클릭



그럼 웹 브라우저에 테스트 할 수 있도록 페이지가 연결됩니다.



여기서 원하는 내용을 테스트 하면 됩니다.



저는 아래쪽의 Product 에서 주욱 확장해서 productID 값 하나 넣는 걸로 테스트



productID 값으로 980001 을 주고 Test 버튼을 눌렀습니다.



아래 창에 해당 내용의 Resource URL 들이 REST가 공급되는 내용입니다.



나머지 사항들도 여러 뷰들로 확인해보시길.. 여기까지가 JAX-RS의 서버사이드 프로그래밍입니다.



이제 이걸로 클라이언트를 만들어 쓰면 되는데 가장 쉽고 뭔가 좀 그럴듯 한게 JMaki의 DOJO Table 이었는데 넷빈 6.8 에서 JMaki가 아직 정식 지원이 안되는 군요.. 음.. 노가다로 하기 시른데..쩝.. 노가다로 하려면야 JavaFX던 스윙이던 본인 맘대로 되지만..



아무튼.. 뭔가 올라오는 대로 글 만들어보도록 하겠습니다.

Netbeans-Korean by 강여사 - October 13, 2009 08:38 AM
Twitter SaaS를 사용한 Swing 프로그램 만들기

이번 게시물에는 Twitter를 사용한 GUI 프로그램을 만들어보도록 하겠습니다.
이 Twitter 시리즈는 나중에 JavaFX 기반의 모바일 프로젝트에도 가능합니다 ^^ Twitter 사용자의 많은 수가 iphone 유저라는 걸 보면 짐작이..^^
아무튼 Twitter를 비롯, 여러 오픈 SaaS가 있는데 이러한 식으로 사용하시면 됩니다.
넷빈에서 바로 연동되는 SaaS의 종류는 기본으로 Service 탭에 웹 서비스를 확장하시면 볼 수 있습니다.
프로젝트를 위해 http://twitter.com 에 회원가입을 하고 계정을 만들어두시기 바랍니다.

환경
넷빈즈 6.7.1
Twitter 계정 사용자이름/비밀번호

그럼 Twitter를 사용하는 GUI 클라이언트 프로그램 작업을 위해 새 프로젝트를 만듭니다.
File - new project

java - java application 다음

프로젝트 명: TwitterSwingClient
경로: 알아서
마침

GUI를 위해 프로젝트에서 마우스 오른쪽 클릭 - new - JFrame Form 선택

클래스명: TwitterJFrame
패키지명: twitter.ui
마침

디자인창에다 오른쪽 파레트로 부터 Label 과 TextField 그리고 버튼을 드래그하여 그림과 같이 배치합니다.
버튼에서 오른쪽 마우스를 클릭하면 Properties 메뉴가 보이는데 클릭하게되면 아래 그림과 같이 팝업창이 뜹니다.

text : Update 로 주고 엔터키를 치면 변경됩니다.


Label에서 다시 오른쪽 마우스를 클릭하여 Properties 를 클릭하면 등록정보에 대한 팝업창이 뜹니다. 여기서 text는 icon 으로, labelFor 에 옆의 드래그메뉴 중 jTextField1 를 선택합니다.
아래쪽으로 내려서 maximumSize , minimumSize, preferredSize 를 모두[48,48] 로 주고 requestFocusEnabled 체크를 해제합니다.
오른쪽에서 ScrollPane 를 선택해서 드래그해 놓습니다.
이 스크롤패인안에다 다시 List를 드래그해서 놓습니다
source 탭으로 변경하여 main 메소드 위에 공간을 띠우고 다음 메소드를 작성합니다.
========================================
private void initUserInfo() {


}
========================================
이번에는 Services 탭으로 가서 Web Services 를 확장하면(클릭) Twitter 가 나타납니다. 그럼 Twitter - What are you doing Service - statuses - user_timeline.{format} 안에 getUserTimeline를 선택하여 위 소스 부분의 빈 공간에 드래그합니다. 그럼 아래 그림과 같이 팝업창이 뜹니다.

여기에서 count 를 1로 format 를 xml 로 각각 입력한후 엔터키를 치면 변경됩니다.
OK

작성된 소스를 확인하면 다음과 같습니다.
==============================================
private void initUserInfo() {

try {
String since = null;
String sinceId = null;
String page = null;
String count = "1";
String format = "xml";

RestResponse result = TwitterWhatAreYouDoingService.getUserTimeline(since, sinceId, page, count, format);
if (result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses) {
twitter.whatareyoudoingservice.twitterresponse.Statuses resultObj = result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
} else if (result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.NilClasses) {
twitter.whatareyoudoingservice.twitterresponse.NilClasses resultObj = result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class);
}
//TODO - Uncomment the print Statement below to print result.
//System.out.println("The SaasService returned: "+result.getDataAsString());
} catch (Exception ex) {
ex.printStackTrace();
}

}
==============================================
여기 if 부분을 다음과 같이 수정합니다. (굵은 글씨 참조)
================================================
if (result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses){
twitter.whatareyoudoingservice.twitterresponse.Statuses resultObj = result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
StatusType st = resultObj.getStatus().get(0);
jTextField1.setText(st.getText().trim());
UserType user = st.getUser();
String iconSrc = user.getProfileImageUrl();
URL iconUrl = new URL(iconSrc);
ImageIcon icon = new ImageIcon(iconUrl, user.getScreenName());
jLabel1.setIcon(icon);

}
================================================
편집기의 빈공간에 오른쪽마우스를 클릭하여 fix import (단축키 Ctrl+Shift+I)를 클릭하여 임포트를 추가합니다. (java.net.URL)
클래스 위쪽의 생성자 부분에서 본 메소드를 추가호출합니다.(굵은 글씨 참조)
================================================
public class TwitterJFrame extends javax.swing.JFrame {

/** Creates new form TwitterJFrame */
public TwitterJFrame() {
initComponents();
initUserInfo();
}
================================================
실행하기 전에 Twitter 계정에 대한 설정(인증)작업을 합니다.

프로젝트의 Source Packages 아래 org.netbeans.saas.twitter 안에 보면 twitterwharareyoudoingserviceauthenticator.properties 가 있습니다. open으로 열어보면 username 과 password 가 있는데 각자 twitter 계정의 username과 password 를 적으시면 됩니다. 그런 다음 프로젝트를 실행합니다. - Run
메인클래스 설정을 위한 팝업창이 뜹니다. OK
일단 정상적으로 Swing 이 불려지면 이제 보다 자세한 코드 추가 작업들을 하겠습니다.

버튼 클릭시 update 를 위해 버튼 디자인에서 더블클릭을 하면 소스탭으로 옮겨집니다. 그럼 여기에 다시 Twitter의 updateStatus 오퍼레이션을 불러옵니다.

Twitter-What Are You Doing Service - statuses - update.{format} - updateStatus 를 드래그합니다. 그럼 아래그림처럼 팝업창이 뜨고 OK 한 후 코드 수정작업을 합니다. 자동 생성된 코드에서 String status = ""; 부분은 다음과 같이 변경합니다.
String status = jTextField1.getText().trim();


GUI에서 사용자이름과 상태를 표시하기 위해 Timer 작업을 추가합니다.
TimerTask를 추가하는 방법은 다음과 같습니다.
생성자 부분에 다음과 같이 Timer를 추가합니다. (굵은 글씨 참조)
===============================================
public class TwitterJFrame extends javax.swing.JFrame {

/** Creates new form TwitterJFrame */
public TwitterJFrame() {
Timer t = new Timer("Twitter Updater`", false); initComponents();
initUserInfo();
}
===============================================
임포트를 위해 fix import를 합니다. (java.util.Timer)

그런 다음 다음 코드를 추가 삽입합니다
===================================
public class TwitterJFrame extends javax.swing.JFrame {

/** Creates new form TwitterJFrame */
public TwitterJFrame() {
Timer t = new Timer("Twitter Updater`", false);
t.scheduleAtFixedRate(new TimerTask() {


}, 1500, 75000);

initComponents();
initUserInfo();
}
===================================

getPublicTimeline 오퍼레이션과 함께 run 메소드를 추가합니다.
우선 리스트에 대한 모델 작업부터 합니다.
클래스 선언 아래 다음 코드를 추가합니다. (굵은 글씨 참조)
====================================
public class TwitterJFrame extends javax.swing.JFrame {

private DefaultListModel statuses = new DefaultListModel();


/** Creates new form TwitterJFrame */
public TwitterJFrame() {

====================================
TimerTask 객체안에 새 run() 메소드를 오버라이드 합니다. (굵은 글씨 참조)
====================================
/** Creates new form TwitterJFrame */
public TwitterJFrame() {
Timer t = new Timer("Twitter Updater`", false); t.scheduleAtFixedRate(new TimerTask() {

@Override public void run(){

}

}, 1500, 75000); initComponents();
initUserInfo();
}
====================================

그런 다음 이 부분에 getPublicTimeline 오퍼레이션을 추가합니다.

Twitter - What Are You Doing Service - statuses - [public_timeline.{format} - getPublicTimeline 드래그

팝업창에 xml 을 입력하고 엔터키로 변경한 후 OK

생성된 소스 확인==================================
public TwitterJFrame() {
Timer t = new Timer("Twitter Updater`", false);
t.scheduleAtFixedRate(new TimerTask() {

@Override
public void run() {

try {
String format2 = "xml";

RestResponse result2 = TwitterWhatAreYouDoingService.getPublicTimeline(format2);
if (result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses) {
twitter.whatareyoudoingservice.twitterresponse.Statuses result2Obj = result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
} else if (result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.NilClasses) {
twitter.whatareyoudoingservice.twitterresponse.NilClasses result2Obj = result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class);
}
//TODO - Uncomment the print Statement below to print result.
//System.out.println("The SaasService returned: "+result2.getDataAsString());
} catch (Exception ex) {
ex.printStackTrace();
}

}

}, 1500, 75000);
initComponents();
initUserInfo();
}
==================================
if 부분에 다음 코드 추가 (굵은 글씨 참조)
==================================
if (result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses) {
twitter.whatareyoudoingservice.twitterresponse.Statuses result2Obj = result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
for (final StatusType st : result2Obj.getStatus()) {
SwingUtilities.invokeLater(new Runnable() {

public void run() {
statuses.addElement(st);
}
});
}
}
==================================
리스트 셀 렌더링을 위한 컴포넌트를 만들겠습니다.

프로젝트에서 오른쪽 마우스 클릭 - new - JPanel Form

클래스 이름: Item
패키지 이름: twitter.ui
마침

Label을 드래그해서 username 이라고 적어줍니다.

그리고 그 아래 Text Pane 를 드래그해서 놓습니다. Text Pane 의 text 는 status text 라고 입력후 엔터키로 반영(그림 오른쪽 아래)

username 의 label에서 오른쪽 마우스를 클릭하면 프로퍼티(등록정보)메뉴가 있습니다. 클릭
labelFor 에 jTextPane1를 선택하고

foreground 에는 파란색 [0,51,255] RGB 값을 입력합니다.

source 탭을 클릭하여 클래스 선언에 리스트셀렌더러 인터페이스를 붙입니다.

public class Item extends javax.swing.JPanel implements ListCellRenderer {



임포트를 수정합니다. fix import (Ctrl+Shift+I) javax.swing.ListCellRenderer

그런 다음 다음 메소드를 추가합니다.
======================================================
public Component getListCellRendererComponent(JList list, Object value, int index, boolean sel, boolean focus) {
StatusType st = (StatusType) value;
jTextPane1.setText(st.getText());
jLabel1.setText("" + st.getUser().getScreenName() + "");
return this;
}
======================================================

다시 fix import
이제 list 부분을 편집하도록 하겠습니다. 디자인창에서 list를 클릭하여 오른쪽 마우스 클릭 - 등록정보

팝업창이 뜨면 model 이 있습니다. 여기서 오른쪽의 ... 을 클릭합니다.

그럼 list 설정 팝업창이 뜹니다. 여기에서 위의 드래그 메뉴를 Custom code 로 선택합니다.


그럼 아래 설정부분이 제시되는데 거기에 statuses 라고 입력합니다. (그림 참조)
OK

이번에는 cellRenderer 에서 ... 을 클릭하면 등록정보 창이 뜹니다.
역시 custom code 로 바꾼 후 빈칸에 new Item() 이라고 적습니다
OK

이상이 프로젝트 작업 끝입니다.

실행하면 (run) 아래 그림 처럼 twitter 가 제시됩니다.

참고로 아래 아이콘은 twitter에 등록된 제 아이디의 아이콘이 나타납니다. (넷빈로고라는..ㅋㅋ)

수고하셨습니다. *^^*

Netbeans-Korean by 강여사 - October 10, 2009 02:24 PM
넷빈즈 6.7.1에서 Mysql 사용하기 및 Sakila DB 설치하기

이번 게시물에는 넷빈즈에서 Mysql 을 어떻게 등록하여 사용하는지와 추후 프로젝트 게시물을 위한 샘플 DB(Sakila)를 설치해보도록 하겠습니다.

환경:
넷빈즈 6.7.1
Mysql 5.1 GA win32
sakila (플러그인 센터로 추후 설치)

우선 MySql은 설치되어 있다고 가정하겠습니다. (mysql 설치는 기타 서핑을 통해 하시기 바랍니다. 간단한 지시사항으로는 http://www.mysql.com 에서 download (http://dev.mysql.com/downloads/mysql/5.1.html#downloads)각 OS에 맞는 버전을 다운로드 받은 후 설치하시면 됩니다. 기본 설치(default)로 진행하되 설정마법사(configuration wizard) 진행시 언어설정을 manual-utf8 로 주게되면 추후 한글작업이 보다 수월해집니다. 다른 사항은 적당히 알아서.. ^^;)

그럼 설치가 끝난후 넷빈즈에 Mysql을 등록하는 방법부터 진행합니다.
Service - Database 에서 오른쪽 마우스를 클릭하면 Register MySQL Server 메뉴가 있습니다. 클릭


관리자에 대한 비밀번호를 적어줍니다. (관리자의 비밀번호는 설치시 지정한 내용을 적으시면 됩니다)
저는 넷빈즈에서 바로 SQL를 시작, 중지 시키고자 Basic Properties 탭 옆에 Admin Properties 탭 설정도 함께 했습니다. 메뉴는 다음과 같이 설정하시면 됩니다.

우선 Path/URL to admin tool: $MYSQL_HOME/bin/mysqladmin.exe
Argument 에는 -u root -ppass(pass가 저의 비밀번호입니다.각자비밀번호를 적으세요) version (version이외 status 등 여러 arguments들을 적으시면 해당 내용이 나타납니다)

MySql 시작과 종료는 윈도우의 net 메뉴를 사용합니다.
따라서 Path to start Command: C:/Windows/System32/net.exe 를 브라우저에서 찾아 넣고
Arguments 로 start mysql를,

Path to stop Command: C:/Windows/System32/net.exe 를 브라우저에서 찾아 넣고
Arguments 로 stop mysql를 적으시면 됩니다.

OK

이제 mysql 에 샘플 데이터베이스를 추가설치하도록 하겠습니다. (이 작업은 추후 Mysql 연동 프로젝트에서 샘플 DB로 사용할 예정이라 추가하는 것입니다.)

샘플데이터베이스의 스키마 파일을 따로 받으실 수도 있고, 넷빈즈의 플러그인 센터를 통해 작업할 수도 있습니다.
저는 후자를 선택했습니다.
도구-플러그인

Sakila DB 플러그인 선택 - 설치 클릭
다음
동의 체크후 다음

마침
Services 탭에서 Database- Mysql 에서 오른쪽 마우스 클릭
create Database... 메뉴 선택

새 데이터베이스 이름은 sakila
OK
그럼 팝업창이 뜨는데 거기서 yes (이 그림 캡처는 못했습니다. 깜박 잊어버리고 바로 눌렀다는..쩝.. --; ) 아무튼 그렇게 되면 주욱~ 설치가 완료된 후 저렇게 sakila 데이터베이스가 보입니다.
sakila- table - actor 에서 마우스 오른쪽 클릭 - view data 클릭

select 문이 호출되고 actor 내용이 출력됩니다


이상이 mysql 사용 및 sakila DB 설치였습니다.

Netbeans-Korean by 강여사 - October 10, 2009 02:23 PM
넷빈 6.7.1에서 하이버네이트 사용하기-SwingGUI

이번에 올릴 내용은 하이버네이트(hibernate) 프레임워크 사용에 관한 내용입니다.
하이버네이트는 DB 프레임워크중 하나로 자바 환경에서 객체/관계형 매핑 도구입니다. 이러한 ORM(Object/Relational Mapping, ORM)이라는 용어는 객체 모델을 SQL 기반의 스키마를 사용해서 관계형 데이터 모델로 데이터 표현을 매핑하는 기술을 가르킵니다.
이러한 ORM 으로는 Toplink(http://www.oracle.com/technology/global/kr/products/ias/toplink/index.html)와 eclipselink(www.eclipse.org/eclipselink) 등이 있습니다. SQL Mapper의 iBatis (http://ibatis.apache.org/index.html) 도 있구요. 자세한 내용은 해당 사이트 등을 참고하시기 바랍니다.
넷빈 6.7.1에는 위에 언급한 3개의 ORM이 넷빈에 기본적으로 포함되어 있습니다. 따라서 많은 부분 작업이 수월하게 진행됩니다. 그러한 방법을 앞으로 스윙(SwingGUI), 웹 등 기타 프로젝트를 통해 살펴보도록 하겠습니다.

우선 이 프로젝트에서는 Mysql 데이터베이스 서버와 샘플 데이터베이스 Sakila 를 사용합니다. 따라서 이러한 설정에 대해서는 이전 게시물을 참조하시기 바랍니다.

환경
넷빈즈 6.7.1
데이터베이스 서버 Mysql 5.1
샘플데이터베이스 Sakila

그럼 프로젝트를 시작하겠습니다.
File - new project



Java - Java Application 다음

프로젝트 이름: DVDStoreAdmin
경로는 적당히
마침
프로젝트에서 마우스 오른쪽 클릭
new - other
Hibernate - Hibernate Configuration Wizard 클릭 - 다음
파일이름: hibernate.cfg (기본) - 다음
데이터베이스 커넥션을 sakila 커넥션으로 (드래그메뉴에서 선택)jdbc:mysql://localhost:3306/sakila
마침
프로젝트의 libraries 에 hibernate 관련 파일들이 추가된 것을 볼 수 있습니다.
오른쪽 편집기 메뉴(Design) 에서 Configuration Properties 를 확장한 후 add 버튼 클릭

드래그메뉴에서 hibernate_show.sql 선택 - true - OK

(이 작업으로 하이버네이트의 SQL 이 console 창에 나타나게 됩니다) XML 탭 클릭 - design 으로 작업된 내용 확인
프로젝트에서 마우스 오른쪽 클릭 - new - other
Hibernate - Hibernate Util.java 클릭
클래스 이름은 HibernateUtil
마침
프로젝트에서 마우스 오른쪽 클릭 - new - other
Hibernate - Hibernate Reverse Engineering Wizard - 다음
파일 이름: hibernate.reverg (기본)
다음

Configuration File: hibernate.cfg.xml
Available Tables 의 actor 를 선택(add) - 그림 참조
마침
만들어진 xml 확인
프로젝트에서 마우스 오른쪽 클릭 - new - other

Hibernate - Hibernate Mapping file and POJOs from Databases... 선택
다음

그림을 참고하여 xml 파일 설정(기본), Code Generation Settings: 아래 2개 선택
Package 이름은 sakila.entity 로 줬슴
마침

내용 확인
이제 프로젝트의 UI 를 만듭니다.

프로젝트에서 마우스 오른쪽 클릭 - new - JFrame Form 선택


클래스 이름은: DVDStoreAdmin
패키지 이름은: sakila.ui
마침


JLabel을 3개 끌어다 Actor Profile, first Name:, last Name: 등으로 text 변경
JTextField 를 2개 끌어다 first Name: 옆에 하나, last Name 옆에 하나 놓는다.
JButton 1개 끌어다 last Name 텍스트필드 옆에 놓습니다.
Table도 하나 끌어다 아래에 위치
각 요소 의 var 변경을 위해 해당 컴포넌트에서 마우스 오른쪽 클릭 - Change Variable Name 클릭

컴포넌트 요소(기본) -> 변경할 variable 이름
jTextField1 -> firstNameTextField
jTextField2 -> lastNameTextField
jButton1 -> queryButton
jTable1 -> resultTable








텍스트필드안의 내용을 지우고자 할때에는 오른쪽의 properties 창에서 text 안에 글을 지우고 Enter 키를 입력하여 변경사항을 반영하면 됩니다.
하이버네이스 쿼리수행을 위해

default package 의 hibernate.cfg.xml 에서 마우스오른쪽을 클릭 - Run HQL Query 선택

오른쪽에 제시된 창에
from Actor 를 입력(타이핑)하고 위의 run 아이콘을 누르면 해당 쿼리 결과(result)가 출력

result 옆에 탭인 SQL 를 선택하여 HQL 쿼리 확인
위의 쿼리를 변경하면 잠시후 아래 SQL 이 변경됨을 알 수 있습니다.
from Actor a where a.firstName like 'PE%'

or
from Actor a where a.lastName like 'MO%'

이제 FORM 클래스 편집을 위해 sakila.ui 의 DVDStoreAdmin.java 의 source 탭 클릭

생성자 아래에 2개의 쿼리 문자열 추가
private static String QUERY_BASED_ON_FIRST_NAME="from Actor a where a.firstName like '";
private static String QUERY_BASED_ON_LAST_NAME="from Actor a where a.lastName like '";

아래 메소드 들 추가
==========================
private void runQueryBasedOnFirstName() {
executeHQLQuery(QUERY_BASED_ON_FIRST_NAME + firstNameTextField.getText() + "%'");
}

private void runQueryBasedOnLastName() {
executeHQLQuery(QUERY_BASED_ON_LAST_NAME + lastNameTextField.getText() + "%'");
}
private void executeHQLQuery(String hql) {
try {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Query q = session.createQuery(hql);
List resultList = q.list();
displayResult(resultList);
session.getTransaction().commit();
} catch (HibernateException he) {
he.printStackTrace();
}
}

==========================

임포트 문제 해결을 위해 공백에서 마우스 오른쪽 클릭 - fix import 선택
클래스 선택
(org.hibernate.Query, org.hibernate.Session) and java.util.List )
OK

버튼에 이벤트 작업을 하기 위해 Design 탭에서 JButton을 클릭하면 source의 메소드 편집창이 나타납니다.
다음 내용 추가
======================================
if(!firstNameTextField.getText().trim().equals("")) {
runQueryBasedOnFirstName();
} else if(!lastNameTextField.getText().trim().equals("")) {
runQueryBasedOnLastName();
}
======================================
다음 메소드 추가
=======================================
private void displayResult(List resultList) {
Vector tableHeaders = new Vector();
Vector tableData = new Vector();
tableHeaders.add("ActorId");
tableHeaders.add("FirstName");
tableHeaders.add("LastName");
tableHeaders.add("LastUpdated");

for(Object o : resultList) {
Actor actor = (Actor)o;
Vector<object>
oneRow = new Vector<object>();
oneRow.add(actor.getActorId());
oneRow.add(actor.getFirstName());
oneRow.add(actor.getLastName());
oneRow.add(actor.getLastUpdate());
tableData.add(oneRow);
}
resultTable.setModel(new DefaultTableModel(tableData, tableHeaders));
}
=======================================
임포트 해결을 위해 fix import
(java.util.Vector)
프로젝트 실행 - run
main 클래스 설정 - OK
테스트:

Swing 창에서 first Name 의 텍스트 필드에 Pe 로 적고 버튼을 클릭하면 Pe로 시작되는 actor에 대해 아래 테이블에 나타납니다.

이상이 간단히 알아본 하이버네이트 사용 - Swing 프로젝트입니다.

다음에는 웹 어플리케이션으로 하이버네이트를 사용해보도록 하겠습니다.

기타 여러 쿼리 수행문들을 응용해보시기 바랍니다.

수고하셨습니다. *^^*

Netbeans-Korean by 강여사 - September 04, 2009 06:14 AM
솔라리스(Solaris)10 에서 썬글래스피시v2.1HADB 설치

솔라리스10 기본설치를 하게되면 AS(Sun Java Application Server 8.2)가 번들로 설치된다.
확인 방법은 다음과 같다.
# asadmin
asadmin>version
확인이 끝나면 exit 로 프롬프트로 돌아온다.





서버관련 패키지 확인
#pkgchk -l -p /usr/appserver


#pkgchk -l -p /usr/appserver/javadb


설치된 패키지 삭제
# pkgrm SUNWasac SUNWascmn SUNWasjdoc SUNWasman SUNWasr SUNWasu SUNWasjavadb SUNWasut


y 로 진행(all)












패키지 삭제 및 서버 삭제 확인
#asadmin
아까와는 달리 인식 안됨(없음)

썬에서 다운로드 받은 파일 실행
http://developers.sun.com/appserver/downloads/index.jsp
Sun GlassFish Enterprise Server v2.1 with HADB 다운로드 후 적절한 경로에 놓는다.
(예. /opt/ses/software/ ...)

설치실행
# chmod +x sges_ee-2_1-solaris-i586-ml.bin
# ./sges_ee-2_1-solaris-i586-ml.bin








비밀번호는 adminadmin 으로 (default)



아까 패키지를 지운후 바로가기가 안되므로
루트셀을 변경하고 프로파일에 PATH 추가
# vi /etc/passwd


root 의 로그인셀을 /sbin/sh 에서 /bin/ksh 로 변경


그리고 프로파일 작성
# cd /
# vi .profile


프로파일 내용
export PATH=$PATH:.:/opt/SUNWappserver/bin
저장 후 다시 로그인


다시 asadmin 확인
버전 확인

# asamdin
asadmin> version



도메인 확인 및 시작
asadmin> list-domains
asadmin> start-domain domain1


도메인이 시작되면 웹 브라우저를 열어 확인
http://localhost:4848



Netbeans-Korean by 강여사 - June 14, 2009 02:47 AM
솔라리스 OS 와 리눅스 환경에서 자바 SE 6 에 대한 문제 해결(Troubleshooting) 가이드 팁(Quick Guide)

본 문서는 "퀵 스타트 가이드"로 문제 해결(troubleshooting)을 위한 몇 가지 빠른 도움말을 제공합니다. 즉, 정보를 얻기 위해 작업을 수행하거나 하나 이상의 방법을 포함한 문제 해결에 도움이되는 몇 가지 일반적인 기능을 나열합니다.

이러한 요령으로 구성은 다음과 같습니다 : (해당 주제별)

  • 행(Hung), 데드락(Deadlocked), 또는 루핑(Looping) 프로세스
  • 사후 진단(Post-mortem Diagnostics), 메모리 누수(Leaks)
  • 모니터링
  • 원격 디버그 서버 상의 액션(Actions)
  • 기타 기능

행(Hung), 데드락(Deadlocked), 또는 루핑(Looping) 프로세스

  • 출력 쓰레드 모든 Java 쓰레드에 대한 스택 :
    • Control-\
    • kill-QUIT pid
    • jstack pid (또는 jstack -F pid , 만약 jstack pid가 응답하지 않으면)
  • 교착 상태를 감지 :
    • 교착 상태 감지 요청: JConsole 툴, 쓰레드 탭(tab)
    • 쓰레드 교착 상태에 정보 출력 : Control-\
    • 각각의 쓰레드가 소유한 동시 잠금 목록 출력: -XX:+PrintConcurrentLocks 세트, 그 후 Control-\
    • 프로세스에 대한 잠금 정보 출력 : jstack -l pid 명령
  • 프로세스에 대한 힙 히스토그램(heap histrogram) 가져오기 :
    • 자바 프로세스를 다음 옵션으로 시작 -XX:+PrintClassHistogram, 그 후 Control-\
    • jmap -histo 명령 (만약 pid 응답이 없으면 -F 옵션 추가)
  • 프로세스에 대한 자바 힙 덤프를 바이너리 형식의 파일에 덤프 뜨기:
    • jmap –dump: format=b,file=filename pid (만약 pid 응답이 없으면 -F 옵션 추가)
  • 프로세스를 위한 공유된 객체 매핑 출력
    • jmap pid
  • 프로세스를 위한 힙 요약정보 출력
    • Control-\
    • jmap -heap pid
  • 프로세스를 위한 종료자(finalization) 정보 출력
    • jmap -finalizerinfo pid
  • 프로세스에 명령어 디버거 붙이기(attach)
    • jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=pid jmap -histo 명령

사후 진단, (Post-mortem Diagnostics), 메모리 누수(Memory Leaks)

  • 치명적인 오류 로그 파일을 검사합니다. 기본 파일 이름은 hs_err_pidpid.log 로 작업 디렉토리에 들어있습니다.
  • 힙 덤프(heap dump) 생성 :
    • HPROF 활성시켜 응용 프로그램 시작: java -agentlib:hprof=file=file,format=b application; 그후 Control-Break파일
    • HPROF 활성시켜 응용 프로그램 시작: java -agentlib:hprof=heap=dump application
    • JConsole 툴에서 MBeans 탭
    • 다음 옵션으로 VM 시작 -XX:+HeapDumpOnOutOfMemoryError;; OutOfMemoryError 가 던져지면, VM은 힙 덤프(heap dump)를 자동 생성합니다.
  • 자바 힙 덤프 보기(Browse) :
    • jhat heap-dump-file
  • 프로세스에 대한 힙 히스토그램 가져오기:
    • 다음 옵션으로 자바 프로세스 시작: -XX:+PrintClassHistogram, 그후 Control-Break
    • jmap -histo pid (만약 pid 응답이 없으면 -F 옵션 추가)
  • 코어 파일로부터 힙 히스토그램 가져오기:
    • jmap -histo corefile
  • 코어 파일로부터 공유된 객체 매핑 출력:
    • jmap corefile
  • 코어 파일로부터 힙 요약정보 출력:
    • jmap -heap corefile
  • 코어 파일로부터 종료자(finalization) 정보 출력:
    • jmap -finalizerinfo corefile
  • 코어 파일로부터 자바 설정 정보 출력:
    • jinfo corefile
  • 코어 파일로부터 쓰레드 추적 출력:
    • jstack corefile
  • 코어 파일로부터 잠금 정보 출력:
    • jstack -l corefile
  • 같은 머신 상에서 코어 파일에 명령어 디버거 붙이기(attach):
    • jdb -connect sun.jvm.hotspot.jdi.SACoreAttachingConnector:javaExecutable=path,core=corefile
  • 서로 다른 머신상에서 코어 파일에 명령어 디버거 붙이기(attach):
    • 코어 파일을 가진 쪽: jsadebugd path corefile
    • 디버거를 가진 쪽: jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=machine
  • libumem 은 메모리 누수를 디버그하기 위해 사용될 수 있다.


 

모니터링 (jstat 윈도우 98이나 윈도우 ME에서 사용할 수 없습니다.)

참고 : jstat 명령에 대한 인수는 가상 머신 vmID 식별자입니다. jstat man 페이지를 참조하십시오

자세한 설명

  • 클래스 로더에 통계 출력 :
    • jstat -class vmID
  • 컴파일러에 대한 통계 출력 :
    • 컴파일러 동작 : jstat -compiler vmID
    • 컴파일 메소드에 대한 통계 : jstat - printcompilation vmID
  • 가비지 컬렉션에 통계 출력 :
    • 요약 통계 : jstat -gcutil vmID
    • 오류 포함, 요약 통계 : jstat - gccause vmID
    • GC의 힙 동작(behavior) : jstat -gc vmID
    • 모든 generations 용량 : jstat -gccapacity vmID
    • new generation 동작: jstat -gcnew vmID
    • new generation 용량: jstat -gcnewcapacity vmID
    • old 와 permanent generations 동작: jstat -gcold vmID
    • old generations 용량 : jstat -gcoldcapacity vmID
    • permanent generations 용량: jstat -gcpermcapacity vmID
  • finalization를 기다리는 개체 모니터링:
    • JConsole 툴, VM 요약 탭
    • jmap -finalizerinfo pid
    • java.lang.management.MemoryMXBean 클래스 안에 있는 getObjectPendingFinalizationCount 메소드
  • 메모리 모니터 :
    • HPROF를 통해 힙 할당 프로필(profiles) : java -agentlib:hprof=heap=sites
    • JConsole 툴, 메모리 탭
    • Control – Break 는 generation 정보 출력
  • CPU 사용률 모니터 :
    • 쓰레드 스택 관련 : java -agentlib:hprof=cpu=samples application
    • 메소드 관련 : java -agentlib:hprof=cpu=times application
    • JConsole 툴, 개요 및 VM을 요약 탭
  • 쓰레드 활동 모니터 :
    • JConsole 툴, 쓰레드 탭
  • 클래스 액티비티 모니터 :
    • JConsole 툴, 클래스 탭

원격 디버그 서버 위의 액션(actions)

  • 우선,디버그 데몬 jsadebugd 부르고, 그 후 명령 실행: jmap -dump:format=b,file=filename hostID
    • 이진 포맷의 자바 힙을 파일에 덤프:
    • 공유된 객체 매핑 출력: jmap hostID
    • 힙 요약정보 출력 jmap -heap hostID
    • 종료자 정보 출력: jmap -finalizerinfo hostID
    • 잠금 정보 출력: jstack -l hostID
    • 쓰레드 추적 출력: jstack hostID
    • 자바 설정 정보 출력: jinfo hostID

기타 기능

  • instrumented 자바 가상 머신 인터페이스 :
    • instrumented VMs (Windows 98이나 Windows ME 불가) 생성 및 종료 모니터 : jstatd daemon
    • instrumented VMs (Windows 98이나 Windows ME 불가) 목록 : jps
    • 원격 모니터링 툴 및 로컬 VM 간 인터페이스 제공 (Windows 98 이나 Windows ME 불가) : jstatd daemon
    • 가비지 컬렉션 요청 : JConsole 툴, 메모리 탭
  • 프로세스의 특정 자바 VM 플래그(flags) 값 동적 설정, 해제, 또는 변경 :
    • jinfo -flag flag pid
  • 가상 머신에 Java VM 플래그(flag) 전달하기 :
    • jconsole -Jflag ...
    • jhat -Jflag ...
    • jmap -Jflag ...
  • 클래스 로더에 의한, 자바 힙의 영속 제너레이션 통계 출력
    • jmap -permstat
  • 모니터 경합 보고 :
    • java -agentlib:hprof=monitor=y application
  • 대화식(interactive) 모드 또는 일괄처리(batch) 모드로 스크립트 평가 또는 실행 :
    • jrunscript
  • MBean 동적 인터페이스, JConsole 툴 탭을 통해 MBean :
    • 트리 구조 보기.
    • 속성 값 설정.
    • 작업(operation) 호출.
    • 알림(notification) 설정(subscribe)
  • 대화식 명령 - 라인 디버거 실행 :
    • 클래스에 대한 새 VM이 : jdb class
    • 실행중인 VM에 디버거 첨부 : jdb –attach address

Netbeans-Korean by 강여사 - June 01, 2009 11:17 AM
윈도우 환경에서 자바 SE 6 에 대한 문제 해결(Troubleshooting) 가이트 팁(Quick Guide)

본 문서는 "퀵 스타트 가이드"로 문제 해결(troubleshooting)을 위한 몇 가지 빠른 도움말을 제공합니다. 즉, 정보를 얻기 위해 작업을 수행하거나 하나 이상의 방법을 포함한 문제 해결에 도움이되는 몇 가지 일반적인 기능을 나열합니다.

이러한 요령으로 구성은 다음과 같습니다 : (해당 주제별)

  • 행(Hung), 데드락(Deadlocked), 또는 루핑(Looping) 프로세스
  • 사후 진단(Post-mortem Diagnostics), 메모리 누수(Leaks)
  • 모니터링
  • 기타 기능

행(Hung), 데드락(Deadlocked), 또는 루핑(Looping) 프로세스

  • 출력 쓰레드 모든 Java 쓰레드에 대한 스택 :

    • Control-Break
    • jstack pid 명령
  • 교착 상태를 감지 :

    • 교착 상태 감지 요청: JConsole 툴, 쓰레드 탭(tab)
    • 쓰레드 교착 상태에 정보 출력 : Control-Break
    • 프로세스에 대한 잠금 정보 출력 : jstack -l pid 명령
  • 프로세스에 대한 힙 히스토그램(heap histrogram) 가져오기 :

    • 자바 프로세스를 다음 옵션으로 시작 -XX:+PrintClassHistogram, 그후 Control-Break
    • jmap -histo 명령
    • 프로세스에 대한 자바 힙 덤프를 바이너리 형식의 파일에 덤프 뜨기:
    • jmap –dump: format=b,file=filename pid

사후 진단, (Post-mortem Diagnostics), 메모리 누수(Memory Leaks)

  • 치명적인 오류 로그 파일을 검사합니다. 기본 파일 이름은 hs_err_pidpid.log 로 작업 디렉토리에 들어있습니다.
  • 힙 덤프(heap dump) 생성 :

    • HPROF 활성시켜 응용 프로그램 시작: java -agentlib:hprof=file=file,format=b application; 그후 Control-Break파일
    • HPROF 활성시켜 응용 프로그램 시작: java -agentlib:hprof=heap=dump application
    • JConsole 툴에서 MBeans 탭
    • 다음 옵션으로 VM 시작 -XX:+HeapDumpOnOutOfMemoryError;; OutOfMemoryError 가 던져지면, VM은 힙 덤프(heap dump)를 자동 생성합니다.
  • 자바 힙 덤프 보기(Browse) :

    • jhat heap-dump-file
  • 프로세스에 대한 힙 히스토그램 가져오기:

    • 다음 옵션으로 자바 프로세스 시작: -XX:+PrintClassHistogram, 그후 Control-Break
    • jmap -histo pid
  • 모니터링 (jstat 윈도우 98이나 윈도우 ME에서 사용할 수없습니다.)

참고 : jstat 명령에 대한 인수는 가상 머신 vmID 식별자입니다. jstat man 페이지를 참조하십시오

자세한 설명

  • 클래스 로더에 통계 출력 :

    • jstat -class vmID
  • 컴파일러에 대한 통계 출력 :

    • 컴파일러 동작 : jstat -compiler vmID
    • 컴파일 메소드에 대한 통계 : jstat - printcompilation vmID
  • 가비지 컬렉션에 통계 출력 :

    • 요약 통계 : jstat -gcutil vmID
    • 오류 포함, 요약 통계 : jstat - gccause vmID
    • GC의 힙 동작(behavior) : jstat -gc vmID
    • 모든 generations 용량 : jstat -gccapacity vmID
    • new generation 동작: jstat -gcnew vmID
    • new generation 용량: jstat -gcnewcapacity vmID
    • old 와 permanent generations 동작: jstat -gcold vmID
    • old generations 용량 : jstat -gcoldcapacity vmID
    • permanent generations 용량: jstat -gcpermcapacity vmID
  • finalization를 기다리는 개체 모니터링:

    • JConsole 툴, VM 요약 탭
    • java.lang.management.MemoryMXBean 클래스 안에 있는getObjectPendingFinalizationCount 메소드
  • 메모리 모니터 :

    • HPROF를 통해 힙 할당 프로필(profiles) : java -agentlib:hprof=heap=sites
    • JConsole 툴, 메모리 탭
    • Control – Break 는 generation 정보 출력
  • CPU 사용률 모니터 :

    • 쓰레드 스택 관련 : java -agentlib:hprof=cpu=samples application
    • 메소드 관련 : java -agentlib:hprof=cpu=times application
    • JConsole 툴, 개요 및 VM을 요약 탭
  • 쓰레드 활동 모니터 :

    • JConsole 툴, 쓰레드 탭
  • 클래스 액티비티 모니터 :

    • JConsole 툴, 클래스 탭

기타 기능

  • instrumented 자바 가상 머신 인터페이스 :

    • instrumented VMs (Windows 98이나 Windows ME 불가) 생성 및 종료 모니터 : jstatd daemon
    • instrumented VMs (Windows 98이나 Windows ME 불가) 목록 : jps
    • 원격 모니터링 툴 및 로컬 VM 간 인터페이스 제공 (Windows 98 이나 Windows ME 불가) : jstatd daemon
    • 가비지 컬렉션 요청 : JConsole 툴, 메모리 탭
  • 프로세스의 특정 자바 VM 플래그(flags) 값 동적 설정, 해제, 또는 변경 :

    • jinfo -flag flag pid
  • 가상 머신에 Java VM 플래그(flag) 전달하기 :

    • jconsole -Jflag ...
    • jhat -Jflag ...
  • 모니터 경합 보고 :

    • java -agentlib:hprof=monitor=y application
  • 대화식(interactive) 모드 또는 일괄처리(batch) 모드로 스크립트 평가 또는 실행 :

    • jrunscript
  • MBean 동적 인터페이스, JConsole 툴 탭을 통해 MBean :

    • 트리 구조 보기.
    • 속성 값 설정.
    • 작업(operation) 호출.
    • 알림(notification) 설정(subscribe)
  • 대화식 명령 - 라인 디버거 실행 :

    • 클래스에 대한 새 VM이 : jdb class
    • 실행중인 VM에 디버거 첨부 : jdb –attach address

Netbeans-Korean by 강여사 - June 01, 2009 07:17 AM
윈도우 환경에서 자바 SE 6 에 대한 문제 해결(Troubleshooting) 가이트 팁(Quick Guide)

본 문서는 This "Quick Start Guide" gives you some quick tips for troubleshooting. The subsections list some typical functions that can help you in troubleshooting, including one or more ways to get the information or perform the action."퀵 스타트 가이드"로 문제 해결(troubleshooting)을 위한 몇 가지 빠른 도움말을 제공합니다. 즉, 정보를 얻기 위해 작업을 수행하거나 하나 이상의 방법을 포함한 문제 해결에 도움이되는 몇 가지 일반적인 기능을 나열합니다.

These tips are organized as follows:이러한 요령으로 구성은 다음과 같습니다 : (해당 주제별)

행(Hung), 데드락(Deadlocked), 또는 루핑(Looping) 프로세스

사후 진단, (Post-mortem Diagnostics)Post-mortem Diagnostics, Memory Leaks, 메모리 누수(Memory Leaks)

모니터링 ( jstat is not available on Windows 98 or Windows ME.) (jstat 윈도우 98이나 윈도우 ME에서 사용할 수없습니다.)

Note: The vmID argument for the jstat command is the virtual machine identifier. See the jstat man page 참고 : jstat 명령에 대한 인수는 가상 머신 vmID 식별자입니다. jstat man 페이지를 참조하십시오 for a detailed explanation.

자세한 설명

  • Print statistics on the class loader: 클래스 로더에 통계 출력 :
    • jstat -class vmID jstat -class vmID
  • Print statistics on the compiler: 컴파일러에 대한 통계 출력 :
    • Compiler behavior: jstat -compiler vmID 컴파일러 동작 : jstat -compiler vmID
    • Compilation method statistics: jstat -printcompilation vmID 컴파일 메소드에 대한 통계 : jstat - printcompilation vmID
  • Print statistics on garbage collection: 가비지 컬렉션에 통계 출력 :
    • Summary of statistics: jstat -gcutil vmID 요약 통계 : jstat -gcutil vmID
    • Summary of statistics, with causes: jstat -gccause vmID 오류 포함, 요약 통계 : jstat - gccause vmID
    • Behavior of the gc heap: jstat -gc vmID GC의 힙 동작(behavior) : jstat -gc vmID
    • Capacities of all the generations: jstat -gccapacity vmID 모든 generations 용량 : jstat -gccapacity vmID
    • Behavior of the new generation: jstat -gcnew vmID new generation 동작: jstat -gcnew vmID
    • Capacity of the new generation: jstat -gcnewcapacity vmID new generation 용량: jstat -gcnewcapacity vmID
    • Behavior of the old and permanent generations: jstat -gcold vmID old 와 permanent generations 동작: jstat -gcold vmID
    • Capacity of the old generation: jstat -gcoldcapacity vmID old generations 용량 : jstat -gcoldcapacity vmID
    • Capacity of the permanent generation: jstat -gcpermcapacity vmID permanent generations 용량: jstat -gcpermcapacity vmID
  • Monitor objects awaiting finalization: finalization를 기다리는 개체 모니터링:
    • JConsole tool, VM Summary tab JConsole 툴, VM 요약 탭
    • getObjectPendingFinalizationCount method in java.lang.management.MemoryMXBean class java.lang.management.MemoryMXBean 클래스 안에 있는getObjectPendingFinalizationCount 메소드
  • Monitor memory: 메모리 모니터 :
    • Heap allocation profiles via HPROF: java -agentlib:hprof=heap=sites HPROF를 통해 힙 할당 프로필(profiles) : java -agentlib:hprof=heap=sites
    • JConsole tool, Memory tab JConsole 툴, 메모리 탭
    • Control-Break prints generation information. Control – Break 는 generation 정보 출력
  • Monitor CPU usage: CPU 사용률 모니터 :
    • By thread stack: java -agentlib:hprof=cpu=samples application 쓰레드 스택 관련 : java -agentlib:hprof=cpu=samples application By method: java -agentlib:hprof=cpu=times application
    • 메소드 관련 : java -agentlib:hprof=cpu=times application
    • JConsole tool, Overview and VM Summary tabs JConsole 툴, 개요 및 VM을 요약 탭
  • Monitor thread activity: 쓰레드 활동 모니터 :
    • JConsole tool, Threads tab JConsole 툴, 쓰레드 탭
  • Monitor class activity: 클래스 액티비티 모니터 :
    • JConsole tool, Classes tab JConsole 툴, 클래스 탭

Other Functions 기타 기능

APIDesign - Blogs - May 18, 2009 05:43 PM
API Podcast #2: Reentrancy

Listen to podcast #2: to learn about our take on Swing and its poor reentrancy. Find out what it may mean for your own API design and especially Runtime_Aspects_of_APIs that you create. Learn to fight with that problem by maximizing the declarative nature of your API. --JaroslavTulach 17:43, 18 May 2009 (UTC)

APIDesign - Blogs - May 12, 2009 07:50 PM
API PodCast #1

Listen to this: ! It is almost a year since we (me and Geertjan) started our regular API Design Tips podcasts. They used to be part of larger NetBeans podcasts, however recently I needed some promotion material for TheAPIBook and I decided to extract the API Tip parts. I am glad I can offer these sketches to you. Enjoy podcast #1. --JaroslavTulach 19:50, 12 May 2009 (UTC)

Netbeans-Korean by 강여사 - April 29, 2009 02:40 AM
Sun SOA Suite- Java CAPS 6 2차 세미나
































































Netbeans-Korean by 강여사 - April 25, 2009 11:56 AM
넷빈 6.5 에서 profiler 사용하기 - 02

그럼 이번에는 다른 성능분석을 위해 세션을 종료하겠습니다.
profile- stop profiling session



이번에는 CPU 성능 측정을 해보도록 하겠습니다.

이러한 CPU 작업을 선택할 때에는 .어플리케이션의 메소드-수준 CPU 성능(실행 시간)을 프로파일하고 실시간으로 결과를 처리합니다. 당연히 오버헤드가 꽤 되게 때문에, 설정을 통해 전체 어플리케이션의 성능을 분석할 것인지, 아니면 어플리케이션 코드의 일부를 프로파일링 할 것인지, 심지어 특정 코드 조각(fragment)로 다운할 것인지 선택할 수 있습니다.

이때 나타나는 추정치(overhead)는 대략적으로 그린거라 눈금을 너무 자세히 들여다 볼 필요는 없습니다. --; (2개라고 20%는 아니라는 뜻 --;; )

전체 어플리케이션에 대한 CPU 성능분석을 하고자 하면 그냥 Entire Application 이 선택된 상태로 Run (실행)하면 됩니다.



오버헤드를 줄이기 위해 (또는 동시에 결과 범위를 줄이기 위해 ^^;) 부분만 프로파일링 하는 방법을 설명하도록 하겠습니다.

Part of application 으로 라디오 버튼을 바꾸고, 옆에 있는 define를 누릅니다.



주. 어플리케이션의 부분을 프로파일하기 위해, 우선 하나나 그 이상의 루트 메소드를 지정해야 합니다. 루트 메소드는 매개 루트로 지정될 소스 코드 안의 메소드, 클래스나 패키지로, 프로파일링 데이터는 어플리케이션 쓰레드 중 하나가 매개 루트를 들어오고 나갈 때 수집되게 됩니다. 어플리케이션 쓰레드 중 하나가 루트 메소드에 들어오기 전에는 어떠한 프로파일링 데이터도 수집되지 않습니다.

Select Root Method 팝업창이 뜨는데 여기서 Add project 를 클릭합니다.



프로젝트안의 쭈욱~~ 따라 들어가서 WordLibrary 를 선택합니다. 이 자바 클래스를 루트로 삼아 CPU 프로파일링을 분석할 계획이라는 뜻입니다.
Ok




그럼 자동적으로 저렇게 그림처럼 올라옵니다.
ok



그런 다음 필터를 사용할 수도 있는데, 필터는 매개된 클래스를 제한할 수 있습니다.



Show filter value 클릭하여 필터된 클래스의 목록을 볼 수 있는데, 미리 정의된 프로파일링 필터를 선택하거나 아니면 직접 사용자 정의 필터를 만들 지 선택할 수 있습니다.

profile only project classes 선택하고 실행 (run)



실행하게되면 다시 어플리케이션이 실행되고, 프로파일링 세션이(이번에는 CPU 분석)으로 시작되는데, 그림처럼 자동으로 프로파일링 후 Live Profiling Results 가 나타난다. (안 나타나면 Profiler 패널에서 Live Profiling Results를 클릭한다. 그리고 아래 그림처럼 차트를 보고자 하면 Live Profiling Result 창 오른쪽 위의 조그만 아이콘을 누르면 아래 그림처럼 나타난다. )



계속...

Netbeans-Korean by 강여사 - April 25, 2009 11:48 AM
넷빈 6.5 에서 profiler 사용하기 - 01

안녕하세요~ 강여사입니다. 요근래 제가 좀 바빠서리..--; (뭐 지금이라고 안 바쁜건 아니지만..ㅠㅠ 약속한게 있어서리 최우선으로~~ 오호홍~)

우선, 프로파일러(profiler)는 개발자들에게 어플리케이션 실행 동작에 대한 중요한 정보를 제공하면서, 손쉽게 쓰레드 상태, CPU 성능, 그리고 어플리케이션 메모리 상태 등을 모니터하면서 이에 대한 수정 작업을 제공하는 도구입니다.

넷빈도 이러한 프로파일러가 넷빈 6.x 이전에는 플러그인 상태로 지원되다가, 넷빈 6.x 이후에는 기본팩에 포함시켜 넷빈 프로젝트를 바로 프로파일링을 할 수 있도록 지원해주고 있습니다.

특히나 넷빈 6.X 의 세부 버전에서도 각각 조금씩 새로운 기능들이 추가되고 또 속도 등의 이슈는 나날이 버전업되고 있습니다. (자세한 사항은 항상 넷빈 홈 페이지의 releases 확인 요망 ㅋㅋ) 저야 늘~ 그러하듯 시작~ 스따아트~ 소개~를 목적으로 가비얍게 다루는~~

그리하야 이번 게시물에는 넷빈에서 프로파일러를 어떻게 시작하는 지 그리고 어떤 것들이 있는지 일단 1탄으로 이야기해보도록 하겠습니다.

우선 간단한 자바 어플리케이션을 올립니다. (여기서는 넷빈 안에 있는 sample 프로젝트로 하겠습니다)

new project


Samples 안의 java - Anagram Game 선택
next



적당한 경로에 넣기
finish



그럼 우선 정확한 프로파일링 결과를 얻기 위해서는 자바 플랫폼에 대한 측정 데이터가 있어야 합니다.

만약 처음으로 프로파일링 툴을 실행하거나, 아니면 이런 측정 데이터가 없다면, 일단 플랫폼을 위한 calibration 이 최우선적으로 진행되어야 합니다.

Profile - Advanced commands - Run Calibration

그럼 해당 프로젝트의 플랫폼이 선택됩니다. (당빠 이러한 작업은 JMX 등을 지원하는 JDK 5 이상에서만 가능합니다. 현재 작업중인 제 JDK 는 6 버전입니다.)
OK





프로젝트 프로파일링 시작하기

방법 1. Profile - Profile Main Project (아래그림참고)
방법 2. 프로젝트(AnagramGame) 에서 오른쪽 마우스 - profile



넷빈에서는 프로파일링을 진행하게되면 프로젝트와 프로파일링을 통합시키기도 합니다. 즉, 프로파일링 세션의 시작과 함께 어플리케이션을 시작하고, 프로파일링 세선이 종료되면 어플리케이션도 종료되게~

이러한 통합은 당연히 프로젝트의 구성파일(build.xml)을 수정해야하기때문에 이 작업에 대한 동의여부를 묻습니다. (팝업창)



이렇게 통합하게되면 기존 build.xml 은 build-before-profiler.xml 으로 바뀌고 새로운 build.xml 이 자동생성됩니다.



나중에 이일을 원래대로 복구하려면 Profile-advanced command 에서 unintegrate profile from the main menu 를 선택하면 됩니다.
ok

그럼 다음 그림이 보이는데 다음 3가지로 프로파일링을 진행할 수 있습니다.

즉,~

프로파일링 작업
결과

어플리케이션 모니터하기
쓰레드 액티비티와 메모리 할당을 포함, 대상 JVM의 등록정보에 대한 고-레벨정보를 얻기 위하여 이것을 선택하십시오

CPU 성능 분석하기
메소드를 수행하는데 대한 시간, 호출된 메소드 횟수를 포함한 어플리케이션 성능에 대한 자세한 정보를 얻기 위하여 이것을 선택하십시오.

메모리 사용량 분석하기
객체 할당과 가비지 컬렉션에 대한 자세한 데이터를 얻기 위하여 이것을 선택하십시오.

각각을 선택하면 선택된 박스가 조금 커집니다.

그럼 우선 Monitor ... 를 선택하고 실행해 보겠습니다.

Monitor 클릭 - run




통합으로 진행되기때문에 해당 어플리케이션(anagram game)이 실행되고 왼쪽에 새로이 profiler 패널이 추가됩니다.



실시간으로 모니터링 데이터의 개요를 재빨리 얻기 위해 Telemetry Overview (Control 메뉴들중 맨 오른쪽) 을 사용할 수 있다.
(output이 보이는 오른쪽 아래쪽에 3개의 내용이 한꺼번에 나타납니다).



계속..

Netbeans-Korean by 강여사 - April 09, 2009 02:21 AM
virtualbox2.1.4 에서 glassfish v2.1 설치 및 실행하기

음.. 고새 버박이 2.1.4로 업됐다..벗드..여전히 공유폴더 제한 및 기타 사항은 아직이라는거..vmware로 돌아가야 하나..쩝..아무튼~

정리용...

일단 글래스피시 다운로드부터.

사이트는 http://glassfish.dev.java.net
가운데 download 클릭



일단 glassfish v2.1 로 선택 (나중에 클러스터도 정리하기 위해)



각 버전별 빌드 선택
(버박에서 깔거라 solaris x86의 ml 시리즈로 선택)



적당한 곳에 다운로드 (현재 버박 2.1.4 에 만들어놓은 user 계정은 student 해서 그냥 거기다 다운로드)

/export/home/student 계정아래 다소곳이..쿄쿄



그런 다음 이걸 압축해제를 해야하는데 그러기위해 할일 JAVA_HOME 설정

vi .profile



에서 자바홈 설정(추가 및 확인)

export JAVA_HOME=/usr/jdk/jdk1.5.0_16



java -Xmx256m -jar glassfish-installer-v2.1-b60e-sunos_x86-ml.jar



저렇게 약관창이 뜨는데 스크롤을 내려야만 accept 버튼이 활성화됨. (이렇게해도 약관내용은 읽지 않는다는..쩝 --;)



그럼 glassfish라는 폴더가 생기고 그안에 풀림



cd glassfish



chmod -R +x lib/ant/bin
lib/ant/bin/ant -f setup.xml



설치가 다 완료되면 마지막 설정 작업



글래스피시 bin 도 PATH 변수에 추가해야 함
그러기 위해

cd ..
vi .profile (확인 및 수정)

...
export JAVA_HOME=/usr/jdk/jdk1.5.0_16
PATH=$JAVA_HOME/bin:$PATH:/export/home/student/glassfish/bin
export PATH
...

(GUI 인터페이스는 CDE 그림이 바뀐것 뿐 상관없슴 --; 왠지 이쪽이 더 빠른듯..기분탓인가..)



글래스피시 시작

asadmin start-domain domain1



웹브라우저로 확인
http://localhost:8080



어드민도 확인
http://localhost:4848
admin/adminadmin 으로 접속



음..잘되는군..조아~

Netbeans-Korean by 강여사 - February 27, 2009 03:07 AM
글래스피시 v2 vs. v3

https://glassfish.dev.java.net/public/comparing_v2_and_v3.html

Both GlassFish Server v2 and v3 Prelude are fully supported, production-ready distributions. Choosing one is mainly based on the features that you need for your particular deployment scenario. If you need clustering, high availability and complete Java EE 5 specification support, choose GlassFish Server v2. If you need leading edge web application technologies, web services and scripting, choose GlassFish Server v3 Prelude.

둘은 쓰임새가 완죤 틀리다는 거~

v2는 클러스터로

v3는 edge 웹앱으로

그럼 썬글래스피시포트폴리오의 엔터프라이즈 서버를 v2로 하느냐 v3로 하느냐에 따라 다른 쓰임새.. 오케이.. 슬슬 뭔가가 잡히는 듯..쿄쿄쿄..

힘들당..--;

Netbeans-Korean by 강여사 - February 27, 2009 03:07 AM
글래스피시(glassfish) 설치(install) 관련

https://glassfish.dev.java.net/downloads/v2.1-b60e.html

현재 다운로드 링크.

각 OS 선택에 2가지 버전이 공급되는데, ml 즉 (MultiLigual)과 영문판.

둘의 차이는 약 2M 정도.

영문판으로 진행하려면 처음부터 용량이 적은 영문판만 받아 설치할 것.

이 경우 예전 opensso 때 경험을 미루어보면 설치시 한글 OS와 로케일(ko관련 properties) 때문에 설치 진행이 안될수도 있다. opensso 때는 그랬슴. 글래스피시 영문판은 안해봐서 모름.. --;

Netbeans-Korean by 강여사 - February 27, 2009 03:07 AM
글래스피시 v3 prelude 설치(install) 관련

https://glassfish.dev.java.net/downloads/v3-prelude.html
관련링크.

이건 v2와는 다른 gui 기반 설치파일도 제공. (그외 기타 등등)

역시 영문판과 ML 판 2가지..차이는 2M 정도..

Multilingual support is available in French, German, Spanish, Japanese, Simplified Chinese, Traditional Chinese and Korean. (한국어포함이라는게 얼매나 다행인지..--; 으쌰으쌰)

단, 주의사항. JDK 최소 1.5.0_15 이상이어야 함

Note: all installations require J2SE 5.0. Recommended minimum version is 1.5.0_15.

음..조아~

Netbeans-Korean by 강여사 - February 26, 2009 12:59 PM
Where can I find a comparison between GlassFish and other open source Application Servers? - About GlassFish

Where can I find a comparison between GlassFish and other open source Application Servers?

글래스피시와 기타 오픈소스 어플리케이션 서버들과 비교점은 어데서?

This thread provides a good discussion. Comparisons are also made in this blog post, especially in the comments. Arun also lists key GlassFish differentiators in What's the big deal about GlassFish?

+

역시 아룬 굽타.. 제일 존경하는 아키텍트 중 한 사람.. 진짜 존경스럽다..ㅠㅠ

Netbeans-Korean by 강여사 - February 26, 2009 12:57 PM
How do I use just part of the GlassFish Application Server? I don't need or want everything. - About GlassFish

How do I use just part of the GlassFish Application Server? I don't need or want everything.

글래스피시 어플리케이션 서버의 일부분만 사용하려면? 난 다 필요한거는 아닌데?

This question was originally posed in this thread and the issue has been raised before.
The forum member who posed the question wants to use just some of the functionality in GlassFish, but doesn't need or want all of it (for instance, use just the SIP servlet container but not EJB support, etc.).
Jerome responded:

This is not possible with GlassFish v2 since it would have required that each container can be plugged out. This is however the bulk of the work we are doing in GlassFish v3, where you will be able to get the exact set of features you require. We are not expecting to have the SIP container working in v3 anytime soon, most likely after the summer (of 2008). In the meantime, I am afraid you have no choice but to carry the extra baggage.
NOTE: What's planned for GlassFish v3 in this area is also discussed in What is the difference between Tomcat and GlassFish?.

간단히~
글래스피시 v2 에서는 불가, 그러나 v3에서는 플러거블(pluggable) 가능 유도. 특히 이 사안은 SIP 컨테이너때문인듯 한데, v3에서는 배제한다고 혔으나..음.. v3 prelude 정리하면서 봐야겠군..

Netbeans-Korean by 강여사 - February 26, 2009 12:57 PM
Any Dos and Don'ts I should know about when using GlassFish in demos? - About GlassFish

Any Dos and Don'ts I should know about when using GlassFish in demos?

데모로 글래스피시를 사용할때 해도 되는 것, 하면 안되는 것?

This blog entry gives some recommendations on how to use GlassFish in demos. Some of these apply to every-day use of GlassFish.

+ 몇개만
글래스피시 v1보다는 v2를 사용하길. v1은 사실 v2/v3와는 기반부터가 다르다. --;


undeploy 하기전에 delete 하지 말것


설정 파일(domain.xml 등)들의 수동 편집시 주의 기타 등등

Netbeans-Korean by 강여사 - February 26, 2009 12:56 PM
Where can I get a GlassFish picture/logo to use on my web page? - About GlassFish

Where can I get a GlassFish picture/logo to use on my web page?

내 웹페이지에 사용할 글래스피시 그림/로고는 어데서?

Community buttons and logos are listed on this page.Sun GlassFish Partners need to request their logo from a Sun contact

Netbeans-Korean by 강여사 - February 26, 2009 12:56 PM
How do I know which release is the latest production release of GlassFish? - About GlassFish

How do I know which release is the latest production release of GlassFish?

글래스피시 최신 제품에 대해서는 어데서?

The GlassFish For Business blog is a good source of release information, as is the downloads page (anything with "build" in its title means it hasn't been officially released yet).

덧.
음.. 3월에 하는 웨비나에서는 ESB에 대해 한다니 꼬옥 들어야지.. 오늘 webinar도 재미있었당~
음.. sun fire 장비를 어데서 구해서 glassfish 튜닝 해봐야 하는데.. 뭐..어캐 되겠지..--;

Netbeans-Korean by 강여사 - February 26, 2009 12:38 PM
Where can I get GlassFish? - About GlassFish

Where can I get GlassFish?
글래스피시는 어데서 구하나?

GlassFish releases and technology previews can be downloaded from the GlassFish downloads page.

글래스피시 릴리즈 및 기술 프리뷰는 다음에서 다운로드 (위 다운로드 페이지 링크) 참조

Netbeans-Korean by 강여사 - February 26, 2009 12:36 PM
What is the difference between Tomcat and GlassFish? - About GlassFish

What is the difference between Tomcat and GlassFish?

톰캣과 글래스피시와 차이점은?

Tomcat is a servlet container that can host JSP and servlets. GlassFish is a Java EE 5-compliant application server that includes implementation for a Web services stack (Metro), EJBs, Java Persistence, and many others included in the Java EE 5 specification. GlassFish also provides the out-of-the-box clustering, centralized administration, high availability, and load balancing capabilities required for enterprise applications. The GlassFish web container is a fork of Tomcat 5.5. Why a fork? The Tomcat folks were making incompatible interface changes while GlassFish was trying to stabilize the code base (not a complaint, just reality). This GlassFish and Tomcat Comparison page also lists differences. (이 비교페이지 꼭 볼것..기타 웹로직과 웹스피어와도 비교이나..아마 위키 작성자가 이 둘은 잘 모르는 듯. ㅋㅋ ???의 연속이군..)

톰캣은 JSP와 서블릿을 중재하는 서블릿 컨테이너. 글래스피시는 웹 서비스 스택(메트로), EJBs, 자바 퍼시스턴스, 그리고 기타 많은 Java EE 5 스펙을 구현하는 Java EE 5-호환 어플리케이션 서버.

Think GlassFish is too big, and forces you to run more than you really need? The "all-or-nothing" nature of GlassFish goes away in GlassFish v3. The modular architecture of GlassFish v3 will provide lightweight, more "Tomcat-like" distribution options and enable you to roll out as much or as little of the GlassFish server as you need. Item A on the GlassFish v3 Themes page (Modularity and Extensibility) describes what's planned.
NOTE: This "What is the difference..." question was one of many questions answered in the following blog posts from Arun, which might also be of interest:
http://blogs.sun.com/arungupta/entry/glassfish_delhi_universityhttp://blogs.sun.com/arungupta/entry/glassfish_bangalore_chennai_and_pune
All of Arun's Q & A blog entries are available here.

+

발표자료 중 톰캣과 글래스피시에서의 request 처리 퍼포먼스 비교가 있었다.. 음.. request 건 수 많아지면 톰캣하면 안되겠군.. 쩝.. 역시 괜히 WAS 가 아녀... 헐

Netbeans-Korean by 강여사 - February 26, 2009 12:25 PM
What's GlassFish market share compared to other app servers? - About GlassFish

What's GlassFish market share compared to other app servers? 다른 App 서버들과 비교하여 글래스피시 시장 점유도는?

Eduardo's answer:

There a number of surveys and they all are showing improvements. The tricky part is that there is a substantial lag in the surveys. By the time ZDNet or Evans Surveys show the result they are at least 6 months old. To boot, Evans Surverys NAD (North American Developer Survey) changed the format and it is extra old. I'm very much looking forward to the updated percentages to see where we are.

In the meantime, check out these...
http://blogs.sun.com/theaquarium/entry/what_a_difference_18_months http://blogs.sun.com/theaquarium/entry/zdnet_glassfish_validating_sun_s http://blogs.sun.com/theaquarium/entry/from_#8_to_#2_- http://blogs.sun.com/theaquarium/entry/another_month_another_glassfish_geo http://blogs.sun.com/theaquarium/tags/adoption

자세한건 해당 링크에..ㅋ

Netbeans-Korean by 강여사 - February 26, 2009 12:23 PM
What is the Roadmap? - About GlassFish

What is the Roadmap?

로드맵?

The General Information section on the main page of the GlassFish Wiki provides roadmap information.

+

현재 글래스피시 v3 prelude 까지 진행중. v2와 v3은 서버 instance에 차이가 있슴

Netbeans-Korean by 강여사 - February 26, 2009 12:22 PM

Where do I go to access the GlassFish project?
글래스피시 프로젝트는 어데서?

Visit the community site at http://glassfish.org/. Nightly builds and the source code for the application server are available on this site, as are e-mail lists, discussion forums, news, feedback, licensing information, and extensive help resources.

커뮤니티 사이트는 여기 http://glassfish.org/ . 각종 빌드와 소스 코드 및 이메일 리스트, 포럼, 뉴스, 피드백, 라이센스 정보 및 도움 리소스 등 제공

The GlassFish Wiki at http://wiki.glassfish.java.net/ complements the community site and serves as another valuable, collaborative resource for the GlassFish community.

글래스피시 위키는 저기 참조