2016-12-28 41 views
1

我尝试使用CDI和JSF获取数据库中所有书籍的列表,格式设置为dataTable并打印在网页中,但取而代之,我获得空白页面。我也尝试使用JSF selectOneMenu代替dataTable,但结果相同。h:dataTable不显示任何记录

Here`s页面的代码

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
     xmlns:f="http://xmlns.jcp.org/jsf/core"> 
    <head> 
     <title>Publish a book</title> 
    </head> 
    <h:body> 
     <ui:define name="content"> 
      <h:dataTable value="#{pub.allBooks}" var="c"> 
       <h:column>#{c.title}</h:column> 
      </h:dataTable> 
     </ui:define> 
    </h:body> 
</html> 

控制器

import javax.annotation.ManagedBean; 
import javax.annotation.PostConstruct; 
import javax.enterprise.inject.Model; 
import javax.enterprise.inject.Produces; 
import javax.faces.context.FacesContext; 
import javax.inject.Inject; 
import javax.inject.Named; 
import java.util.List; 

@Model 
@ManagedBean("pub") 
public class PublishABookController { 

    @Inject 
    PublishABook publishABook; 

    @Inject 
    FacesContext facesContext; 

    @Produces 
    @Named 
    List<Book> allBooks; 

    @PostConstruct 
    public void initBooks(){ 
     allBooks = publishABook.getAllBooks(); 
    } 
} 

服务

import javax.ejb.Stateless; 
import javax.inject.Inject; 
import java.util.List; 
import java.util.logging.Logger; 

@Stateless 
public class PublishABookImpl implements PublishABook { 

    @Inject 
    private PublisherDAO publisherDAO; 

    @Inject 
    private BookDAO bookDAO; 

    @Inject 
    private Logger logger; 

    @Override 
    public void publishABook(Publisher publisher, Book book) { 
      bookDAO.save(book); 
      publisher.getPublishedBooks().add(book); 
      publisherDAO.update(publisher); 
      logger.info("Book created"); 
    } 

    @Override 
    public List<Book> getAllBooks() { 
     return bookDAO.list(); 
    } 
} 
+0

你调试了什么?当你通过制作人制作'allBooks'时,你为什么使用'#{pub.allBooks}'?你是否在jsf开发模式下运行你的应用程序时出现任何错误?如果它与另一个组件失败,为什么你将它标记为'datatable'?原因很可能有些其他。试过一个简单的'ui:repeat'? – Kukeltje

回答

0

你只需从页面中移除<ui:define name="content"></define>元素。

ui:define通常用于JSF页面模板,但在您的上下文中,它只是防止页面的呈现内容。