TOMCAT - jmx 로 monitoring

Programming/Java 2017.12.07 23:46 Posted by 파란크리스마스

출처 : 아파치 톰캣(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%
저작자 표시
신고

Nexacro - 공통라이브러리, 공통 팝업 사용하기

Programming/Nexacro 2017.12.03 14:38 Posted by 파란크리스마스

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

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

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

TypeDefinition 더블 클릭

[Services] 텝 [Add] 버튼 선택

frame 추가

image 추가

lib 추가

추가된 목록

등록 확인

공통 라이브러리 참조

include "lib::comLib.xjs"
저작자 표시
신고

Nexacro - Grid에 CheckBox 추가 하기

Programming/Nexacro 2017.12.03 11:59 Posted by 파란크리스마스

출처 : 파트 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>

<!-- 생략 -->
저작자 표시
신고

Nexacro - Controller 호출

Programming/Nexacro 2017.11.26 18:49 Posted by 파란크리스마스

출처 : 전자정부 표준프레임워크 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" />
저작자 표시
신고

Nexacro - Grid 추가, 삭제, 저장

Programming/Nexacro 2017.11.25 20:39 Posted by 파란크리스마스

출처 : 농부지기 :: 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);
				}
			}
		}
	}
}
저작자 표시
신고

Nexacri - 데이터 결과를 Grid에 보여주기

Programming/Nexacro 2017.11.23 14:28 Posted by 파란크리스마스

출처 : 

전역 데이타셋(gds_pageInfo) 만들기

전역 데이타셋 추가

데이터셋 이름을 [gds_pageInfo] 으로 변경


<ColumnInfo>
  <Column id="PAGE_LINE" type="STRING" size="256"/>
  <Column id="CURR_PAGE" type="STRING" size="256"/>
</ColumnInfo>
<Rows>
  <Row>
    <Col id="PAGE_LINE"/>
    <Col id="CURR_PAGE"/>
  </Row>
</Rows>

application 내장 변수 설정

스크립트 창 열기

gv_op 변수에 "OP" 값 설정

this.gv_op = "OP";

서버 주소 설정

폼 만들기

메뉴 [File] > [New] > [Form] 선택

데이터셋(Dataset00) 추가

데이터셋 소스 설정

<ColumnInfo>
  <Column id="post_id" type="STRING" size="256"/>
  <Column id="title" type="STRING" size="256"/>
  <Column id="contents" type="STRING" size="256"/>
  <Column id="count" type="STRING" size="256"/>
</ColumnInfo>

화면배치

Button, Grid 배치

데이터셋 [Dataset00]을 선택한 후 드레그 해서 Grid위에 올려 둔다.

폼을 초기화 하기위해서 폼의 이벤트 목록에서 onload 구현하기

this.gird_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
	Ex.core.init(obj);
}

조회 버튼 이벤트 구현하기

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
	var sSvcID        	= "search";                    
	var sController   	= "egovSampleSelectVO.do"; //VO형태

	var sInDatasets   	= "";	
	var sOutDatasets  	= "Dataset00=output1";

	///////////////////////////////////////////////////////////////////////////////////////////////////
	// 2015.06.10 VO방식 테스트
	var sArgs="";
	sArgs += Ex.util.setParam("method","selectSampleVOList");
	sArgs += Ex.util.setParam("sqlId","sampleDAO.selectSampleVOList"); 
	sArgs += Ex.util.setParam("outputClass","bizservice.nexa.sample.vo.SampleVO");
	/////////////////////////////////////////////////////////////////////////////////////////////////
	
	Ex.core.tran(this,sSvcID, sController, sInDatasets, sOutDatasets, sArgs); 
}

실행 결과


저작자 표시
신고

Srping Security - 커스텀 UserDetailsService

Programming/Java 2017.11.22 13:26 Posted by 파란크리스마스

출처 : Spring Security part V : Security tags | DuyHai's Java Blog
Spring security authorize taglib with jstl variable if statement not working

UserDetails 구현

package com.iot.dao.domain;

import java.util.Collection;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

public class UserInfo implements UserDetails {

	// pk
	private String user_id;

	private String passwd;
	private int level;
	
	private Collection<? extends GrantedAuthority> authorities;

	public void setUser_id(String user_id) {
		this.user_id = user_id;
	}

	public String getUser_id() {
		return this.user_id;
	}

	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}

	public String getPasswd() {
		return this.passwd;
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	public void setAuthorities(Collection<? extends GrantedAuthority> authorities) {
		this.authorities = authorities;
	}

	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
		return this.authorities;
	}

	@Override
	public String getPassword() {
		return this.passwd;
	}

	@Override
	public String getUsername() {
		return this.user_id;
	}

	@Override
	public boolean isAccountNonExpired() {
		return true;
	}

	@Override
	public boolean isAccountNonLocked() {
		return true;
	}

	@Override
	public boolean isCredentialsNonExpired() {
		return true;
	}

	@Override
	public boolean isEnabled() {
		return true;
	}
}

UserDetailsService 구현

package com.iot.dao.service;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import com.iot.dao.domain.UserInfo;

@Service
public class AuthDetailsService implements UserDetailsService {

	@Autowired
	private UserInfoService userService;

	@Override
	public UserInfo loadUserByUsername(String user_id) throws UsernameNotFoundException {
		UserInfo userInfo = userService.selectUserInfo(user_id);

		//
		if (userInfo == null || userInfo.getDelete_yn().equals("Y")) {
			throw new UsernameNotFoundException("User details not found with this username: " + user_id);
		}

		String role = userInfo.getAuthority();

		List<GrantedAuthority> authList = getAuthorities(role);

		//
		userInfo.setAuthorities(authList);

		return userInfo;
	}

	private List<GrantedAuthority> getAuthorities(String role) {
		List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();
		authList.add(new SimpleGrantedAuthority("ROLE_USER"));

		// 
		if (role != null && role.trim().length() > 0) {
			if (role.equals("A")) {
				authList.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
			} else if (role.equals("S")) {
				authList.add(new SimpleGrantedAuthority("ROLE_MBER_MANAGER"));
			}
		}

		return authList;
	}
}

***-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:security="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.2.xsd">

	<!-- 확장자를 이용해 패턴을 걸때는 /**/*.해당 확장자 로 할 것(Ant Pattern 규칙) -->
	<security:http pattern="/**/*.js" security="none" />
	<security:http pattern="/**/*.css" security="none" />
	<security:http pattern="/images/*" security="none" />
	<security:http pattern="/login.iot" security="none" />

	<bean id="userService" class="com.iot.dao.service.AuthDetailsService" />

	<security:http auto-config="true">
		<security:intercept-url pattern="/json.iot" access="ROLE_ANONYMOUS,ROLE_USER" />
		<security:intercept-url pattern="/**/*.iot" access="ROLE_USER" />
		<security:intercept-url pattern="/user_add_ajax.iot" access="ROLE_ANONYMOUS" />

		<security:intercept-url pattern="/loginfailed.iot" access="ROLE_ANONYMOUS" />
		<security:intercept-url pattern="/logout" access="ROLE_ANONYMOUS" />

		<security:form-login login-page="/login.iot" default-target-url="/iot/transinfo_list.iot" authentication-failure-url="/loginfailed.iot" />
		<security:logout logout-success-url="/login.iot" />
		<security:access-denied-handler error-page="/loginfailed.iot" />

		<security:logout logout-url="/logout" success-handler-ref="/login.iot" />
	</security:http>

	<security:authentication-manager>
		<security:authentication-provider user-service-ref="userService" />
		<security:authentication-provider>
			<security:jdbc-user-service
				data-source-ref="dataSource"
				users-by-username-query="select user_id username, passwd, 1 as enabled from user_info where user_id = ? and delete_yn = 'N'"
				authorities-by-username-query="select name username, 'ROLE_USER' authority from user_info where user_id = ? and delete_yn = 'N'" />
		</security:authentication-provider>
	</security:authentication-manager>

</beans>

JSP

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

<sec:authentication property="principal.level" var="user_level"/>
${user_level}

<li class="dropdown">
	<a href="javascript:;" class="dropdown-toggle">사용자관리 <b class="caret"></b></a>
	<ul class="dropdown-menu">
		<c:if test="${user_level == 1}">
			<li class=""><a href="<c:url value="/car/user_list.car"/>">사용자관리</a></li>
		</c:if>
		<li><a href="<c:url value="/car/user_info.car"/>">내 정보</a></li>
		<li><a href="<c:url value="/logout"/>">로그아웃</a></li>
	</ul>
</li>
저작자 표시
신고

Nexacro - 로그인 Form 만들기

Programming/Nexacro 2017.11.20 22:04 Posted by 파란크리스마스

Static 컴포넌트 추가

속성

  • text : 아이디

  • id : lblID

  • background : aqua

  • font : 14 Dotum

=


Code

this.lblID00_onclick = function(obj:Static,  e:nexacro.ClickEventInfo)
{
	
}

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
	var objLoginId = this.txt_userId;
    var objLoginPw = this.txt_userPwd;
    
    alert("아이디 / " + objLoginId.value);

    this.trLogin(this,"login",objLoginId.value,objLoginPw.value);
}


/**
* Login service
* @param {string} id
* @param {string} pw
* @return {string] 변형문자열
* @example
* @memberOf Ex.core
*/
this.trLogin = function(obj, sSvcId, id, pw)		
{
	var sSvcID        	= sSvcId;
	var sController   	= "loginCheck.do";
	var sInDatasets   	= "";
	var sOutDatasets  	= "Dataset00=gds_userInfo gds_menu=gds_menu gds_message=gds_message gds_gridInfo=gds_gridInfo gds_config=gds_config gds_task=gds_task";
	var sArgs = "";

	sArgs += this.setParam("V_USER_ID",id);
	sArgs += this.setParam("V_USER_PWD",pw);

	this.tran(obj, sSvcID, sController, sInDatasets, sOutDatasets, sArgs, "received");
}

this.isNull = function(value)
{
	return value === null;
}

this.isUndefined = function(value)
{
	return value === undefined;
}

/**
 * 공백으로치환 
 * @param {string} 체크할  파리미터명
 * @return {string} 공백으로 치환값
 * @example
 *    trace(Eco.isEmpty("")); (output) ""
 * @memberOf Ex.util
 */		
this.isReplaceEmpty = function(strArg)
{
	  if( this.isNull(strArg) || this.isUndefined(strArg)) return "";
	   else
	   return strArg;
},

this.setParam = function (p_name, p_value)
{			
   	return p_name + "="+this.isReplaceEmpty(p_value)+ " ";
}

this.tran = function(obj, svcID, sController, inDatasets, outDatasets, argument, callbackFunc)
{
	// Service ID Merge
	var strSvcID = {id:svcID, callbackFunc:callbackFunc, outDatasets:outDatasets};
	var strURL = "http://localhost/" + sController;
	var strInDatasets = inDatasets;
	var strOutDatasets = outDatasets;
	var strArgument = argument;
	var strCallbackFunc = callbackFunc;
	var m_output = outDatasets;


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

this.received = function(id, code, message)
{
     if (code == 0) {
          this.alert(this.Dataset00.rowcount + " numbers of data have been found.");
          trace(this.Dataset00.rowcount + " numbers of data have been found.");
     } else {
          this.alert("Error["+code+"]:"+message);
          trace("Error["+code+"]:"+message);
     }
}

SERVER - Controller

	@RequestMapping("/loginCheck.do")
    public ModelAndView loginCheck(NexacroMapDTO xpDto, HttpServletRequest request) throws Exception {
		
		Log logger = LogFactory.getLog(this.getClass());	
		ModelAndView mav = new ModelAndView("nexacroMapView");

		try {
			Map <String, Object> inVar 			= xpDto.getInVariableMap();
			Map <String, DataSetMap> outDataset = xpDto.getOutDataSetMap();
			
			String sUserId = (String)inVar.get("V_USER_ID");
			String sPswd = (String)inVar.get("V_USER_PWD");
			
			if(("").equals(sUserId)){
				mav.addObject(NexacroConstant.ERROR_CODE, "-1");
				mav.addObject(NexacroConstant.ERROR_MSG, "ERROR");
				return mav;
			}
			
			if(("").equals(sPswd)){
				mav.addObject(NexacroConstant.ERROR_CODE, "-1");
				mav.addObject(NexacroConstant.ERROR_MSG, "ERROR");
				return mav;
			}
			
			User user = new User();
			user.setUser_id(sUserId);
			user.setPswd(sPswd);
			
			logger.debug("LogInOutController::loginCheck ...." + sUserId + " : " + sPswd);
			
			logInOutService.loginCheck(mav, user, request, outDataset);

			mav.addObject(NexacroConstant.OUT_VARIABLES_ATT_NAME, xpDto.getOutVariableMap());
			mav.addObject(NexacroConstant.OUT_DATASET_ATT_NAME, 	xpDto.getOutDataSetMap());
			
			mav.addObject(NexacroConstant.ERROR_CODE, "0");
			mav.addObject(NexacroConstant.ERROR_MSG, "");
		
		} catch ( Exception e ) {
			e.printStackTrace();
		}
		return mav;		
	}

SERVER - Service

	public void loginCheck(ModelAndView mav, User user, HttpServletRequest request, Map<String, DataSetMap> outDataset) throws NexaServiceException {
		this.user = logInOutDAO.loginCheck(user);
		
		System.out.println("this.user.................................." + this.user);

		if (this.user == null) {
			mav.addObject(NexacroConstant.ERROR_CODE, "-1");
			mav.addObject(NexacroConstant.ERROR_MSG, "User ID is Not Correct.");
			throw new NexaServiceException();
		} else if (this.user != null && !user.getPswd().equals(this.user.getPswd())) {
			mav.addObject(NexacroConstant.ERROR_CODE, "-1");
			mav.addObject(NexacroConstant.ERROR_MSG, "User Password is Not Correct.");
			throw new NexaServiceException();
		} else {
			//Convert Object to List
			List<Map> listUser = ObjectUtil.getObjectToList(this.user, "UPPER_CASE");
			List<Map> listMenu = logInOutDAO.loginMenu(this.user);
			//List<Map> listMessage = logInOutDAO.loginMessage();
			//loadConfig(request.getSession());
			
			request.getSession().setAttribute("User", this.user);
            
			Calendar ca = Calendar.getInstance();
			request.getSession().setAttribute("day", 	ca.get(Calendar.DAY_OF_MONTH));
			request.getSession().setAttribute("month", 	ca.get(Calendar.MONTH));
			request.getSession().setAttribute("year", 	ca.get(Calendar.YEAR));
			
			
			//[DataSet] Login User
			DataSetMap outUserDsMap = new DataSetMap();
			outUserDsMap.setRowMaps(listUser);
			outDataset.put("gds_userInfo", outUserDsMap);
			
			//[DataSet] Login User Menu
			DataSetMap outMenuDsMap = new DataSetMap();
			outMenuDsMap.setRowMaps(listMenu);
			outDataset.put("gds_menu", outMenuDsMap);
		}
	}
저작자 표시
신고

Nexacro - 프로젝트 만들기

Programming/Nexacro 2017.11.20 21:28 Posted by 파란크리스마스

프로젝트 만들기

환경설정

Form 생성

Static 컴포넌트 추가

속성

  • text : 아이디

  • id : lblID

  • background : aqua

  • font : 14 Dotum

소스 생성하기

이클립스 새로고침

새로고침 전

새로고침 후 (webapp 서브 폴더로 test 폴더가 생성된 것을 확인)

크롬브라우져에서 실행하기

실행 결과

저작자 표시
신고

[Nexacro] - 데이타셋 -Combobox 스크립트 작성

Programming/Nexacro 2017.11.11 23:49 Posted by 파란크리스마스

출처 : 넥사크로플랫폼 14 / 초보자를 위한 자습서 14.0.1.1501.2 화면 만들기 (트랜잭션)

컴포넌트 목록에서 [Dataset] 선택

Invisible Objects 창에 마우스 클릭

Dataset 추가 된것 확인

[Dataset Contents Editor]에서 컬럼 추가

[Dataset Contents Editor]에서 행(Row) 추가

Source 확인

<ColumnInfo>
  <Column id="code" type="STRING" size="32"/>
  <Column id="value" type="STRING" size="32"/>
</ColumnInfo>
<Rows>
  <Row>
    <Col id="code">1</Col>
    <Col id="value">Oracle</Col>
  </Row>
  <Row>
    <Col id="code">2</Col>
    <Col id="value">MySQL</Col>
  </Row>
  <Row>
    <Col id="code">3</Col>
    <Col id="value">SQL Server</Col>
  </Row>
</Rows>

컴포넌트 목록에서 [Combo] 선택

[Design] 창에 Drag해서 선택한 컴포넌트를 배치

[Combo] 컴포넌트의 속성창에서 [innerdataset] 항목을 [Dataset00]으로 선택

[codecolumn] : code / [datacolumn] : value 선택

컴포넌트 목록에서 [Button] 선택

[Design] 창에 Drag해서 선택한 컴포넌트를 배치

[Edit] 컴포넌트도 두개 배치

[Button00] 의 클릭 이벤트 스크립트 작성

Combo 박스에서 선택한 Index, Code, Value 확인하는 스크립트 작성

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
	this.alert(this.Combo00.getInnerDataset().name); // 바인된 Dataset name 
	this.alert(this.Combo00.getCount()) // item 개수
	this.alert(this.Combo00.index); // 선택된 index
	
	//
	this.alert('선택된 index = ' + this.Combo00.combolist._selectinfo.index);
	//
	this.edtCode.set_value(this.Combo00.combolist._selectinfo.value);
	this.edtText.set_value(this.Combo00.combolist._selectinfo.text);
}

[Quick View] 버튼 선택하여 실행

실행 - [선택] 버튼 선택전

실행 - [선택] 버튼 선택후

저작자 표시
신고

[Nexacro] - 일반 브라우저에서 실행

Programming/Nexacro 2017.11.11 18:34 Posted by 파란크리스마스

출처 : 넥사크로플랫폼 14 / 초보자를 위한 자습서 14.0.1.1501.2

Tomcat 설정

Tomca이설치된폴더\conf\server.xml 파일을 편집기로 열어서 아래 내용 추가

		<Context path="/nexacro_test" 
			docBase="C:/server/workspace.nexacro.outputs/nexacro_test" 
			debug="0" prvileged="true" reloadable="true">
			<Logger className="org.apache.catalina.logger.FileLogger"
				directory="logs" prefix="localhost_log." suffix=".txt"
				timestame="true"/>
		</Context>
	</Host>

Quick View 결과를 크롬 브라우저로 볼 수 있도록 [Runtime]을 Chrome로 설정

[Quick View] 버튼 선택

QuickView 창에 Tomct에 설정한 주소 입력

크롬 브라우저로 결과 확인(넥사크로 툴에서 자동으로 실행)

저작자 표시
신고

[Nexacro] - 프로젝트 생성

Programming/Nexacro 2017.11.11 15:57 Posted by 파란크리스마스

출처 : 넥사크로플랫폼 14 / 초보자를 위한 자습서 14.0.1.1501.2

작업폴더 변경

메뉴 [Tools] > [Options] 선택

프로젝트 생성

프로젝트 이름 설정

Type 설정

해상도 설정

기본적으로 생성된 프로젝트 구조

Output 폴더 설정

폼 추가

메뉴 [File] > [New] > [Form] 선택

폼 이름 설정

해상도 설정

Position 설정

Layout 설정

추가된 폼 확인

컨포넌트 추가

Static 컨포넌트 선택

마우스로 Drag해서 선택한 Static 컨포넌트 배치

Static 컨포넌트 속성값 중에 text 속성 변경

실행

실행 결과

저작자 표시
신고


 

티스토리 툴바