728x90

출처 : 

전역 데이타셋(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); 
}

실행 결과

728x90
728x90

출처 : 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>
728x90
728x90

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);
		}
	}
728x90
728x90

프로젝트 만들기

환경설정

Form 생성

Static 컴포넌트 추가

속성

  • text : 아이디

  • id : lblID

  • background : aqua

  • font : 14 Dotum

소스 생성하기

이클립스 새로고침

새로고침 전

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

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

실행 결과

728x90
728x90

출처 : 넥사크로플랫폼 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] 버튼 선택하여 실행

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

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

728x90
728x90

출처 : 넥사크로플랫폼 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에 설정한 주소 입력

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

728x90
728x90

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

작업폴더 변경

메뉴 [Tools] > [Options] 선택

프로젝트 생성

프로젝트 이름 설정

Type 설정

해상도 설정

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

Output 폴더 설정

폼 추가

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

폼 이름 설정

해상도 설정

Position 설정

Layout 설정

추가된 폼 확인

컨포넌트 추가

Static 컨포넌트 선택

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

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

실행

실행 결과

728x90
728x90

출처 : Android 7.0 Nougat OS 이미지 사진 촬영 캡처 및 자르기(1/2) - 허접샴푸로그래밍

Android7.0 이전 에서는 Uri.fromFile 함수로 파일의 URI 정보를 얻을 수 있지만, Android7.0 이후 부터는 보안상 이슈로 아래와 같이 설정하고, FileProvider.getUriForFile 함수를 이용해서 URI 정보를 얻어야 합니다.

/xml/provider_paths.xml 생성

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="storage/emulated" path="."/>
</paths>

AndroidManifest.xml 내용 추가

	<provider
	   android:name="android.support.v4.content.FileProvider"
	   android:authorities="${applicationId}.provider"
	   android:exported="false"
	   android:grantUriPermissions="true">
	    <meta-data
	        android:name="android.support.FILE_PROVIDER_PATHS"
	        android:resource="@xml/provider_paths"/>
	</provider> 
	...
</application>

FileProvider.getUriForFile 사용

Uri photoUri = FileProvider.getUriForFile(
    getApplicationContext(), 
    getApplicationContext().getPackageName() + ".provider", 
    currentFile
);
728x90

+ Recent posts