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=profile
Ich 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 № 1Anforderungsparameter 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 profile
wü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.