kagamihogeの日記

kagamihogeの日記です。

JBoss AS 7ではじめてServlet 3.0でHello Wolrdをうごかした

Servlet 3.0からweb.xmlいらなくなったよーというのを伝聞はともかく自分で体感したことが無かったので。

準備&こんな環境でやりました

Eclipseから起動したいという実務的な欲求があるんで、このエントリはEclipseベッタリなやり方です。つまり、SevletによるWebアプリケーションのプログラミングにとしては、本質的には不要な準備が含まれますよ、という意味です。

以下はダウンロードして解凍すれば基本的にはOKなもの。

以下はEclipseプラグインなので、Eclipseからのインストール等の準備が必要。

以上を準備してコレなどを参考に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 + "!";
   }

}