軽量サーブレットコンテナ winstone を開発用にサクッと使う

winstone とは

軽量サーブレットコンテナで、jarファイルのサイズ自体も非常に小さいです。開発時のJettyの代替として利用できるかと思います。Tiny Java Web Server なども候補に挙がりましたが、ちょっと使いまわしにくいところがあり、今回はwinstoneを紹介します。ダウンロードは以下から。
http://winstone.sourceforge.net/
通常版の winstone と、軽量版の winstone-lite がありますが、開発時利用では winstone-lite で十分です。通常版では、Apache との連携用にAJP13 がサポートされたり、認証レルムサポートが入っているみたいです。

プロジェクトの作成

プロジェクトページからwinstone-lite-0.9.10.jarをダウンロードしてクラスパスに追加します。winstoneJSPエンジンを内蔵していないため、JSPを利用する場合は以下のjarが必要になります。適宜ダウンロードしてクラスパスに追加します。

  • jasper-compiler.jar (tomcat5.5のcommon/libにある)
  • jasper-runtime.jar  (tomcat5.5のcommon/libにある)
  • jsp-api.jar (tomcat5.5のcommon/libにある)
  • ant.jar
  • commons-logging-api.jar
  • commons-el.jar
  • tools.jar (jdkのlibにある)

eclipseプロジェクト直下にwar/WEB-INF/classesとフォルダを作成し、ビルドパスにて出力フォルダをここに設定します。続いてweb.xmlを作成しておきます。
war/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

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

</web-app>

winstone起動クラスの作成

winstone起動用クラスを作成します。

import java.util.HashMap;
import java.util.Map;
import winstone.Launcher;

public class WebApp {
    public static void main(String... args) throws Exception {
        Map<String, String> prop = new HashMap<String, String>();
        prop.put("webroot", "war");
        prop.put("httpPort", "8080");
        prop.put("useJasper", "true");
        Launcher.initLogger(prop);

        final Launcher winstone = new Launcher(prop);

        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            public void run() {
                winstone.shutdown();        
            }
        }));
    }
}

基本的にプロパティをマップで設定してポンです。addShutdownHookで終了時の処理を追加しています。

JSPの作成

まずは、JSPを作成して表示してみましょう。warフォルダの直下に以下のindex.jspを作成します。

<html>
  <head><title>Winston Index</title></head>
  <body>
    <h1>Wellcome Winston Server</h1>
  </body>
</html>

サーバの起動

WebAppを実行して、ブラウザから以下のURLでアクセスして画面が表示されればOKです。
http://localhost:8080/index.jsp

サーブレットの作成

web.xmlサーブレットの定義を追加します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>etc9.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

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

</web-app>


作成するサーブレットは以下の通り。

public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, 
            HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.setStatus(HttpServletResponse.SC_OK);
        response.getWriter().println("<h1>Hello SimpleServlet</h1>");
        response.getWriter().println("session="+request.getSession(true).getId());
    }
}

サーブレットの実行

先ほどと同様にWebAppを実行して、ブラウザから以下のURLでアクセスして確認できます。
http://localhost:8080/hello

warを指定して起動

winstoneでは、warファイルを直接指定して、webアプリを直接起動することもできます。

java -jar winstone-0.9.10.jar --warfile=

こんな感じ・・