본문 바로가기
BackEnd

5/23 - 서블릿, 쿠키와 세션, 필터와 리스너, JSP

by Jiwon_Loopy 2025. 6. 1.
반응형

목차


서블릿의 여러가지 URL 패턴


  • 이름까지 정확히 일치하는 패턴
    • ex) /first/test
  • 확장자만 일치하는 패턴
    • ex) .do (.확장자)
  • 모든 요청 패턴
    • ex) /*

Filter API


  • 브라우저에서 서블릿에 요청하거나 응답할 때 미리 요청이나 응답과 관련해 여러가지 작업을 처리하는 기능
    • 예를들어 한글 인코딩처럼 각 서블릿에서 반복적으로 처리해야 하는 작업과 같이 서블릿의 공통 작업을 미리 필터에서 처리하면 반복 작업의 수고를 덜 수 있음
  • 용도
    • 요청 필터
      • 사용자 인증 및 권한 검사
      • 요청시 요청 관련 로그 작업
      • 인코딩 기능
    • 응답 필터
      • 응답 결과에 대한 암호화 작업
      • 서비스 시간 측정
    • 필터 관련 API
      • javax.servlet.Filter
      • javax.servlet.FilterChain
      • javax.servlet.FilterConfig
  • Filter 메서드
    • destory()
      • 필터 소멸 시 컨테이너에 의해 호출되어 작업 종료
    • doFilter()
      • 요청/응답 시 컨테이너에 의해 호출되어 기능 수행
    • init()
      • 필터 생성 시 초기화
  • FilterConfig 메서드
    • getFilterName()
      • 필터 이름 반환
    • getInitParameter(String name)
    • getServletContext()
  • 사용자 정의 Filter
    • 애너테이션 이용
    • web.xml 이용

세션에 저장, 로그인 구현


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
   
  
</web-app>
package sec06.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/show")
public class ShowMember extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter pw = response.getWriter();
		// 세션객체 가져오기
		HttpSession session = request.getSession();
		// 세션객체에서 로그인세션 가져오기
		MemberVO memberSession = (MemberVO)session.getAttribute("loginSession");
		// 미로그인 상태(로그아웃 상태)
		if (memberSession == null) {
			pw.println("<input type='button' value='로그인' onclick='location.href=\\"login.html\\";'>");
		} else { // 로그인 상태
			pw.print(memberSession.getName()+"님, 안녕하세요");
			pw.println("<input type='button' value='로그아웃' onclick='location.href=\\"logout\\";'>");
		}
	}

}

 

Listener API


  • 서블릿에서 발생하는 이벤트에 대해 처리
  • ex) 현재 웹 페이지에 로그인한 접속자 수

JSP


  • HTML, CSS 와 JS를 기반으로 JSP 요소들을 이용해 화면 구현
  • 구성 요소
    • HTML 태그, CSS, JAVA SCRIPT 코드
    • JSP 기본태그
    • JSP 액션 태그
    • 개발자가 직접 만들거나 프레임워크에서 제공하는 커스텀 태그
  • 사용
    • webapp 아래 JSP File 생성
    • UTF-8로 인코딩 방식 설정
    • <% 자바 코드 %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>hello JSP!!</h1>
	<h1>JSP 실습입니다</h1>
	<%
		String name = "홍길동";
		System.out.println(name);
		out.print(name);
	%>
</body>
</html>

 

 

 

 

  • JSP 구성 요소
    • 디렉티브 태그
    • 스크립트 요소
      • 주석문
      • 스크립트릿
      • 표현 식
      <%=name%> // name 출력, 세미콜론 없음
      
      • 선언식
    • 표현 언어
      • $
    • 내장 객체
    • 액션 태그
    • 커스텀 태그

 

디렉티브 태그


  • 페이지 디렉티브 태그
  • 인클루드 디렉티브 태그
  • 태그라이브 디렉티브 태그
  • 페이지 디렉티브 태그
    • 사용처
      • import에 주로 사용
      • buffer
      • 이외의 태그가 더 있지만 사용하지 않으므로 생략
<@ page 속성1="값1" 속성2="값2" ... @>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>hello JSP!!</h1>
	<h1>JSP 실습입니다</h1>
	<%
		String name = "홍길동";
		System.out.println(name);
		out.print(name);
		Date date = new Date(); //데이트 객체가 import 되었음
		out.print(date);
	%>
	
	<% for(int i=0; i<10; i++) { %>
	<%= "<h1>"+date+"</h1>" %>
	<div> 안녕하세요 </div>
	<% } %>
</body>
</html>

 

<%@page import="member.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>

<%@ page import="member.*" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>hello JSP!!</h1>
	<h1>JSP 실습입니다</h1>
	<%
		MemberDAO dao = new MemberDAO();
		List<MemberVO> list = dao.listMembers();
	%>
	
	<table>
		<tr>
			<td>아이디</td>
			<td>비밀번호</td>
			<td>이름</td>
			<td>이메일</td>
			<td>가입일</td>
		</tr>
	</table>
	
	<%
		for(int i = 0; i < list.length; i++){
			
		}
	%>
</body>
</html>

 

  • 인클루드
    • 디렉티브
    • <%@ include file=”경로”%>
    • 소스를 넣고 실행
  • 액션태그
    • <jsp:include page=”경로”/>
    • 소스를 실행하고 불러옴
  • 인클루드(디렉티브) 방식 실행
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div>Header</div>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div>Header</div>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div id="wrap">
	<%@ include file="/include/header.jsp" %>
	<div id="container">
		???
	</div>
	</div>
</body>
</html>

 

  • 액션 페이지 방식 실행
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div id="wrap">
	<jsp:include page="/include/header.jsp" >
	<jsp:param value="hong@gmail.com" name="email"/>
	</jsp:include>
	<div id="container">
		???
	</div>
	</div>
</body>
</html>

 

  • 이런식으로 넣을 수도 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div id="wrap"><%
	String page = "/include/header.jsp";
%>
	<jsp:include page=<%=page %> >
	<jsp:param value="hong@gmail.com" name="email"/>
	</jsp:include>
	<div id="container">
		???
	</div>
	</div>
</body>
</html>

 

선언문


  • <%! %>로 선언
  • 필드로 여겨짐
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% String a = "ㅇㅇ"; //전역 변수 %>
<div id="wrap"><%
	String name = "홍길동"; //지역변수
	String pages = "/include/header.jsp";
%>
	<jsp:include page="<%=pages %>">
	<jsp:param value="hong@gmail.com" name="email"/>
	</jsp:include>
	<div id="container">
		???
	</div>
	</div>
</body>
</html>

 

 

에러 코드에 따른 예외 페이지 지정


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>404 오류</title></head>
<body>
  <h1>페이지를 찾을 수 없습니다 :</h1>
  <p>요청하신 페이지가 존재하지 않거나 경로가 잘못되었습니다.</p>
</body>
</html>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
		<error-page>
		<error-code>404</error-code>
		<location>/err/error_404.jsp</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/err/error_500.jsp</location>
	</error-page>
</web-app>

 

내장 객체


  • 주로 사용하는 것
    • session
    • request
    • application
      • 가장 넓은 범위의 저장소

표현 언어


  • EL
    • 값을 출력하기 위해 사용
    • 저장소 (request, session)에 있는 값 출력
    • 사용법 쉬움
    • null처리 불필요
  • 저장소의 순서
    • page → pageScope
    • request → requestScope
    • session → sessionScope
    • applicationScope → applicationScope
  • 바로 꺼내 쓸 수 있음
  • ${변수명}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
    <%
    // request에 저장
    request.setAttribute("name", "홍길동");
    //세션에 저장
    session.setAttribute("email", "xxx@naver.com");
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	name : ${sessionScope.email}
	name : ${email}
</body>
</html>

 

 

  • 객체, 맵도 꺼낼 수 있다,
<%@page import="member.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
    <%
    // request에 저장
    request.setAttribute("name", "홍길동");
    //세션에 저장
    session.setAttribute("email", "xxx@naver.com");
    
    // MemberVO객체를 세션에 저장
    member.MemberVO vo = new MemberVO();
	vo.setName("김길동");
    session.setAttribute("loginSession", vo);
    
    // Map객체를 리퀘스트에 저장
    java.util.Map map = new java.util.HashMap();
    map.put("id","장길동");
    request.setAttribute("data", map);
    
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	name : ${sessionScope.email}
	name : ${email}
	
	object : ${loginSession.name}
	map : ${data.id}
</body>
</html>

  • if 문은 jstl로, 별도의 라이브러리를 다운 받아줘야 사용 가능
  • if 문 + 파라미터 까지 전체 코드
<%@page import="member.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
    <%
    // request에 저장
    request.setAttribute("name", "홍길동");
    //세션에 저장
    session.setAttribute("email", "xxx@naver.com");
    
    // MemberVO객체를 세션에 저장
    member.MemberVO vo = new MemberVO();
	vo.setName("김길동");
    session.setAttribute("loginSession", vo);
    
    // Map객체를 리퀘스트에 저장
    java.util.Map map = new java.util.HashMap();
    map.put("id","장길동");
    request.setAttribute("data", map);
    
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	name : ${sessionScope.email}
	name : ${email}
	
	object : ${loginSession.name}
	map : ${data.id}
	
	id 비교 : ${ data.id eq 'hong'}
	로그인 세션 존재 여부 : ${!empty loginSession}
	
	파라미터 넣기 (주소창에 입력하면 나옴) : ${ param.age }
	파라미터 null 체크 : <%=request.getParameter("age") == null ? "" : request.getParameter("age") %>
</body>
</html>

 

메모


  • XSS (크로스사이트스크립팅 공격)
    • 주소창으로 자바스크립트를 입력하여 임의의 공격을 수행
    • 필터링을 통해 막을 수 있다.
  • 서블릿
    • 요청 받기
    • 비즈니스 로직
    • 포워딩
  • jsp
    • 화면(프론트)
    • HTML + CSS + JAVASCRIPT
  • 시작
    • 요청
  • 요청받는 방법
    • web.xml
    • 어노테이션
  • 비즈니스 로직
    • service는 로직처리
    • DAO는 DB연동
  • 포워딩
    • 하나의 요청
    • 처리결과를 request에 저장
  • JSP
    • request에 저장된 처리 결과를 꺼내서 출력
  • 출력 결과를 브라우저로 응답

 

728x90
반응형

'BackEnd' 카테고리의 다른 글

5/27 - ajax, JSON  (4) 2025.06.01
5/26 - JSTL  (0) 2025.06.01
5/22 - Servlet, 쿠키, 세션  (0) 2025.06.01
5/21 - 서블릿 응답 처리 방법  (0) 2025.06.01
5/20 - 톰캣, 웹 서버 프로그래밍, 서블릿  (1) 2025.06.01