First of all this is the third time I have tried to respond as I keep trying
to use ctrl+W to select a word while editing in this text area and closing
the browser tab. (IDEA muscle memory).
Ok, so my first question is why have a Search action and then a separate
SearchResults action? What does SearchResults do that Search does not do or
vice versa? I would expect you would just submit the form to an action
called Search, find stuff there and then dispatch to a results page from
there. Your form can do a GET rather than POST and that will make things
like the back button and refresh work better. Especially since technically
you are not changing state a GET is appropriate.
There may be a few things you can do:
#1 - Show the user the search results with the error, asking them to try
again.
Dispatch to the search results page:
<action name="search" class="com.foo.SearchAction">
<result type="tiles">searchResultPage</result>
<result name="input" type="tiles">searchResultPage</result>
<result name="error" type="tiles">searchResultPage</result>
</action>
#2 - Use the MessageStoreInterceptor and a querystring param to redirect to
the original action
With the MessageStoreInterceptor actionMessages, actionErrors and
fieldErrors will be available after the redirect. Include a request param
with the offending value and have your original action look for that to
populate the search form. For anything to survive a redirect it has to go
in the session (MessageStore) or be part of the redirect url.
<action name="search" class="com.foo.SearchAction">
<result type="tiles">searchResultPage</result>
<result name="input"
type="redirect">${originalAction}?query=${query}</result>
<result name="error"
type="redirect">${originalAction}?query=${query}</result>
</action>
#3 - Remove the validation/workflow interceptors from the Search action and
hand validate the value in your Search action method. If there is an error
then return a String for the tiles result you want.
This is not my favorite option
<action name="search" class="com.foo.SearchAction">
<result type="tiles">searchResultPage</result>
<result name="welcome" type="tiles">welcomePage</result>
<result name="product" type="tiles">productPage</result>
etc...
</action>
I think you are correct that this is a common pattern. When I have
implemented a QuickSearch in the global nav, I use option #1 and display any
errors or results on a results page. I think what makes your pattern unique
is that you want to display the error in the original page.
p.s. I am tiles ignorant so I am treating them like they were a JSP page
since they seem to both use the dispatch result type. (woot SiteMesh!)
Dirk Forchel wrote:
>
> I could not resolve my problem yet. How can I use the "dispatch" result
> type to forward to actions (or maybe tiles definitions) rather than to
> JSPs?
> In my application are some situations where I have to forward the error
> messages or the field validation errors to to a different action. I can
> not use JSPs cos we use Tiles.
> Let's assume we have four different Pages. A welcome-page displaying some
> welcome information and a "search-form", a category-page displaying a list
> of products and the same "search-form", a product page displaying detailed
> product information and the same "search-form" and a "search-result-page"
> displaying a list of products and as well the same "search-form".
> This is the struts config how it could look like:
>
> <action name="welcome">
> <result type="tiles">welcomePage</result>
> </action>
>
> <action name="category" class="com.foo.CategoryAction">
> <result type="tiles">categoryPage</result>
> </action>
>
> <action name="product" class="com.foo.ProductAction">
> <result type="tiles">productPage</result>
> </action>
>
> <action name="search" class="com.foo.SearchAction">
> <result type="redirect-action">searchResult</result>
> <result name="input" type="dispatch">sameAction</result>
> <result name="error" type="dispatch">sameAction</result>
> </action>
>
> <action name="searchResult" class="com.foo.SearchListAction">
> <result type="tiles">searchResultPage</result>
> </action>
>
> I do not display the tiles definition here. But it is important to me to
> have a "forward" to an action defintion rather than a "redirect". Once I
> redirect, I'm going to lose request-scoped data. "redirect" to actions
> works perfectly but "forward" doesn't. In my struts configuration
> sameAction should be dynamically substituted with the action name or the
> action call where the form is included, either "/welcome.action",
> "/product.action", "/category.action" or even "/searchResult.action".
> Has somebody any idea how to accomplish this? I reckon this is a almost
> common workflow.
>
--
View this message in context:
http://www.nabble.com/-S2--Result-Type-Dispatch-problem-with-relative-Action-calls-tp21368053p21449950.html
Sent from the Struts - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]