Expression Language는 JSP에서 기본으로 지원한다
세팅해야 할 것은 JSTL( JavaServer Pages Standard Tag Library ) 이다
1. 다운로드
http://www.apache.org - Jakarta - Taglibs - Standard - JSTL 1.1 다운로드 ( jakarta-taglibs-standard-1.1.2.zip )

    JSTL 매뉴얼 -  16148092-JSTL-Reference-11.pdf

2. 설치

다운로드 받은 파일에 압축을 풀고 lib 폴더의 jstl.jar 와 standard.jar 파일을 /WEB-INF/lib 에 복사 후
JSP 파일 상단에 다음의 지시문을 추가한다
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
( core 태그 lib만 추가하였고 그외  fmt, sql, x 태그를 사용하기 위해선 지시문을 추가해야 한다 )
tip) 이클립스에서 JSP 생성시 자동으로 소스 추가하는 방법
window - Prefrences - Web - JSP Files - Templates - JSP HTML에 내용 추가

3. Expression language

EL이란 JSP에서 저장객체를 출력할때 스크립팅을 전혀 쓰지 않을 수 있는 기술이다
이것으로 인해 <%=request.getParameter("name")%> 와 같은 스크립팅 들을 쓸필요가 없어진다
(1) 저장객체 접근

${param.name} =>   request.getParameter("name");

${member} => request.getAttribute("member");
저장객체의 attribute 에 자동으로 접근하는데
자동검색순위는 page, request, session, application 순이다

${member.name} => Member m = (Member)request.getAttribute("member");
m.getName();
attribute 저장된 member의 name속성(또는 키)에 접근
도트(.) 의 왼쪽은 Beans 이거나 Map 타입이어야 한다
${list["0"]} => List list = (List)request.getAttribute("list");
list.get(0);
attribute 저장된 list를 가져온다
[]안에 값은 list의 키값 or 프로퍼티명 or 인덱스이다
[]의 왼쪽은 Map, Beans, 배열, List 타입이 올 수 있다
여기서 알아야 할 점이 하나 있는데 EL에서는 해당값이 null이거나 공백일 경우에는
아무 내용도 표시하지 않고 에러도 발생하지 않는다..

(2) 연산자
EL은 연산자들을 사용할 수 있다. 예제는 JSTL에서 같이 사용하는걸 보자

1) 산술연산자 : + - * / (div) % (mod)
2) 논리연산자 : &&(and) ||(or) !(not)
3) 관계연산자 : ==(eq) !=(ne) <(lt) >(gt) <=(le) >=(ge)
4) 삼항연산자 : ?:
예) ${colors == null ? "transparent" : colors}

5) 그 외 예약어 : true, false, null, instanceof, empty( null이거나 공백일때 )

4. JSTL

core태그 중에서 유용한 것들만 살펴보자
        모든 내용을 보고 싶다면 JSTL 매뉴얼 참조   16148092-JSTL-Reference-11.pdf
태그에 진하게 표시된 속성은 필수 항목이다

(1) <c:out>

단순히 내용을 출력하는 기능이다

<c:out value="${member.name}" default="이재원" />

위와 과 같이 쓸 경우 일반적으로 ${member.name} 을 쓴것과 같지만
${member.name}이 null일 경우 dafault에 있는 값으로 대채한다

(2) <c:set>

저장객체의 setAttriubte 기능을 한다

<c:set var="addr" value="myaddr" scope="session" />
<c:set var="no" value="${member.age+1}"  />
첫번째는 session 에 addr 이란이름으로 myaddr 스트링을 저장한 것이다
두번째는 no 이란이름으로 member.age+1으로 산술연산된 값을 저장하는데
scope를 생략하면 기본으로 page에 저장된다

(3) <c:remove>
removeAttribute의 기능을 한다

<c:remove var="no" scope="page" />

지정된 scope의 no란 이름이 attribute를 remove한다
scope를 생략할 경우 모든 범위의 attribute 가 지워진다


(4) <c:if>

if 조건문을 사용한다.. 단 else if 와 else는 지원하진 않고 유사한 <c:choose> 가 존재한다

<c:if test="${member.age < 20}" var="result" scope="page">
당신은 미성년자입니다
</c:if>
<c:if test="${!empty list}" >
content
</c:if>
test에서 조건을 검사하고 true 일 경우에만 <c:if>태그안의 내용이 보여진다
여기서 EL 의 연산자들을 쓸 수 있다!!

var는 조건을 검사하고 리턴되는 boolean값을 저장하는 attribute이름이고
scope는 var가 저장되는 범위입니다. scope가 없을시 기본값은 page이다


(5) <c:choose> 

if, else if, else 와 유사하다. 아니 똑같다고 봐도 된다
<c:choose> 태그안에는 <c:when> 과 <c:otherwise>가 들어간다
<c:choose>
<c:when test="${vo.type==1}">
<img src="<%=cp%>/images/antenna/type1.jpg" />
</c:when>
<c:when test="${vo.type==2}">
<img src="<%=cp%>/images/antenna/type2.jpg" />
</c:when>
<c:when test="${vo.type==0 or vo.type==3}">
<img src="<%=cp%>/images/antenna/type_ment.jpg" />
</c:when>
<c:otherwise>
<img src="<%=cp%>/images/antenna/type_heart.jpg" />
</c:otherwise>
</c:choose>

<c:choose>안에서 순서대로 <c:when> 의 조건문을 검사해 true가 나오면
해당 <c:when> 태그안에 내용을 보여주고 <c:choose>문은 끝나게 된다

만약 모든 <c:when>의 조건문이 false일 경우 <c:otherwise>안에 내용을 보여주게된다


(6) <c:forEach>

Collection을 반복할때 쓰인다. 게시판 같은 반복적인 처리를 할때 매우 유용하다

지원되는 컬렉션을 다음과 같다
Arrays ( 배열 )
java.util.Collection
java.util.Iterator
java.util.Enumeration
java.util.Map
<table>
<c:forEach items="${list}"  var="notice"  varStatus="status">
<tr>
<td>${status.count}</td>
<td>${notice.title}</td>
<td>${notice.writer}</td>
<td>${notice.wdate}</td>
<td>${notice.readcount}</td>
</tr>
</c:forEach>
</table>

items는 Collection 객체를 말한다
var는 Collection에서 객체를 하나씩 가져올때마다 담는 객체다
객체가 Beans일 경우 Beans클래스를 자동으로 찾아 담는다
varStatus는 일련의 속성들을 정의한 객체다 ( javax.servlet.jsp.jstl.core.LoopTagStatus )

다음은 일반적은 for문 처럼 사용한 예다

<c:forEach var="x" begin="0" end="10" step="2">
${x},
${x*x}
</c:forEach>
(7) <c:forTokens>

<c:forEach> 와 같이 반복 태그로 이것은 StringTokenizer 클래스를 이용한다.. 그다지 쓸일은 없다
구분자( delims ) 를 공백, 쉼표, 마침표 로 한 예이다

<c:forTokens items="${param.text}" delims=" ,." var="word" begin="1" end="10" step="1" >
${word}
</c:forTokens>



 JSTL 매뉴얼 -  16148092-JSTL-Reference-11.pdf
 
출처 : 이재원님의 이글루 (http://slog2.egloos.com/3581446)








  1. JSTL의 종류
  2. JSTL 설정 : jstl관련 jar파일이 WEB-INF/lib폴더에 있으면 된다.
  3. Core Tag : <%@ taglib prefix="c" uri=http://java.sun.com/jsp/jstl/core %>
    • 변수
      • set : <c:set var="varName" value="value" scope=""/>
        • var : 이후 사용할 변수 이름
        • value : varName에 할당될 값
        • scope : varName을 사용할 영역 - page, request, session, application
        • target : bean object의 인스턴스 지정
        • property : target에 지정한 bean object의 field 지정
        • 예)
          • <c:set var="member" value="<% new Member() %>" scope="request" />
          • <c:set target="${member}" property="name" value="java"/>
          • 사용자 명 : <b>${member.name}</b>
        • 참고 : HashMap의 활용
          • <c:set var="map" value="<% new java.util.HashMap() %>"/>
          • <c:set target="map" property="name" value="java"/>
          • ${map.name}
      • remove : <c:remove var="varName" scope=""/>
        • var : set 태그로 설정한 변수 이름
        • scope : set 태그에서 설정한 영역(동일해야함)
    • 흐름제어
      • if : else가 지원되지 않는 단순 조건 처리 - <c:if test="condition">...</c:if>
        • test : 조건이 true이면 ...부분을 처리한다.
      • choose : 다중 조건 처리 - <c:choose></c:choose>
        • <c:when test="condition">...</c:when>
          • choose태그 내에서 test조건이 true이면 ...부분을 처리한다.
        • <c:otherwise>...</c:otherwise>
          • choose태그 내에서 when태그의 조건이 true인 경우가 없으면 ...부분을 처리한다.
      • forEach : 반복처리 및 배열, Collection, Map등의 순환 처리 - <c:forEach var="" items="">...</c:forEach>
        • items : 배열등의 데이터
        • var : items에서 할당된 값 - 기본 데이터의 경우 wrapper class로 취급
        • begin : 반복 처리시 시작 값
        • end : 반복 처리시 종료값
        • step : begin과 end사이의 step
        • 예)
          • map.put("key1", "value1");
          • map.put("key2", "value2");
          • <c:forEach var="item" items="${map}">
          • ${item.key} : ${item.value}<br/>
          • </c:forEach>
      • forTokens : 분자열 분리 - <c:forTokens var="varToken" items="string" delims="">...</c:forTokens>
        • items : 분리할 문자열
        • delims : items문자열을 분리할 구분자
        • 예)
          • <c:forTokens var="token" items="버스,트럭,승용차" delims=",">
          • ${token}<br/>
          • </c:forTokens>
    • URL처리
      • import : <c:import url="http://..." charEncoding="euc-kr" var="varName" scope=""/>
        • url : 읽어올 경로, remote 경로나 같은 서버의 절대/상대경로
        • charEncoding :
        • var : 읽어온 데이터를 지정한 변수(varName)에 할당한다.
        • scope : varName의 범위 지정 - page, request...
        • param 태그 : url에 지정한 경로를 읽어 올때 파라미터를 지정할 수 있도록 한다. - <c:param name="paramName" value="paramValue"/> (<jsp:param .../>)
        • 참고 : 읽어온 내용을 바로 출력하지 않고 varName에 할당한 후 사용할 수 있다.
      • redirect : <c:redirect url="http://..."/>
        • <c:param... 태그를 활용해 파라미터를 줄 수 있다.
      • url : <c:url var="varName" value="http://..."/>
        • <c:param... 태그를 활용해 파라미터를 줄 수 있다.
        • 예)
          • <c:url var="url1" value="http://www.a.com">
          • <c:param name="param1" value="paramValue"/>
          • </c:url>
          • ${url1}
    • 기타
      • out : JspWriter에 데이타를 출력 - <c:out value="" default="" escapeXml=""/>
        • value : 출력할 내용
        • default : value에 지정된 값이 없을때 출력될 내용
        • escapeXml : <, >, &, ', "에 대한 escape 여부 - true/false
        • 참고 : value에 지정한 값이 java.io.Reader의 종류라면 해당 Reader객체의 데이터를 읽어 출력한다.
      • catch : 예외 처리 - <c:catch var="exName">...</c:catch>
        • var : catch 태그 내의 ...에서 예외가 발생하면 예외 객체가 exName에 할당된다.
  4. 국제화 태그 : <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    • 국제화 태그는 사용자의 각기 다른 언어 및 국가에 대한 지원을 위한 것으로 사용자 웹브라우저의 request header의 Accept-Language를 통해 적용된다.
    • 로케일 지정
      • setLocale : <fmt:setLocale value="ko" scope="request"/>
        • 사용자 환경의 locale을 강제 지정한다.
        • value : 두자리 언어 코드, 언어코드 뒤에 두자리의 "_국가코드"를 지정할 수 있다. (예, ko_kr, en_us)
        • scope :
      • requestEncoding : <fmt:requestEncoding value="euc-kr"/>
        • request 파라미터의 인코딩을 지정
        • 참고 : request.setCharacterEncoding("euc-kr");
    • 메세지 처리
      • 메세지 처리를 위한 번들 파일 작성 : WEB-INF/classes/resource/message.properties
        • 리소스 파일명을 message로 작성하고 언어 및 국가별로 해당 파일명의 "_언어코드_국가코드"를 붙혀 추가한다.
        • 적용되는 언어파일이 없을 경우 message파일의 내용으로 처리된다.
        • .properties파일 작성 : 라인 단위로 key = value형태로 작성
      • bundle : 리소스 번들 파일 지정 - <fmt:bundle basename="resource.propertiesFileName" prefix="msg_">...</fmt:bundle>
        • basename : ...부분에서 사용할 번들파일 이름 지정 (.properties는 쓰지 않는다.)
        • prefix : ...부분에서 사용될 message태그의 key부분값에 prefix의 문자열을 자동으로 붙혀준다.
        • 참고 : 번들 파일명 지정시 classes폴더 하위의 폴더에 대해 namespace형식으로 지정할 수 있다.
      • message : 번들파일의 내용 출력 - <fmt:message key="propertiesKey" var="varName" scope="request"/>
        • key : properties파일에 작성한 keyName
        • var : var지정시 해당 영역에 메세지를 출력하지 않고 varName에 할당한다.
        • scope :
        • bundle : setBundle 태그를 통해 지정된 bundle변수를 통해 message태그만으로 번들을 선택해서 출력할 수 있도록 한다.
        • 참고 : key로 부터 읽은 메세지에 파라미터를 치환할 수 있다.
          • properties파일 작성시 {0}, {1}과 같이 메세지에 파라미터 순서를 명시한다.
          • message태그 내의 <fmt:param value="">를 통해 파라미터를 적용한다.
          • param태그 순서대로 적용된다.
      • setBundle : 리소스 번들파일을 변수로 지정할 수 있도록 한다.
        • <fmt:setBundle var="bundleName" basename="propertiesFileName" scope=""/>
        • message태그에서 bundle을 지정할 수 있도록 bundle변수를 설정한다.
    • 포멧팅
      • formatNumber
        • value : 포멧을 지정할 값
        • var : 포멧적용 후 저장할 변수명 지정(없으면 바로 출력)
        • type : number, percent, currency
        • groupingUsed : [true]/false
        • currencyCode : 통화 코드(ISO 4217 - KRW : 원), type이 currency일때만 적용됨.
        • currentSymbol : 통화 표현기호, type이 currency일때만 적용됨.
        • pattern : 직접 출력양식 지정, java.text.DecimalFormat클래스의 패턴
        • scope :
      • formatDate
        • value
        • var
        • type : date, time, both
        • dateStyle : java.text.DateFormat의 스타일 (full, long, default, medium, short)
        • timeStyle : java.text.DateFormat의 스타일
        • pattern : java.text.simpleDateFormat클래스의 지정 스타일
        • timeZone : 시간대를 변경하고자 할경우, setTimeZone태그로 생성한 TimeZone객체
        • scope
      • parseDate
      • parseNumber
      • setTimeZone
      • timeZone : timeZone태그 설정 내의 formatDate태그에 영향을 줌
        • value : timeZone 설정, java.util.TimeZone클래스의 getAvailableIDs메서드를 통해 timeZone목록을 확인할 수 있다.
  5. 함수 태그 : <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
    • length(obj) : List, Collection, String
    • toUpperCase(str)
    • toLowerCase(str)
    • substring(str, idx1, idx2) --> str.substring(idx1, idx2)
    • substringAfter(str1, str2) : str1에서 str2와 일치하는 문자 이후의 문자열
    • substringBefore(str1, str2) : str1에서 str2와 일치하는 문자 이전의 문자열
    • trim(str)
    • replace(str, src, dest) : str에서 src문자를 dest문자로 변환
    • indexOf(str1, str2) : str1에서 str2와 일치하는 문자의 인덱스
    • startsWith(str1, str2) : str1이 str2로 시작하면 true, 아니면 false
    • endsWith(str1, str2) : str1이 str2로 끝나면 true, 아니면 false
    • contains(str1, str2) : str1이 str2를 포함하고 있으면 true, 아니면 false
    • containsIgnoreCase(str1, str2) : 위의 contains를 대소문자 구분하지 않고 수행
    • split(str1, str2) : str1을 str2를 구분자로 분리하여 배열로 구함
    • join(arr, str1) : arr의 내용을 str1을 구분자로 합친다.
    • escapeXml(str) : XML객체 참조에 해당하는 특수 문자 처리(& --> &amp;)

 출처 : http://blog.naver.com/yu_hs?Redirect=Log&logNo=100100747114






el과 fn을 이용한 쉬운 처리 방법 sample
1. <c:set var="aaaaaaaa" value="${fn:length(test)}" />
2. ${fn:substring("test", 1, fn:length("test"))}

'Jsp-Servlet > Jsp' 카테고리의 다른 글

404, 500 error등의 처리  (1) 2011.12.09
Excel Download 공통단  (1) 2011.11.17
quartz setting (servlet 이용)  (3) 2011.10.31
jstl el 특이한 명령어들..  (4) 2011.01.09
custom tag lib 대략 정리  (1) 2010.08.05