달력

52025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
EL (Expression Language)

- JSP 2.0 스펙에 포함되어 JSP에서 자바 scripting 대신에 데이터를 출력하기 위한 기능이 확장된 표현언어이다!!

- 특징!
      1. 변수와 연산자를 포함할수 있다.
      2. JSP의 scope에 저장된 속성 및 자바 빈 속성도 EL의 변수로 사용 가능하다
      3. EL 자체의 내장객체가 제공된다.
      4. 표현식에는 숫자, 문자열, boolean 값과 null도 포함할 수 있다.

- 방법!
      ${표현식}
- 주의 사항
      기본적으로 EL 사용을 무시하도록 설정됨, 반드시 page Directive에서 isELlgnored = "false" 로 설정한다.

JSP액션 
<jsp:setProperty name="user" property="timezonePref" value='<%=request.getParameter("timezone")%>'>

ex) JSP액션의 애트리뷰느는 정적 캐릭터 스트링이나 익스프레션을 사용하여 지정된다. 위와 같이 <jsp:setProperty>액션의 name과 property 애트리뷰트를 위해 지정된다.반면 익스페레션은 이것의 값 애트리뷰트를 지정하는데 사용된다. 이 액션은 요청 매개변수의 현재 값을 이름이 붙영진 빈 속성으로 할당하는 효과를 갖고 있다. 애트리뷰트 값을 동적으로 지정하기위한 JSP 스팩에 내장된 유일한 메커니즘이다.!! JSP액션은 익스프레션을 사용하여 지정되기 때문에 다른 스크립팅 엘리먼트와 같은 소프트웨어 관리 문제가 일어날 수 있다. 이런 이유로 인해 JSTL 커스텀 태그는 동적 애트리뷰트 값을 지정하기 위한 대안 메커니즘을 지원한다. JSP익스프레션을 사용하는 것보다 JSTL 액션용 애트리뷰트 값이 단순화된 EL을 사용하여 지정 될수 있다. EL은 JSP 컨테이너에 있는 데이터를 검색 및 조작할 식별자, 접근자, 연산자를 제공한다. EL은 객체와 속성들을 검색하면서 간단한 작동을 수행한다. 이것은 프로그래밍 언어도 스크립팅 언어도 아니다. JSTL 태그와 결합하면 간단하고 편리한 표기를 사용하여 복잡한 작동이 표현 될 수 있다!!!!

JSTL액션
<c:out value="${user.firstName}"/>

예제)
EL 사용 
JSP 페이지 선언시 isELIgnored="false" 를 추가하여야 한다!!

<%@ page language="java" import="java.util.*" contentType="text/html;charset=euc-kr" isELIgnored="false"%>
버젼에 따라 명시 유무가 틀리지만 isELIgnored="true" 할 경우에는 지원하지 않는다. 아래오 같이 표현식이 출력된다!!



 isELIgnored="false" 로 설정할 경우!! 아래와 같이 값이 출력되는것을 확인 할수 있음!! (..) source~



<td width="7%" class="a"><span>${m.name}</span></td>
<td width="5%" class="a"><span>${m.age}</span></td>
<td width="11%" class="a"><span>${m.weight}</span></td>
<td width="5%" class="a"><span>${m.height}</span></td>
<td width="7%" class="a"><span><%=m.getSex() %></span></td>

여러개의 익스프레션들과 정적 테스트를 결합하여 스트링 연결을 통해 동적 애트리뷰트 값을 만들 수 있다!
개별 익스프레션들은 식별자,접근자,리터럴,연산자구성되며 식별자는 데이터 센터에 저장된 데이터 객체를 참조하는데 사용된다. EL은 11개의 식별자를 보유하고 있다!! 리터럴은 고정된 값들(숫자,문자,스트링,부울,null)을 나타낸다.
연산자는 데이터와 리터럴이 결합 및 비교될수 있도록 한다.

정적 텍스트와 여러 EL익스프레션을 결합하여 동정 애트리뷰트 값 지정!!
<c:out value="Hello ${user.firstName} ${user.lastName}"/>
EL은 범위 변수 같은 객체들을 검색하는 빌트인을 지원한다. 특히 EL의 내장 객체중 하나라도 상응하지 않는 EL 익스프레션에 있는 식별자는 네 개(page,request,session,application) 의 JSP SCOP 중 하나에 저장된 객체를 참조하는 것으로 자동 간주 된다..!!!

쉬어가자!!! JSP Action!! 이란??
객체 생성 <jsp:useBean>
객체 속성값 setProperty
객체 속성값 알아보기 getProperty
JSP 액션을 통해서 생성된 객체는 그 객체가 사용될 수 있는 Scope 혹은 LifeCycle을 갖는다.
이것은 생성된 객체의 Reference가 어디에 사용 될 수 있고, 언제 삭제될 것인가를 가진다.
생성된 객체의 라이프 사이클은 scope속성에 의해서 결정되며 가장 긴 LifeCycle 은 application 이고, 가자 짧은 LifeCycle는 page다.

# SCOPE 속성
page 단일 클라이언트 요청에 의해서 생성된 페이지 내에서 접근하여 사용될 수 있다. 실질적으로 PageContext 저장
request 단일 클라이언트 요청이 처리되는 동안에 접근하여 사용될 수 있다. 실질적으로 HttpServletRequest 저장
--page vs request : request에서는 forward나 include를 사용해서 다른페이지로 제어가 이동되는 경우에도 접근이 가능
session 사용자의 세션이 유지되는 어느 곳에서나 접근해서 사용할 수 있다. 실질적으로 HttpSession에 저장
application 웹 응용프로그램의 LifeCycle동안에 웹 응용프로그램 에 소속된 임의의 Servlet 과 JSP에서 접근해서 사용할수 있다. 실질적으로 ServletContext에 저장

# EL 내장객체
 Category 식별자  설명 
 JSP  pageContext 현재 페이지의 프로세싱과 상응하는PageContext 인스턴스
 범위  pageScope 페이지 범위 애트리뷰트
   requestScope 요청범위 애트리뷰트
   sessionScope 세션범위
   applicationScope 애플리케이션 범위
 요청 매개변수  param 요청매개변수의 기본값을 이름
   paramValues 요청매개변수의 모든값을 StringArea
 요청 헤더  header 요청헤더의 기본값을 이름
   headerValues 요청헤더의 모든값을 StringArea
 쿠키  cookie 요청에 수단되는 쿠키들을 이름으로
 초기화 매개변수  initParam 초기화 매개변수를 이름으로 지정

# JSP 와 EL 내장객체가 일반적인 하나의 객체를 갖는 반면(pageContext)다른 JSP 내장 객체는 EL에서 접근가능하다.
pageContext가 다른 8개의 JSP내장 개체 모두에 Access 할 수 있는 attribute을 갖고 있기 때문.. 

남아있는 모든 EL 내장 객체들은 맵(map)이다. 이름에 상응하는 객체들을 탐색한다. 첫 번째 네 개의 맵은 이전에 언급한 다양한 애트리뷰트 범위를 나타낸다. 특정 범위 내의 식별자들을 검색하는데 사용될 수 있다. EL이 기본적으로 사용하는 순차적인 탐색 프로세스에 의존하지 않는다.

다음 네 개의 맵은 요청 매개변수와 헤더의 값을 반입하는 용도이다. HPPT 프로토콜이 요청 매개변수와 헤더가 다중 값을 가질 수 있도록 하기 때문에 각각 한 쌍의 맵이 있다. 각 쌍 중에서 첫 번째 맵은 요청 매개변수 또는 헤더에 대한 기본 값을 리턴한다. 실제 요청 시 첫 번째로 지정된 값이 무엇이든 상관없다. 두 번째 맵은 매개변수나 헤더의 값 모두 검색될 수 있도록 한다. 이 맵의 핵심은 매개변수 또는 헤더의 이름이다. 값들은 String 객체의 어레이이다.

쿠키 내장 객체는 요청으로 설정된 쿠키에 대한 접근을 제공한다. 이 객체는 요청과 관련된 모든 쿠키들의 이름을 Cookie 객체들로 매핑하면서 쿠키들의 속성을 나타낸다.

마지막 EL 내장 객체인 initParam은 웹 애플리케이션과 관련된 모든 콘텍스트 초기와 매개변수의 이름과 값을 저장하는 맵이다. 초기화 매개변수들은애플리케이션의 WEB-INF 디렉토리에 있는 web.xml 전개 디스크립터 파일을 통해 정의된다.

접근자 (Accessors)

EL 식별자는 내장 객체 또는 범위 변수로서 설명될 수 있기 때문에 자바 객체로 평가해야한다. EL은 상응하는 자바 클래스에서 프리머티브를 래핑/언래핑한다. 하지만 대부분의 경우 식별자들은 자바 객체에 대한 포인터가 된다.

결과적으로 이러한 객체들의 속성이나, 어레이와 컬렉션의 경우 그들의 엘리먼트에 액세스하는 것이 바람직하다. 이를 위해 EL은 두 개의 다른 접근자를 제공한다. 닷(dot) 오퍼레이터(.)와 브래킷 오퍼레이터([])이다. 이들은 속성과 엘리먼트들이 EL을 통해 연산될 수 있도록 한다.

닷 연산자는 객체의 프로퍼티에 접근하는데 사용된다. ${user.firstName} 익스프레션에서 닷 연산자는 user 식별자에 의해 참조된 객체 중 firstName이라는 이름을 가진 속성에 액세스 한다. EL은 자바 빈 규정을 사용하여 객체 속성에 접근하기 때문에 이 속성에 대한 게터(일반적으로 getFirstName())는 이 익스프레션이 정확히 계산하기 위해서 반드시 정의되어야 한다. 액세스되는 속성이 객체일 때 닷 연산자는 재귀적으로 적용될 수 있다. 예를 들어 가상의 user 객체가 자바 객체로서 구현된 address 속성을 갖고 있다면 닷 연산자는 이 객체의 속성에 액세스 하기 위해 사용될 수도 있다. ${user.address.city} 익스프레션은 이 address 객체 중 중첩된 city 속성을 리턴한다.

브래킷 연산자는 어레이와 컬렉션의 엘리먼트를 검색하는데 사용된다. 어레이와 컬렉션(java.util.List를 구현하는 컬렉션)의 경우 검색될 엘리먼트 인덱스는 브래킷 안에 나타난다. 예를 들어 ${urls[3]} 익스프레션은 이 urls 식별자에 의해 참조된 어레이 또는 컬렉션의 네 번째 엘리먼트를 리턴한다.

java.util.Map 인터페이스를 구현하는 컬렉션의 경우 브래킷 연산자는 관련 키를 사용하여 맵에 저장된 값을 찾는다. 이 키는 브래킷 내에서 지정되고 상응하는 값은 익스프레션 값으로 리턴된다. 예를 들어 ${commands["dir"]} 익스프레션은 commands 식별자에 의해 참조된 Map"dir" 키와 관련된 값을 리턴한다.

익스프레션이 브래킷안에 나타날 수 있다. 중첩된 익스프레션의 계산 결과는 컬렉션이나 어레이의 적절한 엘리먼트를 검색하는 인덱스 또는 키로 작용한다. 닷 연산자가 true라면, 브래킷 연산자도 재귀적으로 적용될 수 있다. 이는 EL이 다차원 어레이, 중첩 컬렉션, 또는 둘의 결합에서 엘리먼트를 검색 할 수 있도록 한다. 더욱이 닷 연산자와 브래킷 연산자는 상호운용성이 있다. 예를들어 한 어레이의 엘리먼트가 객체라면 브래킷 연산자는 그 어레이의 엘리먼트를 검색하는데 사용될 수 있고 닷 연산자와 결합하여 엘리먼트 속성 중 하나를 검색할 수 있다. (예를 들어 ${urls[3].protocol}).

EL이 동적 애트리뷰트 값을 정의하는 간한한 언어로서 작용한다고 볼 때, 자바 접근자와는 다른 EL 접근자의 재미있는 특성 중 하나는 null에 적용될 때 예외를 던지지 않는다는 점이다. EL 접근자가 적용되는 객체(예를 들어 ${foo.bar}${foo["bar"]}foo 식별자)가 null이면 접근자 적용 결과 역시 null이다. 이는 대부분의 경우, 도움이 되는 일이다.

마지막으로 닷 연산자와 브래킷 연산자는 상호 교환될 수 있다. 예를 들어 ${user["firstName"]}user 객체의 firstName 속성을 검색하는데 사용될 수 있다. ${commands.dir}commands 맵에서 "dir" 키와 관련된 값을 반입하는데 사용될 수 있는것과 같은 이치이다.

연산자 (Operators)

식별자와 접근자를 사용하여 EL은 Application 데이터(범위 변수를 통해 노출) 또는 환경 관련 정보(EL 내장 객체를 통해 노출)를 포함하고 있는 객체 계층을 트래버스 할 수 있다.

EL연산자

 Category 연산자 
 산술 +,-,*,/ (or div),%(or mod) 
 관계형  == (or eq), != (or ne), < (or lt), > (or gt), <= (or le), >= (or ge)
 논리  && (or and), || (or or), ! (or not)
 타당성검사  empty

산술 연산자를 사용하는 EL 익스프레션

${item.price * (1 + taxRate[user.address.zipcode])} 

관계형 연산자 및 논리적 연산자를 사용하는 EL 익스프레션

${(x >= min) && (x <= max)}

리터널 (Literals)
숫자, 캐릭터 스트링, 부울, null은 EL 익스프레션에서 리터럴 값으로 지정될 수 있다. 캐릭터 스트링은 싱글 쿼트 또는 더블 쿼트로 범위가 지정된다. 부울 값은 truefalse로 계산된다.

예제)

Scope - application 사용



결과



Source
<jsp:useBean id="m" class="JSTL.MemberBean" scope="application"/>
<td width="7%" class="a"><span>${applicationScope.m.name}</span></td>

Param사용



결과


Source
<td width="7%" class="a"><span>${param.name}</span></td>

initParam 사용


결과


Web-app 초기 설정


Source
<td width="7%" class="a"><span>${initParam.name}</span></td>


커스텀 태그?
EL 이나 JSP의 표준 액션으로 구현하기 어려운 부분을 해결하기 위해 필요해 의해서 만든 태그를 의미한다!

JSTL (JSP Standard Tag Library)
: 가장 일반적으로 많이 사용되는 커스텀 태그를 표준화 시켜 라이브러리 형태로 제공하는 것!(JSP 2.0 에 포함)
, 일반적으로 모든 개발자가 가장 필요로 하는 구현 내용을 표준 태그로 제공


JSTL을 사용하기 위해서 !!! 준비사항 ㅎㅎ

- JSTL 라이브러리를 다운받아 클래스 패스에 설정!
- JSP에서 taglib 태그로 사용할 라이브러리를 지정!

JSTL 구성요소
- CORE : 공통 필수 기능
- XML : XML 문서 처리 관련 기능
- I18N : 국제화 지원 관련 기능
- SQL : JDBC를 이용한 DB처리 기능

JSTL 라이브러리별 taglib URL과 Prefix

 Libray URI  Prefix 
 CORE

http://java.sun.com/jsp/jstl/core

 c
 XML http://java.sun.com/jsp/jstl/xml  x
 I18N(국제화) http://java.sun.com/jsp/jstl/fmt  fmt
 SQL http://java.sun.com/jsp/jstl/sql  sql

페이지 지시어에서 사용법

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

CORE Libary
수식,흐름제어,URL을 통한 자원 접근등 가장 일반적으로 필요한 기능으로 구성




일반적인 것

# <c:out> 화면에 해당 변수값을 출력한다.
<c:out  value="변수명" default="기본값" escapeXml="boolean값"/>
escapeXml 기본값은 true이다. true로 설정되면 값 중에 포함된 < > & ' " 값등을 escpae문자로 출력한다( &lt, &gt ;등)
변수명 값이 null일 경우에는 공백으로 출력 된다.

예제)
JSTL <c:out> 사용 결과


source
1. <%@ page language="java" import="java.util.*" contentType="text/html;charset=euc-kr" isELIgnored="false" %>
2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 사용
3. <jsp:useBean id="m" class="JSTL.MemberBean"/> <jsp:setProperty name="m" property="*"/>
4. <td width="7%" class="a"><span> <c:out value="${m.name}"/> </span></td>

# <c:set> EL 변수에 값을 설정 및 객체의 멤버변수값 설정 ;
   JSP의 setAttribute() 메소드와 같은 역할을 하며 Scope에 속성을 설정한다.
<c:set var="변수명" value="변수값" target="자바빈/Map객체" property="자바빈/Map객체의 속성명" scope="scope중"/>
scope의 기본값은 page이다!!!
기본예)
<c:set var="varName" value=value"/>
<c:set var="varName" value=value" scope="request"/>
<c:set var="varName" value=value" target="ObjectName" property="propertyName" />

예제)
source..
<c:set> 설정부분


<c:out>로 설정된 <c:set> 을 출력!!!


기본 입력 화면.. 내용 입력후 전송!!


결과 화면.. 위 기재한 내용과 틀림..
<c:set>으로 설정된 이름, 나이, 키 가 출력된다!!



# <c:remove> : JSP의 removeAttribute() 메소드와 같은 역할을 하며 scope의 속성값을 제거하다.
<c: remove var="변수명" scope="scope중 하나"/>
var : 삭제할 변수명(필수)
scope : 삭제할 범위(선택)
* scope의 기본값은 page 이다.
* scope가 맞지 않으면 제거 되지 않는다!

예제)
<c:set var="name" value="이동훈" target="JSTL.MemberBean" property="name"/>
<c:remove var="name"/>

# <c:catch> : 예외처리 코드( 바디에서 실행되는 코드의 예외를 잡아낸다)
<c:catch [var="varName">
nested actions
</c:catch>



조건 관련!!

# <c:if> 조건문 사용시 사용 else지원하지 않는다(else 구현은 <c:choose>로 사용)
<c:if test="조건식" var="변수명" scope="scope중하나"/>
if문의 결과값이 var 속성값으로 설정된다!!!

예제)

<c:if test="${m.name==null}" var="aaa">
   <tr>
    <td colspan="5" class="a"><span>이름을 입력하세요!!</span></td>
   </tr>
</c:if>
<c:if test="${!aaa}"> //위 조건식에서 {m.name==null}이 아니면  aaa속성값에 false를 반환한다!!

   <tr>
    <td width="7%" class="a"><span><c:out value="$m.{name}"/></span></td>
    <td width="5%" class="a"><span><c:out value="${m.age}"/></span></td>
    <td width="11%" class="a"><span><c:out value="${m.weight}"/></span></td>
    <td width="5%" class="a"><span><c:out value="${m.height}"/></span></td>
    <td width="7%" class="a"><span><c:out value="${m.sex}"/></span></td>
   </tr>
</c:if>

결과


# <c:choose> 자바의 switch 문과 같다!(조건식에 문자열 사용가능하다)
# <c:when> 자바의 switch 문과 같다!(조건식에 문자열 사용가능하다)
# <c:otherwise> 자바의 switch 문과 같다!(조건식에 문자열 사용가능하다)
<c:choose>
     <c:when test="조건식">body내용</c:when>
     <c:when test="조건식2">body내용</c:when>
     <c:otherwise>body내용</c:when>
</c:choose>
조건식이 만족하면 body내용을 수행한다!!
만족하는 조건식이 없는 경우에는 otherwise를 수행한다.!!

예제)

<c:choose>
    <c:when test="${m.name==null}">
      <tr>
        <td colspan="5" class="a"><span>이름을 입력하세요!!</span></td>
      </tr>
    </c:when>
    <c:otherwise>

      <tr>
        <td width="7%" class="a"><span><c:out value="${m.name}"/></span></td>
        <td width="5%" class="a"><span><c:out value="${m.age}"/></span></td>
        <td width="11%" class="a"><span><c:out value="${m.weight}"/></span></td>
        <td width="5%" class="a"><span><c:out value="${m.height}"/></span></td>
        <td width="7%" class="a"><span><c:out value="${m.sex}"/></span></td>
      </tr>
    </c:otherwise>
</c:choose>



반복 관련!!

# <c:forEach> 반복실행시 사용!! 자바의 for문과 유사하며 가장 유용한 JSTL 태그중 하나다!! 
<c:forEach items="박복할 객체명" begin="시작값" end="마지막값" step="증가값
                                                               var="변수명" varStatus="반복횟수변수명"/>

반복횟수는 varStatus의 변수명 .count 프로퍼티를 이용하여 구한다!!

예제)
<c:forEach var="current" varStatus="status"...>반복횟수를 구하고 싶으면 ${status.count}로 구현
1.    
<c:forEach var="itr" begin="0" end="4" step="1">
     <td><span>반복</span></td>
</c:forEach>

2.
<c:set var="intArray" value="<%= new int[] {1,2,3,4,5} %>"/>
    <c:forEach var="names" items="${intArray}">
        <td><span><c:out value ="${names}"/></span></td>
    </c:forEach>


3.
 <c:set var="totalCount" value="100"/>
 <c:set var="perPage"  value="20"/>
....
<tr>
    <c:forEach var="boundaryStart" begin="0" end="${totalCount-1}" step="${perPage}">
     <td>
      <span>
       <a href="?start=<c:out value="${boundaryStart}"/>">
       [
       <c:out value="${boundaryStart}"/>
       -
       <c:out value="${boundaryStart+perPage-1}"/>
       ]
       </a>
      </span>
     </td>
    </c:forEach>
   </tr>
   <tr>
    <td>
     <c:forEach var="current" varStatus="status" begin="${param.start}" end="${param.start + perPage-1}">
      <tr>
       <c:if test="${param.start != 0}">
        <c:forEach var="tt" begin="1" end="${param.start/20}">
          <td class="a"></td>
        </c:forEach>
       </c:if>
       <td>
        <c:out value="${current}"></c:out>
       </td>
      </tr>
     </c:forEach>
    </td>
   </tr>

....
2번 결과
1번 결과
3번 결과











URL 관련!!

#
<c:import> 내부자원을 포함할 때 사용된다. <jsp:include>액션과 유사
<c:import url="읽어올 자원" var="읽어올 데이터를 저장할 변수명" scope="scope"
  varReader="자원을 Reader객체로 읽어올때 사용" charEncoding="읽어올 데이터의 캐릭터셋지정"/>

예제)
<c:set var="url" value="http://sowlgns.tistory.com"/>//url 지정
..
<c:import url="${url}" var="u" charEncoding="EUC-KR"/>
<c:out value="${url}"/> import하기
 <hr/>
<c:out value="${u}"></c:out> //import 한 url 데이터 출력!!
..
결과)


# <c:url>  : URL  Rewriting 방식으로 URL 정보를 다룬다.
<c:url value="url주소" context="context" var="변수명" scope="scope중 하나"/>

# <c:param>  : import, url,. redirect 태그에서 파라미터 값을 설정 할때 사용한다.
<c:param name="name" value="value/>

# <c:redirect>  : response,sendRedirect 나 <jap:forward> 액션 대신 사용할 수 있다.
<c:redirect url="value" context="현재 웹어플리케이션의 context "/>







'HomeWork' 카테고리의 다른 글

07-02 / Mantis Mail 설정 Error & Mantis DB 질의 Error  (0) 2010.07.03
이슈 트래커- 버그 추적 시스템 Mantis ^^  (1) 2010.02.05
초간단 JSTL 집고 넘어가자!!  (0) 2010.01.19
GridBagLayout~ㅎㅎ  (0) 2010.01.15
Thread ^^;;  (0) 2009.12.23
Posted by 인천총각
|

1. 개요

JSTL(JSP Standard Tag Libray)

JSP에서 자바의 각종 기능을 태그형태로 사용할 수 있도록 정의해서 사용할 수 있는 것을 말합니다.

쉽게 말해서 굳이 자바나JSP언어를 쓰지 않고 태그형태로 HTML상에서 불러다 쓸 수있다는 말이죠.

JSTL은 커스텀태그의 일종입니다. 그렇다면 또 커스텀 태그가 뭐란말인가요;

커스텀태그

자신이 직접 정의할수있는 태그를 말합니다. 평소에 쓰던 태그는 각각기능이 있지만 (HTML쓰시면서 태그좀 쓰신분 많이 있으실겁니다 ㅎ) 하지만 그 기능은 한정되어있고 원하는 기능이 있지만 일반적인 태그의 기능이 한정되었음을 느끼실때가 많으셨을겁니다. 그것을 대비하여 자기 자신이 새로운 태그를 만들어 자신만의 태그를 만들수 있다는거죠.

 커스텀태그의 장점

라이브러리 형태로 만들어서 필요할때마다 쓰기 때문에 개발속도의 향상 업

일반 태그의 한계점 극복

자기가 직접작성한 태그이기 때문에 유지보수 및 가독성 업

반복적 기능을 쉽게 구현이 가능하기 때문에 효율적

 최대한 자바코드를 줄이기 위해 거의 모든 자바 코드를 커스텀태그로 바꾸어 놓은 것을

JSTL이라고 보시면되겠습니다.

 EL(Expression Language)

표현언어를 의미합니다. 자바코드를 대신하여 다른 표현식을 사용합니다.

 <%=age%>   ===>> ${age} 이런형식으로 바꾸어 쓸수있다는겁니다.

쉽게 말해서 저런 형태로 변경해서 쓴다는 개념입니다. 일반태그의  < >사이에 표현식을 쓰게 되면 굉장히 복잡하고 갇고성도 떨어지겠죠. < > 사이에 ${}이런형식이라면 눈에띄고 쉽게 분간이 갈수 있겠죠. EL을 쓸때는 ${변수명} 이런형태로 구성되어 있습니다.

 대체 무슨말일까요. 하시는 분들은 다음 예제를 보시면서 감을 잡아가시기 바랍니다.

JSTL을 이용하여 정말 간단한 예제를 만들어 보겠습니다.

 index.jsp

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form action="el_test.jsp" method="post">  // 버튼을 누르면 name값을가지고 el_test.jsp로 넘어가게 설정
<table border="1">
<tr>
<td>이름 : <input type="text" name="name"></input></td>
<td><input type="submit" value="입력"></input></td>
</tr>
</table>
</form>
</body>
</html>

index,jsp에서 쓴 값을 넘겨 받습니다. 일반적으로 우리는 jsp언어를 이용하여

<%

String name = request.getParameter("name");  //앞에서 넘긴 name값을 받아서 변수에 저장

%>

이런식으로 변수에 넣고 출력시에는 html안에다가

당신의 이름은 <%=name%>입니다

라는 식으로 나타냅니다. JSTL의  EL로 바꿔서 가보도록하겠습니다

el_test.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>

당신의 이름은 ${param.name } 입니다! //EL내장객체중 자주쓰이는 객체인 param이용 index.jsp에서 name값을 바로 넘겨받아서 커스텀태그로 표현

</body>
</html>

대충 이런식으로 쓰입니다. 내장객체역시 여러종류가 있습니다. 그 내장객체를 이용하여 여러가지 값을 참조하고 사용할 수 있습니다.

 2. 다운로드 및 셋팅

http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi

위 링크로 이동하여 zip파일을 다운 받습니다.

압축을 푸시고 lib폴더에 들어있는 jstl.jar 파일과 standard.jar 파일이 있는 확인합니다. 그 두개의 파일을 복사하셔서 톰캣 lib폴더 안에 혹은 생성한 프로젝트 lib폴더에 넣어두시면 셋팅이 끝납니다.

JSTL태그는 방대합니다. 가장 일반적이면서도 기초적인 라이브러리 모음이 Core Library입니다

이 코어 라이브러리는 우리가 맨처음 c언어를 하든java를 입문했던 시절 기능이 고대로 있는 라이브러리 입니다. 예를 들면 출력, 삭제, 변수지정, if문 ,for문 이라고 생각하시면 되겠습니다.

종류

* 일반

<c:out> 출력을 할때 쓰이는 태그입니다. print문이라고 생각하시면 되겠네요.

<c:set> 변수를 지정하는 태그입니다.

<c:remove> 지정된 변수를 삭제하는 태그입니다.

<c:catch> 예외를 처리하는 태그입니다.

* 조건

<c:if>

<c:choose>

<c:when>

<c:otherwise>

 

* URL

<c:import>

<c:url>

<c:redirect>

<c:param>

 

* 반복

<c:forEach>

<c:forEachToken>

지금 알아볼 태그입니다만, 대충 저 태그가 어떤 기능을 하는지 예측을 하신분들도 계실겁니다.

그 예측이 맞다면 정말 여러분들은 대단하신 분들이죠~

우선 JSTL 1편에서 다운로드 및 셋팅을 제대로 하셨다면 위의 태그가 잘 먹힐겁니다. 예제도 하나씩 만들면서 느껴볼 것인데, 셋팅은 안하신 분들은 1편을 참고하시어 다운로드및 셋팅을 해주시면 이 글을 보면서 이해하시는데 수월하실겁니다.

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

위를 해석해 보자면 c라는 별명을 주고 core태그를 사용하겠다 라는 뜻이 됩니다. uri 하고 웹주소가 적혀져서 으잉? 저 사이트에뭔가 불러다 쓰는건가? 인터넷연결안되면 설마;; 사용안되는건가? 라고 생각하시는분도 혹시 계셨을까요?(저는 처음보는순간 그랬습니다 --;) 하지만 저 뜻을 찾아보니 uri형태를 띄는 태그의 이름이었던 것이었습니다.

prefix="c" 의 경우에는 태그를 쓸때 <c:out> 맨앞에 정해주는 닉네임같은걸로 보시면되겠습니다.(물론 저기에 적힌  c를 z나 x 다른 알파벳으로 써도 태그를 쓰실때 똑같이 잘써주신다면 먹히지만 표준상 Core를 쓸때는 Core의 c를 따서 저런형식으로 약속(?)을 한거죠. 그럼 다른것도 알아보겠습니다.

태그

URI

Profix

Core

http://java.sun.com/jsp/jstl/core

c

XML

http://java.sun.com/jstl/xml

x

formating

http://java.sun.com/jstl/fmt

fmt

DB

http://java.sun.com/jstl/sql

sql

 

지금 2편에서 알아볼 태그는 일반적인 코어 태그이기 때문에 코어태그를 쓰기 위해서는 태그라이브러리를 해주어야 겠죠.

이클립스 기준으로  JSP 파일을 하나 생성합니다. 그리고 HTML위쪽으로 JSP범위에

태그라이브러리를 다음과 같이 선언합니다.

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

그럼 본격적으로 각 태그들을 어떻게 쓰는지 어떤 기능이 있는지 예제를 통해서 알아보도록하겠습니다.

<조건부 태그>

1. <c:out>

지정된 값을 출력하는 태그입니다.

<c:out value="출력값" default="기본값" escapeXml="true 또는 false">

보통우리는 가져온값을 출력할때 <%=변수이름%> 이런형식으로 썼었습니다. 태그를 이용해서 출력 해보겠습니다. 

당신의 이름은 <c:out value='${name}' default="jung"> 입니다 //값이 없어도 디폴트값을 지정해서 출력이 가능합니다

결과 -> 당신의 이름은 jung 입니다

디폴트 값을 주어서 출력을 해보았습니다. 쇼핑몰이나 타 사이트에 들어가면 로그인하지 않은 상태를 나타내었을때 'guest 어서오세요' 라고 쓰여진 걸 보셨을 겁니다. 디폴트값을 지정하여 이렇게 써먹을수도 있겠더라구요.

 escapeXml 이것은 boolean타입으로 참과 거짓으로 나뉩니다.

true경우는 html을 xml로 취급하여 태그가 먹히지 않고 그대로 화면상에 노출됩니다.

또한 소스에는 각각 아래와 같이 문자 엔티티 코드로 변환됩니다.

 

 문자

 문자 엔티티코드

 <

 &lt;

 >

 &gt;

 &

 &amp;

 '

 &#039;

 "

 &#034;

 

 escapeXml='true' 경우

<jstl-test.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
   
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<c:out value="<h1>jstl<h1>,<,/"  escapeXml='true'/>
</body>
</html>

결과값을보시면 value값 그대로 화면에 뿌려집니다. 이화면에서 오른쪽버튼을 클릭하시고 '소스보기'를 누르시고 확인을 해보면

소스는 각각 아래와 같이 문자 엔티티 코드로 변환됩니다.

반대로 escapeXml='false' 로 주어보겠습니다.

이제는 html태그가 먹히는군요

 

2. <c:set>

변수지원태그입니다.

기존의 액션태그인<jsp:setProperty>와 비슷한 계열이라고 생각하시면되겠습니다. 그러나 이 액션태그는 오직 빈의 프로퍼티를 설정하는 일밖에 못하죠. 속성을 추가하거나 빈이 아니라 맵을추가 할때

<c:set>을 사용하게 됩니다. 방식은 두가지 입니다 EL변수를 생성하는 것과 객체의 프로퍼티 값을 설정하는 방식입니다.

<c:set> EL변수 생성

기본형식은 

몸체가 없는 형태 <c:set var="변수네임" value="값" scope="영역" />

몸체가 있는 형태 <c:set var="변수네임">값</c:set>

var : 값을 지정할 EL변수의 이름

value : 변수값을 지정. 표현식 ,EL 정적 텍스트를 지정할 수 있음(ex:"aa",%{aa},<%=aa>)

scope : 변수를 저장할 영역을 선택 page,session,application,request 가 올수있습니다. 기본값은 page값을 가집니다.

<c:set> 프로퍼티값 생성

몸체가 없는 형태 <c:set target="대상" property="프로퍼티이름" value="값" />

몸체가 있는 형태 <c:set target="대상"  property="프로퍼티이름">값</c:set>

target : 프로퍼티의 값을 설정할 대상객체 표현식,EL변수 지정. 대상객체는 빈이나 Map이어야 합니다. 또한 절대 null값이어선 안됩니다. 속성id값도 안됩니다.

property : target 빈일경우 프로퍼티이름은 set메소드를 제공해야한다.

예를 들면 target ="setAge()"  property="age" 이런형식

value : 설정할 프로퍼티의 값

예제를 보면서 이해해 보겠습니다.

우선 빈파일을 하나 만들어야 합니다. 간단하게 이름과 나이값을 get,set하는 부분을 만들어보겠습니다. jung이라는 패키지 안에 클래스 네임 'Info'를 생성합니다

<Info.java>

package jung;

public class Info {
 
 private String name;
 private String age;
 
 public void setName(String name){
  this.name=name;
 }

 public void setAage(String age){
  this.age=age;
 }

 public String getName(){
  return name;
 }
 public String getAge(){
  return age;
 }

}

다음은 test_result.jsp 파일입니다.(각각 주석을 달아놓았습니다.)

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="jung.Info" %> <!--jung이라는 패키지안에  Info.java를 포함  -->
<%@ page import="java.util.HashMap" %><!--HashMap기능을 포함  -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!--코어태그를쓰기 위해!  -->
<%
 Info info = new Info(); //프로퍼티를 사용하기 위해 미리 만들어놓은 빈파일을 객체화
 HashMap<String, String> hmap = new HashMap<String, String>(); //해시맵쓸준비
%>
<html>
<body>

<c:set var="info" value="<%= info %>" /> <!--c:set으로 info라는 변수명지정 값은 위쪽에 생성한  빈파일 객체  -->
<c:set target="${info}" property="name" value="살라딘" /> <!--프로퍼티기능으로 info에는 살라딘 라는 값이 등록됨  -->

<c:set var="hmap" value="<%= hmap %>" />
<c:set var="Youage" value="#{hmap.age}" /> <!--Youage라는 변수지정 값은 해시맵객체의 age값  -->

회원 이름: ${info.name} <br></br> <!--빈파일을 통해 등록된 이름을 출력  -->

나이: ${Youage}<Br></Br><!--등록된 나이를  출력(현재는 등록된 값이 없어서 null값임  -->

<c:set target="${hmap}" property="age" value="20" /> <!-- 나이값 지정  -->
나이 값 지정시 출력: ${Youage} 세

</body>
</html>

<결과화면>

회원이름 : 살라딘

나이 :

나이값 지정시 출력 : 20세

3. <c:remove>

 지정된 변수를 삭제하는 태그입니다. 위쪽에서 속성을 지정했던 것을 제거 하기 위한 태그입니다.

위의 태그에 다음과 같은 삭제 태그를 써보고 한번더 출력해 보세요.

<c:remove var= "info"/>
<c:remove var ="hmap"/>

변수명이  info , hmap의 속성을 지운다는 뜻입니다. set했던 값이 뜨지 않는다면 성공적으로 태그가 적용된 것입니다.

4.<c:catch>

예외를 처리하는 태그입니다. 자바에서 예외처리를 하신 기억이 나시나요. 마찬가지고 이 태그는 예외처리를 해서 에러메시지를 출력하는 태그입니다.

간단한 예제를 보겠습니다

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<body>
<c:catch var="myerr"> <!-- 변수지정-->

<%int x = 10/0; %> <!-- 10으로 0을 나눴습니다;; -->

</c:catch>

<c:if test="${myerr !=null}">
${ myerr.message} <!-- 메시지 출력-->
</c:if>
</body>
</html>

*조건태그

 

<c:if>

사용방법

<c:if test="조건>

조건이 참일시 실행되는 부분

</c:if>

if문을 아신다면 그냥 뭐 쉽게 아실겁니다

다음은 if태그를 이용하여 숫자를 비교하는 예제입니다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<% int a =10; %> <!--비교할 숫자를 넣어줌 -->

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<c:set var="age" value="<%=a %>"/> <!--앞서배운 set을이용하여 age변수에 10을 넣어줍니다 -->

${age}

<c:if test="${age}==20"> <!--여기서 값을 비교합니다. -->

숫자가 맞습니다.

</c:if>

숫자가 틀립니다.

</body>

</html>

 <c:choose>

<c:when>

<c:otherwise>

choose태그는 자바의 switch 구문과 if - else부분을 혼합한 형태를 띄고 있습니다.

일단 예제를 보실까요. 간단하게 임의의 숫자를 지정하고 성별을 출력하도록 만들어 보았습니다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<% int a =1; %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<c:set var="sex" value="<%=a %>"/>

<c:choose>

<c:when test="${sex==1}">

당신은 남자

</c:when>

<c:when test="${sex==2}">

당신은 여자

</c:when>

<c:otherwise>

그 외? 중성인가용?

</c:otherwise>

</c:choose>

</body>

</html>

예제를 보시면 바로바로 이해가 되시죠? ㅎㅎ

 URL태그

<c:import>

URL결과를 읽어와서 현재위치에 삽입이 가능합니다 간단하게 한번 알아보죠

<jsp:include>와 비슷한 개념이지만 이 액션태그는 jsp의 동적인 자원을 포함하기 위해 만든것이기에 페이지라고 이해하시면되겠습니다. 가장 두드러지는 차이점은 include의 경우에는 현재 컨테이너 안에 있는 자원만 포함할 수 있지만, import 의 경우에는 외부자원도 가능하다는 겁니다.

<c:import url ="http://www.naver.com"/>

위와 같이쓰고 태그를 실행하면 네이버의 메인페이지가 뜨게 됩니다. 물론 페이지 뿐만아니라 외부적인 그림들도 다뜨죠.

<c:url>

url의 경우는 하이퍼 링크에 관련된 기능이라고 보시면되겠습니다. url을 재작성합니다

<a href=" <c:url value="test.jsp"/>"> test로가기</a>

jsp쪽에도 url액션태그가 있지만 import할 수있는url은 같은 도메인상에 있지 않아도 됩니다. 굳이 http가 아닌 ftp형식도 사용이 가능합니다

<c:redirect>

jsp의 sendRedirect()와 같은 기능을 가집니다.

이 액션은 HTTP 리다이렉트 응답을 사용자 브라우저로 보내는데 사용되며, JSTL의 javax.servlet.http.HttpServletResponse의 sendRedirect() 메소드와 같습니다.

<c:redirect url="test.jsp"/>

<c:param>

말그대로 파라메터 값을 넘기느 태그입니다.

<c:param name="파라미터 명" value="파라미터 값" />

<c:url var="nameSend" value="/test.jsp">

<c:param name="name" value="jung" />

</c:url>

<a href =<c:out value="${nameSend}" />>url</a>

위 소스를 해석해보면 test.jsp에 name값을 함께 파라메터 값을 보내겠다고 해석이 됩니다. 때문에 test.jsp에서는 request.getParameter로 name값을 받을 수 있습니다.

반복태그

<c:forEach>

이 태그는 for문이라고 생각하시면 되겠습니다. 이 태그를 잘 사용하면 배열과 컬렉션데이터를 루프로 돌리는 작업을 간단하게 처리할 수 있습니다.

JSP를 이용해서 포문부분을 먼저 보고 다음 태그부분을 보겠습니다.

String[] items = (String[]) request.getAttribute("tList"); //tList를 속성지정

for(int i=0; i<items.length; I++) { //포문시작

String mo = items[i];

out.println(mo);

<%@ page contentType = "text/html; charset=euc-kr" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

String[] tList ={"aa","bb","cc"} //배열생성

request.setAttribute("tlist",tList); //배열을쓰기위해 속성지정

%>

<html>

<body>

<table border="1">

<c:forEach var="mo" items="${tlist}"><!-- 반복태그지정-->

<tr>

<td> ${mo} </td>

<td> ${mo} </td>

</tr>

</c:forEach>

</table>

</body>

</html>


 

 

'HomeWork' 카테고리의 다른 글

이슈 트래커- 버그 추적 시스템 Mantis ^^  (1) 2010.02.05
EL & JSTL #2 (천천히 배워가자!!)  (0) 2010.01.20
GridBagLayout~ㅎㅎ  (0) 2010.01.15
Thread ^^;;  (0) 2009.12.23
JSON#2(JavaScript Object Notation)  (0) 2009.12.22
Posted by 인천총각
|

1. org.jfree.chart.JFreeChart

JFreeChart의 기본 클래스이다. 자바2D로 구현되어 있으며 현재 바 차트 , 라인 차트 , 파이 차트 , XY 플롯(시간에 따른 XY그래프)를 지원한다. JFreeChart클래스는 제목을 나타내는 AbstractTitle객체 , Legend객체 , Plot객체 그리고 DataSet객체로 이루어져 있다.

2. org.jfree.chart.AbstractTitle

차트의 제목을 나타낸다. 하위 클래스로 ImageTitle , LegendTitle , TextTitle로 구성되어 있다.

3. org.jfree.chart.Legend

 차트에 포함된 시리즈(series)의 이름과 그 표현방식을 구성한다.

4. org.jfree.chart.plot.Plot

 JFreeChart클래스는 축과 데이터를 그리는(draw) 작업을 Plot에게 위임하였다. 대표적인 하위 클래스로는
CategoryPlot , PiePlot , XYPlot등이 있다.

5. org.jfree.data.DataSet

차트의 데이터를 담당한다. 대표적인 구현 클래스로는 DefaultPieDataSet , TimeSeriesCollection등이 있다.

6. org.jfree.chart.ChartFactory

차트를 생성을 위한 메소드를 제공한다. 예를 들어 pie차트를 만들기 위해서는 creatPieChart() 메소드를 사용한다.

7. org.jfree.chart.ChartPanel

차트를 생성한 후 JFreeChart 클래스를 ChartPanel에 넣어 스윙 컴포넌트로 사용할 수 있다


#1 첫번째 방법~

- JFreeChart 의 Font를 가져와 변경하는 방법!!
차트 제목과 범례 : JFreeChart 로 부터
각 축 : JFreeChart 의  CategoryPlot 로 부터 받아온다.
x축 : getDomainAxis()
y축  : getRangeAxis()  각 축의 정보를 가지고 있다.

  /* 한글 처리 문제 */
  //차트 제목
  labelFont = jfc.getTitle().getFont();
  jfc.getTitle().setFont(new Font("굴림",labelFont.getStyle(),labelFont.getSize()));
  //X축 제목
  labelFont = cgp.getDomainAxis().getLabelFont();
  cgp.getDomainAxis().setLabelFont(new Font("돋움",labelFont.getStyle(),labelFont.getSize()));

  //X축 값에 대한 레이블
  labelFont = cgp.getDomainAxis().getTickLabelFont();
  cgp.getDomainAxis().setTickLabelFont(new Font("돋움",labelFont.getStyle(),labelFont.getSize()));

  //Y축 제목
  labelFont = cgp.getDomainAxis().getLabelFont();
  cgp.getRangeAxis().setLabelFont(new Font("돋움",labelFont.getStyle(),labelFont.getSize()));

  //Y축  값에 대한 레이블
  labelFont = cgp.getRangeAxis().getTickLabelFont();
  cgp.getRangeAxis().setTickLabelFont(new Font("돋움",labelFont.getStyle(),labelFont.getSize()));

  //범례
  //jfc.getLegend().setItemFont(new Font("돋움",Font.PLAIN,10));


# 2 두번째 방법~

 

JRE에 한글 font가 설치 되어있지 않아서 발생하는 문제

JAVA_HOME/jre/lib 폴더에 보면 fontconfig 파일들이 존재한다.
이중 fontconfig.RedHat.properties.src 파일을 fontconfig.properties파일로 복사
fontconfig.properties파일에 쓰기 권한을 주고 편집

#> cp fontconfig.RedHat.properties.src fontconfig.properties
#> chmod +w fontconfig.properties
#> vi fontconfig.properties
--------------- font.config.properties 내용 --------------------------
# 생략
.
.
.
# AWT X11 font paths
awtfontpath.chinese-tw-iso10646=/usr/share/fonts/zh_TW/TrueType
awtfontpath.chinese-cn-iso10646=/usr/share/fonts/zh_CN/TrueType
awtfontpath.japanese-iso10646=/usr/share/fonts/ja/TrueType
awtfontpath.korean-iso10646=/usr/share/fonts/ko/TrueType      <---- 이부분을 폰트 파일의 위치로 수정

서버에서 /usr/local/java...(java폴더명은 서버마다 틀릴수 있다.)/jre/lib/ 폴더에 있는

 fontconfig.RedHat.properties.src 열고  가장 밑에 부분에 있는 곳을 확인해본다.
........

# AWT X11 font paths
awtfontpath.chinese-tw-iso10646=/usr/share/fonts/zh_TW/TrueType
awtfontpath.chinese-cn-iso10646=/usr/share/fonts/zh_CN/TrueType
awtfontpath.japanese-iso10646=/usr/share/fonts/ja/TrueType
awtfontpath.korean-iso10646=/usr/share/fonts/ko/TrueType

/usr/share/fonts/ko/TrueType 디렉토리를 생성하고 그 디렉토리에
batang.ttc과 gulim.ttc파일을 복사해 넣는다.

tomcat을 재구동 시켜준다.


 

Posted by 인천총각
|