Wie eine GET-Anforderung mit Parametern erstellen, mit JSF und Navigation-Regeln?
-
02-07-2019 - |
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.
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:
- analysieren faces-config.xml auf Initialisierung und speichern Sie die Regeln im Anwendungskontext ( leicht )
- 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 )
- 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.
machenPrettyFaces - 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.