JDesigner® Web Application Development Platform
Document for Developer & Architect
Version 1.0.0
Sangboo Lee (leesangboo@gmail.com)
Contents
1. JDesigner® Web Application Development Platform Summary
2. Install And Configuration
3. IDE(Eclipse) Integration And Project Setting
4. Web Application Development Using Framework
A. Web Framework
- Overview And Class Diagram
- MVC Development Using Struts 1.3.10 Extension Framework
- JAVA 1.5 Annotation Configuration
- Web Domain Example
- Framework Tag Library
- Mootools 1.4.2 & Java Script UI Widget
- Create View Using Java Script Framework And UI Widget And Tag library
- Internationalize / i18n
- Theme
- Filters
B. DB Framework
- Overview And Class Diagram
- PersistenceManager API
- Select Query Using NamedQuery
- Insert/Update/Delete Query Using TableQuery
- Management Transaction
- Database Provider
C. Utilities
- StringUtils
- DateUtils
- FileUtils
- Etc
5. Reusable Common Service Components
6. Web Application Template Introduction
7. Best Practices
1. JDesigner® Web Application Development Platform 소개
JDesigner(R) Web Application Development Platform(이하 JDesigner) 는 웹 프레임워크(Extends
Struts) 및 UI 프레임워크(AJAX Enabled Custom Tag Library), 재사용 가능한 공통 서비스
컴포넌트(Reusable Common services out-of-box), 어플리케이션 템플릿 그리고 통합된 Eclipse IDE,
CBD(Component Based Development) 방법론 지원으로 표준 J2EE 어플리케이션 개발 프로젝트를
5 분 이내에 바로 시작 가능하게 합니다. JDESIGNER 는 J2EE 엔터프라이즈 어플리케이션
빠르고 쉬우며 안정성, 확장성, 성능, 가용성 있는 국제 표준(Global Standard)에 부합하는 개발을
가능하게 합니다. JDESIGNER 지속적으로 업그레이드가 가능하고, 플랫폼 설계 유형 (시스템 O/S
및 클라이언트의 브라우저 환경) 에 따른 의존성이 없어 유연성이 뛰어 납니다. JDESIGNER 는
빠르게 변화하는 비즈니스 프로세스, 빠른 납기주기, 낮은 개발 비용을 요구하는 산업용
어플리케이션을 Rapid 하게 개발할 수 있는 최적의 솔루션을 제공합니다.
A) JDesigner Architecture
요약
1.Struts 기반의 웹 프레임워크는 학습이 쉬우며, 빠르고 안전한 웹 어플리케이션을 개발할 수
있도록 합니다. 이는 MVC 패턴의 구현, POJO 기반의 개발, 폼 검증, 다중 전송 검증, 보안(보안
가이드라인 준수),국제화 (i18n), 테마 기능 등 현 시대가 요구하는 웹 프레임워크의 기능을 모두
이용 가능하며, 추가 기능을 플러그인 형태로 적용 (Adapt) 가능하게 합니다.데이터 악세스
프레임워크(Extends Commons DBUtils )는 Named Parameter Statement 기반의 Native SQL 을 적극
활용 할 수 있으며, 자동화된 SQL 생성을 통한 테이터 핸들러 구성이 편리하며, 분산
트랜잭션(Distribute Transaction)을 지원하여 분산환경의 이기종 데이터베이스에서도 사용
가능하여 Persistence Layer / DAO 개발 생산성을 향상시킵니다.
2.재사용한 가능한 서비스 컴포넌트는 컴포넌트의 조합으로 신규 모듈을 빠르게 개발 가능하게
하며, 테스트 및 유지/보수 비용을 감소시킬 수 있습니다.
3.웹 UI 프레임워크는 Composite View Pattern 의 구현을 위해 Template 기반 AJAX 통합 JSP
Tag Library 를 사용하여 다이나믹 하고 일관성 있는 UI 를 빠르게 구성할 수 있어 사용자
친화적인 사용자 경험(UX:User Experience) 을 가능하게 합니다.
제공되는 기능
프레임워크:
혁신적인 생산성을 보장하는 Web Application Framework
Zero Risk, Zero Cost, Zero Learning Curve
Apache Struts 기반의 확장 Framework
POJO 기반의 개발
테마 및 국제화(i18n) 지원
Template 기반의 JSP Tag Library 와 통합된 AJAX UI Widget Set 제공
Grid, Chart, Table, Window, Dialog, Alerts, Tab, Tree, Panel, Portlet, Single/Multi File Upload
등 다양한 웹 UI 컴포넌트 제공
심플한 설정 관리
혁신적인 DAO 개발 생산성을 위한 SQL Mapper Framework 제공
단순하고 직관적인 Profiling/Monitoring 도구 제공
재사용 가능한 공통 서비스 컴포넌트:
공통코드 : 응용프로그램에서 사용되는 공통 코드 관리 컴포넌트
사용자 : 사용자의 정보 및 권한을 관리하는 컴포넌트
메뉴 : 웹 어플리케이션의 메뉴 관리 및 메뉴에 대한 접근 권한, 자동 BreadCrumbs 관리
컴포넌트
보안 : Role 기반의 권한 관리 및 URL/Menu 에 대한 접근 권한 관리 컴포넌트
국제화(i18n) : 국제화 관련 컴포넌트
Excel : MS Excel Read & Export 관련 컴포넌트
File Upload : File Upload 관련 컴포넌트
Scheduling : 배치성 Job 실행을 위한 Scheduling 컴포넌트
Cache : 캐쉬 컴포넌트
Mail : Send Mail 컴포넌트
FTP : FTP 컨트롤 컴포넌트
버전
Version Note
3.0.0 Java 1.5 Annoation 및 추가 기능 개선
2. Install And Configuration(설치 및 환경설정)
- 이 페이지에서는 JDesinger를 설치하고, 환경 설정을 하는 방법에 대해 알아봅니다.
가) Install
1. JDesinger 설치에 앞서 아래 필수 프로그램 조건을 확인하십시오. 설치되지 않은 프로그램은
URL 을 참조하여 다운로드 받으셔서 설치하십시오.
필수 프로그램 및 버전(사양)
프로그램 URL 비고
Windows 2000/XP/Vista/7
J2SE 1.4 + http://java.sun.com
Oracle Client 9i + http://www.oracle.com
2. 위 필수 프로그램을 모두 설치하셨으면, 아래 주소를 참조하여 JDESIGNER 팩키지를 다운로
드 하십시오.
구글코드: http://code.google.com/p/jdesigner-platform/downloads/
3. 다운로드 된 ZIP파일을 [C:/] 디렉토리에서 압축해제 하십시오. 압축 해제가 완료되면
[C:/JDesigner/] 디렉토리가 생성되며 그안에 [server, store, tool, workspace] 이름의 4개의 디렉토
리가 존재 합니다.
디렉토리 명 설명
server Tomcat 5.5 Server (JOTM JTA Enabled)
store 저장소 (File, Temp, Log 등)
tool Eclipse IDE
workspace Framework/Common Service/Web Application Template In Eclipse
Workspace
4. 위 과정으로 설치가 모두 완료되었으며, 이클립스(C:/JDesigner/tool/eclipse/eclipse.exe)를 실행
하여 Workspace에 오류가 없는지 확인합니다.
A) Eclipse Workspace
나) Configuration
1. 설치가 완료되었으며, 웹 어플리케이션 템플릿 실행을 위한 환경을 설정합니다.
설정해야 할 설정 파일 목록(*:필수 수정 파일)
/WEB-INF/classes/ 에 설정해야 하는 파일
설정 파일명 Description
*platform.properties 프레임워크 기본 설정 파일
commons-logging.properties Commons Logging 설정 파일
document.properties 문서 관련 설정 파일
drm-serverinfo.properties DRM 서버 관련 설정 파일
ehcache.xml EHCache 기본 설정 파일
*log4j.properties Apache Log4j 설정 파일
logging-jdbc-oracle.properties Log Database 저장 설정 파일
oracle-sso.properties Oracle Single Sign On 관련 설정파일
template-service.properties 공통 서비스 관련 설정 파일
/WEB-INF/ 에 설정해야 하는 파일
cache-config.xml 캐쉬 설정 파일
scheduler-config.xml 스케쥴러 설정 파일
security-config.xml 보안 설정 파일
web.xml web.xml
2. 먼저 프레임워크 설정 파일인 [platform.properties]를 수정합니다.
(위치: C:\JDesigner\workspace\plms-template-web\src\JDesigner.properties)
A) Web Properties
Property Default Value Description
platform.web.parameter. UTF-8 Request/Response Parameter Encoding
encoding
platform.web.i18n.local ko Client의 Default Locale
e
platform.web.theme.them design Client의 Default Theme
e
platform.web.multipart. 100M Multipart 파일 업로드 : 최대 업로드 가능한
maxsize
파일 사이즈
platform.web.multipart. 250K Multipart 파일 업로드 : Threshold Sizes
thresholdsize
platform.web.multipart. C:/JDesigner/stor Multipart 파일 업로드 : 파일 저장소
repository
e/file
platform.web.multipart. .jsp,.java.,.exe,.sh Multipart 파일 업로드 : 업로드 제한 파일
limittype
확장자 명
B) Database Properties
Property Default Value Description
platform.db.database Oracle 데이터 베이스 제품 명
platform.db.datasource. jdbc/OracleDataS WAS에 설정된 DataSource JNDI 명
jndi
ource
platform.db.transaction Java:comp/UserT WAS에 설정된 UserTransaction JNDI 명
.jta.jndi
ransaction
platform.db.transaction JDBC 트랜잭션을 관리하는 타입 / JDBC일 경우
.type
Connection으로 트랜잭션 관리
JTA일경우 UserTransaction으로 트랜잭션
관리
platform.db.transaction 2 트랜잭션 격리 레벨
.isolation
NONE = 0
READ_UNCOMMITTED = 1
READ_COMMITTED = 2
REPEATABLE_READ = 4
SERIALIZABLE = 8
platform.db.query.xml.b SQL XML을 파일을 찾는 기본경로
asepath
platform.db.table.schem PORTALM 테이블 기본 스키마
a
platform.db.sql.logging true SQL 로깅 여부
platform.db.sql.cache true SQL 캐쉬 여부
C) Data Properties
Property Default Value Description
platform.data.number.gr false 숫자형일 경우 3자리마다 ,를 찍어줄지 여
ouping
부
platform.data.pattern.d yyyy-MM-dd 기본 날짜 포맷
ate
platform.data.pattern.t HH:mm:ss 기본 시간 포맷
ime
platform.data.pattern.d yyyy-MM-dd 기본 날짜/시간 포맷
atetime
HH:mm:ss
3. 로그 관련 설정 파일 [commons-logging.properties / log4j.properties]을 환경에 맞게 수정하십시
오.
(Common Logging 설정 파일위치: C:\JDesigner\workspace\plms-template-web\src\commons-
logging.properties
Log4j 설정 파일위치: C:\JDesigner\workspace\plms-template-web\src\log4j.properties)
- Common Logging Properties
logger=org.apache.commons.logging.impl.Log4JLogger
logger.configuration.name=log4j.configuration
logger.configuration.value=log4j.properties
- Log4j Propeties
### CONSOLE 에 로그 출력 설정###
log4j.appender.info=org.apache.log4j.ConsoleAppender
log4j.appender.info.Target=System.out
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=
[%X{process_id}] [%X{username}] [%p] [%C:%L]- %m%n
log4j.appender.debug=org.apache.log4j.ConsoleAppender
log4j.appender.debug.Target=System.out
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=
[%X{process_id}] [%X{username}] [%p] [%C:%L]- %m%n
log4j.appender.warn=org.apache.log4j.ConsoleAppender
log4j.appender.warn.Target=System.err
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=
[%X{process_id}] [%X{username}] [%p] [%C:%L]- %m%n
### FILE 파일에 로그 정보 저장 설정###
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=c:/jdesinger-platform/store/log/jdesigner-
web.log
log4j.appender.file.Append=true
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=
[%X{process_id}] [%X{username}] [%p] [%C:%M:%L]- %m%n
### JDBC 데이터베이스에 로그 정보 저장 설정###
log4j.appender.jdbc=org.apache.log4j.jdbcplus.JDBCAppender
log4j.appender.jdbc.connector
=org.jdesigner.application.template.logging.OracleConnectionHandler
log4j.appender.jdbc.sqlhandler=org.jdesigner.application.template.loggin
g.OracleSQLHandler
log4j.appender.jdbc.dbclass=oracle.jdbc.driver.OracleDriver
log4j.appender.jdbc.buffer=1
log4j.appender.jdbc.commit=true
log4j.appender.jdbc.layout=org.apache.log4j.PatternLayout
log4j.appender.jdbc.layout.ConversionPattern=%m
### MAIL 에러 로깅시 메일 발송 설정###
log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=ERROR
log4j.appender.mail.BufferSize=512
log4j.appender.mail.SMTPHost=127.0.0.1
log4j.appender.mail.From=logging@gamil.com
log4j.appender.mail.To=leesangboo@gmail.com
log4j.appender.mail.Subject=[DDMS] Log4j Error Report
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=
[%X{process_id}] [%X{username}] [%p] [%C:%M:%L]- %m%n
## LAYOUTS ##
# assign a SimpleLayout to console appender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
### set log levels - for more verbose logging change 'info' to 'debug'
### , jdbc
log4j.rootLogger=warn, info
- Log4j MDC Filter 설정시 아래의 추가 로그 정보를 Logging할 수 있습니다.
Log4jMDCFilter 정보는 목차에서 Filter 섹션을 참조하십시오.
Property Description
%X{jsession_id} HTTP 세션 - JSESSION_ID
%X{remorte_host} 접속자의 호스트
%X{remorte_address} 접속자의 IP
%X{username} 접속자의 유저명(로그인ID)
5. 설정 완료 후, Eclipse에서 Tomcat 서버를 시작하십시오.
시작 후 Console에서 아래 로그를 확인하면 정상적으로 응용 프로그램이 실행 된 것입니다.
A)서버 시작
B)Console 메시지 확인
6. 웹 응용프로그램 템플릿 URL[http://localhost:8080/template/]이 정상적으로 호출되는지 확인합
니다.
1)웹 템플릿 로그인 페이지
3. IDE(Eclipse) Integration And Project Setting
- 이 페이지에서는 JDESIGNER를 Eclipse와 통합하고, 프로젝트를 설정하는 방법에 대해 알아봅
니다.
기본적으로 JDESIGNER는 Eclipse와 통합된 형태로 배포되고 있으나, 프로젝트 특성에 따라
조정할 부분에 대한 추가 설명입니다.
가) IDE(Eclipse) Integration
1. Eclipse를 실행하십시오. 기본 작업 환경을 [JavaEE] 퍼시펙티브로 설정하면, 왼쪽 네비게이션
[Project Explorer]에 4개의 프로젝트가 표시 됩니다.
A)Project Explorer
B)Project Description Table
Project Description
jdesigner-application J2EE 어플리케이션 프로젝트
jdesigner-codegenerator-web 코드 제너레이터 프로젝트
jdesigner-lib 의존 라이브러리 묶음 프로젝트
Jdesigner-platform 플랫폼(프레임워크) 프로젝트
Jdesigner-template-service 공통 기술 서비스 프로젝트
Jdesigner-template-sql 기본 테이블 및 데이터 생성 SQL 프로젝트
Jdesigner-template-web 웹 템플릿 프로젝트
Servers 서버(Tomcat 5.5) 설정 프로젝트
나) Project Setting
1. 프로젝트 표준에 근거하여 아래 설정 사항들을 조정하십시오. Server 프로젝트를 제외한
7개의 프로젝트가 대상입니다.
- Code Formatter 설정
- Java Complier 설정
- Project Facets 설정
- Project Reference 설정
- Target Runtime 설정
- Validation 설정
4. Web Application Development Using Framework
- 이 페이지에서는 Framework를 사용하여 웹 어플리케이션을 개발하는 방법에 대해 설명합니다.
Framework는 내부적으로 Web Framework 및 Database(Persistence) Framework로 나눠집니다.
JDESIGNER / Framework Technologies Stack
---------------------------------------------------------------------------------------------------------
- Apache Struts 1.3.10 MVC Framework
- Mootools 1.4.2 Java Script Framework
- Freemaker Template Engine
- Apache Commons
- EHCache
가) Web Framework
A. Overview And Class Diagram
1. JDESIGNER의 Web Framework는 Apache Struts 1.3.10을 확장한 프레임워크입니다.
A) Class Diagram
B) Sequence Diagram
B) Web App Process Flow
B. MVC Development Using Struts 1.3.10 Extension Framework
1. JDESIGNER의 Web Framework는 Apache Struts 1.3.10을 확장하여 단점을 보완하였습니다.
JDESIGNER는 POJO기반의 개발, 쉬운 데이터 바인딩, 클라이언트&서버사이드 검증,
레이아웃(Tiles). 국제화(i18n), 테마 기능을 제공합니다.
A) Class Diagram
B)MVC 개발 순차
1) Configuration Struts
- Base (기본 Struts의 액션 설정 및 Tiles의 기본 View 설정을 합니다.)
/WEB-INF/config/base-*.xml
-->
-----------------------------------------------------------------------------------------------------------
2) ActionBean (Front Controller) Code Example
-------------------------------------------------------------------------------------------------------------
package …;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.JDesigner.common.util.DateUtils;
import org.JDesigner.common.web.fileupload.MultiFileUpload;
import org.JDesigner.common.web.fileupload.SingleFileUpload;
import org.JDesigner.common.web.form.Form;
import org.JDesigner.common.web.form.FormMode;
import org.JDesigner.common.web.form.InputsList;
import org.JDesigner.common.web.grid.Grid;
import org.JDesigner.common.web.json.JSONResult;
import org.jdesigner.application.template.service.test.TestService;
import org.jdesigner.application.template.web.BaseActionBean;
/**
* TestBean
*
* @author SangBoo Lee
* @date 2010. 1. 27.
* @since 1.0
*
*/
public class TestBean extends BaseActionBean {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(TestBean.class);
private TestService test_service;
private Form form;
private Form search;
private Grid grid;
private InputsList list;
private JSONResult json;
private SingleFileUpload sfile;
private MultiFileUpload mfile;
public TestBean(){
init();//
}
public void init() {
//
log.info("ActionBean[" + this.getClass() + "] initialize...");
//
test_service = new TestService();
//
search = new Form();
form = new Form();
list = new InputsList();
grid = new Grid();
json = new JSONResult();
//
sfile = new SingleFileUpload();
mfile = new MultiFileUpload();
}
public void reset() {
search.put("from_insert_date", DateUtils.getToDate());
search.put("to_insert_date", DateUtils.getToDate() );
}
public String index() throws Exception {
reset();
return SUCCESS;
}
public String grid() throws Exception {
grid = new Grid(test_service.selectTestPage(search, grid.getStart(), grid.getRange(), grid.getSort(),
grid.isDesc()));
return Grid.FORWARD;
}
public String add() throws Exception {
form.setMode(FormMode.INSERT);
return SUCCESS;
}
public String edit() throws Exception {
form = new Form(test_service.selectTestMap(form));
form.setMode(FormMode.UPDATE);
return SUCCESS;
}
public String insert() throws Exception {
test_service.insertTest(form);
//
super.setServerMessage("common.insert.success");
init();
return SUCCESS;
}
public String update() throws Exception {
test_service.updateTest(form);
//
super.setServerMessage("common.update.success");
init();
return SUCCESS;
}
public String delete() throws Exception {
test_service.deleteTest(form);
//
super.setServerMessage("common.delete.success");
init();
return SUCCESS;
}
public String apiTest() throws Exception {
//Form 처리
form.getString("username");
form.getInt("age");
form.print();
//InputArrays 처리
log.info("inputs list=" + list.toString());
list.print();
//JSON 결과 설정
json.setStatus(JSONResult.SUCCESS);
json.setMessage(",,,,,");
json.put("my_key", "my_value");
log.error("my_error!!!!!!");
//
return SUCCESS;
}
/**
* @return the search
*/
public Form getSearch() {
return search;
}
/**
* @param search the search to set
*/
public void setSearch(Form search) {
this.search = search;
}
/**
* @return the form
*/
public Form getForm() {
return form;
}
/**
* @param form the form to set
*/
public void setForm(Form form) {
this.form = form;
}
public Grid getGrid() {
return grid;
}
public void setGrid(Grid grid) {
this.grid = grid;
}
public TestService getTest_service() {
return test_service;
}
public void setTest_service(TestService testService) {
test_service = testService;
}
public InputsList getList() {
return list;
}
public void setList(InputsList list) {
this.list = list;
}
public JSONResult getJson() {
return json;
}
public void setJson(JSONResult json) {
this.json = json;
}
public SingleFileUpload getSfile() {
return sfile;
}
public void setSfile(SingleFileUpload sfile) {
this.sfile = sfile;
}
public MultiFileUpload getMfile() {
return mfile;
}
public void setMfile(MultiFileUpload mfile) {
this.mfile = mfile;
}
}
-------------------------------------------------------------------------------------------------------------
B-1). JAVA 1.5 Annotation 활용
1) 3.0.0 버전부터 JAVA 1.5 Annotation 을 사용하시면 XML 설정 없이 빠르고 직관적인 코딩
가능합니다.
예제)
@Action(path = "/annotation/index")
@Forward(name = View.SUCCESS, layout = ".main.layout", content =
"/introduction/index.jsp")
public String index() throws Exception {
//Here Your Logic
return View.SUCCESS;
}
C. Web Domain Example
1. JDESIGNER의 웹 UI와 쉽게 데이터 바인딩 가능한 Web Domain을 제공합니다.
Class Description
Org.JDesigner.common.web.form.For Form 전송과 Binding되는 도매인
m
Org.JDesigner.common.web.form. List 형태의 전송과 바인딩되는 도매인
InputsList
Org.JDesigner.common.web.grid. Grid와 Binding 되는 도매인
Grid
Org.JDesigner.common.web.json. JSON결과값 전달과 바인딩 되는 도매인
JSONResult
Org.JDesigner.common.web.fileuplo 1개 파일 업로드와 바인딩 되는 도매인
ad. SingleFileUpload
Org.JDesigner.common.web.fileuplo 멀티 파일 업로드와 바인딩 되는 도매인
ad. MultiFileUpload
D. Framework Tag Library
1. JDESIGNER는 Struts Tag Extension Tag 및 Composite UI 구성을 위한 Custom tag
Library를 제공합니다.
- JDesigner-html-ex.tld
Class Description
HTML Form확장 태그, Client Validation 옵션을 제공합니다.
HTML Text 확장 태그, Mask 및 검증 추가 옵션을 제공합니다.
HTML Text 의 숫자형 확장 태그, Number 포맷 및 검증 옵션을 제공합니
다.
HTML Text 의 달력형 입력의 포맷 및 검증, 달력 선택기 옵션을 제공합
니다.
HTML Text 의 금액형 입력의 포맷 및 검증 옵션을 제공합니다.
- JDesigner-ui.tld
Class Description
JavaScript 구문 코드 커버를 생성합니다.
Framework 사용에 필요한 스타일 쉬트 및 자바스크립트를
삽입합니다.
Theme에 해당하는 Image를 표시합니다.
Content 영역 경계를 설정합니다.
Content Header를 표시합니다.
Page Navigation을 표시합니다.
Button을 표시합니다.
경계 라인을 표시합니다.
Button의 경계 라인을 표시합니다.
Checkbox의 경계 라인을 표사합니다.
Header Link를 표시합니다.
Header Menu를 표시합니다.
Header 경계 라인을 표시합니다.
Pane 을 표시합니다.
Pane의 헤더를 표시합니다.
Pane의 Body 영역을 표시합니다.
Tip을 표시합니다.
라벨을 표시합니다.
데이터 그리드를 표시합니다.
데이터 그리드의 컬럼을 정의합니다.
E. Mootools 1.4.2 & Java Script UI Widget
1. JDESIGNER에서 제공되는 자바스크립트 UI 컴포넌트는 Mootools1.4.2 버전으로 개발되었으며,
UI Libaray 묶음, 국제화용 Messages, Support, include, API를 delegate하는 class, Utilities class로
구성되어 있습니다.
A)Directory Structure.
B)Classes
F. Create View Using Java Script Framework And UI Widget And
TagLibrary
A)Code Example
Sample 디렉토리 이동하면, 샘플을 보실 수 있습니다.
G. Internationalize / i18n
1. JDESIGNER에서 국제화를 지원합니다. 웹 응용프로그램에서 국제화
(Language,Formatting,Currency)를 사용하기 위해서는 아래 순서를 참조하십시오.
1) web.xml에서 LocaleFilter를 설정하십시오.
LocaleFilter
org.JDesigner.common.web.filter.LocaleFilter
parameter
_change_locale
2) C:\JDesigner\workspace\plms-template-web\src\resources\message에 언어별 메시지 파일(XML)
을 정의하십시오.
3) JSP 페이지 및 ActionBean에서 메시지 처리해야 할 부분을 수정합니다.
4) URL[ *,do?_change_locale=ko]을 호출하여 언어가 변경되는지 확인합니다.
H. Theme
1. JDESIGNER에서 Theme를 지원합니다. 웹 응용프로그램에서 Theme를 사용하기 위해서는 아
래 순서를 참조하십시오.
1) web.xml에서 ThemeFilter를 설정하십시오.
ThemeFilter
org.JDesigner.common.web.filter.ThemeFilter
parameter
_change_theme
2) Theme를 추가합니다.
3) URL[ *,do?_change_theme=oracle]을 호출하여 Theme가 적용되는지 확인합니다.
Theme의 LifceCycle은 Cookie로 관리됩니다.
H. Usable Filters
1. JDESIGNER에서 다수의 유용한 필터를 제공합니다.
Filter 목록은 /jdesigner-platform/src/org/jdesigner-platform/common/web/filter/ 팩키지를 참조하십
시오.
EncodingFilter.java MDCFilter.java JSCompres sionResStream.java
ParameterLoggingFilter.java JSCompressionFilter.java
JSCompressionResWrapper.java LocaleFilter.java ThemeFilter.java
ThreadLoc alFilter.java FilterHelpers.java GZIPResponseStream.java
GZIPRes ponseW rapper.java JsCss Minify Filter.java JSMin.java GZIPFilter.java
3. Database Access (Persistence) Framework
- 이 페이지에서는 Database Access Framework를 사용하여, 데이터를 가공하는 방법과 트랜잭션
처리에 대해 알아봅니다.
A. Overview And Class Diagram
1. JDESIGNER의 Web Framework는 Commons DBUtils을 확장한 프레임워크입니다.
최상위에 Persistence Manager가 있으며, 접근 유형에 따라 NamedQuery와 TableQuery 두가지
형태의 데이터 접근 클래스로 나눠집니다.
A) Class Diagram
A. PersistenceManager And Persistnce API
1.데이터베이스 처리를 위한 Persistence 생성
-----------------------------------------------------------------------------
PersistenceManager .getPersistence();
- PersistenceManager .getPersistence(String id);
- PersistenceManager .getPersistence(String id, String jdbcJNDIName, int
transactionType);
-
-----------------------------------------------------------------------------
2. Source
-------------------------------------------------------------------------------------------------------------
package org.JDesigner.common.db;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdesigner.common.core.threadlocal.ThreadLocalProperties;
/**
* Persistence Manager
*
* @author love
*
*/
public class PersistenceManager {
private static final Log log = LogFactory.getLog(PersistenceManager.class);
private static final String DEFAULT_PERSISTENCE_ID = "org.jdesigner.common.db.DEFAULT_PERSISTENCE";
/**
* 기본 Persistence 를 반환한다.
* @return
*/
public static Persistence getPersistence() {
return getPersistence(DEFAULT_PERSISTENCE_ID);
}
/**
* Persistence 를 반환한다.
* @param id
* @return
*/
public static Persistence getPersistence(String id) {
Persistence persistence = (Persistence) ThreadLocalProperties.get(id);
if(persistence == null){
log.info("Create new persistence : persistenceID=[" + id + "]");
persistence = PersistenceFactory.createPersistence(id);
ThreadLocalProperties.put(id, persistence);
}
return persistence;
}
}
-------------------------------------------------------------------------------------------------------------
package org.JDesigner.common.db;
import java.sql.Connection;
import java.util.List;
import java.util.Map;
import org.JDesigner.common.db.query.NamedQuery;
import org.JDesigner.common.db.query.Query;
import org.JDesigner.common.db.query.TableQuery;
import org.JDesigner.common.db.session.Session;
import org.JDesigner.common.db.transaction.Transaction;
/**
* Persistence
*
* Persistence 는 데이터베이스 연결 및 트랜잭션 생성, 쿼리의 실행을 처리합니다.
*
*
* @author love
*
*/
public interface Persistence {
/**
* ID를 반환한다.
* @return
*/
public String getId();
/**
* 세션을 반환한다.
*
* @return
*/
public Session getOpenedSession();
/**
* 트랜잭션을 반환한다.
* @return
*/
public Transaction getTransaction();
/**
* 현재 JDBC 커넥션을 반환한다.
* @return
*/
public Connection getConnection();
/**
* 현재 JDBC 커넥션을 반환한다.
* @return
*/
public void changeConnection(String datasourceJNDIName);
/**
* 트랜잭션을 시작한다.
*/
public void startTransaction();
/**
* 트랜잭션을 커밋한다.
*/
public void commitTransaction();
/**
* 트랜잭션을 종료한다.
*/
public void endTransaction();
/**
* Query를 생성한다.
*
* @param path
* @return
*/
public Query newQuery(String path);
/**
* Query를 생성한다.
*
* @param path
* @param parameters
* @return
*/
public Query newQuery(String path, List parameters);
/**
* NamedQuery를 생성한다.
*
* @param path
* @return
*/
public NamedQuery newNamedQuery(String path);
/**
* NamedQuery를 생성한다.
*
* @param path
* @param parameters
* @return
*/
public NamedQuery newNamedQuery(String path, Map parameters);
/**
* TableQuery를 생성한다.
*
* @param tableName
* @return
*/
public TableQuery newTableQuery(String tableName);
/**
* TableQuery를 생성한다.
*
* @param tableName
* @param parameters
* @return
*/
public TableQuery newTableQuery(String tableName, Map parameters);
/**
* TableQuery를 생성한다.
*
* @param tableName
* @param parameters
* @param onlyParamKeyBinding
* @return
*/
public TableQuery newTableQuery(String tableName, Map parameters, boolean onlyParamKeyBinding);
/**
* TableQuery를 생성한다.
*
* @param tableName
* @param parameters
* @param processTargetColumns
* @return
*/
public TableQuery newTableQuery(String tableName, Map parameters, String[] processTargetColumns);
/**
* TableQuery를 생성한다.
*
* @param tableName
* @param primaryKeys
* @param parameters
* @return
*/
public TableQuery newTableQuery(String tableName, String[] primaryKeys, Map parameters);
/**
* TableQuery를 생성한다.
*
* @param tableName
* @param primaryKeys
* @param parameters
* @param onlyParamKeyBinding
* @return
*/
public TableQuery newTableQuery(String tableName, String[] primaryKeys, Map parameters, boolean
onlyParamKeyBinding);
/**
* TableQuery를 생성한다.
*
* @param tableName
* @param primaryKeys
* @param parameters
* @param processTargetColumns
* @return
*/
public TableQuery newTableQuery(String tableName, String[] primaryKeys, Map parameters, String[]
processTargetColumns);
}
B. Select Query Using NamedQuery
1. SELECT 쿼리를 통한 데이터 조회시 NamedQuery를 사용할 수 있습니다.
NamedQuery는 자동 페이징된 데이터 조회, 일반 데이터 조회, 데이터 입력/수정/삭제를 처리
할 수 있습니다. NamedQuery는 Key/Value의 Map 형태 데이터와 편리하게 파라메터를 바인딩
가능합니다.
1)XML Code
2)DAO Code
public Page selectTestPage(Map params, int start, int range, String sort,
boolean desc) throws DatabaseException {
NamedQuery query =
getPersistence().newNamedQuery(“classpath://com/test/dao/T00001.xml",
params);
return query.processor().selectPage(start, range, sort, desc); //
}
Binding Types and Conversions
Parameter Map for Oracle
Java type(Map value) ResultSet.get method PreparedStatement.set method
Boolean/boolean getBoolean setBoolean
Byte/byte getByte setByte
Short/short getShort setShort
Integer/int getInt setInt
Long/long getLong setLong
Float/float getFloat setFloat
Double/double getDouble setDouble
Character/char getString setString
Character[]/char[] getString setString
Byte[]/byte[] getBytes setBytes
String setString setString
java.math.BigDecimal getBigDecimal setBigDecimal
java.io.Reader getCharacterStream setCharacterStream
java.io.InputStream getBinaryStream setBinaryStream
java.util.Date getTimestamp setTimestamp
java.sql.Date getDate setDate
java.sql.Time getTime setTime
java.sql.Timestamp getTimestamp setTimestamp
java.sql.Clob getClob setClob
java.sql.Blob getBlob setBlob
Result Map for Oracle
SQL type ResultSet.get method
ARRAY getArray
BIGINT getLong
BIT getBoolean
BLOB getBytes
BOOLEAN getBoolean
CHAR getString
CLOB getString
DATALINK getBinaryStream
DATE getDate
DECIMAL getBigDecimal
DOUBLE getDouble
FLOAT getFloat
INTEGER getInt
JAVA_OBJECT getObject
LONGVARBINARY getBytes
LONGVARCHAR getString
NULL getNull
NCHAR getString
NUMERIC getBigDecimal
OTHER getObject
REAL getDouble
REF getRef
SMALLINT getInt
TIME getTime
TIMESTAMP getTimestamp
TINYINT getInt
VARBINARY getBytes
VARCHAR getString
100 (Oracle specific) getFloat
101 (Oracle specific) getDouble
C. Insert/Update/Delete Query Using TableQuery
1. INSERT/UPDATE/DELETE 쿼리를 통한 데이터 수정시 TableQuery를 사용할 수 있습니다.
TableQuery는 자동화된 SQL구문 생성 및 Identity 생성, Primary Key에 따른 자동 SQL 변환을
지원합니다.
2)DAO Code
A) insert/update/delete
public void insertTest(Map params) throws DatabaseException {
params.put("insert_date", DateUtils.getToTimestamp());
TableQuery query = getPersistence().newTableQuery("TEST_TABLE", params);
query.processor().insert(); //입력
query.processor().update(); //수정
query.processor().delete(); //삭제
query.processor().selectByPrimaryKey(); //PK로 조회
query.processor().selectAll(); //전체 조회
………..
}
B) Primary Keys 재 정의
TableQuery query = getPersistence().newTableQuery("TEST_TABLE", new
String[]{“my_pk”}, params);
query.processor().insert();
C) 대상 컬럼만 처리
TableQuery query = getPersistence().newTableQuery("TEST_TABLE", new
String[]{“my_pk”},params, new String[]{username, password});
query.processor().insert();
C) Identity 생성
params.put("my_id",
IdentityGenerator.generateSequenceType(“sequenceName”)); //시퀀스를 통한 ID
생성시
params.put("my_id", generateColumnMaxValueType(tableName,
columnName));//대상 테이블의 컬럼 최고 값 ID 생성시
params.put("my_id", IdentityGenerator. generateNativeSQLType("SELECT 'E'
|| (SUBSTR(MAX(CUS_REG),-3) + 1) FROM PORTALM.PT_TBL_CUS_REG WHERE
CUS_REG LIKE 'E' || '%'")); //SQL을 통한 ID 생성시
D. Management Transaction
1. JDESIGNER는 자동화된 트랜잭션 스위칭(JDBC/JTA) 및 이기종 분산 데이터베이스에 대한
트랜잭션(XA)을 지원합니다. 트랜잭션 격리 레벨(Transaction Isolation Level) 조정을 지원합니다.
A)Code Example
public void transactionTestForCommit(Map params) throws DatabaseException {
try {
getPersistence().startTransaction();
TableQuery query = getPersistence().newTableQuery("SAMPLE_TABLE", params);
query.processor().delete();
TableQuery query2 = getPersistence().newTableQuery("SAMPLE_TABLE", params);
query2.processor().delete();
getPersistence().commitTransaction();
}catch(Exception ex){
throw new DatabaseException("Transaction failed.");
}finally{
getPersistence().endTransaction();
}
}
B)Isolation Level 설정
getPersistence().getTransaction().setIsolationLevel(Isolation.TRANSACTION_S
ERIALIZABLE);
D. Database Provider
1. JDESIGNER는 데이터베이스 제공자의 제품 및 버전에 따른 지원자를 구성할 수 있습니다.
이는 여러 제품의 데이터베이스를 지원할 수 있으며, 개발 환경에 따른 커스터 마이징 할 수
있습니다.
1) 신규 데이터베이스 제품 지원을 위해서는 아래 Interface를 구현하십시오.
ColumnTypeResultObjectHandler.java
DataMapListResultSetHandler.java
DataMapResultSetHandler.java
DataObjectResultSetHandler.java
IdentityHandler.java
LOBHandler.java
PagingSQLHandler.java
ParameterBinder.java
SQLLogFormatter.java
2) TableTypeMaker.java현재 Oracle만 지원하고 있으며, Oracle Provider의
팩키지는 org.jdesigner.common.db.provider.rdbms.
OracleRDBMSProvider입니다.
C. Utilities
- 이 페이지에서는 Utilities에 대해 알아봅니다.
- StringUtils
- DateUtils
- FileUtils
- Etc
5. Usable Common Service Components
- 이 페이지에서는 재사용 가능한 공통 서비스 컴포넌트에 대해 알아봅니다.
공통 서비스 컴포넌트를 이용하여, 사용자 서비스 개발 시 컴포넌트의 조합으로 신규 서비스를
빠르게 개발 할 수 있습니다.
공통 서비스 컴포넌트의 팩키지는 [org.jdesigner.application.template.*] 입니다.
목록:
- Common Code Management Component
- User Management Component
- Menu & Bread Crumbs Management Component
- Security Component
- I18n(국제화) Component
- Excel Read/Write Component
- File I/O Component
- FTP Component
- Scheduling Component
- Cache Component
- Mail Component
- Analysis Component
A)Architecutre
B)서비스를 사용하기 위해 CommonServiceFactory로 부터 서비스를 생성할 수 있습니다.
CommonServiceFactory.get*Service();
*은 해당 서비스 명입니다.
6. Web Application Template Introduction
- Jdesinger는 빠른 웹 개발을 위해 미리 최적화된 웹 어플리케이션을 템플릿을 제공합니다.
이 템플릿은 위에 프로젝트 설치 후, 실행한 사이트입니다. 사이트를 기반으로 제반 설계 작업업
이 바로 프로그램개발을 위한 코딩을 시작할 수 있습니다.
A) 웹 어플리케이션 템플릿 스크린샷
Reference Website
http://www.apache.org
http://www.ibatis.com
http://opensymphony.org/
http://ehcache.org/
http://freemaker.org
http://mootools.net
END)