records in database table not display in dataTable
cchee May 8, 2007 12:15 PMHi,
First of all, I apologize if this question has already been asked before. I have been struggling to get the simply search list to work with my current project using Seam with Ajax4JSF. I pretty much follow the example in HotelBooking to implement my search function. I have dumped a lot of output at different breakpoint in the code and traced all the way to the .xhtml page. It seems, the dataTable is not displaying the actual rows even though I was able to get the number of records from the database. The column headers rendered probably, but just no data being displayed below. I am not sure what i did wrong and greatly appreciated any enlightenment.
My Search code are the followings:-
package action;
import static javax.persistence.PersistenceContextType.EXTENDED;
import static org.jboss.seam.ScopeType.EVENT;
import static org.jboss.seam.ScopeType.SESSION;
import java.util.List;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.log.Log;
import org.jboss.seam.core.Events;
import org.jboss.seam.core.FacesMessages;
import model.Asset;
import model.AssetType;
import model.User;
@Stateful
@Name("assetManager")
@Scope(SESSION)
@Restrict
public class AssetManagerAction implements AssetManager {
@PersistenceContext(type=EXTENDED)
private EntityManager em;
@In(required=false, scope = SESSION)
private User user;
private String searchString;
private int page;
@DataModel
private List<Asset> assets;
//@DataModelSelection
@In(required=false) @Out(required=false)
private Asset selectedAsset;
@In(required=false)
@Out(required=false)
private List<AssetType> assetTypes;
@In
private Events events;
@Logger
private Log log;
@In FacesMessages facesMessages;
@Begin
public void selectAsset(Asset selectedAsset)
{
log.info("AssetManager.selectAsset() action called");
this.selectedAsset = em.merge(selectedAsset);
}
public void find()
{
page = 0;
queryAssets();
}
public void nextPage()
{
page++;
queryAssets();
}
@SuppressWarnings("unchecked")
private void queryAssets()
{
log.info("AssetManagerAction.queryAssets() called");
assets = em.createQuery("select a from Asset a where lower(a.name) like #{pattern} or lower(a.identifier) like #{pattern}")
.setMaxResults(getPageSize())
.setFirstResult( page * getPageSize())
.getResultList();
log.info("AssetManagerAction.assets.size() = " + assets.size() + ", pattern = #{pattern}");
}
public boolean isNextPageAvailable()
{
return assets != null && assets.size() == getPageSize();
}
public int getPageSize()
{
return user.getRowsPerPage();
}
public void setPageSize(int pageSize)
{
if (pageSize < 5) {
pageSize = 5;
}
user.setRowsPerPage(pageSize);
}
@Factory(value="pattern", scope=EVENT)
public String getSearchPattern()
{
return searchString==null ?
"%" : '%' + searchString.toLowerCase().replace('*', '%') + '%';
}
public String getSearchString()
{
return searchString;
}
public void setSearchString(String searchString)
{
this.searchString = searchString;
}
@End
public void cancel() {}
@Destroy @Remove
public void destroy() {}
}and my xhtml file is the following:-
<!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:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.ajax4jsf.org/rich"
xmlns:a="https://ajax4jsf.dev.java.net/ajax"
template="layout/template.xhtml">
<ui:define name="body">
<div class="section">
<h:form id="assetSearchForm">
<h:messages globalOnly="true" styleClass="message"/>
<rich:panel>
<f:facet name="header">Search Asset</f:facet>
<h:inputText id="searchString" value="#{assetManager.searchString}" style="width: 165px">
<a:support event="onkeyup" actionListener="#{assetManager.find}" reRender="searchResults"/>
</h:inputText>
<h:commandButton id="findAssets" value="Find Assets"
action="#{assetManager.find}" reRender="searchResults"/>
<br/>
<h:outputLabel for="pageSize">Rows per page:</h:outputLabel>
<h:inputText id="pageSize" value="#{assetManager.pageSize}" style="width: 50px"/>
</rich:panel>
</h:form>
</div>
<a:outputPanel id="searchResults">
<div class="section">
<h:outputText value="No Assets Found"
rendered="#{assets != null and assets.rowCount == 0}"/>
<h:outputText value="Total number of records: #{assets.rowCount}"/>
<h:dataTable id="assets" values="#{assets}" var="_asset" rendered="#{assets.rowCount gt 0}">
<h:column>
<f:facet name="header">Name</f:facet>
<h:outputText value="#{_asset.name}"/>
</h:column>
<h:column>
<f:facet name="header">Identifier</f:facet>
<h:outputText value="#{_asset.identifier}"/>
</h:column>
<h:column>
<f:facet name="header">Asset Type</f:facet>
<h:outputText value="#{_asset.assetType.name}"/>
</h:column>
<h:column>
<f:facet name="header">Started Date</f:facet>
<h:outputText value="#{_asset.startedAt}"/>
</h:column>
<h:column>
<f:facet name="header">Matured Date</f:facet>
<h:outputText value="#{_asset.maturedAt}"/>
</h:column>
<h:column>
<f:facet name="header">Action</f:facet>
<s:link id="viewAsset" value="View Asset" action="#{assetManager.selectAsset(_asset)}"/>
</h:column>
</h:dataTable>
<s:link value="Next Page" action="#{assetManager.nextPage}" rendered="#{assetManager.nextPageAvailable}"/>
</div>
</a:outputPanel>
</ui:define>
</ui:composition>