Combo jsp + dwr + Ajax

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.

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.

[quote=almarti]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.[/quote]
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.

[quote=almarti]Desculpe a chatisse (Mas sou iniciante) como fazer estas Indicações?

método remoto como @RemotMethod
classe como @RemoteProxy. [/quote]

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+ :wink:

Vamos ver então se entendi: (isto pode servir para outras pessoas tambem)

Minha classe Publico.class está assim:

[code]
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();
}
}[/code]
Ela pega Pessoa.class

No entanto, configurei servlet no xml.

dwr.xml

[quote]







[/quote]

web.xml

[quote]

dwr-invoker
DWR Servlet
uk.ltd.getahead.dwr.DWRServlet

debug
true



dwr-invoker
/dwr/*
[/quote]

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:

[quote]
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();
}
}[/quote]

e

[quote]
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;
}

}[/quote]

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:

[/list]

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

:smiley: :smiley: :smiley:
cara achei mto legal esse topic, mas nao entendi quase nada!! :frowning:

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