edu day 40, 43
서블릿과 마찬가지로 동적인 웹 어플리케이션을 개발할 때 사용 가능한 웹 컴포넌트이다.
- 태그(tag) 기반의 웹 컴포넌트로서 jsp확장자를 갖는다.
- 서블릿과 동일하게 클라이언트에 요청에 의해서 동적으로 실행된다.
- html 파일 요청방식과 동일하게 JSP를 요청할 수 있다.
- 서블릿과 동일하게 JSP의 응답결과는 html 형식으로 서비스된다.
- JSP는 자동으로 서블릿으로서 변환되어 실행된다.
- MVC 패턴의 View 역할로서 JSP가 사용된다.
- 변환단계
- 요청된 JSP파일은
파일명_jsp.java
파일명을 가진 서블릿으로 변환되어진다.
앞에서 배웠던 서블릿과 100% 일치하는 형태는 아니지만 내부적으로 서블릿으로 동작된다.
- 컴파일 단계
- 변환된 서블릿을 컴파일하는 단계이다.
파일명_jsp.class
형식을 갖는다.
JSP파일에 문법적으로 에러가 있으면 컴파일 에러가 발생되어 변환되지 않는다.
- 실행 단계
- 컴파일된 파일을 실행시키는 단계이다.
실행된 결과는 HTML형식으로 응답되어진다.
웹 브라우저에 예외를 출력하는 화면이 나오면 실행 시 예외(Runtime Exception)가 발생된 것이다. 따라서 JSP 코드를 디버깅해야 된다.
. | Servlet | JSP |
---|---|---|
특징 | Java 코드 안에 HTML 코드가 삽입된 형태이다.따라서 HTML 을 작성하는 Java 코드 작업이 복잡하다. | HTML 코드 안에 Java 코드가 삽입된 형태이다.서블릿에 비해서 HTML 코드를 쉽게 작성할 수 있다. |
목적 | Java 코드를 이용한 Business Logic 처리에 적합하다. 따라서 MVC패턴의 Controller 역할로 사용된다. | tag 를 이용한 Presentation Logic 처리에 적합하다. 따라서 MVC 패턴의 View역할로 사용된다. |
JSP에서 사용 가능한 태그 목록
- HTML 요소
- JSP 스크립팅 요소
- JSP 표준 액션태그 요소
- EL 요소
- 커스텀 태그 라이브러리 요소
아래는 JSP 스크립팅 요소로서 JSP페이지가 서블릿으로 변환 시 JSP엔진에 의해서 처리되며 <% ~ %>
형식을 갖는다.
<%-- 주석 --%>
: Comment tag. 주석
<%@ 지시자 %>
: Directive tag. import부분에서 사용
<%! 자바 선언문 %>
: Declaration tag. 멤버변수, 멤버함수 선언시 사용
<% javacode %>
: Scriptlet tag.
<%= 자바 표현식 %>
: Expression tag.out.print
와 같은 기능.
JSP 페이지에서 설정 가능한 속성을 지시하는 용도로 사용된다.
basic syntax:
<%@ page 속성명="속성 값" 속성명2="속성 값2" %>
속성명 | 기본값 | 설명 | 예 |
---|---|---|---|
contentType | text/html | 응답 시의 MIME 타입 | contentType="text/html" |
import | 없음 | import할 패키지 지정 | import="java.util.ArrayList" |
errorPage | 없음 | 에러 발생 시 처리할 에러 페이지 지정 | errorPage="error.jsp" |
isErrorPage | false | 현재 페이지를 에러 페이지로 지정 | isErrorPage="false" |
extends | 없음 | 상속받은 클래스명 지정 | extends="패키지포함 클래스명" |
JSP의 현재 페이지에서 다른 HTML 및 JSP페이지를 정적으로 삽입할 수 있는 방법이다.
<%@ include file="포함할 페이지" %>
<jsp:include page="포함할 페이지" />
👍실습
: 아래는 first.jsp 파일이다. 이 파일에서 jsp:include page
를 통해 inclue/top.jsp
파일을 불러오고자 한다. 정상적으로 include 되었는지 확인하고,
이때 top.jsp
파일에 <h1>
태그를 설정하여 호출한 곳에서 스타일 적용이 되는지 확인하는 작업이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setAttribute("xxx", "홍길동");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
h1{color: red;}
</style>
</head>
<body>
first.jsp<br>
아래화면은 top.jsp를 jsp:include 시킨 내용입니다.<br><hr>
<jsp:include page="include/top.jsp" flush="true"/>
<br><hr>
다시 first.jsp 내용입니다.
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String mesg = (String)request.getAttribute("xxx");
%>
<h1>
top.jsp
안녕하세요? mesg === <%= mesg %>
num === 10
</h1>
</body>
</html>
top.jsp만 실행했을 때 다음과 같다.
first.jsp에서 include시킨 top.jsp는 다음과 같다.
--> 정상적으로 include됨과 동시에 스타일까지 적용되는 것을 확인할 수 있다.
JSP에서 외부 라이브러리로 만든 태그(tag)를 지정할 때 사용하는 방법이다.
대표적으로 JSTL(JSP Standard Tag Library)
이 제공된다.
<%@ taglib uri="TLD파일 URL" prefix="네임스페이스명"%>
내장 객체(내장 변수) | 설명 |
---|---|
❗request | HttpServletRequest 객체 참조 |
❗response | HttpServletResponse 객체 참조 |
❗out | 웹 브라우저에 출력에 사용되는 JspWriter 객체 참조 |
❗session | HttpSession 객체 참조(session="true"인 경우에만 사용 가능) |
❗application | ServletContet 객체 참조 |
page | 자바 클래스의 this와 동일 |
exception | 발생되는 예외의 Throwable 객체에 대한 참조 (isErrorPage="true"인 경우에만 사용 가능) |
- request : 서블릿 과정에서 학습한 입력 파라미터 처리, 한글 인코딩, 요청 표워드, request scope기반의 속성(attribute) 설정, 쿠키 정보 얻기 등 JSP에서 구현 가능
- response : 서블릿 과정에서 학습한 쿠키 정보 저장, 요청 redirect 처리방법 등 JSP에서 구현 가능
- out : PrintWriter객체와 동일한 기능. 웹 브라우저로 데이터를 출력할 때 사용된다.
out 내장 객체는
다음과 같은 2가지 방법이 제공된다.
<%
String name = "홍길동";
%>
<%= name %>
<%
String name = "홍길동";
out.print(name);
%>
Http 프로토콜을 기반으로 하는 웹 서비스는 웹 서버의 부하가 매우 크기 때문에 불특정 다수인 클라이언트와 지속적인 연결방식으로 요청/응답을 처리하지 않고, 요청하고 응답받으면 즉시 연결을 끊는 Connectionless 방식으로 동작한다.
따라서 각 페이지 간에 특정 데이터를 공유할 방법이 필요한데 이를 세션 관리
라고 한다.
다음과 같은 두 가지 방법으로 처리한다.
- HttpSession 클래스를 이용한 세션 처리
- Cookie 클래스를 이용한 세션 처리
여기서 Session
이란❓
--> 사용자의 상태 정보를 서버에서 관리하는 메커니즘을 의미한다.
세션의 정보는 클라이언트가 서버에 접속해서 종료될 때 까지(브라우저 종료) 유지된다.
상태 정보가 서버에 저장되기 때문에 서버에 부하가 클 수 있기 떄문에 time-out 제한을 두어 일정시간(기본30분)동안 요청이 없으면 서버는 세션정보를 유지하지 않고 제거한다.
1) time-out을 지정하여 제거한다.
-setMaxInactiveInterval(60*60*24)
//24시간 유지
2) 즉시 제거한다.
-session.invalidate()
//즉시 제거
3) 세션에 저장된 특정 속성 값을 제거한다.
-session.removeAttribute(name)
// name값에 해당되는 속성 값만 제거
쿠키는 사용자의 상태정보를 클라이언트에서 관리하는 메커니즘을 의미한다.
쿠키는 도메인당 300개까지 저장이 가능하지만, 클라이언트에서 쿠키를 사용하지 못하도록 설정할 수 있기 때문에 제약이 있다.
쿠키는 클라이언트의 브라우저 메모리 또는 OS 파일에 저장 가능하다.
세션과 동일하게 time-out적용이 가능하다.
- SetServlet파일에서 쿠키를 생성한다.
- 작업하고 응답에 쿠키를 추가한다.
- 응답처리
- GetServlet파일에서 요청에서 쿠키를 얻는다.
EL은 데이터를 웹 브라우저에 출력하기 위한 언어로서 문법이 직관적으로 사용하기 쉽게 구성이 되어 있다. (널값 처리에 용이)
${ 표현식 }
.
: 자바빈 또는 Map에 접근할 때 사용
[]
: 배열 또는 List에 접근할 때 사용
()
: 우선순위 연산자
empty
: 값이 null인지 판단하는 연산자로서 true 리턴
+
,-
,*
,/
,%
: 산술 연산자 및 나머지 연산자
%%
, ||
, !
: 논리 연산자
==
, >
, >=
, <
, <=
, !=
: 비교 연산자
pageScope
: page 영역에 존재하는 변수 참조 시 사용
requestScope
: request 영역에 존재하는 변수 참조 시 사용
sessionScope
: session 영역에 존재하는 변수 참조 시 사용
applicationScope
: application 영역에 존재하는 변수 참조 시 사용
param
: 파라미터 값을 참조 시 사용
paramValues
: 파라미터 배열 값을 참조 시 사용
initParam
: context 초기화 파라미터 참조 시 사용