Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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>