MiplatForm에서  특정 DLL 파일에 API를 사용하기 위해서는 DLL파일을 마이플랫폼에서 사용할 수 있게 맵핑해야 된다.

 

 

 

파일 -> 새로만들기 -> 프로젝트 생성을 선택하고

TobeSoftComponent Wizard를 선택하고  적당한 이름을 적어 프로젝트를 생성한다.

 

 

 

 

 

 

 

 

Module type에서 ExtApi를 선택하고, Module name에는  API이름을 적는다.
다.
( Module name은 나중에 StartXML에 등록할 때 사용할 이름과 같게 하시면 편리합니다.)


 *  MiPlatform SDK Path를 Browse를 사용하거나 입력하여 설정합니다. MiPlatform SDK Path를 지정해야 정상적으로 컴파일이 가능합니다.
* MiPlatform SDK Path는 MiPlatform과 함께 제공되는 MiPlatformSDK의 Root Directory를 지
정하셔야 합니다. 실제 디렉토리 지정은 환경설정에서 지정했던 

D:\Documents and Settings\Kiuk\My Documents\Visual Studio 2005\Templates\ProjectTemplates\Visual C++\Tobesoft\MiPlatform  상관없음 

* Component가 ANSI로도 사용할 예정이라면, “Add ANSI Configurations” 앞의 CheckBox를
체크해 주십시오. MiPlatform 3.2는 UNICODE를 권장합니다.
* MFC를 사용하지 않고자 하면, Not use MFC를 선택합니다.MFC를 사용하더라도 MFC 확장
DLL 형태로 제작하지 않아야 된다면, Use shared MFC DLL을 선택합니다.

설정이 끝났으면 다음으로 넘어간다.

 

 

 

 

외부 Dll 파일을 import 하는 경우라면 Use DLL Import를 체크합니다. 그리고 DLL target
module에서 import 대상 파일을 선택합니다

현재 내가 작업할  D:\windos\system32\MaApi_RD.dll   을 선택해준다 .

 

 

 

 

 

외부 Dll을 import하는 경우 해당 Dll에서 이용할 함수를 편하게 이용할 수 있도록 지정
할 수 있습니다. 해당 함수의 정확한 prototype을 입력해야 합니다. 각 입력값에 따라
Function signature를 통해 prototype의 형식을 가늠할 수 있습니다.

 

* 마크애니에서 지정한 출력프린터 리스트만 얻기위해서는

MaGetUsablePrinters2()

MaGetUsablePrinterCount2() 메서드를

 

MaPrtAPI.h 에 정의된 형태대로  추가해준다. 

즉 ExtAPI 에서 외부 DLL 작업을 할경우 헤더파일이 필요하다. DLL에 정의된 함수를 사용하기 위해서라면

 

 

 

 

마이플랫폼에서 호출해서 사용할 API 함수 형태를 정의한다.

 

*  Method name : method를 call할 때 사용하는 이름
*  Arguments prototype : method에서 사용할 argument의 형태를 지정합니다.
*  Input arguments : 입력인자의 개수를 검사할 때의 개수. 가변으로 할 때는 최소값을
입력한 후 소스코드에서 직접 고쳐야 합니다.
*  Return : Return값의 존재여부.
*  Method signature : PID에서 Method를 사용할 때 표시될, 메소드의 설명. 일반적으로
Method의 원형을 표시합니다. 주석을 제외한 부분이 보여집니다.

 

 

Finish 버튼을 눌러 프로젝트 생성을  완료한다.

 

 

 

 

 

완성된 프로젝트  다음과 같이 생성된다.

 

 

* . API 구현하기

 

 

구현 해야될 Sample 소스 코드는 다음과 같다.

 

PrinterList.cpp

 

#include <stdio.h>
#include <windows.h>
#include "../MaApi_RD/MaPrtAPI.h"

int main()
{
 int i = 1;
 char **szModelTmpText, **szDrvTmpText;

 int nCount = 0;
 int ret = 0;

 ret= MaGetUsablePrinterCount2(&nCount, 7); //Printer 갯수 구하기

 printf("%d",nCount);

 //memory 할당
 szModelTmpText = (char**)malloc(sizeof(char*) * nCount);
 szDrvTmpText = (char**)malloc(sizeof(char*) * nCount);

  for(i=0; i<nCount; i++)
  {
  szModelTmpText[i] = (char*)malloc(sizeof(char) * MAX_PATH);
  szDrvTmpText[i] = (char*)malloc(sizeof(char) * MAX_PATH);
  memset(szModelTmpText[i], 0x00, sizeof(szModelTmpText[i]));
  memset(szDrvTmpText[i], 0x00, sizeof(szDrvTmpText[i]));
  }
 
 //프린터이름/모델 배열 구하기 
 ret = MaGetUsablePrinters2(szModelTmpText, szDrvTmpText, &nCount, 7);

 for(i=0; i<nCount; i++)
 {
  printf("%s",szModelTmpText[i]);
 }

 return ret;
}

 

 

 

 

 

Cy_MaPrintList.h

 

 

자동생성된 코드의 설명은 생략하겠다.

// Cy_MaPrintList.h
//
//////////////////////////////////////////////////////////////////////////

#pragma once

#include "ExtApi/Cy_ExtAPIService.h"
#include "Cy_MaPrintListWrap.h"
#include "stdio.h"
#include "string.h"

 

 

int nCount=0; //프린터개수 
char **szModelTmpText;// 모델명
char** szDrvTmpText; // 드라이브명
int ret;

 

//클래스 내부에 있어야될 데이터가 외부에 전역으로 나와있다.

//클래스 내부에서 선언할경우 CY_RESULT Cy_MaPrintList::api_getMaprintList(Cy_ExprObject *pExprContext, const Cy_VariantList *pVars, Cy_Variant &RetVar)

내부에서 접근이 불가능하므로 부득이하게 외부에서 전역변수로 선언하여 사용하였다. (-_- 더좋은 대안이있다면 답변좀)


class Cy_MaPrintList :
 public Cy_ExtAPIService 
{
    static Cy_MaPrintListWrap c_MaPrintListWrap;
    static int c_nMaPrintListWrapRef;


 
public:
 Cy_MaPrintList ();
 virtual ~Cy_MaPrintList ();
 
 // API Map
 DECLARE_EXTAPI_MAP(Cy_MaPrintList);
 //  DECLARE_EXTAPI(apiname)
 DECLARE_EXTAPI(getMaprintList);   //API선언부 (자동생성된 코드임 )
 


 
private:
 
 void deleteMemory(char** pStrPrinterName , char** pStrPrinterModel);

// 동적으로할당한 메모리를 해제
 void GetMaPrintList(void);

//프린터 리스트 객체를 얻는 메서드
 

};

 

Cy_MaPrintList.cpp

// 자동으로 생성된 코드는 설명 생략

 

// Cy_MaPrintList.cpp : implementation of the Cy_MaPrintList class.
//
//////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Cy_ErrorCode.h"
#include "Platform/Cy_Common.h"
#include "Script/Cy_ExprOp.h"
#include "Cy_MaPrintList.h"


DECLARE_SERVICE_AFXDLL_ENTRY(EXTAPI_MODULE_TYPE, Cy_MaPrintList, 1000)

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

BEGIN_CY_EXTAPI_MAP(Cy_MaPrintList)
// CY_EXTAPI_INFO(class, method_name,  i, o , comment)
    CY_EXTAPI_INFO(Cy_MaPrintList,  getMaprintList,  0,   1, _T("getMaprintList()"))

END_CY_EXTAPI_MAP(Cy_MaPrintList)

Cy_MaPrintListWrap Cy_MaPrintList::c_MaPrintListWrap;
int Cy_MaPrintList::c_nMaPrintListWrapRef = 0;

Cy_MaPrintList::Cy_MaPrintList()
{
    if( Cy_MaPrintList::c_nMaPrintListWrapRef == 0 )
     Cy_MaPrintList::c_MaPrintListWrap.Init();
    Cy_MaPrintList::c_nMaPrintListWrapRef ++;
 
     this->GetMaPrintList(); //생성자 내부에서 프린트리스트를 얻어오는 메서드를 호출 
 
 
}

Cy_MaPrintList::~Cy_MaPrintList()
{
 
 this->deleteMemory(szModelTmpText,szDrvTmpText); //메모리 해제

    Cy_MaPrintList::c_nMaPrintListWrapRef --;
    if( Cy_MaPrintList::c_nMaPrintListWrapRef == 0 )
     Cy_MaPrintList::c_MaPrintListWrap.UnInit();
    ASSERT( Cy_MaPrintList::c_nMaPrintListWrapRef >= 0 );
}

//////////////////////////////////////////////////////////////////////////
// methods body
CY_RESULT Cy_MaPrintList::api_getMaprintList(Cy_ExprObject *pExprContext, const Cy_VariantList *pVars, Cy_Variant &RetVar)
{
 
 
 // Check Argument Count
 if( pVars == NULL || pVars->Count() != 0 )
 {
  if( pExprContext != NULL && pExprContext->IsSystemLogMode() )
  {
   Cy_Result err;
   err.AddMsg( CY_WRONGARGUMENT, __FILE__, __LINE__, _T("[ExtAPI:MaPrintList]"), _T("getMaprintList"), NULL );
   pExprContext->OnSystemError( err );
  }
  return CY_WRONGARGUMENT;
 }
 
 
 Cy_VariantList prnList;

 for(int i=0; i<nCount;i++)
 {  
  prnList.Add((Cy_Variant)szModelTmpText[i]);
 }
 
 
 RetVar.Set(prnList);

 
 
 return CY_OK;
}

 

 

이상하게도 메소드내에서 클래스 내부변수나 객체의 접근이 불가능하다. -_-도통이놈의 wizard툴이란..

MIP에서 자세한 기술지원을 해주지않아서 더 알아 내지는 못해서 결과를 내는데 급급하였다.

실제로 내부함수에서 리턴되는 CY_OK란  API호출의 성공, 실패여부만을 리턴하기때문에 결과적으로 이놈을 사용해서 값을 넘겨줄수 없다.

Cy_Variant RetVar 를 사용하여 값을 리턴시켜줘야된다.

RetVar에 어떤행위(?)를하여 반환하고자하는 값들을 set해서 넘겨주면된다.

현재 프린터 리스트 배열을 넘겨야 하므로  Cy_VariantList 객체를 사용하였다.

자세한내용은 각 형의 .h헤더파일을 참조하기바란다. 

Cy_VariantList 객체에 값을 담을경우 유니코드 인코딩이 자동으로 해주는것같다.

실제로 내부코드를  "aaaa", "가나다라" 로 넘길경우 인코딩에 문제가 발생한다.


// end methods body
//////////////////////////////////////////////////////////////////////////

 

//Ma_API를 사용하여 등록된 프린터 리스트만 얻어오는 함수

void Cy_MaPrintList::GetMaPrintList(void)
{
 int i = 1;

 ret= this->c_MaPrintListWrap.MaGetUsablePrinterCount2(&nCount, 7); //Printer 갯수 구하기

 //memory 할당
 szModelTmpText = (char**)malloc(sizeof(char*) * nCount);
 szDrvTmpText = (char**)malloc(sizeof(char*) * nCount);

  for(i=0; i<nCount; i++)
  {
  szModelTmpText[i] = (char*)malloc(sizeof(char) * MAX_PATH);
  szDrvTmpText[i] = (char*)malloc(sizeof(char) * MAX_PATH);
  memset(szModelTmpText[i], 0x00, sizeof(szModelTmpText[i]));
  memset(szDrvTmpText[i], 0x00, sizeof(szDrvTmpText[i]));
  }
 
 //프린터이름/모델 배열 구하기 
  
 ret = this->c_MaPrintListWrap.MaGetUsablePrinters2(szModelTmpText, szDrvTmpText, &nCount, 7);

}

 

//메모리  해제 함수

void Cy_MaPrintList::deleteMemory(char** pStrPrinterName , char** pStrPrinterModel)
{
 int i=0;
 
 if(nCount>0)
 {
  for(i=0; i<nCount; i++)
  {
   delete  szModelTmpText[i];
   delete  szDrvTmpText[i];
  }
  delete szModelTmpText;
  delete szDrvTmpText;
 }
}

 

빌드하여 DLL 파일을 생성한다.

그담 제대로 됬는지 테스트가 필요하다.

 

ExtAPI  적용 및 테스트 하기

 

 

 

바로전에 작업한 DLL이 생성된폴더에서 DLL파일을 복사하여

D:\Documents and Settings\Kiuk\Local Settings\Application Data\TOBESOFT\MiPlatform320U\Component

디릭토리에 붙여넣기한다.

 

 

 

[마이플랫폼에서 EXTAPI 컴포넌트 추가하기]

ProjectExplorer 에서

Global 탭을 선택하고

EXTAPIS 를 선택하고 더블클릭한다.

EXTAPI 이름을 적어준다. 이때 DLL 이름일아 맞지 않는다. 즉 최초로

프로젝트 생성시 입력한 API이름으로 적어준다.

 

 

마이플랫폼에서 test1폼을 생성하고 다음과 같이 코딩한다.

 


function test1_OnLoadCompleted(obj)
{
 
 var printList = this.getMaprintList();

 for (i = 0 ; i <printList.Length ; i++)
 {
 
  alert("prnList "+i+" "+ printList[i]);
 }
 
}

 

this하고 점을 찍었을경우 메서드목록에 나오지않을 경우도 있다. 그냥

API 정의된대로 메서드명을 적어준다.

 

테스트 결과

 


 

 

제대로 작동하는것을 알 수 있다.

 

 

'개발이야기' 카테고리의 다른 글

마이플랫폼 winDebug 사용하는방법  (0) 2018.10.18
EXTAPI DLL 배포하기  (0) 2018.10.18
Spring Security 이해하기  (0) 2018.10.11
Spring Security적용기 (1)  (0) 2018.08.02
IBATIS 동적 컬럼 만들기  (0) 2016.01.05
블로그 이미지

클라인STR

,

1. Spring Security KeyWord

  • Authentication (인증) : 사용자가 누구인지 확인하는 과정
  • Authorization (권한) : 현재 사용자가 특정 대상 (URL, 기능 등)을 사용할 권한이 있는지 검사하는것
  • Principal (접근주체) : 보호된 대상에 접근하는 사용자

Spring Security 는 인증과 권한과정을 Spring Security 에서 제공하는 Filter들의 흐름에 따라 이루어 지도록한다.

2. Authentication 와 SecurityContext

  • Authentication 의 용도 
    • 현재 접근 주체 정보를 담는 목적
    • 인증 요청 할때, 요청정보를 담는 목적
  • SecurityContext 
    • Authentication 을 보관
    • 스프링 시큐리티는 현재 사용자에 대한 Authentication 객체를 구할 때 SecurityContext로 부터 구한다.

Authentication 주요 메서드

  • String getName() : 사용자의 이름
  • Object getCredential() : 증명 값 (비밀번호)
  • Object getPrincipal() : 인증 주체 정보
  • boolean isAuthenticated() : 인증되었는지 여부
  • Collection getAuthorities() : 현재 사용자가 가진 권한

3. SecurityContextHolder

  • SecurityContext를 보관 
    • 기본 쓰레드로컬에 SecurityContext를 보관

4. AuthenticationManager

  • AuthenticationManager 인증을 처리함
  • 인증에 성공하면 인증 정보를 담고 있는 Authentication 객체 리턴 한다 
    • 스프링 시큐리티는 리턴한 Authenticatoin 객체를 SecurityContext에 보관 및 인증 상태를 유지하기 위해 세션에 보관
  • 인증 실패시 AuthenticationException을 발생시킨다.
public interface AuthenticationManager {
Authentication authenticate(Authentication authentication)
throws AuthenticationException
}

5. SecurityInterceptor

  • 인가를 처리한다. 
    • 웹의 경우 FilterSecurityInterceptor 구현 사용
    • AccessDecisionManager에 권한 검사 위임
  • 사용자가 자원의 보안 설정 기준으로, 접근 권한이 없을 경우 익셉션이 발생




'개발이야기' 카테고리의 다른 글

EXTAPI DLL 배포하기  (0) 2018.10.18
Tobesoft Component Wizard를 이용한 EXTAPI DLL만들기  (0) 2018.10.18
Spring Security적용기 (1)  (0) 2018.08.02
IBATIS 동적 컬럼 만들기  (0) 2016.01.05
자바 ArrayList 분할하기  (0) 2015.12.09
블로그 이미지

클라인STR

,

Spring Security를 처음으로 프로젝트에 적용해보았다. 몇년전 프로젝트를 하고있을때 Spring Seucrity를 프로젝트에서 적용하기 위해서  부단히도 노력했었던적이 있는데 그땐 책을 봐도 잘 몰랐었던거같은데, 새로운직장으로 이직을 하면서 적용해본 나름에 경험을 조금씩 남기고자 한다.  대부분의 기본적인 용어는 Spring Security3라는 책을 참조하였다.


https://spring.io/projects/spring-security#overview 예 서문에서는 아래와 같이 스프링 시큐리를 정의하고있다. 한마디로 얘기해서 

Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.

Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements


한마디로 정의하면 강력하고 사용자정의 가능한 인증 및 엑세스제어 프로그램이고 킹왕짱 좋다는 식으로(?) 으로 기술하고있다. 하지만 Spring Security를 커스터마이징 하는건 생각만큼 간단하지 않았었다는걸 경험으로 뼈저리게 느꼈었던거 같다. 물론 제대로 이해하지 못하고 적용하기위해서 온갖 삽질을 다해서 그럴지도 모른다.


기본개념 

  • 인증 (Authentication)
    • 인가된 사용자인지 확인하는 절차
    • 크리덴셜(Credential) 기반인증, 이중인증, 하드웨어 인증
  • 권한부여 (Authorization)
    • 인증된 주체에 권한을 확인하고 특정 기능 또는 데이터 접근을 허용하는 기능
  • 사용자 (Principal)
    • 보호된 대상에 접근하는 사용자 (User)
  • 비밀번호(Credential)
    • 사용자가 보호된 대상에 접근할 수 있는지 확인하기 위한것

스프링시큐리티는 인증된 주체를 고유하게 식별하는데 사용되는 자바 표준 보안 개념인 인증 (java.security.Principal)을 확장해서 사용한다. 전형적인 Principal에서는 시스템 사용자에 대한 1:1 매핑을 사용한다. Principal == 사용자 라고 보면된다.

권한부여라고 하면 두가지 작업을 아우르는데, 첫 번째 작업은 인증된 주체를 하나 이상의 권한 (역할)에 매핑하는 일이다. 예를 들어 웹 사이트를 단순 방문한 사용자는 방문자 권한을 부여받지만 웹 사이트 관리자는 관리자 권한을 부여받는다. 두 번째 작업은 보호된 리소스에 대한 권한 체크이다. 이러한 권한 체크는 주로 시스템이 개발될때 코드상에 명시적으로 선언하거나 설정 매개변수를 통해 이뤄진다. 예를 들어 온라인 애완 동물 상점의 재고를 관리하는 화면은 관리자 권한을 가진 사용자만 볼 수 있다.


보호된 리소스는 사용자의 권한에 따라 조건적으로 나타나야 하는 시스템 상의 모든 영역이 될 수 있다.

웹 어플리케이션에서 보호된 리소스는 개인 웹 페이지나 웹 사이트 전체 또는 개인페이지의 일부 영역이 될 수 있다. 이와 비교해 보면 보호된 비즈니스 리소스는 클래스에 대한 메서드 호출 또는 개별 비즈니스 객체가 될 수 있다.






블로그 이미지

클라인STR

,
1
2
3
4
5
6
7
8
9
SELECT 
                    AA.XXX                  
                  , MAX(DECODE(BB.CODE_CD,'1',BB.CODE_YN,'N'))CODE1_CD
                  , MAX(DECODE(BB.CODE_CD,'2',BB.CODE_YN,'N'))CODE2_CD
                  , MAX(DECODE(BB.CODE_CD,'3',BB.CODE_YN,'N'))CODE3_CD
                  , MAX(DECODE(BB.CODE_CD,'4',BB.CODE_YN,'N'))CODE4_CD
                  , MAX(DECODE(BB.CODE_CD,'5',BB.CODE_YN,'N'))CODE5_CD
    FROM 
....(중략).....
cs

 

IBATIS 를 사용하여 쿼리 출력시 행을 열로 변경해서 출력하는 경우 다음과 같은식으로 작성하였다.

코드컬럼에 값이 변경되는 경우가 발생하면 쿼리를 매번 수정해줘야되는 경우가 발생하여, 고민끝에 iterate를 사용하여 코드를 정리하기에 이르렀다.

 

 

1
2
3
4
5
6
7
8
9
<select id="XXX" ... remapResults=”true” > 
SELECT 
                    AA.XXX 
                    <iterate  property="paramList"   conjunction=""  >
                      , MAX(DECODE(BB.CODE_CD, #paramList[]# ,BB.CODE_YN,'N')) CODE_$paramList[]$
                    </iterate>                                     
    FROM 
....(중략).....    
</select>
cs

 

paramList 는 배열형태의 파라메터 이며 개수만큼 동적으로 컬럼을 생성하게끔 하였으며 컬럼이 동적으로 변경하는경우 remapResults=”true”

프로퍼티 속성을 명시해준다.

 

 

 

출처 : http://blog.naver.com/jkhljesus/70016617377







블로그 이미지

클라인STR

,

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

   /** 

     *  분할 집합 

     *  @param <T> 

     *  @param resList 꼭 분할 집합 

     *  @param count 모든 집합 요소 개수 

     *  @return 복귀 분할 후 각 집합 

     **/

    public static <T> List<List<T>> split(List<T> resList, int count) {

        if (resList == null || count <1)

            return null;

        List<List<T>> ret = new ArrayList<List<T>>();

        int size = resList.size();

        if (size <= count) {

            // 데이터 부족 count 지정 크기

            ret.add(resList);

        } else {

            int pre = size / count;

            int last = size % count;

            // 앞 pre 개 집합, 모든 크기 다 count 가지 요소

            for (int i = 0; i <pre; i++) {

                List<T> itemList = new ArrayList<T>();

                for (int j = 0; j <count; j++) {

                    itemList.add(resList.get(i * count + j));

                }

                ret.add(itemList);

            }

            // last 진행이 처리

            if (last > 0) {

                List<T> itemList = new ArrayList<T>();

                for (int i = 0; i <last; i++) {

                    itemList.add(resList.get(pre * count + i));

                }

                ret.add(itemList);

            }

        }

        return ret;

    }

 

 

                         Colored by Color Scripter
cs

 

출처 : http://www.programkr.com/blog/MYTMyEDMwYTx.html






블로그 이미지

클라인STR

,

jqGrid 설정 후 실행시 다음과같은 오류가 발생하였다.

해결방법은 2가지 인데..그리드에서 로케일을 설정하거나, 그리드 소스를 수정하는 방법이 있다.

1. 그리드 정의시 선언하는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

var grid = jQuery("#grid1");

        grid.jqGrid({

            url: '/sample/openSampleBoardList.do',

            mtype: "POST",

            datatype: "local",

            postData : JSON.stringify(  jQuery("#frm01").serialize() ),

            editUrl : 'clientArray',

            cellSubmit: 'clientArray',

            colNames: ['글번호''제목''설명'],                    

            colModel:[

                      {  name'SAMPLE_NO'    , width:30  , align:'center'   },

                      {  name'TITLE'        , width:30  , align:'left'     },   

                      {  name'DESCRIPTION'  , width:30  , align:'left'     }                      

            ],

            loadtext : "<img src='/images/loading.gif' />",            

            width:1145,                

            height :540,

            regional : 'kr',

            viewrecords: true,                        

            pager: "#pager1",

            page:1,

            pgbuttons:true,

            rowNum:500,

cs
 

regional : "kr"  로케일 속성

2. jqGrid.src 소스를 수정하는 경우

1
2
3
4
5
6
7
8
9
10

var p = $.extend(true,{

            url: "",

            height150,

            page: 1,

            rowNum: 20,

            rowTotal : null,

            ......            

            regional :  "kr"                                                                        

        }, $.jgrid.defaults , pin );

    

cs

 






블로그 이미지

클라인STR

,

이클립스 실행시 JVM을 찾지 못하면 다음과 같은 오류 메세지가 뜬다.

검색을 해보니 환경변수를 추가하지 않으면 생기는 오류로 인해 이클립스 설정파일에 JVM 경로를 추가해주면 해결된다.

-startup

plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar

--launcher.library

plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.300.v20150602-1417

-product

org.eclipse.epp.package.jee.product

--launcher.defaultAction

openFile

--launcher.XXMaxPermSize

256M

-vm

C:/workspace/bin/jdk1.7.0_79/bin

-showsplash

org.eclipse.platform

--launcher.XXMaxPermSize

256m

--launcher.defaultAction

openFile

--launcher.appendVmargs

-vmargs

-Dosgi.requiredJavaVersion=1.7

-Xms256m

-Xmx1024m


 






블로그 이미지

클라인STR

,

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

 

 

<!--  탭  -->

  <div id="tabs" >

      <ul class="check">

          <li class="show"><a href="#move">이동</a></li>                                                            

          <li class="hide"><a href="#rpar">수리</a></li>

      </ul>

   

        <!--  이동이력 탭 -->

        <div id="move" class="Tab_container">       

        </div>

 

         <!--  수리이력 탭 -->

         <div id="rpar" class="Tab_container">

         </div>

     </div>

cs

JQuery UI Tabs HTML 구성은 위와같다.

 

1
2
3
4
 
jQuery("#tabs").tabs({                                                                                              
        active: "2"
    });

cs

2번째 탭을 활성화 시킬경우

 

1
2
3
4
5
6
jQuery("#tabs a").click(function(){ 
            
      var tabId = jQuery("#tabs li.ui-state-active").attr("aria-controls");                                        
           
});
 
cs

탭을 클릭한 id 정보를 알고싶을경우

참고 : http://api.jqueryui.com/tabs/#option-active






블로그 이미지

클라인STR

,