본 장에서는 예제를 통해서 서블릿, JSP, JSTL, JSF 애플리케이션의 배치와 WAR(Web application ARchive) 모듈의 패키징과 배치에 대해서 설명한다.
본 절에서는 웹 애플리케이션의 간단한 예제 코드를 작성하고, 해당 소스의 컴파일과 배치 과정을 설명한다.
자세한 내용은 "JEUS Server 안내서", "JEUS Web Container 안내서", "JEUS Web Service 안내서"를 참조한다.
다음의 HelloWorldServlet.java는 웹 브라우저에 간단히 “Hello World!”라는 메시지를 출력하는 예제 서블릿이다.
[예 9.1] <<HelloWorldServlet.java>>
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<HTML>"); out.println("<HEAD>"); out.println("<TITLE>Hello World Sample</TITLE>"); out.println("</HEAD>"); out.println("<BODY>"); out.println("<CENTER><H1>Hello World!</H1></CENTER>"); out.println("</BODY>"); out.println("</HTML>"); out.close(); } }
예제는 다음 위치의 디렉터리에서 찾을 수 있다.
JEUS_HOME\samples\getting_started\helloservlet\src\java
다음의 snoop.jsp는 요청을 받았을 때 request에 대한 몇 가지 정보를 보여주는 “snoop.jsp”라는 샘플 JSP 프로그램이다.
[예 9.2] <<snoop.jsp>>
<html> <body bgcolor="white"> <h2> Request Information </h2> <font size="4"> JSP Request Method: <%= request.getMethod() %> <br> Request URI: <%= request.getRequestURI() %> <br> Request Protocol: <%= request.getProtocol() %> <br> Servlet path: <%= request.getServletPath() %> <br> Path info: <%= request.getPathInfo() %> <br> Path translated: <%= request.getPathTranslated() %> <br> Query string: <%= request.getQueryString() %> <br> Content length: <%= request.getContentLength() %> <br> Content type: <%= request.getContentType() %> <br> Server name: <%= request.getServerName() %> <br> Server port: <%= request.getServerPort() %> <br> Remote user: <%= request.getRemoteUser() %> <br> Remote address: <%= request.getRemoteAddr() %> <br> Remote host: <%= request.getRemoteHost() %> <br> Authorization scheme: <%= request.getAuthType() %> <hr> The browser you are using is <%= request.getHeader("User-Agent") %> <hr> </font> </body> </html>
예제는 다음 위치의 디렉터리에서 찾을 수 있다.
JEUS_HOME\samples\getting_started\helloservlet\web
다음은 snoop.jsp와 똑같은 일을 하지만 JSTL과 JSF를 사용한 'snoop-jstl.jsp'라는 샘플 JSP 프로그램이다.
[예 9.3] <<snoop-jstl.jsp>>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <html> <body> <h2> Request Information </h2> <font size="4"> <c:set var="req" value="${pageContext.request}"/> JSP Request Method: <c:out value="${req.method}"/> <br/> Request Protocol: <c:out value="${req.protocol}"/> <br/> Servlet path: <c:out value="${req.servletPath}"/> <br/> Path info: <c:out value="${req.pathInfo}"/> <br/> Path translated: <c:out value="${req.pathTranslated}"/> <br/> Query string: <c:out value="${req.queryString}"/> <br/> Content length: <c:out value="${req.contentLength}"/> <br/> Content type: <c:out value="${req.contentType}"/> <br/> Server name: <c:out value="${req.serverName}"/> <br/> Server port: <c:out value="${req.serverPort}"/> <br/> Remote user: <c:out value="${req.remoteUser}"/> <br/> Remote address: <c:out value="${req.remoteAddr}"/> <br/> Remote host: <c:out value="${req.remoteHost}"/> <br/> Authorization scheme: <c:out value="${req.authType}"/> <hr/> <f:view> The browser you are using is <h:outputText value= "#{header['User-Agent']}"/> </f:view> <hr/> </font> </body> </html>
이 예제는 JSP이므로 사용자가 컴파일할 필요 없이 서블릿 엔진이 자동으로 컴파일한다. 다만 'snoop.jsp'를 넣을 jsp 디렉터리가 필요하다.
작성한 서블릿 소스 파일을 컴파일하기 위해서는 서블릿이 사용하는 클래스들과 인터페이스가 클래스 패스에 설정되어 있어야 한다. 또한 컴파일을 위해서는 기본적인 Java의 클래스 패스 외에 JEUS의 classpath 역시 클래스 패스에 추가되어야 한다. 만일 JEUS가 'C:\TmaxSoft\JEUS6.0'이라는 디렉터리에 설치되어 있다면 'C:\TmaxSoft\JEUS6.0\lib\system\javaee.jar' 역시 클래스 패스에 추가되어야 한다.
다음은 서블릿 소스파일을 컴파일하는 예제이다.
C:\TmaxSoft\JEUS6.0\samples\getting_started\helloservlet\src\java>javac -classpath
C:\TmaxSoft\JEUS6.0\lib\system\javaee.jar -d . *.java
컴파일 후 'HelloWorldServlet.class'란 파일이 컴파일을 수행한 디렉터리에 생성된다.
‘helloworld’라는 디렉터리를 'C:\TmaxSoft\JEUS6.0\samples\getting_started\helloservlet' 아래에 생성한다. ‘helloworld’라는 디렉터리 아래에 ‘WEB-INF’라는 디렉터리를 만든 뒤, WEB-INF 디렉터리 아래에 다시 ‘classes’라는 디렉터리를 만들고 패키지 구조에 따라 'HelloWorldServlet.class'를 복사한다. 예제에서는 anonymous 패키지이므로 별도의 디렉터리 없이 WEB-INF\classes로 복사한다.
그리고 snoop.jsp와 snoop-jstl.jsp를 ‘helloworld’ 디렉터리에 복사한다.
C:\TmaxSoft\JEUS6.0\samples\getting_started\helloservlet\src\java>copy HelloWorld
Servlet.class ..\..\helloworld\WEB-INF\classes
소스 파일을 작성하고 컴파일에 성공하였다면 다음의 절차에 따라 Java EE WAR 파일을 패키징한다.
Text Editor를 사용하여 다음과 같은 내용으로 web.xml과 jeus-web-dd.xml 파일을 작성하여 WEB-INF 디렉터리에 저장한다.
[예 9.4] <<jeus-web-dd.xml>>
<?xml version="1.0" encoding="UTF-8"?> <jeus-web-dd xmlns="http://www.tmaxsoft.com/xml/ns/jeus" version="6.0"> <context-path>/helloworld</context-path> </jeus-web-dd>
[예 9.5] <<web.xml>>
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> <display-name>Web Tier Tutorial</display-name> <servlet> <servlet-name>Hello World Servlet</servlet-name> <servlet-class>HelloWorldServlet</servlet-class> </servlet> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class> javax.faces.webapp.FacesServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello World Servlet</servlet-name> <url-pattern>/HelloWorldServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> </web-app>
jar 명령으로 hello 디렉터리의 내용을 WAR 모듈로 묶는다.
C:\TmaxSoft\JEUS6.0\samples\getting_started\helloservlet>jar cvf
helloworld.war –C helloworld/ .
예제 파일은 다음의 경로에서 찾을 수 있다.
JEUS_HOME\samples\getting_started\helloservlet\src\conf
패키징된 WAR 모듈은 WebAdmin이나 콘솔을 이용해서 Deploy한다.
패키징한 WAR 모듈은 WebAdmin과 콘솔 툴로 Deploy할 수 있다. WebAdmin에서는 EJB모듈과 같이 WAR 모듈에 대해 archive 모드, exploded 모드를 제공한다. 또한, JEUS가 기동되는 시스템의 임의의 디렉터리에 웹 애플리케이션이 존재할 경우 exploded 모드로 Deploy할 수 있는 기능을 제공한다.
이 기능은 Node View의 엔진 컨테이너 하위에 [Java EE 어플리케이션 모듈]을 선택했을 때, [새 웹 컨텍스트 배치]라는 링크를 클릭함으로써 사용할 수 있다.
Deploy에 대한 자세한 내용은 자세한 내용은 "JEUS WebAdmin 안내서"를 참조한다.
여기서는 이전에 사용한 방법과 동일하게 WAR 모듈을 Deploy 해보도록 한다.
웹 브라우저로 접속해서 로그인 한다.
Node View에서 [어플리케이션 모듈 디플로이]를 선택한다.
Deploy할 모듈을 선택하고 [다음] 버튼을 클릭한다.
Deploy할 엔진 컨테이너를 선택하고, 서블릿 엔진의 컨텍스트 그룹을 입력한 후 [다음] 버튼을 클릭한다.
필요한 선택사항을 입력하고 [다음] 버튼을 클릭한다.
Deploy 방식을 선택하고 [디플로이] 버튼을 클릭한다.
Deploy가 성공적으로 완료되면 Node View의 [어플리케이션 모듈] 아래 'helloworld'라고 나타난다.
다음은 콘솔 툴을 사용하여 수동으로 WAR 모듈을 Deploy하는 과정이다. 단, 서블릿과 JSP는 이미 언급한 대로 모두 컴파일된 것으로 가정한다.
컴파일된 서블릿, JSP, XML 파일을 각각 다음과 같은 디렉터리 아래에 위치시킨다.
서블릿 파일
JEUS_HOME\webhome\app_home\<모듈명>\WEB-INF\classes
예)
C:\TmaxSoft\JEUS6.0\webhome\app_home\helloworld\WEB-INF\classes
JSP 파일
JEUS_HOME\webhome\app_home\<모듈명>
예)
C:\TmaxSoft\JEUS6.0\webhome\app_home\helloworld
XML 파일
JEUS_HOME\webhome\app_home\<모듈명>\WEB-INF
예)
C:\TmaxSoft\JEUS6.0\webhome\app_home\helloworld \WEB-INF
jeusadmin으로 JEUS에 접속한다.
jeusadmin johan –Uadministrator –Pjeusadmin
접속이 되었다면 다음과 같은 순서로 명령을 입력한다.
johan>deploy -con johan_container1 helloworld
using the following application info : applicationType
path:helloworld.war
deployment-type:COMPONENT
class-ftp-unit:JAR
web-component
모듈이 정상적으로 Deploy되었는지 확인하고, 다음절에서 디플로이한 WAR 모듈을 실행해 보도록 한다.
본 절에서는 Deploy된 서블릿과 JSP를 사용하는 방법을 설명한다.
Hello World 서블릿을 호출하기 위해서는 브라우저의 주소 창에 다음과 같이 입력한다.
http://localhost:8088/helloworld/HelloWorldServlet
항목 | 설명 |
---|---|
http | JEUS에 접속할 때 사용하는 HTTP 프로토콜을 의미한다. |
Localhost | 서비스를 제공하는 서버가 브라우저와 동일한 자신의 주소에 있음을 의미한다. |
8088 | Context Group의 HTTP listener의 포트 번호이다. |
helloworld | 웹 애플리케이션의 context용 request path이다. Context group의 request path가 아님에 주의해야 한다. Context Group은 오직 포트 번호의 구분을 통해서만 요청을 분리할 수 있다. 이 request path는 WEBMain.xml의 context-path element에 설정되며, 이 값을 지정하지 않을 경우 WAR 모듈 파일의 이름과 동일하다. |
HelloWorldServlet | 서블릿에 정의된 URL 패턴이다. |
서블릿 엔진이 정상적으로 기동된 상태이고, Hello World 서블릿이 정상적으로 디플로이되었다면 다음과 같은 화면이 나타난다.
snoop.jsp 페이지를 호출
snoop.jsp 페이지를 호출하려면 다음의 주소를 웹 브라우저 주소 창을 통해 호출한다(JSP의 경우 최초로 호출하는 경우 서블릿 엔진이 자동으로 컴파일을 수행하므로 약간 늦게 실행된다).
http://localhost:8088/helloworld/faces/snoop.jsp
snoop-jstl.jsp 페이지를 호출
snoop-jstl.jsp 페이지를 호출하려면 다음 주소를 주소 창을 통해 호출하면 된다. 화면 결과는 snoop.jsp와 동일하다.
http://localhost:8088/helloworld/snoop-jstl.jsf