Servlet & JSP

[Servlet & JSP] 서블릿과 JSP정리

각시탈코더 2022. 12. 15. 13:24

 

1.서블릿

 

: 클라이언트 어플리케이션에서는 GET 명령을 통해 프로그램을 요구한다. 자바 서버 어플리케이션에는 다양한 프로그램들이 있는데 이를 Server Application이라 한다. 서블릿(Server Application Let)의 'Let'은 조각이라는 뜻인데 이 말을 종합해 풀이하면 서블릿은 '모여있는 프로그램 중 하나'라고 정의할 수 있다.

 

2.서블릿의 생명주기

 

1.요청이 오면 Servlet Context에서 서블릿 인스턴스(Singleton 인스턴스)가 존재하는지 확인한다.

2.서블릿 인스턴스가 존재하면 service 메서드를 호출하고 응답한다.

3.서블릿 인스턴스가 존재하지 않으면 서블릿 클래스를 로딩한 후 인스턴스를 호출한다. -> init메서드를 호출한다. ->service 메서드를 호하여 응답한다.

4.프로그램이 변경되거나 웹 어플리케이션이 종료되면 destory 메서드를 호출한다.

 

이 모든 과정을 Servlet Container가 자동으로 메서드 실행. 

 

코드

3.JSP(Java Server Page)

3-1. JSP란?

:HTML에 자바코드를 작성하는 것. <%~%>안에 자바코드를 작성

  • <% ~ %>: 메서드 영역. 지역변수가 들어간다.
  • <%! ~ !%>: 클래스영역. 클래스변수(cv)와 인스턴스변수(iv)가 들어간다.

3-2.JSP 호출 과정

 

1.jsp요청이 들어오면 JspServlet이 무조건 받은 후 서블릿 인스턴스가 존재하는 확인한다.

2.서블릿이 인스턴스가 존재하지 않거나 변경된 jsp파일은 변환->컴파일->인스턴스의 과정을 거쳐 서블릿 인스턴스를 생성 후 응답한다. 변환, 컴파일, 인스턴스 생성하는 과정에서 많은 시간이 걸린다.

3.서블릿 인스턴스가 존재하면 _JspService()를 통해 곧장 응답한다.

 

3-2.JSP 기본객체

:객체 생성없이 사용할 수 있는 객체

 

4.서블릿 유효 범위(scope)와 속성(attribute)

:서블릿 저장소는 접근범위가 생존기간에 따라 pageContext, application, session, request 4개의 저장소를 갖는다.

 

4-1.pageContext

:지역변수(기본객체)저장. 범위: 페이지 안. EL을 쓰기위해 사용. EL은 기본객체를 사용할 수 없다. 지역변수를 저장소에 저장 후 사용.

pageContext

4-2.Application

:Web App 전체에서 접근가능. 1개만 존재. 상태를 저장하기 위해 사용(ex.로그인 후 글쓰기 할 때 로그인 정보를 잃지 않기 위해서). 은밀한 정보를 허가되지 않은 사용자가 쓸 수 있다. 개별 아이디를 저장하기에는 불리

 

 

4-3.session

: 개별저장소. 클라이언트와 1:1. 로그인 후 로그인 정보 저장, 장바구니 저장 에 유용. 사용자마다 1개씩 갖는 개별저장소라 저장소 중에서 부담이 가장 많이감.

 

 

 

4-4.Request

: 요청할 때마다 생성. 독립적. 요청을 forward하는 경우 쓴다. session보다 부담이 적기 때문에 데이터를 저장하고 전달할 때 많이 쓴다.

Request

 

4-5.전체 정리

전체

 

5.URL 패턴

5-1.URL패턴

:@WebServlet으로 서블릿을 URL에 맵핑하는 패턴을 의미한다. 

URL패턴. 숫자는 우선순위를 의미한다.

●스프링은 'DefaultServlet'을 가지고 있지 않다. 대신 'DispatcherServlet'을 사용하여 모든 요청을 맵핑한다.

 

 

6.EL(Expression Language)

:JSP에서 쓰던 <%=값%>을 안쓰고 ${값}을 통해 간단히 표현하게하는 Language이다.

 

JSTL(Java Standard Tag Library)

7-1.JSTL 주요 태그 사용법

  • <%@ taglib uri="사용할 태그의 라이브러리 URI" prefix="접두사" %>

JSTL 확장 태그를 사용하려면 태그 라이브러리를 사용해야한다. 위는 JSTL 태그 라이브러리다. <%@ taglib%>는 JSP의 지시자 태그다. uri 속성은 태그 라이브러리의 네임스페이스 이름이다. 네임스페이스 이름은 URI로 되어있다. prefix 속성은 JSTL 태그를 사용할 때 태그 이름 앞에 붙일 접두사다. 

 

 

7-2.태그 라이브러리와 URI, 접두사

태그 라이브러리 접두사 네임스페이스의 URI 식별자
Core c http://java.sun.com/jsp/jstl/core
XML x http://java.sun.com/jsp/jstl/xml
I18N fmt http://java.sun.com/jsp/jstl/fmt
Database sql http://java.sun.com/jsp/jstl/sql
Function fn http://java.sun.com/jsp/jstl/functions

 

7-3.JSTL 주요 태그

 JSTL은 <c:out>, <c:set>, <c:remove>, <c:choose>, <c:forEach> 등 다양한 태그를 제공한다.

 

<c:out> 태그

:출력문을 만드는 태그다.

 

문법

  • <c:out value="출력할 값" default="기본값"/>
  • <c:out value="출력할 값">기본값</c:out>

예제

  1. <c:out value="안녕하세요!"/><br>
  2. <c:out value="${null}">반갑습니다.</c:out><br>
  3. <c:out value="안녕하세요!">반갑습니다.</c:out><br>
  4. <c:out value="${null}"/><br>

실행결과

  1. 안녕하세요!
  2. 반갑습니다.
  3. 안녕하세요!
  4.  

 

<c:set> 태그

 

 변수를 생성하거나 기존 변수의 값을 덮어쓸 때 사용한다.

 

문법

  • <c:set var="변수명" value="값" scope="page|request|session|application"/>   // value 속성을 사용하여 값 설정
  • <c:set var="변수명" scope="page|request|session|application"/>값</c:set>    // 태그 콘텐츠를 사용하여 값 설정

 

<c:remove> 태그

: <c:remove> 태그는 보관소에 저장된 값을 제거하는 태그다. 

 

문법

  • <c:remove var="변수명" scope="page | request | session | application"/>

예제

 

<h3> 보관소에 저장된 값 제거</h3>

<% pageContext.setAttribute("username1", "홍길동"); %>

① ${username1}<br>

<c:remove var="username1"/>

② ${username1}<br>

 

실행결과

보관소에 저장된 값 제거

①홍길동

 

<c:if> 태그

: test 속성값이 참이면, 콘텐츠가 실행된다. 

 

문법

  • <c:if test="조건" var="변수명" scope=" page | request | session | application"> 콘텐츠 </c:if>

 

예제

<c:if test="$(10 > 20)" var="result1">

①10은 20보다 크다.<br>

</c:if>

②${result1}<br>

 

<c:if test="${10 < 20}" var="result2">

③10은 20보다 크다.<br>

</c:if>

④${result2}<br>

 

실행결과

② false

③ 10은 20보다 크다.

④ true

 

 

<c:choose> 태그

:자바의 switch, case 등과 같은 기능을 수행한다. 여러가지 조건에 따라 다른 작업을 해야 할 필요가 있을 때 사용한다.

 

문법

 

<c:choose>

   <c:when test="참거짓 값"></c:when>

   <c:when test="참거짓 값"></c:when>

  ...

   <c:otherwise></otherwise>

</c:choose>

 

예제

 

<c:set var="userid" value="admin'/>

<c:choose>

   <c:when test="${userid == 'hong'}">

     홍길동님 반갑습니다.

   </c:when>

   <c:when test="${userid == 'leem'}">

     임꺽정님 반갑습니다.

   </c:when>

   <c:when test="${userid == 'admin'}">

     관리자 전용 페이지입니다.

   </c:when>

   <c:otherwise>

     등록되지 않은 사용자입니다.

   </c:otherwise>

</c:choose>

 

실행결과

관리자 전용 페이지입니다.

 

<c:forEach> 태그

 :는 반복적인 작업을 정의할 때 사용한다.

 

문법

  •  <c:forEach var="변수명" items="목록데이터" begin="시작인덱스" end="종료인덱스"> 콘텐츠 </c:forEach>

item 속성값으로 오는 값들

  • 배열
  • java.util.Collection 구현체.
  • java.util.Iterator 구현체
  • java.util.Enumeration 구현체
  • java.util.Map 구현체
  • 콤마(,) 구분자로 나열된 문자열.

var 속성은 반복문을 돌면서 items에서 꺼낸 항목 값을 가리키는 참조변수.

<c:forEach var="board" items="${list}">

<tr>

   <td>${board.bno}</td>

 

예제

 

<% pageContext.setAttribute("nameList", new String[]{"홍길동", "임꺽정", "일지매"}); %>

<ul>

<c:forEach var="name" items="${nameList}>

  <li>${name}</li>

</c:forEach>

</ul>

 

 

실행결과

  • 홍길동
  • 임꺽정
  • 일지매

 

예제

 

<% pageContext.setAttribute("nameList2", new String[] {"홍길동", "임꺽정", "일지매", "주먹대장", "똘이장군"}); %>

<ul>

<c:forEach var="name" items="${nameList2}" begin="2" end="3">

  <li>${name}</li>

</c:forEach>

</ul>

 

실행결과

  • 일지매
  • 주먹대장

<c:url> 태그

 :URL을 생성해주는 기능을 한다. URL을 생성하면서 contextPath를 자동으로 생성한다. 그래서 contextPath가 달라져도 URL을 수정할 필요가 없다. 

 

contextPath 자동 생성의 의미

○url의 주소가 처음에는 </변경전/board/list?bno=~~이하 생략~~>이였다. c:url을 사용하지 않으면 contextPath가 변경이될 떄 모든 주소를 매번 수정해줘야 했다. 하지만 context 뒤의 정보들을 고정함으로써 이러한 수고를 없앴다.

 

문법

●<c:url var="변수이름" value="url경로" var="변수명" scope="영역"/>

 

예시

●<c:url value='/board/list?bno=${board.bno}&page=${board.page}%pageSize=${board.pageSize}'/>

 

※ <c:url 태그를 쓰는 이유>

  • context path를 자동으로 포함시키므로 서버 소스를 수정함에 따른 변화를 자동으로 적용해준다.
  • 클라이언트의 브라우져가 쿠키사용을 금지하면 로그인 유지가 힘들어진다. 이 때 세션을 유지하기위해 링크 뒤에 특정값(sessionId)을 부여해줘서 로그인을 유지해준다.

 

8.필터

:중복코드를 분리할 때 사용

 

1개의 필터를 사용하는 과정
2개 이상의 필터를 사용하는 과정

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;

// 필터를 적용할 요청의 패턴 지정 - 모든 요청에 필터를 적용.
@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() {
		// 정리 작업
	}

}

 


참조 및 출처

-스프링의 정석 : 남궁성과 끝까지 간다(패스트캠퍼스)

-뉴렉쳐:서블릿/JSP 강의 03 - 웹 서버 프로그램과 Servlet(https://www.youtube.com/watch?v=sDWFWCvbrGg&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=3&ab_channel=%EB%89%B4%EB%A0%89%EC%B2%98)

-MVC아키틱처, 마이바티스, 스프링으로 만드는 실무형 개발자 로드맵 자바 웹 개발 워크북(저자: 엄진영, 출판사:프리렉)