Exemplo Simples com WebWork, mas nem tanto

Pessoal, estou tentando montar um exemplo simples em webwork, mas não estou conseguindo e não achei literatura que me ajudasse:

1-Tenho uma tela JSP com um formulário onde a pessoa informa um parâmetro para pesquisa
2-Isto é enviado a uma action, que chama a classe que efetua a consulta
3-Esta classe armazena os dados em uma List (aí vem a primeira dúvida, a action que deve chamar a classe que efetua a pesquisa???)

public List selCidades() {
   ResultSet query = null;
   conn = Conexao.getConexao();
   List cidades = new ArrayList();
 
   String sql = "select * from cidade order by nome";
   try {
       pstmt = conn.prepareStatement(sql);
       query = pstmt.executeQuery();
       while (query.next())
       {
         ADOCidade ado = new ADOCidade();
         ado.setId_estado(query.getInt("id_estado"));
         ado.setNome(query.getString("nome"));
         cidades.add(ado);         
       }
       ... fecho o ResultSet e a conexao
   } catch (SQLException sqlex) {
     System.out.println("Erro ao capturar cidades:" + sqlex.getMessage());
   } 
   return cidades;
 }

aí vem a outra dúvida, como eu pego esta list e exibo em meu JSP???

Caso fique mais fácil onde eu consigo um exemplo de um JSP que envia os dados para o Controller (WebWork) existe uma consulta no banco de dados e retorna pro JSP???

[quote=“santoro”]Pessoal, estou tentando montar um exemplo simples em webwork, mas não estou conseguindo e não achei literatura que me ajudasse:

1-Tenho uma tela JSP com um formulário onde a pessoa informa um parâmetro para pesquisa
2-Isto é enviado a uma action, que chama a classe que efetua a consulta
3-Esta classe armazena os dados em uma List (aí vem a primeira dúvida, a action que deve chamar a classe que efetua a pesquisa???)

public List selCidades() {
   ResultSet query = null;
   conn = Conexao.getConexao();
   List cidades = new ArrayList();
 
   String sql = "select * from cidade order by nome";
   try {
       pstmt = conn.prepareStatement(sql);
       query = pstmt.executeQuery();
       while (query.next())
       {
         ADOCidade ado = new ADOCidade();
         ado.setId_estado(query.getInt("id_estado"));
         ado.setNome(query.getString("nome"));
         cidades.add(ado);         
       }
       ... fecho o ResultSet e a conexao
   } catch (SQLException sqlex) {
     System.out.println("Erro ao capturar cidades:" + sqlex.getMessage());
   } 
   return cidades;
 }

aí vem a outra dúvida, como eu pego esta list e exibo em meu JSP???

Caso fique mais fácil onde eu consigo um exemplo de um JSP que envia os dados para o Controller (WebWork) existe uma consulta no banco de dados e retorna pro JSP???[/quote]

Bom… seu jsp passa para a action um parâmetro para realizar uma consulta certo ?

Na sua Action realize uma chamada ao método selCidades();
e retorne o mesmo para o JSP…

[code]import com.opensymphony.xwork.ActionSupport;

public class HelloAction extends ActionSupport {

private List cidades;
   
public String execute() {

   seu_DAO consulta = new  seu_DAO();
   cidades = consulta.selCidades();

    return SUCCESS;

}

public List ListarCidades(){
    return cidades;
}

}[/code]

Caso retorne SUCESS o ww manda a List para o JSP…
basta que no xwork vc mapeie assim:

<action name="hello" class="HelloAction"> <result name="success" type="dispatcher">seu_jsp.jsp</result> </action>

E para exibir a List no JSP, você pode utilizar as tags do ww, JSTL ou ainda Velocity, pois o ww tem suporte nativo…

ww tags:

<ww:iterator value="cidades"> <li><ww:property/></li> </ww:iterator>

JSTL:

<c:forEach items="${cidades}" var="cid"> <li>${cid}</li> </c:forEach>

velocity:

#foreach($cid in $cidades) <li>$cid</li> #end

:wink:

Bom primeiro obrigado pela explicação, já clareou bem quanto ao conceito, fiz exatamente o que você me passou, e estou tentando escrever por JSTL

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

<c:forEach items="${cidades}" var="cid"> 
<c:out value='${cid.nome}'/>
</c:forEach>

infelizmente não aparece nada na tela, ele direciona para a página correta (SUCESS no action), mas não consigo imprimir os valores no jsp
tentei da maneira que você passou mas também não consegui

estava em dúvida se o meu JSTL estava configurado corretamente, então tentei

 <c:forEach var="i" begin="1" end="10">
 <LI><c:out value='${i}'/>
 </c:forEach>

e funcionou normalmente, logo, não estou conseguindo pegar o conteúdo da lista, fiz uma classe de teste e retornou os valores normalmente, não estou conseguindo capturar o que vem da Action

XWork <action name="controller" class="br.com.visualsystems.idm.ActionCidade"> <result name="success" type="dispatcher">sucesso.jsp</result> </action>

[code]Action
import com.opensymphony.xwork.ActionSupport;

public class ActionCidade extends ActionSupport {

private List cidades;

public String execute() throws Exception {

    ADOCidade c = new ADOCidade();
    setCidades(c.selCidades());
    return SUCCESS;
}

public List getCidades(){ 
  return cidades; 
} 

public void setCidades(List cidades){ 
    this.cidades = cidades;
} 

}
[/code]

[quote=“santoro”]Bom primeiro obrigado pela explicação, já clareou bem quanto ao conceito, fiz exatamente o que você me passou, e estou tentando escrever por JSTL

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

<c:forEach items="${cidades}" var="cid"> 
<c:out value='${cid.nome}'/>
</c:forEach>

infelizmente não aparece nada na tela, ele direciona para a página correta (SUCESS no action), mas não consigo imprimir os valores no jsp
tentei da maneira que você passou mas também não consegui

estava em dúvida se o meu JSTL estava configurado corretamente, então tentei

 <c:forEach var="i" begin="1" end="10">
 <LI><c:out value='${i}'/>
 </c:forEach>

e funcionou normalmente, logo, não estou conseguindo pegar o conteúdo da lista, fiz uma classe de teste e retornou os valores normalmente, não estou conseguindo capturar o que vem da Action

XWork <action name="controller" class="br.com.visualsystems.idm.ActionCidade"> <result name="success" type="dispatcher">sucesso.jsp</result> </action>

[code]Action
import com.opensymphony.xwork.ActionSupport;

public class ActionCidade extends ActionSupport {

private List cidades;

public String execute() throws Exception {

    ADOCidade c = new ADOCidade();
    setCidades(c.selCidades());
    return SUCCESS;
}

public List getCidades(){ 
  return cidades; 
} 

public void setCidades(List cidades){ 
    this.cidades = cidades;
} 

}
[/code][/quote]

Ok…
Tem certeza que o seu método que realiza a consulta está retornando algo ?

Você tentou colocar a action assim:

[code]import com.opensymphony.xwork.ActionSupport;

public class HelloAction extends ActionSupport {

private List cidades; 
    
public String execute() { 

   ADOCidade c = ADOCidade (); 
   cidades = c.selCidades(); 

    return SUCCESS; 

} 

public List getCidades(){ 
    return cidades; 
} 

}[/code]

???

:wink:

Realmente não está mostrando nada, mudei a Action conforme você falou e nada, para testar fiz o seguinte:

[code]
import java.util.List;
import java.util.ArrayList;
public class Teste {
public static void main(String[] args) {
ADOCidade c = new ADOCidade();
List l = new ArrayList();
try
{
l = c.selCidades();
Cidade cid;
for (int i = 0; i < l.size(); i++)
{
cid = (Cidade)l.get(i);
System.out.print(cid.getNome()+" - ");
System.out.println(cid.getId_estado());
}

&#125; catch&#40;Exception ex&#41;
&#123;
  System.out.print&#40;ex.getMessage&#40;&#41;&#41;;
&#125;

}
}[/code]

e imprimiu os valores normalmente.

já abusando da sua boa vontade, mas só me explica uma coisa, quando eu envio os dados para a Action ele utiliza os gets e sets para preecher os valores dos atributos automaticamente ok? Na realidade ela preenche apenas da minha classe Action ou ela preenche da classe Cidade também, estou perguntado por que no insert eu faria (na ADOCidade)

ins = &quot;insert into c...&quot;
Cidade c = new Cidade&#40;&#41;;
pstmt.setObject&#40;1, c.getNome&#40;&#41;&#41;;

se isso for fato no Action eu simplesmente chamaria Cidade.insert(); pois os valores já estariam estanciados, isto é correto???

Bom, já vi que não se popula atributos da classe automaticamente, mas aí vem a questão, se eu fizer um

Usuario usr = new Usuario&#40;&#41;;
usuario.insert&#40;id_usuario,nome&#41;;

Eu não estaria me amarrando muito as minhas actions?? meu método de insert não estaria mais parecendo uma função que um método de um objeto???

Ah, ainda continuo com a briga (como capturar os dados vindos do action no JSP).

Ele preenche desde que você tenha seus métodos get e set do seu objeto na Action…ou utilizar OGNL e ModelDriven!

OGNL na Action:

[code] public class PessoaAction extends ActionSupport {
private Pessoa pessoa = new Pessoa();

 public String execute&#40;&#41; throws Exception &#123;
     pessoa.setNome&#40;&quot;Guilherme&quot;&#41;;
     pessoa.setIdade&#40;19&#41;;
     return SUCCESS;
 &#125;

 public Pessoa getPessoa&#40;&#41; &#123;
     return pessoa;
 &#125;
 public void setPessoa&#40;Pessoa pessoa&#41; &#123;
     this.pessoa = pessoa;
 &#125;

}[/code]

Bean:

public class Pessoa implements Serializable &#123; private String nome; private Integer idade; // getters and setters &#125;

Form:

Nome&#58; &lt;ww&#58;property value=&quot;pessoa.nome&quot;/&gt; Idade&#58; &lt;ww&#58;property value=&quot;pessoa.idade&quot;/&gt;

Você diz amarrar: instânciar o usuário e persistir o mesmo na Action ???

:wink: