JSTL - functions - core, fn, fmt, xml

Posted 11 19, 2009 17:26, Filed under: Language/ㅡ Jsp

자료 출처 : http://pupustory.tistory.com/


J2EE의 표현 계층(presentation layer)인 JSP에서 코드가 삽입되는건 당연한 일이다. MVC를 이용한 경우 컨트롤러에서 비지니스 로직의 처리가 끝나고, 사용자에게 정보를 표시해 줄 때 형식을 맞춰 HTML로 출판해 줘야 하니 말이다.

일반적으로 JSP는 <% .. %>의 스크립틀릿을 써왔다. 컨트롤러에서 속성으로 넘어온 정보를 받아 목록을 표시하는 일반적인 CRUD화면을 개발해 본 사람이라면 대부분 그러할 것 이다. 물론 이것이 문제가 되는건 아니다. 어차피 servlet로 작성되니 말이다. 여기서 JSTL을 이용하면 얻는 이점은 다음과 같다.


첫째. 편리한 유지보수
예를들어 디자인이 변경되었다고 가정해 보자. css만 변경된거라면 큰 불편이 없겠지만, 디자인 전체가 바뀌었고, 표현 방식이 바뀌었다면 디자이너에게 페이지를 다시 받아 거기에 추가해 넣어야 하는데, 이건 HTML과 코드가 뒤섞여 가독성에 문제가 될 수 있다.

둘째. 디자이너가 작성된 페이지(JSP)에 거부감이 없어짐
JSTL은 xml과 매우 흡사하다. 다시말해 디자이너가 알고있는 html 코드와 흡사하다는 얘기다. 따라서 개발중인 페이지에 디자인이 변경 되어도, 디자이너는 구체적 내용은 모르지만 기존의 코드가 섞인 페이지보다 쉽게 수정할 수 있다.(대부분 여기선 개발자가 알아서 했을 경우가 많지만..)

설치방법
1. JSTL 관련 라이브러리를 다운로드
2. 프로젝트에 JSTL라이브러리 추가

추가 라이브러리 보기

그럼 가장 간단한 페이지 소스를 보고 JSTL을 이용한 예제를 확인하자.
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <!-- jstl 사용을 위한 테그 라이브러리 선언 --><%@ 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=UTF-8"><title>JSTL</title></head><body><p> requestScope : </p><c:out value="${requestScope.stat}" /><p> sessionScope : </p><c:out value="${sessionScope.stat}"/><br /> end line.</body></html>  


상단에 선언한 것은 JSTL중 core부분을 사용하겠다는 얘기다. 이것 외에도 여러가지 JSTL 테그들이 있는데 그것은 차후 살펴보기로 하겠다.
<c:out value="${requestScope.stat}" />

간단하게 출력하는 구문이다. value부분은 EL을 이용한것인데, request의 애트리뷰트 'stat'의 값을 받아와 출력한다는 의미다. 즉 이전의 컨트롤러에서 request.setAttribute("stat","value!"); 의 설정을 했다면 여기서 value!가 출력될 것이다.

Category 식별자 설명
JSP pageContext 현재 페이지의 프로세싱과 상응하는 PageContext 인스턴스
범위 pageScope 페이지 범위 애트리뷰트 이름과 값과 관련된 Map
requestScope 요청 범위 애트리뷰트 이름과 값과 관련된 Map
sessionScope 세션 범위 애트리뷰트 이름과 값과 관련된 Map
applicationScope 애플리케이션 범위 애트리뷰트 이름과 값과 관련된 Map
요청 매개변수 param 요청 매개변수의 기본 값을 이름으로 저장하는 Map
paramValues 요청 매개변수의 모든 값을 String 어레이로서 저장하는 Map
요청 헤더 header 요청 헤더의 기본 값을 이름으로 저장하는 Map
headerValues 요청 헤더의 모든 값을 String 어레이로서 저장하는 Map
쿠키 cookie 요청에 수반되는 쿠키들을 이름으로 저장하는 Map
초기화 매개변수 initParam 웹 애플리케이션의 콘텍스트 초기화 매개변수를 이릉으로 저장하는 Map
<IBM 참조>

EL을 이용해 사용할 수 있는 것들이다. 요청 매개변수는 흔히 사용하는 getParameter() 부분이다. 이것음 ${param.parameter}로 이용하는데 위와같이 사용하려면 아래와 같다.
<c:out value="${param.stat}" />

보는김에 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
<IBM 참조>

  1. <c:out value="${param.value1 + param.value2}" />  


이번엔 core의 변수 설정 방법을 이용해 보자.
  1. <c:set var="var" value="${param.stat}" /><c:out value="${var}" default="var is null !"/>  


var은 변수명이다. 파라미터로 넘어온 값을 EL로 받아 value에 설정했다. 그다음 바로 출력한다. 이때 위에 설정한 변수를 찾아 출력하면 된다. 여기서 default는 변수가 null일경우 출력된다. EL에서 null값은 별도의 Exception이 발생하지 않는다. 따라서 디버깅을 할땐 저런 방식을 이용하는게 좋을듯 하다.

변수 해제는 <c:remove />를 이용하면 된다.
  1. <c:set var="var" value="${param.stat}" /><c:out value="${var}" default="var is null !"/><c:remove var="var"/><c:out value="${var}" default="var is null !"/>  

stat파라미터를 보내서 테스트 해 보면 처음엔 파라미터값이 출력되고 후엔 remove를 통해 지웠으므로 default가 출력 될 것이다.

EL과 JSTL은 강력하다. 보기에 그리 거부감도 없고, 왠만한 기능을 모두 지원 한다. 최소한 프레젠테이션 계층에서 이용되는 부분은 다 있다.(SQL도 가능하니 .. )



------------------------------------------------------------------------

# core
<c:out value="expression" default="expression" escapeXml="boolean"/>
이전 포스트에 살펴본 내용대로 value에는 출력할 내용을. defalut는 value가 null일 경우 출력할 기본 내용을 얘기한다. EL을 이용할 경우 "${}"를 이용할 수 있다. value는 <c:out >value</c:out> 로도 할 수 있다.

<c:set var="expression" scope="request" value="expression"/>
변수를 할당한다. var은 변수명을. scope는 영역을. value는 값이 온다. 앞에서 살펴본 바와 같이 ${} 같은 EL을 사용할 수 있다. <c:out>와 마찬가지로 <c:set var="expression">value !!</c:set>로도 이용할 수 있다.

<c:remove var="expression" scope="request"/>
변수에 할당한 값을 삭제 한다. var는 변수명이 오는데 .. 음.. 그다지 설명할 거리는 없다.

<c:forEach var="name" varStatus="name"
begin="expression" end="expression" step="expression">
body content
</c:forEach>
일반적으로 스크립틀릿을 사용할 경우 <% for (int i=0; i<10;i++) {} %>의 역할을 한다. 이때 주목할 점은 for가 아니라 forEach라는 점이다. JDK5.0에서 추가된 forEach를 이용하는 얘기다. 그렇다고 고전적인 방법(?)을 사용하지 못하는 것은 아니다. forEach를 이용한 방법은 다음과 같다.
  1. <%    
  2.     java.util.List<String> arrayList = new java.util.ArrayList<String>();    
  3.     arrayList.add("pupustory");    
  4.     arrayList.add("yaho");    
  5.     arrayList.add("babo");    
  6.     arrayList.add("hehe");    
  7.     request.setAttribute("lists",arrayList);    
  8. %>  
  9. <c:forEach  items="${requestScope.lists}" var="value">    
  10.     <li><c:out value="${value}"></c:out></li>    
  11. </c:forEach>    

request의 속성에 작성한 ArrayList를 넣어두고, forEach를 통해 하나씩 받아와 value에 저장한다. 총 반복 횟수는 items의 값과 같다. 친절하게도 Iterator, Map, Collection, Enumeration 및 사용자가 작성한 Object[], ','로 구성된 String를 모두 지원 한다. 이번엔 일반적(1.4에서 사용한..)으로 사용했던 방식을 이용해 보자.
  1. <c:forEach begin="0" end="10" step="1">    
  2.     <li><p>pupustory</p></li>    
  3. </c:forEach>    
  4.  
  5. <c:forEach begin="0" end="10" step="1"> <li><p>pupustory</p></li> </c:forEach>  

begin은 초기값, end는 종료값, step는 증가값이다. 별로 어렵지 않다. 마지막으로 varStatus는 내부의 정보(?)를 알려주는 객체를 생성한다. 객체생성후 사용은 EL에 따라 사용한다. 먼저 객체의 속성은 다음과 같다.

속성 Getter Description
current getCurrent() 현재 반복 라운드 아이템
index getIndex() 현재 반복 라운드의 제로 기반(zero-based) 인덱스
count getCount() 현재 반복 라운드의 1 기반(one-based) 인덱스
first isFirst() 현재 라운드가 반복을 통한 첫 번째 패스임을 나타내는 플래그
last isLast() 반복현재 라운드가 반복을 통한 마지막 패스임을 나타내는 플래그
begin getBegin() begin 애트리뷰트의 값
end getEnd() end 애트리뷰트의 값
step getStep() step 애트리뷰트의 값
<IBM 참조>

<c:forTokens var="name" items="expression"
  delims="expression" varStatus="name"
  begin="expression" end="expression" step="expression">
  body content
</c:forTokens>
java에서 흔히 사용한 StringTokenizer이다. 예제는 아래와 같으며 forEach와 마찬가지로 begin, end, step, varStatus가 존재 한다. 사용법은 동일 하다.
  1. <% String str = "a,b,c,d,e,f,g,h,i,j,/k,l,m,n,o,p/,q,r,s,t,u/,v,w,x,y/,z"; %>  
  2. <c:forTokens items="${requestScope.str}" delims="/" var="value">  
  3.     <c:out value="${value}" default="value is nul !!" /><br/>  
  4. </c:forTokens>  

<c:if test="expression" var="name" scope="scope">

  body content
</c:if>
개발 하면서 가장 많이 사용한 구문은 무엇일까 ? for문도 둘째가라면 서러울 정도로 많이 사용하지만 가장 많이 사용하는건 역시 분기기 사용하는 if문이 아닐까 싶다. JSTL은 역시 if문을 사용할 수 있도록 해주고 있다.(사실 이거 없음.. 쩝..)
  1. <%    
  2.     request.setAttribute("isTrue","true");    
  3. %>    
  4. <c:if test="${requestScope.isTrue}"> it's true !</c:if>  

구문은 간단하다. test에 'true'가 들어오면 실행하고 그 외의 것이 들어오면 실행하지 않는다. 엄밀히 따지면 여기엔 true false가 와야 하지만..참 관대하다.

<c:choose>
  <c:when test="expression">
    body content
  </c:when>
  ...
  <c:otherwise>
    body content
  </c:otherwise>
</c:choose>
아쉽게도 위  구문은 별다른 조건을 지원하지 않는다. 때문에 다양한 조건에 대한 분기는 <c:choose />를 사용해야 한다. 조건에 대해선 <c:when test="" />로 구분한다. 물론 test에는 'true'라는 문자열에만 '참'으로 반응 한다. case문에서 사용했던 default는 <c:otherwise />로 이용 한다. 위 when 조건에서 걸리지 않으면 default로 수행 된다.

조건에 만족하지 않고, otherwise가 없다면, 당연히 그 블럭은 아무것도 수행하지 않을 것 이다.
  1. <%  
  2.     request.setAttribute("value","2");  
  3. %>  
  4. <c:choose>  
  5.  <c:when test="${requestScope.value eq '1'}">  
  6.   <c:out value="request 'value' attribute is 1" />  
  7.  </c:when>  
  8.  <c:when test="${requestScope.value eq '2'}">  
  9.   <c:out value="request 'value' attribute is 2" />  
  10.  </c:when>  
  11.  <c:otherwise>  
  12.   <c:out value="request 'value' attribute unknow .." />  
  13.  </c:otherwise>  
  14. </c:choose>  


<c:import url="expression" context="expression"
   charEncoding="expression" var="name" scope="scope">
  <c:param name="expression" value="expression"/>
  ...
</c:import>
템플릿을 이용한 페이지나, 공통으로 들어가는 부분은 별도로 관리해 jsp액션을 이용해 사용한다. JSTL에도 그러한 기능을 제공 한다. url부분에 추가할 페이지를 작성한다. 사용법은 <jsp:include/>와 매우 비슷하다.
  1. <c:import url="http://www.pupustory.com/index.jsp">  
  2.  <c:param name="stat" value="value"></c:param>  
  3. </c:import>  


<c:url value="expression" context="expression"
    var="name" scope="scope">
  <c:param name="expression" value="expression"/>
  ...
</c:url>
URL은 java.net.URL을 이용 한다. 위에서도 url을 속성을 이용했지만, 여기서 기존의 jsp액션과 틀린점은 http프로토콜만 지원하지 않고, import할 수 있는 url은 같은 도메인상에 있지 않아도 되는 것 이다. http가 아닌 ftp의 형식으로도 이용할 수 있다는 얘기다.

<c:catch var="name">
  body content
</c:catch>
JSTL은 위에서 얘기한 대로 별도의 Exception이 발생하지 않는다.(물론 JSTL구문을 제대로 사용하지 않았을 경우 Exception이 발생 한다.) 여기에 도움이 되고자 <c:exception/>이 있다. 하나의 주제로 해서 다루기엔 작은 내용이니 <c:import/>와 같이 알아보도록 하겠다.
  1. <c:catch var="exception">  
  2. <c:import url="http://www.pupustory.co.kr/sample.html">  
  3. <c:param name="stat" value="123" />  
  4. </c:import>  
  5. </c:catch>  
  6. <c:if test="${not empty exception}">  
  7.  <c:out value="exception is not null !"/>  
  8. </c:if>  

import를 수행 하는데 예외가 발생하면 exception객체가 생성 될 것이다. 따라서 null이 아니라면(비어있지 않다면..not empty) 조건을 수행하게 된다.

<c:redirect url="expression" context="expression">
  <c:param name="expression" value="expression"/>
  ...
</c:redirect>
redirect는 별도의 설명이 필요 없는듯 하다. url로 이동 한다. redirect와 forward의 차이점은 이전 포스트에서 참조하도록 하고 .. 직접 사용해 보자.

  1. <c:catch var="exception">  
  2.   <c:import url="http://pupustory.com/not found page error"/>  
  3. </c:catch>  
  4. <c:if test="${not empty exception}">  
  5.   <c:redirect url="http://pupustory.com/error/404.html"/>  
  6. </c:if>  

사실 error페이지는 지시어를 통해 하는 경우가 많다. 이것은 조건에 따라 분기를 한다는 것에 촛점을 맞춰야 할 듯 하다.지금까지 알아본 JSTL core부분은 실무에서 가장 많이 쓰는 부분이 아닐까 싶다. 사실 이정도 조건이면 어지간한 화면은 구성될 듯 하다.


------------------------------------------------------------------------

# fn

JSTL은 JSP에서 <% %>같은 자바 코드를 빼자는 취지에서 태어났으므로 위와같은 문제점에 대응할 해결책이 있다. 그것이 바로 functions이다. 여기엔 보편적으로 많이 사용하는 유용한 유틸들을 모아두었다.(JSTL이라지만.. 이건 EL이 아닐까 ..싶다. EL인가?) java에서 많이 사용하던 부분이므로 구체적인 설명은 빼고 살펴보겠다. 먼저 tlb 지시어는 다음과 같다.
  1. <%@ taglib prefix="fn"   
  2.     uri="http://java.sun.com/jsp/jstl/functions" %>  

* 중요 *
$(fn}안에선 ${}을 통한 변수 접근이 불가능 하다. 따라서 ${fn:substring(${requestScope.str},"yaho")}는 반드시 ${fn:substring(requestScope.str,"yaho")}로 사용해야 한다.

${fn:substring(expression, start, end)}
start에서 end까지의 인덱스만큼 문자를 가져온다. EL이므로 별도의 exception은 발생하지 않는다. 일반적으로 java로 사용 할 경우 "pupustory".substring(1,50)는 문제가 발생 할 것이다. 하지만 여기선 없음 없는데로, 있음 있는데로 출력해 준다.

${fn:toLowerCase(string)}
string를 소문자로 변환

${fn:toUpperCase(string)}
string를 대문자로 변환

${fn:trim(string)}    
string의 앞,뒤 공백(whitespace)제거 (중간의 공백은 제거하지 않음)

${fn:escapeXml(string)}
string에 XML과 HTML에서 사용하는 엔티티를 치환한다. 예를들어 '<'는 '&lt;'(맞나?)로 치환한다. 이런것은 스크립트 인젝션 등에 많이 사용 될 수 있다.

${fn:indexOf(string,substring)}
string이 가진 문자열 중 substring가 등장하는 인덱스(int)를 반환

${fn:replace(string, before, after)}
string문자열 중 before의 문자를 after문자로 치환

${fn:substringAfter(string, substring)}
string에서 substring이후부분 반환

${fn:substringBefore(string, substring)}
string에서 substring이전부분 반환

${fn:contains(string,substring)}
  substring를 포함하는지 여부(true, false)

${fn:containsIgnoreCase(string,substring)}
대소문자 구분없이 substring를 포함하는지 여부(true, false)

${fn:endsWith(string, suffix)}
string이 suffix로 끝나는지 여부(true, false)

${fn:startsWith(string, prefix)}
string이 prefix로 시작하는지 여부(true, false)

${fn:join(array, separator)}
array 컬랙션을 구분문자로 합쳐서 반환

${fn:length(item)}
컬랙션 길이(int) 반환

${fn:split(string, separator)}
string를 구분문자로 나누어 배열 반환


------------------------------------------------------------------------
# fmt
JSTL은 <fmt/>에서 이런한 메시지 부분을 지원해 주고 있다. 물론 지역화를 위해 지역에 맞는 시간을 맞춘다던지 하는 기능역시 있지만, 필자는 이부분은 크게 사용하지 않을 것으로 예상되 메시지에 관한 부분만 다루고자 한다.(혹은 차후 수정하여 업데이트 하거나 새로운 포스트로 작성할 예정이다. 어쨋든 지금 알아볼 사항은 <fmt/>의 메시지부분이다.)

JSTL API : http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html


먼저 선언은 다음과 같다.
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" 
  2.     pageEncoding="UTF-8"%>  
  3. <%@ taglib prefix="c"   
  4.     uri="http://java.sun.com/jsp/jstl/core" %>  
  5. <%@ taglib prefix="fmt" 
  6.     uri="http://java.sun.com/jsp/jstl/fmt" %>  

기타 설정에 관해선 이전 포스트를 참조하면 될 것이다.

먼저 .properties파일이 있어야 한다. 샘플로 사용하기 위해 간단한 파일을 다음과 같이 작성해 보자.
pupustory.welcome= hello {0} !! your message_{1}
pupustory.msg.sample=한글도 잘되나 보는거에요.
pupustory.msg.user.help=도움이 필요하면 .. 알아서 찾아서 하시라능..
파일명은 msg.properties로 하겠다. properties에 대한 정보는 우측에 있는 검색에 properties로 나오는 포스트를 참조하면 된다.(전에 포스트 해뒀음..!)

이제 어디다 저장할까 ..? 설마 c:\project\...등에 저장할 생각이라면.. 관두길 바란다. 우리는 웹어플을 하고 있으므로 WEB-INF에 있어야 할 것이다. 그리고 위치는...? .properties는 일반 소스처럼 관리하면 된다. 예를들어 패키지 구성이 pupustory. ... ... ... 과 같이 되어있다면 pupsutory.message 이런식으로 패키지를 만들고 하위에 위 내용의 msg.properties를 넣으면 된다.

<fmt:setBundle basename="" scope="" var="" />
먼저 properties를 불러오는 코드는 위와 같다. basename는 경로를 의미하는데 위에 설명한데로 소스와 같이 관리되므로 pupustory.message.msg로 하면 된다.(.properties는 넣지말자!)  var는 지겹게 봐왔지만 사용할 변수다. 이제 var의 이름으로 접근해 메시지를 불러올 것이다.

<fmt:message bundle="" key="" var="" scope=""/>
bundle는 위에 지정한 properties의 변수 명이다. key는 내가 찾고자 하는 메시지를 의미한다.

<fmt:param value="">
properties에 파라미터를 던져 지정된 값을 설정한다. 위 properties에서 {0}부분에 여기에 해당된다. 파라미터값을 던지면 {0}가 바뀌어 반환 될 것이다.
  1. <fmt:setBundle var="msg_prop" basename="pupustory.jstl.msg" />  
  2. <fmt:message bundle="${msg_prop}" key="pupustory.welcome">  
  3.  <fmt:param value="pupustory" />  
  4.  <fmt:param value="my message" />  
  5. </fmt:message><br />  
  6. <fmt:message bundle="${msg_prop}" key="pupustory.msg.sample" /><br />  
  7. <fmt:message bundle="${msg_prop}" key="pupustory.msg.user.help" /><br />  

fmt:parseDate : String 형을 받아서 워하는 포멧으로 자료형을 Date 형태로 변경 시켜 준다.
fmt:formatDate : Date 형을 받아서 원하는 포멧으로 날짜 형태를 변경시켜 준다.

 ex)
<fmt:parseDate value="${applDt}" var="dateFmt" pattern="yyyymmdd"/>
<fmt:formatDate value="${dateFmt}" pattern="yyyy-mm-dd"/>

위에 작성한 코드대로 잘 나올 것 이다.

만약 한글이 깨진다면 ...? 대부분 properties파일이 아니라 그럴 수 있다. 만약 한글로 작성하고 txt파일로 그냥 저장 후 확장자만 바꾸게 되면 당연히 깨지게 된다. JVM은 유니코드로 구성되어 있는데 당연히 유니코드로 된 문자만 제대로 출력되기 때문이다. 이럴경우엔 뭐 ..native2ascii 이전파일 새로운파일 <--로 변경하는 방법이나 .. new Properties().store()...를 이용하는 방법이 있을 수 있다.

앞에서 얘기한데로 국제화에 맞추려고 사용하는것에 메시지라고 했다. 그렇다면 국가가 바뀌게 되면 ..? 이것은 하나의 형식이 존제 하는데 <fmt:setLocale value="" />로 설정하게 된다.

예를들어 한국어와 영어 두개의 언어를 지원한다면 파일을 msg_ko.properties , msg_en.properties로 작성하고 이용하면 된다. 페이지에선 <fmt:setLocale value="ko" />등의 방법으로 미리 설정해 주면 되는데, 영어로 바뀌게되면 value부분만 변경해 주면 된다.

------------------------------------------------------------------------

# xml

xml을 이용하기 위한 JSTL tlb 사용법을 알아보자. 지금까진 별도의 .jar없이(JSTL관련 제외)사용했지만 xml 이용을 위해선 xalan.jar를 추가해야 한다. 만약 추가 하지 않으면 다음과 같은 문제를 발견할 것이다.

root cause

java.lang.NoClassDefFoundError: org/apache/xpath/XPathException

따라서 먼저 xalan.jar를 설치해야 한다.
JSTL xml 사용을 위한 xalan.jar 추가방법
1. xalan.jar 라이브러리를 다운로드 2. 프로젝트에 xalan.jar 추가

추가된 xalan.jar 보기


<x:parse doc="" filter="" scope="" scopeDom="" systemId="" var="" varDom="" xml=""> body </x:parse>
Dom이 분은 부분은 Dom으로 이용하는 의미고 .. var는 파싱된 xml 변수이다. 만약 외부에서 가져오는 부분이 있다면 jstl core부분에서 다룬 <c:import url="" var="xml"/>로 포함시킨 뒤 이것을 파싱해야 한다. <x:parse xml="$xml" />의 식으로 사용하면 된다. 만약 직접 작성되는 xml이라면 body부분에 직접 작성할 수도 있다.(<x:parse var="xmldata"> <root></root></x:parse>)

filter는 org.xml.sax.XMLFilter인스턴스를 지정하여 파싱 전 문서를 걸러낸다. 이부분은 필자도 구체적으로 사용한바 없어 추가설명은 넘어가겠다.
  1. <x:parse var="xmldata">  
  2. <root><user>  
  3.   <name att="히히히">pupustory</name>  
  4.   <age>27</age>  
  5.   <email>pupustory@gmail.com</email>  
  6.   <name att="헤헤헤">yaho</name>  
  7.   <age>26</age>  
  8.   <email>yaho@myemail.com</email>  
  9.   </user>  
  10.   <user>  
  11.   <name att="호호호">hehe</name>  
  12.   <age>16</age>  
  13.   <email>hehe@myemail.com</email>  
  14.   <name att="후후후">hihi</name>  
  15.   <age>17</age>  
  16.   <email>hihi@myemail.com</email>  
  17.  </user>  
  18. </root>  
  19.  </x:parse>  
  20. <x:set select="count($xmldata//*/name)" var="values"/>  


<x:set var="" select="" scope=""/>
위 예제코드에서 사용한데로 select를 통해 저장된 xml정보를 변수에 저장 했다. 여기서 jstl의 xml은 select를 통해 변수를 선택 하는데 count()는 xml부분에서 사용하는 '함수'로 선택된 노드의 갯수를 가져온다.

따라서 위 코드의 name노드는 총 4개이므로 4라는 값이 변수에 저장된다. 노드번호 접근은 배열과 마찬가지로 []로 접근하는데 시작은 1부터 시작한다.(자세한건xml관련 자료 참조) count()와 같은 함수는 여럿 있는데 그중 last()는 마지막 노드를 지정함을 의미한다.

xml에 접근하는데 있어 파싱된 변수 xmldata에 $xmldata/로 접근하는데 /가 한개 더 온 것은 루트노드(xml에서 말하는 root node)를 의미하고, *은 모든 노드를 의미 한다.

일반적으로 노드접근은 상단의 예제처럼 하고, 속성에 대한접근은 @로 이용하는데 위 예제에서 name부분에 att라는 속성이 있다. 만약 att속성 내용을 모두 출력하고자 한다면 다음과 같은 방식을 이용하면 된다.
<x:forEach select="$xmldata//*[name()='name']" var="node">
<x:out select="@att"/>
</x:forEach>
[name()='']부분은 엘리먼트 이름을 의미한다. 위에서 name엘리먼트 이므로 name를 적었다. 출력부분에 "@att"부분은 편리하게도 node값의 속성중(@가 붙었으므로) att인값을 가져온다는 의미이다. 모든 노드의 속성과 차일드 노드의 값도 저런식으로 접근하여 출력할 수 있다.

<x:forEach select="$xmldata//*[name='pupustory']" var="node">
<x:out select="age"/>
<x:out select="email"/>
</x:forEach>

이것은 루트노드에서 모든노드 중 가지고 있는 name노드가 'pupustory'인 값을 가져오는 것 이다. 노드 검색의 경우 [name()='nodename']로 사용하지만 노드가 갖고있는 값은 위와 같은 방식으로 접근 한다. 마찬가지로 속성값을 검색할 경우엔 [@att='']로 사용하면 된다.

name노드가 pupustory인 값은 단 하나이므로 forEach는 한번만 돌고, 노드 age와 email를 출력하는 부분이다.
<x:forEach select="" begin="" end="" step="" var="" varStatus=""></x:forEach>

<x:if select="" var="" scope=""></x:if>

<x:out select="" escapeXml="" /x:out>

<x:choose>


<x:when select=""> body1</x:when>


<x:when select="">body 2</x:when>


<x:otherwise>other body </x:otherwise>


</x:choose>


모두 core부분에서 다룬 내용이므로 별도의 설명은 않하고 스펙만 나열 하였다. 역시 xml에서 가장 큰 문제는 어떻게 노드값을 가져오냐 가 아닐까 싶다. 무엇보다 xml에서 사용한 부분은 출력시 core부분이 아닌 xml부분으로 사용해야 한다는 점이다. 필자는 멍청하게도(..)<c:out/>로 구성했다 계속 null값이 나와 애먹었는데 .. <x:out/>를 이용하라고 해서 해보니 .. 문제 없다 --b



------------------------------------------------------------------------
# sql


  1. <%@ page language="java" contentType="text/html; charset=UTF-8" 
  2.     pageEncoding="UTF-8"%>  
  3. <%@ taglib prefix="c"   
  4.     uri="http://java.sun.com/jsp/jstl/core" %>  
  5. <%@ taglib prefix="sql" 
  6.     uri="http://java.sun.com/jsp/jstl/sql"%>  
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   
  8.     "http://www.w3.org/TR/html4/loose.dtd">  
  9. <html>  
  10. <head>  
  11. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  12. <title>JSTL</title>  
  13. </head>  
  14. <body>  
  15. <sql:setDataSource  
  16.  var="db" 
  17.  driver="oracle.jdbc.driver.OracleDriver" 
  18.  url="jdbc:oracle:thin:@127.0.0.1:1521:xe" 
  19.  user="pupustory" 
  20.  password="stares" 
  21. />  

<sql:setDataSource
 driver    ="expression"
 password  ="expression"
 user      ="expression"
 url       ="expression"
 var       ="expression"
 scope     ="expression"
 dataSource="expression"
/>
JSTL의 sql은 말 그대로 sql을 사용하기 위해 지원하는 테그 라이브러리 이다. 먼저 db를 사용하기 위해선 커넥션이 필요한데 .. 여기선 데이타소스를 통해 db에 접근 한다. 속성부분들이 워낙 많이 알려진 부분이니 넘어가고 .. 데이타소스를 사용하는(scope영역에서)부분은 var로 지정한다. 역시 el을 통해 지정된 var에 접근해 쿼리를 수행 한다.

<sql:query
dataSource=""
var=""
startRow=""
maxRows=""
scope=""
sql=""
/>
기본적인 sql쿼리를 수행하는 부분이다. 이것은 update나 insert부분이 아닌 단순 질의에 대한 부분이다. dateSource는 상단에서 지정한 데이타소스 변수를 적어주고, var엔 수행 후 레코드를 map으로 받게 된다. sql은 쿼리 수행 구문인데 여기에 적거나 아니면 <sql:query> write query </sql> 형식으로 사용 가능하다.

  1. <sql:query var="record" dataSource="${db}">  
  2.  select * from dual  
  3. </sql:query>  
  4.  
  5. <c:set var="values" value="${record.rows[0]}"/>  
  6. <c:out value="${values}" />  


map배열이므로 [0]통해 첫번째에 접근했고, 사용자가 경우에 따라 forEach를 통한 리스트 출력도 가능하다. map형식이므로 접근하는 key는 컬럼명이 된다.

<sql:update dataSource=""
 scope=""
 sql=""
 var=""/>
iBATIS에선 update, insert가 구분되어 있고, 통합적으로 사용하는 statment가 있지만 jstl sql에선 조회를 제외한 모든것은 update에서 처리 된다. 물론 테이블 생성역시 update를 이용 한다.

<sql:transaction
 dataSource=""
 isolation=""
/>
sql수행이므로 당연히 트랜잭션을 지원 한다. 속성도 생각보다 간단하다. isolation는 트랜잭션의 레벨을 의미하는데 .. 구채적으로 사용해보지 않았다. --; (다른 블로그나 정보를 참조하세요 !) dataSource부분은 위와 같은 형식이지만, 트랜잭션에 사용되는 update같은 부분에 별도의 dataSource를 작성하지 않는다. 만약 작성한다면 Illigal을 만나게 된다.

이제 직접 위의 소스를 모두 한번에 확인할 수 있는 소스를 만들어 보겠다.
  1. <sql:setDataSource  
  2.  var="db" 
  3.  driver="oracle.jdbc.driver.OracleDriver" 
  4.  url="jdbc:oracle:thin:@127.0.0.1:1521:xe" 
  5.  user="pupustory" 
  6.  password="stares" 
  7. />  
  8.  
  9. <!-- 생성,삽입,수정은 모두 sql:update를 사용 함 -->  
  10. <!-- 테이블 생성 -->  
  11.  
  12. <sql:update  dataSource="${db}">  
  13.  create table jstl_test ( 
  14.  id varchar(12),name varchar(20))  
  15. </sql:update>  
  16.  
  17. <!-- 생성 테이블에 데이타 삽입(인자 없음) -->  
  18. <sql:update dataSource="${db}">  
  19.  insert into jstl_test values('1','pupustory')  
  20. </sql:update>  
  21.  
  22. <!-- 생성 테이블에 데이타 삽입(인자 있음) -->  
  23. <sql:update dataSource="${db}">  
  24.  insert into jstl_test values(?,?)  
  25.  <sql:param value="2" />  
  26.   <sql:param value="pupustory" />  
  27. </sql:update>  
  28. <!-- 삽입 데이터 조회 -->  
  29. <sql:query var="record" dataSource="${db}">  
  30.  select * from jstl_test  
  31. </sql:query>  
  32.  
  33. <c:forEach var="value" items="${record.rows}">  
  34.  <c:out value="${value.id}" />  
  35.  <c:out value="${value.name}" />  
  36.  <br />  
  37. </c:forEach>  
  38. <!-- 트랜잭션 샘플 시작 -->  
  39. <sql:transaction dataSource="${db}">  
  40.  <sql:update >  
  41.  insert into jstl_test values('3','pupustory')  
  42. </sql:update>  
  43.  
  44. <sql:update >  
  45.  insert into jstl_test values('4','pupustory')  
  46. </sql:update>  
  47. <!-- 여기서 문제가 발생해 위 데이터 삽입 안됨 -->  
  48.  <sql:update >  
  49.  update jstl_test set  
  50.   name='컬럼크기이상의데이터삽입시도121111122222222222222' where id='4' 
  51. </sql:update>  
  52. </sql:transaction>  
  53. <!-- 트랜잭션 샘플 끝 -->  

테이블 생성 -> 로우 삽입 -> 등록 로우 정보 확인 -> 트랜잭션 이용 -> 문제가 발생해 추가삽입부분 무시되고 Exception발생 의 프로세스이다.

사실 sql은 잘 사용할지 의문이다. 물론 외부의 dataSource를 받아와 사용할 수 있다지만 .. 이건 고전적인 방식이므로, 요즘 지겹도록 듣는 MVC에는 맞지 않는듯 하다.

논 외의 얘기지만 .. sql을 보면서 느낀 것 인데 .. (사실 이와 관련 없지만) 초보중의 초보인 필자 생각으론 .. 이것도 어떨때 쓸만할 지도 모른다는 생각을 한다. 예를들어 한 화면에 5만개의 레코드를 출력한다면 .. dao에서 5만개의 bean을 작성해야 할 것이다. 차라리 이런거라면, db에서 가져옴과 동시에 출력하는 방식 어떨까도 싶다.


11 19, 2009 17:26 11 19, 2009 17:26

Trackback URL : http://develop.sunshiny.co.kr/trackback/339

Leave a comment

Jsp - Get, Post 넘길시 한글깨짐

Posted 11 16, 2009 18:42, Filed under: Language/ㅡ Jsp

◈ Tomcat에서 JSP파일의 한글깨짐 방지


1. Get방식으로 넘어가는 파라미터 한글인코딩하게 하는법


  위치 : 'C:\java\Tomcat 5.5\conf\serverl.xml' 파일을 아래와 같이 변경.
         URIEncoding="euc-kr" 를 추가 삽입 한후 저장
         톰캣 재시작후 다시 확인 하면 됨.
  <Connector port="8080" maxHttpHeaderSize="8192"
      maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
      enableLookups="false" redirectPort="8443" acceptCount="100"
      connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="euc-kr" />


2. JSP에서 엑셀로 출력시 한글깨짐현상


    response.setHeader("Content-Disposition", "attachment; filename=export.xls");
    response.setHeader("Content-Description", "JSP Generated Data");
    response.setContentType("application/vnd.ms-excel");

    <meta http-equiv="Content-Type" content="application/vnd.ms-excel;charset=euc-kr">

    추가한다.


3. ContentType이"Text/html"이 아닐때 한글 인코딩(예 contentType="image/gif")


     String aa = "한글~!!";
     aa = new String(aa.getBytes("8859_1"),"euc-kr");
     g.setFont(new Font("Gulim", Font.ITALIC, 15));
     g.drawString("HelloWorld~!!", 10, 50);
     g.drawString(aa, 10, 80);


4. jsp 페이지상단에 <%@ page contentType="text/html;charset=euc-kr" %>삽입


5. Post로 넘어온값 위에 아래 문장 선언(단 ,get 방식은 지원안함) 

                               
    request.setCharacterEncoding("euc-kr");

11 16, 2009 18:42 11 16, 2009 18:42

Trackback URL : http://develop.sunshiny.co.kr/trackback/334

Leave a comment



데코레이터 설정 페이지(jsp) 의 <body onload="" 에 데코레이터 속성을 가져오는 문구를 넣어주어야 함.
예)
# 데코레이터 설정 페이지 :
<body onload="<decorator:getProperty property="body.onload" />" style="<decorator:getProperty property="body.style" />"  topmargin="0" leftmargin="0">
  <decorator:body />
 </body>

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
  <script type="text/javascript" language="javascript">
  <!--
   var contextPath = "${contextPath}";
  //-->
  </script>
  <script type="text/javascript" src="${pageContext.request.contextPath}/js/common/prototype.js"></script>
  <script type="text/javascript" src="${pageContext.request.contextPath}/js/common/common.js"></script>
  <script type="text/javascript" src="${pageContext.request.contextPath}/js/common/menu.js"></script>
  <decorator:head />
  <title><decorator:title /></title>
 </head>
 <body onload="<decorator:getProperty property="body.onload" />" style="<decorator:getProperty property="body.style" />"  topmargin="0" leftmargin="0">
  <decorator:body />
 </body>
</html>

# 적용 페이지의 body 부분
<body style="margin-left:0;margin-top:0;background-image:url(${pageContext.request.contextPath}/img/bg.gif)">


05 7, 2009 17:00 05 7, 2009 17:00

Trackback URL : http://develop.sunshiny.co.kr/trackback/209

Leave a comment

Jsp - EL 함수 정의 하여 사용

Posted 05 3, 2009 14:10, Filed under: Language/ㅡ Jsp

### 로직 구현 클래스 파일
package kr.co.sunshiny.tld;

public class DiceRoller {
        public static int rollDice(){
                return (int)((Math.random() * 10) + 1);
        }
}


### tld 정의 파일
위치 : tld파일 위치는 WEB-INF/ 하위에 존재 하도록설정 
예)WebContent/WEB-INF/conf/tld/
# 애플리케이션이 배포될때, 컨테이너는 WEB-INF와 그 하위 디렉토리를 뒤져서 tld 파일을 모두 찾음.
# (JAR 파일일 경우 WEB-INF/lib). 파일을 찾으면 "이 이름을 가진 URI를 가진 TLD의 실제 파일은 어느 위치에 있다"와 같이 맵정보를 만듬.

<?xml version="1.0" encoding="ISO-8859-1" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="htttp://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
        <tlib-version>1.2</tlib-version>
        <uri>DiceFunctions</uri>
        <function>
                <name>rollIt</name>
                <function-class>kr.co.sunshiny.tld.DiceRoller</function-class>
                <function-signature>
                        int rollDice()
                </function-signature>
        </function>
</taglib>


### jsp 에서 사용
  <%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
   
<%@ taglib prefix="mine" uri="DiceFunctions" %>  
   
<!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>
       
rollIt() : ${mine:rollIt()}<br/>       
       
</body>
</html>
05 3, 2009 14:10 05 3, 2009 14:10

Trackback URL : http://develop.sunshiny.co.kr/trackback/208

Leave a comment

Jsp - HttpServlet 기본적인 요청 방법

Posted 05 3, 2009 12:27, Filed under: Language/ㅡ Jsp

### web.xml

<?
xml version="1.0" encoding="ISO-8859-1"?>

<web-app 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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

  <display-name>Webdav Content Management</display-name>
  <description>
     Webdav Content Management
  </description>

   <servlet>
    <servlet-name>simple</servlet-name>
    <servlet-class>jsp.controller.SimpleController</servlet-class>
  </servlet>

  <servlet>
    <servlet-name>actionServlet</servlet-name>
    <servlet-class>jsp.controller.ActionServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>actionServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file/>
  </welcome-file-list> 

</web-app>


### Controller
package jsp.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;

public class SimpleController extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{
                // 모든 요청과 응답을 processRequest 메소드로 받음
                this.processRequest(request, response);
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{
                this.processRequest(request, response);
        }
        // 사용자 정의 요청을 처리 하는 내부 메소드
        private void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
                System.out.println("요청 들어옴");
                //1. 요청분석
                String type = request.getParameter("type");
                /**
                 *  ?type=date
                 *  ?type=greeting
                 *  3. 
                 */
                //2. 요청에 맞는일 수행

                Object resultObject = null;
                if(type == null){
                        resultObject ="type == null ";
                        //  equals 에서 type의 값이 null 이면 자동으로 에러
                }else if(type.equals("greeting")){
                        resultObject = "안녕하세요 ~!";
                }else if(type.equals("date")){
                        resultObject = new java.util.Date();
                }
                //3. 결과를 request에 객체 setAttribute 한다.
                request.setAttribute("result", resultObject);
                //            4. view(JSP) 선택후에 view 로 forwording......
                RequestDispatcher dispatcher = request.getRequestDispatcher("/simpleView.jsp");
                dispatcher.forward(request, response);
        }      
}



### jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
        Object result = request.getAttribute("result");
%>
<h1> SimpleController로 부터 받은 데이타 </h1>
<hr>
<!-- toString 이 자동으로 호출됩 -->
<%=result %>
</body>
</html>
05 3, 2009 12:27 05 3, 2009 12:27

Trackback URL : http://develop.sunshiny.co.kr/trackback/207

Leave a comment

JSTL - 태그 라이브러리 API

Posted 04 10, 2009 10:26, Filed under: Language/ㅡ Jsp

http://java.sun.com/products/jsp/jstl/reference/api/index.html



JSTL ( JSP Standard Tag Library )

태그를 사용한 JSP 페이지에서 사용된 일단의 루틴 프로그램 JSP 태그를 라이브러리 형태로 모든 프로그래머가 공통으로 사용하도록 모아 놓은 것이다 이와 대조적으로 프로그래머가 재사용하기 위해 미리 정해 놓고 사용하는 JSP 커스텀 태그도 있다. 일반적으로 사용하는 JSP 태그를 표준화 시킨것. 아래와 같은 것이 많이 사용된다.


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

functions ::  http://java.sun.com/jsp/jstl/functions::  fn




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

위와같이 JSP 파일에 선언해주면 되는데 하기전에 라이브러리 파일과 tld 파일을 설치해 줘야한다.

- JSTL 설치하기

1. JSTL 다운로드

JSTL 은 아래 두사이트에서 다운로드 할수있다.

  --> 여기서 다운로드를 해봤는데 모든 툴들이 하나로 통합되어 진거 같다.
        JSTL 만 따로 받고싶은 나로선 별로 내키진 않았다.

2) http://apache.org 
  --> 여기서는 jakarta-taglibs-standard-1.1.2.zip 파일을 받으면 된다.
 


2. 설치


  - WEB-INF/lib 디렉토리에 jstl.jar 와 standard.jar 파일을넣는다.
  - WEB-INF/tld 에다가 tld 폴더를 복사한다.

3. WEB.XML 설정


  --> 처음에 uri="http://java.sun.com/jstl/core" 라고 쓰는걸 보고 sun 에서 해당 url 을 지원해 주는줄 알았으나 그게 아니고 WEB.xml 파일에 아래와같이 설정해 줘야지 쓸수 있는것이다.


             <taglib>
                           <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
                           <taglib-location>/WEB-INF/tld/c.tld</taglib-location>
             </taglib>
 
             <taglib>
                          <taglib-uri>http://java.sun.com/jstl/xml</taglib-uri>
                          <taglib-location>/WEB-INF/tld/x.tld</taglib-location>
             </taglib>
 
             <taglib>
                           <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
                          <taglib-location>/WEB-INF/tld/fmt.tld</taglib-location>
             </taglib>


4. JSP 선언


  --> 위에서 말한것처럼 JSP 파일에는 아래와같이 선언해주면 된다.

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



- EL(Expression!! Language) 내장객체


pageScope
  ::  page 범위에 포함된 속성 값에 접근
requestScope  ::  request 범위에 포함된 속성값에 접근
sessionScope ::  session 범위에 포함된 속성값에 접근
applicationScope  ::  application 범위에 포함된 속성값에 접근
param  ::  request.getParameter("aa")와 동일한 기능. 사용은  $(param.aa)
paramValues  ::  request.getParameterValues의 기능. $(paramValues.aa)
header  ::  request.getHeader('aa") 와 동일.  $(header.aa)
headerValues  ::  request.getHeaderValues("aa")와 동일 $(headerValues.aa)
initParam  ::  컨텍스트의 초기화 파라미터값
cookie  ::  쿠키 정보에 접근
pageContext  :: PageContext 객체



04 10, 2009 10:26 04 10, 2009 10:26

Trackback URL : http://develop.sunshiny.co.kr/trackback/196

Leave a comment


1. 일반적인 것

<c:out>

• JSP 의 표현식을 대체

• 간단한 출력에 사용
• out 태그 속성

속성  필수 기본값  설명
value  Y 없음 출력할 내용이나 표현식
default N tag body 에
있는 내용
value 값에 내용이 없는 경우 출력할 내용으로
태그 바디 혹은 속성값 형태로 올수 있음
escapeXml N true 출력할 내용에 <,>,&,’,” 등의 문자를 일반 문자로
변환할지 결정
예) 출력될 내용이 html tag를 포함하면 값을
     false로 해야 태그가 반영된 내용이 화면에 보임.
     만일 true로 하면 태그가 화면에 그대로 보임

• out 태그 형식

body 없는 경우

<c:out value="value" [escapeXml="{true|false}"] [default="기본값"] />

 

body 있는 경우

<c:out value="value" [escapeXml="{true|false}"] />

    기본값

</c:out>


<c:set>

• EL 변수에 값을 설정
• 객체의 멤버 변수값 설정

• 변수에 값을 할당

• value가 null 이면 var에 있는 속성은 제거된다.

• target 표현식이 null이면 컨테이너는 예외사항을 던진다.
• 빈과 같은 객체에 할당하기 위해서는 target 과 property속성을 이용

• scope 속성이 생략될 경우 기본값은 page

• set 태그 속성

속성  필수 기본값  설명
value N 없음 저장할 변수값
target N 없음 값이 저장될 객체명
property N 없음 target 객체의 멤버 변수명
var N 없음 값이 저장될 변수명
scope N page 값이 저장될 범위(page, session, request, application)

• set 태그 형식

Syntax 1: scope 에 해당하는 변수에 속성 값을 정한다.

<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>


Syntax 2: scope 에 해당하는 변수에 body 값을 정한다.

<c:set var="varName" [scope="{page|request|session|application}"]>

    body content

</c:set>


Syntax 3: 속성 값으로 target 객체의 프로퍼티 값을 정한다.

<c:set value="value" target="target" property="propertyName"/>


Syntax 4: body 값으로 target 객체의 프로퍼티 값을 정한다.

<c:set target="target" property="propertyName">

    body content

</c:set>


<c:remove>

• 해당 scope 의 변수(객체) 삭제

• JSP 의 removeAttribute() 와 같은 역할을 한다.

• 해당 scope 에 있는 변수를 제거하는 역할을 한다.

• remove 태그 속성

속성  필수 기본값  설명
var Y 없음 삭제할 변수명
scope N 모든 범위 삭제할 범위

 

<c:catch>

 body 위치에서 실행되는 코드의 예외를 잡아내는 역할을 담당한다.

 var 속성을 지정해서 변수를 선언하면 그 변수에 예외의 내용이 들어가게 된다.



2. 조건

<c:if>

• 조건이 맞는 경우 태그 바디부분 처리.
• 자바의 if 와 유사하지만 else 는 지원하지 않음.

• <c:if> 에서 나온 결과를 varName 변수에 넣고, 나중에 활용이 가능하다.

• 변수의 scope는 임의로 지정할 수 있고, 생략될 경우 기본값은 page 이다.

• if 태그 속성

속성  필수 기본값  설명
test Y 없음 검사할 조건
var Y 없음 test 조건의 결과를 저장할 변수
scope N 모든 범위 변수가 저장될 범위

• if 태그 형식

Syntax 1: Body 없는 경우

<c:if test="testCondition"

var="varName" [scope="{page|request|session|application}"]/>

 

Syntax 2: Body 있는 경우

<c:if test="testCondition"

[var="varName"] [scope="{page|request|session|application}"]>

body content

</c:if>

 

<c:choose>,<c:when>,<c:otherwise>

• switch 문과 유사한 기능.

조건에 문자열 비교도 가능하고 쓰임의 범위가 넓다. 또한 <c:if> 태그에 else 가 없기 때문에 이

   의 대체 기능도 수행한다.
• 하나의 choose 태그에는 여러 개의 when 태그가 존재.

• <c:when> 속성값

속성  필수 기본값  설명
test Y 없음 검사할 조건

• 형식

<c:choose>

    body content

    (하나 이상의 <when> 과 하나 이하의 <otherwise> 서브태그)

    <c:when test="조건">

        body content

    </c:when>

   

    <c:otherwise>

        conditional block

    </c:otherwise>

</c:choose>



3. URL 관련

<c:import>

 웹 어플리케이션 내부의 자원 접근은 물론이고, http, ftp 같은 외부에 있는 자원도 가져와

  서 페이지 내에 귀속시킨다. 자유롭게 가공할 수도 있고, 편집도 가능하다.


Syntax 1: 해당 주소를 바로 출력하거나 String 에 담아놓는다.

<c:import url="url" [context="context"]

        [var="varName"] [scope="{page|request|session|application}"]

        [charEncoding="charEncoding"]>

   <c:param> 서브 태그 위치

</c:import>

 

Syntax 2: 해당 주소의 컨텐츠를 Reader 객체로

<c:import url="url" [context="context"]

        varReader="varReaderName"

        [charEncoding="charEncoding"]>

    varReader 를 사용하는 액션

</c:import>

 

<c:url>

 컨텍스트를 자동으로 추가해서 주소를 자동으로 생성해준다.

context 속성이 지정되었을 경우 value 와 context 의 값은 / 로 시작을 해야된다.

context 속성이 생략되면 당연히 현재의 컨텍스트가 적용된다.

URL 재작성도 가능하다.

 

Syntax 1: Body 없는 경우

<c:url value="value" [context="context"]

        [var="varName"] [scope="{page|request|session|application}"]/>

 

Syntax 2: Body 있는 경우 쿼리 스트링 파라메터 지정

<c:url value="value" [context="context"]

        [var="varName"] [scope="{page|request|session|application}"]>

    <c:param> 서브태그

</c:url>


<c:redirect>

response.sendRedirect() 를 대체하는 태그이다.

컨텍스트를 지정해서 다른 컨텍스트로 이동이 가능하다.

<c:url/> 태그와 마찬가지로 context 속성을 지정하면, value 와 context 의 값은 / 로 시

  작을 해야된다.

 

Syntax 1: Body 없는 경우

<c:redirect url="value" [context="context"]/>

 

Syntax 2: Body 있는 경우 쿼리 스트링 파라메터 지정

<c:redirect url="value" [context="context"]/>

    <c:param> 서브태그

</c:redirect>

 

<c:param>

<c:param/> 은 다음과 같이 url 에 바로 붙여서 쓸 수도 있다.


<c:import url="/exec/doIt">

  <c:param name="action" value="register"/>

</c:import>

이 방법은 아래 태그와 같은 효과가 있다.

<c:import url="/exec/doIt?action=register"/>


4. 반복

<c:forEach>

원하는 구간만큼 반복할 수도 있고, 객체를 받아와서 그 객체의 길이만큼 반복할 수도 있다.

begin , end 속성은 시작번호와 끝번호를 지정하고, step 속성을 이용해서 증가 구간을 정할 수

   있다.

var 속성에서 정한 변수로 반복되는 내부 구간에서 사용할 수 있다.

• 컬렉션 객체 접근시 매우 유용함.
• forEach 태그 속성값

속성  필수 기본값  설명
items N 없음 반복을 위한 데이터를 가진 아이템의 Collection
begin N 0 반복 시작 번호
end N Collection 마지막 값 반복 끝 번호
step N 1 반복의 증가분
var N 없음 현재 아이템을 가지고 있는 변수
varStatus N 없음 반복 상태값을 가지고 있는 변수
• forEach 태그 형식

Syntax 1: 객체 전체에 걸쳐서 반복

<c:forEach [var="varName"] items="collection"

           [varStatus="varStatusName"]

           [begin="begin"] [end="end"] [step="step"]>

    body content

</c:forEach>


Syntax 2: 지정한 횟수만큼 반복

<c:forEach [var="varName"]

           [varStatus="varStatusName"]

           begin="begin" end="end" [step="step"]>

    body content

</c:forEach>

 

<c:forEachToken>

• forToken 은 반복문 + StringTokenizer 기능
• forToken 태그 속성값

속성  필수 기본값  설명
items N 없음 반복을 위한 데이터를 가진 아이템의 Collection
delims Y 없음 구분자(delimeter)로 사용할 문자
begin N 0 반복 시작 번호
end N Collection 마지막 값 반복 끝 번호
step N 1 반복의 증가분
var N 없음 현재 아이템을 가지고 있는 변수
varStatus N 없음 반복 상태값을 가지고 있는 변수

• forToken 태그 형식

Syntax

<c:forTokens items="stringOfTokens" delims="delimiters"

[var="varName"]

[varStatus="varStatusName"]

[begin="begin"] [end="end"] [step="step"]>

body content

</c:forEach>
03 12, 2009 09:39 03 12, 2009 09:39

Trackback URL : http://develop.sunshiny.co.kr/trackback/165

Leave a comment


Recent Posts

  1. Linux - Telnet 서비스 비활성및 실행
  2. NT - 서버 원격데스크탑 연결
  3. NT - http와 https간에 세션 공유가...
  4. Unix - 대량 파일 이동, 삭제시 Argu...
  5. Oracle - SYS_CONTEXT 함수를 이용하...

Recent Comments

  1. 네. 고맙습니다^^ 행복한 한해 보... sunshiny 01 16,
  2. sunshiny님. 안녕하세요... 올려 주... yihans 01 16,
  3. 답글 주셔서 고맙습니다^^ 소스 복... sunshiny 01 11,
  4. 관리자만 볼 수 있는 댓글입니다. 비밀방문자 01 11,
  5. 넵 답변감사합니다^^ 좋은 하루 되... 노로링

Recent Trackbacks

  1. 윈도우 cmd 명령어 팁 월풍도원(月風道院) - Delight on th... %M
  2. 파일 압축 Like RadioHead %M
  3. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   02 2012   »
      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      

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. Oracle All Documentation
  4. 엑셈
  5. 오라클 클럽
  6. 네이버개발자센터
  7. API - Java
  8. API - Spring
  9. Java Community
  10. Reference - Spring
  11. 스프링사용자
  12. 자바지기
  13. Ready System
  14. Solaris Freeware
  15. Linux-Site
  16. RedHat Korea
  17. 윈디하나의 솔라나라

Site Stats

TOTAL 217715 HIT
TODAY 17 HIT
YESTERDAY 115 HIT