私はまだ Java サーブレットのプログラミングにかなり慣れていないので、間違っている場合はあらかじめお詫び申し上げます。(しかし、もしそうなら、私は助けていただければ幸いです!)
私の Web サイトには 2 つの主要な部分があります。Web サービス部分と「その他すべて」の部分です。後者は対話型ブラウザ要求のほとんどを処理します。web.xml ファイルで次のようなことを実行できると思いました。
<servlet>
<servlet-name>Webservice</servlet-name>
<servlet-class>com.mydomain.webservice</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Webservice</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Interactive</servlet-name>
<servlet-class>com.mydomain.interactive</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Interactive</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
その意図は、AJAX、ファット クライアント アプリケーション、またはその他の RPC メソッドのいずれかを介して通信する Web サービスが、次のような mydomain.com/webservice で始まる URL を使用することです。
- mydomain.com/webservice/login
- mydomain.com/webservice/viewuser/12345
- mydomian.com/webservice/deletitem/abc
- ...
ただし、通常ブラウザを使用してサイトを閲覧する人は、次のようにサイトにアクセスします。
- mydomain.com (ホームページ)
- mydomain.com/login
- mydomain.com/viewuser/12335
- mydomain.com/deletitem/abc
- ...
私の対話型クラスでは、getPathInfo() の結果を解析してリクエストを別のクラスに転送しています。これらのクラスの大部分は、リクエスト ディスパッチャを使用して情報を転送し、JSP ファイルを表示して実際に HTML をレンダリングしています。したがって、私のクラスの 1 つのコードの抜粋は次のようになります。
RequestDispatcher view = req.getRequestDispatcher("/WEB-INF/views/master.jsp");
view.forward(req, resp);
また、対話型サーブレットでエラー チェックを行っているため、ユーザーがルーティングできない URL (たとえば、foobar を処理するために何も定義していない場合の mydomain.com/foobar) にアクセスしようとすると、HTTP がスローされます。 404. ただし、起動すると、すべてが HTTP 404 を生成します。
いくつかのトラブルシューティングの後、リクエストが問題なくサーブレットに送信され、サーブレットが正しく解析していることがわかりました。ただし、/WEB-INF/views/master.jsp に転送しようとすると、サーブレットが再度呼び出されます。WEB-INF は公にアクセスできないリソースを表す「魔法の」ディレクトリだと思っていましたが、私の Java コンテナ (Jetty、Eclipse 用の Google App Engine プラグイン経由) は、URL へのアクセス試行のように扱っているようです。/* を web.xml ファイルの url-pattern として定義すると、文字通り解釈されて、すべてがそのサーブレットに送信され、リクエストを WEB- INF ディレクトリ。
私は何か間違ったことをしていますか?私はまだ Web サービスへのリクエストを処理しようとさえしておらず、対話型サイトへのリクエストを処理しようとしているだけで行き詰まりました。どんな助けでも大歓迎です!