JSF, Scope

ObiałyOrzeł
ObiałyOrzeł
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 3 lata
  • Postów:28
0

Mam parę niejasności odnoście JavaServer Faces:

Podczas tworzenia ziarna w ManagedBean można wybrać poniższe Scope:

  • request
  • application
  • view
  • none
    Kiedy oraz w jakich przypadkach mam je stosować ? Jakie są różnice między nimi ?

Kiedy mam do klasy implementować Serializable ?
Kiedy używać adnotację @PostConstruct ?
A co z konstruktorem klasy ? Zawsze zostawiać pusty ?

Wiem, że dużo pytać ale będę niezmiernie wdzięczy za wyjaśnienie chociaż jednego :)

M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 6 lat
2

Podczas tworzenia ziarna w ManagedBean można wybrać poniższe Scope:
request
application
view
none

Jest jeszcze session. Poczytaj o tym czym jest request http, czym jest sesja. Application to taki singleton, który jest współdzielony przez wszystkich użytkowników. NoneScoped oznacza, ze po wykonaniu DI wstrzyknięty Managed Bean odziedziczy scope komponentu, który go wstrzykuje. View zachowuje stan w biazacej zakladce przegladarki: w kazdej zakladce jest inny stan dla tego samego widoku.

Serializable przydaje sie tam, gdzie scope moze byc zrzucony w pamieci i zapisany np. na dysku. Czyli zawsze ViewScoped i SessionScoped.

@PostConstruct służy jako konstruktor, po stworzeniu Managed Beana jest wykonywana metoda w ten sposób zaadnotowana. Używa się tego ponieważ w konstruktorze nie masz dostępu do wstrzykiwanych bytów np. @ejb, @Inject, @ManagedProperty. Są one dostępne dopiero w @PostConstruct. Jest to przydatne szczególnie wtedy jak podczas załadowaniu widoku chcesz pobrać np. dane z bazy i je od razu wyswietlic.

Z czystych konstruktorów raczej nie korzysta się z przyczyn wspomnianych powyżej.

edytowany 1x, ostatnio: margor90
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 3 godziny
  • Postów:3553
1

Zapomniałem o najważniejszym scope - session.

Po kolei:

  • application - odpowiednik singletonów, stworzony bean będzie działał tak długo, jak aplikacja. Może być stosowany jako np. zasób wspólny dla wszystkich użytkowników (cache, jakiś connection pool itp.).
  • session - stworzony bean jest przypisany do sesji i dopóki ona trwa, to taki obiekt będzie istniał. Chyba najbardziej uniwersalny, trzymamy w nim np. dane użytkownika w forum.
  • view - beany są "zapominane" przy wyjściu z konkretnego widoku. Przykładowo: jeśli chcemy, aby po wejściu na konkretną stronkę widok był pusty (np. stworzymy sobie funkcjonalność tworzenia notatek i chcemy, aby po wejściu w "Nową notatkę" za każdym razem wszystkie pola były puste)
  • request - beany są tworzone przy tworzeniu HttpRequest - do obsługi żądań
  • none - trudno mi powiedzieć, po co to jest :) W teorii można dodać jeden obiekt takiego zasięgu w dwóch obiektach (np. request i view), i wtedy będzie on trzymany tak długo jak jest potrzebny.

Obiekty powinny być serializowalne, kiedy muszą być powielane pomiędzy sesją użytkownika i serwerem. Tzn. wszystkie beany application, session i view muszą być serializowalne. Request chyba nie (jak jest inaczej niech mnie ktoś poprawi), none - nie wiem :)

Annotacji @PostConstruct używamy wtedy, kiedy chcemy aby po pojawieniu się beana coś się zadziało. Np. inicjalizacja zmiennych, list itp.
Konstruktor - musi być domyślny (bezparametrowy), najlepiej zostawić pusty i odwołać się do @PostConstruct.

ObiałyOrzeł
ObiałyOrzeł
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 3 lata
  • Postów:28
0
  • Session - przechowuje np czy użytkownik jest zalogowany - żeby nie trzeba było po przejściu do innej strony znowu się logować - czas trwa domyślnie to chyba 24 minuty lub do zamknięcia przeglądarki.

  • View - jeśli stworzę dialog w którym będę się mógł zalogować i za każdym razem jak go otworzę otworzę to będą puste pola. A jeśli będę chciał aby były uzupełnione(po wcześniejszym ręcznym wpisaniu jakiś wartości) to ustawiam session ?

  • Request - jest to wykonywane za każdym razem gdy kliknę w przycisk czy coś takiego. Za każdym razem prosi o wykonanie tej rzeczy jeszcze raz.

  • Application - to jest taka jakby zmienna STATIC w Javie ? Globalna i dostępna dla każdego

  • None - jak mam w ziarnie zmienną imie="Adam" i zrobię formularz do którego wpiszę "Maria" to wtedy w tej zmiennej będzie cały czas przechowywana za zmienna - po prostu go odziedziczy.

Tak to zrozumiałem. Jeśli jest błędne to proszę poprawić.

edytowany 1x, ostatnio: ObiałyOrzeł
M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 6 lat
0
  1. Czas trwania sesji konfigurujesz w minutach w web.xml.
  2. Sesja moze przechowywac cokolwiek tak dlugo jak jestes zalogowany.
  3. Domyslnie sesja jest przechowywana po stronie serwera.
  4. Tak naprawde @ViewScoped to specjalnie wydzielony fragment sesji, tak aby bylo wygodnie. Zasieg byl opisany powyzej.
  5. Nie jest to static, ale mozna o tym tak myslec (singleton): cos co jest dostepne dla kazdego (przynajmniej jak nie ma node'ow). Jak sa node'y i klastrowe srodowisko to trzeba zobaczyc w specyfikacji JSF Managed Beans.
  6. Pomysl o @NoneScoped jako o zwyklym DI, ktore po prostu zawsze tworzy obiekt (bez proxy), zamiast new i rejestruje go zgodnie z JSF EL (dostep po nazwie).
edytowany 2x, ostatnio: margor90
ObiałyOrzeł
ObiałyOrzeł
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 3 lata
  • Postów:28
1

Stworzyłem sobie coś takiego:

FirstPage.xhtml

Kopiuj
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Scope - testowanie</title>
    </h:head>
    <h:body>
        
        <h:form id="testForm" >
            <p:outputLabel for="session" value="Session" />
            <p:inputText id="session" size="20"  value="#{mySession.session}"/> <br />
            
            <p:outputLabel for="view" value="View" />
            <p:inputText id="view" size="20"  value="#{myView.view}"/> <br />
            
            <p:outputLabel for="request" value="Request" />
            <p:inputText id="request" size="20"  value="#{MyRequest.request}" /> <br />

            <p:outputLabel for="none" value="None" />
            <p:inputText id="none" size="20"  value="#{myNone.none}" /> <br />
            
            <p:commandButton ajax="false" value="Save value" />  <br/>
                
            <p:link value="First Page" outcome="FirstPage.xhtml?faces-redirect=true" /> <br/>
            <p:link value="Second Page" outcome="SecondPage.xhtml?faces-redirect=true" /><br/>
            
            <h:outputText value="Session" /> <br/>
            <h:outputText value="#{mySession.session}" /><br/>
            <h:outputText value="View" /> <br/>
            <h:outputText value="#{myView.view}" /><br/>
            <h:outputText value="Request" /> <br/>
            <h:outputText value="#{MyRequest.request}" /><br/>
            <h:outputText value="None" /> <br/>
            <h:outputText value="#{myNone.none}" /><br/>
        </h:form>
        
    </h:body>
</html>

SecondPage.xhtml

Kopiuj
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Scope - testowanie</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </h:head>
    <h:body>
        <h:outputText value="Druga strona" /><br/>
        
        <h:outputText value="Session" /> <br/>
        <h:outputText value="#{mySession.session}" /><br/>
        <h:outputText value="View" /> <br/>
        <h:outputText value="#{myView.view}" /><br/>
        <h:outputText value="Request" /> <br/>
        <h:outputText value="#{MyRequest.request}" /> <br/>
        <h:outputText value="None" /> <br/>
        <h:outputText value="#{myNone.none}" /><br/>
        
            <p:link value="First Page" outcome="FirstPage.xhtml?faces-redirect=true" /> <br/>
            <p:link value="Second Page" outcome="SecondPage.xhtml?faces-redirect=true" /><br/>
    </h:body>
</html>

Ziarna (każe wygląda tak samo tylko inna adnotacja i nazwa):

Kopiuj
@ManagedBean (name = "mySession")
@SessionScoped
public class Session implements Serializable{
    private String session = "S - domyślna wartość";
    /**
     * Creates a new instance of Session
     */
    public Session() {
    }
    

    public String getSession() {
        return session;
    }

    public void setSession(String session) {
        this.session = session;
    }
    
}

Wnioski:

@SessonScoped
działa tak długo jak mam otwartą przeglądarkę - mogę otwerać nowe karty a i tak session będzie cały czas aktywna.
Aby móc pobierać wartości z sesji w javie trzeba je najpierw zapisać "setAttribute" - szczególnie podczas robia panelu logowania

@ViewScoped
działa tylko na aktualnej stronie,przejśćie do innej strony pobiera domyślną wartość, otworzenie nowej karty, odświeżenie strony robi to samo

@NoneScoped
Sam nie wiem ile on trwa, po kliknięcu w przcisk od razu się ustawia na domyślną wartość

@Application Scoped
http://www.primefaces.org/showcase/ui/data/datatable/selection.xhtml
Ten tam użyty @ApplicationScope
Jest on użyty po to aby uzupełnić tabelę losowymi wartościami - niby już wiem kiedy to używać

edytowany 1x, ostatnio: ObiałyOrzeł
O1
  • Rejestracja:ponad 14 lat
  • Ostatnio:dzień
0

Tak na marginesie, bodajże od wersji JSF 2.2 ManagedBeany nie są zalecane do używania. Zamiast nich powinno się używać CDI.

edytowany 1x, ostatnio: olek1
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)