JSF не отображает первую строку, данные первого столбца
-
20-09-2019 - |
Вопрос
У меня есть очень простая страница, которая отображает консервированные данные. Я столкнулся с этой проблемой с данными из DB, поэтому я сделал этот простой пример и все еще имею проблему. Когда эта страница впервые перемещается для сеанса, в первом столбце в первой строке нет данных.
Не имеет значения, изменяю ли я сферу запроса или сеанса, а также не имеет значения, если я использую 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>
Решение
Таблица, которая устанавливает book
Запрос переменной области:
<h:dataTable value="#{homePage.books}"
var="book"
styleClass="homeTable"
rowClasses="evenColumn,oddColumn">
Управляемый фасоль, который устанавливает 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>
Просто угадываю, но мне интересно, по какой -то причине я язык выражения разрешает фасоль сессии. Это не должно - 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">
Я замечаю от вашего Doctype, что вы используете JSF 1.1. Я рекомендую обновить как минимум до 1,2 (предпочтительно 2.0), если вы можете.