(RESOLVIDO)Enviar registro selecionado de uma p:dataTable para o formulário, JSF primefaces
15 respostas
jsfformprimefacesjava
I
Igorguitarblues
Olá, estou migrando de Struts1 para o JSF, estou começando agora com JSF primefaces e gostaria de pedir uma ajuda.
Estou desenvolvendo uma tela de cadastro de usuário, que tem um formulário e uma tabela. Eu gostaria que quando eu selecionasse um registro da p:dataTable, os dados desse registro selecionado fossem para os campos do formulário.
Eu já fiz isso com struts, mas utilizando JSF primefaces eu não sei como fazer.
Código da página:
<h:body><h:form><p:messagesid="messages"showDetail="true"autoUpdate="true"closable="true"/><p:panelGridcolumns="2"style="horizontal-align:center"><p:outputLabelfor="id"value="ID:"/><p:spinnerid="id"value="#{UsuarioMB.usuario.id}"/><p:outputLabelfor="nome"value="Nome:"/><p:inputTextid="nome"value="#{UsuarioMB.usuario.nome}"/><p:outputLabelfor="senha"value="Senha:"/><p:inputTextid="senha"value="#{UsuarioMB.usuario.senha}"/><p:outputLabelfor="descricao"value="Descrição:"/><p:inputTextareaid="descricao"value="#{UsuarioMB.usuario.descricao}"/><p:outputLabelfor="dataCadastro"value="DataCadastro:"/><p:calendarvalue="#{UsuarioMB.usuario.dataCadastro}"locale="pt_BR"id="dataCadastro"showButtonPanel="true"><f:convertDateTimepattern="dd/MM/yyyy"/></p:calendar><p:commandButtonvalue="Cadastrar"icon="ui-icon-star"action="#{UsuarioMB.cadastraUsuario}"update="tabela,messages,@form"></p:commandButton><p:commandButtonvalue="Consultar"icon="ui-icon-star"action="#{UsuarioMB.consultar}"update="tabela,messages"></p:commandButton><p:commandButtonvalue="Limpar"icon="ui-icon-star"action="#{UsuarioMB.limpar}"update="tabela"type="reset"></p:commandButton></p:panelGrid><p:dataTableid="tabela"var="usuario"value="#{UsuarioMB.lista}"paginator="true"rows="50"emptyMessage="Não há registros na lista"paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"rowsPerPageTemplate="10,15,25,50,100"><f:facetname="header">Listadeusuários</f:facet><p:columnheaderText="ID"style="width: 10%;"sortBy="#{usuario.id}"><h:outputTextvalue="#{usuario.id}"rowkKey="#{UsuarioMB.usuario.id}"/></p:column><p:columnheaderText="Nome"style="width: 25%;"sortBy="#{usuario.nome}"><h:outputTextvalue="#{usuario.nome}"/></p:column><p:columnheaderText="Descrição"style="width: 25%;"sortBy="#{usuario.descricao}"><h:outputTextvalue="#{usuario.descricao}"/></p:column><p:columnheaderText="Data de Cadastro"style="width: 25%;"sortBy="#{usuario.dataCadastro}"><h:outputTextvalue="#{usuario.dataCadastro}"/></p:column></p:dataTable></h:form></h:body>
Uma forma seria você adicionar mais uma coluna do datable com um botão, assim ao clicar no botão ele setária o usuário do registro em um usuário no MB. Segue exemplo.
Nota esse usuário que estou passando por parâmentro é variával var=“usuario” criado pelo dataTable.
Obs: No button eu dei um update no panelGrid, para que isto funcione será necessário dar um id para o panelGrid em questão, e substir o update=“panelGrid” por update=“IdDoPanelGrid”
A
Aledro1 like
Outra forma seria através a tag <f:setPropertyActionListener do JSF, dentro do commandButton do primefaces, usando o atributo do usuario, no controller.
Se liga no exemplo co o seguinte cabeçalho “Select Events”
Nesse caso você pode disparar ações no evento de seleção ou rejeição das linhas do grid.
I
Igorguitarblues
Opa, valew, funcionou:
<p:dataTableid="tabela"var="usuario"value="#{UsuarioMB.lista}"paginator="true"rows="10"emptyMessage="Não há registros na lista"paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"rowsPerPageTemplate="10,15,25,50,100"rowKey="#{usuario.id}"selection="#{UsuarioMB.usuario}"selectionMode="single"><f:facetname="header">Listadeusuários</f:facet><p:ajaxevent="rowSelect"listener="#{UsuarioMB.onRowSelect}"update="@form"/><p:columnheaderText="ID"style="width: 10%;"sortBy="#{usuario.id}"><h:outputTextvalue="#{usuario.id}"/></p:column><p:columnheaderText="Nome"style="width: 25%;"sortBy="#{usuario.nome}"><h:outputTextvalue="#{usuario.nome}"/></p:column><p:columnheaderText="Descrição"style="width: 25%;"sortBy="#{usuario.descricao}"><h:outputTextvalue="#{usuario.descricao}"/></p:column><p:columnheaderText="Data de Cadastro"style="width: 25%;"sortBy="#{usuario.dataCadastro}"><h:outputTextvalue="#{usuario.dataCadastro}"/></p:column></p:dataTable>`
publicvoidsetUsuario(Usuariousuario){
this.usuario=usuario;
}
publicvoidonRowSelect(SelectEventevent){setUsuario((Usuario)event.getObject());}
Obrigado gente
I
Igorguitarblues
Agora esta acontecendo outro problema, o objeto Usuario esta com valor null quando faço uma consulta ou quando eu faço um insert
publicclassUsuarioDAO{Connectioncon=null;Conexaoconexao=null;/** * */publicUsuarioDAO(){conexao=Conexao.getInstance();// TODO Auto-generated constructor stub}publicvoidcloseConnection()throwsSQLException{con.close();}// cadastral no banco um usuario passado como parametropublicbooleaninsertUsuario(Usuariousuario){Statementst=null;ResultSetrs=null;try{try{con=conexao.getConnectionNetWork();}catch(Exceptione){// TODO Auto-generated catch blocke.printStackTrace();}st=con.createStatement();PreparedStatementpreparedStatement=con.prepareStatement("insert into usuario_teste123(id, nome, senha, descricao, data_cadastro) values(?,?,?,?,?)");preparedStatement.setInt(1,usuario.getId());preparedStatement.setString(2,usuario.getNome());preparedStatement.setString(3,usuario.getSenha());preparedStatement.setString(4,""+usuario.getDescricao());preparedStatement.setDate(5,newjava.sql.Date(newDate().getTime()));preparedStatement.execute();returntrue;}catch(SQLExceptionex){Loggerlgr=Logger.getLogger(UsuarioDAO.class.getName());lgr.log(Level.SEVERE,ex.getMessage(),ex);returnfalse;}}//lista todos os usuarios cadastrados no banco de dadospublicList<Usuario>listUsuarios(){ArrayList<Usuario>lista=newArrayList<Usuario>();Statementst=null;ResultSetrs=null;try{try{con=conexao.getConnectionNetWork();}catch(Exceptione){// TODO Auto-generated catch blocke.printStackTrace();}st=con.createStatement();Stringsql="select * from usuario_teste123 order BY ID desc ";rs=st.executeQuery(sql);while(rs.next()){Usuariousuario=newUsuario();usuario.setId(rs.getInt(1));usuario.setNome(rs.getString(2));usuario.setSenha(rs.getString(3));usuario.setDescricao(rs.getString(4));usuario.setDataCadastro(rs.getDate(5));lista.add(usuario);}}catch(SQLExceptionex){Loggerlgr=Logger.getLogger(UsuarioDAO.class.getName());lgr.log(Level.SEVERE,ex.getMessage(),ex);}finally{try{if(rs!=null){rs.close();}if(st!=null){st.close();}if(con!=null){con.close();}}catch(SQLExceptionex){Loggerlgr=Logger.getLogger(UsuarioDAO.class.getName());lgr.log(Level.WARNING,ex.getMessage(),ex);}}returnlista;}//lista todos os usuarios cadastrados no banco de dadospublicList<Usuario>consultar(Usuarious){ArrayList<Usuario>lista=newArrayList<Usuario>();ResultSetrs=null;PreparedStatementpstmt=null;StringBufferquery=newStringBuffer();query.append(" select * from usuario_teste123 ");query.append(" WHERE ");if(us.getId()!=null){query.append(" ID = "+us.getId()+"");}if(!"".equalsIgnoreCase(us.getNome())&&!"".equalsIgnoreCase(us.getNome())){query.append("AND NOME = '"+us.getNome()+"'");;}if(!"".equalsIgnoreCase(us.getDescricao())&&!"".equalsIgnoreCase(us.getDescricao())){query.append(" AND DESCRICAO = '"+us.getDescricao()+"'");;}if(!"".equalsIgnoreCase(us.getSenha())&&!"".equalsIgnoreCase(us.getSenha())){query.append(" AND SENHA = "+us.getSenha()+"");;}query.append(" order BY ID desc ");try{try{con=conexao.getConnectionNetWork();}catch(Exceptione){// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(query.toString());pstmt=con.prepareStatement(query.toString());rs=pstmt.executeQuery();while(rs.next()){Usuariousuario=newUsuario();usuario.setId(rs.getInt(1));usuario.setNome(rs.getString(2));usuario.setSenha(rs.getString(3));usuario.setDescricao(rs.getString(4));usuario.setDataCadastro(rs.getDate(5));lista.add(usuario);}}catch(SQLExceptionex){Loggerlgr=Logger.getLogger(UsuarioDAO.class.getName());lgr.log(Level.SEVERE,ex.getMessage(),ex);}finally{try{if(rs!=null){rs.close();}if(con!=null){con.close();}}catch(SQLExceptionex){Loggerlgr=Logger.getLogger(UsuarioDAO.class.getName());lgr.log(Level.WARNING,ex.getMessage(),ex);}}returnlista;}}
M
Matheusrfjava
Posta o ManagedBean. Provavelmente é o scopo dele, se estiver como @RequestScope(valor default caso não tenha um valor definido) recomendo usar @ViewScope ele mantém seu MB vivo enquanto a página está aberta, assemelhasse mais ao ciclo de vida de uma aplicação desktop.
E recomendo também assim que tiver um pouco de experiência com JSF, passar a utilizar CDI e JPA. Gaaranto que vai faciltar e agilizar muito sua vida. Não recomendo iniciar diretamente pois o CDI camufla alguns erros, sendo dificil achar a origem a menos que já tenha uma boa experiência com JSF.
I
Igorguitarblues
Não sabia desses detalhes, vou me lembrar para as próximas, segue meu ManagedBean:
@ManagedBean(name="UsuarioMB")@ViewScopedpublicclassUsuarioManagedBeanimplementsjava.io.Serializable{/** * */privatestaticfinallongserialVersionUID=320054925202954008L;privateUsuariousuario;privateList<Usuario>lista=newArrayList<Usuario>();publicUsuarioManagedBean(){usuario=newUsuario();listar();}publicvoidremoveBean(Stringbean){FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove(bean);}//Metodo para persistirpublicStringcadastraUsuario()throwsSQLException{UsuarioDAOdao=newUsuarioDAO();if(dao.insertUsuario(usuario)){listar();FacesContext.getCurrentInstance().addMessage(null,newFacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso! Usuário cadastrado com sucesso!","Usuário cadastrado com sucesso!"));}else{FacesContext.getCurrentInstance().addMessage(null,newFacesMessage(FacesMessage.SEVERITY_ERROR,"Erro!","Erro no cadastr de usuário!"));}dao.closeConnection();return"";}publicvoidconsultar(){UsuarioDAOdao=newUsuarioDAO();System.out.println("Consultar Usuario");lista=dao.consultar(usuario);}publicvoidlistar(){UsuarioDAOdao=newUsuarioDAO();System.out.println("Listar Usuario");lista=dao.listUsuarios();}publicvoidlimpar(){System.out.println("Limpar");System.out.println(usuario);usuario=newUsuario();}publicvoidsetLista(List<Usuario>lista){this.lista=lista;}publicList<Usuario>getLista()throwsSQLException{returnlista;}publicList<Usuario>getUsuarios()throwsSQLException{UsuarioDAOdao=newUsuarioDAO();List<Usuario>listaUsuarios=dao.listUsuarios();returnlistaUsuarios;}publicUsuariogetUsuario(){returnusuario;}publicvoidsetUsuario(Usuariousuario){this.usuario=usuario;}publicvoidonRowSelect(SelectEventevent){setUsuario((Usuario)event.getObject());}}
M
Matheusrfjava
Mas funcionou agora?
I
Igorguitarblues
O cadastro no banco ainda não, o objeto usuario fica null quando tento persistir
I
Igorguitarblues
Descobri que quando eu não utilizo o ajax para enviar os dados para o formulário, então funciona o insert;