자바/Web2008. 12. 15. 20:29

기고한지 한달이 지나서 SDN에 올라와서 1.0 정식 버전이 발표된 후에야 이 글을 오픈한당. ㅡ_ㅡ;;

암튼 고고고~~~



필자는 작년부터 Web 2.0과 함께 부상한 RIA(Rich Internet Application)에 대해 귀가 따갑게 들어왔다. 필자가 현재 몸담고 있는 JCO내에서도 JCO가 직간접적으로 관여하는 각종 세미나 및 행사에서도 RIA는 큰 화두였으며 지금까지도 관심을 끄는 이슈로 부각되고 있다. 이런 이슈에 호응(?)하기 위해 Sun, Adobe, MS에서 JavaFX, Flex, Silverlight 라는 삼총사를 내놓았다. 세가지를 비교하는 것도 재미있는 일이겠지만 본인은 자바 프로그래머로만 10년 가까이 먹고 살았다. Silverlight는 어떤 것 이라는 것만 아는 편이고 Flex는 약간 끄적거려 보았다. 결국 가장 자신있는 Java 진영에서 나온 JavaFX 를 다루어 보기로 했다.

 

JavaFX를 처음 접한 것은 2007 JavaOne 이 끝난 후였다. 국내 유일의 자바 챔피언인 양수열 고문이(참고로 본인의 친형이다) JavaOne이 끝나고 귀국하고 만난 자리에서 JavaFX가 앞으로 엄청난 발전을 할 것이라고 흥분해서 말했던 기억이 있다. 그 후 몇 가지 관련된 글을 보았었고 2008 JavaOne에 운이 좋게 참석하게 되어 다시 보게 된 JavaFX는 정말 놀라울 정도로 발전해 있었다. 예전에 간단한 Flash ActionScript 같았던 모습에서 Multimedia 쪽이 대폭 강화되어 수많은 동영상이 화면에 Display되면서 자유롭게 떠도는 Demo를 보고 그 놀라운 Performance에 놀라움을 금치 못했다. 그러면서도 Demo가 일반적인 PC에서도 저만큼 가능할까?’ 라는 의문이 들었다. 그래서 결국 만들어 보게 되었으니

 

시작하기

JavaFX를 처음 접하면서 느낀점은 JavaFX 문법이 JavaScript와 상당히 닮아 있다는 점이었다. JavaScript Java의 절묘한 짬뽕(?)이랄까? JavaFX Application을 물론 메모장으로도 개발할 수 있지만 IDE에 길들여진 개발자들이 메모장으로 개발할리가 없다. 그리고 JavaFX를 전면에 내세운 Sun에서도 개발자들이 편하고 능률적으로 개발할 수 있도록 NetBeans 최신버전에 JavaFX plugin을 추가해 놓았다. 이전에는 JavaFX Pad라는 응용 프로그램을 활용했었으나 좀 더 융통성있고 편하게 개발할 수 있도록 NetBeans에 통합해 놓은 것이다. JavaFX Pad에서와 같이 Source Edit 창에서 코드를 변경하면 위쪽 Preview 영역에서 바로 변경된 결과물을 볼 수 있고 오른쪽 팔레트를 이용해 각종 콤포넌트나 노드 이벤트 등을 원클릭으로 소스에 적용할 수 있다.

NetBeans JavaFX plugin 설치는 신상철 박사님이 운영하시는 JavaPassion을 참고하면 편하게 설정할 수 있다. (http://www.javapassion.com/handsonlabs/javafx_basics1/)

 




[JavaFX plugin을 설치하고 실행중인 모습]

본론으로

JavaFX를 이용해 Multimedia 파일을 컨트롤 하기 위해 필요한 정보와 샘플들을 우선 수집하였다. 일차적으로 Sample Code를 몇 개 받아 mp3 파일을 재생하는 테스트 코드를 만들었을 때 mp3 파일은 아주 잘 재생되었다. 하지만 동영상 파일로 바꾸었을 때는 아래와 같은 에러를 발생시켰다.




FX Media Object caught Exception com.sun.media.jmc.MediaUnsupportedException: Unsupported media: file:/D:/Projects/NetBeans/SimpleMovie/build/classes/simplemovie/SoHot.avi

    source ='file:/D:/Projects/NetBeans/SimpleMovie/build/classes/simplemovie/SoHot.avi'

 

Exception의 이름으로 인해 해당 동영상 파일이 FX 에서 지원하지 않는 Media 형식인걸 확인하였고 빠르게 손가락은 구글링을 하여 JavaFX가 지원하는 미디어 포멧을 찾아내었다.

 

JavaFX Media 지원타입

  Container Types:

  ASF (Advanced Systems Format),MPEG-1, AVI (Audio-Video Interleaved),WAVE, MIDI (Standard MIDI)

  Encoding Types:

  WMAUDIO8 (WindowsMedia Audio 2/7/8),WMSCREEN (Windows Media Screen), WMVIDEO9 (Windows Media Video 9), Voxware, MS MPEG-4, WMVIDEO7 (Windows Media Video 7), MPEG11 Video, MPEG-1 Audio, Uncompressed video (RGB/YUV/RLE), PCM, ADPCM, MP3, MIDI

  Protocol Types:

  HTTP, FILE

  Known not to work at present are media with DRM (Digital Rights Management), and media played directly from DVD or CD.

 

Multimedia 파일을 컨트롤 하기 위해서는 항상 Codec이 문제인데 JavaFX에서는 생각보다 많은 종류의 Codec을 지원해주어 특별히 Codec에 신경 쓰지 않아도 되었다. (물론 가지고 있는 많은 수의 동영상은 실행되지 않았다.)

 

몇 가지 문제를 잡아나가면서 만들어 낸 결과물은 CustomNode를 사용해 재사용할 수 있는MediaViewNode를 만들었고 Timeline을 이용해 이 Node Animation 효과를 보여주는 프로그램을 만들어 보았다. 아래 소스를 실행하면 0.2 배율 스케일의 동영상 화면이 정지된 채로 실행되고 클릭시 회전하며 원래 비율로 커지고 실행되는 프로그램이다.

 

 

Source

/*

 * Main.fx

 *

 * Created on 2008. 11. 8, 오후 1:29:49

 */

 

package simplemovie;

 

import javafx.ext.swing.*;

import javafx.scene.*;

import javafx.scene.media.*;

import javafx.scene.effect.*;

import javafx.scene.paint.Color;

 

/**

 * @author eclips

 */

SwingFrame {

    title: "Movie Player"

    width: 800

    height: 600

    closeAction: function() {

        java.lang.System.exit( 0 );

    }

    visible: true

 

    menus: [  ]

 

    content: Canvas {

        width:800

        height:600

        background: Color.WHITE

        content: [

            MediaViewNode {

                // {__DIR__}은 클래스 파일이 있는 디렉토리이다

                mediaURL: "{__DIR__}Nobody.avi"

                viewX: 10

                viewY: 10

            }

        ]

    }

}

 

/*

 * MediaViewNode.fx

 *

 * Created on 2008. 11. 8, 오후 6:48:47

 */

 

package simplemovie;

 

/**

 * @author eclips

 */

 

import java.lang.System;

 

import javafx.scene.CustomNode;

import javafx.scene.*;

import javafx.input.*;

import javafx.scene.media.*;

import javafx.scene.effect.*;

import javafx.scene.paint.Color;

import javafx.scene.geometry.*;

import javafx.scene.transform.*;

import javafx.animation.Timeline;

import javafx.animation.KeyFrame;

import javafx.animation.Interpolator;

 

public class MediaViewNode extends CustomNode {

    /**

     * 동영상 화면의 X Sacle

     */

    public attribute viewScaleX:Number = 0.2;

   

    /**

     * 동영상 화면의 Y Scale

     */

    public attribute viewScaleY:Number = 0.2;

   

    /**

     * MediaViewNode의 회전 반경

     */

    public attribute rotation:Number = 0.0;

   

    public attribute viewX:Number = 50;

    public attribute viewY:Number = 40;

   

    /**

     * 현재 활성화 여부

     */

    private attribute actived:Boolean = false;

    /**

     * 현재 Animation 중인지 여부

     */

    private attribute moving:Boolean = false;

   

    private attribute media:Media;

    private attribute mediaView:MediaView;

   

    private attribute strokeColor:Color = Color.DARKGRAY;

   

    // 동영상 미디어 객체 URL

    public attribute mediaURL:String on replace {

        media = Media {

            source: mediaURL

        };

    }

   

    // Media Player 객체

    private attribute player =

        MediaPlayer {

            media: media,

            autoPlay: false

        }

 

   

    private attribute choiceTimeLine =

    Timeline {

        keyFrames : [

            KeyFrame {

                time: 0ms

                values: [

                    viewScaleX => 0.2,

                    viewScaleY => 0.2,

                    viewX => 10,

                    viewY => 10,

                    rotation => 0.0,

                    moving => true

                ]

            },

            KeyFrame {

                time : 500ms

                values: [

                    viewScaleX => 1.0 tween Interpolator.LINEAR,

                    viewScaleY => 1.0 tween Interpolator.LINEAR,

                    viewX => 40 tween Interpolator.LINEAR,

                    viewY => 40 tween Interpolator.LINEAR,

                    rotation => 360 tween Interpolator.LINEAR,

                    moving => false

                ]

                action: function():Void {

                    player.play();

                    mediaView.toFront();

                    actived = true;

                }

            }

        ]

    };

   

    private attribute unchoiceTimeLine =

    Timeline {

        keyFrames : [

            KeyFrame {

                time: 0ms

                values: [

                    viewScaleX => 1.0,

                    viewScaleY => 1.0,

                    viewX => 40,

                    viewY => 40,

                    rotation => 360,

                    moving => true

                ]

            },

            KeyFrame {

                time : 500ms

                values: [

                    viewScaleX => 0.2 tween Interpolator.LINEAR,

                    viewScaleY => 0.2 tween Interpolator.LINEAR,

                    viewX => 10 tween Interpolator.LINEAR,

                    viewY => 10 tween Interpolator.LINEAR,

                    rotation => 0.0 tween Interpolator.LINEAR,

                    moving => false

                ]

                action: function():Void {

                    player.pause();

                    mediaView.toBack();

                    actived = false;

                }

            }

        ]

    };

   

    public function create():Node {

        Group {

            content: [

                this.mediaView = MediaView {

                    mediaPlayer: player

                    scaleX: bind viewScaleX

                    scaleY: bind viewScaleY

                    translateX: bind viewX

                    translateY: bind viewY

                    transform: bind [Transform.rotate(rotation,200,150)]

 

                    onMouseEntered:

                        function(me:MouseEvent):Void {

                            strokeColor = Color.BLACK

                        }

                    onMouseExited:

                        function(me:MouseEvent):Void {

                            strokeColor = Color.DARKGRAY

                        }

                    onMouseClicked:

                        function(me:MouseEvent):Void {

                            System.out.println("clicked => " + actived);

                            if(moving == false) {

                                if(actived) {

                                    unchoiceTimeLine.start();

                                    System.out.println("inactive - " + viewScaleX);

                                }

                                else {

                                    choiceTimeLine.start();

                                    System.out.println("active - " + viewScaleX);

                                }

                            }

                        }

                },

                Rectangle {

                    width: 708

                    height: 472

                    scaleX: bind viewScaleX

                    scaleY: bind viewScaleY

                    translateX: bind viewX

                    translateY: bind viewY

                    stroke: strokeColor

                    strokeWidth: 10

                    transform: bind [Transform.rotate(rotation,200,150)]

 

                    onMouseEntered:

                        function(me:MouseEvent):Void {

                            strokeColor = Color.BLACK

                        }

                    onMouseExited:

                        function(me:MouseEvent):Void {

                            strokeColor = Color.DARKGRAY

                        }

                }

            ]

        }

    }

}

 

 

실행 결과

 

Clip을 클릭하면 해당 동영상 클립이 회전하면서 1:1 스케일로 커지면서 동영상이 실행된다.

 

 

아쉬운 것들

l  JavaFX Document의 부실함

n  작업을 위해 다운 받아 펼쳐본 Document는 한마디로 부실함이었다. 물론 아직 초기 버전이라 그런 것이라 생각되지만 현재의 Document는 그냥 어떤 것이 있다는 것을 설명하기 위해 만들어 놓은 수준이라고 봐야 할 것 같다. JDK SE 버전의 Document에 비하면 정말 완성도가 떨어졌다.

l  NetBeans JavaFX plugin

n  미디어 이름에 한글이 들어가거나 공백이 있을 경우 실행시 에러가 발생한다.

n  실시간으로 코딩시 에러 내용이 표시되는데 간혹 이런 에러 내용이 잘못 표시되는 문제

n  미디어의 이름을 바꿀 경우 간혹 미디어 적용이 안되 Rebuild 해야하는 불편함

n  소스에서 사용되는 클래스에 대해 자동으로 import 되지 않는 불편함

 이런 문제들은 앞으로 JavaFX 1.0 정식 버전이 나오고 plugin이 업그레이드 되면서 점점 좋아질 것이라고 생각하지만 아직까지는 약간의 불편함을 감수하고 개발해야 한다.

 

JavaFX로 간단한 동영상 실행 Application을 만들면서 어떻게 이렇게 간단할 수 있지? 하는 생각이 들었다. 이해하기 쉬운 코드 몇 줄로 꽤 대단한 애니메이션 효과를 줄 수 있었고 동영상 플레이도 코드 몇 줄로 끝났다. 자바 Application으로 만들려 했으면 엄청난 소스 코드 속에서 헤메야 간신히 나올만한 프로그램을 JavaFX의 스크립트 몇 줄이 해낸것이다. 물론 이런 힘이 JavaFX 에만 있는 것이 아니다. JavaFX가 경쟁하고 있는 Flex Silverlight도 비슷한 수준으로 지원하고 있거나 더 월등히 앞선 기능과 툴을 지원하고 있기도 하다. 지금 현재도 간단한 Application은 만들기 너무 쉽지만 정식 버전이 나올 시점이 되면 지금보다 모든 면에서 더욱 편하고 강력해져야 할 거라고 생각한다. 위쪽에서 지적한대로 Document도 현재 JDK 만큼 완성도가 높아져야 하며 IDE의 발전과 JavaFX가 적용될 수 있는 Platform도 더욱 넓어진다면 다양한 분야에서 JavaFX 가 활약하는 것을 볼 수 있을거라 생각한다.

 

참조사이트

http://www.javapassion.com/javafx/

http://www.javafx.com

http://java.sun.com/javafx/index.jsp

http://openjfx.dev.java.net

 

Posted by 양군이당

댓글을 달아 주세요

자바/Web2008. 12. 9. 17:19
아직 SDNKorea blog 에 올라가진 않았지만 JavaFX 를 이용해 동영상을 실행하는 글을 기고 했다.

해당 원고를 쓸때까지만 해도 JavaFX 가 정식이 아니었는데 오늘 간만에 들어가서 둘러보니

1.0 정식 버전이 릴리즈 되었다.

정식 전버전에는 정말 눈물날 정도로 API가 부실하고 자료도 없었는데

이번에 정식 릴리즈 되면서 다양한 샘플과 코드가 제공되고 무엇보다 달랑 한줄이나 설명도 안 붙어 있던 API가

정식으로 뜨면서 많이 정리가 되었다...

차라리 1.0 나온 다음에 기고를 할걸 그랬납다... ㅡ_ㅡ;;

JavaFX Script는 YahooUI 스크립트와 상당히 유사하게 닮아 있는데 이녀석이 Swing쪽과 짬뽕되면서

좀 더 복잡해져버려서 많이 헷갈렸는데 그나마 이제 API도 정리되고 샘플도 많이 생겨서 다행이다.

아래는 새로 나온 JavaFX 데모 캡쳐...




'자바 > Web' 카테고리의 다른 글

Web Project 에서 View에서 사용하는 파일에 대한 경로 설정 기준  (0) 2009.06.02
[SDN 기고] JavaFX 와 Multimedia  (0) 2008.12.15
드디어 JavaFX 1.0 정식 Release...  (0) 2008.12.09
Eclipse Ganymede 출동~  (0) 2008.07.02
JSON  (0) 2008.06.26
JSON vs XML  (0) 2008.06.26
Posted by 양군이당
TAG 1.0, JAVAFX

댓글을 달아 주세요

자바/Web2008. 7. 2. 00:12
사용자 삽입 이미지


Eclipse 새버전이 얼마전에 나왔다... 나온날 깔아봤는데 겉보기 상으로 달라진건 Splash 이미지 정도??

ㅎㅎ 내부적으로는 24개 정도의 plugin 이 추가되었다고 한다. 그리고 아래는 좋아졌다는 부분...

이중에 검색및 바꾸기에 정규표현식을 쓸수 있게 되었다는게 좀 와닿는 부분 같다...

전체
 - Editor 탭을 마우스 가운데 버튼 클릭으로 현재 문서를 닫을 수 있음
 - 찾기/바꾸기에서 정규식을 쉽게 쓸 수 있게 되었음
 - debugging 시에 변수를 watch 창으로 Drag & Drop 가능

CDT 5.0
 - file template 기능을 통해 New Class 를 했을 때 기본 코드를 지정할 수 있음
 - include 를 할 때 Ctrl+Space(Content Assist) 를 하면 쉽게 include 파일명을 넣을 수 있음
 - for, while, if 문등의 block 도 folding 할 수 있음
 - 단축키 설정에서 Scheme 에 "Microsoft Visual Studio" 가 추가되어 쉽게 단축키 설정을 할 수 있음
 - Rename 밖에 없던 C++ Refactoring 기능에 다음과 같은 기능들이 추가되었다.
  - Getter/Setter 생성
  - 함수 숨기기(private 로 이동)
  - Implement Method(함수 선언부에서 선택시 함수 구현부 생성)
  - Extract Constant
  - Extract Function
 - Indexer 향상(여러 상황 지원, 속도 향상)
 - Ensure newline at end of file 옵션이 기본적으로 켜져 있어서, 파일의 마지막 줄에 빈 줄을 넣지 않아서 warning 이 뜨는 현상을 위해 옵션을 고치지 않아도 된다.

자바
 - 숫자를 따로 하이라이트해준다.
 - 변수를 읽기/쓰기 하는 부분을 따로 표시할 수 있게 해준다(디버깅할 때 편할듯)
 - 멀티CPU 를 통해 30% 까지 속도 향상이 있다.
 - Java String 을 StringBuffer 로 컨버트

SWT
 - 3개의 상태를 가지는 체크 버튼(on/off 외에 중간 상태가 추가)
 - 윈도우 비스타에서의 native progress bar 지원
 - 이미지와 url 에 대한 Drag & drop 지원
 - 전체 화면 지원
 - 투명도(Alpha, Transparent) 지원

기타
 - (Beta인 셈이지만)Subversion 을 위한 Provider 제공(Help -> Software Updates -> Available Software 에서 Ganymede Update Sites -> Collaboration Tools -> SVN Team Provider 에서 설치)

출처 : http://link.allblog.net/11939288

'자바 > Web' 카테고리의 다른 글

[SDN 기고] JavaFX 와 Multimedia  (0) 2008.12.15
드디어 JavaFX 1.0 정식 Release...  (0) 2008.12.09
Eclipse Ganymede 출동~  (0) 2008.07.02
JSON  (0) 2008.06.26
JSON vs XML  (0) 2008.06.26
XML과 JSON 사이에 변환 패턴  (0) 2008.06.26
Posted by 양군이당

댓글을 달아 주세요

자바/SE2008. 6. 26. 02:28
원문 http://blog.naver.com/gospeler/130005477947

 CallableStatement cstmt = null;


 try {


    // 프로시저 콜

    cstmt = con.prepareCall("{call procedureName(?, ?)}");


    // IN parameter설정
    cstmt.setString(1, ?);


    // Out parameter의 Type설정
    cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);


    cstmt.execute();


    // Out parameter의 값을 얻고, 출력한다.
    System.out.println("result : " + c.getString(2));


 } catch(Exception e) {


    e.printStackTrace();
    throw e;


 } finally {


    if(cstmt != null) try { cstmt.close(); } catch(Exception ignore) {}


 }

Posted by 양군이당

댓글을 달아 주세요

자바/SE2008. 6. 26. 02:27
원문 http://cafe.naver.com/intolicense/777 Oracle의 Stored Procedure/Function 이용하기 (CallableStatement)  


==============================================
Oracle의 Stored Procedure/Function 이용하기  
==============================================

CallableStatement

모든 DBMS들에 대한 표준방법으로 저장 프로시져(stored procedure)를 호출하는 방법을 제공한다.
두가지 형태중의 하나인 escape 문법으로 작성되어진다.  즉, 결과 매개변수를 가지는 형태와 결과 매개변수가 없는 형태
결과 매개변수를 리턴하는 프로시져를 위한 문법은 다음과 같다.:  
{? = call procedure_name[(?, ?, ...)]} 매개변수가 없는 저장 프로시져를 위한 문법은 다음과 같을 것이다. :  
{call procedure_name}  


CallableStatement 객체는 Connection의 prepareCall 메쏘드에 의해 생성된다.  아래의 예제는 저장 프로시져 getTestData의 호출을 포함하는 CallableStatement의 인스턴스를 만든다.  이것은 두 개의 인자들을 가지고 있고 결과 매개변수는 없다.:  
   CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");  


CallableStatement 객체로 IN 매개변수를 넘겨주는 것은 PreparedStatement로부터 상속받은 setXXX 메쏘드이다. 넘겨질 값의 데이터형은 사용할 setXXX 메쏘드를 결정한다.(setFloat는 float 값을 넘겨준다.등등)    만약 저장 프로시져가 OUT 매개변수를 리턴한다면, 각 OUT 매개변수의 SQL형은 CallableStatement 객체를 실행할 수 있기 전에 등록되어져야 한다.(이것은 몇몇 DBMS들이 SQL형을 필요로 하기 때문에 필요하다.)  SQL형을 등록하는 것은 registerOutParameter 메쏘드를 사용한다.  


다음의 예제는 유일한 매개변수로 INOUT 매개변수를 가지고 있는 저장 프로시져 reviseTotal이 있다는 것을 가정한다. setByte 메쏘드는 매개변수를 25로 설정하며, 이것은 드라이버가 SQL TINYINT로써 데이터베이스에 전송할 것이다. 그런다음 registerOutParameter는 SQL TINYINT로써 매개변수를 등록한다. 저장 프로시져가 실행된 후에, 새로운 SQL TINYINT 값을 리턴하고, getByte 메쏘드는 이 새로운 값을 자바 byte로 검색할 것이다.  
CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");  
      cstmt.setByte(1, 25); cstmt.registerOutparameter(1, java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x = cstmt.getByte(1);  




------------------------------
CallableStatement 예제
------------------------------

/* Oracle Server에 작성된 Function */

function employ_age (v_name in employees.name%TYPE) return number
is
v_age number(3) := 0;
begin
  select age into v_age from employees
  where  name = v_name;
  return v_age;
exception
  when no_data_found or too_many_rows then
       return v_age;
end;



---------------



-----------------------
// storedprocedure.html
------------------------

<html>
<head><title>Stored Procedure Call Test </title></head>
<body>
<form name=myform action=/servlet/StoredProcedure method=get>
성명 : <input type=text name=name>
<input type=submit>
</form>
</body>
</html>      


--------------------
StoredProcedure.java
--------------------
/* Oracle의 Stored Procedure를 JDBC로 이용하는 예제입니다.  StoredProcedure.java*/
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class StoredProcedure extends HttpServlet {

  public void doGet(HttpServletRequest req, HttpServletResponse res)
                               throws ServletException, IOException {
    Connection con = null;
    Statement stmt = null;    
    
    res.setContentType("text/html; charset=euc-kr");
    PrintWriter out = res.getWriter();  
    try {
      // 오라클 드라이버를 Load 한다
      Class.forName("oracle.jdbc.driver.OracleDriver");

      // 데이타 베이스에 접속을 한다.
      con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:wink", "scott", "tiger");
     
      // Statement object를 생성한다.
  CallableStatement cstmt = con.prepareCall("{? = call employ_age(?) }");

      //Stored Procedure의 input value의 setting및 output value의 type설정
  cstmt.registerOutParameter(1,Types.INTEGER);
  cstmt.setString(2, han(req.getParameter("name")));  //Procedure의 parameter setting
  cstmt.execute();                                    //CallableStatement 실행

  int age = cstmt.getInt(1);

  out.println("요청하신 " + han(req.getParameter("name")) + " 님의 나이는 " + age + " 입니다.");
}


                 catch(ClassNotFoundException e) {  
      out.println("Couldn't load database driver: " + e.getMessage());
    }
    catch(SQLException e) {  
      out.println("SQLException caught: " + e.getMessage());
    }
    finally {      // 언제나 데이타 베이스 연결을 종료한다.
      try {         if (con != null) con.close();  }
catch (SQLException ignored) { }
    }
  }
  //한글변환 함수
  public static String han(String Unicodestr) throws UnsupportedEncodingException {    
      if( Unicodestr == null)    
         return null;    
      return new String(Unicodestr.getBytes("8859_1"),"KSC5601");    
  }   
}

Posted by 양군이당

댓글을 달아 주세요

자바/Web2008. 6. 26. 02:26
원문 http://blog.naver.com/forioso/10009590986

1 문서 개요 #

  • 작성일 : 2006/04/04
  • 작성자 : http://www.0bin.net/moniwiki/wiki.php/Specification/OPML?action=download&value=mail.png
  • 문서 내용 : AJAX XMLHTTPREQUEST에서 데이터 교환 형식으로 사용되는 JSON에 대한 정리

2 개요 #

  • Javascript Object Notation.
  • lightweight data 교환 형식.
  • 사람이 읽고 쓰기 쉬움.
  • 기계가 파싱하고 생성하기 쉬움.

3 형식 #

3.1 Object #

  • 중괄호({})로 시작하고 끝남
  • member : 문자열과 값으로 구성되어 있고 콜론(:)으로 구분, 각 멤버들은 콤마(,)로 구분
  • array : 대괄호([])로 시작하고 끝나며 각 값은 콤마(,)로 구분
  • value : 값은 string, number, object, array, true, false, null 사용 가능
  • string : 문자열은 쌍따옴표(")로 둘러 쌓여야 하며 Unicode character 또는 일반적인 escape 문자(\", \\, \/, \b, \f, \n, \r, \t, \u four-hex-digits)를 포함한다.
    oav.gif
    sn.gif

3.2 예시 #

{

"Image": {

"Width":800,

"Height":600,

"Title":"View from 15th Floor",

"Thumbnail":{

"Url":"http:/\/scd.mm-b1.yimg.com\/image\/481989943",

"Height": 125,

"Width": "100"

},

"IDs":[ 116, 943, 234, 38793 ]

}

}
  • 출처 : Yahoo JSON 예제
  • 예제에서 Image는 최상위 object이고 모든 다른 데이터들은 이 object의 멤버.
  • Width, Height, Title는 숫자와 문자열 데이타를 포함하고 있는 기본적인 멤버.
  • Thumbnail은 Url, Height, Width를 멤버로 포함하고 있는 중첩 object.
  • ?IDs는 숫자 값을 가지고 있는 array.
  • Url 문자열 값에서 슬래쉬(/)가 escape 됨에 주의

4 참고 사이트 #

'자바 > Web' 카테고리의 다른 글

드디어 JavaFX 1.0 정식 Release...  (0) 2008.12.09
Eclipse Ganymede 출동~  (0) 2008.07.02
JSON  (0) 2008.06.26
JSON vs XML  (0) 2008.06.26
XML과 JSON 사이에 변환 패턴  (0) 2008.06.26
JavaScript 객체 JSON  (0) 2008.06.26
Posted by 양군이당
TAG JSON

댓글을 달아 주세요

자바/Web2008. 6. 26. 02:25
* JSON(http://www.crockford.com/JSON/)은 자바스크립트 객체 표기(literal object notation
of JavaScript)를 따르는 가벼운 데이터 교환포맷이다.
(JavaScript Object Notation (JSON) is a lightweight data inerchange format )

* Rule: "Use XML to exchange structured document, use JSON to exchange data."

* JSON을 어디에 써먹을까?
Ajax 기반 프로그래밍시 응답 xml을 핸들링해야 하는데, DOM 트리를 통해 데이터에 접근하는 것보다 동일한 구조를 갖는 javascript 객체로써 다루는 것이 훨씬 편하다.(어떤 언어를 사용하더라도
DOM을 직접 다루는 것은 고통스럽다.)

예를 들어 아래와 같은 xml포맷 데이터를 XMLHTTPRequest를 통해 받았다고 하자.
(xmlhttp.responseXML => 브라우저 내장 파서에 의해 자동파싱된 js DOM 트리 반환)

<response>
  <method>checkName</method>
  <result>yes</result>
</response>

여기서 method 엘리먼트의 값을 뽑으려면 이런식의 코딩이 필요하다. 지랄맞다.

var response = xmlhttp.responseXML.documentElement
alert("메소드명 : " + response.getElementsByTagName('method')[0].firstChild.data);

그럼 동일한 구조의 데이터를 아래처럼 JSON 포맷으로 받았다고 하자.
(xmlhttp.responseText => 응답 text를 그대로 반환)

{"response": {
     "method": "checkName",
     "result": "yes"
 }};

이제 method의 값을 뽑아보자. 해피하다.

var jsonObj = eval('return ' + xmlhttp.responseText);
alert("메소드명 : " + jsonObj.response.method);

즉, ajax를 이용하는 경우 서버단에서 XML 포맷으로 보내지 말고 JSON 포맷으로 보내면
자바스크립트에서 데이터를 쉽게 액세스할 수가 있다는 얘기다.
(Ajax with JSON instead of XML)

출처 : http://blog.naver.com/ecogeo/100012393620

'자바 > Web' 카테고리의 다른 글

Eclipse Ganymede 출동~  (0) 2008.07.02
JSON  (0) 2008.06.26
JSON vs XML  (0) 2008.06.26
XML과 JSON 사이에 변환 패턴  (0) 2008.06.26
JavaScript 객체 JSON  (0) 2008.06.26
Java 객체를 이용해서 JSON객체를 위한 텍스트 생성하기  (0) 2008.06.26
Posted by 양군이당

댓글을 달아 주세요

자바/Web2008. 6. 26. 02:21
출처 정원희's blog, season 2006 start! | 딱따구리
원문 http://blog.naver.com/nobodyuknow/100028605773


Pattern XML JSON Access
1
"e": null o.e
2text "e": "text" o.e
3
"e":{"@name": "value"} o.e["@name"]
4text "e": { "@name": "value", "#text": "text" } o.e["@name"] o.e["#text"]
5text text "e": { "a": "text", "b": "text" } o.e.a o.e.b
6text text "e": { "a": ["text", "text"] } o.e.a[0] o.e.a[1]
7text text "e": { "#text": "text", "a": "text" } o.e["#text"] o.e.a

출처 Night Sidunge | 시둥이
원문 http://blog.naver.com/way133/60029787010

출처 : http://cafe.naver.com/webagencyalone.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=25

xml -> json


1. [패턴1]

<?xml version="1.0"  encoding="Shift_JIS" ?>

  <rss>

    <channel>

      <title>111</title>
      <link>222</link>

    </channel>

  </rss>


  json으로 바꾸면...


{


   rss: {
   

     channel: {


        title: "111",
      link: "222"


     }


   }

}


javascript에서 json변수의 요소를 가저올때(json변수명이 data일 경우)

data.rss.channel.title    ---->111  다음과 같이 써도 동일 data["rss"]["channel"]["title"]

data.rss.channel.link    ---->222  다음과 같이 써도 동일 data["rss"]["channel"]["link"]


2.[패턴2]

<?xml version="1.0"  encoding="Shift_JIS" ?>

  <rss>

    <channel>

      <title>111</title>

      <title>222</title>
      <link>333</link>

    </channel>

    <channel>

      <title>444</title>

      <title>555</title>
      <link>666</link>

    </channel>

  </rss>


json으로 바꾸면...


{


  rss: {


    channel: [
{
       


      title: [
          "111",
          "222"
        ],



      link: "333"
     

    },


    {

  
   title: [
          "444",
          "555"
        ],




      link: "666"
      }]



  }

}


data.rss.channel[0].title[0]     --->111  다음과 같이 써도 동일 data["rss"]["channel"][0]["title"][0]

data.rss.channel[1].link         --->666  다음과 같이 써도 동일 data["rss"]["channel"][1]["link"]


3.패턴[3]

<?xml version="1.0"  encoding="Shift_JIS" ?>

  <rss version="2.0">

    <channel>

      <title>111</title>
      <link opt1="opt1111" opt2="opt222">222</link>

    </channel>

  </rss>


json으로 바꾸면...


{
 

  rss: {


    version: "2.0",

    channel: {


      title: "111",

      link: {


        opt1: "opt1111",
        opt2: "opt222",
        "#text": "222"


      }


     }

  }

}


data["rss"]["channel"]["link"]["#text"]   --->222

data.rss.channel.link.#text 로 하면...에러발생...

#가 파싱할때 예약어인거 같음..


4.패턴4

<?xml version="1.0"  encoding="Shift_JIS" ?>
  <rss version="2.0">
    <channel>
      <title aaa="111"/>
      <asdfsdf/>
    </channel>
</rss>


json으로 바꾸면...


{
  rss: {


     version: "2.0",


     channel: {
      title: { aaa: "111" }


     }


   }


 }



5.아래와같이 동일한 옵션명이 있으면 에러

<bb aa="11" aa="22"/>

옵션명에 :를 넣는경우는 xmlns로 정의된경우만 가능...이외에는 에러남...

아래와 같은 경우 옵션명에 :를 넣음

<?xml version="1.0"  encoding="utf-8" ?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Center"/>
   <Borders/>
   <Font ss:FontName="MS Pゴシック" x:CharSet="128" x:Family="Modern" ss:Size="11"/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
</Workbook>

'자바 > Web' 카테고리의 다른 글

JSON  (0) 2008.06.26
JSON vs XML  (0) 2008.06.26
XML과 JSON 사이에 변환 패턴  (0) 2008.06.26
JavaScript 객체 JSON  (0) 2008.06.26
Java 객체를 이용해서 JSON객체를 위한 텍스트 생성하기  (0) 2008.06.26
Tomcat 5.X 버전에서 한글 파라메터 쓰기  (0) 2008.06.26
Posted by 양군이당
TAG JSON, XML, 변환

댓글을 달아 주세요

자바/Web2008. 6. 26. 02:20
출처 ace7min님의 블로그 | ace7min
원문 http://blog.naver.com/ace7min/28724114

클래스이름 = function(파라미터) {

    this.id = 파라미터;

    this.name = 파라미터;

}


Member = function( id, name ) {

    this.id = id;

    this.name = name;

}


var mem = new Member( 'testId', '창마이')


클래스이름.prototype.함수이름 = function( newId, newName ) {

    this.id = newId;

    this.name = newName;

}


Member.prototype.toString = function() {

    return this.id + "[" + this.name + "]";

}


이방법 이외에 Object() 를 이용한 방법으로


var mem = new Object();

mem.id = 'testId';

mem.name = '창마이';

mem.securityNo = '7700001000000';


mem.toString = function() {

    return this.name + "[" + this.id + "]";

}

 

alert( mem.toString() );


JSON 표기법


{ 이름1: 값1, 이름2: 값2, 이름3: 값3 }


var countries = {ko: '대한민국', fr: '프랑스', uk: '영국'};

var koName = countries.ko;

var frName = countries['fr'];


배열형식


[값0, 값1, 값2, 값3]


var countryCodes = ['ko', 'fr', 'uk', 'us'];

var idx0 = countryCodes[0]; //'ko'

var idx1 = countryCodes[2]; //'uk'


배열과 응용


var member = {

    name: '창마이',

    favorateColors: ['파랑', '노랑', '빨강']

};


var message = member.name + "님이 좋아하는 색상은 " +

     member.favorateColors.length + "개이고,";

message += "그중 첫 번째 색상은 " +

     member.favorateColors[0] + "입니다.";



JSON 표기법을 사용한 클래스 정의

 

클래스이름  = function( 파라미터 ) {

    ...

}


클래스이름.prototype = {

    함수명1: function( 파라미터 ) {

        ....

    },

    함수명1: function( 파라미터 ) {

        ....

    }

}


Ex)


Member = function(name, id, securityNo) {
 this.name = name;
 this.id = id;
 this.securityNo = securityNo;
}


Member.prototype = {
 setValue: function(newName, newId, newSecurityNo) {
  this.name = newName;
  this.id = newId;
  this.securityNo = newSecurityNo;
 },
 getAge: function() {
  var birthYear = parseInt(this.securityNo.substring(0, 2));
  var code = this.securityNo.substring(6,7);
  if (code == '1' || code == '2') {
   birthYear += 1900;
  } else if (code == '3' || code == '4') {
   birthYear += 2000;
  }
  var today = new Date();
  return today.getFullYear() - birthYear;
 },
 toString: function() {
  return this.name + "[" + this.id + "]";
 }
}




자바스크립트에서 패키지 정의하기


var ajax = new Object();

ajax.Request = function() {

    ...

}


ajax.Request.prototype = {

    someFunction = function() {

        ...

    },

    ...

}


위에 정의한 클래스 사용하기


var req = new ajax.Request();

req.someFunction();


중첩해서 패키지 만들기

 

var ajax = new Object();

ajax.xhr = new Object();

ajax.xhr.Request = function() {

    ...

}


// 아래와 같이 사용

var req = new ajax.xhr.Request();


빈 클래스 만들기


var ajax = {};

ajax.xhr = {};

ajax.xhr.Request = function() {

    ...

}


JSON 표기법에 대한 정보는 http://www.json.org/ 사이트에서 참고할 수 있다.

'자바 > Web' 카테고리의 다른 글

JSON  (0) 2008.06.26
JSON vs XML  (0) 2008.06.26
XML과 JSON 사이에 변환 패턴  (0) 2008.06.26
JavaScript 객체 JSON  (0) 2008.06.26
Java 객체를 이용해서 JSON객체를 위한 텍스트 생성하기  (0) 2008.06.26
Tomcat 5.X 버전에서 한글 파라메터 쓰기  (0) 2008.06.26
Posted by 양군이당
TAG java, JSON

댓글을 달아 주세요

자바/Web2008. 6. 26. 02:19

복사 http://blog.naver.com/eclips32/30020578345

Simple Java toolkit for JSON (JSON.simple)
==========================================

http://www.JSON.org/java/json_simple.zip

1.Why the Simple Java toolkit (also named as JSON.simple) for JSON?

  When I use JSON as the data exchange format between the AJAX client and JSP
  for the first time, what worry me mostly is how to encode Java strings and
  numbers correctly in the server side so the AJAX client will receive a well
  formed JSON data. When I looked into the 'JSON in Java' directory in JSON
  website,I found that wrappers to JSONObject and JSONArray can be simpler,
  due to the simplicity of JSON itself. So I wrote the JSON.simple package.

2.Is it simple,really?

  I think so. Take an example:

  import org.json.simple.JSONObject;

  JSONObject obj=new JSONObject();
  obj.put("name","foo");
  obj.put("num",new Integer(100));
  obj.put("balance",new Double(1000.21));
  obj.put("is_vip",new Boolean(true));
  obj.put("nickname",null);
  System.out.print(obj);

  Result:
  {"nickname":null,"num":100,"balance":1000.21,"is_vip":true,"name":"foo"}

  The JSONObject.toString() will escape controls and specials correctly.

3.How to use JSON.simple in JSP?

  Take an example in JSP:

  <%@page contentType="text/html; charset=UTF-8"%>
  <%@page import="org.json.simple.JSONObject"%>
  <%
    JSONObject obj=new JSONObject();
    obj.put("name","foo");
    obj.put("num",new Integer(100));
    obj.put("balance",new Double(1000.21));
    obj.put("is_vip",new Boolean(true));
    obj.put("nickname",null);
    out.print(obj);
    out.flush();
  %>

  So the AJAX client will get the responseText.

4.Some details about JSONObject?

  JSONObject inherits java.util.HashMap,so it don't have to worry about the
  mapping things between keys and values. Feel free to use the Map methods
  like get(), put(), and remove() and others. JSONObject.toString() will
  combine key value pairs to get the JSON data string. Values will be escaped
  into JSON quote string format if it's an instance of java.lang.String. Other
  type of instance like java.lang.Number,java.lang.Boolean,null,JSONObject and
  JSONArray will NOT escape, just take their java.lang.String.valueOf() result.
  null value will be the JSON 'null' in the result.

  It's still correct if you put an instance of JSONObject or JSONArray into an
  instance of JSONObject or JSONArray. Take the example about:

  JSONObject obj2=new JSONObject();
  obj2.put("phone","123456");
  obj2.put("zip","7890");
  obj.put("contact",obj2);
  System.out.print(obj);

  Result:
  {"nickname":null,"num":100,"contact":{"phone":"123456","zip":"7890"},"balance":1000.21,"is_vip":true,"name":"foo"}

  The method JSONObject.escape() is used to escape Java string into JSON quote
  string. Controls and specials will be escaped correctly into \b,\f,\r,\n,\t,
  \",\\,\/,\uhhhh.

5.Some detail about JSONArray?

  org.json.simple.JSONArray inherits java.util.ArrayList. Feel free to use the
  List methods like get(),add(),remove(),iterator() and so on. The rules of
  JSONArray.toString() is similar to JSONObject.toString(). Here's the example:

  import org.json.simple.JSONArray;

  JSONArray array=new JSONArray();
  array.add("hello");
  array.add(new Integer(123));
  array.add(new Boolean(false));
  array.add(null);
  array.add(new Double(123.45));
  array.add(obj2);//see above
  System.out.print(array);

  Result:
  ["hello",123,false,null,123.45,{"phone":"123456","zip":"7890"}]

6.What is JSONValue for?

  org.json.simple.JSONValue is use to parse JSON data into Java Object.
  In JSON, the topmost entity is JSON value, not the JSON object. But
  it's not necessary to wrap JSON string,boolean,number and null again,
  for the Java has already had the according classes: java.lang.String,
  java.lang.Boolean,java.lang.Number and null. The mapping is:

  JSON          Java
  ------------------------------------------------
  string      <=>   java.lang.String
  number      <=>   java.lang.Number
  true|false  <=>   java.lang.Boolean
  null        <=>   null
  array       <=>   org.json.simple.JSONArray
  object      <=>       org.json.simple.JSONObject
  ------------------------------------------------

  JSONValue has only one kind of method, JSONValue.parse(), which receives
  a java.io.Reader or java.lang.String. Return type of JSONValue.parse()
  is according to the mapping above. If the input is incorrect in syntax or
  there's exceptions during the parsing, I choose to return null, ignoring
  the exception: I have no idea if it's a serious implementaion, but I think
  it's convenient to the user.

  Here's the example:

  String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
  Object obj=JSONValue.parse(s);
  JSONArray array=(JSONArray)obj;
  System.out.println(array.get(1));
  JSONObject obj2=(JSONObject)array.get(1);
  System.out.println(obj2.get("1"));

  Result:
  {"1":{"2":{"3":{"4":[5,{"6":7}]}}}}
  {"2":{"3":{"4":[5,{"6":7}]}}}

7.About the author.

  I'm a Java EE developer on Linux.
  I'm working on web systems and information retrieval systems.
  I also develop 3D games and Flash games.

  You can contact me through:
  Fang Yidong<fangyidong@yahoo.com.cn>
  Fang Yidong<fangyidng@gmail.com>

  http://www.JSON.org/java/json_simple.zip

'자바 > Web' 카테고리의 다른 글

JSON  (0) 2008.06.26
JSON vs XML  (0) 2008.06.26
XML과 JSON 사이에 변환 패턴  (0) 2008.06.26
JavaScript 객체 JSON  (0) 2008.06.26
Java 객체를 이용해서 JSON객체를 위한 텍스트 생성하기  (0) 2008.06.26
Tomcat 5.X 버전에서 한글 파라메터 쓰기  (0) 2008.06.26
Posted by 양군이당
TAG java, JSON

댓글을 달아 주세요