web-dev-qa-db-ja.com

JSFプロジェクトの<welcome-file>を介してデフォルトのホームページを設定する

EclipseからTomcat8.0を使用してJava EEプロジェクトを開始すると、ブラウザーに読み込まれるデフォルトのページを設定できません。JSFを学習しようとしているので、 thisチュートリアル

すべて正常に動作しますが、login.xhtmlまたはwelcome.xhtmlファイルを右クリックして[実行/サーバーで実行]を選択した場合にのみ、作成されたページを表示できます。

これまでのところ、私が作成した他のすべてのWebアプリケーションは、プロジェクト全体を開始したときにデフォルトのページをロードしました。デフォルトの動作は、index.htmlページ(または、存在する場合はindex.jsp)をロードすることです。そこで、プロジェクトのindex.htmlフォルダーにindex.xhtmlページとWEB-INFページを追加し、少なくとも1つが表示されることを期待しました。ただし、何も起こりません。ブラウザには常にlocalhost:8080/JSFFaceletsTutorial/URLのページのみが表示されますが、ページは白くきれいで、エラーメッセージも表示されません。この問題を解決する過程でエラー404が発生していると思いますが、このエラーを再現できなくなり、原因を思い出せません。

デフォルトの開始ページを変更する が可能であることがわかりました

しかし、それは私にとってもうまくいきません。 web.xmlファイルを編集するかどうかに関係なく、同じ結果が得られます。

さらに不可解なのは、Webブラウザーを変更しようとしたときに「ウィンドウ/ Webブラウザー/ ...」ということです。外部のWebブラウザーでは、内部のEclipseWebブラウザーとは動作がしばらく異なります。内部には常に空白のページがありましたが、外部のWebブラウザはかつてindex.htmlページを表示することができましたが、それは古いバージョンでした。編集し、変更を保存し、サーバーを再起動したことを絶対に確認しましたが、それでも、古いバージョンのページが表示されました。この場合でも、web.xmlファイルに加えられた変更は無視されます。しかし、今試してみると、すべてのブラウザで空白の白いページが再び表示されます。 web.xmlファイルの編集以外に行った変更を認識していません...

私の推測では、問題は私がまだ完全に理解していないJSFテクノロジーにあると思います。 「RunAs/Run on Server」を右クリックしてlogin.xhtmlページとwelcome.xhtmlページを実行することを選択した場合、それらのページのURLはlocalhost:8080:にあり、パスは/JSFFaceletsTutorial/faces/login.xhtml/JSFFaceletsTutorial/faces/welcome.xhtmlであるためです。プロジェクトにディレクトリ「faces」がないので、これは奇妙です。次のすべての可能な順列を入力します。

<welcome-file-list>
    <welcome-file>faces/index.html</welcome-file>
    <welcome-file>faces/index.xhtm</welcome-file>
</welcome-file-list>

web.xmlでも役に立ちませんでした。そこに完全なアドレスを入力したときも役に立ちませんでした。

コンソールに表示される警告は次のとおりです(INFOログエントリをスキップしました)。

"2014年12月19日9:39:55 AM org.Apache.Tomcat.util.digester.SetPropertiesRule begin警告:[SetPropertiesRule] {Server/Service/Engine/Host/Context}プロパティ「source」を「org.Eclipse」に設定しています。 jst.jee.server:JSFFaceletsTutorial 'は一致するプロパティを見つけられませんでした。..警告:JSF1074:' loginBean 'という名前のマネージドBeanはすでに登録されています。既存のマネージドBeanクラスタイプcom.tutorial.LoginBeanをcom.tutorial.LoginBeanに置き換えます。2014年12月19日9:39:57 AM org.Apache.coyote.AbstractProtocol start "

しかし、これが役立つかどうかはわかりません。私は今アイデアがありません。

9
Bob

まず第一に、<welcome-file>は「デフォルトのホームページ」へのパスを表していません。これは、/のようなfolderの場合に、デフォルトファイルとして提供するフォルダーに含まれる物理ファイルのファイル名を表します。 、/foo//foo/bar/などが要求されます。

したがって、JSF 2.xフレーバーでは、基本的に次のようになります。

<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

このように、エンドユーザーが/を要求し、あなたが/index.xhtmlを持っている場合、それは提供されます。または、エンドユーザーが/fooを要求し、/foo/index.xhtmlがある場合は、それが提供されます。そのようなファイルがない場合は、404エラーが返されます。

これで、FacesServlet<url-pattern>のプレフィックス/faces/*にマッピングしたように見えます。これはJSF1.0/1.1時代の残り物であり、最近はあまりお勧めできません。おそらく、JSF 1.xを対象とした古いチュートリアル、または元々JSF 1.x用に作成され、最初から書き直されるのではなくJSF2.x用に不注意に更新されたメンテナンスが不十分なチュートリアルを読んでいたのでしょう。

そのチュートリアルもあなたを説明していないようでした いくつかのサーブレットの基本 。つまり、XHTMLページのJSFコンポーネントを実行してHTML出力を生成するには、XHTMLページが要求されているときにFacesServletを呼び出す必要があります。 FacesServlet/index.xhtmlにマップされているときに、/faces/*のようにXHTMLページを要求すると、呼び出されません。次に、ブラウザは、生成されたHTML出力の代わりに、未加工の未解析のJSFソースコードを取得します。ウェブブラウザで右クリックしてソースを表示して表示できます。 FacesServletを実行して、ブラウザが理解して表示できるHTML出力を生成できるように、/faces/index.xhtmlのようなページをリクエストする必要があります。

それはウェルカムファイルと一緒にうまくいかないだけです。これは、ウェルカムファイルとしてindex.xhtmlを使用したときに「きれいな白」(空白)ページが表示される理由を完全に説明しています(IEのようないくつかの劣ったWebブラウザは混乱を招きます ダウンロードダイアログを表示します) 生のXHTMLソースコードを含む応答のコンテンツタイプが欠落しているか間違っているため)FacesServletは単に呼び出されていませんでした。昔ながらの/faces/* URLパターンを削除し、 JSF 2.xは、代わりに*.xhtmlURLパターンを気にしました。

<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

このようにして、ウェルカムファイルが機能し、仮想URLに煩わされることなく、物理URLを直接要求することでJSFページを開くことができます。これは、JSF 1.xでは不可能でした。これは、FacesServletがそれ自体を呼び出す無限ループで実行され、スタックオーバーフローが発生するためです。

参照:


それらの警告に関しては、それらは無関係ですが、かなりグーグル可能です。

14
BalusC

Web.xmlファイルのデフォルトページを設定して、2つの方法でfacesServletをJSFで呼び出すことができます。

<web-app xmlns="http://xmlns.xyz.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.xyz.org/xml/ns/javaee http://xmlns.xyz.org/xml/ns/javaee/web-app_4_0.xsd"
     version="4.0">
    <servlet>
        <servlet-name>facesServlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>facesServlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

または、次のようにウェルカムファイルから直接facesServletを呼び出します。

<web-app xmlns="http://xmlns.xyz.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.xyz.org/xml/ns/javaee http://xmlns.xyz.org/xml/ns/javaee/web-app_4_0.xsd"
 version="4.0">
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

それが誰かに役立つことを願っています!

0
webtechnelson