You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@shale.apache.org by Hermod Opstvedt <he...@opstvedt.com> on 2007/03/05 16:38:51 UTC

SV: view controller - site navigation

Hi

It definitely works, but from an architectural it does not feel right.
Reason is that you may want different outcomes for different target methods.
Deferring the outcome to the actual method to be invoked makes it cleaner in
my mind.

Hermod


-----Opprinnelig melding-----
Fra: craigmcc@gmail.com [mailto:craigmcc@gmail.com] På vegne av Craig
McClanahan
Sendt: 5. mars 2007 06:43
Til: user@shale.apache.org
Emne: Re: view controller – site navigation

On 3/2/07, hermod.opstvedt@dnbnor.no <he...@dnbnor.no> wrote:
> Hi
>
> I think the best way to achieve what you want is to raise a flag in the
viewcontrollers init method. Then when the method that is supposed to be
executed is called, you check for the flag at the beginning and return the
outcome that corresponds to the error situatiuon.
>

It actually is possible to navigate from init(), but you have to do a
bit more work:

    FacesContext context = FacesContext.getCurrentInstance();
    NavigationHandler nh = context.getApplication().getNavigationHandler();
    String fromAction = "#{...}"; // Fake expression for the action
you pretend executed
    String outcome = "..."; // Fake outcome from the fake action
    nh.handleNavigation(context, fromAction, outcome);
    context.renderResponse(); // Skip directly to Render Response phase

The current view, plus the values you specify for fromAction and
outcome, are fed into the standard navigation rules processing and a
new view will be selected based on those rules (or the current view
redisplayed if no rule matches).  The call to renderResponse() causes
the remainder of the lifecycle for the current page to be skipped.

>From an architectural viewpoint, something to consider is whether it
makes sense to load data in the prerender() event instead of init().
The advantage is that this will only be executed if this is the page
that will really be rendered -- if you navigated elsewhere, you won't
pay the performance cost of loading data that will not be used.  The
disadvantage is that, by the time prerender() is called, you are
committed to rendering this page and you cannot navigate anywhere
else.

Craig

>
> -----Original Message-----
> From: gerrit [mailto:gerrit.scholz@deborate.de]
> Sent: Friday, March 02, 2007 9:51 AM
> To: user@shale.apache.org
> Subject: view controller – site navigation
>
>
>
> I use the shale view controller init() method to make standard site
> validations and load data.
> The init-Method has no return value and so no navigation rule is executed.
> If one of my validation methods or the load data method returns an error
I'd
> like execute navigation rules. The reason is to go to a special error
page.
> Is there a possibility to navigate to another page from the init-method?
>
> --
> View this message in context:
http://www.nabble.com/view-controller-%E2%80%93-site-navigation-tf3332431.ht
ml#a9266099
> Sent from the Shale - User mailing list archive at Nabble.com.
>
>
>
> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
>
> This email with attachments is solely for the use of the individual or
> entity to whom it is addressed. Please also be aware that DnB NOR cannot
> accept any payment orders or other legally binding correspondence with
> customers as a part of an email.
>
> This email message has been virus checked by the anti virus programs used
> in the DnB NOR Group.
>
> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
>
>


Re: [shale-validator] SV: view controller - site navigation

Posted by gerrit <ge...@deborate.de>.
Hi 

The faces-config.xml was only a cutout. I have defined more navigation cases
so that different target methods had different outcomes. But I don’t
understand what you mean with “Deferring the outcome to the actual method to
be invoked”. Should I call a target method from the init method – this make
no sense for me. 

Gerrit   


Hermod Opstvedt wrote:
> 
> Hi
> 
> It definitely works, but from an architectural it does not feel right.
> Reason is that you may want different outcomes for different target
> methods.
> Deferring the outcome to the actual method to be invoked makes it cleaner
> in
> my mind.
> 
> Hermod
> 
> 
> -----Opprinnelig melding-----
> Fra: craigmcc@gmail.com [mailto:craigmcc@gmail.com] På vegne av Craig
> McClanahan
> Sendt: 5. mars 2007 06:43
> Til: user@shale.apache.org
> Emne: Re: view controller – site navigation
> 
> On 3/2/07, hermod.opstvedt@dnbnor.no <he...@dnbnor.no> wrote:
>> Hi
>>
>> I think the best way to achieve what you want is to raise a flag in the
> viewcontrollers init method. Then when the method that is supposed to be
> executed is called, you check for the flag at the beginning and return the
> outcome that corresponds to the error situatiuon.
>>
> 
> It actually is possible to navigate from init(), but you have to do a
> bit more work:
> 
>     FacesContext context = FacesContext.getCurrentInstance();
>     NavigationHandler nh =
> context.getApplication().getNavigationHandler();
>     String fromAction = "#{...}"; // Fake expression for the action
> you pretend executed
>     String outcome = "..."; // Fake outcome from the fake action
>     nh.handleNavigation(context, fromAction, outcome);
>     context.renderResponse(); // Skip directly to Render Response phase
> 
> The current view, plus the values you specify for fromAction and
> outcome, are fed into the standard navigation rules processing and a
> new view will be selected based on those rules (or the current view
> redisplayed if no rule matches).  The call to renderResponse() causes
> the remainder of the lifecycle for the current page to be skipped.
> 
> From an architectural viewpoint, something to consider is whether it
> makes sense to load data in the prerender() event instead of init().
> The advantage is that this will only be executed if this is the page
> that will really be rendered -- if you navigated elsewhere, you won't
> pay the performance cost of loading data that will not be used.  The
> disadvantage is that, by the time prerender() is called, you are
> committed to rendering this page and you cannot navigate anywhere
> else.
> 
> Craig
> 
>>
>> -----Original Message-----
>> From: gerrit [mailto:gerrit.scholz@deborate.de]
>> Sent: Friday, March 02, 2007 9:51 AM
>> To: user@shale.apache.org
>> Subject: view controller – site navigation
>>
>>
>>
>> I use the shale view controller init() method to make standard site
>> validations and load data.
>> The init-Method has no return value and so no navigation rule is
>> executed.
>> If one of my validation methods or the load data method returns an error
> I'd
>> like execute navigation rules. The reason is to go to a special error
> page.
>> Is there a possibility to navigate to another page from the init-method?
>>
>> --
>> View this message in context:
> http://www.nabble.com/view-controller-%E2%80%93-site-navigation-tf3332431.ht
> ml#a9266099
>> Sent from the Shale - User mailing list archive at Nabble.com.
>>
>>
>>
>> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
> *
>>
>> This email with attachments is solely for the use of the individual or
>> entity to whom it is addressed. Please also be aware that DnB NOR cannot
>> accept any payment orders or other legally binding correspondence with
>> customers as a part of an email.
>>
>> This email message has been virus checked by the anti virus programs used
>> in the DnB NOR Group.
>>
>> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
> *
>>
>>
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/view-controller-%E2%80%93-site-navigation-tf3332431.html#a9328082
Sent from the Shale - User mailing list archive at Nabble.com.