Dois Formulários Ajax com Struts 2

Olá galera,
Estou com um problema e preciso usar Struts 2…
Preciso (através de Ajax), cadastrar uma pessoa em qualquer um dos formulários e atualializar sua respectiva lista na página. Alguém pode me ajudar?

PS: Também preciso utilizar a mesma Action. Que já está toda mapeada e configurada, o problema é apenas a inserção (pegando os dados do formulário) e a atualização (ajax) da lista.

Action “pessoasAction”:

@Results({ 
	@Result(name = PessoasAction.SUCCESS, value = "pessoasAction.init", type = TilesResult.class)
})
@ResultInputs({ @ResultInput(name = PessoasAction.SUCCESS, method = "init") })
@ParentPackage("struts-app-view")
public Class PessoasAction() {

	private static final long serialVersionUID = 1L;
	protected static final String SUCCESS = "SUCCESS";
	
	private HttpSession session;
	
	PessoaMagra pessoaMagra;
	PessoaGorda pessoaGorda;

	List<PessoaMagra> listaPessoasMagras;
	List<PessoaMagra> listaPessoasGordas;


	public String init() {
		carregarListaPessoasMagras();
		return SUCCESS;
	}
	
	private void carregarListaPessoasMagras() {
		session = getRequest().getSession();
		
		if (session.getAttribute("listaPessoasMagras") == null) {
			listaPessoasMagras = new PessoaMagraService().findAll();
			
			session.setAttribute("listaPessoasMagras", listaPessoasMagras);
		} else {
			listaPessoasMagras = (List<PessoaMagra>) session.getAttribute("listaPessoasMagras");
		}
	}
	
	private void carregarListaPessoasGordas() {
		session = getRequest().getSession();
		
		if (session.getAttribute("listaPessoasGordas") == null) {
			listaPessoasGordas = new PessoaGordaService().findAll();
			
			session.setAttribute("listaPessoasGordas", listaPessoasGordas);
		} else {
			listaPessoasGordas = (List<PessoaGorda>) session.getAttribute("listaPessoasGordas");
		}
	}
	
	public String removerPessoaMagra() {	
		session = getRequest().getSession();
		
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get( ServletActionContext.HTTP_REQUEST);
		
		String idString = request.getParameter("id");
		
		PessoaMagra pessoaMagra = new PessoaMagraService().findById(Long.parseLong(idString));
		
		listaPessoasMagras = (List<PessoaMagra>) session.getAttribute("listaPessoasMagras");
		
		listaPessoasMagras.remove(pessoaMagra);
		
		session.setAttribute("listaPessoasMagras", listaPessoasMagras);
		
		return SUCCESS;
	}
	
	public String removerPessoaGorda() {	
		session = getRequest().getSession();
		
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get( ServletActionContext.HTTP_REQUEST);
		
		String idString = request.getParameter("id");
		
		PessoaMagra pessoaGorda = new PessoaMGordaService().findById(Long.parseLong(idString));
		
		listaPessoasGordas = (List<PessoaGordas>) session.getAttribute("listaPessoasGordas");
		
		listaPessoasGordas.remove(pessoaGorda);
		
		session.setAttribute("listaPessoasGordas", listaPessoasGordas);
		
		return SUCCESS;
	}
	
	public String inserirPessoaMagra() {
		//AQUI ESTÁ O PROBLEMA
	}
	
	public String inserirPessoaGorda() {
		//AQUI ESTÁ O PROBLEMA
	}
}

Página:

<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
	<body>
		<div id="divPessoaMagra">
			<s:form id="formPessoaMagra">
				<s:textField name="pessoaMagra.nome">
				<s:textField name="pessoaMagra.idade">
				<s:submit value="Cadastrar">
			</s:form>
			<table id="listapessoasMagras" class="grid">
				<thead>
					<tr>
						<th><label>Nome</label></th>
						<th><label>Idade</label></th>
						<th></th>
					</tr>
				</thead>
				<tbody>
				<s:iterator value="listaPessoasMagras" var="pessoaMagra">
					<tr id="${id}">
						<td><s:property value="nome" /></td>
						<td><s:property value="idade" /></td>
						<td><a href='#' onclick="excluirPessoaMagra('${id}');">Excluir</a></td>
					</tr>
				</s:iterator>
				</tbody>
			</table>
		</div>
		<div id="divPessoaGorda">
			<s:form id="formPessoaGorda">
				<s:textField name="pessoaGorda.nome">
				<s:textField name="pessoaGorda.idade">
				<s:submit value="Cadastrar">
			</s:form>
			<table id="listapessoasGordas" class="grid">
				<thead>
					<tr>
						<th><label>Nome</label></th>
						<th><label>Idade</label></th>
						<th></th>
					</tr>
				</thead>
				<tbody>
				<s:iterator value="listaPessoasGordas" var="pessoaGorda">
					<tr id="${id}">
						<td><s:property value="nome" /></td>
						<td><s:property value="idade" /></td>
						<td><a href='#' onclick="excluirPessoaGorda('${id}');">Excluir</a></td>
					</tr>
				</s:iterator>
				</tbody>
			</table>
		</div>
		<script>
		function excluirPessoaGorda(id) {
			if (confirm("Tem certeza que deseja excluir esta pessoa?")) {
				var acao = '/teste/pessoasAction!removerPessoaGorda.action';
				var tr = jQuery("#" + id);
				var dados = 'id=' + id;
				jQuery.ajax({
					cache : false,
					type : 'GET',
					cache : false,
					url : acao,
					data : dados,
					success : function(data) {
						tr.remove();
					},
					error : function() {
						alert('Não foi possível excluir a pessoa.');
					}
				});
			}
		}
		function excluirPessoaMagra(id) {
			if (confirm("Tem certeza que deseja excluir esta pessoa?")) {
				var acao = '/teste/pessoasAction!removerPessoaMagra.action';
				var tr = jQuery("#" + id);
				var dados = 'id=' + id;
				jQuery.ajax({
					cache : false,
					type : 'GET',
					cache : false,
					url : acao,
					data : dados,
					success : function(data) {
						tr.remove();
					},
					error : function() {
						alert('Não foi possível excluir a pessoa.');
					}
				});
			}
		}
	</script>
	</body>
</html>

Desde já agradeço!

Caso você não estivesse usando tiles, iria sugerir que utilizasse o plugin json.
Vamos por partes, você chega até a action? Ocorre algum erro (no java ou no javascript)?

[quote=drsmachado]Caso você não estivesse usando tiles, iria sugerir que utilizasse o plugin json.
Vamos por partes, você chega até a action? Ocorre algum erro (no java ou no javascript)?[/quote]

eu não coloquei ai, mas fiz um script usando ajax(jquery) para a inserção, o método é chamado, porém o objeto da action não é populado com os valores dos campos…

Então coloca ai.

jQuery('#submitPessoaMagra').click(function(){
			jQuery.ajax({
				type : 'POST',
				url : '/teste/pessoasAction!inserirPessoaMagra.action',
				data : jQuery('#formPessoaMagra').serialize(),
				success : function(data) {
					jQuery('#listaPessoasMagras').last().append(data);
				},
				error : function() {
					alert('Não foi possível adicionar o item.');
				}
			});
			return false;
		});

Suponha que os ID’s já estejam corretamente inseridos. Eu consigo chegar no método, só não consigo popular os objetos… O retorno(linha na tabela) já tratei tbm, “só” falta a ALMA…

O problema é que você não submete o formulário.
Você faz uma requisição post, mas não passa os parâmetros da requisição, desta forma, os valores serão nulos na action.

[quote=drsmachado]O problema é que você não submete o formulário.
Você faz uma requisição post, mas não passa os parâmetros da requisição, desta forma, os valores serão nulos na action.[/quote]

essa linha não faz isso? “data : jQuery(’#formPessoaMagra’).serialize()”

o que mais eu preciso fazer pra submeter o form?

Ler a documentação, não né?
Aqui diz o que .serialize() faz.
Aliás, você já brincou de serializar objetos java?
Aqui você tem mais informações sobre realizar o submit.
Eu, particularmente, faria o seguinte, obteria todas os parâmetros na função javascript e, então, criaria a url para requisição. Lógico, se isso não fosse um caso de login, como não parece ser, ou se os dados não tivessem a necessidade de garantir securidade.
Por exemplo, vamos imaginar que tenho os parâmetros nome e idade.

jQuery('#submitPessoaMagra').click(function(){  
			var nome = "pessoa.nome=" + $("#nome").val();
			var idade = "pessoa.idade=" + $("#idade").val();
            jQuery.ajax({  
                type : 'POST',  
                url : '/teste/pessoasAction!inserirPessoaMagra.action?' + nome + '&' + idade,  
                data : jQuery('#formPessoaMagra').serialize(),  
                success : function(data) {  
                    jQuery('#listaPessoasMagras').last().append(data);  
                },  
                error : function() {  
                    alert('Não foi possível adicionar o item.');  
                }  
            });  
            return false;  
        });

Neste caso, eu enviaria os parâmetros nome e idade, do objeto pessoa, sem problemas.

[quote=drsmachado]Ler a documentação, não né?
Aqui diz o que .serialize() faz.
Aliás, você já brincou de serializar objetos java?
Aqui você tem mais informações sobre realizar o submit.
Eu, particularmente, faria o seguinte, obteria todas os parâmetros na função javascript e, então, criaria a url para requisição. Lógico, se isso não fosse um caso de login, como não parece ser, ou se os dados não tivessem a necessidade de garantir securidade.
Por exemplo, vamos imaginar que tenho os parâmetros nome e idade.

jQuery('#submitPessoaMagra').click(function(){  
			var nome = "pessoa.nome=" + $("#nome").val();
			var idade = "pessoa.idade=" + $("#idade").val();
            jQuery.ajax({  
                type : 'POST',  
                url : '/teste/pessoasAction!inserirPessoaMagra.action?' + nome + '&' + idade,  
                data : jQuery('#formPessoaMagra').serialize(),  
                success : function(data) {  
                    jQuery('#listaPessoasMagras').last().append(data);  
                },  
                error : function() {  
                    alert('Não foi possível adicionar o item.');  
                }  
            });  
            return false;  
        });

Neste caso, eu enviaria os parâmetros nome e idade, do objeto pessoa, sem problemas.[/quote]

agradeço pelas dicas, o serialize apenas pega o “name” dos atributos e adiciona o valor em uma String. Apenas simplifica o que a gente pode fazer "na mão"
consegui mandar os dados, o problema é que o serialize não está sendo gerado. o que pode estar acontecendo de errado com o formulário?

Camarada, jQuery não é meu forte.
Pelo que entendi, a serialização é feita a partir de um form. A tag <s:form> do Struts 2 possui um atributo chamado id. Logo, ao invés de você tentar serializar o teu div formPessoaMagra (isso é preconceito, não?), por que não define um id para o form e tenta serializar o mesmo?

[quote=drsmachado]Camarada, jQuery não é meu forte.
Pelo que entendi, a serialização é feita a partir de um form. A tag <s:form> do Struts 2 possui um atributo chamado id. Logo, ao invés de você tentar serializar o teu div formPessoaMagra (isso é preconceito, não?), por que não define um id para o form e tenta serializar o mesmo?[/quote]

foi exatamente o que eu fiz… :s

é que criei esse exemplo rapidamente rsrs

coloquei a div = #divPessoaMagra
e o form = #formPessoaMagra

É, se foi isso, então foge dos meus conhecimentos.