I took a different approach. My filter calls methods which are
specifically written with the awareness that they will be called as a
non-faces request. The intention is to avoid confusion over what
state is available when the method is triggered. This would be useful
for URLs that can be emailed or launched from other applications, to
go directly to a page displaying specific data.
Right now it's configured with XML, but I'm in the process of
extracting out some of the logic into an interface that I can
reimplement to allow automapping in a way Craig does with his remoting
URLs.
The advantage of the XML is I can specify how the bean is set up,
independent of how it's configured in faces-config.xml:
<action path="/baz" action="#{foo.bar}">
<property name="documentId" value="#{param.id}"/>
</action>
A request could be "/baz.jsf?id=1".
It prevents other fields from being auto-populated by a user
manipulating the URL. In the "foo.bar" method, I know all I have is
"documentId" and none of the other properties, so I behave
accordingly.
Hubert
On 3/7/06, David Schlotfeldt <[EMAIL PROTECTED]> wrote:
> I have written a new way to solve this issue with the idea I described
> below. After receiving responses to my original post I was going to use
> NonFacesRequestServlet but realized that it wouldn't do any validation.
> (At least I am PERTTY sure it doesn't. Someone correct me if I am wrong.)
>
> What I have done is created a servlet filter that can be used to make it
> seem as if a person has already loaded the page and has filled it out
> and clicked a link or button. -- simply by requesting a URL. What I did
> is a servlet filter that makes a request to the JSF page, searches the
> response for form fields, and then merges those fields default values
> with the request parameters from the real request. It then calls
> doChain(...) with a wrapped http request that has all the values from
> the form and the real request. This makes it possible to seem as if
> someone went to the page and clicked a button or link. (In fact it does
> happen, but the filter does it.)
>
> For example the following url can be used on an order form I am creating
> to cause the next button to be pushed.
> register.html?doReq=true&formId=placeOrder&placeOrder:next=true
>
> doReq=true triggers the fitler. FormId is the id of the form.
> PlaceOrder:next is a button I am causing to be pushed.
>
> I did all of this because I have a multi step form with a step in the
> middle that is on another site. Using this filter I can make the
> external step send the user back to the JSF form and cause an action to
> take place when it comes back.
>
> What are peoples opinion on this approach?
> (I don't know how the API having to do with JSF's life cycle works so
> maybe its possible to do this type of thing from a servlet so a fake
> request doesn't have to be made.)
>
> Thanks,
> David
>
>
> David Schlotfeldt wrote:
> > I need a way to have a URL that will cause a JSF action to take place.
> > Anyone know of a way? (For an example, lets say I need to put the link
> > in an email.)
> >
> > All I find are "hackerish" javascript solutions to this issue.
> >
> > Would it be possible to create a version of the commandLink that
> > didn't need a form around it and didn't use javascript? Obviously it
> > couldn't include any information from form fields but that is okay
> > with me.
> >
> > Or would it be possible to create a servelet filter that converts a
> > normal request to a request JSF wants?
> > Eg. We have a form with a field called 'name' and a button called
> > 'sayHi'. With the filter I could send a person to a url like
> > http://test.com/page-form-is-on.html?link=sayHi&name=David
> > The filter would take the request and convert convert the params
> > into what JSF wants. I don't know how to do this... except maybe make
> > a fake request in the fitler to the JSF for the form to get
> > jsf_state_64 and jsf_tree_64 values and then send the request on with
> > the request parameters rewritten.
> >
> > Suggestions? Anyone know of a good solution? (...other than mine
> > that would take me 3 weeks, 4 days, and 7382 Red Bulls...)
> >
>
>