1. JSTL
(1) JSTL ์ด๋?
JSP Standard Tag Library
JSP์์ ์๋ฐ ์ฝ๋ ๋ฌธ์ ํ๊ทธ ํํ๋ก ํํ ํ ๊ฒ
(2) ํ์ํ ์ด์ ?
JSTL ์ ์ฐ๊ณ JSP์์ ์๋ฐ ์ฝ๋ ๋ฌธ ์ฐ๋ ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ผ๋ก ์ธ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ์ฝ๋ ๋ฌธ์ด๋, EL ๋ฌธ์ด๋, ๊ทธ๋ฅ ๋ฌธ์์ด์ด๋ ๋ค ๋ฐ๋ก ๋๋ ์ ์จ์ผํ๋ค. ๋๋ฌด ๋ณต์กํ๋ค.
๊ทธ๋์ HTML ๋ฌธ ๋ต๊ฒ ์๋ฐ์ฝ๋๋ EL์ด๋ ๋ค ํ๊ทธ๋ฌธ๋ฒ์ผ๋ก ์ธ ์ ์๊ฒ ๋ฐ๊พผ ๊ฒ์ด๋ค.
(3) ์ฝ๋ ๋ฆฌ๋ทฐ
<%@ page contentType="text/html;charset=utf-8"%>
<!-- c ์ ๋์ฌ -> jstl์ core library๋ฅผ ์ฐ๊ฒ ๋ค. core library๋ ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ ๋์ฌ fmt์ ํ์ํ ์ถ๋ ฅ์ ์ฌ์ฉํ๊ฒ ๋ค. -->
<%@ 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>
<!--์ ์ธ ๋ฐ ์ด๊ธฐํ ๊ตฌ๋ฌธ to์ 10์ ๋์
-->
<c:set var="to" value="10"/>
<!--์ด๊ฑด ๋ฐฐ์ด ์ ์ธ ๋ฐ ์ด๊ธฐํ ๊ตฌ๋ฌธ-->
<c:set var="arr" value="10,20,30,40,50,60,70"/>
<!--for Each ๋ฌธ-->
<c:forEach var="i" begin="1" end="${to}">
${i}
</c:forEach>
<br>
<!--if ๋ฌธ test๋ ~๋ผ๋ฉด์ ๋ป
๋ฐฐ์ด์ด ๋น์ด์์ง ์๋ค๋ฉด~-->
<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>
<!--msg๋ก ๋ค์ด์ค๋ ๊ฐ์ด null์ด ์๋๋ผ๋ฉด-->
<c:if test="${param.msg != null}">
msg=${param.msg}
<!--c:out์ value์ ๋ด์ฉ์ ํ๊ทธ๋ ๊ทธ๋ฅ ์๋ ๊ทธ๋๋ก ์ ๋ถ ์ถ๋ ฅํ๋ผ๋ ๋ป-->
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>
(4) ์ค์ค๋ก ์จ๋ณด๊ธฐ
<%@ 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="${param.msg != null }">
msg=${param.msg }
msg=<c:out value="${param.msg }"></c:out>
</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>
2. Filter์ ๋ํด
(1) Filter์ ์กด์ฌ ์ด์
๊ฐ์ฒด์งํฅ ์ค๊ฒ์ 5๋ ์์น ์ค ์ฒซ๋ฒ์งธ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
๋ถ๋ฆฌ์ 3๊ฐ์ง ์ข ๋ฅ ์ค ๋ง์ง๋ง
๊ณตํต(์ค๋ณต) ์ฝ๋ ๋ถ๋ฆฌ๋ฅผ ํด์ฃผ๊ธฐ ์ํด์์ด๋ค.
(2) Filter๊ฐ ๋ ์๋ธ๋ฆฟ์ ์๋๊ตฌ์กฐ
๋ชจ๋ servlet์ด ๊ณตํต์ ์ผ๋ก ์ ์ฒ๋ฆฌ, ํ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋๋ค. ์ด๋ค์ด ํ๋ ์ญํ ์ ๊ฐ๋ค. ๋ฐ๋ผ์ ์ ์ฒ๋ฆฌ, ํ์ฒ๋ฆฌ๋ฅผ ํด์ค Filter๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ ๋ฝ์๋ธ๋ค.
Filter๋ ์ ์ฒ๋ฆฌ ํ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ ์์๋ ์๋ธ๋ฆฟ์ ํธ์ถํ์ฌ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๋ค ๊ทธ ํ ๋ค์ ํ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ๋ค.
์ ์ฒ๋ฆฌ ํ์ฒ๋ฆฌ๋
inint() ์ด๊ธฐํ ์์ , destroy() ์ ๋ฆฌ ์์ ๊ณผ ๋ค๋ฅธ ๊ฒ์ด๋ค.
์ ,ํ์ฒ๋ฆฌ๋ ์ฒ๋ฆฌ ์์ ์ค ํด์ผํ๋ ์๊ณผ ๋ค์ ๋ฃจํด์ด๋ค.
(3) ์ด์ค Filter์ธ ๊ฒฝ์ฐ
์์๋ F1์ ์ ์ฒ๋ฆฌ -> F1์ ๋ค์ ํํฐ ํธ์ถ -> F2์ ์ ์ฒ๋ฆฌ -> ์ ๋ณด์ฒ๋ฆฌํ ์๋ธ๋ฆฟ ํธ์ถ -> ๋ค์ F2๋ก ๋์์ F2๊ฐ ํ์ฒ๋ฆฌ > F1์ผ๋ก ๋์์ F2๊ฐ ํ์ฒ๋ฆฌ ํ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต.
(4) ์ฝ๋ ๋ฆฌ๋ทฐ
// ์ ์ฒ๋ฆฌ ํ์ฒ๋ฆฌ ํ๋ ์ผ -> ์ฒ๋ฆฌ ์์
์ด ๊ฑธ๋ฆฌ๋ ์๋ ์ฒดํฌ
// ์ ์ฒ๋ฆฌ ๋ ์์ ์๊ฐ์ ์ฒดํฌํ๊ณ ํ์ฒ๋ฆฌ์์ ๋๋ ์๊ฐ - ์์ ์๊ฐ ํด์ ์ผ๋ง๋ ๊ฑธ๋ ธ๋์ง ์ฒดํฌ
package com.fastcampus.ch2;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
// ํํฐ๋ฅผ ์ ์ฉํ ์์ฒญ์ URL ์ง์ - ๋ชจ๋ ์์ฒญ์ ๋ํด ์ด ํํฐ๋ฅผ ์ ์ฉ.
@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() {
// ์ ๋ฆฌ ์์
}
}
(5) ์ค์ค๋ก ์จ๋ณด๊ธฐ
package com.fastcampus.ch2;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
// ํํฐ๋ฅผ ์ ์ฉํ ์์ฒญ์ URL ์ง์ - ๋ชจ๋ ์์ฒญ์ ๋ํด ์ด ํํฐ๋ฅผ ์ ์ฉ.
@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.println("["+((HttpServletRequest)request).getRequestURI()+"]");
System.out.println("์์์๊ฐ=" + (System.currentTimeMillis()-startTime)+"ms");
}
@Override
public void destroy() {
// ์ ๋ฆฌ ์์
}
}