Helo

I came up with a solution to my own problem. I'm not sure if this is final. I still seems a little ugly

The solution came from two Interceptors.

public class MyRequestInterceptor extends RequestInterceptor {

public void preRequest(RequestInterceptorContext requestInterceptorContext, InterceptorChain interceptorChain) throws InterceptorException { HttpServletRequest request = requestInterceptorContext.getRequest(); Object fromVal = request.getSession().getAttribute ("com.redcetus.errores.intermedios");
        request.setAttribute(Globals.ERROR_KEY, fromVal);
request.getSession().removeAttribute ("com.redcetus.errores.intermedios");
        interceptorChain.continueChain();
    }

public void postRequest(RequestInterceptorContext requestInterceptorContext, InterceptorChain interceptorChain) throws InterceptorException { HttpServletRequest request = requestInterceptorContext.getRequest(); ActionMessages retValue = (ActionMessages) request.getAttribute(Globals.ERROR_KEY);
        if ((retValue == null) || retValue.isEmpty()) {
request.getSession().removeAttribute ("com.redcetus.errores.intermedios"); } else if (request.getAttribute("com.redcetus.redirected") == null || Boolean.TRUE.equals(request.getAttribute ("com.redcetus.redirected"))) { request.getSession().setAttribute ("com.redcetus.errores.intermedios", retValue);
        }

        interceptorChain.continueChain();
    }

}

public class MyActionInterceptor extends ActionInterceptor {
public void afterNestedIntercept(AfterNestedInterceptContext afterNestedInterceptContext) throws InterceptorException {
    }

public void preAction(ActionInterceptorContext actionInterceptorContext, InterceptorChain interceptorChain) throws InterceptorException {
        interceptorChain.continueChain();
    }

public void postAction(ActionInterceptorContext actionInterceptorContext, InterceptorChain interceptorChain) throws InterceptorException { HttpServletRequest request = actionInterceptorContext.getRequest(); if (actionInterceptorContext.getOriginalForward().getRedirect ()) { request.setAttribute("com.redcetus.redirected", Boolean.TRUE);
        } else {
request.setAttribute("com.redcetus.redirected", Boolean.FALSE);
        }
        interceptorChain.continueChain();
    }
}

What do you think about this?, is it the "beehive way"?


Best regards

Marcelo Morales



On Feb 26, 2006, at 3:52 PM, Marcelo Morales wrote:

Helo

I will be grateful if you help me solve this one.

This is a typical action inside an application:

    @Jpf.Action(
        forwards = {
            @Jpf.Forward(name="success", action="mypage")
        },
        useFormBean = "myForm",
        validatableProperties = {
            @Jpf.ValidatableProperty(
                propertyName = "name",
                displayName = "Name",
                validateRequired = @Jpf.ValidateRequired(),
                validateMinLength = @Jpf.ValidateMinLength(chars = 5),
validateMaxLength = @Jpf.ValidateMaxLength(chars = 32))
        },
validationErrorForward = @Jpf.Forward(name="fail", action="mypage")
    )
    public Forward myaction(Form form) {
        /* Some stuff gets done... */
        addActionError("name", "name.is.ok", new Object[] {});
        return new Forward("success");
    }

mypage is a simple action that just forwards the request to a tiles definition.

Now I want to make all POST redirected, following the Redirect After Post idea (http://www.theserverside.com/articles/article.tss? l=RedirectAfterPost). So I have changed the forwards like this:

@Jpf.Forward(name="success", action="mypage")
to
@Jpf.Forward(name="success", action="mypage", redirect=true)

and from
validationErrorForward = @Jpf.Forward(name="fail", action="mypage")
to
validationErrorForward = @Jpf.Forward(name="fail", action="mypage", redirect=true)

and i coded the beforeAction and afterAction methods in the Controller so i save all messages on the session (when i'm about to send the redirection) and retrieve them when i am going to show them.

This works for the "name.is.ok" message, which gets inserted on the action; but it does not work for the validation messages because the beforeAction and afterAction methods don't get executed when validation fails.

How can i keep the validation messages on the session so i can show them afterwards?

I was thinking about hacking the validate method in AnyBeanActionForm.java to put all ActionErrors on the session as well, but i think this is too intrusive. I am also looking at the ActionInterceptor and RequestInterceptor classes (i am about to run the samples).

Thanks in advance

Marcelo Morales

Reply via email to