Servlet 3.0からweb.xmlいらなくなったよーというのを伝聞はともかく自分で体感したことが無かったので。
準備&こんな環境でやりました
Eclipseから起動したいという実務的な欲求があるんで、このエントリはEclipseベッタリなやり方です。つまり、SevletによるWebアプリケーションのプログラミングにとしては、本質的には不要な準備が含まれますよ、という意味です。
以下はダウンロードして解凍すれば基本的にはOKなもの。
以下はEclipseプラグインなので、Eclipseからのインストール等の準備が必要。
- m2e
- EclipseのMavenプラグイン。後述のJBoss CentralからサンプルプロジェクトをインポートするのにMavenをが絡むため。
- Eclipse 3.7 で Maven 使えるようになるところまでの設定 - kagamihogeのblog
- JBoss Tools 3.3
- EclipseのServerビューからJBossを起動するのに使うプラグイン。実際には他にも色々な機能が含まれるが、このエントリではサンプルプロジェクトのインポート&Eclipseからのサーバー起動以外を使わないので詳細は割愛。
- JBoss Tools 3.3 | Installation | From Update Site - JBoss Community
以上を準備してコレなどを参考にServerビューにJBoss AS 7を追加すれば準備完了。
やったこと
Eclipseの下記のビューからProjects Examples -> JBoss Quickstarts -> HelloWoldを押すとjboss-as-helloworldというサンプルプロジェクトがインポートされる。
これをJBoss AS 7にデプロイして起動し、http://localhost:8080/jboss-as-helloworld にアクセス。URLは http://localhost:8080/jboss-as-helloworld/HelloWorld でも良い。これは jboss-as-helloworld\src\main\webapp\index.html が下記のようにかかれているため。
<meta http-equiv="Refresh" content="0; URL=HelloWorld">
そうするとブラウザ上に「Hello World!」と表示される。
というわけで次はServletを使用したソースコードを見てみる。下記は、サンプルのコードをコメント部分は除いて丸々コピーしてのっけたもの。
package org.jboss.as.quickstarts.helloworld; import java.io.IOException; import java.io.PrintWriter; import javax.inject.Inject; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") @WebServlet("/HelloWorld") public class HelloWorldServlet extends HttpServlet { static String PAGE_HEADER = "<html><head /><body>"; static String PAGE_FOOTER = "</body></html>"; @Inject HelloService helloService; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.println(PAGE_HEADER); writer.println("<h1>" + helloService.createHelloMessage("World") + "</h1>"); writer.println(PAGE_FOOTER); writer.close(); } }
WebServletアノテーションでマッピングされているのが分かる。なお、web.xmlはファイルそのものが存在しない。
HelloServiceのインスタンスはCDIによってDIされる。詳細は俺自身まだ良く理解していないので省略するがコチラもだいぶ簡素化されており、HelloWorld程度だと jboss-as-helloworld\src\main\webapp\WEB-INF\beans.xml はマーカーとしてのファイルを置いておくだけで済む。
<!-- Marker file indicating CDI should be enabled --> <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> </beans>
DIされてくるHelloServiceクラスのコードは↓だけ。DIされる側のクラスには継承しないといけないクラスとかアノテーションとかは要らないようだ、てそりゃ当然か。
package org.jboss.as.quickstarts.helloworld; public class HelloService { String createHelloMessage(String name) { return "Hello " + name + "!"; } }