Struts - como passo informações de uma action para um JSP sem request.setAttribute

Pessoal, por favor me exclareçam uma dúvida…

Utilizando o Struts 1.3.8… quando eu preciso preencher um formulário em JSP e recuperar-lo em minha Action… utiliza-se um ActionForm…

pois bem… agora imaginando o contrário, ou seja… partindo de uma action, eu preciso preencher alguns campos em meu arquivo JSP… devo utilizar um ActionForm para realizar tal tarefa??

qual o procedimento ideal a ser realizado… já encontrei alguns exemplos que passam a informação por request.setAttibute… agora por eu estar utilizando o struts, não há alguma outra forma mais indicada??

Se não me engano você pode setar os campos no próprio form… setar no request que faria perder o sentido do struts…

Você pega o form geral e faz um cast para o form que está no contexto e seta o atributo com o o método set da classe… sako?

Vê ai, mas eu tenho quase certeza que é assim mesmo.

O forma mais correta é vc colocar no objeto request.setAttribute(“objeto”,objeto) e na JSP recuperar esse objeto
O principio do ActionForm e mapear somente os formulários do seu sistema

Uma dica é vc usar JSTL na JSP , o codigo fica mais limpo sem scriptlets


// Sua action
request.setAttribute("objeto",objeto);

Sua JSP
<c:out value="${objeto.nome}" />

Veja nesse link sobre JSTL-&gthttp://www.ucb.br/prg/professores/fgoulart/JSTL.pdf

Ramilani, ele quis dizer se ele preencher um actionForm e nao colocar o request.setAttribute(“objeto”,objeto); quando o action de o return mapping.findForward() o formulario no jsp sera preenchido com os valores…

Eu peguei uma custumizacao para um cliente novo, ele usa um framework feito em cima do struts 1.1.
Nao vi nenhum request.setAttribute(“objeto”,objeto); e tao pouco session.setAttribute(“objeto”,objeto);
O sistema todo preenche o action form e depois do return esta tudo no formulario jsp. Assim acho bem melhor tambem…

Como acabei pegando esse projeto para fazer, posso dizer que estou aprendendo struts agora e vejo o quanto o mesmo é improdutivel e mal programado(pelo, menos no 1.1) . O cliente fez um fork dele em cima do struts 1.1 que tem mais coisas que o 1.3.8(versao atual do struts) para facilitar o desenvolvimento…

Eu uso o ActionForm apenas para receber os dados da jsp.
Para “mandar” dados para a jsp eu prefiro colocar como atributo na requisição.

depois pego na jsp usando EL.

[quote=danisdb]Se não me engano você pode setar os campos no próprio form… setar no request que faria perder o sentido do struts…

Você pega o form geral e faz um cast para o form que está no contexto e seta o atributo com o o método set da classe… sako?

Vê ai, mas eu tenho quase certeza que é assim mesmo.[/quote]

Interessante, eu também faço isso, mas tenho ouvido algumas pessoas, inclusive empresa onde trabalho, falando que não é legal colocar no ActionForm, deve ser feito direto no request. Por exemplo, se preciso listar objetos da classe Pessoa na JSP, eu crio no ActionForm um atributo List pessoas. Sinceramente, eu não consigo ver problema nisso, eu gosto dessa abordagem pois eu tenho um controle maior do que é utilizado na tela, basta olhar o ActionForm. Talvez esse argumento não seja tão bom para quem usa Action, mas utilizando LookupDispatchAction é legal.

E então, qual o problema de colocar os atributos que não são parte do form no ActionForm?

abraços a todos!

[quote=afsrj]Ramilani, ele quis dizer se ele preencher um actionForm e nao colocar o request.setAttribute(“objeto”,objeto); quando o action de o return mapping.findForward() o formulario no jsp sera preenchido com os valores…

Eu peguei uma custumizacao para um cliente novo, ele usa um framework feito em cima do struts 1.1.
Nao vi nenhum request.setAttribute(“objeto”,objeto); e tao pouco session.setAttribute(“objeto”,objeto);
O sistema todo preenche o action form e depois do return esta tudo no formulario jsp. Assim acho bem melhor tambem…

Como acabei pegando esse projeto para fazer, posso dizer que estou aprendendo struts agora e vejo o quanto o mesmo é improdutivel e mal programado(pelo, menos no 1.1) . O cliente fez um fork dele em cima do struts 1.1 que tem mais coisas que o 1.3.8(versao atual do struts) para facilitar o desenvolvimento…

[/quote]

Ele não disse isso, ele quer o processo contrário da Action preencher os da pagina HTML

// tags do HTML do Struts
<html:text property="nome" value="<c:out value=${objeto.nome}/>" />

Lembrando que property=" nome" é igual ao atributo nome do ActionForm

Da mesma forma que você usa para pegar os dados usando o ActionForm, você pode enviar os dados também usando o ActionForm.
Um exemplo simples abaixo, tem 1 pagina (index.jsp) com os dados de entrada, depois que der o submit, a Action irá transformar os campos em maiusculas e apresentar ele em uma segunda pagina (test.jsp).

index.jsp

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt; &lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%&gt; &lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%&gt; &lt;html:html&gt; &lt;TITLE&gt;First form&lt;/TITLE&gt; &lt;/HEAD&gt; &lt;BODY&gt; &lt;h2&gt;Input Form&lt;/h2&gt; &lt;html:form action="/testAction"&gt; Nome: &lt;html:text property="nome" /&gt; <br /> Endereço: &lt;html:text property="endereco" /&gt; <br /> &lt;html:submit value="Submit" /&gt; &lt;/html:form&gt; &lt;/BODY&gt; &lt;/html:html&gt;

ActionForm

public class TestForm extends ActionForm {
    
    private String nome;
    private String endereco;
   //getters and setters

Action

[code]/*

  • Created on May 16, 2007
    */
    package br.com.guj.actions;

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

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import br.com.guj.forms.TestForm;

/**

  • @author Jair Rillo Junior
    */
    public class TestAction extends Action {

    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
    //–pega valores do form–//
    TestForm testForm = (TestForm) form;
    //–altera os valores do Bean para maiusculas–//
    testForm.setNome(testForm.getNome().toUpperCase());
    testForm.setEndereco(testForm.getEndereco().toUpperCase());
    //–Retorna os dados para o form–//
    form = (ActionForm) testForm;

     return mapping.findForward("success");
    

    }
    }
    [/code]

struts-config.xml

	&lt;!-- Action Mappings --&gt;
	&lt;action-mappings&gt;
		&lt;action path="/testAction" type="br.com.guj.actions.TestAction" name="testForm" scope="request"&gt;
			&lt;forward name="success" path="/test.jsp"&gt;
			&lt;/forward&gt;

		&lt;/action&gt;
	&lt;/action-mappings&gt;

test.jsp

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt; &lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%&gt; &lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%&gt; &lt;html:html&gt; &lt;TITLE&gt;First form&lt;/TITLE&gt; &lt;/HEAD&gt; &lt;BODY&gt; &lt;h2&gt;Output form&lt;/h2&gt; &lt;html:form action="/testAction"&gt; Nome: &lt;html:text property="nome" /&gt; <br /> Endereço: &lt;html:text property="endereco" /&gt; <br /> &lt;html:submit value="Submit" /&gt; &lt;/html:form&gt; &lt;/BODY&gt; &lt;/html:html&gt;

Espero que o exemplo acima te ajude.
Agora se você estiver começando uma aplicação do zero, aconselho voc6e estudar uma outra framework MVC (Struts 2, Mentawai, VRaptor2, SpringMVC) que com elas esse processo é BEM mais simples

Se os campos que ele diz são campos do form, sem dúvida a resposta é sim, deve utilizar o ActionForm. :slight_smile:

Eu acabei aproveitando pra falar de outra coisa, hehe, acho que vou criar um tópico.

abraços,

Só para completar o ótimo exemplo do Manchester:

no struts config tbm tem que declarar o form com o nome de acordo com o nome q ele usou no mapeamento da action.

&lt;!-- Action Forms --&gt;
&lt;form-beans&gt;
    &lt;form-bean name="testForm" type="br.com.guj.form.TestForm"&gt;&lt;/form-bean&gt;
&lt;/form-beans&gt;