Jetty でインメモリなサーバ作成

Jettyのダウンロードと解凍

現在JettyはEclipse Foundationでホストされている。
http://www.mortbay.org/jetty/からリンクを辿り、Eclipseのサイトから以下をダウンロードして解凍。
jetty-distribution-7.0.0.RC1.zip

Eclipseでプロジェクト作成

Eclipseで、新規Javaプロジェクトを作成し、先ほど解凍したlibフォルダ内の以下のファイルをプロジェクトにコピーしてパスを通す。

  • jetty-continuation-7.0.0.RC1.jar
  • jetty-http-7.0.0.RC1.jar
  • jetty-io-7.0.0.RC1.jar
  • jetty-security-7.0.0.RC1.jar
  • jetty-server-7.0.0.RC1.jar
  • jetty-servlet-7.0.0.RC1.jar
  • jetty-util-7.0.0.RC1.jar
  • jetty-webapp-7.0.0.RC1.jar
  • jetty-xml-7.0.0.RC1.jar
  • servlet-api-2.5.jar

JSP等使う場合はこの他にもjarがいるが・

JavaからJettyを起動

package etc9;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

public class JettyLauncher {
    public static void main(String[] args) throws Exception {
        launchJetty();
    }

    public static void launchJetty() throws Exception {
        Server server = new Server(8080);
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        server.setHandler(context);
        context.addServlet(new ServletHolder(new HelloServlet()), "/hello");
        
        server.start();
        server.join();
    }

    public static 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());
        }
    }
}

ブラウザから以下にアクセスしてページが表示できれば成功
http://localhost:8080/hello

web.xmlを使用する例

プロジェクト内に以下のフォルダを掘る
WebContent/WEB-INF/classes

プロジェクトの出力先フォルダを「WebContent/WEB-INF/classes」に設定
WebContent/WEB-INF/にweb.xmlを以下の設定で配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
	"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
	"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
	<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>
</web-app>
package etc9;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.webapp.WebAppContext;

public class JettyLauncher {
        private static final int PORT = 8080;
        private static final String WAR_PATH = "WebContent";
        private static final String CONTEXT_PATH = "/web";

        public static void launchJetty() throws Exception {
            Server server = new Server(PORT);
            ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        server.setHandler(context);

        WebAppContext web = new WebAppContext(WAR_PATH, CONTEXT_PATH);
        server.setHandler(web);
        
        server.start();
        server.join();
    }

    public static void main(String[] args) throws Exception {
        launchJetty();
    }
}

サーブレットは普通に

package etc9;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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());
    }
}

あれっ、コンテキストパスが効いていない・の?