我正在按照书中的说明创建JSF网页。用于创建数组列表的init()方法。该列表填充了数据表,但网页上未显示任何内容。我在init方法中放入了一条日志消息,但没有消息显示。
编辑:Java 1.8.0_222Payara 5.193.1NetBeans 8.2
index.html
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE xhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [<!ENTITY copy "©">]>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Books</title>
<h:outputStylesheet library="css" name="books.css"/>
</h:head>
<h:body>
<div id="wrapper">
<header>
<h1>Michael's book list</h1>
</header>
<main>
<h1>Edit categories</h1>
<h:form>
<h:dataTable value="#{categoryEditor.categories}"
var="cat">
<h:column>
<h:commandLink
action="#{categoryEditor.deleteCategory(cat)}">
<h:graphicImage alt="delete"
name="Delete.png"
library="icon/small"
title="delete"/>
</h:commandLink>
</h:column>
<h:column>
<h:inputText value="#{cat.name}"/>
</h:column>
</h:dataTable>
<h:commandLink styleClass="button"
value="Add category"
action="#{categoryEditor.addCategory}"/>
<h:commandButton styleClass="button"
value="Save"
action="#{categoryEditor.save}"/>
</h:form>
</main>
<nav>
This is the Navigation
</nav>
<footer>
© Michael Muller <!-- © refers to the copyright sign
HTML5 doesn't know such entities, so doctype must be enhanced-->
<h:outputLink value="http://blog.mueller-bruehl.de">
Michael's Blog
</h:outputLink>
<h:link value="About" outcome="index.xhtml"/>
</footer>
</div>
</h:body>
</html>
CategoryEditor.java
package us.potato.books;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class CategoryEditor implements Serializable{
private static final long serialVersionUID = 1L;
private static final Logger _logger = Logger.getLogger("CategoryEditor");
@PostConstruct
private void init() {
_categories = new ArrayList<>();
_categories.add(new Category(){{setId(1); setName("Java");}});
_categories.add(new Category(){{setId(2); setName("Web");}});
_logger.log(Level.INFO, "Categories initialized");
}
private List<Category> _categories;
public List<Category> getCategories() {
return _categories;
}
public void setCategories(List<Category> categories) {
_categories = categories;
}
public String addCategory(){
_categories.add(new Category());
return "";
}
public String deleteCategory(Category category){
_categories.remove(category);
return "";
}
public String save(){
String categories = "";
for (Category category : _categories){
if(!category.getName().isEmpty()){
if (categories.length() > 0){
categories += ", ";
}
categories += category;
}
}
_logger.log(Level.INFO, "Save categories: {0}", categories);
return "";
}
}
Category.java
package us.potato.books;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class CategoryEditor implements Serializable{
private static final long serialVersionUID = 1L;
private static final Logger _logger = Logger.getLogger("CategoryEditor");
@PostConstruct
private void init() {
_categories = new ArrayList<>();
_categories.add(new Category(){{setId(1); setName("Java");}});
_categories.add(new Category(){{setId(2); setName("Web");}});
_logger.log(Level.INFO, "Categories initialized");
}
private List<Category> _categories;
public List<Category> getCategories() {
return _categories;
}
public void setCategories(List<Category> categories) {
_categories = categories;
}
public String addCategory(){
_categories.add(new Category());
return "";
}
public String deleteCategory(Category category){
_categories.remove(category);
return "";
}
public String save(){
String categories = "";
for (Category category : _categories){
if(!category.getName().isEmpty()){
if (categories.length() > 0){
categories += ", ";
}
categories += category;
}
}
_logger.log(Level.INFO, "Save categories: {0}", categories);
return "";
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>us.potato</groupId>
<artifactId>Books</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>Books</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.2.7</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${endorsed.dir}</outputDirectory>
<silent>true</silent>
<artifactItems>
<artifactItem>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>7.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
在您的控制器中尝试:
@ManagedBean(name = "categoryEditor");
并且在您的html中:
<h:dataTable value="#{categoryEditor._categories}"
var="cat">
或删除您在“ CategoryEditor”中使用的名称“ _”,例如名称。