2014-12-26 3 views
0

Я новичок в JSF и PrimeFaces, и я не могу понять, почему мой сеттер для выбранного значения не установлен:р: DataTable выбранного значения сеттер не работает

Я получил главный XHTML, в котором после нажатия на <p:commandButton> Я хочу изменить выбранную строку. Но после изменения выбора строки в наборе данных setSelectedBook() получите null значение на входе.

Я уже установил selection и rowKey для <p:dataTable>.

Это выглядит следующим образом:

главный XTML:

<?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:ui="http://xmlns.jcp.org/jsf/facelets" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     > 

    <body> 
     <ui:composition template="./../../WEB-INF/pagesTemplate.xhtml"> 
      <form> 
       <ui:define name="content"> 

        <p:dataTable id="eventsDT" var="book" value="#{bookHolder.books}" 
           selectionMode= "single" selection="#{bookController.selectedBook}" 
           rowKey="#{book.id}"> 

         <p:ajax event="rowSelect"/> 
         <p:ajax event="rowDblselect" listener="#{bookController.onDoubleRowSelect}" /> 

         <p:column headerText="ID"> 
          <h:outputText value="#{book.id}" /> 
         </p:column> 

         <p:column headerText="Title"> 
          <h:outputText value="#{book.longName}" /> 
         </p:column> 

        </p:dataTable> 
       </ui:define> 

       <ui:define name="right"> 
        <h:panelGrid columns="1" cellpadding="5"> 
         <p:commandButton id="btnEdit" value="Edit" 
             action="#{navigationController.moveToBookEditPageSimple}" 
             style="width: 100px;height: 28px; margin-left: 10%"/> 
        </h:panelGrid> 
       </ui:define> 

      </form> 
     </ui:composition> 
    </body> 
</html> 

BookController, что не может получить значение:

@Named("bookController") 
@SessionScoped 
@Local(BookView.class) 
public class BookController implements Serializable { 

    public BookController() { 
     navigator = new NavigationController(); 
    } 

    NavigationController navigator; 

    @Inject 
    BookHolder bookHolder; 

    private Book selectedBook; 

    public Book getSelectedBook() { 
     return selectedBook; 
    } 

    public void setSelectedBook(Book selectedBookValue) { 
     this.selectedBook = selectedBookValue; 
    } 

    public void onDoubleRowSelect(SelectEvent event) throws IOException { 
     String str = navigator.showPage("BookEdit"); 
     FacesContext.getCurrentInstance().getExternalContext().redirect(str + ".xhtml"); 
    }  
} 

BookHolderBean, который содержит данные:

@Named("bookHolder") 
@ApplicationScoped 
public class BookHolder { 

    public BookHolder() { 
    } 

    @PostConstruct 
    void setValues() { 
     this.books = new ArrayList<>(); 

     for (int i = 0; i < 10; i++) { 
      this.books.add(new Book(new ParkType(i, i, 
        "Book #: " + i + " (long name)", 
        "Book #: " + i + " (short name)", 
        "Book #: " + i + " (note)"))); 

     } 
    } 

    private List<Book> books; 

    public List<Book> getBooks() { 
     return books; 
    } 

    public void setBooks(List<Book> parkTypes) { 
     this.books = parkTypes; 
    } 
} 

Class Книга:

public class Book extends MainEntitie<Book> implements Serializable, SelectableDataModel<Book> { 
    @Inject 
    BookHolder bookHolder; 

    private final String longName; 
    private final String shortName; 

    public Book(BookBase sd) { 
     super(sd.getId(), false, false, sd.getNote()); 
     this.longName = sd.getLongName(); 
     this.shortName = sd.getShortName(); 
    } 

    public String getLongName() { 
     return longName; 
    } 

    public String getShortName() { 
     return shortName; 
    } 

    @Override 
    public int getId() { 
     return super.getId(); 
    } 

    @Override 
    public Object getRowKey(Book t) { 
     return t.getId(); 
    } 

    @Override 
    public Book getRowData(String string) { 
     for (Book app : bookHolder.getBooks()) { 
      if (app.getId() == Integer.parseInt(string)) { 
       return app; 
      } 
     } 
     return null; 
    } 
} 
+0

Довольно запутанные вещи. Почему бы вам просто не использовать 'LazyDataModel '? Это своего рода специализация 'SelectableDataModel '. Почему бы вам просто не расширить свой управляемый класс bean ('BookHolder') с помощью' LazyDataModel ' и использовать его одну из перегруженных версий 'public List load (...)'? – Tiny

+0

Потому что я только пытаюсь понять, как работает jsf после программирования на .net и не знал о LazyDataModel. Спасибо за советы, я прочитаю информацию об этом и попробую! – Alice

ответ

0

Поскольку вы используете ui:define, я предполагаю, что есть в файле шаблона (pagesTemplate.xhtml) ui:include. Если это так, это замечательно, но ваша страница с включенными страницами имеет некоторые ненужные вещи, например. html и тег тела (кстати: используйте h:body). Нет необходимости в этом.

См. second part of this posting, чтобы узнать, как включить файл xhtml в другой.

Вы заметите, что содержание ui:define является своего рода «вырезанным &», вставленным в ваш файл шаблона. Итак, как насчет вашего тега form? Это игнорируется (по крайней мере, я думаю, это не будет родителем вашего типа данных). Сделать h:form (опять же, использовать JSF, h:form вместо HTML form) ребенка ui:define, как:

<ui:composition template="/WEB-INF/template.xhtml" 
xmlns=.....> 
    <ui:define name="content"> 
     <h:form> 
     <p:dataTable ...> 
      ... 
     </p:dataTable> 
     </h:form> 
    </ui:define> 
</ui:composition> 
+0

Большое спасибо - он работает! Я удалил из основных xhtml-тегов

и и вставлял вокруг datatable и setter начал работать. – Alice

+0

Обычное тело (не h: тело) вне композиции в порядке ... даже голова и html в порядке, черт возьми, все ** вне ** композиция в порядке (согласно спецификации jsf), например. см. http://www.mkyong.com/jsf2/jsf-2-templating-with-facelets-example/. Одна из причин использования html/head/body вне композиции заключается в том, что IDE иногда лучше распознают файлы для проектирования вещей – Kukeltje

Смежные вопросы