主な原因は3つあります。
FacesServlet
呼び出されません。
- XML 名前空間 URI が欠落しているか間違っています。
- 複数の JSF 実装がロードされています。
1. URL がFacesServlet
マッピングと一致していることを確認します
リンクの URL (ブラウザのアドレス バーに表示される URL) は、すべての JSF 作業を実行するために定義され<url-pattern>
ていると一致する必要があります。は、XHTML ファイルの解析、送信されたフォーム値の収集、変換/検証の実行、モデルの更新、アクションの呼び出し、および HTML 出力の生成を担当します。URL で呼び出さない場合、得られるのは (右クリックしてブラウザでソースを表示すると表示される) のは、生の XHTML ソース コードだけです。FacesServlet
web.xml
FacesServlet
FacesServlet
<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 の起動時にFacesServlet
URL パターンを自動的に登録することで、上記のすべてを解決しています。*.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 の組み合わせで、ConfigureListener
webapp に不要なエントリがあり、 web.xml
2 回読み込まれる場合があります。
<!-- 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 を正しい方法で学習するようにしてください
基本的なHTTP、HTML、およびサーブレットに慣れていない人にとって、JSF の学習曲線は非常に急です。インターネット上には質の低いリソースがたくさんあります。roseindia、tutorialspoint、javabeat、baeldung など、教育ではなく広告収入を主な目的としてアマチュアが管理しているコード スニペット スクレイピング サイトは無視してください。それらは、邪魔な広告リンク/バナーで簡単に認識できます。また、jurassic JSF 1.x を扱うリソースは無視してください。XHTML ファイルの代わりに JSP ファイルを使用すると、簡単に認識できます。ビュー テクノロジーとしての JSP は、2009 年の JSF 2.0 以降、非推奨になりました。
正しい方法で開始するには、JSF wiki ページから始めて、信頼できる書籍を注文してください。
以下も参照してください。