我的问题很简单:我有一个复合组件,它基本上是一个带有rowSelect
事件的延迟加载数据表。当我点击第一页中的任何一行时,该事件会很精彩,但当我更改为另一页时,事件不会像上一页那样设置实体。有没有人经历过这个?
查看:
<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:componente="http://java.sun.com/jsf/composite/componente">
<h:head>
<h:outputStylesheet library="css" name="form.css" />
</h:head>
<body>
<h:form id="form">
<h:panelGrid columns="2" border="1">
<componente:pesquisarPessoas id="teste"
value="#{bean.entidadeSelecionada}"
listener="#{bean.listener}"/>
<f:facet name="footer">
</f:facet>
</h:panelGrid>
</h:form>
</body>
</html>
组件基类:
public abstract class ComponentePesquisaGenerico<T> extends UINamingContainer {
private String ordenacao = Constantes.ORDEM_ASCENDENTE.getValor();
private String camposOrdenacao = null;
private boolean carregarDados = true;
private boolean primeiraPagina = false;
private int pageSize = 5;
private int firstRow = 0;
private LazyDataModel<T> lazyModel= new LazyDataModel<T>() {
private static final long serialVersionUID = 1L;
private List<T> result = null;
@Override
public void setRowIndex(int rowIndex) {
if (rowIndex == -1 || getPageSize() == 0) {
super.setRowIndex(-1);
} else {
super.setRowIndex(rowIndex % getPageSize());
}
}
public T getRowData(String rowKey)
{
for (T objeto : this.result) {
if (objeto.toString().equals(rowKey)) {
return objeto;
}
}
return null;
}
public Object getWrappedData()
{
if ((this.result == null) || (!this.result.isEmpty())) {
carregarDados = Boolean.TRUE;
this.result = load(0, 5, null, null, null);
}
return this.result;
}
public Object getRowKey(T row)
{
@SuppressWarnings("unused")
Object valor = getAttributes().get("value");
valor = row;
return row;
}
@Override
public List<T> load(int first, int pageSize, String sortField,SortOrder sortOrder, Map<String, String> filters) {
result = new ArrayList<T>();
setRowCount(0);
if (sortField != null && !sortField.isEmpty()){
camposOrdenacao = sortField;
if (sortOrder.equals(SortOrder.ASCENDING)){
ordenacao = Constantes.ORDEM_ASCENDENTE.getValor();
} else {
ordenacao = Constantes.ORDEM_DESCENDENTE.getValor();
}
}
if (carregarDados) {
if (!primeiraPagina) {
firstRow = first;
ResultadoConsultaVO<T> resultado = listarRegistrosParaDataTable();
result = resultado.getListaDeRegistros();
setRowCount(resultado.getTotal());
setWrappedData(result);
} else {
primeiraPagina = false;
}
}else{
result = new ArrayList<T>();
}
RequestContext.getCurrentInstance().update("pesquisa_listaEstabelecimento");
return result;
}
};
protected abstract ResultadoConsultaVO<T> listarRegistrosParaDataTable();
/* gets e sets*/
}
组件:
@FacesComponent("pesquisarPessoasComponente")
public class PesquisarPessoasComponente extends ComponentePesquisaGenerico<Entidade>{
private UIInput uiCodigo;
private UIInput uiNomeentidade;
private DataTable dataTable;
private Entidade objetoSelecionado;
private EntidadeService entidadeService = new EntidadeService();
@Override
protected ResultadoConsultaVO<Entidade> listarRegistrosParaDataTable() {
String codigoCnes =(String) getUiCodigo().getValue();
String nomeFantasia =(String) getUiNomeentidade().getValue();
return entidadeService.pesquisarEntidade(codigoCnes, nomeFantasia, getFirstRow(),getPageSize());
}
public void pesquisar(ActionEvent event){
setCarregarDados(Boolean.TRUE);
}
public void limpar(CloseEvent event){
setCarregarDados(Boolean.FALSE);
}
public void onRowSelect(SelectEvent event) {
System.out.println(((Entidade)event.getObject()).getCodigo());
System.out.println( getObjetoSelecionado().getCodigo());
}
/* gets e sets*/
}
管理bean:
@ManagedBean(name="bean")
@SessionScoped
public class Bean {
private Entidade entidadeSelecionada;
public void listener(){
//faco alguma coisa com a entidade selecionada;
System.out.println("Nome Escolhido");
System.out.println(entidadeSelecionada.getNome());
}
/*gets e sets*/
}
public class EntidadeService {
public ResultadoConsultaVO<Entidade> pesquisarEntidade(String codigo, String nome,Integer inicio,Integer tamanhoPagina){
if(StringUtils.isBlank(codigo) && StringUtils.isBlank(nome))
return new ResultadoConsultaVO<Entidade>(criarEntidades().size(),criarEntidades().subList(inicio, (tamanhoPagina+inicio)));
return null;
}
private List<Entidade> criarEntidades(){
List<Entidade> entidades = new ArrayList<Entidade>();
entidades.add(new Entidade("1","Arlette Hayden"));
entidades.add(new Entidade("2","Scot Goodpasture"));
entidades.add(new Entidade("3","Shin Hymel"));
entidades.add(new Entidade("4","Phoebe Mau"));
entidades.add(new Entidade("5","Dominica Hauff"));
entidades.add(new Entidade("6","Flor Anker"));
entidades.add(new Entidade("7","Charlott Morin"));
entidades.add(new Entidade("8","Tamar Leer"));
entidades.add(new Entidade("9","Shauna Giraldo"));
entidades.add(new Entidade("10","Orlando Brennen"));
entidades.add(new Entidade("11","Nancie Norman"));
entidades.add(new Entidade("12","Kourtney Luttrell"));
entidades.add(new Entidade("13","Mila Shankles"));
entidades.add(new Entidade("14","Lucien Ollison"));
entidades.add(new Entidade("15","Felisha Burruel"));
entidades.add(new Entidade("16","Precious Monteiro"));
entidades.add(new Entidade("17","Clotilde Fishel"));
entidades.add(new Entidade("18","Tamiko Hardegree"));
entidades.add(new Entidade("19","Risa Marquette"));
entidades.add(new Entidade("20","Pa Currington"));
entidades.add(new Entidade("21","Graig Guardiola"));
entidades.add(new Entidade("22","Micha Knop"));
entidades.add(new Entidade("23","Adela Palmeri"));
entidades.add(new Entidade("24","Keeley Loisel"));
entidades.add(new Entidade("25","Christal Flynn"));
entidades.add(new Entidade("26","Dee List"));
entidades.add(new Entidade("27","Victor Hurst"));
entidades.add(new Entidade("28","Soo Chadwell"));
entidades.add(new Entidade("29","Reva Jimerson"));
entidades.add(new Entidade("30","Jerrica Stolz"));
return entidades;
}
VO:
public class ResultadoConsultaVO<T> {
private int total;
private List<T> listaDeRegistros;
public ResultadoConsultaVO() {
}
public ResultadoConsultaVO(int total, List<T> listaDeRegistros) {
super();
this.total = total;
this.listaDeRegistros = listaDeRegistros;
}
}
实体:
public class Entidade implements Serializable {
private static final long serialVersionUID = 1L;
private String codigo;
private String nome;
public Entidade() {
super();
}
public Entidade(String codigo, String nome) {
super();
this.codigo = codigo;
this.nome = nome;
}
}
- Enum
public enum Constantes {
ORDEM_ASCENDENTE("ASC"),
ORDEM_DESCENDENTE("DESC");
private String valor;
private Constantes(){}
private Constantes(String valor){
this.valor = valor;
}
public String getValor() {
return valor;
}
}