14 장 . 이미지 처리 및 웹 어플리케이션의 배포

44
14 장 . 장장장 장장 장 장 장장장장장장장 장장 장 14 장

Upload: ninon

Post on 15-Jan-2016

206 views

Category:

Documents


0 download

DESCRIPTION

14 장 . 이미지 처리 및 웹 어플리케이션의 배포. 1. Thumbnail 이미지 만들기. 썸네일 (thumnail) 이미지 원본 이미지에 대해서 가로 및 세로 크기를 줄여서 파일 사이즈를 작게 만든 이미지. Google 이미지 검색에 사용되는 썸네일 이미지들. 1. Thumbnail 이미지 만들기. 썸네일 (thumnail) 이미지를 만드는 방법 이미지 처리 기능 구현 - PowerPoint PPT Presentation

TRANSCRIPT

14 장 . 이미지 처리 및 웹 어플리케이션의 배포

제 14 장

1. Thumbnail 이미지 만들기썸네일 (thumnail) 이미지

원본 이미지에 대해서 가로 및 세로 크기를 줄여서 파일 사이즈를 작게 만든 이미지

제 14 장2/44

Google 이미지 검색에 사용되는 썸네일 이미지들

1. Thumbnail 이미지 만들기썸네일 (thumnail) 이미지를 만드는 방법

이미지 처리 기능 구현 java.awt.*, java.awt.image.*, javax.imageio.*, javax.swing.* 과

같은 패키지를 사용 각 클래스마다 썸네일 이미지를 만들기 위한 몇몇 개의 메소드들을 활용 이들 메소드들에 대한 자세한 설명까지는 이 책에 담지 않는다 . 이미지 처리에 관한 이들 메소드들에 대한 자세한 동작방법은 다른 Java

이미지 처리 관련 책 참고

제 14 장3/44

1. Thumbnail 이미지 만들기썸네일 이미지를 만드는 유틸리티

제 14 장4/44

01

02

03

04

05

06

07

08

09

10

11

12

13

14

14

16

17

18

19

20

21

22

23

24

package thinkonweb.util;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

public class ImageUtil {

public static final int HEIGHT = 0;

public static final int WIDTH = 1;

public static int getWidth(String img) {

Image imgSource = new ImageIcon(img).getImage();

return imgSource.getWidth(null);

}

public static int getHeight(String img) {

Image imgSource = new ImageIcon(img).getImage();

return imgSource.getHeight(null);

}

[ 예제 14.1] jspbook \ WEB-INF\java_sources\ImageUtil.java

1. Thumbnail 이미지 만들기썸네일 이미지를 만드는 유틸리티

제 14 장5/44

25

26

27

28

29

30

31

32

33

34

35

-

36

37

38

39

40

41

42

43

44

45

46

47

public static void createThumbnail(String img, String thumb, int size, int direction) throws Exception {

Image imgSource = new ImageIcon(img).getImage();

Image thumbSource = null;

if (direction == WIDTH)

thumbSource = new ImageIcon(

imgSource.getScaledInstance(size, -1, Image.SCALE_SMOOTH)).getImage();

else

thumbSource = new ImageIcon(

imgSource.getScaledInstance(-1, size, Image.SCALE_SMOOTH)).getImage();

BufferedImage bi = new BufferedImage(thumbSource.getWidth(null), thumbSource.getHeight(null),

BufferedImage.TYPE_3BYTE_BGR);

Graphics g = bi.getGraphics();

g.drawImage(thumbSource, 0, 0, null);

try {

if (img.endsWith("jpg"))

ImageIO.write(bi, "jpg", new File(thumb));

else if (img.endsWith("gif"))

ImageIO.write(bi, "gif", new File(thumb));

} catch (Exception e) {

System.out.println(e);

}

}

}

[ 예제 14.1] jspbook \ WEB-INF\java_sources\ImageUtil.java

1. Thumbnail 이미지 만들기ImageUtil 클래스의 두 개의 정적 메소드 사용 예시

위 예에서 보면 각각 가로와 세로 길이만을 설정하지만 새롭게 만들어지는 이미지는 가로와 세로가 동시에 변환된 이미지가 된다 .

즉 , 원본 이미지에 대해 가로 길이를 100 으로 설정하면 그 비율대로 세로 길이도 맞추어서 저장된다 .

제 14 장6/44

ImageUtil.createThumbnail(imagePath, thumbPath, 100,

ImageUtil.WIDTH);

: imagePath 경로에 있는 원본 이미지에 대해 가로 길이를 100 으로 설정한 새로운 이미지를 thumbPath 경로에 저장한다 .

ImageUtil.createThumbnail(imagePath, thumbPath, 50,

ImageUtil.HEIGHT);

: imagePath 경로에 있는 원본 이미지에 대해 세로 길이를 50 으로 설정한 새로운 이미지를 thumbPath 경로에 저장한다 .

1. Thumbnail 이미지 만들기눈에 보이는 크기만을 줄이는 예제

제 14 장7/44

01

02

03

04

05

06

07

08

09

10

11

12

13

14

-

14

16

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

<%@ page import="thinkonweb.util.ImageUtil" %>

<html>

<head><title> 단순 이미지 크기 변환 </title></head>

<body>

<%

String imagePath = application.getRealPath("/ch14/bridge.jpg");

int imageWidth = ImageUtil.getWidth(imagePath); // 이미지의 가로 길이를 얻어옴int imageHeight = ImageUtil.getHeight(imagePath); // 이미지의 세로 길이를 얻어옴%>

<h3> 원본 이미지 </h3>

<img src="bridge.jpg" border="0"><br>

<h3> 단순하게 절반 크기로 변환된 이미지 </h3>

<img src="bridge.jpg" border="0" width="<%= imageWidth/2 %>"> // 기존 이미지의 가로 크기의 절반만큼 크기로 이미지를 출력</body>

</html>

[ 예제 14.2] jspbook\ch14\imagesize.jsp

<img src="bridge.jpg" border="0"

width="50%">

1. Thumbnail 이미지 만들기썸네일 이미지를 이용하는 예제

제 14 장8/44

[ 예제 14.3] jspbook\ch14\thumb.jsp

01

02

03

04

05

06

07

08

09

-

10

11

12

13

14

14

16

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

<%@ page import="thinkonweb.util.ImageUtil" %>

<html>

<head><title> 썸네일 이미지 만들기 </title></head>

<body>

<%

String imagePath = application.getRealPath("/ch14/bridge.jpg"); // 이미 존재하는 원본 이미지 경로String thumbPath = application.getRealPath("/ch14/thumb-bridge.jpg"); // 새 롭 게 만 들 썸네일 이미지 경로ImageUtil.createThumbnail(imagePath, thumbPath, 200, ImageUtil.WIDTH); // 가로 길이를 200 으로 설정한 새로운 이미지를 thumbPath 경로에 저장%>

<h3> 원본 이미지 </h3>

<img src="bridge.jpg" border="0"><br>

<h3> 썸네일 이미지 </h3>

<img src="thumb-bridge.jpg" border="0">

</body>

</html>

2. 동적 이미지 출력정적 vs. 동적 이미지

정적 (static) 이미지 이미 그 내용이 결정되어 있는 파일로 존재하는 이미지

동적 (static) 이미지 파일 형태로 존재하지 않는 이미지이며 임의의 요청이 있는 순간 그 내용이

새롭게 생성되는 이미지 단순하게 gif 또는 jpg 인코딩 방식으로 브라우저에 출력만 될 뿐

제 14 장9/44

2. 동적 이미지 출력단순 동적 이미지 생성하기

1) JSP 의 출력 결과를 이미지로 하기 위하여 contentType 속성 지정

2) java.awt.image.BufferedImage 클래스의 객체 생성

width 와 height 변수는 생성할 이미지의 가로와 세로 사이즈 값 BufferedImage.TYPE_3BYTE_BGR 는 파랑 (Blue), 초록 (Green), 빨강 (Red)

색상의 정도가 각각 1 바이트씩 총 3 바이트에 표현되는 방식을 지정

3) BufferedImage 객체로부터 Graphics2D 클래스 객체 얻어오기

제 14 장10/44

<%@ page contentType="image/jpeg;charset=utf-8" %>

또는<%@ page contentType="image/gif;charset=utf-8" %>

BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_3BYTE_BGR);

Graphics2D g = image.createGraphics();

2. 동적 이미지 출력단순 동적 이미지 생성하기

4) 그림을 그리는 코딩

5) ImageIO 클래스가 지닌 write() 메소드를 활용해서 BufferedImage 객체를 response 객체의 출력스트림으로 보내고 그 출력스트림을 닫아줌

제 14 장11/44

g.setColor(Color.yellow);

g.fillRect(0, 0, width, height);

g.setColor(Color.blue);

g.drawOval(10, 10, width-20, height-20);

g.setFont(new Font(" 굴림 ", Font.BOLD, 25));

g.drawString(" 안녕 ! JSP", width/2 - 55, height/2 - 5);

ServletOutputStream outStream = response.getOutputStream();

ImageIO.write(image, "jpg", outStream);

outStream.close();

2. 동적 이미지 출력단순 동적 이미지 생성하기 예제

제 14 장12/44

01

02

03

04

05

06

07

08

-

09

10

11

12

13

14

14

16

17

18

19

20

<%@ page contentType="image/jpeg;charset=utf-8" %>

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

<%@ page import="java.awt.image.BufferedImage" %>

<%@ page import="javax.imageio.ImageIO" %>

<%

int width = 300;

int height = 300;

BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_3BYTE_BGR); // 메모리에 동적 이미지 image 생성Graphics2D g = image.createGraphics(); // image 에 그림을 그릴 수 있는 객체 g 생성g.setColor(Color.yellow);

g.fillRect(0, 0, width, height);

g.setColor(Color.blue);

g.drawOval(10, 10, width-20, height-20);

g.setFont(new Font(" 굴림 ", Font.BOLD, 25));

g.drawString(" 안녕 ! JSP", width/2 - 55, height/2 - 5);

ServletOutputStream outStream = response.getOutputStream(); // 브라우저로 출력가능한 스트림 생성ImageIO.write(image, "jpg", outStream); // 스트림으로 동적 이미지 출력 outStream.close();

%>

[ 예제 14.4] jspbook\ch14\dynamicImage.jsp

<img src="http://localhost:8080/jspbook/ch14/dynamicImage.jsp"

border="0" />

2. 동적 이미지 출력이미지 합성하기

1) 다음 URL 을 입력하여 웹 상에 이미지가 있다는 것을 확인

2) bird.jpg 의 이미지를 BufferedImage 객체로 담아오는 코딩

제 14 장13/44

http://www.thinkonweb.com/jspbook/ch14/images/

bird.jpg

BufferedImage image = ImageIO.read(new

URL("http://www.thinkonweb.com/jspbook/ch14/images/bird.jpg"));

2. 동적 이미지 출력이미지 합성하기 예제

제 14 장14/44

01

02

03

04

05

06

07

-

08

09

10

11

12

13

14

14

16

17

<%@ page contentType="image/jpeg;charset=utf-8" %>

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

<%@ page import="java.net.URL" %>

<%@ page import="java.awt.image.BufferedImage" %>

<%@ page import="javax.imageio.ImageIO" %>

<%

BufferedImage image = ImageIO.read(new

URL("http://www.thinkonweb.com/jspbook/ch14/images/bird.jpg"));

// 동적 이미지인 image 객체 생성Graphics2D g = image.createGraphics(); // image 에 그림을 그릴 수 있는 객체 g 생성

g.setColor(Color.black);

g.setFont(new Font(" 굴림 ", Font.BOLD, 25));

g.drawString(" 안녕 ! JSP", 80, 50);

ServletOutputStream outStream = response.getOutputStream(); // 브라우저로 출력가능한 스트림 생성ImageIO.write(image, "jpg", outStream); // 스트림으로 동적 이미지 출력outStream.close();

%>

[ 예제 14.5] jspbook\ch14\compImage.jsp

3. 그래프 생성 및 출력하기 그래프 생성과 출력

Java2D 및 Java3D 관련 패키지를 활용하여 별도의 추가 라이브러리 없이도 그래프를 그리는 작업을 무난하게 할 수 있다 .

하지만 , 기본 클래스를 활용하여 좀 더 편하게 그래프를 작성할 수 있는 라이브러리가 다음과 같이 존재

JfreeChart : 가장 많이 사용되는 공개 라이브러리 . 현재까지도 계속해서 업데이트 중이다 .

JOpenChart : 공개 그래프 출력 라이브러리 . 0.94 버전 (2002 년 ) 까지 나온 이후 현재는 개발이 중단되어 있다 .

the Chart2D project (LGPL) : 공개 그래프 출력 라이브러리 . 1.9.6 버전 (2002 년 ) 까지 나온 이후 현재는 개발이 중단되어 있다 .

E-Gantt : 스케줄러 (Scheduler) 나 타임라인 (Timeline) 같은 테이블 형태의 데이터 출력에 활용하기 좋은 라이브러리 . 2006 년도에 나온 이후 업데이트되지 않았지만 활용도가 높다 .

PtPlot : 미국의 버클리 대학에서 만든 전문적인 공학도를 위한 플로팅 (Plotting) 라이브러리

제 14 장15/44

3. 그래프 생성 및 출력하기 JFreeChart 의 공식 사이트

http://www.jfree.org/jfreechart

freeChart 의 최신 버전 다운로드 http://www.jfree.org/jfreechart/download.html

JFreeChart 다운로드 및 설치

한글이 지원되는 JFreeChart http://blog.naver.com/mnk1231?Redirect=Log&logNo=120056645547

제 14 장16/44

3. 그래프 생성 및 출력하기 간단한 파이 (Pie) 차트 만들기

제 14 장17/44

piechart.jsp 수행결과 및 차트 구성요소

3. 그래프 생성 및 출력하기 간단한 파이 (Pie) 차트 만들기

1) page 지시문의 contentType 과 import 를 정의

2) 그래프 ( 차트 ) 의 종류 결정 및 데이터 집합 생성

제 14 장18/44

<%@ page contentType="image/jpeg;charset=utf-8" %>

<%@ page import="org.jfree.data.general.DefaultPieDataset"%>

<%@ page import="org.jfree.chart.JFreeChart"%>

<%@ page import="org.jfree.chart.ChartFactory"%>

<%@ page import="org.jfree.chart.ChartUtilities"%>

DefaultPieDataset dataset = new

DefaultPieDataset();

dataset.setValue("One", new Double(43.2));

dataset.setValue("Two", new Double(10.0));

dataset.setValue("Three", new Double(27.5));

dataset.setValue("Four", new Double(17.5));

dataset.setValue("Five", new Double(11.0));

dataset.setValue("Six", new Double(19.4));

3. 그래프 생성 및 출력하기 간단한 파이 (Pie) 차트 만들기

3) 그래프 ( 차트 ) 생성

4) 구성된 그래프 ( 차트 ) 를 이미지 형태로 브라우저로 출력

제 14 장19/44

JFreeChart chart = ChartFactory.createPieChart(

"Pie Chart in JSP", // 차트의 제목 dataset, // 위에서 만들었던 데이터 집합 객체 true, // 각 데이터를 설명하는 범주 (legend) 포함 유무 false, // 툴팁 (tooltip) 포함 유무 java.util.Locale.getDefault() // 로케일 지정 );

ServletOutputStream outStream = response.getOutputStream();

ChartUtilities.writeChartAsJPEG(

outStream, // 출력 스트림 chart, // 이미 구성해 놓은 차트 객체300, 300 // 출력 이미지의 가로 세로 사이즈);

outStream.close();

3. 그래프 생성 및 출력하기 간단한 파이 (Pie) 차트 만들기

제 14 장20/44

01

02

03

04

05

06

07

08

09

10

11

12

13

14

-

14

16

17

18

<%@ page contentType="image/jpeg;charset=utf-8" %>

<%@ page import="org.jfree.data.general.DefaultPieDataset"%>

<%@ page import="org.jfree.chart.JFreeChart"%>

<%@ page import="org.jfree.chart.ChartFactory"%>

<%@ page import="org.jfree.chart.ChartUtilities"%>

<%

DefaultPieDataset dataset = new DefaultPieDataset();

dataset.setValue("One", new Double(43.2));

dataset.setValue("Two", new Double(10.0));

dataset.setValue("Three", new Double(27.5));

dataset.setValue("Four", new Double(17.5));

dataset.setValue("Five", new Double(11.0));

dataset.setValue("Six", new Double(19.4));

JFreeChart chart = ChartFactory.createPieChart("Pie Chart in JSP", dataset, true, false,

java.util.Locale.getDefault()); // 파이 차트 생성 ServletOutputStream outStream = response.getOutputStream();

ChartUtilities.writeChartAsJPEG(outStream, chart, 300, 300);

outStream.close();

%>

[ 예제 14.6] jspbook\ch14\piechart.jsp

// JFreeChart 라이브러리의 클래스를 import

// 파이차트 생성을 위한 데이터값 생성

3. 그래프 생성 및 출력하기 간단한 파이 (Pie) 차트 만들기

특정 데이터에 대해서 강조를 하고 싶다면 연관된 파이 조각을 다른 조각들 보다 조금 떨어지게 표현

PiePlot 클래스 활용

setExplodePercent 메소드의 첫번째 인자는 데이터 인덱스 인덱스는 0 부터 시작

setExplodePercent() 메소드의 두 번째 인자 다른 데이터 파이 조각들에 비하여 강조되는 데이터 파이 조각이 떨어져서

표현되는 정도

제 14 장21/44

...

<%@ page import="org.jfree.chart.plot.PiePlot"%>

...

PiePlot plot = (PiePlot)chart.getPlot();

plot.setExplodePercent(0, 0.10);

3. 그래프 생성 및 출력하기 간단한 파이 (Pie) 차트 만들기

제 14 장22/44

01

02

03

04

05

06

07

08

09

10

11

12

13

14

14

-

16

17

18

19

20

21

22

23

<%@ page contentType="image/jpeg;charset=utf-8" %>

<%@ page import="org.jfree.data.general.DefaultPieDataset"%>

<%@ page import="org.jfree.chart.JFreeChart"%>

<%@ page import="org.jfree.chart.ChartFactory"%>

<%@ page import="org.jfree.chart.ChartUtilities"%>

<%@ page import="org.jfree.chart.plot.PiePlot"%> // 특정 파이 조각 강조를 위한 PiePlot 클래스 import

<%

DefaultPieDataset dataset = new DefaultPieDataset();

dataset.setValue("One", new Double(43.2));

dataset.setValue("Two", new Double(10.0));

dataset.setValue("Three", new Double(27.5));

dataset.setValue("Four", new Double(17.5));

dataset.setValue("Five", new Double(11.0));

dataset.setValue("Six", new Double(19.4));

JFreeChart chart = ChartFactory.createPieChart("Pie Chart in JSP", dataset,

true, false, java.util.Locale.getDefault());

PiePlot plot = (PiePlot)chart.getPlot();

plot.setExplodePercent(0, 0.10);

ServletOutputStream outStream = response.getOutputStream();

ChartUtilities.writeChartAsJPEG(outStream, chart, 300, 300);

outStream.close();

%>

[ 예제 14.7] jspbook\ch14\piechart2.jsp

// 0 번째 파이 조각 강조

4. 컨테이너와 웹 어플리케이션 배포 (Deploy)

컨테이너 웹 어플리케이션을 실행시키기 위한 환경으로서 Tomcat 엔진에 대한 좀 더

일반화된 용어이다 . 웹 어플리케이션에 대해서 사용자의 요청을 받아들이고 처리하는 역할을

수행하는 일종의 서버 데몬이다 . JSP/Servlet 의 같은 스펙 버전을 준수하는 서로 다른 회사에서 개발된

컨테이너라면 동일한 웹 어플리케이션에 대해 아무런 수정 없이 실행가능

컨테이너의 종류 무료 컨테이너

Tomcat, Resin (Caucho Technology) 유료 컨테이너 ( 신뢰성과 성능이 어느 정도 보장 서비스 품질 보장 )

JSP/Servlet 스펙을 포함하여 J2EE 표준 스펙까지 구현한 중대형급들이 대부분 Sun 사의 Java System Application Server IBM 의 WebSphere Application Server Oracle 사의 Oracle Application Server (OAS) Oracle Container for J2EE (OC4J), JBoss 커뮤니티에서 만든 Jboss BEA 사에서 만든 Weblogic

제 14 장23/44

4. 컨테이너와 웹 어플리케이션 배포 (Deploy)

회사에서의 개발 환경 중대형급 웹 어플리케이션을 운영하는 곳에서는 개발하는 컴퓨터와 실제

서비스를 운영하는 서버가 일반적으로 다르게 존재

개발단계에서 서비스단계까지의 일련의 과정

배포 (Deploy) 방법 war (web application archive)

파일로 한데 묶어서 서버에 올려놓는다 .

제 14 장24/44

4. 컨테이너와 웹 어플리케이션 배포 (Deploy)

웹 어플리케이션의 폴더 및 파일 구조

제 14 장25/44

4. 컨테이너와 웹 어플리케이션 배포 (Deploy)

war 파일 웹 어플리케이션의 전체 폴더 및 파일을 한데 묶은 압축 파일 형태 Java 에서 사용하는 압축형식인 jar 로 압축하여 확장자만 war 로

바꾼 것이다 . jar 를 지원하는 압축 툴 ( 예를 들어 winzip 이나 알집 ) 에서는 war

를 jar 처럼 취급하여 압축을 풀 수 있다 .

jar.exe 를 활용한 war 파일 생성

c: 새로운 파일을 생성한다 . v: command창으로 진행사항에 관한 메시지를 출력한다 . f: 압축해서 새롭게 생성될 파일이름을 지정한다 . jspbook.war: 새롭게 생성할 war 파일 이름을 지정한다 . 가능하면 현재 웹

어플리케이션 폴더 이름과 동일한 파일 명을 사용한다 .

제 14 장26/44

4. 컨테이너와 웹 어플리케이션 배포 (Deploy)

탐색기에서 jspbook.war 생성 확인

제 14 장27/44

4. 컨테이너와 웹 어플리케이션 배포 (Deploy)

Tomcat 에서 war 파일의 배포 방법 1) Tomcat 설치 폴더 밑의 webapps 폴더에 war 파일을 옮겨놓는

방법 간단하지만 권장되지는 않는 방법

2) Tomcat 엔진의 관리도구인 Tomcat Manager 를 활용하는 방법 비교적 쉽게 war 파일을 배포할 수 있으며 웹 상에서 모든 관리 기능을

사용할 수 있기 때문에 권장되는 방법

Tomcat Manager 계정 추가 Tomcat 설치 폴더의 conf 폴더 밑에 있는 tomcat-users.xml 초기

내용

admin 계정 추가

제 14 장28/44

<?xml version='1.0' encoding='utf-8'?>

<tomcat-users>

</tomcat-users>

<?xml version='1.0' encoding='utf-8'?>

<tomcat-users>

<role rolename="manager"/>

<user username="admin" password="jspbook" roles="manager"/>

</tomcat-users>

4. 컨테이너와 웹 어플리케이션 배포 (Deploy)

Tomcat 기본 웹 페이지에서 Tomcat Manager 실행

제 14 장29/44

5. 배포 서술자인 web.xml 의 자세한 설명배포 서술자 (Deployment Descriptor) 인 web.xml 의 역할 정리

효율적인 웹 어플리케이션의 운영 및 유지보수 서블릿 매핑 및 필터와 리스너 매핑 등을 텍스트 기반으로 설정할 수 있기 때문에

프로그램을 수정하지 않고도 웹 어플리케이션의 동작 방법을 큰 관점에서 제어하고 수정

초기화 파라미터의 손쉬운 설정 웹 어플리케이션의 동작에 영향을 주는 초기화 파라미터의 설정을 텍스트

기반에서 할 수 있기 때문에 응용 프로그램 수정 없이도 초기화 파라미터를 변경하여 웹 어플리케이션 동작을 쉽게 제어

컨테이너 호환성 유지 웹 어플리케이션의 배포와 관련된 정보를 텍스트 기반으로 유지함으로써 서로

다른 컨테이너에서 손쉽게 그 정보를 분석하여 동일한 방법으로 웹 어플리케이션을 운영

최근에는 시스템의 환경 설정 정보는 대부분 XML 텍스트 문서로 만들어 저장하고 있으며 web.xml 도 대표적인 XML 기반 환경 설정 파일이다 .

제 14 장30/44

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<web-app> 루트 태그 (Root Tag)

<description> 태그 및 <display-name> 태그

<display-name> 은 Tomcat Manager 같은 관리형 어플리케이션에서 현재 웹 어플리케이션을 표시할 때 사용하는 이름을 지정

제 14 장31/44

<?xml version='1.0' encoding='utf-8'?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

version="2.5">

...

...

...

</web-app>

<description>

JSPBOOK Examples.

</description>

<display-name>JSPBOOK Examples</display-name>

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<servlet> 과 <servlet-mapping> 태그 (1/7)

Servlet 에 대한 요청 URL 을 "/controller/my.do" 로 만들고 있다는 점에 주목 이 URL 에 대해서 controller 라는 폴더와 my.do 라는 파일이 물리적으로

존재하는가 ? 그렇지 않다 . 물리적으로는 그 URL 에 매핑되는 Servlet 을

thinkonweb.mvc.MyController 로 등록해 놓았기 때문에 논리적 폴더 및 파일 구조와 물리적 구조가 전혀 다르다 .

제 14 장32/44

<servlet>

<servlet-name>myController</servlet-name>

<servlet-class>thinkonweb.mvc.MyController</servlet-class>

<init-param>

<param-name>propFile</param-name>

<param-value>test.properties</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>muController</servlet-name>

<url-pattern>/controller/my.do</url-pattern>

</servlet-mapping>

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<servlet> 과 <servlet-mapping> 태그 (2/7)

제 14 장33/44

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<servlet> 과 <servlet-mapping> 태그 (3/7) <url-pattern> 과 </url-pattern> 에 기입할 수 있는 내용의 종류

요청 URL 과 <url-pattern> 내용과의 매칭 규칙 규칙 1) 폴더명과 파일명 및 확장자까지 정확히 일치하는 <url-pattern>

값이 최우선시 된다 . 규칙 2) 다음으로 폴더명까지 일치하는 <url-pattern> 값이 우선시 된다 . 규칙 3) 마지막으로 확장자만 일치하는 <url-pattern> 값이 있는지 찾아본

다 . 규칙 4) 위와 같은 규칙을 통해서도 여러 <url-pattern> 값과 일치한다면

많은 내용이 일치하는 것이 우선시 된다 .

제 14 장34/44

1) 정확히 파일명까지 일치하는 URL

<url-pattern>/controller/my.do</url-pattern>

2) 폴더까지만 일치하는 URL, 하위 폴더 및 파일 모두 포함한다 .

<url-pattern>/controller/*</url-pattern>

3) 확장자만 일치하는 URL

<url-pattern>*.do</url-pattern>

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<servlet> 과 <servlet-mapping> 태그 (4/7) web.xml 에 작성된 <servlet> 과 <servlet-mapping> 태그 예

제 14 장35/44

<servlet><servlet-name>A</servlet-name><servlet-class>thinkonweb.foo.TestA</servlet-class></servlet><servlet-mapping><servlet-name>A</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><servlet><servlet-name>B</servlet-name><servlet-class>thinkonweb.foo.TestB</servlet-class></servlet><servlet-mapping><servlet-name>B</servlet-name><url-pattern>/foo/bar</url-pattern></servlet-mapping><servlet><servlet-name>C</servlet-name><servlet-class>thinkonweb.foo.TestC</servlet-class></servlet><servlet-mapping><servlet-name>C</servlet-name><url-pattern>/foo/*</url-pattern></servlet-mapping>

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<servlet> 과 <servlet-mapping> 태그 (5/7) 앞선web.xml 에 대한 여러 URL 의 매핑 예

http://localhost:8080/jspbook/list.do ⇔ thinkonweb.foo.TestA (규칙 3)

http://localhost:8080/jspbook/foo/bar ⇔ thinkonweb.foo.TestB (foo 와 bar 를 폴더명이라고 가정했을 때 규칙 2와 규칙 4 적용 )

http://localhost:8080/jspbook/foo/bar/list.do ⇔ thinkonweb.foo.TestC (규칙 2)

http://localhost:8080/jspbook/foo/list.do ⇔ thinkonweb.foo.TestC (규칙 2)

http://localhost:8080/jspbook/bar/list.do ⇔ thinkonweb.foo.TestA (규칙 3)

http://localhost:8080/jspbook/foo ⇔ thinkonweb.foo.TestC (규칙 2)

http://localhost:8080/jspbook/foo/bar/view.goo ⇔ thinkonweb.foo.TestC (규칙 2)

http://localhost:8080/jspbook/bar/view.goo ⇔ 404 FILE NOT FOUND 에러 (일치하는 Servlet 클래스 없음 )

제 14 장36/44

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<servlet> 과 <servlet-mapping> 태그 (6/7) web.xml 에 작성된 <servlet> 과 <servlet-mapping> 태그의 약간

난해한 예

제 14 장37/44

<servlet>

<servlet-name>D</servlet-name>

<servlet-class>thinkonweb.foo.TestD</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>D</servlet-name>

<url-pattern>/foo/bar</url-pattern>

</servlet-mapping>

<servlet>

<servlet-name>E</servlet-name>

<servlet-class>thinkonweb.foo.TestE</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>E</servlet-name>

<url-pattern>/foo/bar/*</url-pattern>

</servlet-mapping>

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<servlet> 과 <servlet-mapping> 태그 (7/7) 앞선web.xml 에 대한 여러 URL 의 매핑 예

http://localhost:8080/jspbook/foo/bar/ ⇔ thinkonweb.foo.TestE (규칙 2 & 규칙 4)

http://localhost:8080/jspbook/foo/bar ⇔ thinkonweb.foo.TestD (규칙 2 & 규칙 4)

제 14 장38/44

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<listener> 태그

<filter> 태그

제 14 장39/44

<listener>

<description>jspbook 어플리케이션 리스너 </description>

<listener-class>thinkonweb.listener.JspbookListener</listener-class>

</listener>

<filter>

<filter-name>MultipartFilter</filter-name>

<filter-class>thinkonweb.filter.MultipartFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>MultipartFilter</filter-name>

<url-pattern>/ch20/register4.jsp</url-pattern>

</filter-mapping>

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<welcome-file-list> 태그

특정 파일명 없이 http://www.google.com 과 같이 웹 사이트명으로 끝나거나 http://www.google.com/map 과 같이 폴더명으로 끝나게 될 때 이 요청에 대한 응답 파일을 설정하는 태그

먼저 지정한 파일이 우선순위가 높다 . [Note] 폴더명으로 끝나는 것에 대해서는 우선 Servlet 매핑 태그인

<url-pattern> 에 의하여 매핑이 되는지부터 살펴본다는 점이 중요 <context-param> 태그

제 14 장40/44

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

<context-param>

<param-name>appName</param-name>

<param-value>jspbook</param-value>

</context-param>

5. 배포 서술자인 web.xml 의 자세한 설명web.xml 의 태그 설명

<error-page> 태그

제 14 장41/44

<error-page>

<error-code>404</error-code>

<location>/ch11/error/404errorHandler.jsp</location>

</error-page>

<error-page>

<exception-type>java.lang.NullPointerException</exception-type>

<location>/ch11/error/nullPointerErrorHandler.jsp</location>

</error-page>

5. 배포 서술자인 web.xml 의 자세한 설명Servlet 을 강제로 초기화하기

JSP 및 Servlet 은 최초 요청이 들어왔을 때 초기화가 된다고 하였다 . 즉 클라이언트의 요청 URL 이 아직 초기화되지 않은 JSP 나 Servlet

을 요청하고 있다면 이 요청에 의하여 컴파일 , 클래스의 메모리 적재 , 초기화 (init() 함수 호출 ) 과 같은 일련의 과정이 이 순간에 모두 일어나게 된다 .

따라서 최초 요청에 대해서는 다소 응답시간 지연이 발생할 수 있다 . 이러한 단점을 없에는 방법 : Servlet 을 강제로 초기화하기

제 14 장42/44

<servlet>

<servlet-name>myController</servlet-name>

<servlet-class>thinkonweb.mvc.MyController</servlet-

class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet>

<servlet-name>incdec</servlet-name>

<servlet-class>/ch05/incdec.jsp</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

5. 배포 서술자인 web.xml 의 자세한 설명server.xml 과 웹 어플리케이션 폴더 설정

컨테이너 외부 자원의 등록 (DB 등록 )

Tomcat 엔진의 서비스 포트 번호 변경 및 인코딩 방법에 대한 설정

제 14 장43/44

<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" username="root"

password="jspbook"

driverClassName="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost:3306/jspbookdb?characterEncoding=UTF-8"

validationQuery="select 1" autoReconnect="true"

maxActive="100" maxIdle="30" maxWait="3000" />

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" URIEncoding="utf-8"/>

5. 배포 서술자인 web.xml 의 자세한 설명server.xml 과 웹 어플리케이션 폴더 설정

웹 어플리케이션을 webapps 하위의 폴더가 아닌 전혀 다른 폴더에서 개발하고자 할 때의 수정 방법

제 14 장44/44

<Host name="localhost" appBase="webapps"

unpackWARs="true" autoDeploy="true"

xmlValidation="false" xmlNamespaceAware="false">

</Host>

<Host name="localhost" appBase="webapps"

unpackWARs="true" autoDeploy="true"

xmlValidation="false" xmlNamespaceAware="false">

<Context path="/jspbook"

docBase="d:/myapps/jspbook" />

</Host>