JSP와 서블릿(4)

1.JSTL

(1) JSTL이란?

JSP 표준 태그 라이브러리

JSP에서 태그 형태의 Java 코드 명령어 표현

(2) 왜 필요한가?


JSTL을 사용하지 않고 JSP에서 자바 코드문을 작성하기 위한 기본 구문으로 사용한다면 위와 같이 코드문과 EL문, 문자열만 구분해야 한다.

너무 복잡합니다.

HTML 문과 마찬가지로 Java 코드 또는 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. 필터 정보

(1) 필터가 있는 이유

관심사의 분리는 객체 지향 설계의 다섯 가지 원칙 중 첫 번째입니다.

세 가지 유형의 분리 중 마지막 유형

공통(중복) 코드를 구분하기 위함입니다.

(2) 필터가 있는 서블릿의 동작 구조


모든 서블릿에는 전처리와 후처리가 공통적으로 있습니다.

당신의 역할은 동일합니다.

따라서 전처리 필터와 후처리 필터를 별도로 생성하여 추출합니다.

전처리 후 Filter는 요청을 처리할 수 있는 서블릿을 호출하여 정보를 처리한 다음 다시 후처리를 수행하여 클라이언트에 응답합니다.

전처리 후처리

inint()의 초기화 작업과 destrue()의 정리 작업과 다릅니다.

전처리 및 후처리는 처리 중에 수행해야 하는 전처리 및 후처리 루틴입니다.

(3) 이중 필터 사용


순서는 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() {
		// 정리 작업
	}

}