2009-12-16 11 views
1

J'ai une page très simple qui affiche des données prédéfinies. J'ai rencontré ce problème avec les données d'une base de données, j'ai donc fait cet exemple simple et j'ai toujours le problème. Lorsque cette page est parcourue pour la première fois pour une session, la première colonne de la première ligne n'affiche aucune donnée.JSF n'affiche pas les données de la première ligne et de la première colonne

Peu importe si je change la portée à la demande ou à la session, et cela ne fait pas de différence si j'utilise firefox ou IE. Tout ce que je sais, c'est que si je recharge la page ou que je sors et que je reviens, tout d'un coup, je montrerai mes données - jusqu'à ce que je ferme toutes les instances de ce navigateur et en charge une nouvelle. Ensuite, encore une fois, il ne montrera pas mes données jusqu'à ce que je recharge la page. La question est pourquoi mon premier titre bien-aimé de mon premier livre n'apparaît-il jamais jusqu'à ce que je recharge la page ("Operating System Concepts" ne montre pas, mais "Silberschatz" fait)?

Ci-dessous le code correspondant.

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> 

Répondre

2

table qui définit une variable de portée de la demande book:

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

managed bean qui définit une variable de portée de la session 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> 

juste deviner, mais je me demande si la langue d'expression est la résolution de la bean session ici pour une raison quelconque. Il ne devrait pas - le ScopedAttributeELResolver"recherche les étendues de page, de requête, de session et d'application pour un attribut avec le nom donné et le renvoie, ou null si aucun attribut n'existe avec le nom actuel." Mais il n'est pas impossible qu'il y ait un bug dans l'implémentation du langage d'expression. Essayez de modifier le nom de l'attribut var pour éviter la collision ou le résoudre explicitement à l'étendue à l'aide de #{requestScope.book.title}. Je remarque de votre doctype que vous utilisez JSF 1.1. Je recommande de passer à au moins 1,2 (de préférence 2,0) si vous le pouvez.

+0

Vous êtes l'homme. J'ai ajouté cette ligne, mais cela n'a fait que déplacer le problème dans la colonne auteur. En outre, l'ajout du même correctif à la colonne auteur a tout corrigé. Vous avez émis l'hypothèse qu'il pourrait y avoir un "bug" dans le EL - attention à préciser ce que le préfixe de requestScope "fait" et pourquoi vous pensiez que cela le réglerait? Le vote en hausse et la vérification marqués comme réponse correcte - porteront également sur la mise à niveau de l'implémentation JSF. Je sais qu'il y avait beaucoup de dépendances à chasser, (devait correspondre à une spécification jsp spécifique et des trucs comme ça). – Russ

+0

La spécification JSP définit un ordre strict de la façon dont les variables sont résolues. Les variables implicites (comme requestScope et sessionScope) sont toujours résolues en premier. L'utilisation de ce préfixe signifie que EL ne recherchera pas les objets pour résoudre votre objet. Voir votre version de la spécification JSP pour l'ordre défini et la liste des variables implicites (probablement JSR 245 ou JSR 152). – McDowell