2

初めて Eclipse で JSF 2.0 のテンプレートを使用しようとしていますが、問題が発生しています。

元のindex.xhtmlページは正しく機能し、ボタンをクリックするとすべて正常に機能します。ただし、テンプレート ファイルを使用するようにインデックス ページを変更すると、正しく動作しなくなります。変更されたindex.xhtmlページは次のとおりです。

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  template="/templates/main-template.xhtml">
  <ui:define name="title">
    Simulator using JSF 2.0 - Test Version 2
  </ui:define> 
  <ui:define name="header">      
    Home Page of the Simulator using JSF 2.0 - Test Version 2
  </ui:define>
  <ui:define name="body">
    Click on the button to select the required option
    <h:outputText value="and login" rendered="#{!login.loggedIn}"/>
    <h:form prependId="false">   
      <h:commandButton value="Option 1" action="#{login.option1}"/>
      <h:commandButton value="Option 2" action="#{login.option2}"/>
      <h:commandButton value="Option 3" action="#{login.option3}"/>
      <h:commandButton value="Logout" disabled="#{!login.loggedIn}" action="#{login.logout}"/>
    </h:form>   
  </ui:define>
</ui:composition>

テンプレート ファイルmain.template.xhtmlはサブフォルダの templates にあり、次の場所にあります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"  
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html">
  <h:head>
    <title>
      <ui:insert name="title">Title</ui:insert>
    </title>
  </h:head>      
  <h:body>
    <ui:insert name="header">Header</ui:insert>
    <br/>
    We are in template.xhtml
    <br/>
    <ui:insert name="body">Body</ui:insert>
  </h:body>
</html>

index.xhtml の「h」タグを含むすべてのコードを削除すると、ファイルは templates/main-template.xhtml のコードを正しく取得するため、パスは正しいです。ただし、ここにあるように「h」タグを含むコードを含めると、Eclipse はタグが認識されず、ページが失敗するというエラーを出します。

上部に行を含めると、xmlns:h="http://java.sun.com/jsf/html"Eclipse は「h」タグを認識し、ページは正しくレンダリングされますが、ボタンをクリックするとアプリケーションが失敗し、次のエラーが返されます。

javax.servlet.ServletException: javax.el.PropertyNotFoundException: /index.xhtml @15,68 action="#{login.option1}": ターゲットに到達できません。識別子 'login' が null に解決されました

おそらくxmlns:h="http://java.sun.com/jsf/html"、テンプレート ファイルの行が何かを台無しにしているのでしょうが、テンプレートの全体的な考え方は、テンプレート ファイルにできるだけ多くの共通コードを含めることです。

何が起こっているのか、そしてこれに対する解決策は何ですか?

web.xmlとは標準であり、faces-config.xml何もする必要はないと思います。

4

1 に答える 1

1

テンプレートがどのように機能するかについてのあなたの考えは正しいようですが、明確にしておくべき点がいくつかあります。多分これはあなたを助けるでしょう:

名前空間

名前空間については、ページでタグ ライブラリを使用するときはいつでも、その名前空間を宣言する必要があります。テンプレートを使用していて、テンプレートで宣言した場合でも。名前空間の宣言は継承されていないと考えることができます。

この場合、あなたindex.xhtmlのページは使用しh:commandButtonていますが、その名前空間を宣言していないことがわかります。

Bean を見つけるにELは、次のものが必要です。

次のように、パッケージ@ManagedBeanからのインポートで注釈が付けられたクラス:javax.faces.bean.ManagedBean

import javax.faces.bean.ManagedBean;

@ManagedBean
@ViewScoped
public class Login 
{
    // ...
}

この場合、慣例により、Bean はELname で検出されます。login(クラス名の最初の文字をデキャピタライズしてください)

または、名前を付けることができます。

import javax.faces.bean.ManagedBean;

@ManagedBean(name="login")
@ViewScoped
public class MyLoginBean
{
    // ...
}

この場合、慣例により呼び出されますmyLoginBeanが、この場合は という名前を付けたので、名前でlogin検索ELする必要がありますlogin

プレーンな JSF の代わりに CDI を使用する場合は、アノテーションを使用して、同じ命名規則に従って、@NamedBean がどのように検出されるかを定義できます。EL

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;

@Named(value="login")
@RequestScoped
public class MyLoginBean
{
    // ...
}

検索して変更するデータにELは、適切なゲッターとセッターが必要です。

ヒント

機能をテストするために、より単純なコードを作成することをお勧めします。この場合、最初にテンプレートをテストしてから、Bean、アクションなどをテストできます...

お役に立てば幸いです。

于 2012-10-14T16:55:57.937 に答える