Alguem tem algum exemplo de preenchimento de combo com Ajax utilizando o dwr. Tenho tentado com exemplos da net mas ainda não consegui. Obrigado.
Combo jsp + dwr + Ajax
25 Respostas
Então
No próprio site do DWR tem…
Clique em documentation… Examples… tem alguns exemplos bons lah…
vc cai nessa pagina:
http://getahead.ltd.uk/dwr/examples
Tem umas ferramentas boas, tipo o DWRUtils…
Caro amaratti, não sei em que ponto está a sua aplicação mas como já estive utilizando o dwr como opção para ajax seu tópico me chamou a atenção. Caso ainda esteja no início sugiro que opte pelo vRaptor como um framework completo que tem suporte a ajax, afinal você precisa preencher um combo vindo, provavelmente, de uma base de dados (xml, sgbd’s, …) logo a interação fica mais simples mas sem grandes ilusões pois vai precisar de um tanto considerável de javascript e conhecimento da árvore DOM pelo menos um tantinho.
Caso opte por esta solução mande aí, estou neste ponto da minha aplicação e tento bastante sucesso. Utilizo [Hibernate + Annotations] ( M ) + vRaptor © + [JSP+HTML+CSS+JS+AJAX] (V)
ou siga o exemplo do dwr que tb não é nada difícil: http://getahead.ltd.uk/dwr/examples/lists
Qual o seu problema neste exemplo?
Minha dificuldade é exatamente esta: preciso preencher combos com resultados de sgdb. Estou usando netbeans (É o que posso usa aaui na empresa) Vou baixar o vRaptor para testar.
O exemplo do site que utilizei está em
http://www.guj.com.br/posts/list/21957.java
O que acontece é que me retorna um erro de javascript dizendo que DWRUtil não pode ser encontrado.
Amarati, primeiramente vamos ajustar alguns conceitos: netbeans é sua IDE de desenvolvimento assim como o eclipse. O vRaptor é um framework de desenvolvimento java para web.
Quanto ao erro “DWRUtils” não encontrado verifique se você está inserido o script: bem como se o caminho (em destaque) está correto.
Dê um retorno.
Bom, realmente este endereço estava errado. Agora uma explicação por favor:
Eu não criei a Publico.js e sim uma classe chamada publico. É preciso criar estre js? Como? O erro que dá agora é que Publico não esta definido.
Bom, realmente este endereço estava errado. Agora uma explicação por favor:Eu não criei a Publico.js e sim uma classe chamada publico. É preciso criar estre js? Como? O erro que dá agora é que Publico não esta definido.
almarti, não precisa criá-los não. O próprio DWR referencia estes js’s a partir do nome do método remoto que você indicou como @RemotMethod de uma classe que você indicou como @RemoteProxy.
Desculpe a chatisse (Mas sou iniciante) como fazer estas Indicações?
método remoto como @RemotMethod
classe como @RemoteProxy.
Desculpe a chatisse (Mas sou iniciante) como fazer estas Indicações?método remoto como @RemotMethod
classe como @RemoteProxy.
Chatice nada, lancei esta para ver se teria interesse. É o seguinte, você pode optar por utilizar o DWR configurando o arquivo dwr.xml (que particularmente não gosto) ou simplesmente adicionar o servlet do dwr (conforme o guia do mesmo) no arquivo web.xml e expor seus métodos da seguinte maneira. Suponha que vc tenha a classe Carro e quer expor o método getList(), faça:
@RemoteProxy
class Carro{
List lstCarros = new List();
…
@RemoteMethod
public getList(){
return lstCarros;
}
}
É isso, o uso de anotações no dwr.
T+ 
Vamos ver então se entendi: (isto pode servir para outras pessoas tambem)
Minha classe Publico.class está assim:
package classes;
import java.util.*;
public class Publico
{
private static Map pessoas = new LinkedHashMap();
public String addPessoa(ComponenteCombo p)
{
if (pessoas.containsKey(p.getId()))
{
return "ERRO: Registro ja existente";
}
pessoas.put(p.getId(), p);
return new Date().toString();
}
public Collection getPessoas()
{
return pessoas.values();
}
}
No entanto, configurei servlet no xml.
dwr.xml
web.xml
dwr-invoker
DWR Servlet
uk.ltd.getahead.dwr.DWRServlet
debug
true
dwr-invoker
/dwr/*
Parece que estou com conflitos de configurações...
amigo, teste com as anotações que lhe disse, pq não cheguei a configurar o dwr.xml como disse acho uma tarefa inglória.
Fiz conforme indicado colocando as anotações, porém Publico continua indefinido. Será que há mais alguma configuração que deixei escapar?
As classes ficaram assim:
<blockquote>
package classes;
import java.util.*;
import org.directwebremoting.annotations.RemoteProxy;
@RemoteProxy public class Publico
{
private static Map pessoas = new LinkedHashMap();
public String addPessoa(ComponenteCombo p)
{
if (pessoas.containsKey(p.getId()))
{
return “ERRO: Registro ja existente”;
}
pessoas.put(p.getId(), p);
return new Date().toString();
}
public Collection getPessoas()
{
return pessoas.values();
}
}</blockquote>
e
package classes;import java.util.*;
import org.directwebremoting.annotations.RemoteMethod;public class ComponenteCombo {
private int id; private String nome; public ComponenteCombo(){} @RemoteMethod public int getId() { return id; } @RemoteMethod private void setId(int id) { this.id = id; } @RemoteMethod public String getNome () { return nome; } @RemoteMethod public void setNome (String nome) { this.nome = nome; }}
Vc precisa colocar @RemoteMethod acima do método que deseja ser acessado assincronamente da mesma classe que vc indicou como @RemoteProxy.
Pelo seu exemplo vc colocou @RemoteProxy em Publico e @RemoteMethod nos métodos de ComponenteCombo.
Mesmo que esteja correto, acredito que á outra configuraçãop, talvez não incluido o jar corretamente, algumas coisa assim. Poque Publico continua indefinido.
Vamos montar um exemplo completo em que você vai clicar em um botão e exibir as informações do ser servidor em uma div.
Primeiramente: adicione os jar’s do dwr.
Considerando que vc está usando o netbeans:
0-Criar um projeto chamado DWRTest e uma pacote chamado dwr
0.1-Criar uma classe chamada RemoteFunctions
1-selecionar na árvore do projeto: library e com o botão direito adicionar para o jar, lembre-se de não colocar os jar junto dos jars do seu servidor (ou você irá viver o inferno do classloader)
2-alterar o web.xml adicionando os dois blocos abaixo:
<servlet>
<description>DWR controller servlet</description>
<servlet-name>DWR controller servlet</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>classes</param-name>
com.DWRTest.dwr.RemoteFunctions
<param-value>
<servlet>
<servlet-mapping>
<servlet-name>DWR controller servlet</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
package com.dwrTest.dwr;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.annotations.RemoteMethod;
import org.directwebremoting.annotations.RemoteProxy;
import uk.ltd.getahead.dwr.ExecutionContext;
@RemoteProxy
public class RemoteFunctions {
@RemoteMethod
public String getServerInfo() {
return WebContextFactory.get().getServletContext().getServerInfo()
+ " running on JDK "
+ System.getProperty("java.specification.version")
+ " using DWR "
+ ExecutionContext.get().getVersion();
}
@RemoteMethod
public String getResponse(String res) {
return res;
}
}
Agora a nossa jsp. index.jsp
[list]
Query Server:
Server Information:
Testa e me fala, não precisa criar o projeto do zero do jeito que fiz aqui não mas é um guia para ir fazendo passo-a-passo. Peguei alguns trechos que tinha aqui de algo que fiz, qq coisa posta aí, posso ter colocado algo meio estranho.
T+.
Creio que você tenha esquecido dos mapeamentos no web.xml

cara achei mto legal esse topic, mas nao entendi quase nada!! 
fiz isso que vc pretende fazer de 1 maneira mto mais simples cara,
consulta a revista JavaMagazine Ed 28.
http://javamagazine.com.br/downloads/jm28/jm28-ajax.zip
espero q te ajude
flw
Fiz do jeito que estava, apenas alterei
<servlet>
<description>DWR controller servlet</description>
<servlet-name>DWR controller servlet</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>classes</param-name>
com.DWRTest.dwr.RemoteFunctions
<param-value>
<servlet>
para
<servlet>
<description>DWR controller servlet</description>
<servlet-name>DWR controller servlet</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>classes</param-name>
<param-value>com.DWRTest.dwr.RemoteFunctions </param-value>
</init-param>
</servlet>
Porem retornou o meso erro: RemoteFunctions não está definida.
Confira se na sua app vc tem o pacote com.DWRTest.dwr
Sim, o criei manualmente para colocar a classe que voce sugeriu
Apos um pouco de esforço consegui configurar o dwr (Alias este era o meu erro: em algum momento digitei drw e não dwr) e o meu combo passou a funcionar.
Estou tendo dificuldades agora no seguinte: carrego um combo e al selecionar este preciso carregar outros dois. Coloquei as funções javascript no onchange. Porem, apenas um ou outro combo é carregado. Se eu tentar carregar outros itens a partir da terceira ou quarta tentativa, então sim os combos são carregados. O que pode estar errado?
Apos um pouco de esforço consegui configurar o dwr (Alias este era o meu erro: em algum momento digitei drw e não dwr) e o meu combo passou a funcionar.Estou tendo dificuldades agora no seguinte: carrego um combo e al selecionar este preciso carregar outros dois. Coloquei as funções javascript no onchange. Porem, apenas um ou outro combo é carregado. Se eu tentar carregar outros itens a partir da terceira ou quarta tentativa, então sim os combos são carregados. O que pode estar errado?
manda seus js para darmos uma olhada!
JS
function montaComboFunc(listBeans){
DWRUtil.removeAllOptions(“cmb_Func”);
DWRUtil.addOptions(“cmb_Func”, listBeans, “id”, “nome”);
}
function carregaComboArea(Campo, Tabela, CampoCondicao, id){
FacadeAjax.selectAllUnidade(montaComboArea,Campo, Tabela, CampoCondicao, id);
}
function montaComboArea(listBeans){
DWRUtil.removeAllOptions(“cmb_Area”);
DWRUtil.addOptions(“cmb_Area”, listBeans, “id”, “nome”);
}
Chamada
No que se dis respeito a configuração, verifique estes items e veja se estao coretos, na pasta WEB-INF crie um folder chamado lib e joge la o DWR.jar
O servelet do dwr no web.xml tb tem que estar configurado da seguinte forma
dwr-invoker
uk.ltd.getahead.dwr.DWRServlet
debug
true
dwr-invoker
/dwr/*
vc tb tem q ter na mesma pasta de web inf um arquivo dwr.xml para adicionar os create, convert e etc.
espero ter ajudado um pouco t+
Caro amaratti, não sei em que ponto está a sua aplicação mas como já estive utilizando o dwr como opção para ajax seu tópico me chamou a atenção. Caso ainda esteja no início sugiro que opte pelo vRaptor como um framework completo que tem suporte a ajax, afinal você precisa preencher um combo vindo, provavelmente, de uma base de dados (xml, sgbd’s, …) logo a interação fica mais simples mas sem grandes ilusões pois vai precisar de um tanto considerável de javascript e conhecimento da árvore DOM pelo menos um tantinho.Caso opte por esta solução mande aí, estou neste ponto da minha aplicação e tento bastante sucesso. Utilizo [Hibernate + Annotations] ( M ) + vRaptor © + [JSP+HTML+CSS+JS+AJAX] (V)
ou siga o exemplo do dwr que tb não é nada difícil: http://getahead.ltd.uk/dwr/examples/lists
Qual o seu problema neste exemplo?
JWCunha, uso o VRaptor, e gostaria de montar um esquema parecido com o que estamos discutindo aqui.
Como vc faz através deste Framework?
Preciso preencher um Combo baseado no que foi selecionado no combo anterior.
Caro amigos, criei um combo aninhado e no IE funciona perfeitamente, contudo nao no Firefox a lista no combo não é exibida assim como nenhum erro. Verifiquei pelo firebug e pelo visto a lista de informações para serem adicionadas no combo é buscada contudo a lista nao é incluida na tela… É só no firefox que isso acontece… Ie esta perfeito. DEsde já grato.