Combo jsp + dwr + Ajax

25 respostas
almarti

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.

25 Respostas

_Renatu

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…

J

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?

almarti

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.

almarti

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.

J

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.

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.

J

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.


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.

almarti

Desculpe a chatisse (Mas sou iniciante) como fazer estas Indicações?

método remoto como @RemotMethod
classe como @RemoteProxy.

J

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

almarti

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

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...

J

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.

almarti

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;
}

}

J

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.

almarti

Mesmo que esteja correto, acredito que á outra configuraçãop, talvez não incluido o jar corretamente, algumas coisa assim. Poque Publico continua indefinido.

J

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

bebad

: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

almarti

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.

J

Confira se na sua app vc tem o pacote com.DWRTest.dwr

almarti

Sim, o criei manualmente para colocar a classe que voce sugeriu

almarti

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?

J

almarti:
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!

almarti

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

V

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+

drix

jwcunha:
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.

G

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.

Criado 26 de janeiro de 2007
Ultima resposta 28 de jan. de 2008
Respostas 25
Participantes 7