Prezados
Estou desenvolvendo minha primeira aplicação utilizando o framework struts. Estou tendo algumas dificuldades, como todo iniciante, mas com algumas pesquisas as mesmas vão sendo resolvidas. Porém tenho um problema quando da utilização do método validate() em uma classe que extend ActionForm.
EXEMPLO:
Um formulario, extendendo de ActionForm com um atributo qualquer e os respectivos getters e setters, o metodo reset() e o metodo validate().
Se no metodo validate() for adicionado um erro em ActionErrors, o fluxo retorna para o jsp e mostra a mensagem de erro, mas o valor previamente digitado pelo usuario nao retorna, parece que o mesmo tenha sido limpo.
Para contornar o problema, eu testo se ocorreu algum erro, e caso positivo, eu adiciono o atributo na request. Dessa forma funciona porém não deveria ser essa forma correta pois, em todo material que leio sobre o assunto, diz que os valores são mantidos.
A minha action esta configurada/mapeada com scope=“request” e validate=“true”. O meu metodo validate() está assim:
public void validate(ActionErrors errors) {
ActionErrors errors = new ActionErrors();
if (nome == null || nome.equals(""))
errors.add("nome", new ActionMessage("erro.campoNome"));
// essa é a "gambiarra" que fiz para contornar o problema até encontrar uma solução
if (errors.size() > 0)
req.setAttribute("nome", nome);
return errors;
}
Alguém já passou por isso e gostaria de compartilhar a solução??
Desde já agradeço a ajuda
Olá,
Você ja tentou a taglib html?
Assim acho que vai retornar.
exemplo:
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html:text property="nome"/>
Olá
Então, nas páginas eu uso exatamente como você sugere.
Resolvi fazer mais alguns testes, criei um novo projeto, somente com um jsp de teste, com um form de teste e uma action de teste, tudo baseado no struts-blank e nada…
Confesso que não consigo entender não…
Estou usando jdk 6 update 6, struts 1.3.8 e tomcat 6.0.16.
Se alguém achar necessário, posso colar os arquivos (web.xml, struts-config.xml, o arquivo jsp, o form e o action)
Alguma idéia?
Olá
Segue abaixo as listagens e obrigado pela força.
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Struts Blank Application</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name="TesteForm" type="aaa.TesteForm"/>
</form-beans>
<action-mappings>
<action path="/insere" parameter="/pages/insere.jsp" type="org.apache.struts.actions.ForwardAction" />
<action path="/insereTeste" name="TesteForm" validate="true" type="aaa.InsereAction" scope="request" input="/pages/insere.jsp">
<forward name="ok" path="/insere.do"/>
</action>
</action-mappings>
<message-resources parameter="MessageResources" />
</struts-config>
MessageResources.properties
errors.header=<UL>
errors.prefix=<LI>
errors.suffix=</LI>
errors.footer=</UL>
error.field01 = "error field 01"
error.field02 = "error field 02"
TesteForm.java
package aaa;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
public class TesteForm extends ActionForm {
private String field01;
private String field02;
public String getField01() {
return field01;
}
public void setField01(String field01) {
this.field01 = field01;
}
public String getField02() {
return field02;
}
public void setField02(String field02) {
this.field02 = field02;
}
public boolean stringVazia(String valor) {
return valor == null || valor.trim().length() == 0;
}
@Override
public void reset(ActionMapping map, HttpServletRequest req) {
field01 = "";
field02 = "";
}
public ActionErrors validate(ActionMapping map, HttpServletRequest req) {
ActionErrors errors = new ActionErrors();
if (stringVazia(field01))
errors.add("field01", new ActionMessage("error.field01"));
else if (stringVazia(field02))
errors.add("field02", new ActionMessage("error.field02"));
// if (errors.size() > 0) {
// req.setAttribute("field01", field01);
// req.setAttribute("field02", field02);
// }
return errors;
}
}
InsereAction.java
package aaa;
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;
public class InsereAction extends Action {
public ActionForward execute(ActionMapping map, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
TesteForm formulario = ((TesteForm) form);
//nao faz nada
return map.findForward("ok");
}
}
insere.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<html:html>
<head>
<title>::... Destino Virtual - Desenvolvimento de Aplicações ...::</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#EDEDED"" text="#000000" LEFTMARGIN="0" RIGHTMARGIN="0" TOPMARGIN="0" BOTTOMMARGIN="0" style="overflow: hidden">
<html:form action="/insereTeste" focus="field01">
<html:errors property="field01"/><br>
field01: <html:text property="field01" value="${field01}" /><br>
<html:errors property="field02"/><br>
field02: <html:text property="field02" value="${field02}" /><br>
<html:submit />
</html:form>
</body>
</html:html>
Opa blz? Desculpa a demora ae é que agora que sobro um tempinho hehee
Intão, o problema no código é o EL no value dos html:text, tira eles que funciona, e quando vc quizer setar um valor nos campos, vc põe
o form com os campos setados na request da action antes de carregar a página, ou seja teria que ter uma Action sua no insere.do
obs: o nome do atributo na request tem que ser o nome da classe do Form, no seu caso seria TesteForm
Espero ter ajudado,
abraço
Olá “escobardo”…
Valeu pela dica, funcionou tudo certinho, inclusive a questão de trazer a pagina JSP com os campos carregados.
Muito obrigado