전산쟁이의 카피질

뒤로 검색

Applet ↔ Javascript 통신(LiveConnect) 팁

2009/01/15 00:59

출처 § 낭만 꼬씨~♥.♥(不怕慢 , 只怕站) § | 꼬씨
원문 http://blog.naver.com/kolove79/20043852278

애플릿 개발하시는 분들은 이미 알고 계시겠지만 Netscape.jar를 사용하시면 Applet과 웹단의 양방향 통신(LiveConnect)이 가능합니다.
정확히 말하자면 public으로 선언된 Applet 메소드는 Javascript에서 호출 가능하고,
Applet에서 Javascript를 사용하기 위해서는 Netscape.jar API를 사용해야 합니다.
이 LiveConnect을 사용하면서 알게된 몇가지 팁을 알려드립니다.

## Document Object의 세밀한 제어
JSObject.call() 메소드를 이용하여 Applet에서 Javascript의 메소드만를 호출할 수 있지만 
이뿐 아니라 버튼, 에디트박스 등의 웹컨트롤이나 ActiveX 컨트롤 등 웹브라우져 상의 모든 개체(DOM)를 직접 제어할 수 있습니다.

예를 들어 다음과 같이 폼이 있고 그 위에 콤보박스가 하나 있다고 하면..


다음과 같은 자바스크립트 함수를 이용하여 콤보박스를 토글할 수 있을 것입니다.


지금까지 애플릿에서 콤보박스를 제어하기 위해서는 위와 같은 toggle() 함수를 애플릿에서 호출해 주었습니다.
이렇게 되면 애플릿을 한곳에서만 쓰면 문제가 없지만, 애플릿이 여러 페이지에서 사용하게 되면 그 곳마다 자바스크립트 함수가 따라다녀야 하는 문제가 있었습니다.
만약 자바스크립트 함수가 바뀌어야 되면 모든 소스를 다 수정해야하는 번거로움이 있었죠.

애플릿에서 다음과 같이 구현해 주면 위의 자바스크립트 함수와 같은 역할을 할 수 있습니다. 주석 없이도 직관적으로 이해하실 수 있을 것입니다.

   
이와 같이 구현하면 추가 자바스크립트 함수가 필요없는 깔끔한 애플릿을 만들 수 있습니다.
현재 기구, 회로 기술자료 애플릿에서는 이 방식을 이용하여 ActiveX 컨트롤과 애플릿이 직접 통신하고 있습니다.
레지스트리 검색, 다이얼로그 띄우기 등 OS 종속적인 코드는 ActiveX 컨트롤에 넣고, 애플릿에서 이 컨트롤을 직접 제어하는 방식입니다.

## Javascript→Applet 호출시 리소스 자원 접근 시 에러
위에서도 언급했지만 public으로 선언된 Applet 메소드는 Javascript에서 호출 가능합니다만, 다음과 같은 코드는 에러가 발생합니다.

   
예외 메시지는 다음과 같습니다.
java.security.AccessControlException: access denied (java.io.FilePermission C:workall.cpp read)

이 문제가 지금까지도 상당히 많이 발생했던 것 같습니다.
애플릿에 Signing을 하면 로컬자원에 대한 모든 권한을 가지게 되지만, 유독 자바스크립트에서 메소드를 호출을 하면 access 에러가 발생합니다.
다시말하면 로컬자원에 액세스하는 프로세스가 애플릿 자체의 액션에서 발생한 것이면 문제가 없지만,
자바스크립트 호출에 의한 프로세스는 인증된 애플릿이라 할지라도 access 에러가 발생하는 것입니다.

이에 대한 완벽한 해결책은 아직 찾지 못했습니다. 대신 다음과 같은 편법을 사용하면 우선적으로 사용은 가능합니다.
자바스크립트 호출에 의한 프로세스를 타이머를 이용하여 애플릿 자체적인 액션으로 바꿔주는 것입니다. 코드는 다음과 같습니다.

   
위 메소드가 자바스크립트에서 호출되면 1msec 타이머를 한번 구동시킵니다. 그리고 그 타이머 액션에 대한 이벤트로 로컬자원에 접근합니다.
단, 위 코드는 익명클래스를 사용하므로 로컬변수는 사용하지 못합니다. final을 이용한 상수나 맴버변수를 사용해 주시면 됩니다.

혹시 애플릿에서 리턴값을 받아야 하는 경우가 있으면 다음과 같이 고쳐주면 됩니다.




추가내용 2010.08.25 : 출처 : http://coding.derkeiler.com/Archive/Java/comp.lang.java.gui/2008-10/msg00014.html
When Javascript call applet method, applet throw security exception.

crazytazo wrote:
My test applet was signed and work well on applet viewer.
In browser, when javascript call applet method f(), the applet throw
java.security.AccessControlException
But if call f() through Java code, it works well.
f() method must called by javascript for arguments that created
webpage.
Give a solution please.

The problem is that the access level is that of the JS, not your signed Java applet. You need to use a AccessController and PrivilegedAction from the java.security package to elevate the permission level to your signed applet:



BTW, when you find the problem passing JSObject from JavaScript to Java, search for an earlier post I made about the subject, I found a work-around.
--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>

Tags

applet, javascript, liveconnect, 애플릿
이 페이지는 Textcube 1.10.0 : beta 1 로 구동됩니다 데스크탑 화면