728x90

출처

ajax

	// ajax demo
	$('#math_class_tree')
		.on('changed.jstree', function (e, data) {
			console.log('select node id / ' + data.node.id);
		})
		.jstree({
			'core' : {
				'data' : {
					"url" : function(node) {
						console.log('node.id = ' + node.id);
						return "json.mat";
					},
					"data" : function(node) {
						return {
							'cmd' : 'mat_class_table',
							'subcmd' : 'tree',
							'id' : node.id
						};
					},
					"dataType" : "json",
					"success" : function(data, status, res, parent) {
						console.log("test");
					}
				}
			}
		});


728x90
728x90

출처

Code

    func initWebView(activityIndicator: UIActivityIndicatorView) {
        // 생략...
        contentController.add(self, name: "native_console_log")
        // 생략...
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if(message.name == "native_console_log") {
            native_console_log(didReceive: message)
        }
    }

    func native_console_log(didReceive message: WKScriptMessage) {
        print(NSString(string: "console.log: \(message.body)"))
    }
 
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        #if CONSOLE_LOG
            let js = "var console = { log: function(message) { webkit.messageHandlers.native_console_log.postMessage(JSON.stringify(message)) } }"
            webView.evaluateJavaScript(js)
        #endif
    }

빌드 옵션 추가

728x90
728x90

출처

키생성 (bluexmas.jks 파일 생성)

C:\Users\bluesanta>"%JAVA_HOME%\bin\keytool" -genkey -keysize 2048 -keyalg RSA -keystore bluexmas.jks -dname "CN=me.co.kr, OU=team, O=company, L=seoul, ST=seoul, C=kr" -validity 3650
키 저장소 비밀번호 입력:
새 비밀번호 다시 입력:
<mykey>에 대한 키 비밀번호를 입력하십시오.
        (키 저장소 비밀번호와 동일한 경우 Enter 키를 누름):
새 비밀번호 다시 입력:

Warning:
JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore bluexmas.jks -destkeystore bluexmas.jks -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다.

키파일 적용 (conf/server.xml)

    <Connector 
    	port="8443" 
	protocol="HTTP/1.1" SSLEnabled="true"
	maxThreads="150" scheme="https" secure="true" clientAuth="false"
	keystoreFile="conf/bluexmas.jks" keystorePass="bluexmas"
	sslEnabledProtocols="TLSv1.1,TLSv1.2"
	ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
		TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
		TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256,
		TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA256,
		TLS_RSA_WITH_AES_256_CBC_SHA" />

리다이렉트 시키기 (WEB-INF/web.xml 내용추가)

	<security-constraint>   
		<web-resource-collection>      
			<web-resource-name>Secured</web-resource-name>      
			<url-pattern>/*</url-pattern>   
		</web-resource-collection>   
		<user-data-constraint>      
			<transport-guarantee>CONFIDENTIAL</transport-guarantee>   
		</user-data-constraint>
	</security-constraint>
728x90
728x90

출처 : 아파치 톰캣(apache tomcat) 을 jmx 로 monitoring 하기

catalina-jmx-remote.jar 파일 Tomcat이 설치된 디렉토리의 lib디렉토리에 복사

https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.23/bin/extras/

$ cd /usr/local/apache-tomcat-8.5.23/lib
$ wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.23/bin/extras/catalina-jmx-remote.jar

IP 확인

$ ifconfig | grep "inet addr"
          inet addr:192.168.0.24  Bcast:192.168.0.255  Mask:255.255.255.0
          inet addr:127.0.0.1  Mask:255.0.0.0

setenv.sh 파일 생성

$ cd /usr/local/apache-tomcat-8.5.23/bin

setenv.sh 파일 내용

$ vi setenv.sh
  • -Dcom.sun.management.jmxremote.authenticate=false / 인증하지 않음
  • -Djava.rmi.server.hostname=192.168.0.24 / 톰캣이 구동되는 서버의 IP
  • -Dcom.sun.management.jmxremote.ssl=false / SSL 을 사용하지 않음
#!/bin/sh

JMX_OPTS=" -Dcom.sun.management.jmxremote \
                 -Dcom.sun.management.jmxremote.authenticate=false \
                 -Djava.rmi.server.hostname=192.168.0.24 \
                 -Dcom.sun.management.jmxremote.ssl=false "
CATALINA_OPTS=" ${JMX_OPTS} ${CATALINA_OPTS}"

conf/server.xml 수정 - Listener 추가

<Server port="8005" shutdown="SHUTDOWN">

<!-- 생략 --->

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
        rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/>

jdk의 jconsole.exe 실행

권한파일(jmxremote.access)과 로그인 암호파일(jmxremote.password) 생성

$ cd /usr/local/apache-tomcat-8.5.23/
$ echo -e "monitorRole readonly\ncontrolRole readwrite" > conf/jmxremote.access
$ cat conf/jmxremote.access
monitorRole readonly
controlRole readwrite
$ echo -e "monitorRole tomcat\ncontrolRole tomcat" > conf/jmxremote.password
$ cat conf/jmxremote.password
monitorRole tomcat
controlRole tomcat

setenv.sh 파일 수정

$ cd /usr/local/apache-tomcat-8.5.23/bin
$ vi setenv.sh

#!/bin/sh

JMX_OPTS=" -Dcom.sun.management.jmxremote \
           -Dcom.sun.management.jmxremote.authenticate=true \
           -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password  \
           -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access  \
           -Djava.rmi.server.hostname=192.168.0.24 \
           -Dcom.sun.management.jmxremote.ssl=false "
CATALINA_OPTS=" ${JMX_OPTS} ${CATALINA_OPTS}"

setenv.bat 파일 내용 - Windows 용

set JMX_OPTS=-Dcom.sun.management.jmxremote ^
-Dcom.sun.management.jmxremote.authenticate=true ^
-Dcom.sun.management.jmxremote.password.file=%CATALINA_HOME%/conf/jmxremote.password ^
-Dcom.sun.management.jmxremote.access.file=%CATALINA_HOME%/conf/jmxremote.access ^
-Djava.rmi.server.hostname=192.168.0.31 ^
-Dcom.sun.management.jmxremote.ssl=false

set CATALINA_OPTS=%JMX_OPTS% %CATALINA_OPTS%
728x90
728x90

출처 : 넥사크로플랫폼(nexacro platform) HTML5 API 설치

기존 Nexacro 프로젝트 폴더에서 frame, image, lib 폴더를 복사해서 현재 프로젝트에 붙여넣기

복사한 폴더 등록 (서비스 등록)

TypeDefinition 더블 클릭

[Services] 텝 [Add] 버튼 선택

frame 추가

image 추가

lib 추가

추가된 목록

등록 확인

공통 라이브러리 참조

include "lib::comLib.xjs"
728x90
728x90

출처 : 파트 IV. 컴포넌트 / 16. Grid 16.10그리드 행/열 합계 - 넥사크로플랫폼 ...
농부지기 :: Nexacro.Grid - all Checked 처리
농부지기 :: Nexacro.Grid - grid header

Dataset에 Checkbox의 체크값을 저장하기 위한 컬럼 추가

컬럼 추가 버튼 선택

chk 컬럼 추가

Grid의 컬럼 추가

[Insert] 버튼을 선택하여 Grid에 컬럼을 추가

컬럼헤더의 text 수정

컬럼의 expr, text 수정

  • expr : expr:chk=='Y'?'1':'0'
  • text : bind:chk

컬럼의 displaytype, edittype를 checkbox로 수정

  • displaytype : checkbox
  • edittype : checkbox

Grid의 Checkbox 컬럼의 체크 값 변경시 Dataset에 반영되도록 스크립트 작성

Nexacro 의 체크박스는 체크가 된 경우 1 / 체크가 되지 않은 경우 0의 Dataset의 체크값을 변경하기 위해서 스크립트 작성

this.Dataset00_oncolumnchanged = function(obj:Dataset, e:nexacro.DSColChangeEventInfo)
{
	// chk 컬럼인 경우
	if(e.columnid == "chk") {
		// 다른 이벤트가 동작하지 않도록 설정
		obj.enableevent = false;  //false can stop event temporarily  
		// 변경된 값이 1(체크가 된 경우)인경우
		if(e.newvalue == '1') {
			// 1인 경우 Dataset의 chk 값을 Y로 변경
			obj.setColumn(e.row,"chk",'Y');
		} else if(e.newvalue == '0') {
			// 0인 경우 Dataset의 chk 값을 N로 변경
			obj.setColumn(e.row,"chk",'N');  
		}
		// 다시 이벤트가 정상 동작하도록 설정
		obj.enableevent = true;
	}
}

체크값 전달을 위해서 SampleVO 클래스에 chk 변수 추가

public class SampleVO extends DefaultVO implements Serializable {
	
	private java.lang.String chk;

// ... 생략 ...

	public java.lang.String getChk() {
		return chk;
	}

	public void setChk(java.lang.String chk) {
		this.chk = chk;
	}


... 생략 ...

컬럼 헤더 클릭시 체크박스 전부 선택되도록 스크립트 작성

this.Grid00_onheadclick = function(obj:Grid, e:nexacro.GridClickEventInfo)
{
	// 첫 번째 컬럼인 경우
	if (e.col == 0) { 
		// Dataset의 레코드 개수 만큼 반복
		for(var nRow=0; nRow < this.Dataset00.getRowCount(); nRow++) {
			// chk 컬럼의 값을 Y로 변경
			this.Dataset00.setColumn(nRow, "chk", 'Y');
		}
	}
}

체크값 확인

package bizservice.nexa.sample.service;

public class EgovSampleServiceXpImpl extends AbstractServiceImpl implements EgovSampleServiceXp {

	 public void multiDataModifyService(List<Object> tranInfo,
				Map<String, Object> inVar, Map<String, List<Object>> inDataset,
				Map<String, Object> outVar, Map<String, Object> outDataset)
				throws Exception {
				
			//서비스단 개발
			List<Object> list = inDataset.get("input1");
			
			for (int i = 0; i < list.size(); i++) {
				Object obj = list.get(i);
				if (obj instanceof SampleVO){
					SampleVO row = (SampleVO)obj;
					System.out.println("pk.post_id = " + row.getPost_id() + "/체크여부 = " + row.getChk());
					// 추가 작업 구현
				}
			}

조회 SQL문 수정 (src\main\resources\egovframework\sqlmap\bizservice\sample\Sample.xml) - 불필요한 작업

	<!-- Sample resultObject -->
	<resultMap id="sample" class="bizservice.nexa.sample.vo.SampleVO">
		<result property="chk" column="CHK" />  <!-- chk 컬럼 추가 -->

<!-- 생략 -->
        
	<select id="sampleDAO.selectSampleVOList" parameterClass="searchVO" resultMap="sample">
		SELECT 'N' chk,
		       A.num AS num,
 		       A.TITLE AS TITLE, 
		       A.REG_ID AS REG_ID, 
 		       A.REG_DATE AS REG_DATE, 
		       A.POST_ID AS POST_ID, 
		       A.CONTENTS AS CONTENTS, 
		       A.COMMUNITY_ID AS COMMUNITY_ID,
		       A.COUNT AS COUNT
		  FROM XP_BOARD A
		 WHERE 1=1
	</select>

<!-- 생략 -->
728x90
728x90

출처 : 전자정부 표준프레임워크 3.2 기반 넥사크로 플랫폼 개발자 가이드

Nexacro - 서버 호출 Button 이벤트

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
	var sSvcID          = "list";                   
    var sController     = "blueController.do";
    var sInDatasets     = "";  
    var sOutDatasets    = "";
    var sArgs="";
    
    // 서비스 아이디
    var strSvcID = {id:sSvcID, outDatasets:sOutDatasets};
    
    // 서비스 변수 값 가지고 오기
    var sSvcUrl = application.services["svcurl"].url;
    // 서버 호출 주소 생성
    var strURL = sSvcUrl + sController;

    // Ex.core.tran(this, sSvcID, sController, sInDatasets, sOutDatasets, sArgs);
    this.transaction(strSvcID, strURL, sInDatasets, sOutDatasets, sArgs, "received", true, false);
}

this.received = function(id, code, message)
{
    alert(code);
}

Server - Controller 클래스 생성

package bizservice.nexa.cmmn.map.controller;

import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import egovframework.rte.cmmn.ria.nexacro.NexacroConstant;
import egovframework.rte.cmmn.ria.nexacro.map.DataSetMap;
import egovframework.rte.cmmn.ria.nexacro.map.NexacroMapDTO;

@Controller
public class BlueController {

	protected Log logger = LogFactory.getLog(this.getClass());

	@RequestMapping("/blueController.do")
	public ModelAndView operate(NexacroMapDTO xpDto, Model model) throws Exception {

		ModelAndView mav = new ModelAndView("nexacroMapView");

		try {
			DataSetMap tranInfo 				= xpDto.getTranInfoMap();
			Map <String, Object> inVar 			= xpDto.getInVariableMap();
			Map <String, DataSetMap> inDataset 	= xpDto.getInDataSetMap();
			Map <String, Object> outVar 		= xpDto.getOutVariableMap();
			Map <String, DataSetMap> outDataset = xpDto.getOutDataSetMap();
			
			System.out.println("tranInfo : " + tranInfo);
			System.out.println("inVar : " + inVar);
			System.out.println("inDataset : " + inDataset);
			System.out.println("outVar : " + outVar);
			System.out.println("outDataset : " + outDataset);
			
			mav.addObject(NexacroConstant.ERROR_CODE, "0");
			mav.addObject(NexacroConstant.ERROR_MSG, "");

		} catch (Exception e) {
			e.printStackTrace();
			mav.addObject(NexacroConstant.ERROR_CODE, "-1");
			mav.addObject(NexacroConstant.ERROR_MSG, e.toString());
		}
		return mav;
	}
}

서버 로그

tranInfo : egovframework.rte.cmmn.ria.nexacro.map.DataSetMap@10c2d26
inVar : {PAGE={}, serverType=local, USER={}}
inDataset : {}
outVar : {}
outDataset : {}

Nexacro - 서버 호출 Button 이벤트 - 파라미터 구성 추가

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
	var sSvcID          = "list";                   
    var sController     = "blueController.do";
    var sInDatasets     = "";  
    var sOutDatasets    = "";
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // 파라미터 구성
    var sArgs="";
    sArgs += Ex.util.setParam("method","getList");
    sArgs += application.gfn_setParam("sqlId","blueDAO.getList");
    sArgs += Ex.util.setParam("inputClass","bizservice.nexa.domain.Dept");
    sArgs += Ex.util.setParam("outputClass","bizservice.nexa.domain.Dept");
    
    // 서비스 아이디
    var strSvcID = {id:sSvcID, outDatasets:sOutDatasets};
    
    // 서비스 변수 값 가지고 오기
    var sSvcUrl = application.services["svcurl"].url;
    // 서버 호출 주소 생성
    var strURL = sSvcUrl + sController;

    // Ex.core.tran(this, sSvcID, sController, sInDatasets, sOutDatasets, sArgs);
    this.transaction(strSvcID, strURL, sInDatasets, sOutDatasets, sArgs, "received", true, false);
}

Server - 서버 로그

tranInfo : egovframework.rte.cmmn.ria.nexacro.map.DataSetMap@1a80f5c
inVar : {PAGE={}, method=getList sqlId=blueDAO.getListVO inputClass=bizservice.nexa.domain.Dept outputClass=bizservice.nexa.domain.Dept , serverType=local, USER={}}
inDataset : {}
outVar : {}
outDataset : {}

Nexacro - application 내장 함수 만들기

호출 과정을 정리 해본것으로 실제 사용시 Eco, Ex 라이브러리를 사용 필요

스크립트 창 열기

this.gv_op = "OP";

this.gfn_isNull = function(value)
{
    return value === null;
}
 
this.gfn_isUndefined = function(value)
{
    return value === undefined;
}
 
/**
 * 공백으로치환
 * @param {string} 체크할  파리미터명
 * @return {string} 공백으로 치환값
 * @example
 *    trace(Eco.isEmpty("")); (output) ""
 * @memberOf Ex.util
 */    
this.gfn_isReplaceEmpty = function(strArg)
{
      if( this.gfn_isNull(strArg) || this.gfn_isUndefined(strArg)) return "";
       else
       return strArg;
}
 
this.gfn_setParam = function (p_name, p_value)
{          
    return p_name + "="+this.gfn_isReplaceEmpty(p_value)+ " ";
}

this.gfn_transaction = function(obj, svcID, sController, inDatasets, outDatasets, argument, callbackFunc)
{
    // Service ID Merge
    var strSvcID = {id:svcID, callbackFunc:callbackFunc, outDatasets:outDatasets};
    var strInDatasets = inDatasets;
    var strOutDatasets = outDatasets;
    var strArgument = argument;
    var strCallbackFunc = callbackFunc;
    
    // 서비스 변수 값 가지고 오기
    var sSvcUrl = this.services["svcurl"].url;
    // 서버 호출 주소 생성
    var strURL = sSvcUrl + sController;

    // 
    obj.transaction(strSvcID, strURL, strInDatasets, strOutDatasets, strArgument, strCallbackFunc, true, false);
}

Nexacro - 서버 호출 Button 이벤트

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
	var sSvcID          = "list";                   
    var sController     = "blueController.do";
    var sInDatasets     = "";  
    var sOutDatasets    = "";
    
     ///////////////////////////////////////////////////////////////////////////////////////////////////
    // 2015.06.12 VO방식 테스트
    var sArgs="";
    sArgs += application.gfn_setParam("method","getList");
    sArgs += application.gfn_setParam("sqlId","blueDAO.getList");
    sArgs += application.gfn_setParam("inputClass","bizservice.nexa.domain.Dept");
    sArgs += application.gfn_setParam("outputClass","bizservice.nexa.domain.Dept");
    
    //
    application.gfn_transaction(this, sSvcID, sController, sInDatasets, sOutDatasets, sArgs, "received");
}

this.received = function(id, code, message)
{
    alert(code);
}

Server - 서비스 구현

서비스 인터페이스

package bizservice.nexa.cmmn.map.service;

import java.util.Map;

import egovframework.rte.cmmn.ria.nexacro.map.DataSetMap;

public interface BlueService {

	void getList(
			DataSetMap tranInfo,
			Map<String, Object> inVar, Map<String, DataSetMap> inDataset,
			Map<String, Object> outVar, Map<String, DataSetMap> outDataset) throws Exception;
}

서비스 구현

package bizservice.nexa.cmmn.map.service;

import java.util.Map;

import org.springframework.stereotype.Service;

import egovframework.rte.cmmn.ria.nexacro.map.DataSetMap;

@Service("blueService")
public class BlueServiceImpl implements BlueService {

	public void getList(DataSetMap tranInfo,
			Map<String, Object> inVar, Map<String, DataSetMap> inDataset,
			Map<String, Object> outVar, Map<String, DataSetMap> outDataset)
		throws Exception 
	{
		// DAO 호출 구현
	}
}

서비스 호출 Controller 구현

package bizservice.nexa.cmmn.map.controller;

import java.lang.reflect.Method;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import bizservice.nexa.cmmn.map.service.BlueService;
import egovframework.rte.cmmn.ria.nexacro.NexacroConstant;
import egovframework.rte.cmmn.ria.nexacro.map.DataSetMap;
import egovframework.rte.cmmn.ria.nexacro.map.NexacroMapDTO;

@Controller
public class BlueController {

	protected Log logger = LogFactory.getLog(this.getClass());
	
	@Resource(name="blueService")
	BlueService blueService;

	@RequestMapping("/blueController.do")
	public ModelAndView operate(NexacroMapDTO xpDto, Model model) throws Exception {

		ModelAndView mav = new ModelAndView("nexacroMapView");

		try {
			DataSetMap tranInfo 				= xpDto.getTranInfoMap();
			Map <String, Object> inVar 			= xpDto.getInVariableMap();
			Map <String, DataSetMap> inDataset 	= xpDto.getInDataSetMap();
			Map <String, Object> outVar 		= xpDto.getOutVariableMap();
			Map <String, DataSetMap> outDataset = xpDto.getOutDataSetMap();
			
			for (Map map : tranInfo.getRowMaps()) {
				System.out.println("tranInfo.map : " + map);
			}
			System.out.println("inVar : " + inVar);
			System.out.println("inDataset : " + inDataset);
			System.out.println("outVar : " + outVar);
			System.out.println("outDataset : " + outDataset);
			
			// 서비스 객체
			Object bean = blueService;
			Method method = getMethod(bean, (String)inVar.get("method"));
			
			try{
				// 메소드 호출
				method.invoke(bean, new Object[] {tranInfo, inVar, inDataset, outVar, outDataset});
			} catch (Exception e){
				Throwable te = e.getCause();
				logger.debug("Can not invoke a dispatch method name", te);
				throw new Exception(te.getMessage(), te);
			}
			
			mav.addObject(NexacroConstant.ERROR_CODE, "0");
			mav.addObject(NexacroConstant.ERROR_MSG, "");

		} catch (Exception e) {
			e.printStackTrace();
			mav.addObject(NexacroConstant.ERROR_CODE, "-1");
			mav.addObject(NexacroConstant.ERROR_MSG, e.toString());
		}
		return mav;
	}
	
	private Method getMethod(Object bean, String methodName) throws Exception{
		Method[] methods = bean.getClass().getMethods();

		for(int i = 0 ; i < methods.length ; i++) {
			if( methods[i].getName().equals(methodName)) {
				return methods[i];
			}
		}
		throw new Exception("Cann't find " + methodName + ".");
	}
}

Server - 서비스 구현 - DAO 호출

package bizservice.nexa.cmmn.map.service;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import bizservice.nexa.cmmn.map.dao.BlueDAO;
import egovframework.rte.cmmn.ria.nexacro.map.DataSetMap;

@Service("blueService")
public class BlueServiceImpl implements BlueService {
	
	@Resource(name="sqlMapBlueDAO")
	BlueDAO blueDAO;

	public void getList(DataSetMap tranInfo,
			Map<String, Object> inVar, Map<String, DataSetMap> inDataset,
			Map<String, Object> outVar, Map<String, DataSetMap> outDataset)
		throws Exception 
	{
		// DAO 호출 구현
		// List<Map> records = blueDAO.getList("blueDAO.getList", inVar);
		List<Map> records = blueDAO.getList((String)inVar.get("sqlId"), inVar);
		System.out.println("records = " + records.size());
			
		DataSetMap outDsMap = new DataSetMap();
		outDsMap.setRowMaps(records);
		outDataset.put("output1", outDsMap);
	}
}

DAO 인터페이스

package bizservice.nexa.cmmn.map.dao;

import java.util.List;

import bizservice.nexa.exception.NexaDaoException;

public interface BlueDAO {

	public List getList(String queryId, Object objVo) throws NexaDaoException;

}

DAO 인터페이스 구현

package bizservice.nexa.cmmn.map.dao;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import bizservice.nexa.exception.NexaDaoException;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;

@Repository("sqlMapBlueDAO")
public class SqlMapBlueDAO extends EgovAbstractDAO implements BlueDAO {

	public List getList(String queryId, Object objVo) throws NexaDaoException {
		List<Object> list = new ArrayList();
		list = getSqlMapClientTemplate().queryForList(queryId, objVo);
		return list;
	}

}

SQL Map 파일 생성 - nexacroplatform\src\main\resources\egovframework\sqlmap\bizservice\sample\Blue.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">

<sqlMap namespace="Blue">

	<!-- code -->
	<select id="blueDAO.getList" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
		SELECT *
		  FROM XP_DEPT
	</select>

</sqlMap>

추가한 SQL Map 파일 Config에 추가 - nexacroplatform\src\main\resources\egovframework\sqlmap\bizservice\sql-map-config.xml

<sqlMap resource="egovframework/sqlmap/bizservice/sample/Blue.xml" />
728x90
728x90

출처 : 농부지기 :: Nexacro.Dataset - 한줄 추가.삭제
농부지기 :: Nexacro.Grid - excel exort

화면배치

  • Button : id : BtnAdd / text : 추가
  • Button : id : BtnDel / text : 삭제
  • Button : id : BtnSave / text : 저장

Grid 컬럼 속성의 edit 속성 변경

Grid를 더블클릭해서 Grid 컬럼 설정 화면으로 이동

title 컬럼의 edittype : normal 로 변경

contents 컬럼의 edittype : normal 로 변경

추가버튼(BtnAdd) 구현

this.BtnAdd_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
	var nRow = this.Dataset00.addRow();
	trace("nRow===>> " + nRow + " :" + this.Dataset00.saveXML());
}

삭제버튼(BtnDel) 구현

this.BtnDel_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
	var nRow = this.Dataset00.rowposition;
	this.Dataset00.deleteRow(nRow);
}

저장버튼(BtnSave) 구현

this.BtnSave_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
	var sSvcID        	= "save";                    
    var sController   	= "egovSampleModifyVO.do";

    var sInDatasets   	= "input1=Dataset00:U";
	var sOutDatasets  	= "";
	var sArgs = "";	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////
    // 2015.06.12 VO방식 테스트
    var sArgs="";
    sArgs += Ex.util.setParam("method","multiDataModifyService");
    sArgs += Ex.util.setParam("sqlId","sampleDAO.insertSampleVO");
    sArgs += Ex.util.setParam("inputClass","bizservice.nexa.sample.vo.SampleVO");
    sArgs += Ex.util.setParam("outputClass","bizservice.nexa.sample.vo.SampleVO");
    sArgs += Ex.util.setParam("forceSqlFlag","N");
    /////////////////////////////////////////////////////////////////////////////////////////////////
	
	//addInDataSet(this,  0, "ds_input","egovframework.rte.sample.service.XPSampleVO");
	//addOutDataSet(this, 0, "ds_output","egovframework.rte.sample.service.XPSampleVO");
	  
	Ex.core.tran(this,sSvcID, sController, sInDatasets, sOutDatasets, sArgs);
}

Spring Service 구현

package bizservice.nexa.sample.service;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Service;

import bizservice.nexa.sample.dao.SampleDAO;
import bizservice.nexa.sample.vo.SampleVO;

import com.nexacro.xapi.data.DataSet;

import egovframework.rte.cmmn.ria.nexacro.vo.RowType;
import egovframework.rte.fdl.cmmn.AbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;

@Service("sampleServiceXp")
public class EgovSampleServiceXpImpl extends AbstractServiceImpl implements EgovSampleServiceXp {
	protected Log logger = LogFactory.getLog(this.getClass());

	/** SampleDAO */
	@Resource(name = "sampleDAO")
	private SampleDAO sampleDAO;

	/** ID Generation */
	@Resource(name = "egovIdGnrService")
	private EgovIdGnrService egovIdGnrService;

	public List<?> sampleSelectVOList(SampleVO searchVO) throws Exception {
		// TODO Auto-generated method stub
		return sampleDAO.selectSampleVOList(searchVO);
	}

	/**
	 * 
	 * <PRE>
	 * 1. 메소드명 : saveData
	 * 2. 설    명 : DataSet의 rowType별로 Insert, Update, Delete가 수행되는 서비스이다.
	 * 3. 작 성 자 : 
	 * 4. 작 성 일 : 2016. 6. 11.
	 * </PRE>
	 * 
	 * @return ModelAndView
	 **/
	public void multiDataModifyService(
			List<Object> tranInfo, 
			Map<String, Object> inVar, 
			Map<String, List<Object>> inDataset, 
			Map<String, Object> outVar,
			Map<String, Object> outDataset) throws Exception 
	{
		// 서비스단 개발
		List<Object> list = inDataset.get("input1");

		for (int i = 0; i < list.size(); i++) {
			Object obj = list.get(i);
			if (obj instanceof RowType) {

				RowType rowType = (RowType) obj;
				if (rowType.getRowType() == DataSet.ROW_TYPE_INSERTED) {
					sampleDAO.insertSample(obj);
				} else if (rowType.getRowType() == DataSet.ROW_TYPE_UPDATED) {
					sampleDAO.updateSample(obj);
				} else if (rowType.getRowType() == DataSet.ROW_TYPE_DELETED) {
					sampleDAO.deleteSample(obj);
				}
			}
		}
	}
}
728x90

+ Recent posts