java-servlet-jsp 2일차

박상원·2024년 2월 13일

java-servlet-jsp

목록 보기
1/3

RequestDispatcher


  • 현재의 요청에 대한 정보를 저장했다가 다른 자원(Servlet, JSP, HTML 등)으로 전달(forward, include)하는 기능을 제공

RequestDispatcher는 같은 웹 애플리케이션 내에서 다른 리소스로 요청을 전달하거나 포함하는 데 사용되는 객체이다.
이는 Servlet API의 일부이며 웹 애플리케이션에서 Model-View-Controller (MVC) 아키텍쳐를 구현하는 데 일반적으로 사용된다.

RequestDispatcher 인터페이스는 foward()와 include() 두 가지 메서드를 제공한다.

  • forward() 메서드는 JSP 페이지와 같은 다른 리소스로 제어를 전송하는 데 사용되며,
  • include() 메서드는 다른 리소스의 출력을 현재 페이지의 출력에 포함시키는 데 사용된다.

즉, RequestDispatcher는 다른 페이지나 서블릿으로 현재 요청을 보내거나 다른 페이지나 서블릿의 출력을 현재 페이지에 포함시키는 데 사용된다.
이를 통해 웹 애플리케이션에서 유연한 처리가 가능해지며, 코드의 재사용성이 높아진다.

RequestDispatcher 사용법


ServletContext로부터 RequestDispatcher 생성

// servlet name
RequestDispatcher rd = getServletContext().getNamedDispatcher("loginServlet");
// url
RequestDispatcher rd = getServletContext().getRequestDispatcher("/login");

HttpServletRequest로부터 RequestDispatcher 생성

RequestDispatcher rd = request.getRequestDispatcher("/login");

RequestDispatcher 사용

rd.forward(req, resp);
rd.include(req, resp);

rd.forward() vs response.sendRedirect()

sendRedirect는 클라이언트가 서버에게 요청을 보내고 서버가 redirect를 보내면 클라이언트가 다시 서버에게 받은 url을 요청하는 것이고, forward는 클라이언트가 서버에게 요청을 보냈을 때 다른 api로 전달을 하여 처리 후 클라이언트에게 응답을 하는 것이다.
즉 다시 말하면 redirect는 클라이언트가 한번 더 서버에게 요청을 하여 응답을 받는 구조이고 forward는 클라이언트 요청 한번으로 서버에서 직접 유동적으로 처리하여 응답을 받는 구조이다.

Servlet Filter


  • 지정한 URL 패턴에 해당하는 요청에 대해 서블릿 실행 전 후에 해당 요청이나 응답에 공통적으로 적용할 작업을 수행하는 객체
  • 필터 체인 형태로 제공

    Servlet Filter는 Java Serlver API에서 제공하는 기능 중 하나로, HTTP 요청과 응답을 처리하기 전에 그 사이에 추가적인 처리를 수행할 수 있도록 해주는 컴포넌트이다.

    Filter는 일종의 체인 형태로 동작한다.
    클라이언트가 서버에 요청을 보내면, 이 요청은 Filter 체인의 맨 앞에서부터 순차적으로 각 Filter를 거치며 필터링된다.
    필터링은 일반적으로 요청과 응답의 헤더와 바디를 수정하거나, 인증과 권한 부여를 위한 처리, 요청과 응답에 대한 로깅 등의 작업을 수행한다.

    Filter는 다음과 같은 장점을 제공한다.

    • 중복 코드 제거: 여러 서블릿에서 공통으로 사용되는 코드를 Filter로 분리하여 중복을 제거할 수 있다.
    • 보안 강화: Filter를 이용하여 모든 요청에 대한 보안 검사나 인증 처리 등을 통합적으로 수행할 수 있다.
    • 코드 가동성 향상: 서블릿 코드에서 비즈니스 로직과 관계 없는 처리를 Filter로 분리하여 코드 가동성을 향상시킬 수 있다.

    Filter는 javax.servlet.Filter 인터페이스를 구현하여 작성된다.
    또한 web.xml 파일에서 필터의 매핑과 순서를 설정할 수 있다.
    최근에는 @WebFilter 어노테이션을 사용하여 필터를 등록하는 방법도 제공된다.

Listener


  • Servlet Container가 수행한 특정한 타입의 동작(이벤트)을 감지하여 해당 이벤트에 대해 별도의 작업을 수행하는 객체

  • ServletContextListener: 웹 애플리케이션 시작, 종료 이벤트에 대한 이벤트 리스너이다. 핸들러 메서드에서는 ServletContext에 대한 참조를 얻을 수 있다.

  • ServletContextAttributeListener: ServletContext에 속성을 추가, 제거, 수정할 때 발생하는 것에 대한 이벤트 리스너이다. 핸들러 메서드에서는 추가하거나 제거, 수정된 attribute정보를 얻을 수 있다.

  • HttpSessionListener: HTTP 세션의 시작, 종료 이벤트에 대한 이벤트 리스너이다. 핸들러 메서드에서는 현재 세션 객체를 얻을 수 있다.

  • HttpSessionAttributeListener: HttpSession에 속성을 추가하거나 제거, 수정 되었을 때에 대한 이벤트 리스너이다. 핸들러 메서드에서는 추가하거나 제거, 수정된 attribute 정보를 얻을 수 있다.

  • ServletRequestListner: 클라이언트로부터의 요청으로 인한 ServletRequest 생성과 응답 이후 ServletRequest 제거시에 대한 이벤트 리스너이다. 핸들러 메서드에서는 요청에 관련된 정보와 ServletContext에 대한 참조를 얻을 수 있다.

  • ServletRequestAttributeListener: ServletRequest에 속성을 추가하거나 제거, 수정되었을 때에 대한 이벤트 리스너이다. 핸들러 메서드에서는 추가하거나 제거, 수정된 attribute 정보를 얻을 수 있다.

<form>


HTML

<form method='post' action='login' enctype=''>
  ...
</form>

enc-type : HTML form content-type

  • 폼 데이터가 서버로 제출될 때 해당 데이터가 인코딩되는 방법을 명시한다.
  • method='post'일 때만 사용할 수 있다.

속성 값

  • application/x-www-form-urlencoded
    • default
    • key=value&key=value&...
    • 모든 데이터(문자)은 서버로 보내기 전에 인코딩됨을 명시함
  • multipart/form-data
    • 모든 문자를 인코딩하지 않음을 명시함.
    • 파일이나 ASCII가 아닌 문자열, 바이너리 데이터 전송 시 multipart/form-data를 사용
    • multipart/form-data의 컨텐츠는 multipart MIME 데이터의 모든 규칙을 따름
  • text/plain
    • 공백 문자(space)는 "+" 기호로 변환하지만, 나머지 문자는 모두 인코딩되지 않음을 명시함.

MIME (Multipupose Internet Mail Extensions)

  • 전자 우편을 위한 인터넷 표준 포맷
  • 이메일 메세지의 형식을 확장해서
    • ASCII 이외의 문자셋으로 표현된 텍스트를 지원하고
    • 오디오, 비디오, 애플리케이션 프로그램 등을 첨부할 수 있도록 하기 위한 인터넷 표준
  • MIME 형식의 이메일 메세지는 SMTP나 POP, IMAP과 같은 표준 프로토콜로 전송

    MIME(Multipurpose Internet Mail Extensions) 타입은 웹에서 파일의 형식을 구분하기 위해 사용된다.

    **자주 사용하는 MIME TYPE

  • text/html : HTML 문서를 나타내는 MIME 타입이다. 웹 브라우저에서 HTML 문서를 받을 때 사용된다.
  • text/plain : 일반 텍스트를 나타내는 MIME 타입이다. 예를 들어, 서블릿에서 출력하는 일반 텍스트 메시지를 브라우저에서 받을 때 사용된다.
  • image/jpeg : JPEG 형식의 이미지를 나타내는 MIME 타입이다. 웹 페이지에서 이미지를 보여줄 때 사용된다.
  • image/png : PNG 형식의 이미지를 나타내는 MIME 타입이다. JPEG 대신 PNG를 사용하면 이미지 투명도와 압축률이 더 좋아지는 등의 이점이 있다.
  • application/pdf : PDF 문서를 나타내는 MIME 타입이다. 웹 페이지에서 PDF 문서를 보여줄 때 사용된다.
  • application/json : JSON 데이터를 나타내는 MIME 타입이다. 웹 페이지에서 JSON 데이터를 전송하거나 받을 때 사용된다.
  • application/xml : XML 데이터를 나타내는 MIME 타입이다. 웹 페이지에서 XML 데이터를 전송하거나 받을 때 사용된다.
  • application/octet-stream : 이진 파일을 나타내는 MIME 타입이다. 예를 들어, 파일 다운로드 기능을 구현할 때 사용된다.

    위와 같은 MIME 타입은 서블릿과 JSP에서 응답(Response)을 생성할 때 Content-Type 헤더에 설정하여 클라이언트(웹 브라우저)가 올바르게 인식하도록 해야 한다.

Multipart Message

  • MIME의 메세지 바디는 multipart(여러 개의 part)로 구성된어 있다.
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=frontier

This is a meesage with multiple parts in MIME format.
--frontier
Content-Type: text/plain

This is the body of the message.
--frontier
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64

PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
--frontier--

boundary

  • MIME multipart 메세지는 Content-Type 헤더에 boundary를 가지고 있음
  • boundary가 메세지의 시작과 끝, 그리고 part들 사이에 위치해서 part들을 구분해줌

part

  • 각각의 part는 자체 헤더와 바디를 가짐
  • multipart 컨텐츠는 중첩 구조를 가질 수 있음

Base64 Encoding

  • Binary Data를 Text로 바꾸는 Encoding
  • 파일 업로드 시 Binary Data를 text로 변경하여 par 내 body에 포함하여 전송한다.

base64 인코딩표

Servlet 3.0 Annotation


  • @WebServlet
  • @WebInitParam
  • @WebFilter
  • @WebListener
  • @MultipartConfig

ServletContainerInitializer 인터페이스는 Servlet 3.0 버전에서 새롭게 도입된 인터페이스로, 웹 애플리케이션이 시작될 때 서블릿 컨테이너에 의해 호출되는 클래스의 초기화를 담당한다. 이 인터페이스를 구현하는 클래스는 웹 애플리케이션이 시작될 때 자동으로 호출된다.

ServletContainerInitializer 인터페이스는 onStartup() 메서드를 정의하고 있다. 이 메서드는 Set<Class\<?>> 클래스 목록과 ServletContext 객체를 매개변수로 받는다. Set<Class\<?>>은 ServletContainerInitializer 구현체가 처리할 클래스나 인터페이스의 집합을 지정한다. ServletContext 객체는 웹 애플리케이션의 ServletContext를 나타낸다.

@HandlesTypes 어노테이션은 onStartup() 메서드에서 처리할 클래스나 인터페이스를 지정하는 데 사용된다. 예를 들어, @HandlesTypes(MyIterface.class)로 지정하면 ServletContainerInitializer 구현체는 MyInterface를 구현한 모든 클래스를 찾아 초기화한다. 이를 활용해 원하는 타입의 클래스를 찾아 초기화할 수 있다.

ServletContainerInitializer는 서블릿 컨테이너의 확장 가능성을 높이고, 전통적인 web.xml 파일을 대체할 수 있는 방법으로 사용된다. 이를 통해 프로그래머는 보다 유연하게 웹 애플리케이션을 구성할 수 있다.

JSP


JSP(Java Server Pages = Jarkarta Server Pages)

  • HTML이나 XML 등을 기반으로
    • Java 코드를 삽입하여
    • 웹 서버에서 동적으로 웹 페이지를 생성할 수 있도록 해주는
    • 서버사이드 스크립트 언어

JSP 문법


<%@ %>

  • page: JSP 페이지에 대한 정보
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
  • include: JSP파일 안에 다른 JSP나 HTML 파일을 포함
<%@ include file="/some/path/content.html" %>
  • taglib: 태그 라이브러리 선언
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

JSP 기본 문법 (Expression)

<%= %>

  • 변수 메서드 호출 등 표현식(expression)의 실행 결과를 출력
<%= "Hello, World!" %>
<%= 17 * 5 %>
<%= request.getParameter('name' %>

JSP 기본 문법 (Declaration)

  • 전역변수
    • outside the _jspService() method.

<%! %>

  • 변수나 메서드 등을 선언
<%! String name = "James" %>
<%!
	public int minus(int i, int j) {
    	return i - j;
    }
%>

JSP(Java Server Pages)에서 <%! %>는 선언문(Declaration)을 나타내는 태그이다.
이 태그는 JSP 페이지의 전역 범위(Global scope)에서 사용할 수 있는 변수, 메소드, 클래스 등을 선언할 때 사용된다.

선언문(Declaration)은 JSP 페이지에서 Java 코드를 작성할 때 사용된다.
이 코드는 JSP 페이지를 서블릿(Servlet)으로 변환할 때 전역 범위(Global scope)에 선언된다.
따라서 JSP 페이지 내에서 선언한 변수나 메소드는 서블릿에서 사용할 수 있다.

JSP 기본 문법(Scriptlet)

  • 지역변수
    • inside the _jspService() method.

<% %>

  • <%와 %>사이에 있는 코드를 실행
<%
	int a = 3;
    int b = 2;
    
    if (a > b) {
    	out.println(minus(a, b));
   	}
%>

JSP Scriptlet tag vs Declaration tag

  • Scriptlet tag는 지역변수를 선언하고, 코드를 실행하는 태그이고 Declaration tag는 전역변수, 메서드를 선언하는 태그이다.

JSP 제어/반복문

  • Scriptlet을 이용

if-else

<% if (x < 0) { %>
	<p>negative</p>
<% } else { %>
	<p>zero or positive</p>
<% } %>

for, while, do/while

<table>
<tr>
<% for (i = 0; i < 10; i++) { %>
	<td><%= i + 1 %></td>
<% } %>
</tr>
</table>

주석(comment)

content comment

  • HTML:

JSP comment

  • JSP tag: <%-- / comment / --%>

위 두개의 주석 차이는 html 주석은 html 파일 내부에 나타나고 jsp 주석은 html 파일 내부에 나타나지 않는다.

JSP 동작구조

  • 컨테이너는 JSP 파일을 HttpJspPage 인터페이스를 구현한 서블릿 클래스로 변환하여 생성한다.

주요 api

  • jspInit()
    • servlet의 init() 메서드에서 호출한다.
    • 재정의 가능
  • jspDestroy()
    • servlet의 Destroy() 메서드에서 호출한다.
    • 재정의 가능
  • _jspService()
    • servlet의 service() 메서드에서 호출한다.
    • 재정의 불가능
    • 우리가 작성한 jsp코드를 받아서 _jspService method를 만드는 일을 Container를 만드는 벤더가 할일(즉 tomcat에서 알아서할 일)

JSP 내장 객체 (implicit object)

객체타입설명
pagejavax.servlet.jsp.HttpJspPagepage의 Servlet 인스턴스
configjavax.servlet.ServletConfigServletConfig
requestHttpServletRequest요청 객체
responseHttpServletResponse응답 객체
outjavax.servlet.jsp.JspWriterpage 컨텐츠 풀력용 스트림
sessionjavax.servlet.http.HttpSession세션
applicationjavax.servlet.ServletContextServletContext
pageContextjavax.servlet.jsp.PageContextJSP page의 실행 context
exceptionjava.lang.Throwable처리되지 않은 에러나 예외

scope


page

  • scope: JSP 페이지 내에서만 사용할 수 있는 scope
  • PageContext 내장객체를 사용
  • jsp에서는 pageContext 내장 변수를 사용함
  • forward가 될 경우 해당 Page scope에 지정된 변수는 사용할 수 없음
  • 지역변수처럼 사용할 수 있음

request

  • scope: 하나의 요청을 기준으로 서버가 클라이언트에게 응답을 보낼 때까지 사용할 수 있는 scope
  • jsp에서는 request 내장 변수를 사용함
  • forward에서 값을 유지할 수 있음

session

  • scope: session 객체가 생성되고 소멸
  • jsp에서는 session 내장 변수를 사용함

application

  • scope: application이 생성되고 소멸될 때까지
  • 하나의 서버(tomcat)에는 여러개의 application이 구동될 수 있음

page

  • jsp -> 생성된 Servlet class 자체

include와 forward의 차이

include는 해당 URL로 제어권을 넘기지만 include처리가 끝나면 다시 제어권은 원래의 페이지로 돌아옴 (즉 해당 페이지에 삽입하는 것과 같음)
forward는 요청과 응답에 대한 제어권을 URL로 지정된 주소로 영구적으로 넘김. -> 종료

JSP Action Tag


  • JSP 페이지 내에서 어떤 동작을 하도록 지시하는 태그
  • XML 태그 형식
  • JSP Action Tags는 페이지 간 플로우를 제어한다.
  • JSP Action Tags는 Java Bean을 사용하는 데 사용한다.

JavaBeans


  • 객체 지향 프로그래밍의 가장 큰 이점 중 하나는 다른 프로그램에서도 객체를 다시 사용할 수 있다는 것이다.
  • 예를 들어 워드 프로세서에서 동작하는 맞춤법 검사 프로그램을 만들었다면 이메일 프로그램에서도 그 객체를 사용할 수 있어야 한다.
  • 자바빈은 자바빈 규격이라는 엄격한 지침을 따라서 다른 객체와 아주 쉽게 쓰일 수 있게 된다.
  • 즉 Java Beans는 java로 작성된 재사용 가능한 소프트웨어 컴포넌트이다.

POJO(Plain Old Java Object)

  • 특정 기술과 환경에 종속되어 의존하게 된 자바 코드는 가독성이 떨어져 유지보수가 어렵고 확장성이 매우 떨어지는 단점이 있다.
  • 이는 객체지향 언어인 자바가 객체지향의 장점을 잃어버리게 되는 것이다.
  • 그래서 POJO라는 개념이 등장했다.

POJO는 주요 Java 오브젝트 모델, 컨벤션 또는 프레임워크를 따르지 않는 Java 오브젝트를 의미한다.

POJO 프레임워크


  • POJO 프레임워크란 POJO 프로그래밍이 가능하도록 기술적인 기반을 제공하는 프레임워크이다.
  • 스프링 프레임워크가 대표적인 POJO 프레임워크이다. 스프링 프레임워크를 이용하면 POJO 프로그래밍의 장점을 살려 복잡한 비즈니스 핵심 로직을 객체 지향적인 POJO 기반으로 깔끔하게 구현할 수 있다.
  • 엔터프라이즈 환경에서의 각종 서비스와 기술적인 필요를 POJO 방식으로 만들어 코드에 적용할 수 있다.

Springframework의 주요기술인 IoC, DI, AOP, PSA 기술들을 이용해서 POJO로 개발할 수 있게 해주는 기능 기술이다.

Java Beans

  • Java Beans는 java로 작성된 소프트웨어 컴포넌트이다.
  • Java Beans는 썬 마이크로시스템즈 시절 다음과 같이 정의되어 있다. "빌더 형식의 개발도구에서 가시적으로 조작이 가능하고 또한 재사용이 가능한 소프트웨어 컴포넌트이다."
  • Java Beans와 엔터프라이즈
    • 자바빈즈와 혼동하지 말아야 한다. EJB는 JAVA EE의 서버계열 컴포넌트이다.

Java Beans 지켜야할 관례

  • 클래스는 직렬화 되어야 한다.
  • 클래스는 기본 생성자를 가지고 있어야 한다.
  • 클래스의 속성들은 get, set 혹은 표준 명명법을 따르는 메서드들을 사용해 접근할 수 있어야 한다.
  • 클래스는 필요한 이벤트 처리 메소드들을 포함하고 있어야 한다.

JSP EL(Expression Language)


  • Java bean의 프로퍼티나 array, list, map 같은 자료구조의 값을 쉽게 꺼낼 수 있게 해주는 표현식
  • Scriptlet 사용 최소화.

EL 표기법

  • immediate evaluation: JSP가 실행될 때 표현식으로 지정한 값이 JSP 페이지에 즉시 반영
    • ${표현식}
  • deferred evaluation: 표현식으로 지정된 값은 시스템에서 필요하다고 판단할 때 그 값을 사용

EL 검색 범위

  • pageScope -> JspContext 객체를 참조
  • requestScope -> ServletRequest 객체를 참조
  • sessionScope -> HttpSession 객체를 참조
  • applicationScope -> ServletContext 객체를 참조

JSTL(JSP Standard Tag Library)


  • JSP 확장 태그

태그 라이브러리 (종류)

prefixnameURI내용
ccorehttp://java.sun.com/jsp/jstl/core변수 지원, URL 관리, 흐름 제어 등
fnfunctionhttp://java.sun.com/jsp/jstl/functions문자열 조작 등
fmtformattinghttp://java.sun.com/jsp/jstl/fmt로케일, 타임존, 날짜, 시간 화폐 포멧팅 등
xxmlhttp://java.sun.com/jsp/jstl/xmlXML 처리
sqlsqlhttp://java.sun.com/jsp/jstl/sql데이터 소스 설정, SQL 쿼리 수행 등

core tag library


일반

  • <c:out> = <%= %>
  • <c:set>
  • 변수 생성, 변수 값 할당
  • JSP 로컬 변수가 아닌 지정한 scope의 저장소에 저장됨
  • <c:remove> : 변수 삭제

조건문/반복문

  • <c:if>
  • <c:choose>
  • <c:forEach>

기타

  • <c:url>
    • <c:param>
  • <c:redirect>

function tag library


함수

  • fn:startsWith()
  • fn:endsWith()
  • fn:contains()
  • fn:containsIgnoreCase()
  • fn:indexOf()
  • fn:trim()
  • fn:toLowerCase()
  • fn:toUpperCase()
  • fn:replace()

fmt


다국어 메세지 처리

  • fmt:setLocale : 로케일 설정
  • fmt:bundle : Resource Bundle 로딩
  • fmt:setBundle
    • Resource Bundle 로딩
    • basename으로 지정한 Resource Bundle을 로딩해서 var로 지정한 변수로 참조할 수 있도록 해 줌
  • fmt:bundle vs fmt:setBundle
    • fmt:bundle는 i18n 적용 scope 이 해당 태그 내로 한정
    • fmt:setBundle는 지정한 변수로 다른 곳에서 계속 참조 가능
  • fmt:message
    • 다국어 메세지 표시
    • fmt:setBundle 사용 시 bundle 속성에 Resource Bundler 변수를 지정
    • hello 값 설정하기
      • message.properties
        • hello=hello
      • message_en.properties
        • hello=hello
      • message_ko.properties
        • hello=안녕하세요
  • fmt:formatNumber : 숫자, 통화 포맷팅
  • fmt:formatDate : 날짜 포맷팅

예외 처리


  • 에러 처리용 페이지
  • JSP 내장 객체 exception 이용

0개의 댓글