Servletを作る

EclipseServletを作るメモ。

Eclipseインストールとか

Eclipse設定

Tomcatプラグイン
  • Window > Preferences > Tomcat
    • Tomcatバージョン
      • バージョン6.x
    • Tomcat ホーム
      • $HOME/tomcat6
    • コンテキスト宣言モード

これで$HOME/tomcat6/conf/Catalina/localhostの下に${プロジェクト名}.xmlというコンテキストファイルが作られる。

プロジェクト作成

  • Package Explorer > 右クリック > new > Project > Java > Tomcatプロジェクト
  • プロジェクトを右クリック > Tomcatプロジェクト > コンテキスト定義を後進

プログラム

  • javaプログラム
    • WEB-INF/srcに作成
  • jsp
    • プロジェクト直下に作成
  • web.xml
    • WEB-INF直下に作成

WEB-INF/src/Hello.java
いや、動かしてないですけどね、、、さすがに動くはず。笑

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Hello extends HttpServlet {
	
	@Override
	public void doGet(HttpServletRequest request,
			HttpServletResponse responce)
	        throws ServletException, IOException {
		
		responce.getWriter().println("hello");
	}
}

web.xmlにHello.javaサーブレットとして登録すればOK.

注意事項

VMware2をインストールしているとき

Tomcatとポートが三個所かぶるので、web.xmlを変更すること

invokerサーブレット
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
...
    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
...
  • んでもってTomcat6の場合は、Tomcat起動時に下記エラーが出るので
致命的: 設定記述子 .xml を配備中のエラーです
java.lang.SecurityException: クラス org.apache.catalina.servlets.InvokerServlet のサーブレットは特権を与えられているので、このWebアプリケーションによってロードできません
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1145)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:992)
	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4058)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4371)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
	at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:627)
	at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:553)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)
	at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1217)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:293)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
	at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
	at java.lang.Thread.run(Thread.java:619)

$TOMCAT_HOME/conf/context.xmlを編集して、Contextにprivileged="true"を追加

<Context privileged="true">
日本語を表示させる

conf/server.xmlのConnectorに下記を追加します。

<Connector port="8080"  ... UseBodyEncodingForURI="true" URIEncoding="UTF-8" />

http://tomcat.apache.org/tomcat-6.0-doc/config/http.htmlより。英訳は適当ですので、ぜひ原本を見てください。

  • URIEncoding

文字エンコーディングが、URLデコードされるときに使われる文字コードを指定します。
デフォルトはISO-8859-1。

  • UseBodyEncodingForURI

Trueを指定すると、GETパラメータ使用時、URIEncodingの代わりにcontentTypeで指定した文字エンコーディングが使用されます。
Tomcat 4.1.xの互換設定で、contentTypeや明示的にRequest.setCharacterEncodingが指定された時にURLのGETパラメータに使用されます。デフォルトはfalse。

URIEncodingを指定しておけば、その指定も文字コード以外はRequest.setCharacterEncodingで指定しても反映されないようなので、やはりUseBodyEncodingForURIも指定する必要があるのかもしれません。
が、詳しくはよくわかりませんでした。

サーブレットAPIのソースを見る

http://tomcat.apache.org/download-60.cgiより、Source Code Distributions > zipファイルのダウンロード。
その後、ダウンロードしたファイルを$TOMCAT_HOME/に移動させ、Eclipseから宣言ジャンプ時に「Atatch Source」を押下し、先ほどのzipファイルを指定する。