<불공평한 synchronized()>


동기화에 따른 스레드 굶어 죽기 문제를 아래의 클래스로 풀어낸다는 컨셉 (개요를 보니.. 제일 오래 대기한 스레드가 다음 우선권을 
얻는다는데..FIFO(선입선출) 방식)
=> 중요한건 아래의 ReentrantLock를 이용하면서 + try finally 블럭을 이용해 "반드시" unlock()처리를 해주는데 있는듯

=>위의 컨셉에서 약간의 문제점은 스레드 스케쥴링(우선순위priority)을 보장해주지 않는다는 것. 다음 페이지에선 우선순위에 따라
대기중인 스레드 리스트의 원소들을 정렬 해준다는 아이디어로 풀어내고 있음. 

=>이 아이디어를 java.awt의 이벤트 큐에 적용시켜 본다면? 즉 우선순위 이벤트라면 큐의 제일 앞으로 삽입... (이미 구현되어
있을까?)

java.util.concurrent.locks 
클래스 ReentrantLock


by givingsheart 2014. 1. 1. 16:07
(etc) 그나저나 아래 사이트 어떻게 이용하는 걸까?

https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview?communityUuid=3a304e3a-2d9e-48cc-860c-786c695bf330



(etc)내일부터 spring도 조금씩 진행(선수 지식은 쬐금씩이지만 쌓았다)




이미지 i/o까지 보게되었다..살짝 간만보자;; jsp 진도가 안빠진다;; jsp 교재가 최우선!!!!!!


javax.imageio 
클래스 ImageIO


static BufferedImageread (File  input) 
          현재 등록되어 있는 것의 중으로부터 자동적으로 선택된 ImageReader 를 사용해, 지정된 File 를 복호화 한 결과적으로,BufferedImage 를 돌려줍니다.


<pre>public final class ImageIO
extends Object
</pre>

ImageReader 및 ImageWriter 를 검색하는 정적인 편리한 메소드를 보관 유지해, 간단한 encode와 

복호화를 실행하는 클래스입니다.



javax.imageio 
클래스 ImageReader


<pre>public abstract class ImageReader
extends Object
</pre>

이미지를 해석해 복호화 하는 추상 슈퍼 클래스입니다. 이 클래스는, Java Image I/O 시스템

의 문맥으로, 이미지를 읽어들이는 클래스에 의해 서브 클래스화 됩니다.

ImageReader 객체는, 일반적으로, 특정의 형식의 서비스 프로바이더 인터페이스 (SPI)에 의해 

인스턴스화 됩니다. ImageReaderSpi 인스턴스등의 서비스 프로바이더 클래스는, 그러한 클래스

의 형식의 인식과 사용 가능한 형식의 읽기측과 기입해 옆의 표시에 사용하는 IIORegistry 에 

등록됩니다.

입력 소스가 setInput 메소드를 사용해 설정되는 경우, 「순서 방향 검색만」으로서 지정됩니

다. 이 설정은, 이전에 읽어내진 이미지와 관련지을 수 있었던 데이터를 보관 유지하는 입력 

부분의 캐쉬를 회피하기 위해서, 입력 소스에 보관 유지되는 이미지가 차례로 읽어내지는 

것만으로 있는 것을 의미합니다.



javax.imageio 
클래스 ImageWriter



<pre>public abstract class ImageWriter
extends Object
implements ImageTranscoder
</pre>

encode와 이미지의 기입을 위한 추상 슈퍼 클래스입니다. Java Image I/O 시스템의 문맥내

에서, 이미지를 써내는 클래스가, 이 클래스를 서브 클래스화할 필요가 있습니다.

ImageWriter 객체는 일반적으로, 특정 형식을 위한 서비스 프로바이더 클래스에 의해 인스턴스

화 됩니다. 서비스 프로바이더 클래스는 IIORegistry 에 등록되어 형식을 식별해, 사용 가능한 

형식의 읽기측과 기입해 옆을 제시하기 위해서 사용됩니다.




java.awt.image 
클래스 BufferedImage

모든 구현된 인터페이스:
RenderedImage , WritableRenderedImage , Transparency


BufferedImage 서브 클래스는, 이미지 데이터의 액세스 가능한 버퍼를 갖춘 Image 를 기술합니

다. BufferedImage 는,ColorModel 및 이미지 데이터 Raster로 구성되어 있습니다. Raster SampleModel 

밴드수 및 형태는, 색성분 및 알파 성분을 나타내기 위해서(때문에) ColorModel 에 의해 요구되

는 수 및 형태와 일치하고 있을 필요가 있습니다. 모든 BufferedImage 객체의 좌상구석의 좌표

는 (0,  0)입니다. 이 때문에,BufferedImage 의 작성에 사용되는 Raster 는 minX=0 및 minY=0 가 

아니면 안됩니다.

이 클래스는,Raster 의 데이터의 취득 방법과 설정 방법법, 및 ColorModel 의 색의 기술 방법으

로 의존합니다.


java.awt 
클래스 Graphics2D


<pre>public abstract class Graphics2D
extends Graphics
</pre>

Graphics2D 클래스는, Graphics 클래스를 확장해, 기하학적 도형, 좌표변화, 칼라 관리,

 및 텍스트 배치에 대해 고도의 제어를 실시합니다. 이 클래스는, Java(TM) 플랫폼에서

 2D 의 도형, 텍스트, 및 이미지를 draw하기 위한 기본 클래스입니다.



abstract  voiddrawImage (BufferedImage  img, BufferedImageOp  op, int x, int y) 
          BufferedImageOp 로 필터 처리되는 BufferedImage 를 draw 합니다.
abstract  booleandrawImage (Image  img, AffineTransform  xform, ImageObserver  obs) 
          이미지 공간으로부터 사용자 공간에의 변환을 적용하고 나서, 이미지를 draw 합니다.





3d 용 directX나 openGL은 어찌 사용할까?


by givingsheart 2014. 1. 1. 16:06

역사:jsp 설계자님들께서 jdbc를 jsp에서 사용하기로 결정하셨음;;

      그럼으로 jsp어플로 db조작하고 싶으면 jdbc api로 작성해서 디비 제작사가 공급하는 드라이버 클래스를 사용해야함;;
      (오라클 님들 java.sql.Driver interface 구현하느라 수고 많으셨음   ojdbc14.jar .. 앗 오라클 놈이나 자바 선놈이나 그놈이 그놈? 
       젠장.. 그래도 ㄳ)

기본전략:db접속 코드들은 전부 bean이나 서블릿에 때려 박고 jsp에선 요것들을 커스텀 태그등을 이용해 사용하여
             프리젠테이션 영역과 프로그램의 구현을 분리 시켜아함. (나도 원함)

초 간략 jdbc 사용방법(선생님의 명언.. 일반io나 db,net io나.. 매 한가지이다.)
1.오라클 jdbc 드라이버 로드
2.db connection 연결(한마디로 스트림 생성)
3.db와 대화를 나누기 위한 struct query language 준비
  3.1 Statement or PreparedStatement(내가 툴만들때 쓴거) or CallAbleStatement 객체 생성해서 쿼리 세팅
4.음..3번객체.excute()였나.. 하여튼 쿼리 실행(스트림을 통해 데이터 보내기)
5.결과값 받기 ResultSet으로...  (4번에서 db의 응답이 오기 전까지 무한 루프 돌리고 있으려나? 설마 그리 단순하게 하진 않았겠지..
  나중에 grepcode로 소스 확인)
6.볼일 종료했으니 스트림및 생성했던 객체들 소멸 (중요한것은 잦은 db커넥션에 부담을 가져야함. 그럼으로 db커넥션 풀링,
   마찬가지로 잦은 쿼리 수행도 부담스러움..  그럼으로 버퍼방식으로 모으고 모으던지.. 아니면 db가 알아서 트랜잭션 처리를
   하던지.. 그것도 아니면 서버측이 자주 접근하되, 수정되지 않는 데이터를 메모리에 띄워놓고 있던지.. 하여간 db는 너무 귀찮
   게 하면 곤란함.. 그나저나 트랜잭션.. 모아놨다가 조건 맞으면 commit, 아니면 rollback.. 하는 짓이 svn 닮았네?.. 지훈형님마저
   없으니.. 내 정신머리가 점점 폭주하는구나 OTL )

간단하게 구현을 반 의사코드로 적어보면..
1.드라이버 이름인 문자열 "오라클.jdbc.driver" 를 가지고
  1.1 Class.forName("드라이버이름") 을 통해 드라이버 클래스가 존재하는지 확인해야함.

2.커넥션 객체 생성위해 내가 열어둔 db의 url(내껀 로컬:8080), 로긴용 id , pw 를 가지고 
  2.1 java.sql.드라이버 매니저클래스님께 커넥션 객체 달라고 요청 

3."insert into xxx"던 "select from xxx"등의 문자열을 가지고 PreparedStatement(재사용가능하고 지정되지 않은 변수를 ?,? 식으로
   사용이 가능함 = 동적바인딩이 가능하단 얘기는 한마디로.. 실시간으로 유저의 입력을 받아서 세팅해줄 수 있단 의미일까? ) 
   객체를 생성해야 하는데.. (call어쩌구 statement는 db 내장 프로시저 호출해서 일시키는 것)
  3.1 요 역할은 2.1에서 얻은 커넥션 객체가 생성해줌.

4. 3.1에서 얻은 sql문장 객체에게 excute() 작업시키고 ResultSet 으로 결과 받을 준비 = db에 "요청" 전달 & "응답" 회신
(아..브라우저와 서버페이지(or서블렛)간 request/response와 오버랩되네.. 자바 프레임 워크 만만세!)

5. 결과값(ResultSet) 받았으면 요거에서 잘 추출해야함.. 테이블형의 자료구조기 때문에 행,열단위로 알아서 잘 추출
   (데이터 형식에 따라 행,열로 접근할 경운 이중 반복문 or map 자료구조의 entrySet처럼 키와 값들 두쌍의 데이터 집합이면..
    뭐 알아서 잘.. 너무 경우의 수가 많으니 일반화하기 어렵다. 물론 해본적도 없지만;;)
   5.1 db에 있던 데이터 내 app의 메모리상 xx객체에 세팅해놨으니.. 알아서 쓰면 됨
   (etc)결과값 내용이 많을 경우 모든 데이터(resultSet중 모든 row)를 메모리에 한번에 올려주진 않음..set객체가 묵시적
   으로 db와 커넥션을 유지하고 있음.. 버퍼링 방식으로.. (아마 게시판이 이런식으로 읽혀오지 않을까 싶다. 한번에 읽어
   와서 메모리에 띄우긴 너무 많잖아..)

6. 용건 끝났으니 커넥션 객체, 쿼리 문장 객체등 소멸   or  만약 커넥션 풀링 개념을 사용한다면.. 풀에 반납

***resultSet에서 커서로 제어한다는 컨셉***
 (여러번에 걸쳐 필요한 행을 읽어오고, 다음번엔 그 이후부터 읽어오는게 가능, 물론 각 데이터 필드에 접근할수 있는 get메서드
들도 있다)

 booleanabsolute (int row) 
          커서를 이 ResultSet 객체내의 지정된 행으로 이동합니다.
 voidafterLast () 
          커서를 이 ResultSet 객체의 끝, 즉 맨 마지막 줄의 직후로 이동합니다.
 voidbeforeFirst () 
          커서를 이 ResultSet 객체의 첨단, 즉 선두행의 직전으로 이동합니다.
 voidcancelRowUpdates () 
          이 ResultSet 객체의 현재의 행에 대해서 간 갱신을 취소합니다.
 voidclearWarnings () 
          이 ResultSet 객체에 관해서 보고된 모든 경고를 클리어 합니다.
 voidclose () 
          자동적으로 클로즈 될 때, 이것을 기다리는 것이 아니라, 즉시 ResultSet 객체의 데이타베이스와 JDBC 자원을 해제합니다.
 voiddeleteRow () 
          이 ResultSet 객체 및 기본으로 되는 데이타베이스로부터, 현재의 행을 삭제합니다.
 intfindColumn (String  columnLabel) 
          지정된 ResultSet 의 열라벨을 ResultSet 열인덱스에 매핑 합니다.
 booleanfirst () 
          커서를 이 ResultSet 객체내의 선두행으로 이동합니다.


by givingsheart 2014. 1. 1. 16:00
아.. File 객체는 txt등 파일외에도 디렉토리의 개념도 포괄한다. 즉 2개의 개념을 의미하는 단위이다.
(그럼으로 list()등을 이용해 얻어온 File 객체들은 파일 or 디렉토리를 구분해 주어야한다)

오늘 배운것중 디렉토리 경로를 매개변수로 해당 디렉토리 내의 모든 하위 디렉토리, 파일을 출력해주는 코드를 구현시..
재귀호출을 사용해서 하위 디렉토리,파일을 출력하게끔 처리했음. (트리처럼 하위 요소들은 깊이에 따라 출력 전에 /t를 
추가 해주면 더 보기 좋을듯)


File renameTo(File path+name) : 파일의 수정,이동의 경우 삭제->새로 생성이 아닌, 경로와 파일명의 변경을 의미한다.


(etc)파일의 복사,이동의 경우 파일 객체의 디렉토리or파일명을 바꾸어주는 것이다.
(자바의 대입연산인 clone()처럼 참조값만 바꾸어준다. 실제 하나의 데이터 파일을 2개가
가르키고 있다가.. 특정 파일을 수정하는 경우 그때서야 새롭게 데이터 블럭에 파일을
기록할 것이다<- 아닐지도 모름... 이게 게으른(lazy) 복사였나?)

(etc)File 클래스의 isExcute() 인가 메서드 웬지 찍혔음 (내app에서 다른 프로그램 웹이던 뭐던 띄울때 체크하기용으로)

getParent() 요건 상위 경로명 리턴

글고 가급적 디렉토리 만들깨 mkdirs()로 만들것! (왜냐면.. 상위 디렉토리가 없을 경우 알아서 다 만들어줌)

File (URI  uri)  요걸로 웹작업할때 사용하면 좋을듯. (URI > URL,URN)

각종 유효성 리턴 메서드 isXXX() 계열.. 흠.. 내코드의 안전을 위해선 쓰는게 좋을듯..
(나 역시 모든 유효성 체크를 isValidFile() 요런식으로 묶어서 써야지.. 코드가 덜 지저분해
질듯;;)


 booleanmkdirs () 
          이 추상 경로명이 가리키는 디렉토리를 생성합니다.
 booleanrenameTo (File  dest) 
          이 추상 경로명이 가리키는 파일의 이름을 변경합니다.
 booleansetExecutable (boolean executable) 
          이 추상 경로명에 소유자의 실행 권한을 설정하는 편리한 메소드입니다.
 booleansetExecutable (boolean executable, boolean ownerOnly) 
          이 추상 경로명에 소유자 또는 전원의 실행 권한을 설정합니다.
 booleansetLastModified (long time) 
          이 추상 경로명이 가리키는 파일 또는 디렉토리가 변경된 시각을 설정합니다.
 booleansetReadable (boolean readable) 
          이 추상 경로명에 소유자의 읽기 권한을 설정하는 편리한 메소드입니다.
 booleansetReadable (boolean readable, boolean ownerOnly) 
          이 추상 경로명에 소유자 또는 전원의 읽기 권한을 설정합니다.
 booleansetReadOnly () 
          이 추상 경로명이 가리키는 파일 또는 디렉토리에 마크를 설정해, 읽기 조작만이 허가되도록(듯이) 합니다.
 booleansetWritable (boolean writable) 
          이 추상 경로명에 소유자의 쓰기 권한을 설정하는 편리한 메소드입니다.


by givingsheart 2014. 1. 1. 16:00

1.HttpSessionBindingListener 인터페이스의 중요성 (awt component 사용할때 내가 재정의해서 등록하는 리스너와 동일 )


(1) public void valueBound(HttpSessionBindingEvent event)
 :빈이 사용자의 세션에 처음 바인딩(useBean 통해 인스턴스화후에) 될때 호출됨 
(2)public void valueUnbound(HttpSessionBindingEvent event)
 :빈이 세션에서 제거될때 호출됨

=>즉 세션 바인딩 이벤트를 처리한다는 것은.. 빈의 인스턴스의 생성,소멸을 리퀘스트 단위가 아닌, 세션 단위로
   처리할수 있다는 의미가 된다.(내 요청마다 새로생성, 소멸..반복.. 낭비 아닌가?)


2. 빈의 리스너
(1)java.beans  인터페이스 PropertyChangeListener

public interface PropertyChangeListener extends EventListener 
PropertyChange 이벤트는, Bean 가 「바운드」프로퍼티을 변경할 때마다 트리거됩니다. 
바운드 프로퍼티의 갱신마다 통지를 보내도록(듯이), PropertyChangeListener 를 소스 Bean 에 
등록할 수 있습니다.
메소드의 개요 void propertyChange (PropertyChangeEvent  evt)

java.beans 
클래스 PropertyChangeEvent java.lang.Object  
java.beans.PropertyChangeEvent 모든 구현된 인터페이스:Serializable
직계의 기존의 서브 클래스: IndexedPropertyChangeEvent

생성자 의 개요PropertyChangeEvent (Object  source, String  propertyName, Object  oldValue, Object  newValue)
새로운 PropertyChangeEvent 를 구축합니다.



(2)java.beans 인터페이스 VetoableChangeListener
public interface VetoableChangeListener
extends EventListener

VetoableChange 이벤트는, Bean 가 「제약」프로퍼티을 변경할 때마다 트리거됩니다. 

제약 프로퍼티의 갱신마다 통지를 보내도록(듯이), VetoableChangeListener 를 소스 Bean 

에 등록할 수 있습니다.


메소드의 개요
 voidvetoableChange (PropertyChangeEvent  evt) 
          제약 프로퍼티의 변경시에 불려 갑니다.



(3) public interface ExceptionListener

ExceptionListener 는, 내부 예외의 통지를 받습니다.


메소드의 개요
 voidexceptionThrown (Exception  e) 
          이 메소드는, 회복 가능한 예외가 캐치 되었을 때에 불려 갑니다.





*************************************************************************


3.빈과 gui 합체 (비주얼 툴 만들기?)

java.beans   인터페이스 Customizer

public interface Customizer

카스타마이자크라스는, 타겟 Java Bean 를 커스터마이즈하기 위한 완전한 커스텀 GUI 를 제공합니다.

각 카스타마이자는, AWT 다이얼로그나 패널내에서 인스턴스를 생성할 수 있도록(듯이),java.awt.Component 클래스를 상속하지 않으면 안됩니다.

카스타마이자 마다 인수 없음의 생성자 이 필요합니다.


메소드의 개요
 voidaddPropertyChangeListener (PropertyChangeListener  listener) 
          PropertyChange 이벤트의 청취자를 등록합니다.
 voidremovePropertyChangeListener (PropertyChangeListener  listener) 
          PropertyChange 이벤트의 청취자를 삭제합니다.
 voidsetObject (Object  bean) 
          커스터마이즈 하는 객체를 설정합니다.


void setObject(Object  bean) :커스터마이즈 하는 객체를 설정합니다. 이 메소드는, Customizer 
를 친 AWT 컨테이너에 추가하기 전에 1 회만 호출하도록 해 주세요.파라미터: bean - 커스터
마이즈 되는 객체


java.beans 
인터페이스 PropertyEditor 기존의 구현 클래스의 일람: PropertyEditorSupport

public interface PropertyEditor PropertyEditor 클래스는, 사용자가 지정의 형태의 프로퍼티치를 편집하기 
위한 GUI 의 지원를 제공합니다. PropertyEditor 는, 프로퍼티치의 표시나 코우신에 도착해 다양한 방법을 
지원합니다. 대부분의 PropertyEditor 에서는, 이 API 로 사용할 수 있는 각종 옵션의 부분집합을 지원하는 것
만으로 충분합니다. 단순한 PropertyEditors 가 지원하는 것은 getAsText 와 setAsText 메소드만으로, paintValue 
이나 getCustomEditor 등의 지원는 불필요합니다. 

보다 복잡한 것으로는, getAsText 나 setAsText 는 지원할 수 없습니다만, 대신에 paintValue 과 getCustomEditor 
를 지원합니다. 각 propertyEditor 는, 다음의 3 개의 표시 스타일중 1 개(살) 이상을 반드시 지원할 필요가 있습
니다. 

즉, (1) isPaintable 의 지원, (2) getTags()로부터 null 가 아닌 String[] 를 돌려주어, 한편 getAsText 로부터
 null 가 아닌 값을 돌려준다, 또는 (3) 단지 getAsText()로부터 null 가 아닌 String 를 돌려주는, 의 3 개(살)
입니다. 

각 프로퍼티 에디터는, 인수 객체가 대응하는 propertyEditor 의 형태인 경우에, setValue 의 호출을 지원할 필요가
있습니다. 한층 더 각 프로퍼티 에디터는, 커스텀 에디터 또는 setAsText 의 어느 쪽인지를 지원할 필요가 있습니다.

각 PropertyEditor 는, 인수 없음의 생성자 을 가지지 않으면 안됩니다.


=>그니까.. 컴포넌트중 Frame이나 Window같은거 상속받은 담에.. implemets java.beans.Customizer 하면 어찌되나;; ㅎㄷㄷ


**************************************************************
사용한 빈 서버 app 메모리에서 날리기
session 스코프 : session.removeAttibute(name)  , HttpSession.removeAttribute(name)
request/page   : pageContext.removeAttribute(name) , ServletRequest.removeAttribute(name)
application    : application.removeAttribute(name) , ServletContext.removeAttribute(name)

******************************************************
request 객체를 빈태드로 엑세스하기:request도 빈처럼 다룰수 있다.
<jsp:getProperty name="request" property="remoteUser" />  

request빈의 프로퍼티들 (요청객체 임으로 getProperty만 가능하다)
authType : 들어온 요청의 인증 방식을 얻어내며, 모르면 null..
method   : 들어온 요청에서 행해진 http메소드(get,post,put)을 얻어낸다.
pathInfo : 들어온 요청의 url의 서블릿 경로 뒤에 붙지만, 질의 문자열 앞에 오는 추가 경로 정보 얻음
pathTranslated: 들어온 요청의 url의 서블릿 경로뒤,질의 문자열 앞에 오는 추가 경로를 얻어내 진짜 경로로 바꿈?
queryString : http요청 uri와 한몸으로 들어오는 질의 문자열 얻기
remoteUser : 요청을 보낸 원격 접속 사용자의 이름을 얻어냄. 사용자 이름은 http 인증과 함께 세팅됨
requestURI : 원래의 요청에 해당하는 URI를 얻음
characterEncoding: 캐릭터셋 얻음
contentType: 인터넷 미디어 타입을 얻음 (text/html , text/xml..)
protocol : 프로토콜과 버전을 얻음 <protocol>/<major version>.<minor version> 의 문자열로 얻음
remoteAddr : 요청 보낸 클라이언트의 ip주소 얻기
serverName: 요청 받은 웹 서버의 호스트 이름을 얻어냄
serverPort: 요청 받은 웹 서버의 포트번호
scheme: 들어온 요청의 url방식(scheme)를 얻어냄 (http,https,ftp..)
remoteHost: 요청을 보낸 에이전트(클라이언트)의 호스트 이름을 완전형태(fully qualified)로 얻어냄


'프로그래밍 > JSP' 카테고리의 다른 글

jsp 322p 세션에 기록해 두는 토큰에 관해  (0) 2014.01.02
jsp ~ jdbc  (0) 2014.01.01
jsp에서 빈의 사용2  (0) 2014.01.01
빈을 이용한 컴포넌트 방식의 설계1  (0) 2014.01.01
jsp 스크립트  (0) 2014.01.01
by givingsheart 2014. 1. 1. 15:58



자바 빈의 규약! 표준화


어째서 빈컨테이너는 공통상위 클래스(추상), 인터페이스 클래스 없이 빈 객체를 관리 할 수 있을까?

클래스의 메소드와 기능을 런타임에 노출 시킬 수 있게 하는 기능을 introspection이라 한다. 

그렇다면 introspection은 어떻게 구현되어 있나? 바로 java.lang.reflection 패키지를 사용한다.

빈 컨테이너는 자바빈즈에 api에서 정의된 기준에 맞는 public 메소드를 분석하여, 주어진 빈이 지원하는 프로퍼티를 알아낸다.

그럼으로 빈 클래스는 자신이 제공하는 프로퍼티에 대해서 
1.게터,세터를 제공해야 한다. (약속:set/get +프로퍼티이름 )
2.매개변수 없는 디폴트 생성자를 제공해야 한다. (분명 매개변수 있는 생성자도 reflect로 찾을수 있고 사용할수 있는데..? 
  표준화 하다 보니까 디폴트 생성자로 구현한건가?)
(etc)public 으로 노출해주는 것도.. modify 받아서 accesible인가를 바꿔주면 다 뚤을수 있음.. class를 구성하는 Class(타입)
      , modifyer(접근자), 각종 데이터, 각종 메서드가 모두 object 타입으로 포섭이 가능하니... 장점도 있지만, 단점도 있다.
  
      한마디로 reflect 이용하면 클래스를 사용(생성,세팅,메소드이용등)하거나 완전히 수정할수 있음
      (인터럽트해서 수정해서 악용한다. = 해킹이군.. 그럼으로 각종 보안 알고리즘(네트워크 송수신 데이터 암호화 rsa,des등),
      방화벽,중요데이터는 서버측에서 관리 등이 중요한 것임)

(ex) 자신이 생성된 시간을 기록해두는 빈 클래스

package ***;
import java.util.*;

public class CurrentTimeBean
{
  private int hours;
  private int minutes;

  public CurrentTimeBean()
  {
     Calendar now = Calendar.getInstance();
     this.hours = now.get(Calendar.HOUR_OF_DAY);
     this.minustes = now.get(Calendar.MINUTE);
   }

   public void setHours(int hours)
   {
      this.hours = hours;
   }
    
   public int getHours()
  {
     return this.hours
   }

public void setMinutes(int minutes)
   {
      this.minutes= minutes;
   }
    
   public int getMinutes()
  {
     return this.minutes;
   }

}

**********위 처럼 구현해 놓고************
<jsp:useBean id="time" class="CurrentTimeBean" />
<html> 
<body>
It is now <jsp:getProperty name="time" property="minutes" />
minutes past the hour.
</body>
</html>

=>물론 해당 빈의 모든 프로퍼티에 get,set 메서드를 제공해줄 필요는 없다.(읽기전용,쓰기전용,둘다혼용 따라서 구현)

=>프로퍼티 이름 지을때 소문자+낙타식으로 간다. xml에 대해선 어찌할 것인가? XML 보단 Xml이 일관성 있다.(첫자만 대문자)


*******************인덱스 프로퍼티를 정의하는 방법1**********************
1.전체 집합을 하나의 배열로 반환하는 겟,셋 메서드 구현 = 사용하는 사람이 알아서(스클립틀릿,태그) 전체 반복 작업을 해야한다.
2.인덱스 값을 받아서 해당 요소만 반환하는 겟,셋 메서드 구현 = 1에 비해 유용성이 높다.
3.전체 집합의 수를 돌려주는(length던지 size) 메서드 구현  
4.물론 특정 서비스(비지니스로직)를 제공한다면 해당 메서드도 구현해야 할것이다. (vo 클래스인지 따라)
5.아참.. 세터,게터로 일일히 jsp 페이지에서 세팅해야하니... init(String "intA,intB,intC")등의 메서드를 제공해도 좋을 것이다.
=> 1,2,3  +@로  제공하자 ^^//

=>인덱스 프로퍼티의 경우.. 안타깝게도 jsp 페이지 내부에 자바 코드(스클릿틀릿,표현식)을 사용해야 한다. 자바 코드를 지울수
  있는 수단은.. 짜잔~ "커스텀 태그"  <-- 얼렁 공부해야 할텐데...
  
 
(cf)jsp 표준 액션 태그의 경우.. 스탈라 프로퍼티만 다룰수 있다.(그럼으로 위의 5같은 메서드가 필요하다)

public void setNumbersList(String values)
{
  ArrayList<String> list = new ArrayList<String>();
  StringTokenizer tok = new StringTokenizer(values, ","); // ㅋㅋㅋ 내가 로또 클래스 문자열 매개변수로 처리할때 요거 썼지
  //일단 구분자로 잘라서 관리하고
  while(tok.hasNext())
  {
  list.add(tok.nextToken()); //매개변수 유효성 체크는 생략하나보다 ?
  }
  //구분자로 잘라낸 문자열들을 실제 사용할 타입으로 변환해서 저장
  numbers = new double[n.size()]; 
  for(int i=0; i<numbers.length; i++)
  {
  numbers[i] = Double.parseDouble( list.get(i) );
  }
}

public String getNumberList()
{
  String list = new String(); //스트링으로 반환하기 위한
  for( int i=0; i< numbers.length; i++)
  {
     if( i != numbers.length)
        list += numbers[i] + ","; // , , , col의 형식 만들어주기
     else 
       list += "" + numbers[i]; // row
   }
  return list;
}

=>jsp에서 사용시

<jsp;useBean id="stat" class="com.taglib.wdjsp.components.StatBean">
  <jsp:setProperty name="stat" property="numbersList" value="100,250,150,50,450" />
</jsp:useBean>

<html>
<body>
The average of <jsp:getProperty name="stat" property="numbersList" />
is eqaul to <jsp:getProperty name="stat" property="average" />
</body>
</html>

*******************인덱스 프로퍼티를 정의하는 방법2**********************
=> idea:인덱스에 대한 커서의 개념을 구현한다. JDBC의 ResultSet클래스 , JDBC2.0의 CachedRowSet 클래스
    즉 빈 클래스 안에 인덱스를 나타내는 인스턴스 변수를 넣고 이값을 증가,감소 시키는 것으로 인덱스 프로퍼티 액세스
    가능하게 하는것. (말 그대로 이터레이터 제공)

(ex) 
planets.jsp

<html>
<body bgcolor="white">
<jsp:useBean id="planet" class="wdjsp.PlanetBean" />
<table border="1"> //레이아웃 매니저를 떠올리면 될듯 (테이블 경계 1개 설정)
<tr> //테이블의 행(row)를 의미하는 듯
<th>Planet</th> //테이블의 열(col)을 세로(horizon)으로 표현한듯? <-- 헤더를 의미하는 키워드임.즉 테이블의 각 열의 대표이름
<th>Number of Moons</th>

<% while(planet.next() ) { %>  //이터레이터 처럼 반복자를 제공했긴 하지만, 스클립틀릿으로 자바코드 사용하는것은 유지보수
                                            //최악이다..나중에 커스텀 태그 쓰자! jsp:ForLoopList 같은걸로
<tr> //하나의 테이블 행에
<td> <jsp:getProperty name="planet" property="name" /></td>
<td align="center"> <jsp:getProperty name="planet" property="moons" /></td>
</tr>
<% } %>

</table>
</body>
</html>

=> 음.. html 문법에 대해 굳이 안찾아봐도 해석이 되고 있음...(happy)

PlanetBean.java

package wdjsp;

public class PlanetBean{
 private static final int numPlanets = 0;
 private static final String[] names = {
  "Mecury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus",
  "Neptune", "Pluto" };
 private static final int[] moons = {0,0,1,2,16,18,20,8,1};

private int index;

public PlanetBean(){
index = -1; //인덱스 초기 값
}

public void first(){
index = -1;
}

public boolean next(){
index++;
if(index >= numPlanets)
{
  index--;
  return false;
 }
else
{
  return true;
 }
}

public String getName(){
 return names[index];
}

public int getMoons(){
 return moons[index];
 }
}


*****jsp에서 프로퍼티의 타입이 전부 String 으로 넘어오는걸 기억할것!******

(1)primitive -> String
java.lang.Boolean.toString(boolean)
java.lang.Byte.toString(byte)
java.lang.Character.toString(char)
..
object = 객체의 toString() 호출   => 그럼으로 재정의가 필요함

(2)String -> primitive
java.lang.Boolean.valueOf(String);
java.lang.Integer.valueOf(String);
...
object의 경우 new String(String)   => 구현에 문제가 있다. 스트링에서 객체를 어떻게 구성할 것인가?
object = new object();
object.booleanA = Boolean.valueOf(String[0]);
object.intA = Integer.valueOf(String[1]);
... 식으로..

****매개변수의 유효성을 검증해주는 메서드 필요****
boolean isValidMyObject() 식으로

****아까 위에서 거론했지만.. 디폴트생성자가 기본임으로 디폴트생성자->매개변수생성자->init() 메서드 호출 필요***

(ex)
public A(){
 this(5)
}

public A(int a){
this.temp = temp;
init();
}

private void init(){
 maxTemp = this.temp + 10;
 ...
 if(maxTemp > 10)
    status = Status.Max;
 else
    status = Status.Normal;
}


****빈을 구현해본 자작 병신코드 OTL ***

package com.taglib.jsp.components;

import java.util.StringTokenizer;

//복리이자를 계산해주는 빈
// 복지 적용시 원금 계산
// 지불금액 = 원금* (1+이자율(요것도 연이율/기간))의 복리횟수(연도/기간)의제곱 (한마디로 등비 수열이었나??)
public class CompoundInterestBean  //아하하 implements Serializable 까먹음...
{
private double principal; //원금
private int years; //총기간
private int compound; //복지이자가 누적되는 단위기간
private double interestRate; //이자율
private double futureValue; //미래 금액
//타입이 달라서 컨테이너 보관이 안돼니.. 망할 ..ArrayList<Object> 로 처리할까 보다 -_-;
//1.디폴트 생성자
public CompoundInterestBean()
{
// super();
// this.principal = 0.d;
// this.years = 0;
// this.compound = 0;
// this.interestRate = 0.d;
// this.futureValue = 0.d;
this("1000.0,12,1,8.0"); //매개변수 있는 생성자 사용대신 super()를 사용 못하게됨 ㅠㅠ
}
//1.1매개변수 있는 생성자 (이놈 쓸라면 스클립틀릿 or 표현식 필요)
public CompoundInterestBean(String params)
{
//jvm 매개변수로 -ea 인가 필요
//assert init(params) == true : "CompoundInterestBean(String params)실패";
try
{
init(params);
}
catch(Exception e)
{
e.printStackTrace();
}
}
//입력 처리용 내부 메서드 (이걸 public 으로 풀어줄 필요가 있을까??? 내부 작업용 메서드인데..private로 하는게?)
private void init(String params) throws Exception //익셉션 클래스 따로 만들기 귀찮!
{
// 1.,로 구분되어 있다고 가정한다. 
// 2.필요한 토큰은 5개 (타입이 int와 double로 다름으로 반복문 사용 안됨)
// 3.토크나이저를 사용한다.
// 1.예외처리 (throw나 throws 선언은 안하기~) 
if((params.length() > 0) && (" ".equals(params)) == false)
{
//2.잘라내기 위해 토크나이저 생성
StringTokenizer tk = new StringTokenizer(params,",");
//3.토큰 갯수 검사
if(tk.hasMoreTokens() && tk.countTokens() == 4) //상수 때려받아서 죄송
{
//4.각각의 매개변수의 범위를 체크한다.
Double principal = Double.valueOf(tk.nextToken());
if(!isValidPrincipal(principal))
throw new Exception();
int years = Integer.valueOf(tk.nextToken());
if(!isValidYear(years))
throw new Exception();
int compound = Integer.valueOf(tk.nextToken());
if(!isValidCompound(compound))
throw new Exception();
Double interestRate = Double.valueOf(tk.nextToken());
if(!isValidInterestRate(interestRate))
throw new Exception();
//5.순서대로 변환해서 가져온다.
this.principal = principal;
this.years = years;
this.compound = compound;
this.interestRate = interestRate;
//6.미래 이자 계산도 여기서 해야할까?
//this.futureValue = getFutureValue();
this.futureValue = 0.d;
}
else
{
throw new Exception();
}
}
}
//2.게터세터
public double getPrincipal() {
return principal;
}

public void setPrincipal(double principal) {
this.principal = principal;
}

public int getYears() {
return years;
}

public void setYears(int years) {
this.years = years;
}

public int getCompound() {
return compound;
}

public void setCompound(int compound) {
this.compound = compound;
}

public double getInterestRate() {
return interestRate;
}

public void setInterestRate(double interestRate) {
this.interestRate = interestRate;
}

public double getFutureValue() 
{
//계산해야 한다. 계산해서 futureValue 초기화해줄 내부 메서드 추가
calcutateFutureValue();
return futureValue;
}

// public void setFutureValue(double futureValue) {
// this.futureValue = futureValue;
// }
//3.toString 구현 (모든 프로퍼티를 ,로 붙여서)
public String toString()
{
// String retVal = new String("");
// //갯수가 적으니 StringBuffer나 Builder 안쓰고 String으로 처리
// retVal += this.principal + ',' + this.years + ',' + this.compound + ','
//  + this.interestRate + ',' + this.futureValue + ',';
// //아 코드 드럽다.
// return retVal;
return "" + this.principal + ',' + this.years + ',' + this.compound + ','
 + this.interestRate; //futureValue는 리턴값임으로 제외
}
//4.요 빈의 특별 서비스 메서드  복리 계산해서 토탈 금액 반환해주기
private void calcutateFutureValue()
{
this.futureValue = this.principal * Math.pow(1+ this.interestRate / this.compound,
this.years / this.compound);
}
//5.매개변수 프로퍼티의 유효성을 체크 (이것들도 private가 맞지만.. jsp에서 사용할지도 모르니;; public으로 열어놨다!
public boolean isValidPrincipal(double principal)
{
boolean retVal = true;
//원금은 음수,0 일수 없다. double 범위 체크는 안해도 될듯..
if(principal <= 0.d)
{
retVal = false;
}
return retVal;
}
public boolean isValidYear(int year)
{
boolean retVal = true;
//연도는 음수,0일수 없다. 마찬가지로 int 범위체크 불필요
if(year <= 0)
{
retVal = false;
}
return retVal;
}
public boolean isValidCompound(int compound)
{
boolean retVal = true;
//이자율 계산 기간의 경우.. 1이면 1달마다 2면 2달마다  12면 1년마다 
//그럼으로 음수,0만 체크하면 된다?
if(compound <= 0)
{
retVal = false;
}
return retVal;
}
public boolean isValidInterestRate(double interestRate)
{
boolean retVal = true;
//이자율이야 고리대금이면.. 엄청 클수 있으니까.. 
//음수,0 체크만
if(interestRate <= 0.d)
{
retVal = false;
}
return retVal;
}
}


******************BeanInfo 인터페이스의 존재의미**********

<pre>public interface BeanInfo</pre>

Bean 의 구현자는, 이 BeanInfo 인터페이스를 구현하는 BeanInfo 클래스를 제공해, 자신의 Bean 의 메소드, 프로퍼티, 이벤트 등에 관한 명시적인 정보를 제공할 수가 있습니다.

Bean 의 구현자는, 명시적인 정보를 모두 제공할 필요는 없습니다. 제공하는 정보를 선택할 수가 있어 나머지는 Bean 클래스의 메소드의 저레벨 리플렉션을 사용한 자동 해석 및 표준의 디자인 패턴의 적용에 의해 취득할 수 있습니다.

사용자는, 각 Descriptor 클래스의 일부로서 매우 많은 종류의 정보를 제공할 기회가 주어지게 됩니다. 그러나, 각 생성자 이 필요로 하는 최소한의 코어 정보를 제공하는 것만으로도 충분합니다.

BeanInfo 클래스의 편리한 「무조작」base class를 제공하는 SimpleBeanInfo 클래스도 참조해 주세요. 이것을 사용하면(자), 명시적인 정보를 제공하고 싶은 특정의 개소를 오버라이드(override) 할 수 있습니다.

Bean 의 모든 동작에 대해 알려면 Introspector 클래스를 참조해 주세요.


=>기존에 만들어둔 자바 클래스에 요 인터페이스를 구현하면.. jsp 컴포넌트 개발 가능



<pre>public class SimpleBeanInfo
extends Object
implements BeanInfo
</pre>

사용자가 BeanInfo 클래스를 제공하기 쉬워지도록(듯이) 하는 지원 클래스입니다.

무조작 (noop) 정보의 제공을 디폴트로 설정합니다. 또, 선택한 토픽에 대한보다 명시적인 정보를 제공하기 위해서, 선택적으로 오버라이드(override) 되는 일이 있습니다. 인트로스페크타는 "noop" 치를 검출하면(자), 저레벨의 인트로스페크션 및 설계 패턴을 적용해, 타겟 Bean 를 자동적으로 해석합니다.



*****Serializable 인터페이스 구현하기 필요*****

서버가 동작 멈출때 파일,디비등에 빈정보 기억했다가 로드하거나,

트래픽이 많은 환경에서의 클러스트링(db에 쿼리쏠때 연결되는 작업지시를 버퍼에 담아두는

것)을 지원하는 서버에서 필요하다.



******스클립틀릿과 빈 태그 함께 쓰기*******


<jsp:useBean id="xxx" class="xxxBean" scope="page" />

xxx xxxx <jsp:getProperty name="xxx" property="a" />

<jsp:useBean id="xxx" class="xxxBean" scope="page" />

xxx xxx <%= xxx.getA() %> 

는 동일하다.


=>주의할점: getA()를 통해 리턴되는 타입이 String인지 확신할 수 없다!!!!


'프로그래밍 > JSP' 카테고리의 다른 글

jsp ~ jdbc  (0) 2014.01.01
jsp에서 빈의 사용3  (0) 2014.01.01
빈을 이용한 컴포넌트 방식의 설계1  (0) 2014.01.01
jsp 스크립트  (0) 2014.01.01
part2(2013/11/27)  (0) 2014.01.01
by givingsheart 2014. 1. 1. 15:58
물론 빈과 태그를 이용해 컴포넌트 방식으로 app를 개발하는 방식에는 다양한 방법이 있을것이다.
ejb (엔터프라이즈 자바빈), 스프링 프레임웍, jsp 등등등.. 하여간 자바 프레임 워크는 정말로 엄청나다;;

(4)빈(bean) 관련 태그: 서버측 자바빈의 액션은 <jsp:useBean>, <jsp:setProperty>, <jsp:getProperty>가 존재하며
                                빈(컴포넌트)을 이용한 컴포넌트 중심의 설계는 프리젠테이션과 애플레케이션 로직을 나누어준다.

=>빈은 기능별로 a.비주얼 컴포넌트 빈 b.데이터 빈 c.서비스 빈(비지니스) 으로 나뉜다.

클래스와 마찬가지로 데이터 + 동작을 묶어서 외부에선 내부의 복잡한 구현을 몰라도 간단하게 인터페이스 메서드를 통해 지시
하면 된다. = 동작 원리의 추상화 (abstraction) 캡슐화 (encapsulation)

=>인터페이스를 통한, 다형성을 통한 상위 수준의 추상화 = 디자인 패턴들 = 설계

은행창구 사용자 인터페이스 <-> 계좌 관리 모듈 <-> db접근용 컴포넌트 <-> db


=>그럼으로 빈은 표준화된 타입이어야만 한다. ojbect만 상속받고, 데이터, 디폴트 생성자, 세터와 게터, toString, 
    eqaul, hashCode, 기록할 용도라면 직렬화 선언이 필요하다. (clone,compareTo등은 도메인오브젝트에서 제공안한다)
    (예전에 배웠던 do(vo,dto)가 또 나오네;;)


 태그기반의 컴포넌트(빈) 프로그래밍의 예

//빈 사용 선언
<jsp:useBean id="user" class="RegisteredUser" scope="session" /> //id는 각 빈인스턴스의 식별 역할
<jsp:useBean id="news" class="NewsReports" scope="request" />  //스코프(생존주기)의 차이 확인!
   //빈 초기화
  <jsp:setProperty name="news" property="category" value="financial" />  셋프로퍼티할때 name은 useBean시의 id와 같다
  <jsp:setProperty name="news" property="maxItems" value="5" />   xml문법에서 "" 를 주의할것
</jsp:useBean>

**********************************************
//setProperty사용시 기억할것은.. 사용자의 폼(브라우저)로부터 입력 받은 값은 request객체에 담겨오고 그것을 value=에 담아줄
//수도 있지만 사용자 폼에서 넘어오는 매개변수 이름과 빈에 설정된 프로퍼티 이름이 동일할 경우 param 키워드로 바로 가져올수
//있다. 물론 프로퍼티 이름과 매개변수 이름이 같을 경우 param 역시 생략이 가능하다.

<jsp:setProperty name="news" property="category" param="category" />
<jsp:setProperty name="news" property="category" value=' <%= request.getParameter("category") %> ' /> (표현식)은 동일하다.
<jsp:setPropertry name="news" property="category" /> 도 프로퍼티,매개변수이름이 같을때 위와 동일하다.
***********************************************


<html> //헤더는 생략 가능?
<body>
Welcome back <jsp:getProperty name="user" property="fullName" />,
your last visit was on <jsp:getProperty name="user" property="lastVisitDate" />,
Glad to see you again!
<P>  //이건 뭔지 아직 명확치 않지만, 라인 넥스트로 여겨진다. 개행
There are <jsp:getProperty name="news" property="newItems" /> new articles abailable for your reading pleasure.
Please enjoy your stay and come back soon.
</body>
</html>


//사용자가 보게되는 프리젠테이션 영역 페이지에선
<html>
<body>
<form action="UserInfoResults.jsp">
Category: <input type="text" name="category">
MaxItems: <input type="int?" name="maxItems">
...
<input type="submit" value="UserInfo Value"> //식으로 위의 빈 초기화 page에 전달할 것이다.
</form>
</body>
</html>

=>사용자 id,pw 같은 경우 은닉필드에 저장해서 주고 받아선 안됀다. (html 소스 보기하면 나오기 때문) 그럼으로
빈태그 , 스클립틀릿으로 작성된 jsp페이지에서 이런 민감한 정보를 관리해야한다.

=>setProperty 할때 <jsp:setProperty property="*"> 식으로 와일드 카드로 사용자로 부터 전달받은 매개변수를 빈에 간단히 
대입할 경우 위험성이 있다.

(ex) AccountBean 빈으로 계좌 정보를 출력해주는 온라인 뱅킹 애플리 케이션의 경우
AccountBean 클래스는 accountNumber(계좌번호) , balance(잔고), withdrawalAmount(인출액), transferAmount(이체액)
같은 계좌 거래에 대한 프로퍼티가 존재한다. 아래처럼 폼을 통해 사용자에게 인출액을 지정하게 하면 지정된 jsp 폼 핸들러
가 작동하여 실제 거래를 수행하고(프로퍼티 값 세팅의 부가 효과 발생) 그 결과를 출력한다고 가정했을때..

<jsp:useBean id="myAccount" class="AccountBean">
  <jsp:setProperty name="myAccount" property="*"/>   <--와일드 카드로 대입
=>일반적으로 디폴트 값을 명시적으로 세팅하는 이유는.. null값=valus의 대입을 방지하고, 다양한 방법으로 페이지를 엑세스 
할수 있게 하기 위함이다.
</jsp:useBean>
<html>
<head><title>Cash Withdrawal</title></head>
<body>
<p>
$ <jsp:getProperty name="myAccount" property="withdrawalAmount" /> has been withdrawn from Account
# <jsp:getProprtty name="myAccount" property="withdrawalAmount" /> . 
Your new balance is $<jsp:getProperty name="myAccount" property="balance" />.   <---잔고 프로퍼티가 노출됨
Thank you for patronizing us at the First Bank of Orange.

이 페이지의 URL이 withdraw.jsp 일때 , 사용자가 다음과 같은 request를 보냈을때 어찌할 것인가?
http://server/acount/withdraw.jsp?accountNumber=PH1L31N&balance=1000000000   

=> string의 경우 ..match("?!@#$%^&*") 식으로 처리해서 검증을 하는건 어떨까?

jsp 컨테이너는 withdraw.jsp 페이이지의 <jsp:setProperty> 태그를 처리하면서 이 매개변수와 동일한 이름을 가진 balance
프로퍼티를 찾아서 100000000을 넣어준다.  OTL

***************************************************************************

1.<jsp:useBean> 속성으론
(1)id : 주어진 페이지에서 해당 빈 인스턴스를 식별하는 역할
(2).scope : page, request, session, application
(3)class : 빈클래스의 효과적인 관리를 위해 일반적으로 패키지로 묶어 관리한다. 빈 클래스는 패키지명을 지정해줘야 하지만,
import  또는 <%@page %> 지시자 태그를 통해 클래스 이름만으로 사용이 가능하다.
(4)type : 수퍼클래스나 이 빈이 구현한 다른 인터페이스 타입으로 참조할 필요가 있을 경우 세팅
(5)beanName : 중요치 않음(매번 초기화가 복잡한 빈의 경우.. 직렬화를 이용해 사본을 db,file등에 넣어두고 beanName을 이용해
                      인스턴스화 시킴)
(6)태그 몸체 : <jsp:useBean>  </jsp:useBean> 사이에 존재하는 초기화 코드 조각

2.인덱스 프로퍼티 접근하기
<B>Tomorrow's Forecast </B>: <%= weather.getForecast(0) %>  //스클립틀릿중 표현식
<BR>
<B>The Rest of the Week</B>
<UL>
<% for(int index=1; index<5; index++) { %>
<LI> <%=weather.getForecast(index) %> (maybe)
<% } %>
</UL>

****************************************************************************

TimerBean 예제

//페이지 정의부
<%@ page import="com.taglib.wdjsp.components.*" %>  //페이지 지시자 스크립트로 라이브러리 임포트
<jsp:useBean id="timer" class="com.manning.jsp.TimerBean" scope="session" /> //빈 정의시 id , 빈 프로퍼티 사용시 name

//사용자에게 출력부
<html>
<body>
Elaped Time: <jsp:getProperty name="timer" property="elapedMinutes" /> minutes
</body>
</html>

=> 위의 기능을 모든 jsp페이지에 넣고 싶다면? = 원하는 페이지 파일에다 <jsp:include> 빈 태그를 넣어주면 된다.


***************************************************************
//웹기반의 온라인 퀴즈 프로그램에서 위의 개념(빈의 기능 include)을 이용해본다면?
<html>
<body>
//폼 액션 정의부
<form action="/servlet/processQuestions/6">  //페이지 컨트롤링할 서블릿 설정
<b>Question 6 </b><br> //<b>는 bold인듯 하고.. br은 아마 개행 아닐까 싶다..
What is the airspeed velocity of an unlaiden European swallo?
<br> <input type="text" name="answer"> //텍스트로 입력받고 입력 값 객체의 이름을 answer로 한다.
<br> <input type="submit" value="Submit Answer"> //서블릿에 제출할 입력으로 그 객체의 이름은 Submit Answer로 한다.
</form>

//연결할 jsp 페이지(저 위에 만들어놓은 빈을 import할) 정의
<jsp:include page="/footers/ElapsedTimeFooter.html" flush="true" /> //자동 출력한다.

</body>
</html>


//ElapedTimeFooter.html 파일의 구성
<jsp:useBean id="timer" class="com.manning.jsp.TimerBean" scope="session" />
<hr>
Remember, speed is a factor in this exam! <BR> //개행인듯..
Time Used: <jsp:getProperty name="timer" property="elapsedSeconds" /> seconds


*****************************************************************************
빈을 어플리케이션(jsp,리소스들 모음인 내가 사용자에게 제공할 프로그램) 스코프에 저장했을 경우 유용성
1.서버에 저장되는 빈 인스턴스는 오직 1개이다. (매번 요청,페이지 변경,세션 변경등 시에 새로 객체 생성할 필요가 없다)
2.여러 페이지에서 공유가 가능핟.(그럼으로 동기화 처리가 중요)
3.서버(jsp컨테이너)가 인스턴스가 없으면 알아서 생성하고.. 서버 꺼질때 기록하는등 귀찮은일을 알아서 해준다.

<jsp:useBean id="ship" class="com.mannig.ShipRateBean" scope="application">
//초기화 코드조각
</jsp:useBean>
<html>
<body>
Current shipping charges are: <jsp:getProperty name="ship" property="baseCharge" />
per shipment plus <jsp:getProperty name="ship" property="perItemCharge" />
per each item shipped.
</body>
</html>

******************************************************************************
scope와 빈의 type 속성
 대게 어떤 슈퍼클래스의 서브클래스로 만들어진 빈을 조작할 때에만 사용한다.
 어떤 빈이 현재의 스코프(request,session)에 있는데, 정확한 타입을 알 수 없을경우..
 type클래스에 저장된 속성을 사용하면 된다. 

 어떤 서블릿,jsp 페이지에서 빈 컬렉션을 세션에 저장했다고 가정했을때 해당 빈의 타입
 이 자바의 Collection 인터페이스에서 갈라져 나온 클래스인것을 알지만, List인지 Set인지
 정확히 모를경우 type속성에 저장해둔 Collection 속성으로 빈을 참조할수 있다. 한마디로
 type 속성은 다형성을 지원하는 개념이다.

<jsp:useBean id="elements" type="java.util.Collection" scope="session" />


'프로그래밍 > JSP' 카테고리의 다른 글

jsp에서 빈의 사용3  (0) 2014.01.01
jsp에서 빈의 사용2  (0) 2014.01.01
jsp 스크립트  (0) 2014.01.01
part2(2013/11/27)  (0) 2014.01.01
javax.servlet.http.HttpServlet 소스코드 part1 (2013/11/27)  (0) 2014.01.01
by givingsheart 2014. 1. 1. 15:57
**jsp태그 -> xml태그로 표현이 가능하다!**

1.jsp지시자(directive) 태그 (124p)    <%@ xxx xxx="xxx" %>   , <jsp:directive.page xxx="xxx"/>

 (1)page 지시자란? <%@ page %>
   info
   laguage                  language="java"
   contentType            contentType= "text/xml"  or  "text/html; charset=ISO-8859-1"
   pageEndcoding       pageEncoding= "UTF-8"
   extends                  jsp->컴파일->서블릿 클래스가 상속받을 슈퍼클래스 (디폴드로 사용할것. 컨테이너가 알아서 선택해줌)
   import                     import="java.net.URL"
   session                  session="true" (세션 관리에 참여할 페이지여야 추후 내부객체를 통해 세션 정보 다룰수 있음)
   buffer                      buffer="12kb" (디폴트 8kb면 충분)
   autoFulsh                autoFlush="true" (버퍼 차면 알아서 flush, 주의할 것은 일단 쏘면.. 더이상 처리,수정,조작 불가능.. 
                                 페이지가 생성하는 출력 양이 예측 어려우면 true로 하돼, 가급적 여러 작업들을 처리할 경우 false)
   isThreadSafe           isThreadSafe="true" (가급적 true로 할것, db등 리소스 접근시에 특별한 처리 db커넥션 풀의 활용이
                                 필요함)
   errorPage                errorPage="/park/error.jsp"
   isErroePage             errorPage="true"

 (2)include 지시자란?  <%@ include  %> , <jsp:directive.include xxx="xxx" />
                               주어진 파일(경로+파일명)을 페이지에 include 시킨다.  (c,c++ 인클루드와 동일)
                               <%@ include file="includes/park01.jsp" %>

 (3)taglib 지시자란? <%@ taglib uri = "tagLibraryURI" prefix="tagPrefix" %> <jsp:directive.taglib uri="xx" prefix="xx" />
                             다른 라이브러리 사용한다고 컴파일러에게 선언 (뒤에 prefix는 접두어-네임스페이스 역할)
                             url 이 아닌, 로컬의 uri인 이유는? = 보안 문제(세상에 믿을놈 없음..서버가 외부 데이터를 믿으면 안됌)

 2.스크립트 태그(scripting elements)
     (1)선언문 : 주어진 jsp페이지에서 사용할 변수와 메소드를 정의   <%! xxx %>  , <jsp:declaration> xxx </jsp:declaration>
                    (메소드 정의시 중괄호 조심)

                    jsp초기화 메서드 jspInit() , 소멸 메소드 jspDestroy()란 이름으로 제공함으로 구현해서 사용~

     (2)표현식: 값을 받아서 출력하는 용도  <%= 표현식 %>  ,  <jsp:expression> 표현식 </jsp:expression>
                   (숫자,문자,불린,스트링,자바객체 타입 사용가능.. 단 모든 표현식은 출력전에 문자열로 변환됨 toString() )

     (3)스클립틀릿: 자바 코드임 (변수,메서드,논리조건,반복조건,"예외처리")
                     <% 스클립틀릿 %> ,  <jsp:scriptlet> 스클립틀릿 </jsp:scriptlet>
                     {} 중괄호 블럭은 자바와 마찬가지로 지역 scope를 의미.

     => 스클립틀릿,표현식,정적컨텐츠,자바빈은 출력을 위해 사용된다. jsp->서블릿으로 컴파일 된후 서블릿의 _jspService()
         메소드를 구축한다.  표현식은 컴파일 되는데 비해, 스클립틀릿,자바빈은 컴파일(파싱) 없이 바로 사용됨
         아참 html은 브라우저에 바로 출력되기 위한 스크립트이고..

     => 스클립트 내에 정의하는 메서드에 throws 키워드를 선언후 콜러측이 try,catch 처리하게 하는등 .. 자바의 예외처리
         프로세스 동일하게 사용가능.

     =>단지 스클립틀릿을 jsp에 사용하면 코드의 유지및 웹디자이너와 업무 분담이 곤란해짐. 그럼으로 각종 태그를 사용

 
3..주석문  <!-- 컨텐츠주석으로 브라우저의 html보기를 통해 보여짐 -->  <%-- jsp주석문 --%> <% /*편하다*/ %>

4-1 내부 표준 객체 액션 (jsp가 디폴트로 제공하는 내부객체를 통한 표준액션)
 
 =>기능상 jsp페이지 서블릿에 관계된 객체, 페이지 입출력에 관계된 객체, jsp페이지가 처리되는 동안 외부 환경 정보를 제공
   하는 객체, 에러 때문에 생긴 객체로 나뉜다.  

  그중 request, session, application, pageContext 객체는 속성(attribute=String key, Object value)를 읽고 쓸수 있다.

  *********서블릿 관련 내부 객체************
  (1)page:페이지의 서블릿 인스턴스  (javax.servlet.jsp.HttpJspPage)
     <%@ page info="xxx" %>
      Page info: <%= ((javax.servlet.jsp.HttpJspPage)page).getServletInfo() %>

  (2)config:서블릿 구성데이터 (javax.servlet.ServletCofig)
      <%! static private DbConnectionPool pool = null;
            pulbic void jspInit()
            {
              if(pool == null)
              { 
                String username = config.getInitParameter("username");
                String password = config.getInitParameter("password");
                pool = DbConnectionPool.getPool(this, username, password);
              }
            }
       %>
  
  ********입/출력용 객체**********        
  (3)request:요청데이터 (java.servlet.http.HttpServletRequest)
     =>현재의 페이지 처리를 시작하게한 요청 정보를 가지고 있는 객체로 요청url,헤더,쿠키,그외 매개변수를 얻을수 있다.
     =>요청 매개변수를 액세스하기 위한 메서드, 요청 헤더,쿠키를 읽기위한 메서드,url등을 읽기위한 메서드가 있다.

  (4)response:응답데이터 (java.servlet.http.HttpServletResponse)
     =>회신용 컨텐츠의 타입(ContentType,Encoding)을 설정하는 메서드, 헤더를 세팅하기 위한 메서드, 응답 상태코드를
        설정하기 위한 메서드, utl 다시 쓰기를 위한 메서드가 있다.

  (5)out:페이지 컨텐츠 출력용 스트림 (javax.servlet.jsp.JspWriter)
      =>스클립틀릿을 통해 출력을 담당하며 (isAutoFlush(), getBufferSize(), getRemaining(), clearBuffer(), newLine(),
          clear(), flush(), close() 등의 java의 printwriter(내부적으로 버퍼 필터계열사용) 객체처럼 쓸수 있음)

      <P>counting eggs
       <% int count = 0;
            while(cartoon.hasNext())
            {
                count++;
                out.print(".");   <-- 바로 웹브라우저에 표시가 된다.(정적컨텐츠,jsp표현식 필요없이도)
             }
        %>
        <BR>
         There are <%= count %> eggs.
         </P>
  
  *************컨텍스트 객체*************
  (6)session:여러페이지에 대한 사용자 각각의 세션 정보(javax.servlet.http.HttpSession)
     =>세션 유지및 관리를 위해 필요한 정보를 세팅할 수 있는 메서드 제공 

  (7)application:프로그램자체(jsp묶음)로 모든 페이지가 공유하는 데이터(javax.servlet.ServletContext)
     =>application.setAttribute("xxx", xxx); 를 통해 jsp페이지들이 데이터를 공유가 가능 (ex: 디비연결pool 객체)

     => getSeverInfo() : 서블릿 컨테이너의 이름과 버전
         ...
         getMimeType(filename) : 지정된 파일의 mime 타입 반환 (text/html등)
         getResource(path): 매개변수 url패스의 컨텐트(네트워크,로컬)를 엑세스하느 객체 반환
         getResourceAsStream(path): url패스의 컨텐트를 읽어 올수 있는 입력 스트림 객체 반환
         getContext(path): url패스에 대한 애플리케이션의 외부 환경 정보를 반환
         getRequestDispatch(path): url패스에 대한 요청 전달자(dispatcher) 반환 
         ...
         log(message) : 로그 기록용
         log(message, exception): 로그 기록 + 스택 결과(printStackTrace())

  (8)pageContext:jsp페이지가 실행되는 시점에서 외부 환경 데이터 (javax.servlet.jsp.PageContext)
      =>모든 jsp 내부객체의 속성을 얻을수 있는 메소드 + 현재 페이지에서 다른 페이지로 흐름 제어를 넘길수 있음.
         (jsp 커스텀 태그를 구현할때 사용됨)
  
      =>getPage() : 현재 페이지에 대한 서블릿 인스턴스(page내부객체) 반환
         getRequest() : 현재 페이지의 요청 객체 반환
         getResponse() : 현재 페이지의 응답 객체 반환
         getOut() : 현재 페이지의 출력 스트림 객체 반환
         getSession() : 현재 페이지를 요청한 세션 객체 반환
         getServletConfig() : 서블릿 구성 객체(config내부객체) 반환
         getServletContext() : 현 페이지의 서블릿이 실행되는 외부 환경(context=매니저 객체) 즉 application 객체를 반환
         getException() : 에러 페이지가 있을 때 이 페이지에 넘겨지는 예외(exception 내부객체) 반환

         forward(path) : 요청 처리를 다른 로컬 url로 전달
         include(path) : 다른 로컬 url을 처리한 결과를 이 페이지에 포함

         setAttribute(key, value, scope) : 특정 스코프(page등) 정보 기록
         ...
         getAttributeNamesInScope(scope) : 특정 스코프에 있는 모든 속성의 이름을 뽑아냄
         getAttribute(key, scope) : 특정 스코프에 있는 key값에 해당하는 value 반환
         ...

        PageContext.SESSION_SCOPE, PageContext.APPLICATION_SCOPE, PageContext.REQUEST_SCOPE, ...

      =>어플리 케이션 스코프가 가장 수명이 길고, 그 담이 세션이다. 페이지,요청 스코프는 한번에 스레드 하나만 접근가능
         하지만, 어플레 케이션&세션 스코프는 그렇지 않기에 멀티스레딩 처리를 해야한다.

 ***********예외처리객체*************
  (9)exception:처리되지 않은 에러나 예외 (java.lang.Throwable)
     =>page 지시자(directive)에서 예외를 사용하겠다고 설정해야 사용이 가능한 내부 객체

     => getMessage() 
         printStackTrace(output)
         toString()

     <%@ page isErrorPage="true" %>
     <H1>경고 </H1>
     오류 발견~:<BR>
     <B><%= exception %></B><BR>
     <% exception.printStackTrace(new java.io.PrintWriter(out)); %>


4.2 jsp액션 
    =>페이지 사이를 전환하기 위해, 자바 애플릿의 설정, 자바진즈 컴포넌트를 사용할때 사용된다.
       모든 커스텀 태그는 jsp 액션의 형태를 뜨며, 액션의 경우 xml 문법만을 지원한다.

(1)forward 액션 태그    <jsp:forward page="localURL" /> (정적문서,cgi,서블릿,jsp로 제어권 넘김)
   =>일반적으로 조건 분기 코드에서 자주 쓰인다.
      <% if(!database.isAvailable()) {  %>
            <% 서버 유지 보수중이라 아웃 객체를 사용해 알리고 %>
            <jsp:forward page="db유지보수중.html" /> <--제어권 넘기고
           <% } %>
           <%-- 데이터베이스가 제대로 작동중 ~~ --%>

   =>제어권을 넘길때 기존 페이지의 출력 버퍼에 쌓인 내용들 모두 flush되고 close 된다. 
      a.그럼으로 <jsp:forward> 액션 사용전에 출력 버퍼가 비워지지 않게 한다. 
      b.버퍼 출력이 안되는 페이지의 경우 <jsp:forward> 액션을 컨텐트 출력 부분 앞에 둘것!

   =>요청 시점 속성값 (request-time attriute value)을 지원한다.

      <jsp:forward page= '<%= "message"  + statusCode  + " .html" %> ' />
       =>status값이 404이면 message404.html 이란 로컬 url로 제어가 넘어감

   =>제어가 넘어간 페이지는 pageContext가 새롭게 생성, request,session객체는 동일하게 유지, application도 옮긴 페이
      지가 같은 어플리케이션 이라면 유지됨. (일반적으로 페이지 전환시 요청,세션 객체에 정보를 기록)

    <jsp:forward page="로컬url">

       <jsp:param name="매개변수명1" value="매개변수값1" />
       <jsp:param name="매개변수명2" value="매개변수값2" />
       <jsp:param name="매개변수명3" value="매개변수값3" />
        ...
    </jsp:forward>


(2)include 액셔 태그: 제어권을 다른 페이지에 임시로 주는것.
    => 지시자 include에 비해 a.자동 재컴파일 b.작은 클래스 크기(여러 페이지에 코드 삽입x) c.매개변수 추가 기능
        d.요청 시점 속성값을 통한 더욱 유연한 제어 가능
         지시자 include의 경운 a.지역변수의 공유 b.조금 더 나은 실행시간 효율(제어권 이동x) c.출력 버퍼링에 제약x

    => 지시자(directive)를 통해 include 된 페이지: 원래의 페이지와 한몸
         액션 태그를 통해 include 된 페이지: 원래의 페이지의 바깥에서 요청을 넘겨받아, 그 처리결과를 원래의 페이지에 리턴
         (정적컨텐츠인 html, jsp 페이지, 서블릿, cgi 스크립트등 가른 형식의 파일까지 간접 인클루드 가능함)


    <jsp:include page="로컬url" flush="true">
      <jsp:param  name="매개변수이름1" value="매개변수값1" />
      <jsp:param  name="매개변수이름2" value="매개변수값2" />
      <jsp:param  name="매개변수이름3" value="매개변수값3" />
    </jsp:include>


(3)plug-in 액션 태그: <jsp:plugin> 액션은 자바 애플릿을 설정할수 있는 브라우저별 html 생성하는데 사용

(4)빈(bean) 관련 태그: 서버측 자바빈의 액션은 <jsp:useBean>, <jsp:setProperty>, <jsp:getProperty>가 존재하며
                                빈(컴포넌트)을 이용한 컴포넌트 중심의 설계는 프리젠테이션과 애플레케이션 로직을 나누어준다.


'프로그래밍 > JSP' 카테고리의 다른 글

jsp에서 빈의 사용3  (0) 2014.01.01
jsp에서 빈의 사용2  (0) 2014.01.01
빈을 이용한 컴포넌트 방식의 설계1  (0) 2014.01.01
part2(2013/11/27)  (0) 2014.01.01
javax.servlet.http.HttpServlet 소스코드 part1 (2013/11/27)  (0) 2014.01.01
by givingsheart 2014. 1. 1. 15:55

'프로그래밍 > 성능' 카테고리의 다른 글

string vs stringBuffer 추가 논점(2013/11/29)  (0) 2014.01.01
by givingsheart 2014. 1. 1. 15:55

void ioWorker() throws IOException

{
1.스트림 연다.
2.작업한다. <-IO 익셉션 발생했을 경우
3.스트림 닫는다.
}

=> 생각해볼 점.. throws를 선언했음으로 익셉션에 대한 catch의 책임은 콜러측에 넘겼지만,

     익셉션 발생시 코드의 제어에 따르면 (catch or finally가 없다면) 제어가 바로 콜러측으로 복귀하기 때문에
     시스템 리소스를 열어서 워커가 작업 중이었다면.. 리소스 누수가 발생한다. 그럼으로 리소스 관련 작업을
     해줄때에는 throws 선언했다고 방심하지 말고.. 리소스를 어떻게 안전하게 해제할지를 고려해줘야한다.
     sol) try {} finally{} 사용!

 =>예외 발생시 필터스트림의 close()를 명시적으로 호출해 줘야하는 이유가 또있다. 예를 들어 버퍼드 필터스트림을 
    사용할 경우.. 실제로 print() 작업을 해줘도 실제로 파일에 기록을 하지 않고 내부의 버퍼에 담아둔다. 이것을 최종적으로
    타겟 소스로 보내는 작업은 flush()가 담당한다. 그럼으로 close() 또는 flush()를 사용해야 한다. (외부 i/o 접근은
    너무 느리고, 위험성이 있기에 최소화 한다.)  (cf) 채팅 프로그램의 경우엔 버퍼드필터스트림의 생성자에 
    boolean autoFlush 를 true로 한다)


*******************************************************************************************

dtd: xml문서의 구조를 레벨별로 나누어 관리할수 있다
schema: xml 문서가 더 복잡한 제약을 만족할수 있게 관리한다.

dom: xml 문서 전체를 한번에 메모리로 읽어와 프로그래밍을 통해 사용할수 있게 해준다.
sax: dom과는 달리 xml문서 전체를 한번에 메모리에 올리지 않고, 이벤트 중심으로 문서를 처리할수 있게 해준다.

xsl: xml문서를 스타일시트 타입으로 구성하기 위하 언어
xslt: xml문서를 또 다른 xml문서(브라우저에 출력하기 위한 html, 핸드폰등 무선기기에 출력하기 위한 wml등)로 변환
       하는 언어로, 주어진 xml문서의 구성요소를 추출해서 재배열하는등의 조작 메커니즘을 제공한다. 
       (xslt는 xml을 조작할때 xpath라는 언어를 사용한다. element와 같은 의미인듯?)

jsp페이지를 xml문서로 작성하는 것이 가능하다. 모든 jsp페이지는 xml문서로 표현된다.

xml의 지향점은 무엇인가?
*************************************************************************************

1.xml 파일 식별 관련 (dom스타일, sax스타일)

1.1  javax.xml.validation.SchemaFactory = newInstance("W3C XML Schema 1.0" or "RELAX NG 1.0")으로 원하는
                                                        타입을 결정해 스키마 객체 팩토리로 설정된후, (스키마란 용어는 class,inst
                                                        ance중 class라 생각하면 간단함.Schema newSchema()로 스키마 객체 
                                                        생성해줌.

1.2    javax.xml.validation.Schema = validator or validatorHandler생성
     
1.3    javax.xml.validation.Validator = void validate(Source source)로 해당 소스의 유효성 검증

        1.3.1  Source의 종류는
               a.javax.xml.transform.stream.StreamSource = 말 그대로 스트림으로 받게 되는 xml 패키지
                                                                          StreamSource(소스선택)와 StreamResult(구체 작업선택)

****javax.xml.trasform.Result 의 의미를 잘못 파악햇음! 말 그대로 transform 객체를 통해 변환 작업후 결과물을 담을
타겟의 의미임! (헷갈린 이유는 어제 노트계열 스트림, 필터계열 스트림의 데코레이터 패턴에 정신이 안드로메다로 날
아가서 인듯 **** 
                                                                          클래스로 구분됨

               b.javax.xml.transform.sax.SAXSource (simple app for xml )
                                                                = 마찬가지로 SAXSource와 SAXResult 클래스 + SAXTrans
                                                                   FormerFactory 클래스로 구성됨!
                                                                => XMLReader getXMLReader() , void setXMLReader() 등을 통해
                                                                   SAX 스타일의 스트림 관리

               c.javax.xml.trasform.dom.DOMSource (document object model)=
                                (1) DOM타입(노드를 이용한 트리구조)으로 데이터를 주고 받음
                                (2) XSLT와 관계성은 무엇인지 모르겠음! (제일 하단에 기술. xslt는 도큐먼트 언어 변환기임)
                                (3) javax.xml.Transformer 객체의 
                                     transform(Source xmlSourcr, Result outputTarget)을 사용해
                                     즉 소스를 선택하고, 수행할 작업을 결정해서 transformer객체를 통해 일을 시킴.
                                            Result = DOMResult,SAXResult,StAXResult,StreamResult 등이 있음.
                                    
                                                                      
                                생성자
                                (1)디폴트 생성자의 경우 내부적으로 DocumentBuilder.
                                    newDocument()를 사용해 빈상태의 DOM오브젝트 생성
                                (2)트리구조 임으로 DomSource(Node n)으로 생성 가능

                                주요메서드
                                (1)Node getNode()
                                (2)void setNode(Node n)
 
                                 javax.xml.parsers 패키지, org.w3c.com패키지, java.io패키지를 이용해 
                           xml파일을 DOM document 형식으로 다루기 
                                (1) DocumentBuilderFactory 객체 생성
                                (2) (1)에게서 DcumentBuilder 객체 생성
                                (3) (2)빌더가 제공하는 parse() 메서드를 사용해 파일스트림(xml)에서 Document 객체를 파싱
                                              (ex) Document d = docBulider.parse(new BufferedInputStream (new FileInputStream(.xml로 생성한
                                                     File객체)))
                                (4) d.getElementsByTagName("태그명")을 통해 NodeList 형 객체(Elements의 집합)에 
                                     받아옴
                                (5) NodeList 객체를 순회하면서 item(인덱스) 메서드를 통해 포함하고 있는 Element를 
                                     받아온후,
                                     (5-1) DocumentBuilder 객체의 org.jdom2.Element build(Element e)를 이용해 xml 파일의
                                             Element객체를 Document에서 쓰는 Element 객체로 변환 (Dom 형식으로 사용)

                                (6) (5)를 통해 얻어온 Elements 로서 이런 저런 작업을 수행후, 다시 xml로 파일에 기록해주기
                                (7) DOMSource source = new DOMSource(3에서 생성한 Document객체)를 통해
                                     Document 객체를 -> 파일 스트림 소스로 변환
                                (8) Source 관련 구체적 작업(필터)을 위해서  Transform 작업후 결과를 담기(타겟=dest) 위한 
                                     StreamResult 객체 생성
                                      (ex)StreamResult result = new StreamResult(new File( 경로 + 파일명.xml));
                                
                                (9) StreamSource , StreamResult를 가지고 실제 작업을 수행할 Transformer 객체 생성이 필요
                                     그럼으로 TransformerFactoy 객체를 생성해 Transformer 객체를 생성.                                       
                                (10) 스트림소스, 스트림이 어떤 작업을 할지 결정한 StreamResult(필터)를 Transformer 객체
                                      에게 매개변수로 전달해 작업 transform() =파일에 xml로 기록 시킴 


                                org.jdom2 패키지를 사용해 xml파일 기록하기(내가 썼던 방법)
                                (1) FileOutputStream 객체 생성, FileOutputStream(".xml")
           
                                (2) XMLOutputter 객체를 생성. 

                                (3) XMLOutputter 객체의 초기화를 위해 Fomat 객체 생성
                                     (3-1) 포맷 객체에 setEncoding("UTF-8"),setLineSpeparator(),
                                             setTextMode() 등으로 출력할 파일의 포맷(속성)결정
                                     (3-2) setFormat() 을 통해 XMLOutputter 객체 초기화 

                                (4) 내가 구성했거나, 읽어왔던 Document 객체와 
                                     (1)에서 만든 파일 아웃풋 스트림 객체를 XMLOutputter 객체에
                                        게 매개변수로 전달
                               
                                (5) 아웃풋객체의 output()메서드를 이용해 도큐먼트->xml로 출력 
                                     작업을  수행


                                 또다른 방법은 무얼까? XMLEncoder 클래스, XMLDecoder 클래스 확인 필요!


               d.StAXSource = 
                                  (1) StAX 리더(XMLStreamReader, XMLEventReader)의
                                       형식의 XML Source 홀더로서 기능한다.
                                  (2) Source를 받아들이는 모든 케이스, Transformer나
                                       입력으로서 Source를 받아들이는 Validator로 사용가능.
                                  (3) 마찬가지로 Source, Result 클래스가 존재한다.
                                     
                                  생성자
                                  (1) StAXSource(XMLEventReader x)
                                  (2) StAXSource(XMLStreamReader x)

                                  주요 메서드
                                  (1)XMLEventReader getXMLEventReader()
                                  (2)XMLStreamReader getXMLStreamReader()


XSLT(Extensible Stylesheet Language Transformations)는 XML 문서를 다른 XML 문서로 변환하는데 사용하는 XML 기반 언어이다. W3C에서 제정한 표준으로 XML 변환 언어를 사용하여 XML 문서로 바꿔주며, 탐색하기 위해 XPath를 사용한다.

원본 문서는 변경되지 않으며, 원본 문서를 기반으로 새로운 문서가 생성된다.[2] 새 문서는 표준 XML 문법 또는 HTML, 일반 텍스트 형식으로 출력된다.[3] XSLT는 XML 데이터를 웹 페이지로 표시하기 위해 HTML 또는 XHTML 문서로 변환할 때 자주 사용된다. 변환은 클라이언트나 서버에서 동적으로 수행되거나, 퍼블리싱 단계에서 수행되기도 한다. XML을 PDF,PostScriptAWTPNG와 같은 다양한 형태로 바꿀 수 있는 XML-FO로 변환할 때도 사용한다. XSLT는 일반적으로 서로 다른 XML 스키마를 사용하는 XML 메시지를 변환하거나, 하나의 스키마 안에서 문서를 변경하기 위해 사용한다(예: 메시지에서 불필요한 부분 삭제).


Transformer 클래스와 동일한 역할 아닌가? XMLOutputter,Inputter 클래스도..





by givingsheart 2014. 1. 1. 15:54