2016-12-28 9 views
1

Я пытаюсь использовать CDI и JSF, чтобы получить список всех книг в базе данных, отформатированных как dataTable и напечатанных на веб-странице, но вместо этого я получаю пустую страницу. Я также попытался использовать JSF selectOneMenu вместо dataTable, но результат тот же.h: dataTable не показывает никаких записей

Здесь `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

что вы отлаживали? Почему вы используете '# {pub.allBooks}', пока вы делаете «allBooks» доступным через производителя? Получаете ли вы какие-либо ошибки при запуске приложения в режиме разработки jsf? И если он терпит неудачу с другим компонентом, почему вы отметили его «datatable»? Причина, скорее всего, еще одна. Пробовал простой 'ui: repeat'? – Kukeltje

ответ

0

Вам просто нужно удалить <ui:define name="content"></define> элемент со страницы.

ui:define обычно используется для шаблонов страниц JSF, но в вашем контексте он просто запрещает отображение содержимого страницы.