Struts 2 + JQuery Ajax + Annotations

8 respostas
I

Pessoal, penei muito para encontrar a solução para um problema simples :

Criar uma Action no Struts 2 que respondesse a uma requisição ajax do JQuery
sem usar XML de configuração do Struts, apenas as anotações ( considerando as configurações padrão, é claro ).

Em toda a internet parece que dão mais valor para as configurações pelo XML,
mas a despeito de filosofar sobre vantagens e desvantagens, aí vai a minha maneira
de resolver o problema:

Objetivo : digitar algo em um campo texto e uma ajuda aparecer em uma div.

Na página HTML:

<div style="color: #666666; float:right; width:70%; height:33px" class="helper_result"></div>

<input class="helper_ajax" id="icmn_mensagem" />

No arquivo de script:

$(".helper_ajax").keyup(function() {
		  var idhelper = $(this).attr("id");
		  $.post('ajaxHelper', { "id_helper": idhelper } , function(data) {
			  $('.helper_result').html(data);
		  });
	});

A Action Struts 2 :

package casnav.projeto.action;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.StrutsStatics;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionContext;

@Action(value="ajaxHelper", results= {  
	    @Result(name="ok", type="httpheader", params={"status", "200"})  
})  

@ParentPackage("default")
public class HelperAjaxAction  {
	public String execute(){
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);  

		String id_helper = request.getParameter("id_helper");

		try { 
			((HttpServletResponse)ActionContext.getContext().get(StrutsStatics.HTTP_RESPONSE)).getWriter().write("Teste de help : " + id_helper);  
		} catch (IOException ex) {  
			System.out.println("[HelperAjax] Erro respondendo AJAX."); 
		}
		return "ok";
	}
		

}

Espero que ajude.

EDIT : Corrigir erros de português.

8 Respostas

D

Juro que perdi determinados tempos tentando entender o fundamento deste tópico.
Enfim, é uma saída bem interessante.

I

drsmachado:
Juro que perdi determinados tempos tentando entender o fundamento deste tópico.
Enfim, é uma saída bem interessante.

Ahahah …
Bom, deve ser pq não perguntei, só dei a resposta.

Confesso que isso é uma coisa muito básica que tem soluções aos montes, mas o
projeto não usa XML para configurar as Actions e meu problema era esse…
tinha que usar anotações na própria action. Como sou novato no Struts, não sei ainda
adaptar o que é mostrado como configuração XML para a anotação.

Além disso, o parâmetro não tava sendo passado para a Action pela maneira usual, ou seja,
pelo setter da classe, apesar de ter sido passado pelo POST do Jquery no javascript.

Também não tava devolvendo a variável de retorno, mesmo colocando :

...
private String retorno;

getter / setter 

public String execute(){
    ...
    this.retorno = "Alo mundo";
    ...
    return "ok";
}
...

Dessa forma, “data” retornava vazio em :

$.post('ajaxHelper', { "id_helper": idhelper } , function(data) {
        $('.helper_result').html(data);
});

Tentei usar data.retorno mas veio “indefinido”.

esse é o motivo da epopéia com o HttpServletResponse e o HttpServletRequest … :wink:

D

Então por que raios você não usa o struts2-jquery-plugin?
Ele abstrai toda esta estrutura de ajax para ti.
No site do projeto existem alguns exemplo que, ao meu ver, são fantásticos.

I

drsmachado:
Então por que raios você não usa o struts2-jquery-plugin?
Ele abstrai toda esta estrutura de ajax para ti.
No site do projeto existem alguns exemplo que, ao meu ver, são fantásticos.

Sim sim … eu cheguei até a ver alguns posts e fui no site.

Só que o incêndio tava em proporções homéricas e a urgência falou mais alto.
Tinha que fazer o OnHover no input box do html … e precisei do Jquery.
Como essa parte é só CTRL+C e CTRL+V com o que já tava pronto … fui nessa mesmo.

Agora com calma vou fazer isso que vc falou.

Valeu !!!

D

O grande problema de começar a procedimentos técnicos não homologados (vulgo gambiarra) é esse.
Dois trabalhos.

I

drsmachado:
O grande problema de começar a procedimentos técnicos não homologados (vulgo gambiarra) é esse.
Dois trabalhos.

“procedimentos técnicos não homologados” foi ótimo !!!

Perdão por quebrar um paradigma importantíssimo ao usar minha solução para o problema.

I

Todos os exemplos que eu vi mostravam links que precisavam serem CLICADOS
para dar início ao processo, como

<sj:a id="link1" href="%{ajaxTest}" targets="div1, div2"  effect="highlight" effectOptions="{ color : '#222222' }" effectDuration="3000">
      Update Content
</sj:a>

ou

<sj:a formId="form" targets="div1">Submit form</sj:a>

Você sabe onde encontro exemplos de como amarrar isso no evento “Hover” do elemento?
Pensei em chamar $("#link1").click() no Hover mas vira “procedimento técnico não homologado” …

O objetivo é :

$(".helper_ajax").hover(function() {
		  var idhelper = $(this).attr("id");
		  $.post('ajaxHelper', { "id_helper": idhelper } , function(data) {
			  $('.helper_result').html(data);
		  });
	}, function(){
		 $('.helper_result').html("");
    });
I

Bom, como não houve resposta para minha dúvida sobre o struts2-jquery-plugin, acredito que meu “procedimento não homologado” foi de longe o mais rápido, eficiente, o que demandou menos agregação de bibliotecas ao projeto e o mais flexível. Sem falar que é mais compreensível e fácil de dar manutenção, visto que é uma action comum do struts.

Pena que é uma gambiarra …

Ao MODERADOR, acho que pode fechar o tópico.

[SOLVED]

Abraço a todos.

Criado 31 de agosto de 2012
Ultima resposta 14 de set. de 2012
Respostas 8
Participantes 2