Sunday, November 18, 2007

Appeon 화면 웹에서 인수 전달 방법, EA server Connection Cache를 자바에서 이용 방법

1. Appeon 으로 생성한 화면에서 인수 전달 방법
톰켓과 JSP를 사용 하여 만든 웹 사이트에 Appeon으로 만들 파빌 화면을 껴 넣어 작동 시키려고 합니다.
로그인 인증을 Appeon상에서 다시 받지 않고 JSP에서 로그인 한 값을 같이 사용 하려 합니다.

로그인 인증을 톰켓에서 하므로 세션이나 쿠키값이 톰켓을 상대로 저장 되어서 직접적인 사용은 힘들게
생각 되어, JSP에서 로그인시 세션 키 값을 유저 정보에 넣어 주고, JSP에서 Appeon페이지를 부를 적에
UserID와 비번, 그리고 세션키를 Form방식으로 전송 하여 Appeon페이지가 해당 값을 가지고 DB를 통하여
세션키 유무와 UserID, 비번을 비교 하여 화면을 보여 줄지 말지를 판단 하려 합니다.

질문... Appeon페이지로 Post방식이나 Get 방식의 인수를 넘겨 주려면 어떻게 해야 하나요?

답..

1. appeon에 파라메터 보내는 방식은 Get 방식으로만 넘길 수 있습니다.
appeon으로 만든 webapplication에 get방식으로 넘기시면 됩니다.
appeon에서 받아 들일수 있는 파라메터는 powerbuilder에서 처럼
application object에서 commandparm()함수를 이용하여 받을 수 있습니다.
말씀 하신 것처럼 form방식으로 보내신다면 PowerBuilder에서 잘라서 사용 하셔야 합니다.

예) http://host:port/webapp/?parameter
PB
String ls_param
ls_param = commandparm()



2. 현재 톰켓으로 만든 사이트를 EA Server로 옮길 생각 입니다.
한글 문제는 지난번에 문의 드린 적이 있고
같이 문의 드린 EA서버에서 셋팅 되어 있는 Connection cash를 jsp페이지나 EA 서버에서 도는
JAVA프로그램 들에서 사용 하는 것에 대한 질문 이었는데..
Connection cash 셋팅 하는것을 알려 주셨습니다.

다시 한번 문의 드립니다.

질문 : EA Server에 있는 Connection Cash를 JSP와 java 프로그램에서 사용하는 방법을 알고 싶습니다.

2. connection cache를 사용 하시려면 관련된 class를 import하여 사용 하셔야 합니다.
아래 예제는 아주 간단하게 작성 해 놓은 것입니다.
중요한 것은 cache를 다 사용 하신 다음에는 반드시 cache를 releaseConnection 함수를 이용하여
종료 시켜 주셔야 한다는 것입니다. 그리고 cache는 반드시 jdbc driver를 이용 하셔야 하구요.
예)
import com.sybase.jaguar.server.*;
import com.sybase.jaguar.jcm.*;

JCMCache _cache = null;
Connection conn = null;
Statement stmt= null;
ResultSet rts = null;
try{
//Get a JDBCconnection cache handle
//from JaguarConnection Manager
_cache = JCM.getCacheByName('ora_jdbc');

//get JDBC Connection class
conn = _cache.getConnection(JCMCache.JCM_WAIT);

stmt = con.createStatement();
stmt.execute("select 1 from dual");
rts = stmt.getResultSet();
//관련 처리....
_cache.releaseConnection(conn);
}catch(com.sybase.jaguar.util.JException je){
throw new SQLException("getConnection:Error getting Connection from cache");
}finally{
if( _cache != null){
try{
_cache.releaseConnection(conn);
}catch(com.sybase.jaguar.util.JException je){
System.out.println(je.getMessage());
}
}
}

Sunday, February 25, 2007

TriggerEvent와 Trigger Event, 그리고 상속

Powerbuilder에서 Object에 이벤트를 강제로 발생 시키는 방법은 크게 두가지가 있다.
첫번째로는 TriggerEvent 함수를 쓰는 방법과, 두번째로는 Trigger Event 키워드를 사용 하여 발생 시키는 방법.

이 글을 적게 된 이유는 상속과 관련해서 특정한 상황에서는 TriggerEvent 함수가 생각 처럼 작동 하지 않는다는 것을 적어 놓기 위해서다.

예를 들면

Object A가 있고, Object B가 있는데 Object B는 Object A를 상속 받은 객체이다.

ObjectA ObjectB
event1 event1

ObjectB는 ObjectA에 있는 event1도 같이 상속 받은 상태..
ObjectB의 특성상 event1을 바로 쓰지 못하고 조상의 event1의 리턴값을 보고, 그에 따라 추가 처리를 해 주어야 한다.

이럴 경우 ObjectB의 event1의 스크립트에서 바로 코딩을 해 주어 버리면, 조상 이벤트의 리턴값을 받아 오지 못한다.(왜냐면 파워 빌더가 자동으로 조상 이벤트 호출 후 자기 이벤트를 다시 호출 해주기 때문에 조상 이벤트가 리턴한 값은 따로 담지를 못한다. 원래 이벤트라는게 리턴코드를 생각 할 수 없으니까)
따라서 "Extented Ancestor Script"를 풀어 주어(이러면 조상 이벤트는 실행 하지 않는다.) 바로 내 스크립트를 실행 하게 하고, TriggerEvent("event1")이나 Trigger Event event1()을 써서, 리턴값을 받아 온 후 그 값에 따라 처리 하면 된다.

ex)

1 If super::TriggerEvent("event1") = 0 Then
2 If super::Trigger Event event1() = 0 Then
...
Else
...
End if

super는 조상을 뜻 한다.

하지만 여기서 두 개의 코드가 서로 다르게 실행 된다는게 문제다.

super::TriggerEvent("event1")

이 코드는 무한 루프에 빠지게 된다.

super::Trigger Event event1()

이 코드는 예상 대로 잘 수행 된다.

super::TriggerEvent("event1")는, super에 있는 TriggerEvent를 호출 하긴 하지만 super의 TriggerEvent가 자기 자신에게 직접 event1을 발생 시키지 않고 그냥 객체 자체에 이벤트를 발생 시켜서 자식의 event1이 다시 발생 하여 루프가 돌게 된다.

하지만 Trigger Event event1()은 직접 조상 객체에 이벤트를 발생 시키므로 잘 작동 한다. TriggerEvent는 아마도 PowerBuilder의 버그가 아닌가 싶다.

조상의 함수 TriggerEvent가 실행 되어 이벤트를 보내면 조상 객체 내에서 해결 해야 하는데, 그게 다시 자식 객체로 부터 이벤트가 먹어 들어 가니 이게 잘 못 된 것 같다.