2009-12-16 39 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