Frage

Gibt es eine Möglichkeit, um einen HTML-Link mit h zu erstellen:? OutputLink, anderem JSF-Tag oder Code eine nicht Gesichter Anfrage (HTTP GET) mit Anforderungsparametern erstellen

Zum Beispiel habe ich folgende Navigations-Regel

<navigation-rule>
    <navigation-case>
        <from-outcome>showMessage</from-outcome>
        <to-view-id>/showMessage.jsf</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

In meiner Seite möchte ich eine Ausgabe wie die folgende HTML-Code:

<a href="/showMessage.jsf?msg=23">click to see the message</a>

Ich konnte nur den HTML-Code in die Seite schreiben, aber ich möchte die Navigationsregel verwenden, um alle URLs in einer einzigen konfigurierbaren Datei definiert zu haben.

War es hilfreich?

Lösung

Dies ist eine interessante Idee. Ich würde neugierig sein, zu wissen, wie es Pfannen in der Praxis aus.

Getting die Navigationsregeln

Navigation wird durch die NavigationHandler . Habhaft des NavigationHandler ist nicht schwierig, aber die API aussetzen nicht die Regeln, die sie verwendet.

Wie ich es sehe, können Sie:

  1. analysieren faces-config.xml auf Initialisierung und speichern Sie die Regeln im Anwendungskontext ( leicht )
  2. Ihre eigene NavigationHandler implementieren, die die Regeln in faces-config.xml oder ergänzt sie mit eigenen Regeln Datei ignoriert und setzt seine ruleset irgendwie ( bearbeitbar, aber braucht ein wenig Arbeit )
  3. verspotten Ihre eigene Faces und gibt sie an den bestehenden Navigations Handler ( wirklich schwierig, zwei Faces Objekt koexistieren in demselben Thread zu machen und äußerst ineffizient )

Nun haben Sie ein anderes Problem zu. Wo wollen Sie die Zuordnungen halten, um die Ansichten zu nachschlagen? Hard-Code sie in den Bohnen?

Mit den Navigationsregeln

Aus der Hand, kann ich mich zwei Möglichkeiten, wie Sie Parameter enthaltende URLs aus dem Back-End konstruieren könnten. Beide beinhalten eine Bohne von einer Art zu definieren.

<managed-bean>
    <managed-bean-name>navBean</managed-bean-name>
    <managed-bean-class>foo.NavBean</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

Quelle:

package foo;

import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

public class NavBean implements Serializable {

    private String getView() {
        String viewId = "/showMessage.faces"; // or look this up somewhere
        return viewId;
    }

    /**
     * Regular link to page
     */
    public String getUrlLink() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext extContext = context.getExternalContext();
        String viewId = getView();
        String navUrl = context.getExternalContext().encodeActionURL(
                extContext.getRequestContextPath() + viewId);
        return navUrl;
    }

    /**
     * Just some value
     */
    public String getValue() {
        return "" + System.currentTimeMillis();
    }

    /**
     * Invoked by action
     */
    public String invokeRedirect() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext extContext = context.getExternalContext();
        String viewId = getView();
        try {
            String charEncoding = extContext.getRequestCharacterEncoding();
            String name = URLEncoder.encode("foo", charEncoding);
            String value = URLEncoder.encode(getValue(), charEncoding);
            viewId = extContext.getRequestContextPath() + viewId + '?' + name
                    + "=" + value;
            String urlLink = context.getExternalContext().encodeActionURL(
                    viewId);
            extContext.redirect(urlLink);
        } catch (IOException e) {
            extContext.log(getClass().getName() + ".invokeRedirect", e);
        }
        return null;
    }

}

GET

Für eine GET-Anfrage können Sie die UIParameters verwenden, um die Werte zu setzen und lassen Sie den Renderer die Parameterliste erstellen.

<h:outputLink value="#{navBean.urlLink}">
    <f:param name="foo" value="#{navBean.value}" />
    <h:outputText value="get" />
</h:outputLink>

POST

Wenn Sie die URL zu einer Ansicht während einer POST-Aktion festlegen möchten, können Sie es mit einer Umleitung in einer Aktion tun (aufgerufen durch einen Knopf oder command).

<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
    <h:outputText value="post" />
</h:commandLink>

Notizen

Beachten Sie, dass ExternalContext.encodeActionURL wird verwendet, um die Zeichenfolge zu kodieren. Dies ist eine gute Übung für die Code-Erzeugung, die tragbar über Kontexte (Portlets, und so weiter). Sie würden verwenden encodeResourceURL , wenn Sie einen Link zu einem Bild oder Download-Datei wurden codiert.

Andere Tipps

Versuchte PrettyFaces mit? Es ist eine Open-Source entwickelte JSF Erweiterung speziell ein Lesezeichen JSF-Seiten / JSF mit GET-Anfragen möglich.

machen

PrettyFaces - SEO, dynamische Parameter, Lesezeichen und Navigation für JSF / JSF2

Haben Sie eine Form in Betracht gezogen?

<h:form>
    <h:commandLink value="Click to see the message" action="#{handler.outcome}" />
    <h:inputHidden id="msgId" value="#{bean.msgId}"/>
</h:form>

Sie könnten ein command mit verschachtelten param-Tags verwenden. Dies ist im Grunde die gleiche wie hubbardr oben gesagt:

<h:form>
  <h:commandLink value="click here" action="${handler.outcome}">
    <f:param name="msgId" value="${bean.id}" />
  </h:commandLink>
</h:form>

Dann in Ihrem Backing Bean müssen Sie tun:

Map requestMap = FacesContext.getCurrentInstance()
                 .getExternalContext().getRequestParameterMap();
String msgId = (String) requestMap.get("msgId");

Und dann tun, was Sie tun müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top