2009-12-16 78 views
1

我有一個顯示罐頭數據的非常簡單的頁面。我遇到了來自數據庫的數據的這個問題,所以我做了這個簡單的例子,仍然有問題。當此頁面首次導航到會話時,第一行中的第一列不顯示任何數據。JSF不顯示第一行,第一列數據

如果我將範圍更改爲請求或會話,則無關緊要,如果我使用Firefox或IE,也沒有什麼不同。我所知道的是,如果我重新加載頁面或導航離開並回來,它會突然顯示我的數據 - 直到我關閉該瀏覽器的所有實例並加載一個新的瀏覽器。然後,再次,它不會顯示我的數據,直到我重新加載頁面。

問題是爲什麼直到我重新加載頁面(「操作系統概念」不顯示,但「Silberschatz」),我的第一本書的心愛的第一個標題才顯示出來?

下面是相關的代碼。

HomePage.java:

public class HomePage { 

    private Book[] books; 

    public HomePage() { 
     books = new Book[3]; 
     books[0] = new Book("Operating System Concepts", "Silberschatz"); 
     books[1] = new Book("Learning Sql", "Beaulieu"); 
     books[2] = new Book("Effective Java", "Bloch"); 
    } 

    public Book[] getBooks() { 
     return books; 
    } 
    public void setBooks(Book[] books) { 
     this.books = books; 
    } 
} 

Book.java

public class Book { 

    private String title; 
    private String author; 

    public Book() {} 

    public Book(String title, String author) { 
     this.title = title; 
     this.author = author; 
    } 


    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getAuthor() { 
     return author; 
    } 
    public void setAuthor(String author) { 
     this.author = author; 
    } 
} 

針對home.jsp:

<html> 
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> 
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> 

    <link href="../css/styles.css" rel="stylesheet" type="text/css" /> 
    <f:loadBundle basename="omitted.for.anonymity.bundle.home" var="msgs"/> 

    <f:view> 
    <body> 
     <h:form> 
     <h:panelGrid columns="2" columnClasses="sideControlColumn,contentColumn"> 
      <f:facet name="header"> 
      <f:subview id="header"> 
       <jsp:include page="header.jsp" /> 
      </f:subview> 
      </f:facet> 

      <f:subview id="sideControl" > 
      <jsp:include page="sideControl.jsp" /> 
      </f:subview> 

      <h:dataTable value="#{homePage.books}" 
       var="book" 
       styleClass="homeTable" 
       rowClasses="evenColumn,oddColumn" 
       > 

      <h:column> 
       <f:facet name="header"> 
       <h:outputText value="#{msgs.columnHeader1}"/> 
       </f:facet> 

       <h:outputText value="#{book.title}" /> 
      </h:column> 

      <h:column> 
       <f:facet name="header"> 
       <h:outputText value="#{msgs.columnHeader2}"/> 
       </f:facet> 

       <h:outputText value="#{book.author}" /> 
      </h:column> 

      </h:dataTable> 

     </h:panelGrid> 
     </h:form> 
    </body> 
    </f:view> 
</html> 

faces-config.xml中:

<?xml version="1.0"?> 
<!DOCTYPE faces-config PUBLIC 
    "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" 
    "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> 

<faces-config> 

    <navigation-rule> 
    <from-view-id>/pages/login.jsp</from-view-id> 
     <navigation-case> 
      <from-outcome>login</from-outcome> 
      <to-view-id>/pages/home.jsp</to-view-id> 
     </navigation-case> 
    </navigation-rule> 

    <navigation-rule> 
    <from-view-id>/pages/home.jsp</from-view-id> 
     <navigation-case> 
      <from-outcome>searchForBooks</from-outcome> 
      <to-view-id>/pages/searchCriteria.jsp</to-view-id> 
     </navigation-case> 
    </navigation-rule> 

    <navigation-rule> 
    <from-view-id>/pages/searchCriteria.jsp</from-view-id> 
     <navigation-case> 
      <from-outcome>searchForBooks</from-outcome> 
      <to-view-id>/pages/searchCriteria.jsp</to-view-id> 
     </navigation-case> 
    </navigation-rule> 

    <navigation-rule> 
    <from-view-id>/pages/searchResults.jsp</from-view-id> 
     <navigation-case> 
      <from-outcome>searchForBooks</from-outcome> 
      <to-view-id>/pages/searchCriteria.jsp</to-view-id> 
     </navigation-case> 
    </navigation-rule> 

    <navigation-rule> 
    <from-view-id>/pages/searchCriteria.jsp</from-view-id> 
     <navigation-case> 
      <from-outcome>search</from-outcome> 
      <to-view-id>/pages/searchResults.jsp</to-view-id> 
     </navigation-case> 
    </navigation-rule> 


    <managed-bean> 
     <managed-bean-name>book</managed-bean-name> 
     <managed-bean-class>omitted.for.anonymity.beans.Book</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 
    <managed-bean> 
     <managed-bean-name>homePage</managed-bean-name> 
     <managed-bean-class>omitted.for.anonymity.beans.page.HomePage</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 
    <managed-bean> 
     <managed-bean-name>searchCriteriaPage</managed-bean-name> 
     <managed-bean-class>omitted.for.anonymity.beans.page.SearchCriteriaPage</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 
    <managed-bean> 
     <managed-bean-name>searchResultsPage</managed-bean-name> 
     <managed-bean-class>omitted.for.anonymity.beans.page.SearchResultsPage</managed-bean-class> 
     <managed-bean-scope>request</managed-bean-scope> 
    </managed-bean> 

</faces-config> 

回答

2

表,設置一個book請求範圍變量:

<h:dataTable value="#{homePage.books}" 
    var="book" 
    styleClass="homeTable" 
    rowClasses="evenColumn,oddColumn"> 

託管Bean,它設置了一個book會話範圍變量:

<managed-bean> 
    <managed-bean-name>book</managed-bean-name> 
    <managed-bean-class>omitted.for.anonymity.beans.Book</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

只是猜測,但我不知道,如果表達式語言解決會話bean這裏出於某種原因。它不應該 - ScopedAttributeELResolver「搜索具有給定名稱的屬性的頁面,請求,會話和應用程序作用域並返回它,如果當前名稱不存在任何屬性,則爲null。」但是,在表達式語言實現中存在一個錯誤並不是不可能的。嘗試更改var屬性的名稱以避免碰撞,或使用#{requestScope.book.title}將其明確解析爲範圍。

<!DOCTYPE faces-config PUBLIC 
    "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" 
    "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> 

我從您的文檔類型注意到您正在使用JSF 1.1。如果可以的話,我建議升級到至少1.2(最好2.0)。

+0

你是男人。我添加了該行,但它只將問題移至作者列。此外,向作者列添加相同的修復程序修復了一切。您假設EL中可能存在「bug」 - 請詳細說明requestScope的「前綴」是什麼,以及爲什麼您認爲這會修復它?投票和檢查標記爲正確答案 - 也將考慮升級JSF實現。我知道有很多依賴追逐,(必須匹配一個特定的jsp規範和類似的東西)。 – Russ 2009-12-17 14:21:22

+0

JSP規範定義了變量如何解析的嚴格順序。隱式變量(比如requestScope和sessionScope)總是首先被解析。使用這個前綴意味着EL不會通過作用域來解析你的對象。查看您的JSP規範版本,瞭解已定義的順序和隱式變量列表(可能是JSR 245或JSR 152)。 – McDowell 2009-12-17 15:12:04