2014-12-26 25 views
0

我在JSF和PrimeFaces是新的,我不明白爲什麼我的選擇正值設置器不設置:號碼:dataTable的選擇正值設置器不工作

我有主XHTML中點擊<p:commandButton>後,我想更改選定的行。但更改選擇後,數據設置器setSelectedBook()上的行獲得null入口值。

我已經爲<p:dataTable>設置了selectionrowKey

它看起來像:

主要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; 
    } 
} 

類書:

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 '的一種專業化。你爲什麼不使用'LazyDataModel '擴展你的託管bean類('BookHolder'),並利用它的一個重載版本'public List load(...)'? – Tiny

+0

因爲我只是想了解jsf在.net上編程後如何工作,並且不知道LazyDataModel。感謝您的建議,我會閱讀關於此的信息並嘗試! – Alice

回答

0

由於您使用ui:define,我假設有你的模板文件(pagesTemplate.xhtml)一ui:include。 如果是這樣,那很好,但是你的包含頁面有一些不必要的東西,例如HTML和body標籤(順便說一下:使用h:body)。沒有必要。

請參閱second part of this posting瞭解如何將xhtml文件包含到另一個文件中。

你會注意到ui:define的內容是一種「cut &」粘貼到你的模板文件中。 那麼,你的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標記

和中刪除並粘貼圍繞數據表和setter開始工作。 – Alice

+0

構圖之外的普通身體(不是h:身體)是很好的......甚至一個頭部和html是好的,heck,一切**外面**組成都很好(根據jsf規範)例如請參閱http://www.mkyong.com/jsf2/jsf-2-templating-with-facelets-example/在構圖之外使用html/head/body的一個原因是IDE有時更好地識別用於設計事物的文件 – Kukeltje