2012-02-27 20 views
9

Chcę zresetować przez komponent bean JSF, gdy wywoływana jest jakaś metoda. Załóżmy, że jest przycisk polecenia, ktoś go naciśnij i po pomyślnej transakcji, mój komponent bean JSF zakresu widoku lub sesji powinien zostać zresetowany. Czy jest jakiś sposób na zrobienie tego?Zresetuj JSF Backing Bean (View lub Session Scope)

Thank

Odpowiedz

11

Znalazłem rozwiązanie dla widoku Zakres.

public static void removeViewScopedBean(String beanName) 
    { 
     FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(beanName); 
    } 
+8

To jest po prostu niezgrabne i nie powinno być konieczne dla widoku z ziarnami w planie. – BalusC

+0

@BalusC nie powinien być konieczny, ale chcę, aby moja Fasola została zniszczona, gdy użytkownik opuszcza stronę (poprzez zamykanie karty lub wpisywanie niestandardowego adresu URL). I Fasola widoku nie zostanie zniszczona, dopóki sesja nie zostanie unieważniona. Więc Widok zniknął, ale Fasolka nadal tam jest - więc wydaje się, że to jedyny sposób. A sesja nie może być unieważniona, dopóki inne zakładki są nadal aktywne ... – Falco

10

Widok scoped fasola zostaną odtworzone po powrocie nieprzestrzegania null lub niezastosowania void od sposobu działania, nawet jeśli byłoby wrócić do tego samego widoku. Tak, tylko zwrócić String od sposobu działania, nawet jeśli jest to tylko pusty ciąg:

public String submit() { 
    // ... 

    return ""; 
} 

Żeby było kompletne, można rozważyć wysłanie przekierowanie dołączając ciąg ?faces-redirect=true zapytań do zwracanego rezultatu.

public String submit() { 
    // ... 

    return "viewId?faces-redirect=true"; 
} 

Sesja o ustalonej proporcji jest na pierwszym miejscu nieprawidłowym zakresem dla tego, co aktualnie próbuje się osiągnąć. Dana fasola powinna być taka, która ma zasięg widoku. Ignorując to, można po prostu odtworzyć model w metodzie akcji, albo bardzo może całkowicie unieważnić sesję (która tylko zniszczyłaby wszystkie inne komponenty bean widoku i obszaru sesji, nie wiem, czy to jest to, czego szukasz).

+0

co jeśli backingbean ma zasięg sesji i nadal chcę osiągnąć powyższy wynik? –

2

prostu usuń wszystkie odsłony:

FacesContext.getCurrentInstance().getViewRoot().getViewMap().clear();

i pamiętają implementuje Serializable we wszystkich widokach

+0

Podoba mi się to lepiej - więc nie musisz dbać o to, by poszczególne ziarna pozostały w tyle ... czysta łupka - oczyść wszystko. – Falco

1

Można również odświeżyć stronę z JavaScript, więc ViewScoped Bean będzie reseted, na przykład w poleceniu primefacesButton:

<p:commandButton value="Button" action="#{bean.someAction()}" oncomplete="location.reload()"/> 
Powiązane problemy