RichFaces

10 respostas
G

Alguem se dispoe a tirar algumas duvidas sobre richfaces, mais especificamente o ajaxkeys, andei fazendo alguns exemplos, mas ainda não ta muito claro o funcionamento dele pra min …

se alguem se dispor … poste aki ^^

grato

10 Respostas

cristiano.andrade

Poste sua dúvida :smiley:

RobsonFagundes

guimoz Veja axo q pode te ajudar…
http://www.juntadeandalucia.es/xwiki/bin/view/MADEJA/RichFaces
T+

G

vamo la hehe

seguinte, fiz alguns exemplos, e tentei implementar algumas variaçoes dos originais, so pra n fik naquela coisa chata de sempre seguir a risca os exemplos ...

entao ... no exemplo, tem uma lista, estatica, que é carregada 1 unica vez, qnd o mb é carregado pela primeira vez, atravez da @PostConstruct, é um ArrayList, nesste mesmo metodo é criado uma instancia de um Set, Set set = new HashSet();

ate ai tdo bem...

em cada linha da datatable, tenho um botao que aciona um modalpanel, do richfaces, que atualizaria os dados, exemplo:

digamos q eu tenha uma linha com o nome e telefone, qnd eu clicar no botao editar, ele traz o modal com as informaçoes da respectiva linha...

o problema vem agora, se eu usar como no exemplo, uma lista estatica, ele funciona, ele "salva", as informaçoes que foram mudadas, em tempo de execução, dando submit somente na linha q foi alterada, sem ter q dar reload na tabela inteira, consequentemente na tela.

so q, como eu disse antes, fiz uma variação disso xD, na verdade 2, fiz um metodo q retorna um list, tb com lista estatica, e um com um metodo q retorna uma list do banco, em ambas variaçoes, ao executar o metodo de salvar, o item n é atualizado na tela ....

segue os fontes ..

o jsp ..
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>

<html>
    <f:view>
        <head>
            <title>RichFaces</title>
        </head>
        <body>
            <h:form>
                <rich:panel header="Usuarios">
                    <rich:dataTable value="#{userBean.users}" var="user"
                                    ajaxKeys="#{userBean.rowsToUpdate}">
                        <h:column>
                            <a4j:commandButton value="Edit"
                                               oncomplete="#{rich:component('useredit')}.show()"
                                               reRender="userinfo">
                                <f:setPropertyActionListener value="#{user}"
                                                             target="#{userBean.selectedUser}" />
                            </a4j:commandButton>
                        </h:column>

                        <h:column>
                            <h:outputText id="name" value="#{user.name}"/>
                        </h:column>
                        <h:column>
                            <h:outputText id="email" value="#{user.email}"/>
                        </h:column>
                    </rich:dataTable>
                </rich:panel>
            </h:form>
            <a4j:keepAlive beanName="userBean"/>
            <rich:modalPanel id="useredit" label="Usuario">
                <h:form>
                    <h:panelGrid id="userinfo">
                        <h:outputLabel for="nameInput" value="Name:"/>
                        <h:inputText id="nameInput" value="#{userBean.selectedUser.name}"/>
                        <h:outputLabel for="emailInput" value="Email:"/>
                        <h:inputText id="emailInput" value="#{userBean.selectedUser.email}"/>
                        <h:panelGrid columns="2">
                            <a4j:commandLink onclick="#{rich:component('useredit')}.hide();return false">
                                Close
                            </a4j:commandLink>
                            <a4j:commandLink actionListener="#{userBean.save}"
                                             oncomplete="#{rich:component('useredit')}.hide()"
                                             reRender="name, email">
                                Save
                                                            </a4j:commandLink>                        </h:panelGrid>
                    </h:panelGrid>
                </h:form>
            </rich:modalPanel>
        </body>
    </f:view>
</html>
o bean...
package example.model;

import java.io.Serializable;

public class User implements Serializable {

    private String name;
    private String email;

    public User() {
    }

    public User(String name, String email) {
        super();
        this.name = name;
        this.email = email;
    }

    @Override
    public String toString() {
        return name + " " + email;
    }

   

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
o mb
package example.beans;

import example.dao.UserDAO;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import example.model.User;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.faces.event.ActionEvent;

public class UserBean implements Serializable {

    private List<User> users;
    private User selectedUser;
    private Set<Integer> rowsToUpdate;
    private UserDAO udao = new UserDAO();

    public List<User> getUsers() throws SQLException {
        users = udao.getUsers();
        rowsToUpdate = new HashSet<Integer>();
        return users;
    }

     public void save(ActionEvent event) {        
        System.out.println(selectedUser.getName());
        System.out.println(users.toString());
        System.out.println(users.indexOf(selectedUser));
        System.out.println(users.contains(selectedUser));
        getRowsToUpdate().add(users.indexOf(selectedUser));
    }

    public User getSelectedUser() {
        return selectedUser;
    }

    public void setSelectedUser(User selectedUser) {
        this.selectedUser = selectedUser;
    }

    public Set<Integer> getRowsToUpdate() {
        return rowsToUpdate;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }
   
}

ps: n entendi direito o uso do ajaxkeys, sendo mais expecifico, n entendi o pq da linha em q é addicionado no rowstoupdate( getRowsToUpdate().add(users.indexOf(selectedUser)););

G

talvez a soluçao pro meu problema seja fzer um overide do equals e do hashcode, ja q na linha em q eu printo o indexof, retorna -1, ou seja n encontra o objeto, mas a maior duvida ta no ajaxkeys msm …

G

bom ja fiz o exemplo funcionar, a solução era implementar o hascode, equals, e usar 2 obejtos para comparação um somente para comparação e outro para realmente guardar as modificações …

ps: o ajaxkeys funciona como um indice para sua tabela …

leonardocoutoc

Ola pessoal,

Para quem estar sofrendo com este problema utilizei a propriedade row da datatable para informa ao set qual linha ele deverá utlizar:

Alguns trechos:

Na view:
<t:saveState value="#{destinoController.dataTableDestino.currentRow}"/>
...
			<rich:dataTable sortMode="multi" rowKeyVar="row" ajaxKeys="#{empresaController.dataTableEmpresa.updateRowByAjax}"
				value="#{empresaController.dataTableEmpresa.listaProcuraDeEmpresa}" var="emp"
				rows="10" id="tableEmpresa" width="100%" rendered="#{not empty empresaController.dataTableEmpresa.listaProcuraDeEmpresa }">
...
BOTOES DE LINK(ACOES) DA TABELA:
...
<a4j:commandLink id="linkEditar" action="#{empresaController.dataTableEmpresa.copiarObjEmpresa}" title="Editar Empresa" ajaxSingle="true" immediate="true" reRender="panelEditarEmp" >
							<h:graphicImage style="border:none;" value="../MyImgs/edit2.gif"></h:graphicImage>
							<f:setPropertyActionListener target="#{empresaController.dataTableEmpresa.empresaSelecionada }" value="#{emp}" />
							<f:setPropertyActionListener target="#{empresaController.dataTableEmpresa.currentRow }" value="#{row}" />
							<rich:componentControl for="modalPanelEditar" attachTo="linkEditar" operation="show" event="onclick"></rich:componentControl>
						</a4j:commandLink>

...
NO MODAL PANEL(Editar):
...
<a4j:commandButton id="buttonAtualizar" type="submit" styleClass="buttonGeneric" value="Atualizar" reRender="[b]IdDaEmpresa, NomeEmpresa[/b], columnButtons, controleFechar, panelControlsModal" actionListener="#{empresaController.atualizarEmpresa }" disabled="#{empresaController.dataTableEmpresa.atualizado }" style="#{empresaController.dataTableEmpresa.atualizado ? 'color: gray;' : ''}"/>

...

EM empresaController.java:

...
this.getDataTableEmpresa().getUpdateRowByAjax().add(this.getDataTableEmpresa().getCurrentRow());
...

Em dataTableEmpresa.java:

...
private Integer currentRow;
private Set<Integer> updateRowByAjax;


	public Set<Integer> getUpdateRowByAjax() {
		if(this.updateRowByAjax == null){
			this.updateRowByAjax = new HashSet<Integer>();
		}
		return updateRowByAjax;
	}

att,

Leonardo Couto Conrado.

G

Uma pergunta caro amigo leonardocoutoc

Realizei estes exemplos aqui listados mas a minha tabela não atualiza após o update de uma linha…tenho que mandar atualizar pelo codigo java???
é este o código que atualiza a linha apenas da tabela???
this.getDataTableEmpresa().getUpdateRowByAjax().add(this.getDataTableEmpresa().getCurrentRow());

Desculpem a minha ignorância…estou estudando rich faces agora…

G

Na verdade não consigo fazer com que apenas a linha alterada da tabela mude…por favor me ajudem…Obrigado!

G

Consegui resolver…esqueci de colocar o atributo id nos output text das tabelas e por isso o botão do modal panel não conseguia dar o reRender na tabela…

G

Tenho outra dúvida…O meu exemplo está funcionando perfeitamente mas quando vou EXCLUIR uma linha da tabela ele da reRender na table livlist e perde a formatação que é colocada pela tag <rich:jQuery e a tabela deixa de ser zebrada…Alguém sabe me dizer o que fazer para que isso não aconteça…Obrigado!!!

<%@ page language="java" contentType="text/html"
         pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<!-- RichFaces tag library declaration -->
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <link href="css/estilos.css" rel="stylesheet" />
        <style  type="text/css">
            .odd-row {
                background-color: #ECF3FE;
            }
            .even-row {
                background-color: #FCFFFE;
            }
            .active-row {
                background-color: #FFEBDA;
            }

        </style>
        <title>Mostrar Livros</title>
    </head>
    <body>
        <div align="left"><b>CRUD com Hibernate, JSF e Rich Faces</b></div><br>
        <f:view>
            <h:messages />
            <h:form>
                <a4j:region>
                    <rich:dataTable  width="483" id="livList" sortMode="multi"
                                     value="#{livrosView2.todosLivros}"
                                     rows="20"
                                     rowKeyVar="row"
                                     var="item"
                                     ajaxKeys="#{livrosView2.keys}">
                        <f:facet name="header">
                            <rich:columnGroup>
                                <h:column><h:outputText value="ISBN"/></h:column>
                                <h:column><h:outputText value="Título"/></h:column>
                                <h:column><h:outputText value="Publicado em"/></h:column>
                                <h:column><h:outputText value="Alterar"/></h:column>
                                <h:column><h:outputText value="Excluir"/></h:column>
                            </rich:columnGroup>
                        </f:facet>
                        <h:column>
                            <h:outputText id="isbn" value="#{item.isbn}" />
                        </h:column>
                        <h:column>
                            <h:outputText id="titulo" value="#{item.titulo}" />
                        </h:column>
                        <h:column>
                            <h:outputText id="publicacao" value="#{item.publicacao}" />
                        </h:column>
                        <rich:column>
                            <a4j:commandLink ajaxSingle="true" id="editlink"
                                             oncomplete="#{rich:component('editPanel')}.show()">
                                <h:graphicImage value="imagens/edit.gif" style="border:0"/>
                                <f:setPropertyActionListener value="#{item}"
                                                             target="#{livrosView2.currentItem}" />
                                <f:setPropertyActionListener value="#{row}"
                                                             target="#{livrosView2.currentRow}" />
                                <rich:componentControl for="modalPanelEditar" attachTo="editlink"
                                                       operation="show" event="onclick"/>
                            </a4j:commandLink>
                            <rich:toolTip for="editlink" value="Editar"/>
                        </rich:column>
                        <rich:column>
                            <a4j:commandLink ajaxSingle="true" id="deletelink"
                                             oncomplete="#{rich:component('deletePanel')}.show()">
                                <h:graphicImage value="imagens/delete.gif" style="border:0"/>
                                <f:setPropertyActionListener value="#{item}"
                                                             target="#{livrosView2.currentItem}" />
                                <f:setPropertyActionListener value="#{row}"
                                                             target="#{livrosView2.currentRow}" />
                            </a4j:commandLink>
                            <rich:toolTip for="deletelink" value="Excluir"/>
                        </rich:column>
                        <f:facet name="footer">
                            <rich:datascroller renderIfSinglePage="false" maxPages="5"/>
                        </f:facet>
                    </rich:dataTable >
                    <rich:jQuery selector="#livList tr:odd" query="addClass('odd-row')" />
                    <rich:jQuery selector="#livList tr:even" query="addClass('even-row')" />
                    <rich:jQuery selector="#livList tr"
                                 query="mouseover(function(){jQuery(this).addClass('active-row')})"/>
                    <rich:jQuery selector="#livList tr"
                                 query="mouseout(function(){jQuery(this).removeClass('active-row')})"/>
                    <br/>
                </a4j:region>
            </h:form>

            <a4j:keepAlive beanName="livrosView2"/>
            <rich:modalPanel id="editPanel" autosized="true" width="450">
                <f:facet name="header">
                    <h:outputText value="Editando Livro" />
                </f:facet>
                <f:facet name="controls">
                    <h:panelGroup>
                        <h:graphicImage value="imagens/close2.gif"
                                        id="hidelink" styleClass="hidelink"/>
                        <rich:componentControl for="editPanel" attachTo="hidelink"
                                               operation="hide" event="onclick" />
                    </h:panelGroup>
                </f:facet>
                <h:form>
                    <rich:messages style="color:red;"></rich:messages>
                    <h:panelGrid columns="1">
                        <a4j:outputPanel ajaxRendered="true">
                            <h:panelGrid columns="2">
                                <h:outputText value="ID"/>
                                <h:inputText readonly="true" value="#{livrosView2.currentItem.idlivro}"/>
                                <h:outputText value="ISBN" />
                                <h:inputText value="#{livrosView2.currentItem.isbn}" />
                                <h:outputText value="Título" />
                                <h:inputText value="#{livrosView2.currentItem.titulo}" />
                                <h:outputText value="Edição" />
                                <h:inputText value="#{livrosView2.currentItem.edicao}" />
                                <h:outputText value="Publicação" />
                                <h:inputText value="#{livrosView2.currentItem.publicacao}" />
                                <h:outputText value="Descricao" />
                                <h:inputTextarea value="#{livrosView2.currentItem.descricao}" />
                            </h:panelGrid>
                        </a4j:outputPanel>
                        <a4j:commandButton value="Salvar"
                                           action="#{livrosView2.update}"
                                           reRender="isbn,titulo,publicacao"
                                           oncomplete="if (#{facesContext.maximumSeverity==null}) #{rich:component('editPanel')}.hide();" />
                    </h:panelGrid>
                </h:form>
            </rich:modalPanel>
            <rich:modalPanel id="deletePanel" autosized="true" width="200">
                <f:facet name="header">
                    <h:outputText value="Deseja deletar realmente este livro?"
                                  style="padding-right:15px;" />
                </f:facet>
                <f:facet name="controls">
                    <h:panelGroup>
                        <h:graphicImage value="imagens/close2.gif"
                                        styleClass="hidelink" id="hidelink2" />
                        <rich:componentControl for="deletePanel" attachTo="hidelink2"
                                               operation="hide" event="onclick" />
                    </h:panelGroup>
                </f:facet>
                <h:form>
                    <table width="100%">
                        <tbody>
                            <tr>
                                <td align="center" width="50%">
                                    <a4j:commandButton value="Sim" ajaxSingle="true"
                                                       action="#{livrosView2.delete}"
                                                       oncomplete="#{rich:component('deletePanel')}.hide();"
                                                       reRender="livList" />
                                </td>
                                <td align="center" width="50%">
                                    <a4j:commandButton value="Não"
                                                       onclick="#{rich:component('deletePanel')}.hide();return false;" />
                                </td>
                            </tr>
                        </tbody>
                    </table>
                </h:form>
            </rich:modalPanel>
            <a4j:status onstart="#{rich:component('wait')}.show()" onstop="#{rich:component('wait')}.hide()"/>
            <rich:modalPanel id="wait" autosized="true" width="200" height="120" moveable="false" resizeable="false">
                <f:facet name="header">
                    <h:outputText value="Processing"/>
                </f:facet>
                <h:outputText value="Wait Please..."/>
            </rich:modalPanel>
            <rich:messages></rich:messages>
        </f:view>
    </body>
</html>
Criado 2 de março de 2009
Ultima resposta 16 de set. de 2009
Respostas 10
Participantes 5