🍍 JSTL
상단에
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
url 부분에 🔽 링크 넣기
http://java.sun.com/jsp/jstl/core
Oracle Java Technologies | Oracle
Java Is the Language of Possibilities Java is powering the innovation behind our digital world. Harness this potential with Java resources for student coders, hobbyists, developers, and IT leaders.
www.oracle.com
JSTL 사용을 하기 위한 설정

jstl-1.2jar를 갖고 있어야 한다

사진에 보이는 경로에 jstl-1.2.jar 파일을 추가한다
새로운 태그를 사용할 준비 뜨읏

<c 를 하면 새로운 태그들을 볼 수 있게 되었다
많이 사용하는 태그 3가지만 사용
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- prefix : 뭐라고 부를지 접두사 정의 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL</title>
</head>
<body>
<c:if test="${empty datas}">
APPLE
</c:if>
<c:if test="${not empty datas}">
BANANA
</c:if>
<hr>
<c:choose>
<c:when test="${empty datas}"> <!-- if -->
if, else if, else if, ...
</c:when>
<c:when test=""> <!-- else if -->
</c:when>
<c:when test=""> <!-- else if -->
</c:when>
<c:otherwise> <!-- else -->
else
</c:otherwise>
</c:choose>
<hr>
<ul>
<c:forEach var="data" items="${datas}">
<li>${data}</li>
</c:forEach>
</ul>
</body>
</html>
단점 : 에러 발생 여부를 알 수 없다
장점 : 안정적인 서비스가 가능하다..
🍍 리스너
not POJO 이다.
서블릿을 상속받은, 기능이 있는 서블릿
JSP/Servlet에서 Filter는 요청(request)과 응답(response)이 실제 Servlet.JSP로
도달하기 전.후에 끼어들어 공통 작업을 처리하는 기능을 말합니다
무언가를 모니터링 감지를 할 수 있는데 대부분 서버 시작할 떄 모니터링을 하도록 한다
필터의 작동 구조
클라이언트 -> 필터 -> 서블릿/JSP -> 필터 -> 클라이언트



LifeCycle 옵션
필터의 생명주기를 어떻게 처리할지 선택하는 설정
Filter의 생명주기에는 3가지 메서드가 존대
| 메서드 | 호출 시점 | 설명 |
| init() | 필터가 처음 생성될 때 딱 한 번 호출됨 | 초기 설정 |
| doFilter() | 요청이 들어올 때마다 호출됨 | 실제 필터 작업 처리 |
| destroy() | 서버 종료 시 또는 필터가 소멸될 때 | 자원 해제 |
package controller;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener // ◀ new가 되는 이유
public class initListener implements ServletContextListener {
public initListener() {
// 기본생성자
}
public void contextDestroyed(ServletContextEvent sce) {
// 생성용 메서드
}
public void contextInitialized(ServletContextEvent sce) {
// 삭제용 메서드
System.out.println("[로그] 서버가 시작될 때를 감지(모니터링)하여 리스너가 자동수행됨");
}
}

로그가 찍혔다
1. static 메서드가 아님
2. 내가 호출을 안 함

서블릿 컨테이너 즉, 톰캣이 호출을 해주었기 때문이다
서블릿 컨테이너는
컨테이너인데 서블릿을 다루는 컨테이너라는 뜻
컨테이너란 개발자 대신 객체를 생성 및 관리하는 것
크롤링, 샘플데이터를 넣기 좋다
최초에 단 한번만 수행되기 때문이다
데이터를 최초로 넣는 것을 수행해보자
initListener.java
package controller;
import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener // ◀ new가 되는 이유
public class initListener implements ServletContextListener {
public initListener() {
// 기본생성자
}
public void contextDestroyed(ServletContextEvent sce) {
// 생성용 메서드
}
public void contextInitialized(ServletContextEvent sce) {
// 삭제용 메서드
System.out.println("[로그] 서버가 시작될 때를 감지(모니터링)하여 리스너가 자동수행됨");
// application scope에 data를 생성해서 저장
ServletContext application = sce.getServletContext();
ArrayList<String> datas = new ArrayList<>();
datas.add("오월");
datas.add("밀크");
datas.add("유진");
datas.add("보은");
datas.add("혀뇨");
application.setAttribute("datas", datas);
}
}
o
NewFile.jsp 전체코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${datas} | ${empty datas }
</body>
</html>
결과값 ▶

🍍 에러페이지 설정해보기
NewFile2.jsp 전체코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>에러페이지설정실습01</title>
</head>
<body>
<%
int i = Integer.parseInt("apple");
%>
</body>
</html>
▶ 500에러를 위한 errorpage
NewFile3.jsp 전체코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>에러페이지설정실습</title>
</head>
<body>
<a href="apple">404에러 발생 예정</a>
</body>
</html>
▶ 404에러를 위한 errorpage
일부러 에러 발생시킴
error01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>에러페이지01</title>
</head>
<body>
<h1>500 에러</h1>
<hr>
요청실패한 URI : ${pageContext.errorData.requestURI} <br>
상태코드 : ${pageContext.errorData.statusCode} <br>
예외유형 : ${pageContext.errorData.throwable}
</body>
</html>
▶ 500에러 발생시 출력 페이지
error02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>에러페이지02</title>
</head>
<body>
<h1>404 에러</h1>
<hr>
요청실패한 URI : ${pageContext.errorData.requestURI} <br>
상태코드 : ${pageContext.errorData.statusCode} <br>
예외유형 : ${pageContext.errorData.throwable}
</body>
</html>
▶ 404에러 발생시 출력 페이지
웹에서 어떠한 에러가 발생했을 때
어디로 가라~ 설정을 한다
설정파일은 .xml로 끝이난다
그래서 web.xml 파일에게 부탁해야 한다
web.xml 전체코드
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
<display-name>day034_2.2v</display-name>
<listener>
<listener-class>controller.initListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.xhtml</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.xhtml</welcome-file>
</welcome-file-list>
<error-page>
<!-- exception-type 자바에러 설정 -->
<exception-type>java.lang.Throwable</exception-type>
<location>/error/error01.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/error02.jsp</location>
</error-page>
</web-app>

내가 설정을 하는 것이다
404 에러가 뜨면 이 페이지를 보여줘야지~
500 에러가 뜨면 이 페이지를 보여줘야지~
실행 결과


🍍 필터
서블릿을 상속받은
기능이 있는 not POJO 클래스
인코딩에 많이 사용된다
서블릿 == 포켓몬
필터 : 피카츄 리스너 파이리


EncFilter.java
package controller;
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.HttpFilter;
@WebFilter("*.jsp") // ▶▶ 여기서 설정!
public class EncFilter extends HttpFilter implements Filter {
// Filter이 파일들은 jsp 파일들 사이에서 필터 역할을 함. 가운데 껴있음
// 로직에 필요한 자원이 멤버변수이고
// 이 멤버변수를 초기화할 때 보통 생성자를 사용하지만
// 안정성 등에 이유로 int에서 초기화를 많이 처리한다
// 서버 시작할 때 초기화를 위해서
private String encoding;
// 기본 생성자
public EncFilter() {
super();
}
public void destroy() {
}
// 리스너는 모니터링 감지해서 그때만 동작하지만
// 필터는 내가 설정할 때마다 동작!!
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("[로그] 필터 메서드 호출됨");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("[로그] 서버가 시작할때 필터 초기화");
// 멤버변수 초기화
this.encoding = "UTF-8";
}
}

NewFile4를 실행
jsp 파일이 바뀔 때마다 [로그]를 보면 Filter가 호출되는 것을 볼 수 있다
'JSP' 카테고리의 다른 글
| 트리나라 페이지 분석하기 (0) | 2025.11.22 |
|---|---|
| ⭐ EL + JSTL로 변경된 코드 (스크립틀릿 완전 제거 하기!) (0) | 2025.11.21 |
| requset | session | application | response (0) | 2025.11.20 |
| setAttribute( )!! request와 같이 사용하기 (0) | 2025.11.20 |
| Controller의 useBean과 setProperty 그리고 request (0) | 2025.11.19 |