6장. jsp (directives) -...

28
6. JSP 지시문 (Directives) 6

Upload: others

Post on 21-Sep-2019

2 views

Category:

Documents


0 download

TRANSCRIPT

6장. JSP 지시문 (Directives)

제6장

1. page 지시문

2/28 제6장

지시문의 종류 page (6장) include (6장) taglib (16장)

page 지시문 현재의 JSP 페이지 자체에 대해서 JSP 엔진 및 컨테이너에게각종 처리 정보를 전달하고 수행해야 할 기능을 정하는 역할

일반적으로 JSP 페이지의 가장 상단에 위치

<%@ page 속성1=“속성값1” 속성2=“속성값2” ... %>

사용예 1: <%@ page contentType="text/html; charset=utf-8"%>

사용예 2: <%@ page import="java.util.*, java.io.*, javax.sql.*" %>

사용예 3: <%@ page import="java.util.*" errorPage="error.jsp" %>

사용예 4: <%@ page isErrorPage="true" %>

1. page 지시문

3/28 제6장

page 지시문의 속성속성 설명 사용빈도 기본값

contentType브라우저로 내보내는 내용의 MIME 형식 지정 및 문자집합

지정매우 높음

text/html;charse

t=ISO-8859-1

pageEncoding 현재 JSP 페이지에 대한 문자집합 지정 거의 사용하지 않음 ISO-8859-1

import 현재 JSP 페이지에서 사용할 Java 패키지나 클래스를 지정 높음

errorPage 에러가 발생할 때에 대신 호출되어 처리될 JSP 페이지 지정 중간

isErrorPage 현재 JSP 페이지가 에러를 핸들링하는 페이지인지 지정 중간 false

info 현재 JSP 페이지에 대한 설명 중간

buffer 버퍼의 크기 중간 8KB

autoflush 버퍼의 내용을 자동으로 브라우저로 보낼지에 대한 설정 중간 true

session 세션의 사용유무 설정 중간 true

language 스크립트 언어 종류 지정 거의 사용하지 않음 java

isThreadSafe현재 JSP 페이지에 대한 접근은 한 순간에 하나의 쓰레드만

접근하도록 하여 동시 접근으로 인한 위험성 제거 설정거의 사용하지 않음 true

extends현재 JSP 페이지를 기본적인 클래스가 아닌 다른 클래스로

부터 상속하도록 변경거의 사용하지 않음

javax.servlet.jsp.

HttpJspPage

1. page 지시문contentType 속성 JSP 내용의 타입을 브라우저에 알리는 목적 브라우저 하여금 한글 처리를 올바르게 하도록 하는 목적

브라우저가 서버로부터 받은 내용에 대한 문자집합 결정기준

우선순위 1. HTTP 응답 헤더의 Content-Type 정보 내의 charset 속성 값

page 지시문의 contentType 속성이 HTTP 응답헤더의 Content-Type을설정하는 역할

page 지시문의 contentType 속성을 적지 않으면 Tomcat은 기본적으로server.xml에 있는 <Connector> 태그의 URIEncoding 속성에 설정된 것으로지정해 버리며 이것이 아래 우선 순위 2의 HTML의 <meta>선언보다우선한다.

우선순위 2. HTML 문서 내의 meta선언 및 http-equiv 속성으로 설정된Content-Type 헤더의 charset 속성 값

우선순위 3. HTML 문서 내 각 요소의 charset 속성 값

4/28 제6장

Content-Type: text/html; charset=utf-8

1. page 지시문contentType 속성 예제

5/28 제6장

01

02

03

04

05

06

07

08

09

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

<title>한글 테스트</title>

</head>

<body>

한글 테스트

</body>

</html>

[예제 6.1] jspbook\ch06\hangul_test1.jsp

[예제 6.2] jspbook\ch06\hangul_test2.jsp01

02

03

04

05

06

07

08

09

10

<%@ page contentType="text/html;charset=utf-8"%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

<title>한글 테스트</title>

</head>

<body>

한글 테스트

</body>

</html>

1. page 지시문pageEncoding 속성

JSP 1.2 사양에서 추가 contentType 속성에서 utf-8 인코딩 방법을 지정 에디터에서 JSP 저장시에 utf-8 인코딩 방법 사용 한글이사용되는 JSP 페이지내에서 contentType은명확하게

"text/html;charset=utf-8"으로지정하고 pageEncoding 속성은생략

6/28 제6장

"pageEncoding 속성이 지정되어 있지 않으면 contentType 속성에서

지정된 문자 코드로 JSP 파일을 읽어 들임"

1. page 지시문import 속성 Java 코딩에서의 import와 100% 동일한 역할 데이터베이스 처리, 수학 관련 함수, 파일 업로드, 이미지 처리등과같은 작업을 수행하기 위하여 관련된 패키지나 클래스를 지정하여활용하고자 하는 의도를 JSP 엔진 및 컨테이너에게 알려주는 역할

JSP 코딩을 할 때 프로그래머가 import하지 않아도 되는 패키지 java.lang.*; javax.servlet.*; javax.servlet.jsp.* javax.servlet.http.*;

7/28 제6장

<%@ page import="java.util.*" %>

1. page 지시문import 속성 사용법 예 한번에 여러 개의 패키지 및 클래스를 지정

하나의 패키지 및 클래스를 별도의 import 속성으로 지정

8/28 제6장

<%@ page import="java.util.*, java.sql.*, java.io.BufferedReader" %>

<%@ page import="java.util.*" %>

<%@ page import="java.sql.*" %>

<%@ page import="java.io.BufferedReader" %>

1. page 지시문import 속성 예제 import 속성 없이 Fully-qualified Name (완전한 이름) 을 활용한 예제

9/28 제6장

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

<%@ page contentType="text/html;charset=utf-8" %>

<html>

<head>

<title>완전한 이름 사용</title>

</head>

<body>

<%

java.util.Calendar cal = java.util.Calendar.getInstance();

%>

오늘의 날짜:

<%= cal.get(java.util.Calendar.YEAR) %>년

<%= cal.get(java.util.Calendar.MONTH) + 1 %>월

<%= cal.get(java.util.Calendar.DATE) %>일

</body>

</html>

[예제 6.3-1] jspbook\ch06\import_test1.jsp

// 1을 더하는 이유는cal.get( java.util.Calendar.MONTH)가0에서 11사이의 수를 리턴하기 때문

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

<%@ page contentType="text/html; charset=utf-8" %>

<%@ page import="java.util.Calendar" %>

<html>

<head>

<title>import 속성 및 단순한 이름 사용</title>

</head>

<body>

<%

Calendar cal = Calendar.getInstance();

%>

오늘의 날짜:

<%= cal.get(Calendar.YEAR) %>년

<%= cal.get(Calendar.MONTH) + 1 %>월

<%= cal.get(Calendar.DATE) %>일

</body>

</html>

1. page 지시문import 속성 예제 import 속성 사용

10/28 제6장

[예제 6.3-2] jspbook\ch06\import_test2.jsp

1. page 지시문errorPage와 isErrorPage 속성 errorPage

JSP 페이지 내에서 Exception이 발생하는 경우 새롭게 실행할 페이지를지정하기 위하여 사용

isErrorPage 현재 페이지가 Exception 처리를 위한 페이지임을 지정하기 위해 사용

10장

info 속성 JSP 페이지에 대한 설명을 기입하는 용도로 활용

11/28 제6장

<%@ page info="Writer: Youn-Hee Han" %>

<%@ page info="Date: 2008-08-15" %>

<%@ page info="Description: JSP Page directive's info attribute" %>

1. page 지시문buffer와 autoflush 속성 javax.servlet.jsp.JspWriter 클래스 객체인 out

웹 브라우저로 출력 결과를 내보낼 때 사용하는 기본 객체

out 객체가 지닌 버퍼 (buffer) 웹브라우저로 출력 결과를 바로 내보내는 것이 아니라 일정량만큼 쌓아서한꺼번에 보내는 역할

12/28 제6장

1. page 지시문buffer와 autoflush 속성 버퍼를 사용할 때의 장점

데이터를 좀 더 효율적이고 안전하게 전송할 수 있다. 데이터 전송 성능이 향상된다. JSP 수행 도중에 버퍼에 쌓인 내용 자체를 비울 수 있다. 버퍼에 쌓인 내용을 비우고 새로운 내용을 다시 버퍼에 넣을 수 있다. 버퍼가 가득 찰 때까지 HTTP 헤더 정보를 변경할 수 있다.

out 객체의 기본 버퍼 크기는 8Kbyte

기본 크기 변경 방법

13/28 제6장

<%@ page buffer="4kb" %>

1. page 지시문buffer와 autoflush 속성 버퍼를 사용하지 않도록 설정하는 방법

버퍼를 사용하지 않을 때의 제약사항

출력이 한번이라도 보내진 이후에 HTTP 헤더 내용을 변경할 수 없다. 보내어진 내용 자체를 취소할 수 없다. 보내어진 내용을 새로운 내용으로 바꿀 수 없다. 액션 태그인 <jsp:forward> 사용이 불가하다. (9장)

14/28 제6장

<%@ page buffer=“none" %>

1. page 지시문buffer와 autoflush 속성 flush 과정

JSP 출력 결과를 버퍼에 계속해서 넣게 되면 버퍼가 가득 차게 되는데기본적으로 버퍼가 가득 차게 되면 그 내용들을 모두 비우고 웹 브라우저로전송함

autoFlush 속성 autoFlush="true" (디폴트): 버퍼가 가득 차게 되면 버퍼의 내용을브라우저로 보내고 계속해서 작업을 진행한다.

autoFlush="false" : 버퍼가 가득차게 되면 java.io.IOException 발생시키고JSP 페이지 수행 작업을 중지한다.

15/28 제6장

1. page 지시문buffer와 autoflush 속성 예제

16/28 제6장

01

02

03

04

05

06

07

08

09

10

11

12

<%@ page contentType="text/html; charset=utf-8" %>

<%@ page buffer="1kb" autoFlush="false" %>

<html>

<head>

<title>버퍼 테스트 1</title>

</head>

<body>

<% for (int i=0; i<2000; i++) { %>

ABC

<% } %>

</body>

</html>

[예제 6.4-1] jspbook\ch06\buffer_test1.jsp

// 출력버퍼 사이즈는 1024 bytes, autoflush 속성은 false

// for 루프를 사용하여 ABC 글자를 2000번 출력

1. page 지시문buffer와 autoflush 속성 예제

17/28 제6장

01

02

03

04

05

06

07

08

09

10

11

12

<%@ page contentType="text/html; charset=utf-8" %>

<%@ page buffer="1kb" autoFlush=“true" %>

<html>

<head>

<title>버퍼 테스트 2</title>

</head>

<body>

<% for (int i=0; i<2000; i++) { %>

ABC

<% } %>

</body>

</html>

[예제 6.4-2] jspbook\ch06\buffer_test2.jsp

// 출력버퍼 사이즈는 1024 bytes, autoflush 속성은 true

// for 루프를 사용하여 ABC 글자를2000번 출력

session 속성 웹 브라우저와 Tomcat 사이에 지속적으로 필요한 정보를 저장

사용자가 로그인을 한 이후 계속적으로 로그인이 되어있는지에 관한정보, 쇼핑몰에서 장바구니에 담긴 아이템의 정보 등을 저장해 놓을 때세션을 활용

session 속성은 바로 이러한 기능을 활성화하거나 해지하는 목적으로활용

기본 값은 "true". 이 속성을 "false"로 지정하는 경우는 거의 없다. 8장, 11장

language 속성 서버 측 스크립팅 언어를 지정하기 위한 속성

향후 다른 언어를 지원할 수도 있을 가능성을 염두해 두고 만든 속성

1. page 지시문

18/28 제6장

<%@ page session="true" %>

<%@ page language="java" %>

isThreadSafe 속성 Tomcat은 각각의 사용자 요청에 대해서 프로세스를 만드는 것이아니라 쓰레드로 만들어 처리

이때, JSP 페이지가 지니고 있는 자원 (예를 들어, 멤버 변수)을 각쓰레드가 공유하기 때문에 예상치 못하게 공유된 자원의 데이터가엉뚱한 값을 가질 수도 있다.

page 지시문의 isThreadSafe 속성은 바로 이러한 쓰레드 처리로 인한안정성 문제를 보장하도록 지시하는 것

"false"로 설정할 이유가 없다.

1. page 지시문

19/28 제6장

<%@ page isThreadSafe="true" %>

extends 속성 JSP 페이지가 Servlet 소스로 변환되는 시점에서 Servlet이 상속받을클래스를 지정할 때 사용

JSP 2.1 스펙에서 정한 기본적인 상속 인터페이스 javax.servlet.jsp.HttpJspPage 인터페이스

Tomcat에서 위 인터페이스를 구현하는 클래스 org.apache.jasper.runtime.HttpJspBase

extends 속성은 위 Tomcat에서 제공하는 클래스가 아닌 다른 클래스를상속하여 Servlet으로 변경하고자 할 때 사용

사용할 이유가 거의 없다.

1. page 지시문

20/28 제6장

<%@ page extends="com.thinkonweb.runtime.HttpJspBase" %>

JSP에서 현재의 페이지로 다른 페이지를 포함하는 방법 include 지시문 <jsp:include> 액션 태그 (9장)

include 지시문의 사용법 아래의 코드를 JSP 파일의아무 곳이나 두면 된다.

중요 특성

JSP 파일을 Java파일로 변환하기 전에 include 지시문에서지정한 파일의 내용을 그대로현재 위치에 삽입시킨 후 Java파일로 변환

2.include 지시문

21/28 제6장

<%@ include file="포함할 파일" %>

include 지시문 예제

2.include 지시문

22/28 제6장

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

<%@ page contentType="text/html;charset=utf-8" %>

<html>

<head>

<title>include 지시문</title>

</head>

<body>

<%

String start ="[";

String end ="]";

%>

현재의 날짜와 시각은<%@ include file="date.jspf" %> // include 지시문을 통하여 date.jspf 파일을 포함입니다.

<br/><%= jspf_var %> // 현재 파일에서 선언되지 않은 변수인 jspf_var를 출력</body>

</html>

[예제 6.5-1] jspbook\ch06\includer.jsp

01

02

03

04

05

06

<%@ page contentType="text/html;charset=utf-8" %>

<%@ page import="java.util.*" %>

<%

String jspf_var = "좋은 시간 되세요.";

%>

<%= start + new Date() + end %>

[예제 6.5-2] jspbook\ch06\date.jspf

include 지시문 예제 date.jspf가 includer.jsp에삽입이 된 직후의includer.jsp의코드 모습

jspf에 사용된 page 지시문들은 합쳐진 페이지의상단에 위치한다고 생각해도 됨

page 지시문의contentType 속성이두 번 적용되게 되는데이는 한번만 적용되는 것으로 변경됨

가능하면 jspf 파일에는contentType을적지말자

2.include 지시문

23/28 제6장

<%@ page contentType="text/html;charset=utf-8" %>

<html>

<head>

<title>include 지시문</title>

</head>

<body>

<%

String start ="[";

String end ="]";

%>

현재의 날짜와 시각은

<%@ page contentType="text/html;charset=utf-8" %>

<%@ page import="java.util.*" %>

<%

String jspf_var = "좋은 시간 되세요.";

%>

<%= start + new Date() + end %>

입니다.

<br/>

<%= jspf_var %>

</body>

</html>

포함되는 파일의 변경과 적용

include 지시문을 사용해서 포함되는 파일이 변경될 경우 그것이 바로반영이 될까?

2.include 지시문

24/28 제6장

포함되는 파일의 변경과 적용

JSP 2.1 스펙에서 찾을 수 있는 이와 관련된 내용

Tomcat 6.0은 include 지시문으로 포함되는 파일의 변경 상태를감지해서 재컴파일 하고 새롭게 내용을 출력해준다.

하지만, 모든 웹 콘테이너가 이렇게 포함되는 파일의 내용을 감지하여다시 컴파일 하지는 않는다는 점에 주의

2.include 지시문

25/28 제6장

"include 지시문에 의하여 포함되는 파일 내용이 변경되었을 때 웹 콘테이너

는 그것을 알 수 있는 매커니즘을 포함할 수 있으며 include 지시문을 사용하

는 JSP 페이지를 재컴파일할 수도 있다. 하지만, 강제사항은 아니다."

include 지시문의 적당한 활용 예 include 지시문은 다음과 같이 두 가지 용법으로 사용

많은 JSP 페이지에서 자주 사용되는 공용 변수 지정 많은 JSP 페이지에서 간단하면서도 중복되어 사용되는 텍스트나 문구 (예: 날짜나 저작권 표시)

많은 JSP 페이지가 다음과 같이 session 기본 객체에 저장된 속성 값몇몇 개를 읽어 사용한다고 가정

2.include 지시문

26/28 제6장

<%

String userID = (String)session.getAttribute("USERID");

String userName = (String)session.getAttribute("USERNAME");

%>

...

<%= userID %>

<%= userName %>

...

이 부분을 별도의 파일로 만들고include 지시문으로 포함해서 사용하는편이 좋음

include 지시문의 적당한 활용 예 포함되는 파일 만들기: sessionVar.jspf

포함하는 파일

2.include 지시문

27/28 제6장

<%

String userID = (String)session.getAttribute("USERID");

String userName = (String)session.getAttribute("USERNAME");

%>

<%@ include file="sessionVar.jspf" %>

...

<%= userID %>

<%= userName %>

...

include 지시문의 적당한 활용 예 포함되는 파일 만들기: dateNotify.jspf

포함하는 파일

2.include 지시문

28/28 제6장

<%

java.util.Calendar cal = java.util.Calendar.getInstance();

%>

<%= cal.get( java.util.Calendar.YEAR) %>년

<%= cal.get( java.util.Calendar.MONTH) + 1 %>월

<%= cal.get( java.util.Calendar.DATE) %>일

...

...

<%@ include file="dateNotify.jspf" %>

<body>

<html>