Solucionado (ver solução)
Solucionado
(ver solução)
12
respostas

Pegar ID atravez de DataTable

Pessoal, meu sistema possui Pessoas e Times, criei uma DataTable que exibi todos os times daquela pessoa que esta logada no sistema:

<p:dataTable styleClass="table" var="time"
                                            value="#{timeMB.listarMeusTimes()}">
                                            <p:column headerText="Id">
                                                <h:outputText value="#{time.id}" />
                                            </p:column>

                                            <p:column headerText="Nome">
                                                <h:outputText value="#{time.nome}" />
                                            </p:column>

                                            <p:column headerText="Nome">
                                                <td><span class="label label-danger label-icon-left"><i
                                                        class="glyphicon glyphicon-star"></i> Capitão</span></td>
                                            </p:column>

                                            <p:column headerText="Nome">
                                            <p:commandButton class="btn btn-inverse btn-circle btn-sm" data-toggle="tooltip" title="Editar" action="#{timeMB.exibirTime(time)}" value=""> </p:commandButton>
                                            </p:column>

                                        </p:dataTable>

Desejo atingir o seguinte objetivo: Ao clicar em algum desses times, redirecione para uma pagina que vai exibir com detalhes todas as informações desse time. Porem estou com a seguinte duvido, como vou pegar o time através dessa DataTable ?

Estou a disposição para informar outras classes do sistema.

12 respostas

Olá Rafael, tudo bem?

Para captar o id de um objeto que já está relacionado em uma dataTable é muito simples, somente você passar para uma função o:

selectedBean.functionName(time.id)

Quando desenvolvo meus projetos gosto de fazer esse tipo de visão do objeto em uma página qualquer criando um template é recebendo o id como params da página pela URL acho menos complicado e mais util.

Para captar o id em uma outra página é necessário colocar no HTML

<f:metadata>
            <f:viewParam name="id" value="#{selectedBean.timeId}" />
            <f:viewAction action="#{selectedBean.carregaPorId()}" if="#{param.id != null}" />
</f:metadata>

utilizando isso você só tem que criar uma variável no bean é uma função que carrega por id é setta o objeto que você está utilizando. :)

Neste caso como você irá utilizar uma URL é só você colocar um link assim:

<p:column headerText="Id">
    <a href="timeView.html?id=#{time.id}"><h:outputText value="#{time.id}" /></a>
</p:column>

E quando criar a view receber isso é já arrumar isso lá dentro.

Espero ter ajudado. :3

Utilizei a ultima opção enviada por voce, ficou dessa forma:

times.xhtml:

<p:dataTable styleClass="table" var="time"
                                            value="#{timeMB.listarMeusTimes()}">
                                            <p:column headerText="Id">
                                                <h:outputText value="#{time.id}" />
                                            </p:column>

                                            <p:column headerText="Nome">
                                                <h:outputText value="#{time.nome}" />
                                            </p:column>

                                            <p:column headerText="Nome">
                                                <td><span class="label label-danger label-icon-left"><i
                                                        class="glyphicon glyphicon-star"></i> Capitão</span></td>
                                            </p:column>

                                            <p:column headerText="Id">
    <a href="perfilTime.xhtml?id=#{time.id}"><h:outputText value="#{time.id}" /></a>
</p:column>


                                        </p:dataTable>

Ja o meu PerfilTime.xhtml:

<ul>
                                        <li>Identificador: <h:outputText
                                                value="#{timeMB.time.id}" /></li>
                                        <li>Nome: <h:outputText
                                                value="#{timeMB.time.nome}" /></li>
                                        <li>Senha do Time: <h:outputText
                                                value="#{timeMB.time.senhaTime}" /></li>

                                    </ul>

Acessando a URL dessa forma: http://localhost:8080/arena/perfilTime.xhtml?id=10

Ele não trás as informações, fica dessa forma:

Identificador: 0
Nome:
Senha do Time:

Rafael,

Você fez alguma função para carregar o item lá dentro do bean? Por exemplo:

public long id;

public long getTimeId (){
    return this.timeId;
}
public long setTimeId (long id){
    this.timeId = id;
}
public void carregarPorId() {
    this.time = dao.carregaPorId(time.id)
}

Caso tenha dúvida tenho um projeto no github que tem coisas como está.

Link do projeto: https://github.com/gleidiin/tidir-III

Aqui o meu TimeBean:

package br.com.arena.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import br.com.arena.dao.PessoaDAO;
import br.com.arena.dao.PessoaTimeDAO;
import br.com.arena.dao.TimeDAO;
import br.com.arena.enumerador.Cargo;
import br.com.arena.model.Pessoa;
import br.com.arena.model.PessoaTime;
import br.com.arena.model.Time;

@ManagedBean(name = "timeMB")
@SessionScoped
public class TimeBean implements Serializable{

    private static final long serialVersionUID = 1L;
    private Time time;
    private TimeDAO timeDAO;    
    private PessoaDAO pessoaDao;
    private List<Time> listaPessoaTime = new ArrayList<Time>();
    private PessoaBean pessoaBean;
    private PessoaTimeDAO pessoaTimeDAO;

    public TimeBean(){
        setTime(new Time());
        setTimeDAO(new TimeDAO());
        setPessoaDao(new PessoaDAO());
        setPessoaBean(new PessoaBean());
        setPessoaTimeDAO(new PessoaTimeDAO());
    //    setListaPessoaTime(getDao().listarMeusTimes(usuarioLogado()));

    }


    public void cadastrar() {    
        /*    cadastra o time    */
        getTimeDAO().cadastrar(getTime());    
        /*cadastra na associativa PessoaTime*/
        getPessoaTimeDAO().cadastrar(getPessoaTime(getPessoaBean().usuarioLogado(), getTime())); 
        limpaTela();
    }

    /* Cria uma pessoa time */
    public PessoaTime getPessoaTime(Pessoa pessoa, Time time){
        PessoaTime p = new PessoaTime();
        p.setPessoa(pessoa);
        p.setTime(time);
        p.setCargo(Cargo.ADMINISTRADOR);
        return p;
    }

    public PessoaTime entrarEmTime(Pessoa pessoa, Time time){
        PessoaTime p = new PessoaTime();
        p.setPessoa(pessoa);
        p.setTime(time);
        p.setCargo(Cargo.MEMBRO);
        return p;
    }


    public List<Time> timeExistentes(){
        return getTimeDAO().listaTodosTimes();
    }

    public List<Time> listarMeusTimes(){
        return getTimeDAO().listarMeusTimes(getPessoaBean().usuarioLogado());    
    }

    public Long qtdMeusTimes(){
        return getTimeDAO().quantidadeMeusTimes(getPessoaBean().usuarioLogado());
    }

    public String exibirTime(Object obj){
        /*Time time = (Time) obj;
        setTime(time);*/

        return "perfilTime.xhtml";

    }

    public void limpaTela(){
        setTime(null);
    }


    /* getters e setters */

    public PessoaBean getPessoaBean() {
        return pessoaBean;
    }


    public void setPessoaBean(PessoaBean pessoaBean) {
        this.pessoaBean = pessoaBean;
    }



    public PessoaTimeDAO getPessoaTimeDAO() {
        return pessoaTimeDAO;
    }



    public void setPessoaTimeDAO(PessoaTimeDAO pessoaTimeDAO) {
        this.pessoaTimeDAO = pessoaTimeDAO;
    }



    public Time getTime() {
        return time;
    }

    public void setTime(Time time) {
        this.time = time;
    }


    public TimeDAO getTimeDAO() {
        return timeDAO;
    }

    public void setTimeDAO(TimeDAO timeDAO) {
        this.timeDAO = timeDAO;
    }



    public PessoaDAO getPessoaDao() {
        return pessoaDao;
    }

    public void setPessoaDao(PessoaDAO pessoaDao) {
        this.pessoaDao = pessoaDao;
    }


    public List<Time> getListaPessoaTime() {
        return listaPessoaTime;
    }

    public void setListaPessoaTime(List<Time> listaPessoaTime) {
        this.listaPessoaTime = listaPessoaTime;
    }



}

Não entendi o seu metodo carregarPorId:

public void carregarPorId() {
    this.time = dao.carregaPorId(time.id)
}

dao.carregarPorId(time.id) Ele chama o DAO, de time no caso, mas não entendo o ".carregarPorId" dentro do proprio carregarPorId

Perdão, consegui entender. Ficou desta forma.

TimeDAO:

public Time carregarPorId(int id){
        return getEm().find(Time.class, id);

    }

TimeBean:

public void carregarPorId(){
        this.time = timeDAO.carregarPorId(time.getId());
    }

Usando a seguinte DataTable na PerfilTime.xhtml:

<p:dataTable styleClass="table" var="time"
                                            value="#{timeMB.carregarPorId()}">
                                            <p:column headerText="Id">
                                                <h:outputText value="#{timeMB.time.id}" />
                                            </p:column>

                                            <p:column headerText="Nome">
                                                <h:outputText value="#{timeMB.time.senhaTime}" />
                                            </p:column>                                    

                                        </p:dataTable>

Gerou o seguinte erro:

jul 22, 2016 10:28:15 AM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/perfilTime.xhtml]
javax.el.ELException: /perfilTime.xhtml @121,46 value="#{timeMB.carregarPorId()}": java.lang.NullPointerException
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    at javax.faces.component.UIData.getValue(UIData.java:732)
    at javax.faces.component.UIData.getDataModel(UIData.java:1811)
    at javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
    at javax.faces.component.UIData.setRowIndex(UIData.java:473)
    at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:143)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
    at br.com.arena.controller.TimeBean.carregarPorId(TimeBean.java:90)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at javax.el.BeanELResolver.invoke(BeanELResolver.java:165)
    at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:80)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:159)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    ... 39 more

jul 22, 2016 10:28:15 AM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/arena] threw exception [null] with root cause
java.lang.NullPointerException
    at br.com.arena.controller.TimeBean.carregarPorId(TimeBean.java:90)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at javax.el.BeanELResolver.invoke(BeanELResolver.java:165)
    at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:80)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:159)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    at javax.faces.component.UIData.getValue(UIData.java:732)
    at javax.faces.component.UIData.getDataModel(UIData.java:1811)
    at javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
    at javax.faces.component.UIData.setRowIndex(UIData.java:473)
    at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:143)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

Acredito que seja devido ao:

time.getId()

Oi Rafael,

Nesse caso o getters and setters tem que ser especifico do nome id. Nesse caso você tem que fazer um atributo igual ao do HTML.

Esse erro é por causa que ele não está achando o getter do atributo.

java.lang.NullPointerException

Olá,

Você precisar rever seus conhecimentos de JavaServer Faces pois sua classe TimeBean, você está misturando os contêineres JSF e CDI:

...
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
...
@ManagedBean(name = "timeMB")
@SessionScoped
public class TimeBean implements Serializable
...

Gleidson, vou verificar e analisar durante o fim de semana. Se tudo der certo volto e marco como solução. Obrigado.

Cassius Vinicius, suas resposta não me ajudou em nada. Não abriu esse tópico para discutir sobre boas praticas. Mesmo assim agradeço ;)

Olá,

Leia: http://stackoverflow.com/questions/19333051/jsf-cdi-and-ejb-containers-which-combination-of-them-should-be-used

" i knew about it was a warning message in Netbeans next to the @ManagedBean:

'Annotations from the package javax.faces.bean will be deprected in the next JSF version. CDI ones are recommanded instead.' "

Você pode fazer de qualquer jeito ou fazer direito, a escolha é sua !

Atenciosamente.

solução!

Gleidson Ferreira,

Ficou dessa forma:

TimeBean:

public String linkAltera(Object obj){
        Time time = (Time) obj;
        setTime(time);
        return "editarTime.xhtml";
    }

Times.xhtml:

<p:dataTable styleClass="table" var="time"
                                        value="#{timeMB.listarMeusTimes()}">
                                        <p:column headerText="Id">
                                            <h:outputText value="#{time.id}" />
                                        </p:column>

                                        <p:column headerText="Nome">
                                            <h:outputText value="#{time.nome}" />
                                        </p:column>

                                        <p:column headerText="Integrantes">
                                            <td><span class="label label-danger label-icon-left"><i
                                                    class="glyphicon glyphicon-star"></i> Capitão</span></td>
                                        </p:column>

                                        <p:column headerText="Editar">
                                            <!-- <button class="btn btn-inverse btn-circle btn-sm"
                                                data-toggle="tooltip" title="Editar">
                                                <i class="fa fa-edit"></i>
                                            </button> -->
                                             <p:form><p:commandLink class="btn btn-inverse btn-circle btn-sm fa fa-edit"  
                                             action="#{timeMB.linkAltera(time)}" data-toggle="tooltip"/></p:form>
                                        </p:column>

                                    </p:dataTable>

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software