본문
기초 Jetty 설치와 실행, 그리고 서블릿 작성(on Windows)
4년전인가 servlet개발을 위해서 Tomcat을 임시로 설치해 사용했었는데, 그떄는 개발 목적으로 기본설정값만 가지고 사용했기 떄문에 상세한 내용이 기억이 나지 않는다, 1년 전에 jsp 프로젝트를 진행했었는데 그때 알게된 jetty. 역시 외부에 서버가 따로 있고 개발 위주로 로컬에 설치했기 때문에 기억이 잘 나지 않지만, 이번에는 개인적으로 개인서버에 올려서 진행할 프로젝트가 있기 떄문에 지난번에 여러 프로그램과의 경쟁에서 내 기억속에 남았던 Jetty를 공부해 보려 한다. 설치도 간편하고, 가벼울 뿐만 아니라 성능면에서도 좋고, 게다가 개발하는데에도 편리하기 떄문에.
"Jetty Tutorial"이라는 검색어로 구글링 해보니 질의어와 동일한 제목을 가진 페이지를 발견하였고, 이 페이지가 간략하면서 잘 설명되어 있다고 생각해서 이 페이지를 번역해 보기로 하였다. 이 페이지대로 실제 진행을 한 이후 글을 쓰는것이므로 오류는 없을것으로 예상이 된다. 그리고 최신 버전에 맞게, 그리고 사용상의 편의를 위해 몇몇부분 첨가, 수정을 하였다.
Jetty 설치와 실행하기
1. Java SDK를 설치합니다. 페이지에서 Java Platform, Standard Edition테이블에 있는 Download JDK를 클릭하여 진행합니다. 현재 최신 버전은 Java SE 6 Update 24입니다. 개발의 편의를 위해 시스템 환경변수에 Java 바이너리 폴더를 추가합니다. 제어판 -> 시스템 -> 고급 시스템 설정 -> 고급 -> 환경변수 -> 시스템 변수 -> Path 에 있는 변수값 맨 끝에 ;C:\Program Files\Java\jdk1.6.0_24\bin를 추가합니다.
[그림 1] 시스템 환경변수에 ;C:\Program Files\Java\jdk1.6.0_24\bin을 추가하여 개발에 편의를 더한다.
2. Jetty를 다운로드 받습니다. 리스트 가장 위에있는 Stable 버전을 받으면 되며, 현재 최신 버전은 Stable 7.2.2.v20101205입니다.
3. Jetty의 다운로드가 끝나면 이를 컴퓨터에 압축을 풀어줍니다. 경로는 크게 상관없지만 편의를 위해 C:\jetty에 풀어줍니다.
4. c:\jetty\에 들어간 후 start.bat 파일을 만들어 주고 파일 내용은 다음과 같이 한 후 실행합니다. java -jar start.jar
5. 아래와 같은 창이 뜬다면 설치가 성공적으로 진행된 것입니다. 만약 뭔가 나왔다가 사라지고 아니면 다른 이상한 오류메시지가 나온 경우네는 경로등의 정보가 잘못 되어있기 떄문입니다. 이 상태에서 종료를 하고싶다 한다면 Ctrl+C를 누릅니다.
[그림 2] jetty가 잘 동작하는 화면, 종료하고 싶다면 Ctrl+C를 누르면 종료가 된다.
5. 위 화면이 잘 보인다면 인터넷 브라우저에서 http://localhost:8080로 접속을 시도합니다. 아래와 같은 화면이 나오면 성공입니다.
[그림 3] jetty가 정상적으로 실행되는 화면.
간단한 웹 애플리케이션(서블릿) 작성하기
Jetty서버에는 webapps라는 폴더가 있으며, 이는 서버내의 모든 웹사이트(웹 어플리케이션)가 저장되어 있는 곳입니다. 우리
는 hello라는 간단한 웹 애플리케이션을 만들든 후 이를 webapps폴더에 넣을것입니다.
1. webapps폴더안에 hello라는 폴더를 만듭니다. hello폳더내의 파일들은 http://localhost:8080/hello의 형태로 접근이 가능합니다.
2. hello 폴더 안에 WEB-INF라는 폴더를 만듭니다. 이 폴더에는 애플리케이션에 대한 설정정보를 저장하게 됩니다.
3. WEB-INF 폴더내에 classes라는 폴더를 만듭니다. 이 폴더는 .class 확장자를 가진 서블릿 파일이 위치하게 됩니다.
4. hello폴더내에 index.html이라는 파일을 만들어 주고 내용은 아래와 같이 합니다.. 이는 http://localhost:8080/hello혹은 http://localhost:8080/hello/index.html의 형태로 접근이 가능합니다
5. 위의 폼을 위한 자바 서블릿으로 된 핸들러를 작성합니다. 아래 코드로 HelloServlet.java를 작성합니다
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet
{
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String q = req.getParameter("q");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<body>");
out.println("The paramter q was \"" + q + "\".");
out.println("</body>");
out.println("</html>");
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String field = req.getParameter("field");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<body>");
out.println("You entered \"" + field + "\" into the text box.");
out.println("</body>");
out.println("</html>");
}
}
6. 위의 클래스를 컴파일 하기 위해서 서블릿 라이브러리가 필요합니다. 이 파일은 기본적으로 Java SDK 패키지에 속하지 않기 떄문에 Jetty의 라이브러리 폴더에서 가져와 사용할 수 있습니다. C:\jetty\lib\servlet-api-2.5.jar의 파일을 C:\Program Files\Java\jdk1.6.0_24\bin에 복사한 후, 위의 HelloServlet.java 파일과 동일한 폴더에 compile.bat의 이름으로 파일을 하나 만들고, 이를 다음과 같이 설정합니다. javac -cp servlet-api-2.5.jar HelloServlet.java
* "-cp" 옵션은 개발자의 어플리케이션에서 필요로 하는 클래스들을 가지고 있는 jar 파일을 지정하는 옵션입니다.
7. 위의 과정에서 얻어진 HelloServlet.class 파일을 hello/WEB-INF/Classes 폴더에 저장합니다. 그리고 나서 우리는 Jetty에게 이 클래스가 사용자의 요청을 처리할 클래스라는것을 알려줘야 합니다. 아래의 코드에 따라 web.xml파일을 만들고,이를 WEB-INF 폴더에 저장합니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>Example</display-name>
<!-- Declare the existence of a servlet. -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<!-- Map URLs to that servlet. -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
</web-app>
8. 서버를 다시 시작하 후 http://localhost:8080/hello에 가서 폼을 작성하고 제출하면 You entered "<<여기에 폼에서 입력한 값이 들어감>>" into the text box. 라는 메시지가 뜰것입니다.
* 참고 : 서블릿 클래스에는 두개의 메소드, 즉 doGet()와 doPost()가 있습니다. 이들은 각각 해당하는 HTTP요청에 따라 실행됩니다. 위의 예제에서는 POST요청을 사용하여 폼을 제출했기 떄문에 doPost()메소드가 사용되었지만 GET요청을 사용한다면 물론 doGet()메소드가 사용될 수 있습니다. "http://localhost:8080/hello/servlet?q=Hello" 을 시도해 보면 GET요청(주소에 "?변수명=값"의 형태로 요청하는 방식)에 의해 doGet()메소드가 실행됨을 알 수 있습니다.
위 예제에 사용된 HelloServlet 클래스 파일을 아래에 첨부합니다.
"Jetty Tutorial"이라는 검색어로 구글링 해보니 질의어와 동일한 제목을 가진 페이지를 발견하였고, 이 페이지가 간략하면서 잘 설명되어 있다고 생각해서 이 페이지를 번역해 보기로 하였다. 이 페이지대로 실제 진행을 한 이후 글을 쓰는것이므로 오류는 없을것으로 예상이 된다. 그리고 최신 버전에 맞게, 그리고 사용상의 편의를 위해 몇몇부분 첨가, 수정을 하였다.
Jetty 설치와 실행하기
1. Java SDK를 설치합니다. 페이지에서 Java Platform, Standard Edition테이블에 있는 Download JDK를 클릭하여 진행합니다. 현재 최신 버전은 Java SE 6 Update 24입니다. 개발의 편의를 위해 시스템 환경변수에 Java 바이너리 폴더를 추가합니다. 제어판 -> 시스템 -> 고급 시스템 설정 -> 고급 -> 환경변수 -> 시스템 변수 -> Path 에 있는 변수값 맨 끝에 ;C:\Program Files\Java\jdk1.6.0_24\bin를 추가합니다.
[그림 1] 시스템 환경변수에 ;C:\Program Files\Java\jdk1.6.0_24\bin을 추가하여 개발에 편의를 더한다.
2. Jetty를 다운로드 받습니다. 리스트 가장 위에있는 Stable 버전을 받으면 되며, 현재 최신 버전은 Stable 7.2.2.v20101205입니다.
3. Jetty의 다운로드가 끝나면 이를 컴퓨터에 압축을 풀어줍니다. 경로는 크게 상관없지만 편의를 위해 C:\jetty에 풀어줍니다.
4. c:\jetty\에 들어간 후 start.bat 파일을 만들어 주고 파일 내용은 다음과 같이 한 후 실행합니다. java -jar start.jar
5. 아래와 같은 창이 뜬다면 설치가 성공적으로 진행된 것입니다. 만약 뭔가 나왔다가 사라지고 아니면 다른 이상한 오류메시지가 나온 경우네는 경로등의 정보가 잘못 되어있기 떄문입니다. 이 상태에서 종료를 하고싶다 한다면 Ctrl+C를 누릅니다.
[그림 2] jetty가 잘 동작하는 화면, 종료하고 싶다면 Ctrl+C를 누르면 종료가 된다.
5. 위 화면이 잘 보인다면 인터넷 브라우저에서 http://localhost:8080로 접속을 시도합니다. 아래와 같은 화면이 나오면 성공입니다.
[그림 3] jetty가 정상적으로 실행되는 화면.
간단한 웹 애플리케이션(서블릿) 작성하기
Jetty서버에는 webapps라는 폴더가 있으며, 이는 서버내의 모든 웹사이트(웹 어플리케이션)가 저장되어 있는 곳입니다. 우리
는 hello라는 간단한 웹 애플리케이션을 만들든 후 이를 webapps폴더에 넣을것입니다.
1. webapps폴더안에 hello라는 폴더를 만듭니다. hello폳더내의 파일들은 http://localhost:8080/hello의 형태로 접근이 가능합니다.
2. hello 폴더 안에 WEB-INF라는 폴더를 만듭니다. 이 폴더에는 애플리케이션에 대한 설정정보를 저장하게 됩니다.
3. WEB-INF 폴더내에 classes라는 폴더를 만듭니다. 이 폴더는 .class 확장자를 가진 서블릿 파일이 위치하게 됩니다.
4. hello폴더내에 index.html이라는 파일을 만들어 주고 내용은 아래와 같이 합니다.. 이는 http://localhost:8080/hello혹은 http://localhost:8080/hello/index.html의 형태로 접근이 가능합니다
<html>
<head><title>Example Web Application</title></head>
<body>
<p>This is a static document with a form in it.</p>
<form method="POST" action="servlet"/>
<input name="field" type="text" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
<head><title>Example Web Application</title></head>
<body>
<p>This is a static document with a form in it.</p>
<form method="POST" action="servlet"/>
<input name="field" type="text" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
5. 위의 폼을 위한 자바 서블릿으로 된 핸들러를 작성합니다. 아래 코드로 HelloServlet.java를 작성합니다
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet
{
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String q = req.getParameter("q");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<body>");
out.println("The paramter q was \"" + q + "\".");
out.println("</body>");
out.println("</html>");
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String field = req.getParameter("field");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<body>");
out.println("You entered \"" + field + "\" into the text box.");
out.println("</body>");
out.println("</html>");
}
}
6. 위의 클래스를 컴파일 하기 위해서 서블릿 라이브러리가 필요합니다. 이 파일은 기본적으로 Java SDK 패키지에 속하지 않기 떄문에 Jetty의 라이브러리 폴더에서 가져와 사용할 수 있습니다. C:\jetty\lib\servlet-api-2.5.jar의 파일을 C:\Program Files\Java\jdk1.6.0_24\bin에 복사한 후, 위의 HelloServlet.java 파일과 동일한 폴더에 compile.bat의 이름으로 파일을 하나 만들고, 이를 다음과 같이 설정합니다. javac -cp servlet-api-2.5.jar HelloServlet.java
* "-cp" 옵션은 개발자의 어플리케이션에서 필요로 하는 클래스들을 가지고 있는 jar 파일을 지정하는 옵션입니다.
7. 위의 과정에서 얻어진 HelloServlet.class 파일을 hello/WEB-INF/Classes 폴더에 저장합니다. 그리고 나서 우리는 Jetty에게 이 클래스가 사용자의 요청을 처리할 클래스라는것을 알려줘야 합니다. 아래의 코드에 따라 web.xml파일을 만들고,이를 WEB-INF 폴더에 저장합니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>Example</display-name>
<!-- Declare the existence of a servlet. -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<!-- Map URLs to that servlet. -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
</web-app>
8. 서버를 다시 시작하 후 http://localhost:8080/hello에 가서 폼을 작성하고 제출하면 You entered "<<여기에 폼에서 입력한 값이 들어감>>" into the text box. 라는 메시지가 뜰것입니다.
* 참고 : 서블릿 클래스에는 두개의 메소드, 즉 doGet()와 doPost()가 있습니다. 이들은 각각 해당하는 HTTP요청에 따라 실행됩니다. 위의 예제에서는 POST요청을 사용하여 폼을 제출했기 떄문에 doPost()메소드가 사용되었지만 GET요청을 사용한다면 물론 doGet()메소드가 사용될 수 있습니다. "http://localhost:8080/hello/servlet?q=Hello" 을 시도해 보면 GET요청(주소에 "?변수명=값"의 형태로 요청하는 방식)에 의해 doGet()메소드가 실행됨을 알 수 있습니다.
위 예제에 사용된 HelloServlet 클래스 파일을 아래에 첨부합니다.
댓글