Struts não chama o input definido quando ocorre problema na validação

8 respostas
ekszuki

Olá pessoal, não sei mais o que fazer para solucionar este probleam…

Quando o usuario clica no submit do meu formulario o struts executa o método validade, mas se ocorreu algum problema ele não esta chamando o formulário definido no input…

Não sei mais o que fazer :?:

Segue os trechos do código…

em Menu.jsp

-- <html:link page="/FRastreador.jsp" target="right">
 --  <font size="2" face="Verdana, Arial, Helvetica, sans-serif">
 --           <bean:message key="mainMenu.registrarRastreador"/>
 --   </font>
 -- </html:link>

strutus_config

-- <form-bean  name="rastreadorForm" 
----           type="br.com.usialto.form.RastreadorForm"/>

-- <action path="/insertRastreador" 
 --          type="br.com.teste.action.insertRastreadorAction" 
 --          name="rastreadorForm" scope="request" validate="true" input="/FRastreador.jsp">
-- </action>

Font da Classe RastreadorForm

package br.com.teste.form;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class RastreadorForm extends ActionForm {
	private String CPF = null ; 
	private String NOME = null ;
	private String TELEFONE = null ;
	private String CELULAR = null ;
	private String EMAIL = null ;

	/*
	 *    Definição dos Métodos get 
	 */

	public String getCPF () { 
		return this.CPF;
	}
	public String getNOME () {
		return this.NOME;
	}
	public String getTELEFONE () {
		return this.TELEFONE;
	}
	public String getCELULAR () {
		return this.CELULAR;
	}
	public String getEMAIL () {
		return this.EMAIL;
	}
	
	/*
	 *    Definição dos Métodos set 
	 */
	
	public void setCPF ( String Dados )  { 
		 this.CPF = Dados ;
	}
	public void setNOME ( String Dados )  {
		 this.NOME = Dados ;
	}
	public void setTELEFONE ( String Dados )  {
		 this.TELEFONE = Dados ;
	}
	public void setCELULAR ( String Dados )  {
		 this.CELULAR = Dados ;
	}
	public void setEMAIL ( String Dados )  {
		 this.EMAIL = Dados ;
	}
	
	public void reset(ActionMapping mapping, HttpServletRequest request) {
		this.CPF = null ; 
		this.NOME = null ;
		this.TELEFONE = null ;
		this.CELULAR = null ;
		this.EMAIL = null ;		
	}
	
    public ActionErrors validate( ActionMapping mapping, HttpServletRequest request) {
       ActionErrors errors = new ActionErrors();
       
                  /*  forçando o acontecimento do erro */
         	  errors.add("CPF", new ActionError("Erro ao validar o CPF"));
           
	      return errors;
	   }
}

Código da Classe insertRastreadorAction que ainda não esta fazendo nada somente of forward

package br.com.teste.action;

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


import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionErrors;

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

public class insertRastreadorAction extends Action {

	public ActionForward execute(ActionMapping mapping, 
    		ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
    throws Exception {
		if ( isCancelled( request ) ) {
		   removeFormBean( mapping, request );	
		}
		
		return mapping.findForward("success");
    }
	
    protected void removeFormBean(ActionMapping mapping, HttpServletRequest request) {
        // Remove the obsolete form bean
        if (mapping.getAttribute() != null) {
            if ("request".equals(mapping.getScope())) {
                request.removeAttribute(mapping.getAttribute());
            } else {
               HttpSession session = request.getSession();
               session.removeAttribute(mapping.getAttribute());
            }
        }	
    }

}

Arquivo FRastreador.jsp

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<jsp:useBean id="constantes" class="br.com.teste.constantes.Constants" scope="session"/>

<!-- Verifica se o usuário está logado no sistema -->
<logic:notPresent name="<%=constantes.USER_KEY%>" scope="session">
  <jsp:forward page="/error.jsp" /> 
</logic:notPresent>

<html:html>
<head>

<title><bean:message key="pedidoForm.title"/></title>
<html:base/>
</head>
<body bgcolor="white"> 

  <html:form action="/insertRastreador.do"">

     <%-- exibe os erros de validação --%>
     <h5><html:errors/></h5>
 
     <table border="0" width="100%">
     <tr>
        <td align="left">
            <bean:message key="prompt.CPF"/>
            <html:text property="CPF" name="rastreadorForm" size="11" maxlength="11"/>
        </td>
     </tr>

  <tr>
    <th align="center">
      <html:submit>
        <bean:message key="button.confirm"/>
      </html:submit>
      <html:reset>
         <bean:message key="button.reset"/>
      </html:reset>
      <html:cancel>
         <bean:message key="button.cancel"/>
      </html:cancel>
      
    </th>
  </tr>
     </table>
 
  </html:form>
  
  
</html:html>

e Por fim o arquivo validation.xml obs.:: em javascript a validação esta funcionando…

<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
   <formset>
      <form name="rastreadorForm">
         <field property="CPF" depends="required,mask,minlength">
         	     <arg0 key="prompt.CPF" />
         	     <arg1 name="minlength" key="${var:minlength}" resource="false" />
                     <var>
                       <var-name>mask</var-name>
                       <var-value>^[0-9]+$</var-value>
                     </var>
                     <var>
                       <var-name>minlength</var-name>
                       <var-value>11</var-value>
                     </var>
         </field>
      </form>
   </formset>
</form-validation>

Ao inves de chamar o input ele simplemente gera uma pagina em branco…

Eu já Li e Reli e não sei onde esta o erro…
Comparei com o exemplo que exite no proprio struts e não encontrei o erro, se alguem puder me dar uma força…

Valeu

8 Respostas

ekszuki

em Menu.jsp

&lt;html:link page="/FRastreador.jsp" target="right"&gt;
           &lt;bean:message key="mainMenu.registrarRastreador"/&gt;
 &lt;/html:link&gt;

strutus_config

&lt;form-bean  name="rastreadorForm" 
           type="br.com.teste.form.RastreadorForm"/&gt;

 &lt;action path="/insertRastreador" 
          type="br.com.teste.action.insertRastreadorAction" 
          name="rastreadorForm" scope="request" validate="true" input="/FRastreador.jsp"&gt;
&lt;/action&gt;

FRastreador.jsp

&lt;html:form action="/insertRastre.do""&gt;
     &lt;%-- exibe os erros de validação --%&gt;

     &lt;h5&gt;&lt;html:errors/&gt;&lt;/h5&gt;
 
     &lt;table border="0" width="100%"&gt;
     &lt;tr&gt;
        &lt;td align="left"&gt;
            &lt;bean:message key="prompt.CPF"/&gt;
            &lt;html:text property="CPF" name="rastreadorForm" size="11" maxlength="11"/&gt;
        &lt;/td&gt;
     &lt;/tr&gt;

  &lt;tr&gt;
    &lt;th align="center"&gt;
      &lt;html:submit&gt;
        &lt;bean:message key="button.confirm"/&gt;
      &lt;/html:submit&gt;
      &lt;html:reset&gt;
         &lt;bean:message key="button.reset"/&gt;
      &lt;/html:reset&gt;
      &lt;html:cancel&gt;
         &lt;bean:message key="button.cancel"/&gt;
      &lt;/html:cancel&gt;
      
    &lt;/th&gt;
  &lt;/tr&gt;
     &lt;/table&gt;
 
  &lt;/html:form&gt;
ekszuki

Ah, gente eu to ficando doido, agora eu percebi que a validação esta sendo feita normalmente…

Como assim, se eu informo um valor fora do padrão definido no validation.xml ele não aceita, so que invez de mostrar as mensagens de erro e recarregar a pagina definida no input ( struts_config.xml ) o “idiota” do struts carrega uma pagina em branco…

Mas se o valor informado estiver dentro do padrão, ele redireciona certinho sem nenhum problema… Estou cada vez mais convencido que deve faltar apenas uma virgula em algum lugar…

Alguém ai ja passou por isso… … :?: :?: :?: :?: :?: :?:

Qualquer ideia do que possa ser será bem vinda…

T+

ekszuki

Ah, e eu tirei tambem este método, porque agora to querendo validar pelo validation.xml
o que esta funcionando perfeitamente

public ActionErrors validate( ActionMapping mapping, HttpServletRequest request) {
       ActionErrors errors = new ActionErrors();
       
                  /*  forçando o acontecimento do erro */
         	  errors.add("CPF", new ActionError("Erro ao validar o CPF"));
           
	      return errors;
	   }
}

E tambem mudei a classe RastreadorForm de

public class RastreadorForm extends ActionForm {
}

para

public class RastreadorForm extends ValidatorForm implements Serializable {
}

Mesmo assim o struts ainda não me mostra as mensagens de erro e nem recarrega o formulario que o usuario preencheu errado…

T+

ekszuki

Bom, eu mesmo perguntei, e eu mesmo estou respondendo…

Consegui fazer com que o Struts respeita-se o que estava definido no input do action (struts_config.xml) …

No struts_config.xml adicionei um global-forward

&lt;global-forwards&gt;
       &lt;forward name="FRastreador" path= "/FRastreador.jsp" /&gt;
    &lt;/global-forwards&gt;

e No meu Action indico no input o global_forward

&lt;action    path="/insertRastreador"
               type="br.com.teste.action.insertRastreadorAction"
               name="rastreadorForm"
               scope="request"
               validate="true"
               input="FRastreador"&gt;
       &lt;forward name="success"              path="/mainMenu.jsp"/&gt;
    &lt;/action&gt;

Isso resolveu meu problema, mas gerou uma dúvida: Acredito que ele não estava chamando a pagina definida no input porque ele não estava encontrando a mesma mas comparando a linha
com o exemplo de validação do próprio struts não encontrei nenhuma diferença e não existiu a necessidade de criar o global_forward…

Alguem sabe porque, e se o meu entendimento do problema esta correto …

Bom se alguem ai souber porque eu tive que criar um global_forward por favor me diga porque eu não consegui descobrir ainda mais quero descobrir …

Valeu, T+

Diogenes

Cara, nao conheço quase nada de Struts…

E quem tem duvida agora sou eu…

Isso aquih pode?

O construtor de ActionError q recebe uma String nao deveria receber uma key para a msg definida no arquivo de resources nao?

Ele reconhece a msg como a msg a ser exibida???

ekszuki

É voce tem toda razão,
Um dos construtores do ActionErrors realmente espera uma string que deve constar no Application Resources .

T+

Diogenes

E depois de corrigir o Struts estah dando um forward para a pagina definida no input???

ekszuki

Não ele continua retornando uma pagina em branco quando coloco o caminho diretamente do jsp tipo input="/formulario.jsp" -> assim ele retorna uma pagina em branco como se não tivesse encontrado a pagina formulario.jsp, Mas se eu defino um global forward, formulario apontando para formulario.jsp e no input especifico o global forward ai funciona…

Achei isso muito estranho…

Criado 24 de novembro de 2004
Ultima resposta 26 de nov. de 2004
Respostas 8
Participantes 2