What is the scope of the bean?
Sent from my iPhone
On May 31, 2009, at 2:17 AM, Dvora <[email protected]> wrote:
Here it is. Most of it is identical to the sample published in the
link I've
attached before, searches are done against Compass (great project!)
than
against db.
package tests;
import java.io.Serializable;
import java.util.ArrayList;
import javax.faces.component.UICommand;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.compass.core.CompassDetachedHits;
import org.compass.core.CompassHit;
import org.compass.core.CompassHits;
import tests.store.DataAccessObject;
import tests.store.data.PageMemoryRecord;
public class QueryBean implements Serializable
{
private int totalRows;
// Paging.
private int firstRow;
private int rowsPerPage;
private int totalPages;
private int pageRange;
private Integer[] pages;
private int currentPage;
// Sorting.
private String sortField;
private boolean sortAscending;
public int getTotalRows()
{
return totalRows;
}
public void setTotalRows( int totalRows )
{
this.totalRows = totalRows;
}
public int getFirstRow()
{
return firstRow;
}
public void setFirstRow( int firstRow )
{
this.firstRow = firstRow;
}
public int getRowsPerPage()
{
return rowsPerPage;
}
public void setRowsPerPage( int rowsPerPage )
{
this.rowsPerPage = rowsPerPage;
}
public int getTotalPages()
{
return totalPages;
}
public void setTotalPages( int totalPages )
{
this.totalPages = totalPages;
}
public int getPageRange()
{
return pageRange;
}
public void setPageRange( int pageRange )
{
this.pageRange = pageRange;
}
public Integer[] getPages()
{
return pages;
}
public void setPages( Integer[] pages )
{
this.pages = pages;
}
public int getCurrentPage()
{
return currentPage;
}
public void setCurrentPage( int currentPage )
{
this.currentPage = currentPage;
}
public String getSortField()
{
return sortField;
}
public void setSortField( String sortField )
{
this.sortField = sortField;
}
public boolean isSortAscending()
{
return sortAscending;
}
public void setSortAscending( boolean sortAscending )
{
this.sortAscending = sortAscending;
}
// Paging actions
---
---
---
--------------------------------------------------------------------
public void pageFirst()
{
page( 0 );
}
public void pageNext()
{
page( firstRow + rowsPerPage );
}
public void pagePrevious()
{
page( firstRow - rowsPerPage );
}
public void pageLast()
{
page( totalRows - ((totalRows % rowsPerPage != 0) ? totalRows %
rowsPerPage : rowsPerPage) );
}
public void page( ActionEvent event )
{
page( ((Integer) ((UICommand)
event.getComponent()).getValue() - 1) *
rowsPerPage );
}
private void page( int firstRow )
{
this.firstRow = firstRow;
loadDataList(); // Load requested page.
}
// Sorting actions
---
---
----------------------------------------------------------------------
public void sort( ActionEvent event )
{
String sortFieldAttribute = (String)
event.getComponent().getAttributes().get( "sortField" );
// If the same field is sorted, then reverse order, else sort
the new
field ascending.
if( sortField.equals( sortFieldAttribute ) )
{
sortAscending = !sortAscending;
}
else
{
sortField = sortFieldAttribute;
sortAscending = true;
}
pageFirst(); // Go to first page and load requested page.
}
//-
---
---
---
---
---
---
---
---
---
---
---
---
---------------------------------------------------------------------
/**
*
*/
private static final long serialVersionUID = 1L;
private String email = "";
private String password = "";
private String method = "";
private String query = "";
private ArrayList<MyData> dataList = null;
private CompassDetachedHits hits = null;
public QueryBean()
{
rowsPerPage = 3; // Default rows per page (max amount of rows
to be
displayed at once).
pageRange = 3; // Default page range (max amount of pages
links to be
displayed at once).
sortField = "id"; // Default sort field.
sortAscending = true; // Default sort direction.
}
public String getEmail()
{
return (email);
}
public void setEmail( String email )
{
this.email = email;
}
public String getPassword()
{
return (password);
}
public void setPassword( String password )
{
this.password = password;
}
public String getMethod()
{
return (method);
}
public void setMethod( String method )
{
this.method = method;
}
public String register1()
{
setMethod( "<CODE>commandButton</CODE> with <CODE>value</
CODE>" );
return ("success");
}
public String register2()
{
setMethod( "<CODE>commandButton</CODE> with <CODE>image</
CODE>" );
return ("success");
}
public String register3()
{
setMethod( "<CODE>commandLink</CODE>" );
return ("success");
}
public String register4()
{
PageMemoryRecord record = new PageMemoryRecord();
record.setContent( query );
hits = DataAccessObject.getInstance().searchAsDetach( record );
setTotalRows( hits.length() );
int i=0;
while( compassHitIterator.hasNext() && i<10)
{
PageMemoryRecord result = (PageMemoryRecord)
compassHitIterator.next().getData();
dataList.add( result );
i++;
}*/
pageFirst();
return null;
}
public String register5()
{
dataList = new ArrayList<MyData>();
return null;
}
public ArrayList<MyData> getDataList()
{
PageMemoryRecord record = new PageMemoryRecord();
record.setContent( query );
hits = DataAccessObject.getInstance().searchAsDetach( record );
setTotalRows( hits.length() );
loadDataList();
return dataList;
}
public void setDataList( ArrayList<MyData> dataList )
{
this.dataList = dataList;
}
public String getQuery()
{
return query;
}
public void setQuery( String query )
{
this.query = query;
}
protected void loadDataList()
{
try
{
if( dataList == null )
{
dataList = new ArrayList<MyData>();
}
else
{
dataList.clear();
}
int start = getFirstRow();
//int end = Math.min( getFirstRow() + getRowsPerPage(),
hits.length() );
int end = Math.min( getFirstRow() + getRowsPerPage(),
getTotalRows() );
PageMemoryRecord toSearch = new PageMemoryRecord();
toSearch.setContent( query );
CompassDetachedHits detachedHits =
DataAccessObject.getInstance().searchAsDetach( toSearch, start,
getRowsPerPage() );
for( CompassHit hit : detachedHits )
{
dataList.add( toMyData((PageMemoryRecord)
hit.data() ) );
}
}
catch ( Exception e )
{
throw new RuntimeException( e ); // Handle it yourself.
}
// Set currentPage, totalPages and pages.
currentPage = (totalRows / rowsPerPage) - ((totalRows -
firstRow) /
rowsPerPage) + 1;
totalPages = (totalRows / rowsPerPage) + ((totalRows %
rowsPerPage != 0) ?
1 : 0);
int pagesLength = Math.min( pageRange, totalPages );
pages = new Integer[pagesLength];
// firstPage must be greater than 0 and lesser than
totalPages-pageLength.
int firstPage = Math.min( Math.max( 0, currentPage -
(pageRange / 2) ),
totalPages - pagesLength );
// Create pages (page numbers for page links).
for( int i = 0; i < pagesLength; i++ )
{
pages[i] = ++firstPage;
}
}
private MyData toMyData( PageMemoryRecord data )
{
MyData my = new MyData();
my.setId( 1L );
my.setName( data.getTitle() );
return my;
}
}
Richard Yee-3 wrote:
Can you send the backing bean code?
-R
On Sun, May 31, 2009 at 1:22 AM, Dvora <[email protected]> wrote:
Of course, here is the jsp:
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%...@taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<f:view>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//
EN">
<f:loadBundle basename="messages" var="msg" />
<HTML>
<HEAD>
<LINK REL="STYLESHEET" HREF="./css/styles.css" TYPE="text/
css">
<meta http-equiv="content-type" content="text/
html;charset=UTF-8">
</HEAD>
<BODY>
<CENTER>
<P><h:form>
<P><h:commandButton value="#{msg.bt1}"
action="#{queryBean.register4}" />
<h:commandButton
value="push me empty"
action="#{queryBean.register5}" />
Query: <h:inputText value="#{queryBean.query}" />
<H2>Start data table</H2>
<h:dataTable value="#{queryBean.dataList}" var="item"
border="1">
<h:column>
<f:facet name="header">
<h:commandLink value="ID"
actionListener="#{queryBean.sort}">
<f:attribute
name="sortField" value="id" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.id}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="Name"
actionListener="#{queryBean.sort}">
<f:attribute
name="sortField" value="name" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.name}" />
</h:column>
</h:dataTable>
<%-- The paging buttons --%>
<h:commandButton value="first"
action="#{queryBean.pageFirst}"
disabled="#{queryBean.firstRow == 0}" />
<h:commandButton value="prev"
action="#{queryBean.pagePrevious}"
disabled="#{queryBean.firstRow == 0}" />
<h:commandButton value="next"
action="#{queryBean.pageNext}"
disabled="#{queryBean.firstRow +
queryBean.rowsPerPage >=
queryBean.totalRows}" />
<h:commandButton value="last"
action="#{queryBean.pageLast}"
disabled="#{queryBean.firstRow +
queryBean.rowsPerPage >=
queryBean.totalRows}" />
<h:outputText
value="Page #{queryBean.currentPage} /
#{queryBean.totalPages}" />
<br />
<%-- The paging links --%>
<t:dataList value="#{queryBean.pages}" var="page">
<h:commandLink value="#{page}"
actionListener="#{queryBean.page}"
rendered="#{page !=
queryBean.currentPage}" />
<h:outputText value="#{page}" escape="false"
rendered="#{page ==
queryBean.currentPage}" />
</t:dataList>
<br />
<%-- Set rows per page --%>
<h:outputLabel for="rowsPerPage" value="Rows per
page" />
<h:inputText id="rowsPerPage"
value="#{queryBean.rowsPerPage}"
size="3" maxlength="3" />
<h:commandButton value="Set"
action="#{queryBean.pageFirst}" />
<h:message for="rowsPerPage" errorStyle="color:
red;" />
<%-- Cache bean with data list, paging and sorting
variables for next
request --%>
<t:saveState value="#{queryBean}" />
</h:form>
</CENTER>
</BODY>
</HTML>
</f:view>
If I populate the text field for the query, then hit the
commandButton
which
associated with the register4() method (poor name, I know, just
practicing...), then the query in the backing bean remains empty
(the
default value) ,and the setter is not invoked.
Should I attach the backing bean code as well?
Richard Yee-3 wrote:
Can you send you code? There must be something else going on as a
result of your refactoring because package location of classes does
not matter to JSF.
Richard
Sent from my iPhone
On May 31, 2009, at 12:12 AM, Dvora <[email protected]> wrote:
Hello all,
I'm new to JSF, and i'm studying mainly by looking code examples.
One of the
examples I'm learning now is
http://balusc.blogspot.com/2008/10/effective-datatable-paging-and-sorting.html
.
Everything is working (so far so cool), but, if I refactor the DTO
MyData to
be sit in other package than the backing bean, then
commandButtons not
always working (i.e. no data refreshed on the jsf page and
breakpoints on
the backing bean are never reached).
Is this behaviour expected? Where should I tell JSF about other
packages I'm
using?
Thanks for any help!
--
View this message in context:
http://www.nabble.com/Packaging-issues-tp23800484p23800484.html
Sent from the MyFaces - Users mailing list archive at Nabble.com.
--
View this message in context:
http://www.nabble.com/Packaging-issues-tp23800484p23800926.html
Sent from the MyFaces - Users mailing list archive at Nabble.com.
--
View this message in context:
http://www.nabble.com/Packaging-issues-tp23800484p23801326.html
Sent from the MyFaces - Users mailing list archive at Nabble.com.