Taglib

Struts Framework 는 몇몇 종류의 태그들을 포함하고 있으며 이 Tag Library 기능을 이용하면 프리젠테이션 계층을 더 쉽게 제어할 수 있고 재사용이 용이하다. 제공하는 Tag library를 사용하여 JSP 페이지에서 자바 코드를 일체 사용하지 않고도 개발이 가능하다.
Tag library

Taglib의 특징

Tag library의 필요성

  • GUI 제작시 재사용을 통해 생산성 향상
  • scripting 요소의 제거로 개발자와 디자이너간 역할 분담에 도움을 줌
  • 전체 업무 영역에서 많이 사용되는 공통 기능을 커스텀 태그로 구현하면 생산성 향상에 도움이 될 수 있음

Tag library의 구성요소

  • Tag Handler : Tag 가 어떤 식으로 동작하는지 정의하는 클래스, javax.servlet.jsp.tagext.Tag 인터페이스를 구현한 javax.servlet.jsp.tagext.TagSupport 나 BodyTagSupport를 상속(extends)하여 구현함
  • Tag Library Descriptor (TLD) : Tag Handler 클래스로 구현한 Custom Tag 들에 대한 XML 형식의 기술문서
  • taglib 지시자 (JSP 페이지 내에서) : JSP 페이지에서 해당 Tag Library를 사용하기 위한 지시자

Tag library의 종류

  • Struts Tag Library : HTML, Logic, Bean, Nested
  • JSTL : core, fmt, xml, sql
  • Jakarata taglibs
  • 해당 프로젝트에 맞게 작성한 Custom Tag Library

Struts Taglib

Struts Tag library의 종류는 아래와 같다.
  • HTML tag : HTML 입력 폼을 작성하거나 HTML 기반 사용자 인터페이스를 작성하는데 일반적으로 쓰이는 태그
  • Logic tag : 조건 처리, Collection 객체를 loop을 돌면서 출력, 흐름 제어 등에 쓰이는 태그
  • Bean tag : 자바 빈과 관련 프로퍼티들에 접근하는 데 이용되는 태그. 변수의 기술을 통해 쉽게 접근할 수 있는 새 빈을 정의할 수 있음
  • Template tag : layout를 공유하는 동적인 JSP 템플릿을 작성할 때 유용하게 쓸 수 있는 태그
  • Nested tag : Struts 태그들을 중첩해서 사용할 수 있게 해줌
사용법은 다른 Tag Library와 같다. 아래는 JSP에 taglib 선언한 예이다.
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>

많은 경우 Tag Library 들은 자바빈즈와 함께 사용된다. 자바 빈은 HTML 폼의 입력 필드에 대응하는 프로퍼티들을 포함하는 ActionForm일 수도 있지만 Value Object들도 사용할 수 있다.

HTML

다음은 HTML Tag Library의 태그들에 대한 설명이다.
name Description
base HTML의 <base>를 표시한다.
button button 입력 필드를 표시한다.
cancel cancel 버튼을 표시한다.
checkbox checkbox 입력필드를 표시한다.
errors 모든 일련의 에러 메시지를 조건적으로 표시한다.
file file 선택 입력 필드를 표시한다.
form HTML <form>을 정의한다.
frame HTML의 <frame>을 정의한다.
hidden hidden 필드를 표시한다.
html HTML의 <html>을 표시한다.
img HTML의 <img>를 표시한다.
javascript validator 플러그 인이 로딩한 validation-rule에 기반한 javascript를 표시한다.
link HTML의 앵커나 하이퍼링크를 표시한다.
messages 모여진 일련의 메시지들을 조건적으로 표시한다.
multibox 멀티플 checkbox 입력 필드를 표시한다.
option select의 option을 표시한다.
options select의 option들의 집합을 표시한다.
optionsCollection select의 option들의 집합을 표시한다.
password password 입력필드를 표시한다.
radio radio 버튼 입력 필드를 표시한다.
reset reset 버튼 입력 필드를 표시한다.
rewrite URI를 표시한다.
select <select>를 표시한다.
submit submit 버튼을 표시한다.
text "text" 타입의 입력 필드를 표시한다.
textarea textarea 입력 필드를 표시한다

다음은 HTML 의 link, password 태그의 예이다.
<tr>
    <td colspan="4" align="center">
      <html:link page="/html-link.do?doubleProperty=321.321&amp;longProperty=321321">
        Double and long via hard coded changes
      </html:link>
    </td>
</tr>
<html:password  property="password" size="15" maxlength="16" redisplay="false" />

Logic

다음은 Logic Tag Library의 태그들에 대한 설명이다.
empty 요청한 변수가 null 또는 빈 문자열인 경우 이 태그의 바디 컨텐츠를 수행한다.
equal 요청한 변수가 지정한 값과 같을 경우 이 태그의 바디 컨텐츠를 수행한다.
forward ActionForward 엔트리를 통해 지정한 페이지로 포워드를 수행한다.
greaterEqual 요청한 변수가 지정한 값보다 크거나 동일한 경우 이 태그의 바디 컨텐츠를 수행한다.
greaterThan 요청한 변수가 지정한 값보다 큰 경우…
iterate 지정한 컬렉션으로 이 태그 내의 바디 컨텐츠를 반복한다
lessEqual 요청한 변수가 지정한 값보다 작거나 동일한 경우
lessThan 요청한 변수가 지정한 값보다 작을 경우
match 지정한 값이 요청한 변수의 부분 문자열에 일치하는 경우
messagesNotPresent 지정한 메시지가 이 요청에 없는 경우
messagesPresent 지정한 메시지가 이 요청에 있는 경우
notEmpty 요청한 변수가 null도, 빈 문자열도 아닌 경우
notEqual 요청한 변수가 지정한 값과 동일하지 않은 경우
notMatch 지정한 값이 요청한 변수의 부분 문자열에 일치하지 않는 경우 이 태그의 바디 컨텐츠를 수행한다.
notPresent 지정한 값이 이 Request에 없는 경우
present 지정한 값이 이 Request에 있는 경우
redirect HTTP Redirect를 표시한다.

다음은 notEmpty, iterate 태그의 예이다.
<logic:notEmpty name="userSummary" property="addresses">
<!—이 부분은 address Collection 의 모든 객체들을 돌며 반복 출력하는 logic 태그로 구성하면 됨 -->
</logic:notEmpty>
<logic:iterate id="address" name="usersSummary" property="addresses">
<!—address 객체를 테이블 형태로 출력한다. -->
</logic:iterate>

Bean

다음은 Bean Tag Library의 태그들에 대한 설명이다.
cookie 지정한 요청 쿠키의 값에 근거해 변수를 정의한다
define 지정한 빈 프로퍼티의 값에 근거해 변수를 정의한다
header 지정한 요청 헤더의 값에 근거해 변수를 정의한다
include 동적인 어플리케이션 요청의 응답을 로드해 빈으로 이용할 수 있도록 한다
message 응답이 되는 국제화된 메시지 문자열을 표시한다
page 지정한 아이템을 빈으로써 페이지 문맥에서 꺼낸다
parameter 지정한 요청 파라미터의 값에 근거해 변수를 정의한다
resource 웹 어플리케이션의 자원을 로드 해 빈으로 이용할 수 있도록 한다
size Collection 또는 Map의 요소의 갯수를 포함한 빈을 정의한다.
struts 지정한 Struts 내부 설정 객체를 빈으로 꺼낸다.
write 지정한 빈 프로퍼티의 값을 표시한다.

다음은 message, write 태그의 예이다.
<td><bean:message key="global.user.firstName"/>:</td>
위와 같이 사용하면 global.user.firstName 에 해당하는 메시지를 가져와 보여준다.
<td>Hello <bean:write name="user" property="firstName"/>:</td>
위와 같이 사용하면 user 라는 빈에서 firstName을 꺼내 Hello 옆에 붙여준다.
Nested
한 태그를 다른 태그에 중첩하여 사용하고자 할 경우 적용할 수 있다. Struts에서 지원하는 현재 태그와 매칭되는 HTML Nested Tag, Logic Nested Tag, Bean Nested Tag가 존재하며 사용 방법은 원래 태그와 같다.

JSP Standard Tag Library

  • JSR52, JSP Standard Tag Library 스펙
  • 어떤 컨테이너에서도 사용 가능한 표준 태그 집합을 정의
  • core, fmt, xml, sql 태그가 있음
  • Servlet 2.3, JSP 1.2 이상을 지원하는 컨테이너 필요(Tomcat 을 비롯하여 대부분 지원함)
JSTL은 데이터의 포맷, 반복 처리, 조건 처리 등 전형적인 프리젠테이션 레이어를 위한 표준 구현을 제공하기 때문에, JSP 작성자들이 어플리케이션 개발에 집중하는데 도움이 되며 일반적인 기능을 커스텀 태그 라이브러리의 표준 세트로 패키징했기 때문에 JSP 작성자들이 스크립팅 엘리먼트에 대한 필요를 줄이고 관련된 관리 비용을 피할 수 있도록 한다. 이에 반해 pure 자바 코드에 비해 시스템 리소스를 많이 사용하며 극한 부하 상황에서는 2~3배의 성능 저하가 발생할 수 있으므로 성능이 이슈가 되는 경우 사용에 유의하도록 한다.
Struts Bean, Logic 태그들은 JSTL로 바꾸어 더 쉽게 사용할 수 있다. 다음은 JSTL Core 태그 중 조건 분기 및 Collection loop 처리의 예이다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
..

<!-- 테이블의 리스트 반복부  -->
<c:choose>                                      	
   <c:when test="${page.totalCount <= 0}">
      <tr class="ct_list_pop">
         <td colspan="11" align="center">::: 조회된 사용자 정보가 없습니다. :::</td>	
      </tr>
      <tr>
         <td colspan="11" bgcolor="D6D7D6" height="1"></td>
      </tr>
   </c:when>
   <c:otherwise>
      <c:forEach var="userVO" items="${page.list}" varStatus="status">
         <tr class="ct_list_pop">
            <td align="center">
               <c:out value="${status.count + ((page.currentPage - 1) * pageSize) }"/>
            </td>
            <td></td>
            <td align="left">
               <a href="javascript:fncGetUser('<c:out value="${userVO.userId}"/>');">
                  <c:out value="${userVO.userId}"/>
               </a>
            </td>
            <td></td>
            <td align="left"><c:out value="${userVO.userName}"/></td>
            <td></td>
            <td align="center" style="padding-right:3px;"><c:out value="${userVO.ssn}"/></td>
            <td></td>
            <td align="center"><c:out value="${userVO.cellPhone}"/></td>
            <td></td>
            <td align="left"><c:out value="${userVO.email}"/></td>		
         </tr>
         <tr>
            <td colspan="11" bgcolor="D6D7D6" height="1"></td>
         </tr>
      </c:forEach>
   </c:otherwise>
</c:choose>
..

기타 Taglib

Jakarata taglibs

JSP Standard Tag Library (JSTL) 의 구현인 Standard Taglib 1.1(JSTL 1.1 - Servlet 2.4, JSP 2.0 이상)을 비롯한 많은 태그 라이브러리들을 활용할 수 있다.

Custom Tags

  • Tag interface를 구현한 클래스를 만들고 XML 형식의 tag library descriptor (TLD) 파일을 제공해야 함
  • 보통 관련된 Custom Tag의 묶음인 Tag Library 형태로 제공됨
  • 전체 업무 영역에서 많이 사용되는 공통 기능을 커스텀 태그로 직접 구현
예를 들면 코드 테이블로부터 코드리스트를 조회하여 select box 형식으로 표출하는 Custom Tag 를 적용하면 전체 업무의 생산성 향상에 도움이 될 것이다. Anyframe Web에서 제공하는 pagenavigator 태그도 다중 행의 리스트성 자료의 페이지 처리 기능을 돕기 위해 직접 구현한 커스텀 태그이다.

Resources