[Spring] JSTL를 써보자

2024. 7. 13. 21:54WebBack/Spring

JSTL이란?

JSTL은 JSP Standard Tag Library로 다양한 태그가 정의되어 있는 라이브러리를 말한다. 예를 들어서,  아래 코드에서 c:if는 if문이고, c:forEach는 for문, c:choose, c:when, c:otherwise는 if와 else if문을 나타낸 것이다. c:접두사는 jstl의 코어 라이브러리를 사용하는 것을 의미한다. fmt는 형식화를 사용할 때 사용한다. 

<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="c"   uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
	<title>JSTL</title>
</head>
<body>
<c:set var="to"   value="10"/>
<c:set var="arr"  value="10,20,30,40,50,60,70"/> 
<c:forEach var="i" begin="1" end="${to}">
	${i}
</c:forEach>
<br>
<c:if test="${not empty arr}">
	<c:forEach var="elem" items="${arr}" varStatus="status">
		${status.count}. arr[${status.index}]=${elem}<BR>
	</c:forEach>
</c:if>	
<c:if test="${param.msg != null}">
	msg=${param.msg} 
	msg=<c:out value="${param.msg}"/>
</c:if>
<br>
<c:if test="${param.msg == null}">메시지가 없습니다.<br></c:if>
<c:set var="age" value="${param.age}"/>
<c:choose>
	<c:when test="${age >= 19}">성인입니다.</c:when>
	<c:when test="${0 <= age && age < 19}">성인이 아닙니다.</c:when>
	<c:otherwise>값이 유효하지 않습니다.</c:otherwise>
</c:choose>
<br>
<c:set var="now" value="<%=new java.util.Date() %>"/>
Server time is <fmt:formatDate value="${now}" type="both" pattern="yyyy/MM/dd HH:mm:ss"/>	
</body>
</html>

 

코드분석

왜 JSLT를 사용할까? JSP를 사용했을 때와 비교해보자. 

<%
	if(mgs != null){
%>
msg=${param.msg} //HTML코드
<%
	} else {
%>
메시지가 없습니다 //HTML코드
<%
	}
%>

 

 

JSP와 HTML 코드가 섞이면서 가독성이 매우 좋지 못하다. 즉, 블럭 구성이 깨지는 것을 방지하기 위한 방안이 바로 JSLT이다.  

 

EL은 지역변수를 사용하지 못하지만, c:set을 통해서 저장소에 저장하는 것이 가능하다. (형식: map) value뒤에는 scope="page"가 생략되어 있다. 이를 통해 페이지 컨텍스트에 저장이 가능하다. 

<c:set var="to"   value="10"/>
<c:set var="arr"  value="10,20,30,40,50,60,70"/>

 

아래 코드는 for문이다. 1부터 시작해서 변수 to까지(10)까지 출력한다. 

<c:forEach var="i" begin="1" end="${to}">
	${i}
</c:forEach>

 

아래는 if문과 배열 코드로, not empty arr은 "배열이 비어 있지 않으면"이란 뜻으로 if문 조건이다. items(arr : 10, 20, 30 ...)를 elem에 계속 집어넣는다. status는 count와 index를 가지고 있다. count는 1부터 시작하고, index는 0부터 시작한다. status.count를 통해 몇 번 실행되는지 알 수 있다. index는 status.index를 통해 배열 출력을 위해 사용되었다. 

<c:if test="${not empty arr}">
	<c:forEach var="elem" items="${arr}" varStatus="status">
		${status.count}. arr[${status.index}]=${elem}<BR>
	</c:forEach>
</c:if>

 

param은 파라미터를 말한다. URL에 "?msg=asdf"를 입력하면 msg=${param.msg}, msg=<c:out value="${param.msg}"/> 두 코드 모두 asdf를 출력한다. 차이점은 c:out은 URL에 <p></p>가 들어가있더라도 태그로 해석하지 않고 출력한다. out을 사용하면 자바스크립트 태그 명령을 넣어서 공격하는 것을 막을 수 있다는 장점이 있다. 

<c:if test="${param.msg != null}">
	msg=${param.msg} 
	msg=<c:out value="${param.msg}"/>
</c:if>

 

아래 코드도 크게 어렵지 않다. if문으로 파라미터를 확인하고 age에 따라 출력을 달리한다. 

<c:set var="age" value="${param.age}"/>
<c:choose>
	<c:when test="${age >= 19}">성인입니다.</c:when>
	<c:when test="${0 <= age && age < 19}">성인이 아닙니다.</c:when>
	<c:otherwise>값이 유효하지 않습니다.</c:otherwise>
</c:choose>

 

아래는 날짜를 출력하는 코드이다. 

<c:set var="now" value="<%=new java.util.Date() %>"/>
Server time is <fmt:formatDate value="${now}" type="both" pattern="yyyy/MM/dd HH:mm:ss"/>

필터란?

로깅, 인코딩 등 공통적인 요청 전처리와 응답 후처리에 사용되는 중복 코드를 제거하기 위해 사용된다. 필터에서 1. 전처리 2. 서블릿 호출 3. 후처리를 담당하면 서블릿은 처리만 하면 되어서 코드가 훨씬 간결해진다. 필터는 여러개 적용할 수 있다.  서블릿 호출은 고정이고 1이나 3은 하나만 있어도 상관없다. 

// 필터를 적용할 요청의 패턴 지정 - 모든 요청에 필터를 적용.
@WebFilter(urlPatterns="/*")
public class PerformanceFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// 초기화 작업
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 1. 전처리 작업
		long startTime = System.currentTimeMillis();

		// 2. 서블릿 또는 다음 필터를 호출
		chain.doFilter(request, response); 
		
		// 3. 후처리 작업
		System.out.print("["+((HttpServletRequest)request).getRequestURI()+"]");
		System.out.println(" 소요시간="+(System.currentTimeMillis()-startTime)+"ms");
	}

	@Override
	public void destroy() {
		// 정리 작업
	}

}

 

여기서 @WebFilter은 필터를 등록하는 애너테이션이다. 그리고 옆에는 어떤 요청에 필터를 적용할지를 적어주면 되는데 보통 URL패턴을 적용한다. "/*"는 모든 필터에 대해서 적용하라는 의미이다. el.jsp를 실행해보자. 

 

그러면 이렇게 소요시간이 출력된다. 그 외에도 다양한 URL로 접근해도 실행된다. 

'WebBack > Spring' 카테고리의 다른 글

[Spring] 반복 연습  (0) 2024.07.16
[Spring] RequestParam이란?  (0) 2024.07.14
[Spring] JSP 알아보기  (0) 2024.07.13
[Spring] 서블릿의 구조  (0) 2024.07.12
[Spring] 자바 버전을 바꿔보자  (0) 2024.07.09