Guiceでサーブレット書いてみる
これだけだと、web.xmlのサーブレットマッピングをJavaコードとして記載できるだけだけど、練習
Jetty利用の事前準備
前回の記事と同様、Jettyをインメモリのサーバとして使うので、Jetty起動用のランチャーを作成
Jettyのjarにもクラスパス通す
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 launch() 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 { JettyLauncher.launch(); } }
web.xmlの設定
フィルタとして GuiceFilter を設定
リスナを登録(後述)
<?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> <filter> <filter-name>guiceFilter</filter-name> <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> </filter> <filter-mapping> <filter-name>guiceFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>guice.GuiceServletConfig</listener-class> </listener> </web-app>
リスナの実装
ここではリスナでサーブレットのマッピングを記載
public class GuiceServletConfig extends GuiceServletContextListener { @Override protected Injector getInjector() { return Guice.createInjector(new ServletModule() { @Override protected void configureServlets() { serve("*.html").with(HelloServlet.class); } }); } }
Servlet
Servletは何でもよいけど、@Singletonを指定しないと怒られた
@Singleton 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 Servlet</h1>"); } }
実行
JettyLauncherでサーバ起動してhttp://localhost:8080/web/test.htmlとかでServletが動く