Java/Servlet & JSP

JSTL 사용하기 (1)

체리필터 2009. 3. 12. 17:36
728x90
반응형
jsp에서 스크립팅을 사용하지 않고 루프를 돌리거나 조건문을 실행하는 방법으로 사용하는 것이 JSTL이다.
JSTL을 사용하기 위해서는 다음과 같은 방법으로 설정을 해 줘야 한다.

apache-tomcat-6.0.18\webapps\examples\WEB-INF\lib 에 있는 jstl.jar 파일과 standard.jar 파일을 WebContent/WEB-INF/lib 밑으로 copy 한다.

위와 같이 하게 되면 jstl을 사용할 수 있다.
jstl을 사용할 수 있게 됬으므로 forEach 문을 돌려보자.
사용 방법은 php에서 사용하는 foreach 문과 별로 다를 바가 없다.

web.xml

  <servlet>
      <servlet-name>jstlTest</servlet-name>
      <servlet-class>com.example.jstlTest</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>jstlTest</servlet-name>
      <url-pattern>/Jstl</url-pattern>
  </servlet-mapping>


서블릿 코드

package com.example;

import java.awt.List;
import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class jstlTest extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        String[] movieList = {"Amelie", "Return of the King", "Mean Girls"};
        request.setAttribute("movieList", movieList);
       
        String[] movies1 = {"Matrix Revolutions", "Kill Bill", "Boondock Saints"};
        String[] movies2 = {"Amelie", "Return of the King", "Mean Girls"};
       
        ArrayList movieList2 = new ArrayList();
        movieList2.add(movies1);
        movieList2.add(movies2);
        request.setAttribute("movies", movieList2);
       
        RequestDispatcher view = request.getRequestDispatcher("jstlTest.jsp");
        view.forward(request, response);
    }
}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>Insert title here</title>
</head>
<body>
<table>
    <c:forEach var="movie" items="${movieList}" varStatus="movieLoopCount">
        <tr><td>${movieLoopCount.count} : ${movie}</td></tr>
    </c:forEach>
    <c:forEach var="listElement" items="${movies}" varStatus="listCount">
        <c:forEach var="movie" items="${listElement}" varStatus="movieCount">
            <tr><td>${listCount.count}, ${movieCount.count}, ${movie}</td></tr>
        </c:forEach>
    </c:forEach>
</table>
</body>
</html>

서블릿에서 배열이나 ArrayList에 담아서 request 객체에 담아 jsp로 forwarding을 넘긴다.
jsp에서는 "<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>"라고 taglib 지시자를 선언하고 아래 부분에 forEach문을 통해서 해당 내용을 출력한다.
forEach문에서 items를 통해서 서블릿에서 넘겨준 request의 속성을 사용할 수 있으며 배열이나 ArrayList의 각 속성은 var라고 선언한 이름에 담겨 사용되어 진다.
forEach문을 통해 루푸가 도는 동안에는 for문에서 사용되어지는 i와 같은 속성을 varStatus를 통해서 사용할 수 있다.

말로 주저리 주저리 설명하는 것보다 위 소스 코드를 직접 실행해 보는 것이 이해하는데 훨씬 도움이 될 듯 하다.
위 소스를 실행(http://localhost:8080/Jstl)해 보면 아래와 같이 출력된다.

1 : Amelie
2 : Return of the King
3 : Mean Girls
1, 1, Matrix Revolutions
1, 2, Kill Bill
1, 3, Boondock Saints
2, 1, Amelie
2, 2, Return of the King
2, 3, Mean Girls

jstl을 사용한 if문은 다음과 같이 사용할 수 있다.

서블릿 코드
String userType = "member";
request.setAttribute("userType", userType);

jsp 코드
<c:if test="${userType eq 'member'}">
    <jsp:include page="inputComments.jsp"></jsp:include>
</c:if>

test 문을 사용해서 조건부의 내용을 검사한다.
else 문은 따로 없으며 여러 조건 들 중을 검사하거나, else와 같은 경우를 처리하려면 choose, when, ohterwise를 사용하면 된다.

서블릿
String userPref = "safety";
request.setAttribute("userPref", userPref);

jsp 코드
<c:choose>
    <c:when test="${userPref == 'performance'}">
        Performance...
    </c:when>
   
    <c:when test="${userPref == 'safety'}">
        Safety...
    </c:when>
   
    <c:when test="${userPref == 'maintenance'}">
        Maintenance...
    </c:when>
   
    <c:otherwise>
        Otherwise...
    </c:otherwise>
</c:choose>

변수를 셋팅하기 위해서는 set을 사용한다. 사용 방법은 다음과 같다.

<c:set var="userLevel" scope="session" value="Cowboy"></c:set>
userLevel : ${userLevel}<br>
<c:set var="Fido" value="${person.dog}"></c:set>
<c:set var="userLevel" scope="session">
    Sheriff, Bartender, Cowgirl
</c:set>
userLevel : ${userLevel}<br>

<c:set target="${PetMap}" property="dogName" value="Clover"></c:set>
<c:set target="${person}" property="name">
    ${foo.name}
</c:set>

var로 셋팅하는 경우는 변수이며, target인 경우에는 빈이나 맵을 셋팅하게 된다. property는 빈인 경우 프로퍼티가, 맵인 경우에는 키가 된다.
value는 몸체가 없는 경우에는 value property를 사용해서 정의하면 되며, 몸체가 있는 경우에는 그냥 나열하면 된다. value는 꼭 문자열일 필요가 없으며, 객체를 사용할 수 있다.
value가 null일 경우에는 var나 target은 파괴된다.
target에는 실제 객체를 표현하는 표현식이 들어가야 한다. 빈이나 맵의 id 이름을 나타내는 문자열을 기입하면 안된다.

scope는 옵션이며, scope를 표기하지 않을 경우에는 page -> request -> session -> application(context) 순서대로 찾아 나간다. 4군데 모두 없다면, 새롭게 생성하게 된다.

셋팅된 변수를 제거하기 위해서 value를 null로 셋팅해도 되지만, remove 태그를 사용해서 사용하는 것이 정석이다.

<c:set var="userStatus" scope="request" value="Brilliant"></c:set>
userStatus : ${userStatus} <br>
<c:remove var="userStatus" scope="request"/>
userStatus : ${userStatus} <br>

결과물

Insert title hereuserStatus : Brilliant
userStatus :

다른 컨텐츠를 포함하는 jstl 태그는 다음과 같다.

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

현재까지 알아본 다른 컨텐츠를 포함하는 방법으로는 include 지시자와 표준액션, 그리고 jstl 태그를 사용하는 방법까지 총 3가지였다.

<%@ include file="Header.html" %>    //include 지시자
<jsp:include page="Header.jsp"></jsp:include>    //include 표준액션

include 지시자는 정적인 페이지를, include 표준 액션은 동적인 페이지를, 그리고 jstl import 태그는 동적인 페이지와 외부 서버에 있는 url 형식의 페이지까지 포함할 수 있다.
include 지시자는 정적인 페이지를 include 하므로 file이란 속성을 사용하며, 표준액션은 동적인 페이지를 include 하므로 page란 속성을 사용한다.
jstl import 태그는 외부 서버에 있는 페이지까지 include할 수 있으므로 url 이란 속성을 사용한다.

<jsp:include> 태그에서 파라미터 값을 넘길 경우 param 태그를 사용하였는데, 그와 같은 기능을 하는 jstl 태그도 있다.

<jsp:include page="Header.jsp">
    <jsp:param name="subTitle" value="We take the sting out of SOAP"/>
</jsp:include>

<c:import url="Header.jsp">
    <c:param name="subTitle" value="We take the sting out of SOAP"></c:param>
</c:import>

Header.jsp

<body>
subTitle : ${param.subTitle}
</body>

Insert title heresubTitle : We take the sting out of SOAP




728x90
반응형

'Java > Servlet & JSP' 카테고리의 다른 글

커스텀 태그 사용하기  (0) 2009.03.17
JSTL 사용하기 (2)  (0) 2009.03.16
템플릿 형태로 JSP 사용하기  (0) 2009.02.16
EL 함수 사용하기  (0) 2009.02.13
EL 사용하기  (3) 2009.02.12