サーブレットを簡単に作る


以前のTomcatでは、invokerという機能を使うと web.xmlに設定を追加しなくてもサーブレットを 呼び出すことができました。 しかし、invokerにはセキュリティ上の問題があることが明らかになり、 tomcat 7.0からは外されました。

invoker

tomcat 7.0以降では、大人しくweb.xmlにmapを記述するか、 またはServlet 3.0のannotationの機能を使うことになります。

Servlet 3.0のAnnotation機能を使う

${CATALINA_HOME}/webapps/examples/WEB-INF/web.xml の先頭部分を参考にして ${CATALINA_HOME}/webapps/entry/WEB-INF/web.xml を作成する。 web.xml のweb-appにおいて metadata-complete="true" のままだと アノテーションが無視されるので、これをfalseにしておくこと。 (これは先週やったはずです)

アノテーション機能
@WebServletServletの定義
@WebFilterフィルタの定義
@WebListenerリスナの定義
@WebInitParamパラメータの定義
@ServletSecurityセキュリティの制約
@MultipartConfigファイルアップロード

Javaプログラムの中に記述したアノテーションによる設定は、 web.xmlによる設定で上書きすることが可能です。

この授業では、URL-Patternとclassファイルをweb.xmlで設定するのを省略するために

@WebServer(name="クラスファイル",urlPatterns={"URLパターン"})
というアノテーションの記述を使うことにします。

[ファイル配置]
  ${CATALINA_HOME}/webapps/entry/WEB-INF/src/AnnotationServlet.java
${CATALINA_HOME}/webapps/entry/WEB-INF/src/AnnotationServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name="AnnotationServlet",urlPatterns={"/AnnoServ"})
public class AnnotationServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest req,HttpServletResponse res)
    throws IOException, ServletException {
	PrintWriter out = res.getWriter();
	out.println("Hello with Annotation");
    }
}
web.xmlへの記述の追加
なし
AnnotationServlet.javaのコンパイル
$ cd ${CATALINA_HOME}/webapps/entry/WEB-INF <img src="/icons/enter.gif">
$ javac -d classes src/AnnotationServlet.java <img src="/icons/enter.gif">
[ブラウザでアクセスするURL]
  http://localhost:8080/entry/AnnoServ

(注意)contextにreloadable="true"と設定してある場合でも、 @WebServlet を指定したclassファイルが WEB-INF/classesの下に新たに生成されたことを tomcatは自動で認識しないようです。 アノテーション機能を使うServletを新しく作成した場合は tomcat を再起動して下さい。

参考文献