액션, 디렉티브, 스트립트 태그 3가지 기억하기
디렉티브 태그(<%@) : page, include, taglib
<%@page import="java.util.Date"%>
페이지태그 속성 값
include : jsp안에 또다른 jsp가 들어간다
**중요! taglib : c태그, format, EL, JSTL
액션 태그 : 최근엔 거의 안씀 redirect, forward 등이 있다
표현언어 JSTL(JSP Standard Tag Library)
값을 표현하는데 사용하는 스크립트 언어
JSP의 스크립트 요소를 보완하는 역할을 함.
// ex
<jsp:include page=="/module/${skin.id}/header.jsp" flush="true" />
// 액션 태그나 커스텀 태그 + 비스크립트 요소 부분에서도 값을 출력하기 위해 사용 가능
// ex
${sessionScope.member.id}님 환영합니다.
JSP 페이지에 대한 정보를 입력
JSP가 생성할 문서의 타입, 사용할 클래스, 출력 버퍼의 존재 여부, 세션에 참여하는지 여부
JSP 디렉티브 작성 예
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="java.util.Date" %>
주요 속성
contentType : JSP가 생성할 문서의 타입을 지정
//설정 예
<%@ page contentType="text/html; charset=utf-8" %>
//UTF-8 캐릭터 셋을 이용하는 html 문서를 생성
//MIME 타입으로 text/html을 사용하고, charset의 값으로 UTF-8을 갖도록 //contentType 속성 값을 설정
import : JSP 페이지에서 사용할 자바 클래스를 지정
//사용 예
<%@ page import = "java.util.Calendar" %>
<%@ page import = "java.util.Calendar, java.util.Date" %>
<%@ page import = "java.util.*" %>
session : JSP 페이지가 세션을 사용할 지의 여부를 지정
info : JSP 페이지에 대한 설명을 입력한다.
errorPage : 에러가 발생할 때 보여줄 페이지를 지정 (true)
isErrorPage : 에러 페이지인지의 여부를 지정 (기본 false)
<%@ page language="java" contentType="text/xml; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h2>contentType 디렉티브 태그</h2>
<h4>text/xml : XML 출력</h4>
<h4>charset=UTF-8 : 문자 인코딩</h4>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page import="java.util.Date"%>
<%@ page import="java.io.*, java.lang.*" %>
<%@ page session="true" %>
<!-- 복수로 import 사용하고 싶을 때 * 사용 -->
<!-- 세션은 기본 true, 여기서 세션 : jsp 내장객체 중 하나(세션, 어플리케이션, utf, page 등 8개 있음!) -->
<!DOCTYPE html>
<html>
<head>
<title>Directives Tag</title>
</head>
<body>
Today is : <%=new Date()%>
<hr>
page 디렉티브의 import 속성 : JSP 페이지에서 사용할 자바 클래스 설정<br>
JSP 컨테이너가 자동으로 java.io.*와 java.lang.* 패키지를 가져와줌
* page session="true"<br>
page 디렉티브의 session 속성 : 현재 JSP 페이지의 HTTP 세션 사용 여부 설정<br>
기본값은 true(세션을 자동으로 사용함)이고, 생략 가능<br>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ page errorPage="MyErrorPage.jsp" %>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<%
String str = null;
//오류 발생 -> page 디렉티브의 errorPage속성의 값으로
//MyErrorPage.jsp URL로 이동
out.print(str.toString());
%>
</body>
</html>
<%@page import="java.io.PrintWriter"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %>
<!-- isErrorPage="true" -> "에러페이지가 맞다" (기본은 false) -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Directives Tag</title>
</head>
<body>
<img src="/images/500.jpg" alt="500오류발생" title="500오류발생">
<!-- <h4>errorPage 디렉티브 태그</h4> -->
<!-- <h5>오류가 발생했습니다.</h5> -->
<!-- * page 디렉티브의 isErrorPage 속성은 현재 JSP 페이지가 오류 페이지인지<br> -->
<!-- 여부를 설정하는데 사용. 기본값은 false. -->
<%
//exception.printStackTrace(new PrintWriter(out));
%>
</body>
</html>
JSP는 실행 도중 exception이 발생할 때 에러 화면 대신 지정한 JSP 페이지를 보여줄 수 있는 기능을 제공하고 있음.
exception이 발생하면 보여줄 JSP 페이지는 page 디렉티브의 errorPage 속성을 사용하여 지정
에러페이지 지정
<%@ page errorPage = "예외발생시보여질JSP지정" %>
에러페이지 작성
<%@ page isErrorPage = "true" %>
//error 페이지에 해당하는 JSP 페이지는 page 디렉티브의 isErrorPage 속성의 값을 true로 지정해야 함
//exception 기본 객체 : 발생한 예외 객체
// exception.getMassage() : 예외 메시지
// exception.printStackTrace() : 예외 추적 메시지 출력
<!--
error-code : 404(없다), 500(개발자 실수) 등의 응답 상태 코드
location : 오류페이지의 URI(URL(경로) + 기능(파라미터 목록))
-->
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
<!-- 밑의 500 에러코드가 먼저 실행, 없다면 위 에러코드 실행 -->
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/error/500.jsp</location>
</error-page>
에러 페이지 우선 순위
1. page 디렉티브의 errorPage 속성에서 지정한 에러 페이지를 보여준다.
2. JSP 페이지에서 발생한 예외 타입이 web.xml파일의 에서 지정한 예외 타입과 동일한 경우 지정한 에러 페이지를 보여준다.
3. JSP 페이지에서 발생한 에러 코드가 web.xml파일의 에서 지정한 예외 타입과 동일한 경우 지정한 에러 페이지를 보여준다.
4. 아무것도 해당되지 않을 경우 웹 컨테이너가 제공하는 기본 에러 페이지를 보여준다.
버퍼와 에러 페이지
에러 페이지는 버퍼가 플러시 되기 전에 처리되어야 함
버퍼 처리 과정
page 디렉티브의 autoFlush 속성
버퍼가 다 찼을 때 처리 방식 지정
true : 버퍼가 다 찼을 경우 버퍼를 플러시하고 계속해서 작업을 진행한다.
false : 버퍼가 다 찼을 경우 예외를 발생시키고 작업을 중지한다.
autoFlush 속성이 true일 때, JSP 페이지가 생성하는 데이터 크기가 버퍼 크기보다 커지면 자동으로 버퍼를 플러시하므로 정상적으로 실행됨
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page errorPage="/error/noParamEx.jsp" %>
<!-- web.xml에 기재된 오류보다 errorPage가 더 우선순위가 높다 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파라미터가 없는 오류가 발생함</title>
</head>
<body>
/error/noParamEx.jsp를 생성하여 오류 처리<br>
<pre>
* 오류 페이지 처리 순서
우선순위 1. page 디렉티브의 errorPage 속성 사용(전용 오류 처리)
우선순위 2. web.xml파일의 exception-type(범용 오류 처리)
우선순위 3. web.xml파일의 error-code(별도 오류 처리)
우선순위 4. 우선순위1~3까지 아무것도 안했다면..웹컨테이너(tomcat)가 제공하는 기본 오류 페이지를 보여줌.
</pre>
<%
//memId=a001과 같은 파라미터가 없을 시 null을 toUpperCase하는 과정에서 오류 발생
String memId = request.getParameter("memId").toUpperCase();
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>파라미터 출력</title>
</head>
<body>
name 파라미터 값 :
<%
try{
out.print(request.getParameter("name").toUpperCase());
}catch(Exception ex){
out.print("<img src='/images/500.jpg'>");
}
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page buffer="1kb" %>
<%@ page errorPage="/error/noParamEx.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>버퍼 플러시 이후 예외 발생 결과</title>
</head>
<body>
<!-- 1KB를 초과하는 데이터를 출력하여 버퍼가 flush 되도록 해보자 -->
<%
for(int i=0; i<256; i++){
out.print(i + " ");
}
%>
<!-- 자바에서 0으로 나누면 ArithmeticException 발생 -->
<%= 1/0%>
</body>
</html>