我正在使用没有Primefaces的Jsf 2,并想了解如何解决以下问题:
My DataTable正在正确加载数据,但是它根本不允许我选择已经加载到其中的行,看起来好像它阻止了我这个动作。而且它也不能识别我添加的分页(当我的页面加载时,不显示上一个,下一个等…)下面是我的完整Xhtml:
<ui:composition template="/templates/default.xhtml">
<ui:define name="title">
<h:outputText value="VPRS-ControleFaixas - Consulta" />
</ui:define>
<ui:define name="content">
<table id="tabela_interna" width="100%" cellpadding="0"
cellspacing="1">
<tr>
<td width="100%" height="100%" colspan="3">
<h:graphicImage library="imagens" width="70%" name="tit_controle_faixa.gif"/>
</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td width ="100%" height="100%">
<h:outputText value="Produto" />
<h:selectOneMenu style="width : 388px; height : 16px;">
<f:selectItems value="#{consultarFaixaProdutoBean.listaProduto}" var="produto"
itemValue="#{produto.codProduto}" itemLabel="#{produto.nomeProduto}"></f:selectItems>
</h:selectOneMenu>
</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td width ="100%" height="100%" colspan="3">
<h:dataTable value="#{consultarFaixaProdutoBean.listaFaixa}" var="faixaProduto"
paginator="true" rows="15" paginatorTemplate="{CurrentPageReport} >{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
selectionMode="single" selection="# {consultarFaixaProdutoBean.faixaProdutoVO}" rowKey="#{faixaProduto.codProduto}">
<h:column>
<f:facet name="header">Produto</f:facet>
#{faixaProduto.codProduto}-#{faixaProduto.nomeProduto}
</h:column>
<h:column>
<f:facet name="header">Qtd. Propostas</f:facet>
#{faixaProduto.qtdFaixaPpsta}
</h:column>
<h:column>
<f:facet name="header">Validade (dias)</f:facet>
#{faixaProduto.numDiasValPpsta}
</h:column>
<h:column>
<f:facet name="header">Desativação (dias)</f:facet>
#{faixaProduto.numDiasDesatPpsta}
</h:column>
<h:column>
<f:facet name="header">Ultima Atual.</f:facet>
#{faixaProduto.dtUltAtualizacao}
</h:column>
<h:column>
<f:facet name="header">Responsável</f:facet>
#{faixaProduto.cdRespUltimaAtualizacao}
</h:column>
</h:dataTable>
</td>
</tr>
</table>
<table id="tabela_botoes" cellspacing="0" cellpadding="0" >border="0" width="30%">
<tr align="center">
<td>
<h:commandButton value="Consultar" action="# {consultarFaixaProdutoBean.consultar}" styleClass="margem_botoes button" />
</td>
<td>
<h:commandButton value="Nova Consulta" action="# {consultarFaixaProdutoBean.novaConsulta}" styleClass="margem_botoes button" />
</td>
</tr>
</table>
</ui:define>
</ui:composition>
</html>
对于我正在做的项目,我不能以任何方式使用PrimeFaces或Richfaces。那些了解我的人回答我是如何在没有他们的情况下做这些事情的。
您是否将JSF组件、操作和事件包装在h:form标签中?请在您的页面中添加h:form标签,我猜它应该为您工作。
我的解决方案分为两部分:
1 -没有通过鼠标点击选择行:
嗯,我发现了一种通过JavaScript进行选择的方法,下面的链接展示了如何完成这个任务,并且已经是示例:
https://datatables.net/examples/api/select_single_row.html2 -如何创建分页:
由于下面的链接,我设法找到了我的问题的解决方案:http://www.roytuts.com/effective-pagination-example-in-jsf-2/
他们想检查一下吗?然后在hehe下面显示:
1创建一个名为Paginacao的类,以控制所有任务事件,观察Paginacao.java类:
package br.com.bradseg.vprs.controlefaixas.crud.model.util;
import java.util.ArrayList;
import java.util.List;
import javax.faces.component.UICommand;
import javax.faces.event.ActionEvent;
public class Paginacao {
private int totalLinha;
private int primeiraLinha;
private int totalPaginas;
private Integer[] paginas;
private int paginaAtual;
private List listaTotal;
private List listaAux;
public static final int LINHAS_POR_PAGINA = 15;
public static final int INTERVALO_PAGINAS = 10;
public Paginacao(List listaTotal) {
this.listaTotal = listaTotal;
carregaPaginacao();
}
// Ações da Paginação -----------------------------------------------------------------------------
public void carregaPaginacao() {
totalLinha = listaTotal.size();
// Set paginaAtual, totalPaginas e paginas.
paginaAtual = (totalLinha / LINHAS_POR_PAGINA) - ((totalLinha - primeiraLinha) / LINHAS_POR_PAGINA) + 1;
totalPaginas = (totalLinha / LINHAS_POR_PAGINA) + ((totalLinha % LINHAS_POR_PAGINA != 0) ? 1 : 0);
int tamanhoPaginas = Math.min(INTERVALO_PAGINAS, totalPaginas);
paginas = new Integer[tamanhoPaginas];
int primeiraPagina = Math.min(Math.max(0, paginaAtual - (INTERVALO_PAGINAS / 2)), totalPaginas - tamanhoPaginas);
// Cria as paginas.
for (int i = 0; i < tamanhoPaginas; i++) {
paginas[i] = ++ primeiraPagina;
}
carregaDataTable();
}
public void carregaDataTable(){
listaAux = new ArrayList<FaixaProdutoVO>();
int organizador = (paginaAtual * LINHAS_POR_PAGINA) - LINHAS_POR_PAGINA;
int limite = (paginaAtual * LINHAS_POR_PAGINA);
for(int i = organizador; i<limite; i++){
if(totalLinha > i){
Object o = new Object();
o = listaTotal.get(i);
listaAux.add(o);
} else{
break;
}
}
}
public void primeiraPagina() {
pagina(0);
}
public void proximaPagina() {
pagina(primeiraLinha + LINHAS_POR_PAGINA);
}
public void paginaAnterior() {
pagina(primeiraLinha - LINHAS_POR_PAGINA);
}
public void ultimaPagina() {
pagina(totalLinha - ((totalLinha % LINHAS_POR_PAGINA != 0) ? totalLinha % LINHAS_POR_PAGINA : LINHAS_POR_PAGINA));
}
public void pagina(ActionEvent event) {
pagina(((Integer) ((UICommand) event.getComponent()).getValue() - 1) * LINHAS_POR_PAGINA);
}
private void pagina(int primeiraLinha) {
this.primeiraLinha = primeiraLinha;
carregaPaginacao();
}
/**
* @return the totalLinha
*/
public int getTotalLinha() {
return totalLinha;
}
/**
* @param totalLinha the totalLinha to set
*/
public void setTotalLinha(int totalLinha) {
this.totalLinha = totalLinha;
}
/**
* @return the primeiraLinha
*/
public int getPrimeiraLinha() {
return primeiraLinha;
}
/**
* @param primeiraLinha the primeiraLinha to set
*/
public void setPrimeiraLinha(int primeiraLinha) {
this.primeiraLinha = primeiraLinha;
}
/**
* @return the totalPaginas
*/
public int getTotalPaginas() {
return totalPaginas;
}
/**
* @param totalPaginas the totalPaginas to set
*/
public void setTotalPaginas(int totalPaginas) {
this.totalPaginas = totalPaginas;
}
/**
* @return the paginas
*/
public Integer[] getPaginas() {
return paginas;
}
/**
* @param paginas the paginas to set
*/
public void setPaginas(Integer[] paginas) {
this.paginas = paginas;
}
/**
* @return the paginaAtual
*/
public int getPaginaAtual() {
return paginaAtual;
}
/**
* @param paginaAtual the paginaAtual to set
*/
public void setPaginaAtual(int paginaAtual) {
this.paginaAtual = paginaAtual;
}
/**
* @return the listaAux
*/
public List getListaAux() {
return listaAux;
}
/**
* @param listaAux the listaAux to set
*/
public void setListaAux(List listaAux) {
this.listaAux = listaAux;
}
}
2在我的ManagedBean中,创建了一个对象分页类,如下(consultarfaixaproductobean .java):
@Controller
@ManagedBean
@SessionScoped
public class ConsultarFaixaProdutoBean extends BaseController implements Serializable {
private Paginacao paginacao;
private FaixaProdutoVO faixaProdutoVO;
private List<FaixaProdutoVO> listaTotal;
private List<FaixaProdutoVO> listaFaixa;
@PostConstruct
public void init(){
faixaProdutoVO = new FaixaProdutoVO();
listaTotal = faixaProdutoFacade.obterListaFaixaProduto(faixaProdutoVO);
if (listaTotal != null && !listaTotal.isEmpty()){
aplicarPaginacao();
}
}
public void aplicarPaginacao(){
if(listaFaixa == null){
paginacao = new Paginacao(listaTotal);
}else{
paginacao.carregaPaginacao();
}
setListaFaixa((List<FaixaProdutoVO>)paginacao.getListaAux());
}
//Setters e Getters
}
3 -最后,遵循我的Xhtml页面,因为它调用它的属性:
<?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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:form id="content">
<ui:composition template="/templates/default.xhtml">
<ui:define name="content">
<h:outputScript library="js" name="util.js" />
<table id="tabela_interna" width="100%" cellpadding="0"
cellspacing="1">
<tr>
<td width ="100%" height="100%" colspan="3">
<h:form>
<h:dataTable id="tableFaixa" value="#{consultarFaixaProdutoBean.listaFaixa}" var="faixaProduto"
selectionMode="single" selection="#{consultarFaixaProdutoBean.faixaProdutoVO}" rowKey="#{faixaProduto.codProduto}" width ="100%" height="100%">
<h:column>
<input type="radio" class="optionbutton" name="rdbOption" onclick="javascript:salvaProdutoCookie();"
value="#{faixaProduto.codProduto}" />
</h:column>
<h:column>
<f:facet name="header">Produto</f:facet>
#{faixaProduto.codProduto}-#{faixaProduto.nomeProduto}
</h:column>
<h:column>
<f:facet name="header">Qtd. Propostas</f:facet>
#{faixaProduto.qtdFaixaPpsta}
</h:column>
<h:column>
<f:facet name="header">Validade (dias)</f:facet>
#{faixaProduto.numDiasValPpsta}
</h:column>
<h:column>
<f:facet name="header">Desativação (dias)</f:facet>
#{faixaProduto.numDiasDesatPpsta}
</h:column>
<h:column>
<f:facet name="header">Ultima Atual.</f:facet>
#{faixaProduto.dtUltAtualizacao}
</h:column>
<h:column>
<f:facet name="header">Responsável</f:facet>
#{faixaProduto.cdRespUltimaAtualizacao}
</h:column>
</h:dataTable>
</h:form>
<br />
</td>
</tr>
</table>
<table>
<tr>
<td>
<h:form>
<!--Botoes de Paginacao-->
<h:commandLink value="Primeiro" action="#{consultarFaixaProdutoBean.paginacao.primeiraPagina}"
disabled="#{consultarFaixaProdutoBean.paginacao.primeiraLinha == 0}" /> <span></span>
<h:commandLink value="Anterior" action="#{consultarFaixaProdutoBean.paginacao.paginaAnterior}"
disabled="#{consultarFaixaProdutoBean.paginacao.primeiraLinha == 0}" /> <span></span>
<ui:repeat value="#{consultarFaixaProdutoBean.paginacao.paginas}" var="pagina">
<h:commandLink value="#{pagina}" actionListener="#{consultarFaixaProdutoBean.paginacao.pagina}"
rendered="#{pagina != consultarFaixaProdutoBean.paginacao.paginaAtual}" />
<h:outputText value="<b>#{pagina}</b>" escape="false"
rendered="#{pagina == consultarFaixaProdutoBean.paginacao.paginaAtual}" />
</ui:repeat> <span></span>
<h:commandLink value="Próximo" action="#{consultarFaixaProdutoBean.paginacao.proximaPagina}"
disabled="#{consultarFaixaProdutoBean.paginacao.primeiraLinha + 15 >= consultarFaixaProdutoBean.paginacao.totalLinha}" /> <span></span>
<h:commandLink value="Último" action="#{consultarFaixaProdutoBean.paginacao.ultimaPagina}"
disabled="#{consultarFaixaProdutoBean.paginacao.primeiraLinha + 15 >= consultarFaixaProdutoBean.paginacao.totalLinha}" /> <span></span>
<h:outputText value="Pagina #{consultarFaixaProdutoBean.paginacao.paginaAtual} / #{consultarFaixaProdutoBean.paginacao.totalPaginas}" />
<br />
</h:form>
</td>
</tr>
</table>
</ui:define>
</ui:composition>
</h:form>
</html>