You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Letícia Álvares Barbalho <le...@gmail.com> on 2005/08/26 22:08:27 UTC

Smart forwarding with different input pages

Hello everyone,

I'm working with smart forwarding in my application. I have an action with 
this mapping in struts-config:

<action path="/DeterminaColecao" 
type="auge.action.DeterminaAction"
name="addDelUpdColecaoForm" 
validate="true"
input="/pages/colecao/colecao.jsp"> 
scope="request" > 
<forward name="add" path="/AddColecao.do"/> 
<forward name="del" path="/DelColecao.do"/> 
<forward name="upd" path="/UpdColecao.do"/> 
</action>

The actions for which it forwards are configured like this one:

<action
path="/UpdColecao"
type="auge.action.UpdColecaoAction"
name="addDelUpdColecaoForm" 
scope="request" 
validate="true"
input="/pages/colecao/colecaoDados.jsp"> 
<forward name="success" path="/pages/colecao/colecao.jsp" redirect="true"/> 
<forward name="error" path="/pages/erro.jsp"/> 
</action> 


As you can see, the second action has a different input page. It is because 
is I have 3 actions to which I will forward and one of them has a different 
input page. So, when the validator returns me an error, and returns me to 
the input page specified at "DeterminaColecao", and not at the action 
executed. I tried ommiting the "input" option at "DeterminaColecao", but 
then it returns me an error instead of using the action input.

Is there any way my html:form could call the "DeterminaColecao" but use the 
input page of the action to which it forwarded?

Thank you.




-- 
Letícia Álvares Barbalho
leticia.barbalho@gmail.com

Re: Smart forwarding with different input pages

Posted by Laurie Harper <la...@holoweb.net>.
Letícia Álvares Barbalho wrote:
> Hello everyone,
> 
> I'm working with smart forwarding in my application. I have an action with 
> this mapping in struts-config:
> 
> <action path="/DeterminaColecao" 
> type="auge.action.DeterminaAction"
> name="addDelUpdColecaoForm" 
> validate="true"
> input="/pages/colecao/colecao.jsp"> 
> scope="request" > 
> <forward name="add" path="/AddColecao.do"/> 
> <forward name="del" path="/DelColecao.do"/> 
> <forward name="upd" path="/UpdColecao.do"/> 
> </action>
> 
> The actions for which it forwards are configured like this one:
> 
> <action
> path="/UpdColecao"
> type="auge.action.UpdColecaoAction"
> name="addDelUpdColecaoForm" 
> scope="request" 
> validate="true"
> input="/pages/colecao/colecaoDados.jsp"> 
> <forward name="success" path="/pages/colecao/colecao.jsp" redirect="true"/> 
> <forward name="error" path="/pages/erro.jsp"/> 
> </action> 
> 
> 
> As you can see, the second action has a different input page. It is because 
> is I have 3 actions to which I will forward and one of them has a different 
> input page. So, when the validator returns me an error, and returns me to 
> the input page specified at "DeterminaColecao", and not at the action 
> executed. I tried ommiting the "input" option at "DeterminaColecao", but 
> then it returns me an error instead of using the action input.
> 
> Is there any way my html:form could call the "DeterminaColecao" but use the 
> input page of the action to which it forwarded?
> 
> Thank you.

You can't get exactly what you want, since that doesn't fit the processing 
model. What happens is, your form submits to /DeterminaColecao and, since 
you have validate="true", validation occurs before your action executes. If 
validation succeeds, processing proceeds into your action and you can 
forward to wherever you want. However, if validation fails, the /UpdColecao 
action doesn't get called. At this point, there's no way for validator to 
know where your action would have forwarded to had the /DeterminaColecao 
action executed, so it can only forward to the current (/DeterminaColecao) 
action's input page.

To do what you want (have /DeterminaColecao forward to different input 
pages depending on what the next action would have been), you will need to 
override validate() (calling super.validate() to invoke validator) and have 
your /DeterminaColecao action perform the forwarding when validation fails.

Another option you may be able to use would be to turn off validation on 
the /DeterminaColecao action and rely on validation in each of the actions 
it forwards to. Since you're not specifying redirect="true" on the 
forwards, the action you forward to will see the same request data as the 
/DeterminaColecao action and can validate after the forward. That's only an 
option if you don't mind /DeterminaColecao executing against invalid 
inputs, though. If that's not acceptable you'll have to use option one.

L.
-- 
Laurie Harper
Open Source advocate, Java geek: http://www.holoweb.net/laurie
Founder, Zotech Software: http://www.zotechsoftware.com/


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org