14 장. 이미지처리및웹어플리케이션의배포
썸네일 (thumnail) 이미지 1. Thumbnail 이미지만들기 원본이미지에대해서가로및세로크기를줄여서파일사이즈를작게만든이미지 Google 이미지검색에사용되는썸네일이미지들 2/44
썸네일 (thumnail) 이미지를만드는방법 이미지처리기능구현 1. Thumbnail 이미지만들기 java.awt.*, java.awt.image.*, javax.imageio.*, javax.swing.* 과같은패키지를사용 각클래스마다썸네일이미지를만들기위한몇몇개의메소드들을활용 이들메소드들에대한자세한설명까지는이책에담지않는다. 이미지처리에관한이들메소드들에대한자세한동작방법은다른 Java 이미지처리관련책참고 3/44
01 02 03 04 05 06 07 08 09 10 11 12 13 14 14 16 17 18 19 20 21 22 23 썸네일이미지를만드는유틸리티 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); } 1. Thumbnail 이미지만들기 [ 예제 14.1] jspbook \ WEB-INF\java_sources\ImageUtil.java 4/44 24 제14장
46 5/44 47 썸네일이미지를만드는유틸리티 1. Thumbnail 이미지만들기 25 public static void createthumbnail(string img, String thumb, int size, int direction) throws Exception { 26 Image imgsource = new ImageIcon(img).getImage(); 27 Image thumbsource = null; 28 if (direction == WIDTH) 29 thumbsource = new ImageIcon( 30 imgsource.getscaledinstance(size, -1, Image.SCALE_SMOOTH)).getImage(); 31 else 32 thumbsource = new ImageIcon( 33 imgsource.getscaledinstance(-1, size, Image.SCALE_SMOOTH)).getImage(); 34 35 BufferedImage bi = new BufferedImage(thumbSource.getWidth(null), thumbsource.getheight(null), BufferedImage. - TYPE_3BYTE_BGR); 36 Graphics g = bi.getgraphics(); 37 g.drawimage(thumbsource, 0, 0, null); 38 try { 39 if (img.endswith("jpg")) 40 ImageIO.write(bi, "jpg", new File(thumb)); 41 else if (img.endswith("gif")) 42 ImageIO.write(bi, "gif", new File(thumb)); 43 } catch (Exception e) { 44 System.out.println(e); 45 } } } [ 예제 14.1] jspbook \ WEB-INF\java_sources\ImageUtil.java
1. Thumbnail 이미지만들기 ImageUtil 클래스의두개의정적메소드사용예시 ImageUtil.createThumbnail(imagePath, thumbpath, 100, ImageUtil.WIDTH); : imagepath 경로에있는원본이미지에대해가로길이를 100으로설정한새로운이미지를 thumbpath 경로에저장한다. ImageUtil.createThumbnail(imagePath, thumbpath, 50, ImageUtil.HEIGHT); : imagepath 경로에있는원본이미지에대해세로길이를 50으로설정한새로운이미지를 thumbpath 경로에저장한다. 위예에서보면각각가로와세로길이만을설정하지만새롭게만들어지는이미지는가로와세로가동시에변환된이미지가된다. 즉, 원본이미지에대해가로길이를 100 으로설정하면그비율대로세로길이도맞추어서저장된다. 6/44
1. Thumbnail 이미지만들기 01 02 03 04 05 06 07 08 09 10 11 12 13 14-14 16 눈에보이는크기만을줄이는예제 [ 예제 14.2] jspbook\ch14\imagesize.jsp <%@ 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> <img src="bridge.jpg" border="0" width="50%"> 7/44
1. Thumbnail 이미지만들기 01 02 03 04 05 06 07 08 09-10 11 12 13 14 14 16 썸네일이미지를이용하는예제 [ 예제 14.3] jspbook\ch14\thumb.jsp <%@ 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> 8/44
정적 vs. 동적이미지 정적 (static) 이미지 이미그내용이결정되어있는파일로존재하는이미지 2. 동적이미지출력 동적 (static) 이미지 파일형태로존재하지않는이미지이며임의의요청이있는순간그내용이새롭게생성되는이미지 단순하게 gif 또는 jpg 인코딩방식으로브라우저에출력만될뿐 9/44
2. 동적이미지출력 단순동적이미지생성하기 1) JSP의출력결과를이미지로하기위하여 contenttype 속성지정 <%@ page contenttype="image/jpeg;charset=utf-8" %> 또는 <%@ page contenttype="image/gif;charset=utf-8" %> 2) java.awt.image.bufferedimage 클래스의객체생성 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); width 와 height 변수는생성할이미지의가로와세로사이즈값 BufferedImage.TYPE_3BYTE_BGR 는파랑 (Blue), 초록 (Green), 빨강 (Red) 색상의정도가각각 1 바이트씩총 3 바이트에표현되는방식을지정 3) BufferedImage 객체로부터 Graphics2D 클래스객체얻어오기 Graphics2D g = image.creategraphics(); 10/44
2. 동적이미지출력 단순동적이미지생성하기 4) 그림을그리는코딩 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); 5) ImageIO 클래스가지닌 write() 메소드를활용해서 BufferedImage 객체를 response 객체의출력스트림으로보내고그출력스트림을닫아줌 ServletOutputStream outstream = response.getoutputstream(); ImageIO.write(image, "jpg", outstream); outstream.close(); 11/44
2. 동적이미지출력 01 02 03 04 05 06 07 08-09 10 11 12 13 14 14 16 17 18 19 20 단순동적이미지생성하기예제 [ 예제 14.4] jspbook\ch14\dynamicimage.jsp <%@ 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(); %> 12/44 <img src="http://localhost:8080/jspbook/ch14/dynamicimage.jsp" border="0" />
이미지합성하기 1) 다음 URL 을입력하여웹상에이미지가있다는것을확인 2. 동적이미지출력 http://www.thinkonweb.com/jspbook/ch14/images/bird.jpg 2) bird.jpg 의이미지를 BufferedImage 객체로담아오는코딩 BufferedImage image = ImageIO.read(new URL("http://www.thinkonweb.com/jspbook/ch14/images/bird.jpg")); 13/44
2. 동적이미지출력 01 02 03 04 05 06 07-08 09 10 11 12 13 14 14 16 17 이미지합성하기예제 [ 예제 14.5] jspbook\ch14\compimage.jsp <%@ 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/44
그래프생성과출력 3. 그래프생성및출력하기 Java2D 및 Java3D 관련패키지를활용하여별도의추가라이브러리없이도그래프를그리는작업을무난하게할수있다. 하지만, 기본클래스를활용하여좀더편하게그래프를작성할수있는라이브러리가다음과같이존재 JfreeChart : 가장많이사용되는공개라이브러리. 현재까지도계속해서업데이트중이다. JOpenChart : 공개그래프출력라이브러리. 0.94 버전 (2002 년 ) 까지나온이후현재는개발이중단되어있다. the Chart2D project (LGPL) : 공개그래프출력라이브러리. 1.9.6 버전 (2002 년 ) 까지나온이후현재는개발이중단되어있다. E-Gantt : 스케줄러 (Scheduler) 나타임라인 (Timeline) 같은테이블형태의데이터출력에활용하기좋은라이브러리. 2006 년도에나온이후업데이트되지않았지만활용도가높다. PtPlot : 미국의버클리대학에서만든전문적인공학도를위한플로팅 (Plotting) 라이브러리 15/44
JFreeChart의공식사이트 http://www.jfree.org/jfreechart freechart의최신버전다운로드 http://www.jfree.org/jfreechart/download.html JFreeChart 다운로드및설치 3. 그래프생성및출력하기 한글이지원되는 JFreeChart http://blog.naver.com/mnk1231?redirect=log&logno=120056645547 16/44
간단한파이 (Pie) 차트만들기 3. 그래프생성및출력하기 17/44 piechart.jsp 수행결과및차트구성요소
간단한파이 (Pie) 차트만들기 1) page 지시문의 contenttype과 import를정의 3. 그래프생성및출력하기 <%@ 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"%> 2) 그래프 ( 차트 ) 의종류결정및데이터집합생성 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)); 18/44
간단한파이 (Pie) 차트만들기 3) 그래프 ( 차트 ) 생성 3. 그래프생성및출력하기 JFreeChart chart = ChartFactory.createPieChart( "Pie Chart in JSP", // 차트의제목 dataset, // 위에서만들었던데이터집합객체 true, // 각데이터를설명하는범주 (legend) 포함유무 false, // 툴팁 (tooltip) 포함유무 java.util.locale.getdefault() // 로케일지정 ); 4) 구성된그래프 ( 차트 ) 를이미지형태로브라우저로출력 ServletOutputStream outstream = response.getoutputstream(); ChartUtilities.writeChartAsJPEG( outstream, // 출력스트림 chart, // 이미구성해놓은차트객체 300, 300 // 출력이미지의가로세로사이즈 ); outstream.close(); 19/44
3. 그래프생성및출력하기 01 02 03 04 05 06 07 08 09 10 11 12 13 14-14 16 17 18 간단한파이 (Pie) 차트만들기 [ 예제 14.6] jspbook\ch14\piechart.jsp <%@ page contenttype="image/jpeg;charset=utf-8" %> <%@ page import="org.jfree.data.general.defaultpiedataset"%> <%@ page import="org.jfree.chart.jfreechart"%> // JFreeChart 라이브러리의클래스를 import <%@ 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(); %> 20/44
간단한파이 (Pie) 차트만들기 3. 그래프생성및출력하기 특정데이터에대해서강조를하고싶다면연관된파이조각을다른조각들보다조금떨어지게표현 PiePlot 클래스활용... <%@ page import="org.jfree.chart.plot.pieplot"%>... PiePlot plot = (PiePlot)chart.getPlot(); plot.setexplodepercent(0, 0.10); setexplodepercent 메소드의첫번째인자는데이터인덱스 인덱스는 0 부터시작 setexplodepercent() 메소드의두번째인자 다른데이터파이조각들에비하여강조되는데이터파이조각이떨어져서표현되는정도 21/44
22 22/44 23 간단한파이 (Pie) 차트만들기 3. 그래프생성및출력하기 01 02 03 04 05 <%@ 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"%> 06 07 08 09 10 11 12 13 14 <%@ page import="org.jfree.chart.plot.pieplot"%> <% 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)); // 특정파이조각강조를위한 PiePlot 클래스 import 14 - JFreeChart chart = ChartFactory.createPieChart("Pie Chart in JSP", dataset, true, false, java.util.locale.getdefault()); 16 17 18 19 PiePlot plot = (PiePlot)chart.getPlot(); plot.setexplodepercent(0, 0.10); // 0번째파이조각강조 20 21 ServletOutputStream outstream = response.getoutputstream(); ChartUtilities.writeChartAsJPEG(outStream, chart, 300, 300); outstream.close(); %> [ 예제 14.7] jspbook\ch14\piechart2.jsp
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 23/44
4. 컨테이너와웹어플리케이션배포 (Deploy) 회사에서의개발환경 중대형급웹어플리케이션을운영하는곳에서는개발하는컴퓨터와실제서비스를운영하는서버가일반적으로다르게존재 개발단계에서서비스단계까지의일련의과정 배포 (Deploy) 방법 war (web application archive) 파일로한데묶어서서버에올려놓는다. 24/44
4. 컨테이너와웹어플리케이션배포 (Deploy) 웹어플리케이션의폴더및파일구조 25/44
4. 컨테이너와웹어플리케이션배포 (Deploy) war 파일 웹어플리케이션의전체폴더및파일을한데묶은압축파일형태 Java 에서사용하는압축형식인 jar 로압축하여확장자만 war 로바꾼것이다. jar 를지원하는압축툴 ( 예를들어 winzip 이나알집 ) 에서는 war 를 jar 처럼취급하여압축을풀수있다. jar.exe 를활용한 war 파일생성 c: 새로운파일을생성한다. v: command 창으로진행사항에관한메시지를출력한다. f: 압축해서새롭게생성될파일이름을지정한다. jspbook.war: 새롭게생성할 war 파일이름을지정한다. 가능하면현재웹어플리케이션폴더이름과동일한파일명을사용한다. 26/44
4. 컨테이너와웹어플리케이션배포 (Deploy) 탐색기에서 jspbook.war 생성확인 27/44
4. 컨테이너와웹어플리케이션배포 (Deploy) Tomcat 에서 war 파일의배포방법 1) Tomcat 설치폴더밑의 webapps 폴더에 war 파일을옮겨놓는방법 간단하지만권장되지는않는방법 2) Tomcat 엔진의관리도구인 Tomcat Manager 를활용하는방법 비교적쉽게 war 파일을배포할수있으며웹상에서모든관리기능을사용할수있기때문에권장되는방법 Tomcat Manager 계정추가 Tomcat 설치폴더의 conf 폴더밑에있는 tomcat-users.xml 초기내용 admin 계정추가 <?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> 28/44
4. 컨테이너와웹어플리케이션배포 (Deploy) Tomcat 기본웹페이지에서 Tomcat Manager 실행 29/44
30/44 5. 배포서술자인 web.xml 의자세한설명 배포서술자 (Deployment Descriptor) 인 web.xml 의역할정리 효율적인웹어플리케이션의운영및유지보수 서블릿매핑및필터와리스너매핑등을텍스트기반으로설정할수있기때문에프로그램을수정하지않고도웹어플리케이션의동작방법을큰관점에서제어하고수정 초기화파라미터의손쉬운설정 웹어플리케이션의동작에영향을주는초기화파라미터의설정을텍스트기반에서할수있기때문에응용프로그램수정없이도초기화파라미터를변경하여웹어플리케이션동작을쉽게제어 컨테이너호환성유지 웹어플리케이션의배포와관련된정보를텍스트기반으로유지함으로써서로다른컨테이너에서손쉽게그정보를분석하여동일한방법으로웹어플리케이션을운영 최근에는시스템의환경설정정보는대부분 XML 텍스트문서로만들어저장하고있으며 web.xml도대표적인 XML기반환경설정파일이다.
5. 배포서술자인 web.xml 의자세한설명 web.xml의태그설명 <web-app> 루트태그 (Root Tag) <?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> 태그및 <display-name> 태그 <description> JSPBOOK Examples. </description> <display-name>jspbook Examples</display-name> 31/44 <display-name> 은 Tomcat Manager 같은관리형어플리케이션에서현재웹어플리케이션을표시할때사용하는이름을지정
5. 배포서술자인 web.xml 의자세한설명 web.xml의태그설명 <servlet> 과 <servlet-mapping> 태그 (1/7) <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> Servlet 에대한요청 URL 을 "/controller/my.do" 로만들고있다는점에주목 이 URL 에대해서 controller 라는폴더와 my.do 라는파일이물리적으로존재하는가? 그렇지않다. 물리적으로는그 URL 에매핑되는 Servlet 을 thinkonweb.mvc.mycontroller 로등록해놓았기때문에논리적폴더및파일구조와물리적구조가전혀다르다. 32/44
5. 배포서술자인 web.xml 의자세한설명 web.xml 의태그설명 <servlet> 과 <servlet-mapping> 태그 (2/7) 33/44
5. 배포서술자인 web.xml 의자세한설명 web.xml의태그설명 <servlet> 과 <servlet-mapping> 태그 (3/7) <url-pattern> 과 </url-pattern> 에기입할수있는내용의종류 1) 정확히파일명까지일치하는 URL <url-pattern>/controller/my.do</url-pattern> 2) 폴더까지만일치하는 URL, 하위폴더및파일모두포함한다. <url-pattern>/controller/*</url-pattern> 3) 확장자만일치하는 URL <url-pattern>*.do</url-pattern> 요청 URL 과 <url-pattern> 내용과의매칭규칙 규칙 1) 폴더명과파일명및확장자까지정확히일치하는 <url-pattern> 값이최우선시된다. 규칙 2) 다음으로폴더명까지일치하는 <url-pattern> 값이우선시된다. 규칙 3) 마지막으로확장자만일치하는 <url-pattern> 값이있는지찾아본다. 규칙 4) 위와같은규칙을통해서도여러 <url-pattern> 값과일치한다면많은내용이일치하는것이우선시된다. 34/44
5. 배포서술자인 web.xml 의자세한설명 35/44 web.xml 의태그설명 <servlet> 과 <servlet-mapping> 태그 (4/7) web.xml 에작성된 <servlet> 과 <servlet-mapping> 태그예 <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) 36/44 http://localhost:8080/jspbook/bar/view.goo 404 FILE NOT FOUND 에러 ( 일치하는 Servlet 클래스없음 )
5. 배포서술자인 web.xml 의자세한설명 web.xml의태그설명 <servlet> 과 <servlet-mapping> 태그 (6/7) web.xml 에작성된 <servlet> 과 <servlet-mapping> 태그의약간난해한예 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) 38/44
5. 배포서술자인 web.xml 의자세한설명 web.xml의태그설명 <listener> 태그 <listener> <description>jspbook 어플리케이션리스너 </description> <listener-class>thinkonweb.listener.jspbooklistener</listener-class> </listener> <filter> 태그 <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> 39/44
5. 배포서술자인 web.xml 의자세한설명 web.xml 의태그설명 <welcome-file-list> 태그 특정파일명없이 http://www.google.com과같이웹사이트명으로끝나거나 http://www.google.com/map과같이폴더명으로끝나게될때이요청에대한응답파일을설정하는태그 먼저지정한파일이우선순위가높다. [Note] 폴더명으로끝나는것에대해서는우선 Servlet 매핑태그인 <urlpattern> 에의하여매핑이되는지부터살펴본다는점이중요 <context-param> 태그 <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> 40/44
5. 배포서술자인 web.xml 의자세한설명 web.xml의태그설명 <error-page> 태그 <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> 41/44
5. 배포서술자인 web.xml 의자세한설명 Servlet 을강제로초기화하기 <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> JSP 및 Servlet 은최초요청이들어왔을때초기화가된다고하였다. 즉클라이언트의요청 URL 이아직초기화되지않은 JSP 나 Servlet 을요청하고있다면이요청에의하여컴파일, 클래스의메모리적재, 초기화 (init() 함수호출 ) 과같은일련의과정이이순간에모두일어나게된다. 따라서최초요청에대해서는다소응답시간지연이발생할수있다. 이러한단점을없에는방법 : Servlet 을강제로초기화하기 42/44
5. 배포서술자인 web.xml 의자세한설명 server.xml과웹어플리케이션폴더설정 컨테이너외부자원의등록 (DB 등록 ) <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" /> Tomcat 엔진의서비스포트번호변경및인코딩방법에대한설정 <Connector port="8080" protocol="http/1.1" connectiontimeout="20000" redirectport="8443" URIEncoding="utf-8"/> 43/44
5. 배포서술자인 web.xml 의자세한설명 server.xml 과웹어플리케이션폴더설정 웹어플리케이션을 webapps 하위의폴더가아닌전혀다른폴더에서개발하고자할때의수정방법 <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> 44/44