/ / JSF - Holen Sie sich den URL-Parameter und wählen Sie die Seite - Servlet? - jsf, servlets, jsf-2, facelets

JSF - Url-Parameter abrufen und Seite auswählen - Servlet? - jsf, servlets, jsf-2, facelets

Ich muss den Kontext meiner Site mithilfe des vom Client gesendeten Parameters ändern.

Zum Beispiel, wenn ich anrufe http://localhost:8084/JSF/ Ich lade das übliche index.xhtml mit der "Homepage" Seite auf der content vorlage (voreingestellt). Aber wenn ich anrufe http://localhost:8084/JSF/index.xhtml?page=profileIch brauche eine Art Schalter in der index.xhtml, und fügen Sie die Profilvorlage (oder eine Seite, die das Profil definiert) in my ein content Bereich.

Ich denke, ich muss ein Servlet verwalten, um es zu tun, weil ich nicht glaube, dass ich eine Art Swith in meinem index.xhtml erstellen kann. Also denke ich, ich muss eine Vorlage anstelle einer anderen laden.

Welches Servlet muss ich verwenden? Oder muss ich mein eigenes Servlet erstellen, um dies zu tun?

Prost

UPDATE (hinzugefügt nach dem Vorschlag von BalusC)

package Beans;

import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ManagedBean;

@ManagedBean(name="selector")
@ManagedProperty(value="#{param.page}")
public class Selector {
private String page;

public String getPage() {
return page;
}

public void setPage(String page) {
this.page = page;
}

}

template.xhtml

<?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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">

<h:head>
<title><ui:insert name="title">Facelets Template</ui:insert></title>
</h:head>

<h:body>
<ui:insert name="login_homepage">Box Content Here</ui:insert>

<ui:insert name="content_homepage">Box Content Here</ui:insert>
</h:body>
</html>

index.xhtml

 <?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">

<ui:composition template="./template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="title">
// title
</ui:define>

<ui:define name="login_homepage">
// login
</ui:define>

<ui:include src="#{selector.page}.xhtml" />

<ui:define name="content_homepage">
// content
</ui:define>
</ui:composition>

web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
</web-app>

profile.xhtml

<?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">
<ui:composition
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h2>PROFILE</h2>
</ui:composition>

Antworten:

9 für die Antwort № 1

Anforderungsparameter können in der JSF-Bean von eingestellt werden @ManagedProperty.

@ManagedProperty(value="#{param.page}")
private String page;

(Das macht im Grunde ein bean.setPage(request.getParameter("page")) direkt nach dem Bohnenbau)

Sie können EL in Facelets verwenden <ui:include>.

<ui:include src="#{bean.page}.xhtml" />

(ob bean.getPage() kehrt zurück profilewürde der Wert als enden profile.xhtml und entsprechend enthalten)

Keine Notwendigkeit für ältere Servlets :)


Aktualisieren: du hast die Anmerkung an der falschen Stelle gesetzt. Es sollte so aussehen, genau wie in meiner ursprünglichen Antwort:

package beans;

import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class Selector {

@ManagedProperty(value="#{param.page}")
private String page;

public String getPage() {
return page;
}

public void setPage(String page) {
this.page = page;
}

}

Beachten Sie, dass ich das weggelassen habe @ManagedBean name, da der Standardwert bereits der Klassenname ist, in dem das erste Zeichen in Kleinbuchstaben steht (genau so, wie Sie es manuell angegeben haben). Ich habe auch die @RequestScoped Anmerkung zur Angabe des Bean-Bereichs. Ich habe auch den Paketnamen gesenkt, da Großbuchstaben im Paketnamen standardmäßig nicht zulässig sind Java-Namenskonventionen.

Das Ganze <managed-bean> im faces-config.xml ist völlig überflüssig mit den neuen JSF 2.0 Annotationen. Du duplizierst es im Grunde. Entferne es.


Update 2: das index.xhtml sollte so aussehen

<!DOCTYPE html>
<html lang="en"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<title>Include demo</title>
</h:head>
<h:body>
<h1>This is the index page</h1>
<c:catch>
<ui:include src="#{selector.page}.xhtml" />
</c:catch>
</h:body>
</html>

(das <c:catch> ist da, um das zu unterdrücken FileNotFoundException wenn es keine solche Datei gibt)

Das include.xhtml sollte so aussehen:

<!DOCTYPE html>
<ui:composition
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h2>Include page content</h2>
</ui:composition>

Vorausgesetzt, dass FacesServlet hört zu url-pattern von *.xhtml und die beiden Dateien befinden sich im selben Ordner, öffnen Sie ihn mit index.xhtml?page=include.


0 für die Antwort № 2

In der aktualisierten Frage sind die folgenden Zeilen nicht in Ordnung:

@ManagedBean(name="selector")
@ManagedProperty(value="#{param.page}")
public class Selector {
private String page;

Es sollte das sein:

@ManagedBean(name="selector")
public class Selector {
@ManagedProperty(value="#{param.page}")
private String page;

0 für die Antwort № 3

Das Problem ist, dass, wenn Sie eine Befehlsschaltfläche habenin der dynamisch eingeschlossenen Datei, Die Befehlsschaltfläche funktioniert nicht. Die Aktionsroutine wird nie aufgerufen. Ich versuche es immer noch eine Lösung dafür zu finden, auch mit Mojarra 2.1.