Factory Mehod Pattern

JAVA 2013. 11. 14. 16:20

  • Factory Method Pattern
    • 객체를 생성하기 위한 인터페이스를 만든다. 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하도록 한다.
    • Factory Mehtod 이용하면 인스턴스를 만드는 일을 서브 클래스로 미룰 있다.

  • Abstract Factory Pattern
    • 서로 연관된, 또는 의존적인 객체들로 이루어진 제품군을 생성하기 위한 인터페이스를 제공한다. 구상 클래스는 서브클래스에 의해 만들어진다.

    • 활용성
      • 객체를 생성하거나 구성 표현되는 방식과 무관하게 시스템을 독립적으로 만들고자
      • 여러 제품들 하나를 선택해서 시스템을 설정해야 하고, 한번 구성한 제품을 다른 것으로 대체할 있을
      • 관련된 제품 객체들이 함께 사용되도록 설계되었고, 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을
      • 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출시키고 싶을
  • Factory Pattern 인스턴스 생산 (출처: http://sisterbliss.blog.me/70166527147)
    • new 클래스 생성자();
      • 이렇게 하면 해당 클래스의 Instance Create되어 메모리에 오른다.
      • 그리고 프로그래머는 스택이든 힙이든, 메모리에 올라있는 인스턴스를 참조하기 위해서 포인터를 사용한다.
      • Apple apple = new Apple();
    • Instace 생산할 new 치지 않고 Factory 사용해서 만드는 à 팩토리 패턴
      • Apple applel = AppleFactory.create();
      • Instance 생성하는 로직을 통일시킬 있음
      • 외부에선 인스턴스가 생산되고 등록되는 일련의 과정을 신경쓰지 않아도 .
      • 해당 인스턴스가 정확히 어떤 지점에서만 생상되는지 체계를 세울 있어


출처 : http://zupper.tistory.com/1282

Posted by 철냄비짱
,

The error occurred while applying a result map 

ibatis 내에서 동적쿼리를 사용하다보면 나는 에러.

     

문제점

SELECT f1, f2, f3

컬럼중에 $컬럼명$이나 다이나믹 컬럼을 사용할 경우,

동적으로 iBatis자체에서 매핑 캐쉬를 저장을 하게 되서 매핑이 안되는 에러를 뱉어냄.


해결

동적으로 변수가 변해도 최초 조회한 변수명이 캐쉬에 남아있어서 에러 발생

<select id="select_test" remapResults="true" resultClass="java.lang.String" parameterClass="java.util.Map">



Posted by 철냄비짱
,

JAVA File 읽기

JAVA 2013. 6. 26. 11:00

TEXT FILE READ

 

   BufferedReader bufferReader = new BufferedReader( new FileReader( new File (folder.toString() + "/" + strFileName ) ) );
   StringBuilder sb = new StringBuilder();
   String line;
   while ( (line = bufferReader.readLine() ) != null ) {
    sb.append( line );
   }
   bufferReader.close();

 

 

 

 

IMAGE, BINARY FILE READ

 

BufferedImage image = ImageIO.read(new File( folder.toString() + "/" + strFileName ) );
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   ImageIO.write(image, "png", baos);
   String encodedImage = Base64.encode(baos.toByteArray());

Posted by 철냄비짱
,

먼저 범주부터 나열하자면 다음과 같습니다.

List 계열
AbstractListArrayListLinkedListVector 


Map계열 
AbstractMapAttributesHashMapHashtableIdentityHashMapRenderingHintsTreeMapWeakHashMap


Set계열
AbstractSetHashSetLinkedHashSetTreeSet

 

위의 List, Map,Set은 모두 Collection이라는 넘의 자식이라고 생각하시면됩니다.

말그대로... 먼가를 수집하는 박스라는 의미이죠.

 

Collection, List, Map,Set은 모두 구현되지 않은 interface입니다. 그냥 이러이러하다고 틀만 잡아놓은거죠... 이것들을 실제로 사용할 수 있게 구현한것이 위에 적어 놓은 자식들입니다.

예를들어보자면..

List a = new Vector();  --> 다형성(부모는 여러가지 자식의 형태로 나타날 수 잇다.)의 예가됩니다.

이러한 것은 가능하지만...

List a = new List();

이렇게는 사용할 수없다는 것입니다.

 

 

 

이러한 Collection 의 자식들은 자신들만의 고유한 특징을 명확히 가지게됩니다.

List :  수집의 순서가 있으며, 동일한 데이터의 중복 입력이 가능합니다.

          순차적으로 대량의 데이터를 억세스하거나 입력할때 유리한 방식입니다.

 

Map : Key & Value의 형태로 입력이되며, 키값을 입력하면 해당하는 value값을 획득할 수있습니다. 수집의 순서를 기억하지 않으며, 동일한 데이터를 Key값으로 사용할 수 없습니다. (물론 key값이 틀리고 value값이 동일한건 가능합니다.)

다건의 데이터에서 원하는 특정 데이터에 접근(검색)할 때 유리한 방식입니다. 

 

Set : 중복데이터를 불허하는 것을 제외하고는 큰 특징이 없습니다.

      입력되는 당시의 순서에는 따르지 않으나... 순차적인 접근을 위해서는 Iterator로 접근하게됩니다.

 

그리고 각가의 구현 class들의 특징도 조금씩이나마 차이가 발생합니다.

음.. 예만 들어보자면... 같은 Map 계열임에도 불구하고.. HashMap은 데이터 입출력이 동기화되지 않고 처리속도가 빠른 반면  HashTable은 모든 입출력이 동기화(토근을 부여받아 순차적으로 객체에 접근)되며 처리속도는 다소 떨어지게됩니다.

 

그외 List계열의 Vector와 ArrayList도 Vector가 synchronized(동기화) 되는 반면 ArrayList는 그렇지 않다는 정도입니다.(물론 특정상황에서는 이것이 매우 중요한 문제가 될 수 있습니다.)





 출처 : http://blog.naver.com/atonikkaz?Redirect=Log&logNo=10017976539

Posted by 철냄비짱
,

============================= 발췌 부분 시작 ======================================
JSP 2.0의 el( ${} )과 jstl(c, fmt, fn)을 쓰다보면 이렇게 편할수 있구나 하고 느꼇는데...
뭔가 부족한게 있어서 fn관련 Soruce를 보게 되었는데..
헉.... fn.tld를 보면 <function>이라는 tag에 class명과 호출 방식으로 선언되어 있고
Classs를 보면 일반 Static function을 바로 불러 쓰고 있었습니다.
다음은 fn.tld의 예 인데.. 너무 단순하지요...
taglib를 만든 다기 보다는 taglib에 기존 Class 함수를 정의만 해두면 되니까요.
예제
------------------- [mi-html-util.tld]----------------
<function>
<description>
New line to br tag
</description>
<name>nl2br</name>
<function-class>
javacross.util.HTMLUtil
</function-class>
<function-signature>
java.lang.String nl2br(java.lang.String)
</function-signature>
<example>
${mhtml:nl2br(String txt)}
</example>
</function>
---------------- HTMLUtil.java --------------
package javacross.util;
public class HTMLUtil {
static final RE reg_NL = new RE("(\015\012)|(\015)|(\012)");
public static String nl2br(String txt){
if (txt == null) {
return null;
} else {
return reg_NL.subst(txt,"<br />" );
}
}
public static String null2nbsp(String txt){
if (txt == null) {
return "&nbsp;";
} else {
return txt;
}
}
}
------------------- test.jsp ----------------------
<%@ page language="java" contentType="text/html; charset=MS949" %>
<%@ taglib prefix="mhtml" uri="/WEB-INF/tld/mi-html-util.tld" %>
<table>
<tr>
<th>테스트 해보기</th>
</tr>
<tr>
<td>${mhtml:nl2br(course.first_remark)}</td>
</tr>
</table>
============================= 발췌 부분 끝 ========================================

출처 : http://haruma95.blog.me/80009565986
Posted by 철냄비짱
,

자바 자료구조

JAVA 2009. 7. 15. 11:00

* String

   String[] tokens = string.split(",") ;

 

* Collection

   Collection.sort(List list)  - 리스트에 있는 내용을 알파벳순으로 정렬.

   단 list에 있는 item이 Comparable이 구현되어 있어야 합니다. 즉 목록에 있는 원소의 compareTo() 메소드에 의해 순서가 정렬됨. 

      class ExamItem implements Comparable<ExamItem> {

         ...

         public int compareTo(ExamItem s) {

            /* 리턴값 : 음수 - 인자로 전달된 값이 더 크다, 양수 - 인자로 전달된 값이 더 작다. */

         }     

      }

   Collection.sort(List o, Comparator c) - Comparator의 compare() 메소드을 호출하여 정렬

 

* ArrayList

   ArrayList<String> list = new ArrayList<String> () ;

   System.out.println(list) ;

   ** 참고: System.out.println(aObject or aList) :

       리스트(객체)에 있는 toString()메소드을 호출, 기본적으로 제공되는 유일 식별자 코드 말고

       다른 걸 출력하고 싶다면 이 메소드를 오버라이드 합니다.

   ** 메소드를 선언할 때 인자유형을 ArrayList<Animal>로 선언하면  Animal의 하위 클래스로 된 ArrayList<Dog>나 ArrayList<Cat>은 인자로 받지 못합니다.

   ** 위의 문제점을 해결하기 위해서는 와일드카드을 사용합니다.

       public void takeAnimal(ArrayList<? extends Animal> animal) {...} 또는

       public <T extends Animal>void takeAnimal(ArrayList<T> animal)

       단 선언할 때 <?>와일드카드를 사용하면 컴파일러에서 목록에 뭔가를 추가하는 작업을 전혀 허가하지 않게 됩니다.

 

* TreeSet

   원소들을 정렬된 상태로 유지(알파벳순서대로 정렬)하며 원소가 중복되어 들어가지 않게 해줍니다. TreeSet을 사용하려면 아래의 두가지 조건 중 하나는 만족하여야 합니다.

   ** 집합에 들어가는 원소가 Comparable을 구현하는 유형이어야 합니다.

   ** Comparator를 인자로 받아들이는 TreeSet의 오버로드된 생성자를 사용합니다.

       public class BookCompare implements Comparator<Book> {

          public int compare(Book one, Book two) { return ( ...) } ;  

       }

       class Test {

          Bookcompare bCompare = new BookCompare() ;

          TreeSet<Book> tree = new TreeSet<Book>(bCompare) ;

          ...

      }

* HaspMap

   원소들을 이름/값 쌍 형식으로 저장하고 접근할 수 있게 해줍니다.

 

* LinkedList

   컬렉션 중간에서 원소를 추가하거나 삭제하는 작업을 더 빠르게 처리할 수 있게 해줍니다.

 

* HashSet

   컬렉션 중복된 원소가 들어가지 않도록 해주고, 컬렉션 내에서 어떤 원소를 빠르게 찾을 수 있게 해줍니다.

 

* LinkedHaspMap  

   일반 HaspMap과 거의 똑같지만 원소(이름/값 쌍)가 삽입된 순서를 그대로 유지시켜줄 수도 있고, 원소의 마지막으로 접근했던 순서를 기억하도록 설정할 수 있다는 점이 다릅니다.

     

[출처] 자바 자료구조.|작성자 좋은일


Posted by 철냄비짱
,

기본형/참조형 변수, 각종 기초문법(if, for, while, switch 등), 배열, 상속, 오버라이딩, 오버로딩, 인터페이스, 추상클래스 등 정도 학습을 하게 되면 어느정도 자바 프로그래밍에 대한 평가를 받아봐야 합니다.

프로그래밍의 감각 내지는 이해도 공부 정도를 평가해야 할 때 입니다. 쉽게 말해 기초 내공이겠지요.

그 것중에 가장 대표적으로 좋은 평가 예제가 Iterator 패턴 입니다. 자바에서는 많은 패턴이 존재하지만 그 중에서도 Iterator이 가장 쉬우면서도 기초 평가에는 아주 제격이죠.

아마 많은 자바 프로그래밍 교재에서도 Iterator 패턴은 적어도 한 줄 이상은 언급을 할 것이라고 생각합니다. 저 역시 자바를 처음 접하면서 Iterator을 해봤죠..(시험 시간에 멍 때린 기억이...)

그럼 이제 본론으로 들어가봅시다.

일단 Iterator 패턴을 프로그래밍 하기 전에 간단한 UML을 알아보고 진행하도록 합시다.
블로그를 통해서 UML에 관한 글을 별도로 준비하지 않은 이유는 지식이 너무도 부족해서 입니다. 그래도 간단한 설계도를 그려 보면 코딩하는 과정은 복잡해지지 않고 클래스 간의 연관성을 쉽게 파악할 수 있는 장점이 생깁니다.

가장 먼저 상속의 관계를 그려 봅시다.

A클래스를 B클래스가 상속한다.(추상 클래스도 상관은 없습니다.)
A와 B의 관계는 상속 관계입니다. B가 A를 상속할 때는 화살표 모양이 삼각형으로 하면 됩니다.
인터페이스간의 상속도 이와 같이 하면 됩니다.
class A {
        ......
}
class B extends A{
        ......
}


인터페이스를 구현하는 그림

상속과는 비슷하지만 구현 관계는 점선으로 표시 합니다.
B클래스가 A 인터페이스를 구현.

interface A {
        ......
}
class B implements A {
        ......
}


집약 그림

class A {
        ......
}
class B {
        private A a;
        ......
}
집약 관계는 B 클래스에서 A 클래스의 객체를 맴버로 갖고 있는 경우를 말합니다. 말 그대로 객체를 갖고 있는 경우를 집약이라고 하는 것 입니다. 표현은 갖고 있는 쪽이 마름모, 대상이 화살표 입니다.

클래스의 관계 그림

B 클래스는 A 클래스를 사용한다라고 해서 "◀ User" 라고 표시 합니다. 이 외에도 생성하는 관계라면 "◀ Creates", 통지(아마 값을 전달하는 관계를 말하는 것 같음) "◀ Notifies" 단어를 이용해서 표시 하면 됩니다. 솔직히 말씀 드리면 이 부분에 대해서는 저도 사용을 어떤식으로 해야 하는지 자세히 모르기 때문에 설명을 분명히 못하겠습니다.

 

 

그 외에도 맴버변수, 생성자, 메소드 등에 대한 표기법과 클래스, 추상클래스, 인터페이스 표기법, 접근제어자에 따른 표기법이 존재합니다. 일단 지금은 UML을 자세히 알기 위한 글이 아니니 이 부분은 따로 준비를 해서 알려드리도록 하겠습니다.

그럼 이제 위에서 잠시 소개 했던 UML은 다음의 Iterator 예제 문제를 제시 한 뒤에 설계를 위해 이용하도록 합시다.

인수에 대한 언급이 없으면 인수는 없도록 한다, 모든 메소드는 public 사용, 맴버변수는 private 사용을 하도록 한다.

1. Iterator 인터페이스
반환형이 boolean형인 메소드 hasNext를 보유, 반환형이 Object형인 메소드 next를 보유

2. Aggregate 인터페이스
반환형이 Iterator형인 메소드 iterator를 보유

3. Book 클래스
책이름을 저장하는 맴버변수 name를 보유, 문자열을 인수로 받아 name에 책이름을 저장하는 생성자를 보유,
책이름을 반환하는 메소드 getName을 보유.

4. BookShelf 클래스
Aggregate 인터페이스를 구현, Book형 배열 books[]와 int형 변수 last를 맴버변수로 보유(last는 선언과 동시에 0으로 초기화 할 것), 배열 books의 크기를 지정하는 값을 인수로 받아서 books의 크기를 설정하는 생성자를 보유, 인수 int index를 이용해서 books[]의 지정된 위치의 객체를 반환하는 메소드 GetBookAt를 보유, Book 객체를 인수로 받아 books[last] 위치에 전달 받은 객체를 저장하고 last를 1 증가시키는 appendBook 메소드를 보유, last를 반환하는 getLength 메소드를 보유, BookShelfIterator 객체를 생성하여(인수는 this를 사용한다.) 반환하도록 iterator 메소드를 오버라이딩 한다.

5. BookShelfIterator 클래스
Iterator 인터페이스를 구현, BookShelf 형 객체 bookshelf와 int형 index를 맴버변수로 보유, BookShelf형 객체를 인수로 받아 bookshelf에 대입하고 index를 0으로 초기화 하는 생성자를 보유, bookshelf에서 index의 위치에 가져올 객체가 존재하는지에 따라 true/false를 반환하도록 hasNext 메소드를 오버라이딩 한다. bookshelf에서 index의 위치의 객체를 가져온 뒤 index를 1증가 시키고 가져온 객체는 반환하도록 next 메소드를 오버라이딩 한다.

6. Main 클래스
BookShelf형 객체를 만들어 Book 객체 3개를 BookShelf 객체에 저장한다.(책은 국어책, 수학책, 영어책으로 한다.) 이 후 Iterator 객체에 BookShelf의 객체를 대입한 뒤 while문과 hasNext메소드, next메소드 등을 이용해서 화면에 출력한다.

실행 화면


생각보다 복잡하고 어려울 수 있습니다. 그러나 좀 전에 이야기 한 것 처럼 UML을 이용하면 생각보다 어렵지 않다는 것을 알 수 있습니다. 그리고 문제를 이해하는 것 또한 중요합니다. 문제 전체를 이해 하려 하지 말고 각 문제당 제시한 조건을 개별적으로 이해한 뒤에 조합을 해보면 쉽게 프로그래밍 할 수 있습니다.

단순하게 클래스다이어그램을 그려 보면(UML을 이용해서 그런 것을 말함)

메소드와 인터페이스 등의 특징을 표시 하지 않고 아주 간략하게 그린 것 입니다.(틀렸을지도 ~) UML에 대한 지식이 부족하므로 일단은 자신이 알아볼수 있도록 그리는 것이 중요할 것 입니다. (메인은 제외 시켰음)

그럼 이 것만으로 프로그래밍 하기에는 어려운 점도 있을 것이니 약간의 힌트를 알려드리겠습니다.

1, 2, 3번은 문제에서 제시한 그대로를 코딩으로 옴기면 됩니다.

3번의 경우 약간 주의해야 할 것은 문자열이라는 것과 반환형입니다.

4번 부터 슬슬 난이도가 있네요. 오버라이딩이라는 것은 구현 또는 상속 관계에서 반드시 해야 하는 것입니다. 부담 갖지 마세요.

배열을 선언하는 것과 그 크기를 지정하는 것은 다릅니다.
선언과 동시에 초기화 한다는 것은 변수를 선언하면서 값을 지정한다는 것입니다.

인수라는 것은 메소드 뒤에 오는 소괄호 안에 들어가는 매개변수(인수와 같은 의미)를 말합니다.
인수는 값을 전달받기 위해서 사용됩니다. 반환한다는 것은 return문을 사용해야 한다는 것을 말합니다.

반환에 대한 언급이 없으면 반환형은 void 입니다.
변수값을 반환 할 때는 반환형과 변수의 유형에 주의해야 합니다.

인수를 this로 한다는 것은 자신을 가리키는 것입니다.(여기서 this의 의미는 객체입니다.)
생성자에도 소괄호가 존재하고 이 곳은 매개변수(인수) 라고 하며 값을 전달하는데 사용합니다.

객체를 인수로 전달 받는다는 것은 어떤 형태로 전달 받을 것인가를 말합니다.(인수의 형태)

return문은 어디에 위치하느냐에 따라 한 메소드에서 여러번 사용할 수 있습니다.

반환형과 반환될 객체가 다른 경우에 둘 사이에 관계가 어떤 관계인가를 살피도록 합시다.

형변환/캐스팅을 알고 있어야 합니다.

Main 클래스에서는 Vector 클래스 사용법을 알고 있으면 쉽게 구성할 수 있습니다.

이 정도면 충분할 것 같습니다. 프로그램이 완성된 소스는 Java 예제 소스 카테고리에 있습니다.

본인 실력으로 풀어보시는 것이 중요합니다. 이 문제를 풀 수 있느냐 없느냐에 따라 자신의 기초 실력과 객체지향 프로그래밍 개념에 대한 이해도가 나타나기 때문입니다.
Posted by 철냄비짱
,

Microsoft Ajax - http://ajax.asp.net

 

Java BluePrints - https://blueprints.dev.java.net/

 

Protptype - http://www.prototypejs.org/

 

Scriptaculus - http://script.aculo.us/

 

Laszlo - http://www.openlaszlo.org/

 

GWT - http://code.google.com/webtoolkit/

 

AJAX.net - http://www.ajaxpro.info/

 

Yahoo - http://developer.yahoo.com/yui/

 

Active Widgets - http://www.activewidgets.com/

 

Tibco General Interface - http://developer.tibco.com/

 

Visual Web GUI - http://www.visualwebgui.com/

 

Dojo - http://dojotoolkit.org/

 

Backbase - http://www.backbase.com/

 

SmartClient - http://www.smartclient.com/

 

Nitobi - http://www.nitobi.com/

 

JackBe - http://www.jackbe.com

 

Zimbra - http://www.zimbra.com/

 

Rico - http://www.openrico.org/

 

Spry - http://labs.adobe.com/technologies/spry/

 

Aflax - http://www.aflax.org/

 

DWR - http://getahead.org/dwr

 

Moo.fx - http://moofx.mad4milk.net/

 

Mochikit - http://www.mochikit.com/

 

Xajax - http://www.xajaxproject.org/

 


Nexaweb - http://www.nexaweb.com





1. Cross-browser 라이브러리

 

x library (www.cross-browser.com)

베테랑 DHTML 라이브러리, 다양한 브라우저에서 동작하는 애니매이션, 스타일링, 이벤트, 기타의 공통 기능을 제공한다. 

 

Sarissa (http://sarissa.sf.net)

브라우저에 독립적으로 XML을 다루는  방법을 제공하는 자바스크립트 API

브라우저에 상관없이 자바스크립트 객체를 XML로 직렬화하는 기능, XSLT, XPath 쿼리 기능등의 다양한 XML 기술들을 지원한다.

 

Prototype  (http://prototype.conio.net/)

자바스크립 프로그래밍을 위한 범용의 헬퍼 라이브러리. 자바스크립트를 Object Oriented Programming 스타일로 작성위한 확장을 제공한다. 또한 견고한 Ajax 라이브러리를 포함한다.프로토타입은 Ruby on Rails, Rico, Scriptaculous 등에서 자바스크립트 엔진으로 사용된다.

 

2. 위젯 & 위젯 슈트

 

Scriptaculous (http://script.aculo.us)

다양한 시각효과(visual effect)를 지원하는 자바스크립트 라이브러리. 기본적으로 프로토타입을 사용하며 문서화가 잘 되어있다. 데모와 샘플애플리케이션, 드래그&드럽 라이브러리등을 지원한다.

 

Rico (http://openrico.org)

AJAX를 지원하는 다목적 프레임워크. 애니매이션, MVC의 분리, 드래그&드롭, 데이터그리드, 그외에 다양한 위젯등을 지원한다. 프로토타입 상에서 구현됨.

 

3. 애플리케이션 프레임워크

 

DWR, JSON-RPC, and SAJAX

다른 언어를 사용하지만, 이들은 모두 자바스크립트 코드로 부터 곧바로 서버측 함수(자바, 파이썬, 루비, 펄...)를 호출할 수 있는 방법을 지원한다.

 

DWR : http://www.getahead.ltd.uk/dwr/

JSON RPC : www.json-rpc.org/

SAJAX : www.modernmethod.com/sajax

 

Backbase (http://www.backbase.com/)

서버에서 생성된 HTML 문서안에 포함된 XML 태그를 실시간으로 리치위젯으로 바인딩할 수 있는 기능을 제공하는 browser-side 프레임웍이 되겠다. RICO가 표준 HTML 태그를 사용하는 반해, BackBase는 커스텀 XHTML 태그를 사용하여 UI 컴포넌트를 생성하는 것을 제외하고는 기본적인 원리는 RiCO의  behavior 컴포넌트와 비슷하다.

 

Echo2 (www.nextapp.com/products/echo2)

서버에 선언된 유저 인터페이스 모델로 부터 리치 UI 컴포넌트를 생성해주는 프레임워크.  Echo2는 순수 자바만으로 AJAX 애플리케이션을 만들 수 있다.

 

Ruby on Rails (www.rubyonrails.org)

루비 프로그래밍 언어로 쓰여진 웹 개발 프레임워크. 기본적으로 서버측 객체를 데이터베이스로  바로 매핑하는 기능, 테플릿을 사용해서 콘텐츠를 프리젠테이션하는 기능등을 제공한다. 최근버전에서는 프로토타입 라이브러리를 통해 ajax 강력 지원한다.

[출처] Ajax 구현 라이브러리 모음|작성자 잘난돌이

Posted by 철냄비짱
,

커스텀태그

JAVA 2009. 5. 19. 18:59

커스텀 태그란?

1. JSP 페이지에 재사용 가능한 코드를 조립하는 방법
2. 자바처리에 접근하는 것으로 끝나는 XML 형태
3. 확장된 자바빈즈, 이것은 JSP 페이지 안에서 그것을 사용하기 위해 간단한 인터페이스를 가진다.
4. 자바 프로그래머와 웹 디자이너가 서로 비즈니스를 행하기 위해 만나는 교차점

커스텀 태그의 장점

1. JSP사이트를 유지보수하기 쉽게 한다.
2. 이식성이 있다.
3. JSP를 확장한다.
4. 웹개발속도를 높인다.

커스텀 태그의 단점

1. 태그 라이브러리에서 재사용성을 달성하려면 웹 애플리케이션에 여분의 계층이 추가되어야 한다.
웹 애플리케이션 설계시 성능저하를 고려해야 한다.
2. 오직 JSP만을 위한것이다.
서블릿이나 다른 자바 기반솔루션으로 이동하지 못한다.
3. 과다사용의 우려
JSP프로젝트의 80%는 커스텀 태그에 기초, 20% 스크립틀릿에 기초

커스텀 태그 사용하기

1. 태그 라이브러리 가져오기

URI : 태그라이브러리를 식별하는 유일한 이름이다. 종종 URL형태이다.
이 이름은 JSP 컨테이너 초기파일(web.xml)에서 미리 정의된다.
PREFIX : JSP 컨테이너가 이 태그 라이브러리로부터 얻어지는 페이지에서 접두어 태그가 무엇인지 알려준다.
이름에 할당되는 규칙은 없다.

2. 태그라이브러리로부터 커스텀 태그 호출하기

<JAXP:trans>

커스텀 태그 만들기

1. 자바 객체를 생성한다.

페이지에 보낼 자바빈즈를 만드는 과정이다.

package com.jspinsider.jspkit.javascript;

public class JavaScriptExample extends java.lang.Object implements java.io.Serializable
{

public JavaScriptExample()
{
}

private String start_script ="<script language=\"JavaScript\">";
private String end_script ="</script>";

public String alert(Object aobj_data)
{
return( start_script + " alert(\"" + aobj_data.toString() + "\");" + end_script);
}
}

2. 태그 핸들러를 만든다.

태그가 실행하는 코드를 갖는다. 모든 실용적인 목적을 위해 실제 커스텀 태스를 생성하는 단계이다.
태그 핸들러가 되기 위해서는, 객체는 Tag, IterrationTag, BodyTag를 구현할 필요가 있다.
논리적인 관점에서 태그 핸들러를 만드는 것은 자바빈을 만드는 것과는 조금 다르다.
자바빈을 만들때는 공통적인 기능을 전부 모아서 만든다. 그러나 태그핸들러는 자바빈보다는 좀더 초점이 모아져 있고, 하나의 태그를 지원한다는 단일한 목적은 가진다.

package com.jspinsider.jspkit.javascript;

import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class JavaScriptExampleTag extends BodyTagSupport //태그에 몸체에 포함된 데이터를 읽기 위해 BodyTagSupport 사용
{
public int doEndTag() throws JspTagException
{
String ls_alert = "";

try
{
BodyContent lbc_bodycurrent = getBodyContent();

if(lbc_bodycurrent != null)
{
String ls_message = lbc_bodycurrent.getString();
JavaScriptExample JS = new JavaScriptExample();
ls_alert = JS.alert(ls_message.trim());
}
pageContext.getOut().write(ls_alert); //JSP 페이지의 출력 스트림 조작을 위해 사용
}

catch (IOException e)
{
throw new JspTagException("Error" + e.toString());
}
return EVAL_PAGE;
}
}

3. 태그 엑스트라인포클래스 만든다(선택사항)

TEI 클래스 또한 태그 핸들러로서 헬퍼 클래스를참조한다.

4. 태그 라이브러리 기술자 만든다

태그 라이브러리 기술자(TLD)는 커스텀 태그를 기술하고 정의하는 XML기반의 파일이다.
JSP컨테이너에게 각 태그 핸들러를 찾고 사용할 수 있는 곳을 알려주는 인덱스 파일이다.
파일명은 반드시 .tld 확장자로 저장되어야 한다.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>JavaScriptExampleTag</shortname>
<uri> http://www.jspinsider.com/jspkit/javascript </uri>
<info>A simple tag library for making a JavaScript alert </info>

<tag> //커스텀 태그가 필요한 만큼 <tag> 생성해준다.
<name>message</name>
<tagclass>com.jspinsider.jspkit.javascript.JavaScriptExampleTag</tagclass>
<info> Display Alert Box</info>
</tag>
</taglib>

5. JSP 컨테이너에 태그 라이브러리의 위치 알려주기

1) taglib선언이 JSP 페이지에 사용될때 TLD 파일 고유의 경로를 제공

<%@ taglib uri="/my_tag.tld" prefix="JavaScript"%>

2) 태그 라이브러리를 JAR파일로 묶는다.

<%@ taglib uri="/my_tag.jar" prefix="JavaScript"%>

3) web.xml 파일을 편집

<taglib>
<taglib-uri>
http://www.jspinsider.com/jspkit/javascript
</taglib-uri>
<taglib-location>
/WEB-INF/JavaScriptExampleTag.tld
</taglib-location>
</taglib>

6. JSP 페이지 만들기

<%@ taglib uri="http://www.jspinsider.com/jspkit/javascript" prefix="JavaScript"%>
<html>
<head>
</head>
<body>

<p>This is a simple test page</p>

<JavaScript:message >
This is a simple java alert message
</JavaScript:message>

</body>
</html>

태그 인터페이스

필드 설명
EVAL_BODY_INCLUDE 서버에게 몸체 내용을 평가하고 그것을 출력스트림에 넣으라는 태그
SKIP_BODY 서버에게 명확하게 몸체 내용을 하나도 처리하지 말라고 알린다. doStringTag()에 의해 반환
EVAL_PAGE 서버에게 페이지의 평가를 계속한다.
SKIP_PAGE 서버에게 페이지 나머지 부분을 처리하지 말라고 알린다.
메소드 설명
doStartTag 태그 핸들러가 이 핸들러 인스턴스에 대한 시작 태그를 만날 때, 서버는 모든 태그 핸들어에 대해서 이 메소드 호출
doEndTag 태그 핸들러가 이 핸들러 인스턴스에 대한 닫기 태그를 만날 때, 서버는 모든 태그 핸들러에 대해서 이 메소드를 호출

문서에 대하여

Posted by 철냄비짱
,

http://openframework.or.kr/framework_reference/spring/ver2.x/html/index.html
스프링의 관한 내용의 책 한권 분량이 들어있다.

http://openframework.or.kr/
이 사이트 컨텐츠의 한 부분인것 같은데... 자세한 건 아직 보지 않음...
Posted by 철냄비짱
,