5

私はまだ 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 サービスへのリクエストを処理しようとさえしておらず、対話型サイトへのリクエストを処理しようとしているだけで行き詰まりました。どんな助けでも大歓迎です!

4

1 に答える 1

1

元の問題の解決策は非常に簡単です。サーブレットをデフォルトのものとして構成する必要があります。

<servlet-mapping>
    <servlet-name>Interactive</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

/パターンに注意してください。このようにして、他のサーブレットによって処理されない要求を処理します (/*すべての要求を処理するマッピングとは異なります)。

ただし、このアプローチでは、静的コンテンツの提供に問題が生じます。提供する静的コンテンツがある場合は、より洗練されたソリューションが必要になる場合があります。たとえば、「Spring の使用、web.xml でのルートへのマッピング、静的リソースが見つかりません」を参照してください。

于 2012-07-30T07:41:47.893 に答える