JSON서비스 호출방법
넥사크로 플랫폼은 다양한 통신방식 등을 제공하고 있습니다. 이번 장에서는 JSON형태의 데이타를 호출하는 방법에 대해 기술합니다.
주요 소스 코드
화면 코드
this.Button01_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { var strInDS = ""; var strOutDS = "Dataset00=dsDetailMain"; var strParams = ""; var strCallback = "fn_init_callback"; this.transaction("load", "Svc::json.jsp", strInDS, strOutDS, strParams, strCallback); } this.fn_init_callback = function (sid, errcd, errmsg) { if (errcd == 0) { this.Grid00.createFormat(); } }
JSON데이타 포멧을 처리하기 위한 주요 소스 코드
// Data.js 내의 TransactionItem._deserializeData 함수를 대체한다. _pTransactionItem._deserializeData = function (strRecvData, bPending) { if (!strRecvData) return [-1, "Stream Data is null!"]; strRecvData = strRecvData.trim(); var fstr = strRecvData.substring(0, 3); if (fstr == "SSV") // SSV Type (HEX:53,53,56) { return this.__deserializeSSV(strRecvData); } else if (fstr == "CSV") // CSV Type (HEX:43,53,56) { return this.__deserializeCSV(strRecvData); } else if (fstr == "PPX") // PPX Type : Runtime only { return this.__deserializeJSON(strRecvData); } // JSON 처리를 위한 추가 코드 else if (fstr == "JSN") { } //<< JSON 처리를 위한 추가 코드 else // XML Type (HEX:3C,3F) { //return this.__deserializeXML(strRecvData); return this.__deserializeJSON(strRecvData); } } // transaction 시 데이터를 받았을 때 JSON 처리 _pTransactionItem.__deserializeJSON = function(strRecvData) { var code = 0; var message = "SUCCESS"; var outDatasets = this.outputDatasets; if (outDatasets && outDatasets.length) { var revcJsonObj = JSON.parse(strRecvData); if (!revcJsonObj) { code = -1; message = "Fail JSON.parse"; } var outDataCnt = outDatasets.length; for (var i = 0; i < outDataCnt; i++) { // this.context: access form object var ds = this.context._getDatasetObject(outDatasets[i].lval); if (ds) { ds.clear(); this.context.createDatasetColInfo(ds); this.context.addData(ds, revcJsonObj); } } } return [code, message]; } // dataset 초기화 this.createDatasetColInfo = function(ds) { var nIndex = ds.addColumn( "name", "string" ); nIndex = ds.addColumn( "surname", "string", 120 ); } // data processing this.addData = function(ds, jsonObj) { for (var j = 0 ; j < jsonObj.length ; j++) { jObj = jsonObj[j]; var rIdx = ds.addRow(); ds.setColumn(rIdx, "name", jObj.name); ds.setColumn(rIdx, "surname", jObj.surname); } }
DataSet의 컬럼명에 따라 해당 명칭을 변경해 주어야 함
예) name, surname
서비스(JSP)
<%@page contentType="text/html; charset=UTF-8"%> <%@page import="org.json.simple.JSONObject"%> <%@page import="org.json.simple.JSONArray"%> <% JSONArray users = new JSONArray(); JSONObject obj=new JSONObject(); obj.put("name","Ambarish"); obj.put("surname","Aura"); users.add(obj); obj=new JSONObject(); obj.put("name","bmbarish"); obj.put("surname","Bura"); obj=new JSONObject(); obj.put("name","Cmbarish"); obj.put("surname","Cura"); users.add(obj); response.getWriter().print(users); %>
서비스 실행결과
[{"surname":"Aura","name":"Ambarish"},{"surname":"Cura","name":"Cmbarish"}]
- 소스 위치
Sample\ListBox\np_Transaction_JSON.xfdl
DomParser
XML형태의 데이타를 사용하기 위해서는 XML형태의 문서를 파싱해서 사용해야 합니다. 이때 DomParser를 이용하여 XML문서에 접근하는 방법에 대해 간략히 기술합니다.
주요 소스 코드
Node List
var domDoc; var domPar = new DomParser; domDoc = domPar.parseFromString(this.TextArea00.value); var domElement1, domElement2; var i, j; var msg=""; for( i = 0 ; i < domDoc.childNodes.length ; i++ ) { domElement1 = domDoc.childNodes[i]; msg += "Node1["+i+"] = " + domElement1.nodeName + "\n"; for( j = 0 ; j < domElement1.childNodes.length ; j++ ) { domElement2 = domElement1.childNodes[j]; msg += " Node2["+j+"] = " + domElement2.nodeName + "\n"; } } this.TextArea01.set_value(msg);
Node Value
// Parsing var domDoc; var domPar = new DomParser; domDoc = domPar.parseFromString(this.TextArea00.value); // Node값 보기 var domElement; var msg=""; domElement = domDoc.getElementsByTagName("Dataset"); msg += "Dataset TAG의 id값 = " + domElement[0].getAttribute("id") + "\n"; domElement = domDoc.getElementsByTagName("Column"); msg += "첫번째 Column TAG의 id값 = " + domElement[0].getAttribute("id") + "\n"; msg += "두번째 Column TAG의 id값 = " + domElement[1].getAttribute("id"); this.TextArea01.set_value(msg);
- 소스 위치
Sample\Etc\np_DomParser.xfdl
대부분의 브라우저에서는 DOMParser 객체를 이용해 XML 문자열을 파싱하며, IE 브라우저에서는 ActiveXObject 객체를 이용해 XML 문자열을 파싱한다.
jQuery사용방법
사전준비
jQuery관련 모듈 복사
jQuery를 사용하기 위해서는 jquery lib파일을 nexacro platform의 엔진폴더 경로에 복사해야 합니다.
1) 디렉토리 위치에 ExtApi.json 파일 복사 예) C:\Program Files (x86)\nexacro\14\nexacro14lib\component\ExtAPI.json
2) 디렉토리 위치에 ExtAPI 디렉토리 생성 예) C:\Program Files (x86)\nexacro\14\nexacro14lib\component\ExtAPI 디렉토리를 만든다.
3) 디렉토리 위치에 jquery-1.10.2.js 파일 복사 예) C:\Program Files (x86)\nexacro\14\nexacro14lib\component\ExtAPI\jquery-1.10.2.js
참고) 해당 ExtAPI및 파일은 아래 경로 참고하세요.
Sample\Etc\jQuery
위의 작업은 WAS에 동일하게 복사를 해 주어야 합니다.
nexacro studio의 TypeDefinition에 ExtAPI.jsp 모듈 등록
TypeDefinition을 실행하여 Moudles Tab에서 Add버튼을 클릭합니다.
ExtAPI.json을 선택합니다.
위와 같이 ExtAPI.json을 등록 후 OK버튼을 선택합니다.
JQuery를 사용하여 애니메이션 구현하기
jQuery의 애니메이션 기능을 사용하여 움직이는 효과를 구현하였습니다.
- 소스 위치
Sample\Etc\np_jQuery_animate.xfdl
Local DB사용방법
기본
Local DB를 구현하는 방법에 대해 설명합니다.
LiteDB 생성방법
데이터 정의 (DDL)
데이터 조작언어 (DML)
LiteDB 생성방법
작업하고자 하는 Project를 Open한 후 TypeDefinition을 더블클릭하여
LiteDBConnection, LiteDBStatement를 추가한다.
신규 폼을 생성한 후 LiteDBConnection, LiteDBStatement를 화면에 그린다.
LiteDBConnection 의 속성 중 datasource에 c:\Temp\localDB\localDB.s3db로 파일을 만듭니다.
datasource의 위치는 개발환경에 맞도록 설정하면 됩니다.
Project Explorer에서 LiteDBConnection00 우클릭 메뉴 중 Edit를 선택하여 DB editor을 오픈하게 되면 datasource에서 지정한 위치에 파일이 생성되는 것을 확인할 수 있습니다.
정상적으로 DB파일이 datasource에 지정한 위치에 생성되는 것을 확인할 수 있습니다.
데이터 정의 (DDL)
넥사크로의 데이터 정의 언어(DDL)은 스크립트 로직에서 처리는 불가능 하며 DB editor에서 가능합니다.
LiteDBConnection00을 우클릭하여 Create Table메뉴를 통해 Table을 생성할 수 있습니다.
Create Table창에서 add a new field를 클릭하여 table name, column name, type, primaryKey 등을 추가 및 수정할 수 있습니다.
Table 생성/수정 작업이 완료되면 하단의 Execute SQL버튼을 클릭하여 Table을 생성/수정할 수 있습니다.
Table이 정상적으로 반영되면 Output창에 command has been complete 메시지가 출력되는 것을 확인할 수 있습니다.
Table정보에 대한 생성/수정작업이 끝났다고 하여 키보드 ctrl + s로 저장되지 않으니 반드시 Execute SQL버튼을 클릭하여 반영되었는지 확인하시기 바랍니다.
기타 생성된 Table에 대한 Drop 및 rename등은 해당 Table에서 마우스 오른쪽을 클릭하여 작업이 가능합니다.
브라우저(Fire Fox)의 부가기능 중 SQLite Manager를 이용하여 테이블 작업이 가능합니다.
제세한 내용은 SQLite Manger 사용방법을 확인하시기 바라며, 해당 유틸에 대해서는 별도 설명을 하지 않습니다.
브라우저(Fire Fox)의 부가기능에서 SQLite Manager를 검색하여 설치합니다.
설치를 하였다면 브라우저(FireFox)에서 키보드 alt키를 누르게 되면 상단에 도구메뉴에 SQLite Manager가 나타나는 것을 확인할 수 있습니다.
SQL Manager를 이용하여 넥사크로에서 생성된 Table정보를 확인할 수 있습니다.
SQL Manager를 이용하여 Table 관리가 가능하므로 유용하게 사용할 수 있습니다.
SQL Manager 사용을 권장합니다.
데이터 조작 언어(DML)
테이블 생성 및 컬럼정보를 정의하였으므로 이제 데이타를 입력하는 부분을 설명하겠습니다.
작업을 위한 버튼을 4개 생성합니다
insert, update, delete, select 문을 구현하기 위한 준비작업
Insert
첫번째로 insert 작업에 대한 설정입니다.
LiteDBStatement00 속성 ldbconnection에는 LiteDBConnection00을 설정합니다.
LiteDBStatement00을 선택하여 속성 중 query란에 insert문장을 기술합니다.
Ex) insert into department values('100','CS Team','Gangnam-Gu, Seoul, Korea','135-873','1588-7895')
insert문을 실행하기 위해 버튼(insert) onclick이벤트에 다음의 스크립트를 기술합니다.
this.Button00_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { this.LiteDBConnection00.open(); this.LiteDBStatement00.executeUpdate(); }
QuickView를 이용하여 해당 버튼을 클릭하여 insert문장을 실행합니다.
실행된 결과를 Refresh Database메뉴를 통해 추가된 값을 확인 할 수 있습니다.
Select
Table에 저장된 데이타를 조회하는 방법을 기술합니다.
조회된 데이타를 보여주기 위해 Dataset(Dataset00)과 그리드를 생성합니다.
조회용 LiteDBStatement를 하나 더 만들고 이름을 SelectStatement(개발자 정의)로 지정합니다.
select 문을 실행하기 위해 버튼(select) onclick이벤트에 다음의 스크립트를 기술합니다.
this.Button03_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { this.LiteDBConnection00.open(); this.SelectStatement.executeQuery(); }
Ex) select code, name, address, zipcode, telno from department
Local DB에서 조회된 내용을 Dataset에 복사하도록 스크립트를 기술합니다.
this.SelectStatement_onsuccess = function(obj:LiteDBStatement, e:nexacro.LiteDBEventInfo) { if(e.reason == 7) // Select { this.dsDepartment.copyData(e.returnvalue); } }
QuiciView를 실행하여 버튼(select)를 클릭하면 조회된 결과를 확인할 수 있습니다.
Update
입력된 데이타를 수정하는 방법에 대해 알아봅니다. 수정 또한 마찬가지로 버튼을 만들고 LiteDBStatement를 새로 만들어 update에 맞는 구문을 작성해 주면 됩니다.
LiteDBStatement를 추가하여 UpdateStatement로 이름을 정의하고 query속성에 update를 구현합니다.
버튼(update)의 클릭 이벤트에 스크립트를 작성합니다.
this.Button01_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { this.LiteDBConnection00.open(); this.UpdateStatement.executeUpdate(); }
Ex) update department set name = 'Support Team' where code = '100'
QuiciView를 실행하여 버튼(update)를 클릭한 후 버튼(select)를 클릭하여 변경된 값을 확인할 수 있습니다.
Delete
입력된 정보를 삭제하는 방법에 대해 기술합니다.
LiteDBStatement를 추가하여 DeleteStatement로 이름을 정의하고 query속성에 delete를 구현합니다.
버튼(delete)의 클릭 이벤트에 스크립트를 작성합니다.
this.Button02_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { this.LiteDBConnection00.open(); this.DeleteStatement.executeUpdate(); }
Ex) delete from department where code = '100'
QuiciView를 실행하여 버튼(select)를 클릭하여 데이타를 조회한 후 버튼(delete)를 클릭하면 데이타가 삭제됩니다. 다시 버튼(select)를 클릭해 보면 삭제된 결과를 확인할 수 있습니다.
기타
LocalDB는 서버에 위치 할경우 동작을 하지 않습니다. 항상 로컬에 위치시킨 뒤 사용하시기 바랍니다.
localDB 샘플은 오픈소스인 SQLite 을 연동한것으로 SQL 쿼리나 쿼리 사용법에 대한 기술지원은 하지 않습니다.
본문에 언급 했듯이 해당 DB 파일은 SQLite edit 프로그램 등을 사용하여 컬럼 수정 등 작업을 하실 수 있습니다.
추가 적으로 DB 작업을 하실 경우 해당 프로그램을 사용하시면 수월하게 컬럼명 을 재정의 할 수 있습니다.
DataSet을 연동한 Local DB샘플
위에서 설명한 Local DB 기본내용을 숙지하였다면 이제 Dataset과 그리드를 이용하여 사용하는 샘플을 참고하여 프로젝트에 적용해 보시기 바랍니다.
준비사항
아래 링크에서 소스를 다운로드 받아 PC 디렉토리에 압축을 해제합니다.
압축을 해제하면 DB폴더에 localDB.s3db파일을 내문서 폴더에 복사합니다.
넥사크로 스튜디오를 실행하여 LocalDB폴더의 샘플 프로젝트를 오픈하여 확인합니다.
관련내용은 이미 설명이 된 내용이므로 소스에 대한 별도 설명은 하지 않습니다.
관련소스
Local DB 샘플소스