Co można i do czego można wykorzystać?
Czy ktoś może wyjaśnić, jak możemy użyć w ogóle, lub w prawdziwym świecie przykład tego fragmentu?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
2 answers
Parametry GET procesu
The <f:viewParam>
zarządza ustawianiem, konwersją i walidacją parametrów GET. To jest jak <h:inputText>
, ale potem dla parametrów GET.
Następujący przykład
<f:metadata>
<f:viewParam name="id" value="#{bean.id}" />
</f:metadata>
Robi w zasadzie co następuje:
- pobiera wartość parametru request po nazwie
id
. - przekonwertować i w razie potrzeby zweryfikować (można użyć
required
,validator
iconverter
atrybutów i zagnieździć w nim<f:converter>
i<f:validator>
jak z<h:inputText>
) - jeśli konwersja i Walidacja powiodą się, ustaw ją jako właściwość bean reprezentowaną przez wartość
#{bean.id}
, lub jeśli atrybutvalue
jest nieobecny, ustaw ją jako attribute request on nameid
tak, aby była dostępna przez#{id}
w widoku.
Więc gdy otworzysz stronę jako {[24] } wtedy wartość parametru 10
zostanie ustawiona w bean w ten sposób, tuż przed renderowaniem widoku.
Jeśli chodzi o walidację, poniższy przykład ustawia param na required="true"
i pozwala tylko wartości od 10 do 20. Każda awaria walidacji spowoduje wyświetlenie komunikatu.
<f:metadata>
<f:viewParam id="id" name="id" value="#{bean.id}" required="true">
<f:validateLongRange minimum="10" maximum="20" />
</f:viewParam>
</f:metadata>
<h:message for="id" />
Wykonywanie działań biznesowych na parametrach GET
Możesz użyć <f:viewAction>
za to.
<f:metadata>
<f:viewParam id="id" name="id" value="#{bean.id}" required="true">
<f:validateLongRange minimum="10" maximum="20" />
</f:viewParam>
<f:viewAction action="#{bean.onload}" />
</f:metadata>
<h:message for="id" />
Z
public void onload() {
// ...
}
The <f:viewAction>
jest jednak Nowy od JSF 2.2 (the <f:viewParam>
istnieje już od JSF 2.0). Jeśli nie możesz uaktualnić, najlepszym rozwiązaniem jest użycie <f:event>
zamiast tego.
<f:event type="preRenderView" listener="#{bean.onload}" />
Jest to jednak wywoływane na każdym wniosku. Ty należy wyraźnie sprawdzić, czy żądanie nie jest postback:
public void onload() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
Jeśli chcesz pominąć również przypadki "Konwersja / Walidacja nie powiodła się", wykonaj następujące czynności:]}
public void onload() {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
// ...
}
}
Używanie <f:event>
w ten sposób jest zasadniczo obejściem/hack, dlatego właśnie <f:viewAction>
został wprowadzony w JSF 2.2.
Przekaż parametry widoku do następnego widoku
Możesz" przekazać " parametry widoku w linkach nawigacyjnych, ustawiając atrybut includeViewParams
na true
lub dodając includeViewParams=true
request parametr.
<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">
Który generuje z powyższego przykładu <f:metadata>
W zasadzie następujący link
<a href="next.xhtml?id=10">
Z oryginalną wartością parametru.
Tylko to podejście wymaga aby next.xhtml
miało również a <f:viewParam>
na tym samym parametrze, w przeciwnym razie nie zostanie on przepuszczony.
Użyj formularzy GET w JSF
<f:viewParam>
może być również używany w połączeniu z formularzami GET "plain HTML".
<f:metadata>
<f:viewParam id="query" name="query" value="#{bean.query}" />
<f:viewAction action="#{bean.search}" />
</f:metadata>
...
<form>
<label for="query">Query</label>
<input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" />
<input type="submit" value="Search" />
<h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
...
</h:dataTable>
W Zasadzie to @RequestScoped
bean:
private String query;
private List<Result> results;
public void search() {
results = service.search(query);
}
Zauważ, że <h:message>
jest dla <f:viewParam>
, a nie zwykły HTML <input type="text">
! Należy również zauważyć, że wartość wejściowa wyświetla #{param.query}
, gdy {[45] } jest pusta, ponieważ przesłana wartość w przeciwnym razie nie pojawi się w ogóle, gdy wystąpi błąd walidacji lub konwersji. Zauważ, że ta konstrukcja jest nieprawidłowa Dla komponentów wejściowych JSF (robi to już "pod pokrywami").
Zobacz też:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55
Wyślij params z widoku do innego widoku, z widoku nadawcy do widoku odbiorcy użyj viewparam i includeViewParams = true
In Sender
- Zadeklaruj params do wysłania. Możemy wysłać String, Object, ...
Nadawca.xhtml
<f:metadata>
<f:viewParam name="ID" value="#{senderMB._strID}" />
</f:metadata>
- wyślemy param ID, zostanie on dołączony do
“includeViewParams=true”
W return String of click button event Kliknij przycisk odpal senderMB.clickBtnDetail (dto) z dto od senderMB._arrData
Nadawca.xhtml
<p:dataTable rowIndexVar="index" id="dataTale"value="#{senderMB._arrData}" var="dto">
<p:commandButton action="#{senderMB.clickBtnDetail(dto)}" value="見る"
ajax="false"/>
</p:dataTable>
W senderMB.clickBtnDetail (dto) przypisujemy _strID z argumentem otrzymanym z button event (dto), tutaj jest to Sender_DTO i przypisujemy do senderMB._strID
Sender_MB.java
public String clickBtnDetail(sender_DTO sender_dto) {
this._strID = sender_dto.getStrID();
return "Receiver?faces-redirect=true&includeViewParams=true";
}
Link po kliknięciu stanie się http://localhost:8080/my_project/view/Receiver.xhtml?*ID=12345*
In Recever
- Pobierz viewParam Odbiornik.xhtml W Receiver deklarujemy f: viewParam aby uzyskać param z żądania get (receive), nazwa param odbiorcy musi być taka sama z nadawcą (page)
Odbiornik.xhtml
<f:metadata><f:viewParam name="ID" value="#{receiver_MB._strID}"/></f:metadata>
Otrzyma param ID z widoku nadawcy i przypisze do receiver_MB._strID
- użyj viewParam W Receiver chcemy użyć tej param w zapytaniu sql przed renderowaniem strony, tak że używamy zdarzenia preRenderView. Nie będziemy używać constructor, ponieważ constructor zostanie wywołany przed otrzymaniem viewparam Aby dodać
Odbiornik.xhtml
<f:event listener="#{receiver_MB.preRenderView}" type="preRenderView" />
Do f: metadane tag
Odbiornik.xhtml
<f:metadata>
<f:viewParam name="ID" value="#{receiver_MB._strID}" />
<f:event listener="#{receiver_MB.preRenderView}"
type="preRenderView" />
</f:metadata>
Teraz chcemy użyć tego param w naszej metodzie bazy danych read, jest ona dostępna do użycia
Receiver_MB.java
public void preRenderView(ComponentSystemEvent event) throws Exception {
if (FacesContext.getCurrentInstance().isPostback()) {
return;
}
readFromDatabase();
}
private void readFromDatabase() {
//use _strID to read and set property
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-12 16:03:03