以前のTomcatでは、invokerという機能を使うと web.xmlに設定を追加しなくてもサーブレットを 呼び出すことができました。 しかし、invokerにはセキュリティ上の問題があることが明らかになり、 tomcat 7.0からは外されました。
tomcat 7.0以降では、大人しくweb.xmlにmapを記述するか、 または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にしておくこと。 (これは先週やったはずです)
| アノテーション | 機能 |
|---|---|
| @WebServlet | Servletの定義 |
| @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 |
[ブラウザでアクセスするURL] http://localhost:8080/entry/AnnoServ

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