Sometimes when you MUST perform a redirect for some reason (once we have
a problem with multipart forms...) and there are errors in the request scope
you lost them.
We solve this problem as follows:
In the action, where you do saveErrors, just do:
this.saveErrorsInSession(request, errors);
in a base class, add this method:
public void saveErrorsInSession(HttpServletRequest request, ActionErrors
errores) {
request.getSession().setAttribute(BaseAction.ERROR_KEY, errores);
}
Then for the JSP, we develop a simple custom tag that gets ActionErrors
from session scope and put them in the request scope and remove the errors
from the session:
package ar.com.eds.x71.ui.taglib.misc;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;
/**
* Obtiene el objeto Error de struts del scope, propiedad property, y lo
pasa al default para struts.
[EMAIL PROTECTED] Guillermo Meyer
**/
public class GetErrorsTag extends TagSupport {
private String scope = "session";
private String property = null;
private String remove = "true";
public void setScope(String c) {
if (c.equalsIgnoreCase("request")) {
this.scope = "request";
} else if (c.equalsIgnoreCase("application")) {
this.scope = "application";
} else {
this.scope = "session";
}
}
public void setProperty(String c) {
this.property = c;
}
public void setRemove(String s) {
this.remove = (s.equalsIgnoreCase("false")?"false":"true");
}
public int doStartTag() {
return (SKIP_BODY);
}
public int doEndTag() throws javax.servlet.jsp.JspTagException, JspException
{
ActionErrors errores = null;
if (this.property == null) {
this.property = Action.ERROR_KEY;
}
if (this.scope.equals("session")) {
errores = (ActionErrors) ((HttpServletRequest)
pageContext.getRequest()).getSession().getAttribute(this.property);
} else if (this.scope.equals("application")) {
errores = (ActionErrors)
pageContext.getServletContext().getAttribute(this.property);
} else {
errores = (ActionErrors) ((HttpServletRequest)
pageContext.getRequest()).getAttribute(this.property);
}
if (errores != null) {
if (this.remove.equals("true")) {
if (this.scope.equals("session")) {
((HttpServletRequest)
pageContext.getRequest()).getSession().removeAttribute(this.property);
} else if (this.scope.equals("application")) {
pageContext.getServletContext().removeAttribute(this.property);
} else {
((HttpServletRequest)
pageContext.getRequest()).removeAttribute(this.property);
}
}
pageContext.setAttribute(Action.ERROR_KEY, errores, PageContext.REQUEST_SCOPE);
}
return EVAL_PAGE;
}
}
And in the JSP, use this tags:
<x71:getErrors/>
<html:errors/>
Disclaimer: we use Struts 1.0. This of course could be enhaced, for example,
just extending ErrorsTag.
Cheers.
Guillermo.
>-- Mensaje original --
>Reply-To: "Struts Users Mailing List" <[EMAIL PROTECTED]>
>From: "Axel Seinsche" <[EMAIL PROTECTED]>
>Subject: errors get lost on redirect
>To: Struts Users Mailing List <[EMAIL PROTECTED]>
>Date: Fri, 20 Aug 2004 15:36:38 +0200 (CEST)
>
>
>Hi all,
>
>in my struts application I have 4 forms which have to be filled to store
>an item in the database. All 4 forms are inherited from one abstract form
>class. As form 3 depends on data from 1 I didn't find a better solution,
>but it works.
>
>The problem is the following. When I submit form 4 I can do the complete
>validation. The ActionErrors are filled correctly, but I return back to
Form
>4 (of course). I then did a <logic:messagesPresent> and inside a redirect
>to page where the error is. The redirect works fine, but the errors get
lost
>on this redirect. Can I somehow preserve my errors when redirecting or
can
>I do this without a redirect. As the ActionClass isn't called I can't call
>a mapping.findForward() or something like this. I tried to put the errors
>object in the request scope before doing the redirect but it's not stored
>- even the session scope didn't work. But that was just a try, I don't
want
>my errors to be in the session scope. I hope someone can enlighten me.
:-)
>
>Regards,
>
>Axel
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
________________________________________
FiberTel, el nombre de la banda ancha http://www.fibertel.com.ar
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]