2024. 4. 1. 01:48ㆍBE/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 사용. |
request
와 response
를 유지하려면 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 |