0 Replies Latest reply on Aug 2, 2007 9:29 PM by michael wolfe

    @DataModel to dataTable  problem/question

    michael wolfe Newbie

      Hello all:

      i need some help with an error rendering my DataModel
      to the JSF datatable component

      the page takes textinput "card_id" passes it to the Action method
      for a query that joins 2 tables and ouputs the results into
      a List. the problem is that the Page does not resolve my
      @DataModel List books variable in the DataTable.

      any help would be appreciated.

      Michael

      (using seam 2.0 with jboss as 4.2)


      the server error is:

      An Error Occurred:
      /borrower.xhtml: For input string: "isbn"
      +- Stack Trace

      javax.el.ELException: /borrower.xhtml: For input string: "isbn"
      at com.sun.facelets.compiler.TextInstruction.write(TextInstruction.java:50)
      at com.sun.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:39)
      at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:269)
      at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:307)
      at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
      at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
      at javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
      at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
      at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
      at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
      at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:577)
      at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
      at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
      at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
      at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)


      my JSF page is:

      <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <ui:composition xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:s="http://jboss.com/products/seam/taglib"
      template="template.xhtml">

      <!-- content -->
      <ui:define name="content">
      <ui:include src="conversations.xhtml" />

      <h:form>
      <h1>Search Borrower</h1>
      <h:outputText value="(e.g., Enter Borrowers card_id number )"/>

      <h:inputText id="card_id" value="#{borrower.card_id}" style="width: 165px;" />
      <h:commandButton value="Find Borrowers Books" action="#{borrowerList.queryBorrower}" styleClass="button" />
      <h:commandButton value="Clear Results" action="#{borrowerList.clear}" styleClass="button" />


      <h:outputLabel for="pageSize">Maximum results to display:</h:outputLabel>

      <h:selectOneMenu value="#{borrowerList.pageSize}" id="pageSize">
      <f:selectItem itemLabel="1" itemValue="1"/>
      <f:selectItem itemLabel="5" itemValue="5"/>
      <f:selectItem itemLabel="10" itemValue="10"/>
      <f:selectItem itemLabel="20" itemValue="20"/>
      </h:selectOneMenu>



      </h:form>



      <h:form>
      <h:outputText value="No Borrower found with that card_id" rendered="#{books != null and books.rowCount==0}"/>
      <h:dataTable id="checkedoutbooks" var="_b" value="#{books}" rendered="#{books.rowCount>0}">
      <h:column>
      <f:facet name="header">ISBN</f:facet>
      #{_b.isbn}
      </h:column>
      <h:column>
      <f:facet name="header">Title</f:facet>
      #{_b.title}
      </h:column>
      <h:column>
      <f:facet name="header">Author</f:facet>
      #{_b.author}
      </h:column>

      <h:column>
      <f:facet name="header">Checkout Date</f:facet>
      #{_b.checkoutdate}
      </h:column>

      <h:column>
      <f:facet name="header">Due Date</f:facet>
      #{_b.duedate}
      </h:column>

      <h:column>
      <f:facet name="header">PageCnt</f:facet>
      #{_b.page_cnt}
      </h:column>
      <h:column>
      <f:facet name="header">Minutes</f:facet>
      #{_b.minutes}
      </h:column>
      </h:dataTable>
      </h:form>



      <h1>Current Books</h1>


      </ui:define>

      <!-- sidebar -->
      <ui:define name="sidebar">

      <h1>MPW components</h1>
      End of Page - MPW

      </ui:define>

      </ui:composition>



      and my action class is:


      @Stateless
      @Scope(ScopeType.SESSION)
      @Name("borrowerList")
      @Restrict("#{identity.loggedIn}")
      public class BorrowerAction implements BorrowerListInterface, Serializable {

      @PersistenceContext
      private EntityManager em;

      @DataModel
      private List books;

      @Out(required=false)
      private Books book;


      @In(create=true)
      private Borrower borrower;

      @Logger
      private Log log;

      private int pageSize = 10;
      private int page = 0;


      @Factory("books")
      public void queryBorrower() {

      String str = "select book.isbn, book.title, book.author, " +
      "book.page_cnt, book.minutes, book.checkoutdate, book.duedate " +
      "from Books book join book.borrowers b " +
      " where b.card_id = :card_id order by book.title asc ";

      log.info("Querying books table for all borrowers with card_id = " + borrower.getCard_id());
      books = em.createQuery(str)
      .setParameter("card_id", borrower.getCard_id())
      .setMaxResults(pageSize)
      .getResultList();

      ListIterator pairs = books.listIterator();

      while(pairs.hasNext()) {
      Object[] pair = (Object[]) pairs.next();


      log.info( " MPW " + " **isbn** " + pair[0] +
      " **title** " + pair[1] +
      " **author** " + pair[2] +
      " **page_cnt** " + pair[3] +
      " **minutes** " + pair[4]);


      }

      }

      public boolean isNextPageAvailable() {
      return books!=null && books.size()==pageSize;
      }


      public void nextPage() {
      page++;
      queryBorrower();
      }

      public int getPageSize() {
      return pageSize;
      }

      public void setPageSize(int pageSize) {
      this.pageSize = pageSize;
      }

      public String clear() {
      books = null;
      book = null;
      return "main";
      }


      /*
      @Destroy @Remove
      public void destroy() {}
      */

      }