2013-08-29 12 views
8

przekierowanie z Bean w JSF mogą być wykonywane przezJak zrobić przekierowanie za pomocą nawigacji reguła

externalContext.redirect("foo.xhtml"); 

Ale chcę używać reguł, określonych w <navigation-rule/> (faces-config.xml) dla <from-outcome/> & & przekazywać argumenty wiersza poleceń.

externalContext.redirect("from-outcome?param=bar"); 

Nie działa. Jak to zrobić?

Odpowiedz

13

The ExternalContext#redirect()takes an URL, a nie jako wynik nawigacji.

Musisz wrócić wyniki nawigacji z metod działania zadeklarowanych do zwrotu String.

public String submit() { 
    // ... 

    return "from-outcome"; 
} 

Można skonfigurować sprawę nawigację wysłać przekierowanie dodając <redirect>.

<navigation-rule> 
    <navigation-case> 
     <from-outcome>from-outcome</from-outcome> 
     <to-view-id>/foo.xhtml</to-view-id> 
     <redirect> 
      <view-param> 
       <name>param</name> 
       <value>bar</value> 
      </view-param> 
     </redirect> 
    </navigation-case> 
</navigation-rule> 

pamiętać, że można również po prostu skorzystać z JSF niejawny nawigacji bez konieczności stosowania tego XML bałagan:

public String submit() { 
    // ... 

    return "/foo.xhtml?faces-redirect=true&param=bar"; 
} 

Jeśli jesteś wewnątrz metody detektora zdarzeń lub ajax, które nie mogą wrócić wynik ciąg, wtedy zawsze można pobrać NavigationHandler#handleNavigation(), aby wykonać żądaną nawigację.

public void someEventListener(SomeEvent event) { // AjaxBehaviorEvent or ComponentSystemEvent or even just argumentless. 
    // ... 

    FacesContext context = FacesContext.getCurrentInstance(); 
    NavigationHandler navigationHandler = context.getApplication().getNavigationHandler(); 
    navigationHandler.handleNavigation(context, null, "from-outcome"); 
} 

Nielegalny odpowiednik sprawy to: ExternalContext#redirect().

+1

Dzięki @BalusC, ale w jaki sposób mogę zmodyfikować wartość w regule nawigacyjnej z komponentu bean? – timmornYE

+1

Możesz użyć EL w '' tak jak, więc ' # {bean.param}'. Jest to równoważne "return" /foo.xhtml?faces-redirect=true¶m= "+ URLEncoder.encode (param," UTF-8 ");' (chociaż niektóre wersje Mojarra mają błędy z użyciem zestawu znaków). – BalusC

+0

Dzięki, rozumiem. Ale wracając do mojego pytania: Więc nie ma sposobu, aby użyć "reguła nawigacji" bez zwracania ciągu? Ponieważ są sytuacje, w których nie jest to możliwe. Co zrobić, jeśli chcę przekierować z połączenia Ajax? Nie mogę przywrócić nawigacji jako String lub czy jestem w błędzie? – timmornYE

Powiązane problemy