- PR -

web.xmlの設定って?

投稿者投稿内容
POLON
会議室デビュー日: 2002/09/10
投稿数: 13
投稿日時: 2002-11-11 00:11
大変初歩的な質問で恐縮ですがお答え願います。

問題内容は「Servletが認識されない!」です。

先程”Apache Tomcat/4.1.12-LE-jdk14”を導入しました。
そこで以前ver.3.x 時代に使用していたWebアプリを以前と同様に
webapps直下に配置したのですが動かないのです。
Error Messageには
「description The requested resource (/sgr3/servlet/ReqInfoViewer) is not available.」
と怒られてしまいます。

web.xmlの設定がいけないのでしょうか?

設定は以下の通りです。
-------------------------------------------------
conf/server.xml
-------------------------------------------------
<Context path="/sgr3" docBase="contents/sgr_3"
debug="0"
reloadable="true"
crossContext="true">
</Context>

-------------------------------------------------
webapps/sgr3/WEB-INF/web.xml
-------------------------------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
</web-app>

ちなみにJSPはマトモに動きます。(謎)

何方かご教授お願い致します。
siggy
常連さん
会議室デビュー日: 2002/08/14
投稿数: 23
投稿日時: 2002-11-11 01:22
ReqInfoViewerのクラスファイルはどこに置いていますか?
webappsからのパスを教えてください。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-11-11 07:43
Tomcat/4.1.12 以降では脆弱性のため、自動で/servlet 以下にサーブレットを展開することはしなくなりました。詳しくはJakartaの2002年10月9日のニュースを見てください。今は各サーブレットを <servlet></servlet> と <servlet-mapping></servlet-mapping> で指定してあげる必要があります。

コード:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
  <servlet>
    <servlet-name>ReqInfoViewer</servlet-name>
    <servlet-class>ReqInfoViewerへのフルクラスパス</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ReqInfoViewer</servlet-name>
    <url-pattern>/servlet/ReqInfoViewer</url-pattern>
  </servlet-mapping>
</web-app>



追記:そんなにたいしたことではないですが、web.xmlのDTDがバージョン2.2のままです。Tomcat4.xでは2.3が使用できるので、
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
に変えると良いかもしれません。現状では必要なさそうですが・・・
POLON
会議室デビュー日: 2002/09/10
投稿数: 13
投稿日時: 2002-11-11 12:56
[To siggyさん]
初めまして、お答え頂きまして有難う御座います。
Pathは”webapps/contents/sgr3/WEB-INF/classes/ReqInfoViewer”となっております。

[To H2さん]
ご無沙汰しております、圧縮File作成の件では大変お世話になりました。
ver.4.0.1の脆弱性を知ってから急いでver.4.1.12に変更した為
開発Serverという事も有り、殆どNewsを見ずに導入してしまいました。
反省です・・・。

という事は今後は「classを作ったら、横着せずに”web.xml”に書きなさい。」という事なんですね。
なるほど、納得です。

お二人方ご指摘有難う御座いました。
再度修正を行った折、結果報告を差し上げたいと思います。
POLON
会議室デビュー日: 2002/09/10
投稿数: 13
投稿日時: 2002-11-13 10:18
あれから色々試したりJavaHouse等の情報源も見たのですがお手上げ状態です・・・。
申し訳ないのですが再度何方かご教授頂けないでしょうか。

現在のDir構成は・・・、
-----------------------------------------------
# [webapps]
#   |
#   +---[WEB-INF]
#       |
#       +---[classes]
#       |   |
#       |   +---HelloJavaWorld
#       |   |
#       |   +---[sgr_3]
#       |       |
#       |       +---ReqInfoViewer.class
#       |
#       +--- web.xml
#       |
#       +---[lib]

server.xmlの記述は・・・、
-----------------------------------------------
<Host name="localhost" debug="0" appBase="webapps"
unpackWARs="true" autoDeploy="true">



<Context path="/sgr3" docBase="contents/sgr_3"
debug="0"
reloadable="true"
crossContext="true">
</Context>



</Host>

web.xmlの記述は・・・、
-----------------------------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<filter-mapping>
<filter-name>Servlet Mapped Filter</filter-name>
<servlet-name>invoker</servlet-name>
</filter-mapping>

<servlet>
<servlet-name>HelloJavaWorld</servlet-name>
<servlet-class>HelloJavaWorld</servlet-class>
</servlet>

<servlet>
<servlet-name>ReqInfoViewer</servlet-name>
<servlet-class>sgr_3.ReqInfoViewer</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>

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

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

</web-app>

以下の設定でAccessしたく思っております。
-----------------------------------------------
url1 => "http://localhost/sgr3/servlet/HelloJavaWorld"
url2 => "http://localhost/sgr3/servlet/ReqInfoViewer"


本当に大変申し訳ないのですが
ご指導、宜しくお願い致します。

--後記述---
試しにHelloJavaWorld.classをexamples Dirに入れ、web.xmlに追加。
その後、何事もなく実行出来たのでSourceやCompileうんぬんの問題ではなさそうです・・・。
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-11-13 11:19
今ある情報から問題と思われる場所を挙げると、

・webappsの直下にWEB-INFがあるのはおかしい(contents/sgr3の下にあるのでは?)
・server.xmlのdocBaseの内容と実際のディレクトリ構成はあっているのか?
・invokerを使うのならservlet-mappingやservletの記述はweb.xmlには必要ない
・使わないのならinvokerを書くべきではない

などがあります。

H2さんの書かれた設定でうまくいくはずですので、
docBaseと実際のディレクトリ構成が相違している点があやしいかなと。
contentsというディレクトリはどこにあるのでしょうか。
この設定だと、
webapps/contents/sgr3/WEB-INF...
のようなディレクトリ構成になっていなければいけないはずです。
(docBaseにはappBaseからの相対パスか、絶対パスを書きます)
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-11-13 11:28
あれ?
でも元はwebapps/contents/sgr3/WEB-INF/classes/ReqInfoViewer
となっていると書いてありましたね。

ということは省略されているだけなのかな?

あと一つ。
http://localhost/sgr3/servlet/HelloJavaWorld
で呼び出したいのなら、
<servlet-mapping>
<servlet-name>HelloJavaWorld</servlet-name>
<url-pattern>/HelloJavaWorld</url-pattern>
</servlet-mapping>

ではなく、
<servlet-mapping>
<servlet-name>HelloJavaWorld</servlet-name>
<url-pattern>/servlet/HelloJavaWorld</url-pattern>
</servlet-mapping>
と書くべきですね。
H2さんの書かれた通りです。
こうすればinvokerを使用する必要はなくなります。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-11-13 18:58
amnakyさんの言われているようにディレクトリ構成がちょこっと違います。

-----------------------------------------------
# [webapps/contents]
#   |
#   +---[sgr3]
#       |
#       +---[WEB-INF]
#          |
#          +---[classes]
#          |
#          +---HelloJavaWorld.class
#          |
#          +---[sgr_3]
#          |   |
#          |   +---ReqInfoViewer.class
#          |
#          +---[lib]
#          |
#          +---web.xml
ディレクトリ構成はこうでないかと。

で、web.xmlは
コード:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

... 略 ...

<servlet>
  <servlet-name>HelloJavaWorld</servlet-name>
  <servlet-class>HelloJavaWorld</servlet-class>
</servlet>

<servlet>
  <servlet-name>ReqInfoViewer</servlet-name>
  <servlet-class>sgr_3.ReqInfoViewer</servlet-class>
</servlet>

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

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

</web-app> 


のはず

<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
は使うべきではありません。4.1.12からコメントアウトされたのには理由があるのですから・・・。

あと気になるのはこのフィルタ。
<filter-mapping>
<filter-name>Servlet Mapped Filter</filter-name>
<servlet-name>invoker</servlet-name>
</filter-mapping>
は何のためですか? 必要なければ消した方が良いと思いますよ。

スキルアップ/キャリアアップ(JOB@IT)