Struts: Criar formulário de edição

6 respostas
trevezani

Ola amigos,

Sou novato no Struts e não estou conseguindo achar nenhuma informação de como faço para preencher os meus campos do meu formulário com as informações recuperadas do banco. Meu formulário está cadastrando corretamente só que eu não sei como, por exemplo, preencher meu campo nome com o nome que está no banco. Já recuperei o objeto só que não sei como acessar o campo. Atravês do meu Action eu posso acessar o ActonForm e executar o setNome()? Como faço isso?

Campo nome no meu JSP

<html:text property="nome" size="50"/>

Alguem poderia me ajudar?

[],s

6 Respostas

Fox_McCloud

Como você fez o cadastro? pegou os dados do form através de um método em uma classe Action? Porque nesse caso é só você fazer o caminho inverso.

Dentro da Action você tem o método actionForward(), que recebe os seguintes parâmetros:

ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response

Então se você tem a Action, o bean e o <form-bean/> configurado no struts-config.xml, uma vez com os dados é só, dentro do seu método actionForward(), fazer o seguinte:

BeanUtils.copyProperties(form, bean);

E então terá copiado os dados do bean para o form; depois dê um mapping.findForward(“forward-name”) que irá redirecionar o navegador para a página jsp especificada no <forward/> dentro da <action/> configurada no struts-config.xml, e quando a página carregar os dados já estarão no form.

Lembrando que o Struts não acessa os campos do seu bean, e é ideal que sejam private para manter o encapsulamento. O Struts obtém os dados através dos métodos get de cada campo, e os modifica através dos métodos set.

Essa parte do form-bean no struts-config.xml e copiar do form pro bean e depois do bean pro form é o tal do “problema de elegância” do Struts. Na época, quando não haviam formas melhores bem modeladas, foi uma grande idéia, mas agora, no Java Server Faces, por exemplo, você consegue passar os dados da página direto pro bean, sem esse objeto do tipo Form intermediário. Existe apenas um xml de configuração para especificar quais são os beans existentes, por motivos de segurança.

Entretanto, na minha opinião pessoal isso não chega a desmerecer o Struts. Um sistema bem configurado feito em Struts pode ser extpandido e mantido com muita facilidade, fornecendo todo tipo de utilidades. O detalhe é que pra tirar o máximo é preciso estudar o que existe no Struts. Soluções menores servirão pra te obrigar a “reinventar a roda” a cada nova necessidade, o Struts já tem muita coisa pensada.

Mas o Java Server Faces é mais bem bolado, claro, tem na sua equipe de desenvolvimento a mesma pessoa que criou o Struts, mas agora mais experiente com o aprendizado dos pontos fortes e fracos do Struts. Vale a pena investir em JSF.

trevezani

Não conseguir intender como usaria este código. Irei colocar meus fontes para você dar uma olhada. Meu formulário é chamado atraves do preencheCadastroAluno.

struts-config

...
    <form-beans>
        
        <form-bean name="formCadastroAluno" 
                   type="com.exemplo.struts.forms.formCadastroAluno"/>    

    </form-beans>
...

        <action 
            path="/preencheCadastroAluno"
            type="com.exemplo.struts.actions.actionFormCadastroAluno">
        
            <forward 
                 name="cadastroAluno" 
                 path="/jsp/cadastroAluno.jsp"/>
                 
        </action>

        <action 
            path="/processaCadastroAluno" 
            type="com.exemplo.struts.actions.actionCadastroAluno"
            name="formCadastroAluno" 
            scope="request" 
            validate="true"
            input="/jsp/cadastroAluno.jsp">
        
            <forward 
                 name="sucesso" 
                 path="/index.jsp"/>
                 
        </action>

    </action-mappings>
...

actionFormCadastroAluno: Action que “preenche” meu formulário

...

    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        try {
            FachadaModelo fachada  = FachadaModelo.getInstance();
            Vector cursos      = fachada.getCursos();
            
            request.getSession(true).setAttribute("listaCursos", cursos);
            
            return mapping.findForward("cadastroAluno");
        } catch (SQLException e) {
            ActionMessages erros  = new ActionErrors();
            
            erros.add( ActionErrors.GLOBAL_MESSAGE, new ActionMessage("errors.sqlerror") );
            saveErrors(request, erros);
            
            return mapping.findForward("excecoes");
        }
        
    }

JSP

<html:form action="processaCadastroAluno" focus="codigo">
    <h2>Cadastro de aluno</h2>
    
    <table>
      <tr>
        <td>Matrícula:</td>
        <td>
          <html:text property="matricula" size="20"/>
        </td>
      </tr>
      
      <tr>
        <td>Nome:</td>
        <td>
          <html:text property="nome" size="50"/>
        </td>
      </tr>

      <tr>
        <td></td>
        <td align="right">
          <html:submit/><html:reset/>
        </td>
      </tr>
      
      <tr>
        <td></td>
        <td>
          <br/>
          <html:errors/>
        </td>
      </tr>
    </table>
  </html:form>
</body>

formCadastroAluno: ActionForm

public class formCadastroAluno extends org.apache.struts.action.ActionForm {
    private int    codigo;
    private String matricula;
    private String nome;
    private String curso;
    
    public formCadastroAluno() {
        this.codigo    = 0;
        this.matricula = "";
        this.nome      = "";
        this.curso     = "";
    }
    
    
    /**
     * @param string
     */
    public void setCodigo(int Codigo) {
        this.codigo = Codigo;
    }
    
    /**
     * @return
     */
    public int getCodigo() {
        return this.codigo;
    }

    /**
     * @param string
     */
    public void setMatricula(String Matricula) {
        this.matricula = Matricula;
    }
    
   
    /**
     * @return
     */
    public String getMatricula() {
        return this.matricula;
    }
    
    
    /**
     * @param string
     */
    public void setNome(String Nome) {
        this.nome = Nome;
    }
    
   
    /**
     * @return
     */
    public String getNome() {
        return this.nome;
    }
    
    /**
     * @param string
     */
    public void setCurso(String Curso) {
        this.curso = Curso;
    }
    
   
    /**
     * @return
     */
    public String getCurso() {
        return this.curso;
    }

  public void reset(ActionMapping mapping, HttpServletRequest request) {
    int    codigo    = 0;
    String matricula = "";
    String nome      = "";
    String curso     = "";
  }
}

Eu acho que no actionFormCadastroAluno deveria ser feito o preenchimento do formulário, só que eu não estou sabendo fazer. Como faço?

[],s

Fox_McCloud

Deixa eu ver se eu entendi:

Você está tentando preencher um form com uma lista de dados?

trevezani

Gostaria de atravês do Action preencher os campos do formulário. Por exemplo preencher o nome e a matricula do aluno.

=)

Fox_McCloud

Olha só… estou com trabalho acumulado e tenho provas essa semana…
Assim que eu tiver um tempinho livre te respondo isso melhor!
Enquanto isso, dê uma fuçada em outros tipos de Actions (DispatchActionHelper)…

R
Caro trevezani, tb sou novato em Java, mas acho que poderei te dar uma dica. Bom vou tentar te explicar, mas não sei se vou conseguir, mas vamos la. Através de um Action, você pode alimentar um JavaBean com as informações do aluno e passar o JavaBean como atributo pra uma nova JSP, ou seja voce teria que criar uma JSP apenas para mostrar os dados do aluno utilizando ainda javascript.

1 - seleciona dados no banco

2 - atribui os dados do banco no bean, por exemplo, bean.setnome(campo_nome)

3 - depois, request.setattribute(“beanAluno”, bean)

4 - na nova jsp vc teria algo do tipo:

// aqui vc declara que vai utilizar o bean que vc alimentou no Action

<jsp:useBean id=“beanAluno” class=“AlunoBean” scope=“session”/>

<%

String nomeDoAluno = beanAluno.getnome();

%>

// Usando javascript, vc atribui ao componente input o nome do aluno
function setaNome { document.formulario.inlNome.value = "<%=nomeDoAluno%>"; } // aqui é componente propriamente dito, seria um Edit Bom, tenta dar uma entendida, senão eu tento explicar de uma outra forma. Flw
Criado 30 de março de 2006
Ultima resposta 12 de jun. de 2008
Respostas 6
Participantes 3