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은 기본객체를 사용할 수 없다. 지역변수를 저장소에 저장 후 사용.
4-2.Application
:Web App 전체에서 접근가능. 1개만 존재. 상태를 저장하기 위해 사용(ex.로그인 후 글쓰기 할 때 로그인 정보를 잃지 않기 위해서). 은밀한 정보를 허가되지 않은 사용자가 쓸 수 있다. 개별 아이디를 저장하기에는 불리
4-3.session
: 개별저장소. 클라이언트와 1:1. 로그인 후 로그인 정보 저장, 장바구니 저장 에 유용. 사용자마다 1개씩 갖는 개별저장소라 저장소 중에서 부담이 가장 많이감.
4-4.Request
: 요청할 때마다 생성. 독립적. 요청을 forward하는 경우 쓴다. session보다 부담이 적기 때문에 데이터를 저장하고 전달할 때 많이 쓴다.
4-5.전체 정리
5.URL 패턴
5-1.URL패턴
:@WebServlet으로 서블릿을 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>
예제
- <c:out value="안녕하세요!"/><br>
- <c:out value="${null}">반갑습니다.</c:out><br>
- <c:out value="안녕하세요!">반갑습니다.</c:out><br>
- <c:out value="${null}"/><br>
실행결과
- 안녕하세요!
- 반갑습니다.
- 안녕하세요!
<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.필터
:중복코드를 분리할 때 사용
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아키틱처, 마이바티스, 스프링으로 만드는 실무형 개발자 로드맵 자바 웹 개발 워크북(저자: 엄진영, 출판사:프리렉)
'Servlet & JSP' 카테고리의 다른 글
[JSP] JSTL (0) | 2022.02.19 |
---|---|
[JSP] EL (0) | 2022.02.19 |