넷빈 6.7에서 JMX 매니저 개발 및 원격 JMX Agent 연결하기

0

Written on 오전 4:35 by 강여사(J.Y.Kang)

이번 넷빈 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)
======================================================================
수고하셨습니다. *^^*

넷빈즈 IDE 6.7 에서 자바 어플리케이션에 JMX Instrumentation 추가하기

0

Written on 오후 10:45 by 강여사(J.Y.Kang)

아래 게시물의 선수지식 등을 사용하여 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 어플리케이션에 대해 알아 보겠습니다.

수고하셨습니다. ^^

넷빈 6.7.1 의 새 변경사항 (release notes) 정리

0

Written on 오전 5:15 by 강여사(J.Y.Kang)

=======================================================
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


Twitter SaaS를 사용한 Swing 프로그램 만들기

0

Written on 오전 12:22 by 강여사(J.Y.Kang)

이번 게시물에는 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에 등록된 제 아이디의 아이콘이 나타납니다. (넷빈로고라는..ㅋㅋ)

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

넷빈즈 6.7.1에서 Mysql 사용하기 및 Sakila DB 설치하기

0

Written on 오전 5:34 by 강여사(J.Y.Kang)

이번 게시물에는 넷빈즈에서 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 설치였습니다.

넷빈 6.7.1에서 하이버네이트 사용하기-SwingGUI

0

Written on 오전 5:12 by 강여사(J.Y.Kang)

이번에 올릴 내용은 하이버네이트(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 프로젝트입니다.

다음에는 웹 어플리케이션으로 하이버네이트를 사용해보도록 하겠습니다.

기타 여러 쿼리 수행문들을 응용해보시기 바랍니다.

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

jmaki의 accordion들 사용하기(dojo,jquery,jmaki)-advanced

0

Written on 오후 10:25 by 강여사(J.Y.Kang)

이번에는 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 들이었습니다.