Whiteship's Note


태그 파일 활용 예제

View/JSP : 2008.02.18 21:19


참조 : Developing Custom Tag Libraries as Tag Files

1. JSP 조각 태그 파일로 넘겨주기
- attribute의 fragment 사용하면 돼.
<%@ page contentType="text/html" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Even and Odd Rows</title>
</head>
<body bgcolor="white">
<h1>Even and Odd Rows</h1>
<table>
<my:forEvenAndOdd items="a,b,c,d,e">
<jsp:attribute name="even">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="red"><td>${counter}: Even Row</td></tr>
</jsp:attribute>
<jsp:attribute name="odd">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="blue"><td>${counter}: Odd Row</td></tr>
</jsp:attribute>
</my:forEvenAndOdd>
</table>
</body>
</html>

이런 HTML이 있을 때 even이랑 odd라는 JSP 조각을 forEvenAdnOdd 태그 파일로 넘긴다. 물론 items라는 속성도 가지고 있다.

<%@ tag body-content="empty" %>
<%@ attribute name="items" rtexprvalue="true" required="true" %>
<%@ attribute name="even" fragment="true" required="true" %>
<%@ attribute name="odd" fragment="true" required="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:forEach items="${items}" varStatus="status">
<c:choose>
<c:when test="${status.count % 2 == 0}">
<jsp:invoke fragment="even" />
</c:when>
<c:otherwise>
<jsp:invoke fragment="odd" />
</c:otherwise>
</c:choose>
</c:forEach> 

태그 파일 안에서 <jsp:invoke>를 사용해서 해당 조각들을 호출할 수 있다. items 속성의 값을 , 로 구분된 리스트로 인식하려고 한 듯, 기본값도 true니까 굳이 적어주지 않아도 될 듯. fragment="true" 는 반드시 설정해 주어야 함. 기본값이 false니까.

JSP에서 태그 파일에서 사용하는 값도 알아야 할 필요가 있다. 위와 같은 경우 태그 타일 내부에서는 a, b, c, d, e를 구분하여 하나씩 값으로 처리하고 있는데 이걸 JSP에서는 모르니까.. JSP로 넘겨주어야 한다. 이럴 때 variable 지시자를 사용한다.

<%@ tag body-content="empty" %>
<%@ attribute name="items" rtexprvalue="true" required="true" %>
<%@ attribute name="even" fragment="true" required="true" %>
<%@ attribute name="odd" fragment="true" required="true" %>
<%@ variable name-given="current" variable-class="java.lang.Object"
scope="NESTED" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach items="${items}" varStatus="status" var="current">
<c:choose>
<c:when test="${status.count % 2 == 0}">
<jsp:invoke fragment="even" />
</c:when>
<c:otherwise>
<jsp:invoke fragment="odd" />
</c:otherwise>
</c:choose>
</c:forEach> 

나머지 부분은 동일하고, current라는 변수를 루프 돌 때 사용하고 있다, 그러면 이제 JSP에서도 current라는 변수로 태그 파일에서 사용하고 있는 값을 참조할 수 있다.

<%@ page contentType="text/html" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Even and Odd Rows</title>
</head>
<body bgcolor="white">
<h1>Even and Odd Rows</h1>
<table>
<my:forEvenAndOdd2 items="a,b,c,d,e">
<jsp:attribute name="even">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="red"><td>${counter}: Even Row: ${current}</td></tr>
</jsp:attribute>
<jsp:attribute name="odd">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="blue"><td>${counter}: Odd Row: ${current}</td></tr>
</jsp:attribute>
</my:forEvenAndOdd2>
</table>
</body>
</html>
 
그런데, JSP 입장에서 보면 참 쌩뚱 맞을 수 밖에 없다. 느닺없이 current라는 변수가 튀어 나왔다. 도대체 어디서 튀어 나온 녀석이냐며 심각한 고민에 빠질 수도 있다. 그래서 태그의 속성으로 current라는 이름을 리스트의 인자를 가리킬 때 사용할 거라는 것을 알려줘야 한다.

<%@ tag body-content="empty" %>
<%@ attribute name="items" rtexprvalue="true" required="true" %>
<%@ attribute name="var" rtexprvalue="false" required="true" %>
<%@ attribute name="even" fragment="true" required="true" %>
<%@ attribute name="odd" fragment="true" required="true" %>
<%@ variable name-from-attribute="var" alias="current"
variable-class="java.lang.Object" scope="NESTED" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach items="${items}" varStatus="status" var="current">
<c:choose>
<c:when test="${status.count % 2 == 0}">
<jsp:invoke fragment="even" />
</c:when>
<c:otherwise>
<jsp:invoke fragment="odd" />
</c:otherwise>
</c:choose>
</c:forEach>

이전 태그 파일과 다른 부분은 name-given 대신에 name-from-attibute를 사용했고, 그 값으로 var라는 attribute를 지정했다. 이 속성은 rtexprvalue를 false로 지정해두었다. 무슨 값이 오던 신경끄라는 것 같다. 그냥 그 값으로 태그 파일 내부의 값을 참조하게 된다. 안에서 보면 좀 어지럽지만.. 밖에서 보면 간단해진다.

<%@ page contentType="text/html" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Even and Odd Rows</title>
</head>
<body bgcolor="white">
<h1>Even and Odd Rows</h1>
<table>
<my:forEvenAndOdd3 items="a,b,c,d,e" var="anyName">
<jsp:attribute name="even">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="red"><td>${counter}: Even Row: ${anyName}</td></tr>
</jsp:attribute>
<jsp:attribute name="odd">
<c:set var="counter" value="${counter + 1}" />
<tr bgcolor="blue"><td>${counter}: Odd Row: ${anyName}</td></tr>
</jsp:attribute>
</my:forEvenAndOdd3>
</table>
</body>
</html> 

멋지다. 이제 더 이상 current라는 변수 명이 어디서 왔는지 신경쓰지 않아도 되고, 거기에 얽매이지 않아도 된다. 원하는 이름으로 태그 파일에 주고 그 이름으로 태그 파일에 있는 값을 가져올 수 있다.

이렇게 진화하는 예제를 가지고 글을 써주는 사람들은 정말 멋진 것 같다. 머리에도 잘 들어오고, 이해하기도 좋은 것 같다. Good!!

top


태그 파일

View/JSP : 2008.02.18 20:00


참조
Easy Custom Tags with Tag Files, Part 1
Easy Custom Tags with Tag Files, Part 2

JSP 2.0 이전의 커스텀 태그 사용법
1. 핸들러를 작성하고 컴파일 한다.
2. 태그 핸들러와 관련된 태그를 정의한다.

그러나 태그 파일은 미리 컴파일 할 필요 없다. 호출 되는 순간 컴파일 된다.
핸들러 또한 오직 JSP 문법만을 사용하여 만들 수 있다.
태그 라이브러리 서술자 역시 만들 필요 없다. 태그 파일이름을 태그 이름으로 사용하기 때문에.

태그 파일에서 묵시적으로 사용 가능한 객체들
- request     javax.servlet.http.HttpServletRequest
- response     javax.servlet.http.HttpServletResponse
- out     javax.servlet.jsp.JspWriter
- session     javax.servlet.http.HttpSession
- application     javax.servlet.ServletContext
- config     javax.servlet.ServletConfig
- jspContext     javax.servlet.jsp.JspContext

태그 파일 지시자
- <%@ 로 열고 %> 로 닫는다.
- tag      JSP 페이지의 page와 비슷한 지시자
- include     태그 파일에 다른 자원을 포함시킬 때 사용하는 지시자
- taglib     태그 파일에서 커스텀 태그 라이브러리를 사용하고자 할 때 사용
- attribute     태그 파일에 속성 선언할 때 사용
- variable     호출하는 JSP 페이지로 넘겨줄 변수를 정의할 때 사용

tag 지시자의 속성
- display-name      XML 툴에 의해 보여질 간단한 이름. 기본값은 .tag를 짤라버린 태그 파일이름.
- body-content     이 태그의 몸체 컨텐츠에 대한 정보. The value can be empty, tagdependent, or scriptless (default).
- dynamic-attributes     동적인 속성의 지원 여부 알려줌. The value identifies a scoped attribute in which to place a Map containing the names and values of the dynamic attributes passed during this invocation.
- small-icon     보통 사용하지 않는다니까 패스.
- large-icon     보통 사용하지 않는다니까 패스.
- description     태그에 대한 설명.
- example     이 액션을 사용하는 방법에 설명.
- language     태그 파일에서 사용되는 스크립트 언어. The value for this attribute for the current version of JSP must be "java".
- import     page의 import와 같다.
- pageEncoding     page의 속성과 같다.
- isELIgnored     기본값은 false. page의 속성과 같다.
- 사용예
<%@ tag body-content="empty"
import="java.util.Enumeration" %>
<%@ tag import="java.sql.*" %>
- import 빼고는 한 번만 나올 것이다.(모든 속성이 optional이다.)

include 지시자
- 여러 태그 파일에서 공통으로 사용되는 코드가 있을 때 사용한다.
- 사용예
<%@ include file="included.tagf" %>

taglib 지시자
- <%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %> 이런 문법 사용한다.
- 사용예
<%@ taglib prefix="simple" tagdir="/WEB-INF/tags" %>
The server's date: <simple:firstTag/>

attribute 지시자 속성
- name      이 태그 파일이 받아들일 때 사용할 속성 이름. 이 이름은 해당 태그 파일에서 유일 해야 한다.
- required     필수 속성인지 아닌지. false가 기본값.
- fragment     태그 핸들러에 의해 계산되는 fragment인지 아닌지 컨테이너가 그냥 처리할 녀석인지 알려준다. 기본값은 false. 속성의 값을 태그 핸들러가 먼저 처리해야 되면 true로 설정하라.
- rtexprvalue     속성의 값이 scriptlet expression에 의해 동적으로 계산되는 값인지 알려준다. true가 기본값.
- type     속성의 타입. java.lang.String이 기본값.
- description     속성에 대한 설명.

variable 지시자 속성
- atttibute 지시자와 반대로, JSP로 태그 파일안에 있는 어떤 값을 넘겨 줄 수 있고, 여러개를 선언할 수 있으니까 여러 개의 값을 이 태그를 사용한 JSP로 넘길 수 있다.
- name-given      호출한 JSP에 있는 스크립트 언어나 EL 표현식에서 사용할 수 있는 변수 이름. name-from-attribute와 이 속성 둘 중 하나만 존재해야 한다. 태그 파일 내에서 유일해야 한다.
- name-from-attribute     name-given과 동일한데, 다만 이 속성의 값이 attribute의 이름이다.
- alias     이 변수의 값을 가지고 있을 로컬 attriute
- variable-class     이 변수의 타입. java.lang.String이 기본값.
- declare     이 것을 호출하는 페이지나 태그 파일에서 변수가 선언되어 있는지 알려준다. true가 기본값.
- scope     The scope of the scripting variable defined. The possible values are AT_BEGIN, AT_END, and NESTED (default).
- description     변수에 대한 설명.
- 예제
<%@ tag import="java.util.Date"
import="java.text.DateFormat"%>
<%@ variable name-given="longDate" %>
<%@ variable name-given="shortDate" %>
<%
  Date now =
new Date(System.currentTimeMillis());
  DateFormat longFormat =
DateFormat.getDateInstance(DateFormat.LONG);
  DateFormat shortFormat =
DateFormat.getDateInstance(DateFormat.SHORT);
  jspContext.setAttribute(
"longDate", longFormat.format(now));
  jspContext.setAttribute(
"shortDate", shortFormat.format(now));
%>
<jsp:doBody/>

<%@ taglib prefix="tags"
tagdir="/WEB-INF/tags" %>
Today's date:
<br/>
<tags:varDemo>
In long format: ${longDate}
<br/>
In short format: ${shortDate}
</tags:varDemo>

jsp:doBody
- 오직 태그 파일 안에서만 사용할 수 있다.
- 태그의 몸체를 실행할 때 사용한다.
- 몸체를 호출한 결과를 특정 변수에 담고 싶을 때는 var(값을 String으로 받는다.)나 varReader(값을 Reader로 받는다.) 속성을 사용한다.
- 예제
<jsp:doBody var="referer"
scope="session"/>
저렇게 정의해둔 태그로 둘러 쌓인 부분을 실행한 결과를 String 타입으로 refer라는 변수에 session 스콥으로 가지고 있는다.

jsp:invoke
- fragment attribute를 호출할 때 사용한다.
- attribute를 fragment로 설정했다면, 태그 파일 안에서 원하는 만큼 여러번 호출할 수 있다.
- 이것도 jsp:doBody과 같은 역할을 하는 속성을 가질 수 있고, fragment는 필수 속성이다.
- 예제
<%@ attribute name="productDetails"
fragment="true" %>
<%@ variable name-given="productName" %>
<%@ variable name-given="description" %>
<%@ variable name-given="price" %>
<%
  jspContext.setAttribute(
"productName", "Pelesonic DVD Player");
  jspContext.setAttribute(
"description",
    "Dolby Digital output through
coaxial digital-audio jack," +
    " 500 lines horizontal
resolution-image digest viewing");
  jspContext.setAttribute("price", "65");
%>
<jsp:invoke fragment="productDetails"/>

<%@ taglib prefix="easy"
tagdir="/WEB-INF/tags" %>
<html>
<head>
<title>Product Details</title>
</head>
<body>
<easy:invokeDemo>
  <jsp:attribute name="productDetails">
    <table width="220" border="1">
    <tr>
      <td><b>Product Name</b></td>
      <td>${productName}</td>
    </tr>
    <tr>
      <td><b>Description</b></td>
     <td>${description}</td>
    </tr>
    <tr>
      <td><b>Price</b></td>
      <td>${price}</td>
    </tr>
    </table>
  </jsp:attribute>
</easy:invokeDemo>
</body>
</html>

태그 파일 패키징하기
- 태그 라이브러리 서술자. tld 파일을 만들어야 한다.
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
  version="2.0">
 
  <description>JSP 2.0 tag files</description>
  <tlib-version>1.0</tlib-version>
  <short-name>My Tag Files</short-name>
  <uri>http://www.brainysoftware.com/tagfiles</uri>
  <tag-file>
    <name>encode</name>
    <path>/META-INF/tags/encode.tag</path>
  </tag-file>
</taglib>

- 루트 폴더 밑에 META-INF 폴더를 만들고 그 안에 서술자 파일을 넣는다.
- 태그 파일들은 META-INF 폴더 밑에 tags폴더를 만들고 그 안에 넣는다.
- JAR파일로 묶는다. ex) jar cvf mytagfiles.jar *
- 사용한다.
<%@ taglib prefix="easy"
uri="http://www.brainysoftware.com/tagfiles" %>
<easy:encode input="<br/> means changing line"/>

top


JavaServer Pages Standard Tag Library

View/JSP : 2008.02.18 17:10


참조: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/

총 다섯 종류의 표준 태그 라이브러리 제공.

# Core: http://java.sun.com/jsp/jstl/core
# XML: http://java.sun.com/jsp/jstl/xml
# Internationalization: http://java.sun.com/jsp/jstl/fmt
# SQL: http://java.sun.com/jsp/jstl/sql
# Functions: http://java.sun.com/jsp/jstl/functions

Core 태그는 다시 네 가지로 나뉨.

Variable support (remove,set)
Flow control (choose, when, otherwise, forEach, forTokens, if)
URL management  (import, param, redirect, param, url, param)
Miscellaneous (catch, out )

변수 관련 태그

변수 만들기
<c:set var="변수명" value="값" scopr="application|session|request|page" />

변수 지우기
<c:remove var="변수명" />


흐름 제어 태그

조건문

if문
<c:if test="${!empty param.Add}">
  <c:set var="bid" value="${param.Add}"/>
  <jsp:useBean id="bid"  type="java.lang.String" />
   <sql:query var="books"
    dataSource="${applicationScope.bookDS}">
    select * from PUBLIC.books where id = ?
    <sql:param value="${bid}" />
  </sql:query>
  <c:forEach var="bookRow" begin="0" items="${books.rows}">
    <jsp:useBean id="bookRow" type="java.util.Map" />
    <jsp:useBean id="addedBook"
      class="database.BookDetails" scope="page" />
  ...
  <% cart.add(bid, addedBook); %>
...
</c:if>

switch-case와 비스무리한 것
<c:choose>
  <c:when test="${customer.category == 'trial'}" >
    ...
  </c:when>
  <c:when test="${customer.category == 'member'}" >
    ...
  </c:when>
    <c:when test="${customer.category == 'preferred'}" >
    ...
  </c:when>
  <c:otherwise>
    ...
  </c:otherwise>
</c:choose> 

반복문
<c:forEach var="item" items="${sessionScope.cart.items}">
  ...
  <tr>
    <td align="right" bgcolor="#ffffff">
    ${item.quantity}
  </td>
  ...
</c:forEach>

URL 태그, Miscellaneous 태그는 PASS


'View > JSP' 카테고리의 다른 글

1년 반 만에 다시 찾은, EL 안에 EL 사용하는 방법  (7) 2008.09.17
태그 파일 중복 제거 예제  (0) 2008.09.17
태그 파일 배포하기  (0) 2008.09.14
태그 파일 활용 예제  (0) 2008.02.18
태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
top


1. JSP Foundation

View/JSP : 2007.05.21 11:00


Understanding HTTP
- Http Uses TCP/IP
- 요청(request)와 응답(response)가 HTTP의 핵심
- HTTP 요청의 구성 : 헤더, 폼데이타, 두 종류 있다.(GET - 서버로 부터 데이터를 가져올 때 사용, POST - 서버에 데이터를 추가/수정 할 때 사용)
- HTTP 응답의 구성 : 컨텐츠 타입, 길이, HTTP 버전. 상태코드

Servlet & JSP
- 쓰레드 기반의 Servlet 만들었으나 HTML 출력하기 불편함
- 그리하여 JSP 만들었으나 자바 코드랑 섞여 있어서 디자인 요소랑 분리하고파짐

Web Appication Development 패턴
- Servlet 모델 :: 전부 서브릿으로
- 모델 1 :: 전부 JSP 로
- 모델 2 :: 서브릿(C), JSP(V)에 역할 나눠서 MVC 패턴 구현

Larning JSP Basics
- JSP 페이징 처리 과정 :: 맨 처음 요청 들어오면 JSP 페이지를  Servlet Java 코드로 변환한 뒤 컴파일 하여 class 파일 만들어서 그 클래스파일 로딩해서 처리하는데, 그 다음 요청 부터는 JSP 페이지가 바꼈는지 확인하고 바꼈으면 위에 과정 반복하고 아니면 그냥 처리.
- 라이프 사이클 메서드 :: jpsInit(), _jspService(). jspDestroy() 순으로 호출 되지만 _가 앞에 붙은 메소드는 오버라이딩 금지.(요 부분이 JSP 에서 Servlet 코드로 바뀔 때 만들어 지는 부분이니까 충돌 납니다.)

JSP 페이지 구조
- Direntives
    - <%@ page import="" extends="" buffur="" autoflush="" %>
    = <jsp:directive.page import="" extends="" buffur="" autoflush="" />
    - <%@ include file="" %>
    = <jsp:directive.include file="" />
- Declarations
    - visibal to the rest of the page
    - <%! int balance = 0; %>
    - <jsp:declaration> int balance = 0; </jsp:declaration>
- Scriptlets
    - 요 부분이 _jspService() 에 들어가게 됨
    - <%    %>
    - <jsp:scriptlet> </jsp:scriptlet>
- Expressions
    - <%= %>
    - <jsp:expression> </jsp:expression>

EL 사용하기
- ${변수명.속성명}

JSTL 사용하기
- http://epro.tistory.com/79

1장 소스코드
- 테스트 데이터 넣을 DDL들

more..

- JSP 코드

more..

- 화면
사용자 삽입 이미지

느낀점 & 궁금증
- 코드가 DB 접근, 내용과 표현이 결합으로 인해 정신없슴.
- 어디서 에러가 날지 두려움.
- DB, 디자인, 자바코드 모두 알고 있어야 개발 가능.
- 아직도 이런 방법(모델1)으로 많이 개발을 하고 있을까?

'View > JSP' 카테고리의 다른 글

태그 파일  (2) 2008.02.18
JavaServer Pages Standard Tag Library  (5) 2008.02.18
JMeter 다운로드 & 사용해보기  (0) 2007.06.29
9. Testing Techniques  (2) 2007.06.26
6. The Decorating Filter Pattern  (0) 2007.06.20
5. Development Using Patterns  (0) 2007.06.06
4. Role Separation with Custom Tags  (0) 2007.06.01
3. Role Separation with JavaBeans  (0) 2007.05.29
Foundation of JSP Design Patterns 소스코드  (0) 2007.05.28
2. Using JSP  (0) 2007.05.28
1. JSP Foundation  (0) 2007.05.21
top