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>
Author: BalusC, 2011-06-16

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 i converter 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 atrybut value jest nieobecny, ustaw ją jako attribute request on name id 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ż:

 290
Author: BalusC,
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

  1. Zadeklaruj params do wysłania. Możemy wysłać String, Object, ...

Nadawca.xhtml

<f:metadata>
      <f:viewParam name="ID" value="#{senderMB._strID}" />
</f:metadata>
  1. 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

  1. 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

  1. 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   
}
 1
Author: vuvo,
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