[Servlet_JSP] JSP

2024. 4. 1. 01:48BE/Servlet_JSP

1. JSP란

 

  • Jakarta Server Pages
  • 이전 명칭: JavaServer Pages
  • HTML내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려주는 서버 사이드 스크립트 언어.

 

실행 시에는 자바 서블릿으로 변환된 후 실행되므로 서블릿과 거의 유사하다고 볼 수 있다.

 

JSP → Servlet(.java) → 컴파일(.class) → HTML

 

 

JSP의 실행을 요구하고, JSP는 웹 애플리케이션 서버의 서블릿 컨테이너에서 서블릿 원시코드로 변환된다.

 

그 후에 서블릿 원시코드는 바로 컴파일된 후 실행되어 결과를 HTML 형태로 클라이언트에 돌려준다.

 


2. JSP Scriptlet

 

가. 선언문

<%! 멤버변수와 method 작성 %>

<%!
String member;

public void m1(){
    out.println(member);
}
%>

Servlet의 멤버변수와 메서드로 선언되는 것과 같다.

 

Servlet은 아무리 많은 요청이 발생해도 단 하나만 만들어진다.

 

멤버변수와 메서드를 공유하게 된다.

 

때문에 이 둘을 만들고 사용하는 것에 각별한 주의가 필요하다.

 

잘 사용하지 않는다.

 


나. Scriptlet

<% java code %>

Servlet 변환시 service()에 해당하는 영역.

 

request, response에 관한 코드를 구현.

 


다. 표현식

<%= 출력 데이터 %>

<%= "<h1>Hello World!</h1>" %>

데이터를 브라우저에 출력할 때 사용.

 

주의점! 세미콜론을 붙이지 않는다.

(System.out.println(출력 데이터;);와 같은 상황이 된다.)

 


라. 주석

<%-- 주석 --%>

코드 상에서 부가 설명을 작성.

 

html 주석, java 주석, jsp 주석의 차이점을 알아야 한다.

 

  • jsp 주석 → 서블릿으로 만들어지지 않음.
  • java 주석 → 서블릿으로는 만들어지지만 html로 만들어지지 않음.
  • html 주석 → html로 만들어짐. 클라이언트에 노출된다.

 


3. JSP Directives

 

가. page Directive

<%@ page ... @>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.company.example.Example"%>

컨테이너에게 현재 JSP 페이지에 대한 기본적인 정보를 제공한다.

 

속성 기본값 설명
language java 스크립트에서 사용할 언어를 지정
info 없음 페이지에 대한 정보를 제공
contentType text/html; charset=ISO-8859-1 응답 페이지의 MIME 유형 및 문자 인코딩을 지정
pageEncoding ISO-8859-1 페이지에서 사용되는 문자 인코딩을 지정
import 없음 페이지에서 사용할 자바 클래스를 지정
session true 세션을 사용할지 여부를 지정
errorPage 없음 예외가 발생했을 때 표시할 페이지를 지정
isErrorPage false 현재 페이지가 errorPage인지 여부를 지정
buffer 8kb 출력 버퍼의 크기를 지정
autoFlush true 출력 버퍼가 꽉 차면 자동으로 출력할지 여부를 지정
isThreadSafe true 페이지가 멀티 스레드로부터 안전한지 여부를 지정. (deprecated)
extends javax.servlet.jsp.HttpJspPage 현재 JSP 페이지를 기본적인 클래스가 아닌 다른 클래스로부터 상속하도록 변경.

 

외우지 말 것.

 


나. include Directive

 

<%@ include file="include.jsp" %> 
<jsp:include page="include.jsp" />

특정 jsp 페이지를 삽입.

 

반복되는 view를 하나만 만들고 필요한 곳에 include 한다.

 

코드의 중복이 크게 줄어 유지보수가 아주 쉬워진다.

 

  정적 include  동적 include
코드 <%@ include file="include.jsp" %> <jsp:include page="include.jsp" />
삽입 시점 컴파일 시점 요청 시점
변경 반영 포함된 페이지가 변경되었을 때, 메인 페이지를 재컴파일해야 변경 사항이 반영됨 포함된 페이지가 변경되었을 때, 메인 페이지를 재컴파일하지 않아도 변경 사항이 반영됨
변수 부모 jsp에서 정의한 변수를 자식 jsp에서 그대로 사용할 수 있다. 부모와 자식 jsp는 별개의 파일로 간주되어 변수를 공유하지 않는다.
import 부모 jsp에서 import하면 자식 jsp에서 그대로 사용할 수 있다. 부모와 자식 jsp는 별개의 파일로 간주되어 따로 import해야한다.
랜더링 과정 부모 JSP파일과 include되는 자식 JSP가 하나의 파일로 합쳐진 후, Java파일로 변경되어 class파일로 컴파일된 후 HTML로 랜더링된다. 부모 JSP 파일이 Java로 변경된 후 class로 컴파일 되고 HTML로 렌더링 되는 실행 시점에 자식 JSP가 include 된다.

 


다. tag library Directive

<%@ taglib ... @>

<%@ taglib uri = "http://www.example.com/custlib" prefix = "mytag" %>

JSTL 또는 사용자에 의해서 만든 커서텀 태그를 이용할 때 사용한다.

 

JSP 페이지 내에 불필요한 자바 코드를 줄일 수 있다.

 

추후에 자세히 공부해 보자.

 


4. JSP 내장 객체

 

가. 내장 객체

 

기본 객체명 type 설명
page Object 현재 JSP 페이지에 대한 참조 변수
request HttpServletRequest 클라이언트의 요청 정보를 담고 있는 객체
response HttpServletResponse 클라이언트에게 응답할 정보를 담는 객체
session HttpSession 세션 정보를 관리하는 객체. false 시 내장 객체를 생성하지 않음.
application ServletContext 웹 어플리케이션의 정보를 담는 객체
pageContext PageContext 페이지의 컨텍스트 정보를 관리하는 객체
out JspWriter 출력 버퍼를 관리하는 객체
config ServletConfig 현재 JSP의 설정 정보를 관리하는 객체
exception Throwable 예외 정보를 관리하는 객체 (errorPage 지시자가 true인 경우에만 사용 가능)

 

1) Context path 소프트코딩

<% String path = request.getContextPath(); %>
<form action="<%= path %>/main" method="post"> ... </form>

내장 객체 request를 활용하면 Context Path를 소프트코딩할 수 있다.

 

부담 없이 언제든 Context Path를 교체할 수 있다.

 


나. 웹 스코프

 

웹 스코프는 데이터를 공유하는 영역을 뜻한다.

 

JSP 간에 데이터를 공유하기 위해서 웹 스코프를 지원한다.

 

각 스코프는 서로 다른 생명 주기와 범위를 가진다.

 

필요한 데이터 공유 범위에 따라 적절한 스코프를 선택하여 사용한다.

 

JSP에서는 아래의 4가지 웹 스코프를 제공한다.

 

  

스코프 종류 사용 가능 범위  데이터 소멸 시점
Page Scope 현재 페이지 페이지 종료 시
Request Scope 클라이언트의 한 번의 요청 요청 처리 완료 시
Session Scope 사용자 세션 동안 세션 종료 시
Application Scope 웹 어플리케이션 전체 어플리케이션 종료 시

 

Application > Session > Request > Page

 

이런 스코프에 데이터를 저장하고 불러오는 방법은 다음과 같다.

 

 

method 설명
void setAttribute(String name, Object value) 문자열 name을 이름으로 Object 타입의 데이터를 저장.
Object getAttribute(String name) 문자열 name에 해당하는 속성 값을 반환. 없으면 null. 리턴값에 따른 적절한 형 변환이 필요하다.
void removeAttribute(String name) 문자열 name에 해당하는 속성을 삭제한다.
Enumeration getAttributeNames() 현재 객체에 저장된 모든 속성들의 이름을 반환.

 


다. forward vs sendRedirect

 

  forward(request, response)  sendRedirect(location)
사용 방법 RequestDispatcher dispatcher = request.getRequestDispatcher(path);
dispatcher.forward(request, response);
response.sendRedirect(location);
이동 범위 동일 서버(project) 내 경로 동일 서버, 타 서버 URL.
location bar 기존 URL 유지. (실제 이동되는 주소 확인 불가) 이동하는 URL로 변경.
객체 기존의 request와 response 유지 새로운 request와 reponse 생성
데이터 유지 request.setAttribute(name, value)로 전달. session이나 cookie 사용.

 

requestresponse를 유지하려면 forward를 사용해야 한다.

 

redirect는 새로운 request를 생성한다.

 


'BE > Servlet_JSP' 카테고리의 다른 글

[Servlet_JSP] JSTL  (0) 2024.04.08
[Servlet_JSP] EL  (0) 2024.04.08
[Servlet_JSP] Cookie&Session  (0) 2024.03.31
[Servlet_JSP] Servlet  (0) 2024.03.31