为什么我的Java Server Faces HTML dataTable不填充?

问题描述 投票:0回答:1

我正在按照书中的说明创建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 "&#169;">]>
<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>
                &copy; Michael Muller <!-- &copy 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>
jsf
1个回答
0
投票

在您的控制器中尝试:

@ManagedBean(name = "categoryEditor");

并且在您的html中:

<h:dataTable value="#{categoryEditor._categories}"
                                 var="cat">

或删除您在“ CategoryEditor”中使用的名称“ _”,例如名称。

© www.soinside.com 2019 - 2024. All rights reserved.