22

以下のようなFaceletsファイルがいくつかあります。

Webコンテンツ
 |-- index.xhtml
 |-- register.xhtml
 |-- テンプレート
 | | |--userForm.xhtml
 | | ` --banner.xhtml
 :

どちらのページも/templatesディレクトリのテンプレートを使用しています。私/index.xhtmlのブラウザで問題なく開きます。生成された HTML 出力を取得します。/index.xhtmlファイルからファイルへのリンクがあり/register.xhtmlます。

ただし、 my/register.xhtmlは解析されず、生成された HTML 出力ではなく、プレーンな XHTML / 生の XML として返されます。形式のすべての EL 式は#{...}、結果が出力されるのではなく、そのまま表示されます。ブラウザでページを右クリックしてView page sourceを実行すると、生成された HTML 出力ではなく元の XHTML ソース コードが表示されます。たとえば、 は に<h:body>なりませんでした<body>。テンプレートが実行されていないようです。

ただし、ブラウザのアドレスバーで/register.xhtmllikeを開くと、正しく表示されます。/faces/register.xhtmlこれはどのように発生し、どうすれば解決できますか?

4

1 に答える 1

47

主な原因は3つあります。

  1. FacesServlet呼び出されません。
  2. XML 名前空間 URI が欠落しているか間違っています。
  3. 複数の JSF 実装がロードされています。

1. URL がFacesServletマッピングと一致していることを確認します

リンクの URL (ブラウザのアドレス バーに表示される URL) は、すべての JSF 作業を実行するために定義され<url-pattern>ていると一致する必要があります。は、XHTML ファイルの解析、送信されたフォーム値の収集、変換/検証の実行、モデルの更新、アクションの呼び出し、および HTML 出力の生成を担当します。URL で呼び出さない場合、得られるのは (右クリックしてブラウザでソースを表示すると表示される) のは、生の XHTML ソース コードだけです。FacesServletweb.xmlFacesServletFacesServlet

<url-pattern>たとえばの場合*.jsf、リンクは ではなく を指す必要が/register.jsfあり/register.xhtmlます。たとえば/faces/*、あなたが持っているように、リンクは ではなく を指す必要が/faces/register.xhtmlあり/register.xhtmlます。この混乱を避ける 1 つの方法は、 を<url-pattern>から/faces/*に変更すること*.xhtmlです。したがって、以下は理想的なマッピングです。

<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>

<url-pattern>何らかの理由でtoを変更できない場合は*.xhtml、エンドユーザーが URL によって XHTML ソース コード ファイルに直接アクセスできないようにすることも考えられます。その場合、それを防ぐ空の inで<security-constraint>on<url-pattern>を追加できます。*.xhtml<auth-constraint>web.xml

<security-constraint>
    <display-name>Restrict direct access to XHTML files</display-name>
    <web-resource-collection>
        <web-resource-name>XHTML files</web-resource-name>
        <url-pattern>*.xhtml</url-pattern>
    </web-resource-collection>
    <auth-constraint />
</security-constraint> 

2017 年 4 月に導入された JSF 2.3 では、 webapp の起動時にFacesServletURL パターンを自動的に登録することで、上記のすべてを解決しています。*.xhtmlしたがって、別の方法は、JSF 2.3 以上である最新の利用可能な JSF バージョンに単純にアップグレードすることです。しかし理想的には、、 、のようなまったく同じリソースに対して複数の可能な URL を持つことは SEO に悪いため、FacesServletの 1 つだけの URL パターンを明示的に登録する必要があります。*.xhtml/register.xhtml/register.jsf/register.faces/faces/register.xhtml

以下も参照してください。


2. XML 名前空間が JSF バージョンと一致していることを確認してください

JSF 2.2 の導入以降、考えられるもう 1 つの原因は、XML 名前空間が JSF のバージョンと一致しないことです。以下のxmlns.jcp.orgようなものは JSF 2.2 以降の新しいものであり、古い JSF バージョンでは機能しません。FacesServlet症状は、が起動されていない場合とほとんど同じです。

<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

JSF 2.2 以降にアップグレードできない場合は、java.sun.com代わりに古い XML 名前空間を使用する必要があります。

<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">

しかし理想的には、利用可能な最新バージョンを常に使用する必要があります。

以下も参照してください。


3. 複数の JSF 実装がロードされている

もう 1 つの考えられる原因は、複数の JSF 実装が webapp によってロードされ、互いに競合して破損していることです。たとえば、webapp のランタイム クラスパスが複数の異なるバージョンの JSF ライブラリで汚染されている場合、または特定の Mojarra 2.x + Tomcat 8.x の組み合わせで、ConfigureListenerwebapp に不要なエントリがあり、 web.xml2 回読み込まれる場合があります。

<!-- You MUST remove this one from web.xml! -->
<!-- This is actually a workaround for buggy GlassFish3 and Jetty servers. -->
<!-- When leaving this in and you're targeting Tomcat, you'll run into trouble. -->
<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

Maven を使用する場合は、依存関係を正しい方法で宣言し、依存関係のスコープを理解していることを必ず確認してください。重要なのは、依存関係がターゲット サーバーによって既に提供されている場合は、webapp に依存関係をバンドルしないことです。

以下も参照してください。


JSF を正しい方法で学習するようにしてください

基本的なHTTPHTML、およびサーブレットに慣れていない人にとって、JSF の学習曲線は非常に急です。インターネット上には質の低いリソースがたくさんあります。roseindia、tutorialspoint、javabeat、baeldung など、教育ではなく広告収入を主な目的としてアマチュアが管理しているコード スニペット スクレイピング サイトは無視してください。それらは、邪魔な広告リンク/バナーで簡単に認識できます。また、jurassic JSF 1.x を扱うリソースは無視してください。XHTML ファイルの代わりに JSP ファイルを使用すると、簡単に認識できます。ビュー テクノロジーとしての JSP は、2009 年の JSF 2.0 以降、非推奨になりました。

正しい方法で開始するには、JSF wiki ページから始めて、信頼できる書籍を注文してください。

以下も参照してください。

于 2010-06-24T20:25:47.887 に答える