JSF - Get url-parameter, und wählen Sie die Seite - Servlet?
Muss ich ändern, den Rahmen meiner Website, verwenden Sie den parameter sended durch den Kunden.
Wenn ich zum Beispiel call http://localhost:8084/JSF/
lade ich die üblichen index.xhtml
mit der "Homepage" - Seite auf der content
Vorlage (als Standard).
Aber, wenn ich den Anruf http://localhost:8084/JSF/index.xhtml?page=profile
brauche ich eine Art Schalter in der index.xhtml
, und include/einfügen der Profil-Vorlage (oder eine Seite definieren-Profil) in meinem content
Bereich.
Ich glaube, ich muss zu verwalten, ein servlet, es zu tun, weil ich glaube nicht, dass ich eine Art von swith in meinem index.xhtml. Also ich glaube, ich brauche zu laden, template anstelle von anderen.
Dem servlet muss ich verwenden? Oder brauche ich zum erstellen meiner eigenen Servlet, dies zu tun?
Cheers
UPDATE (Hinzugefügt, nachdem BalusC s Vorschlag)
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>
- Ich fügte
jsf-2.0
undfacelets
als tags, weil ich weiß, basierend auf Ihre vorherigen Fragen, dass Sie sind mit Ihnen. In der Zukunft, bitte fügen Sie Sie selbst, wenn zutreffend, denn die Antwort wäre ganz anders, wenn Sie war mit alten JSF-1.x und/oder JSP anstelle von Facelets. - Ah ok! Sorry, Tue es 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Request-Parameter sind einstellbar in JSF bean
@ManagedProperty
.(dies gilt grundsätzlich eine
bean.setPage(request.getParameter("page"))
direkt nach bean ' s construction)Können Sie EL in Facelets
<ui:include>
.(wenn
bean.getPage()
zurückprofile
, würde der Wert am Ende alsprofile.xhtml
und enthalten entsprechend)Keine Notwendigkeit für legacy-servlets 🙂
Update: Sie haben die Anmerkung an der falschen Stelle. Es sollte so Aussehen, genau so, wie in meiner ursprünglichen Antwort:
Beachten Sie, dass ich ausgelassen den
@ManagedBean
Namen da der default-Wert ist schon der Klassenname mit dem 1. Zeichen kleingeschrieben werden (das ist genau das gleiche wie du manuell angegeben). Ich habe auch die@RequestScoped
annotation angeben, die bean-scope. Ich habe auch kleingeschrieben werden packagename seit uppercases nicht zulässig sind in den Paket-Namen, wie pro standard -Java-Namenskonventionen.Den ganzen
<managed-bean>
imfaces-config.xml
ist völlig überflüssig mit der neuen JSF-2.0-Anmerkungen. Sie sind im Grunde zu duplizieren. Entfernen Sie es.Update 2: die
index.xhtml
sollte wie folgt Aussehen(die
<c:catch>
ist es zum unterdrücken derFileNotFoundException
wenn es keine solche Datei)Den
include.xhtml
sollte wie folgt Aussehen:Unter der Annahme, dass
FacesServlet
hört aufurl-pattern
von*.xhtml
und die beiden Dateien sind im gleichen Ordner, öffnen Sie es, indemindex.xhtml?page=include
.@RequestScoped
. Vergessen es in die Frage zu aktualisieren, ich habe es in meiner Antwort aktualisieren. Dieweb.xml
, der minimale Eintrag derFacesServlet
, aber das sollte OK sein, wenn andere JSF-Seiten funktioniert. Es wäre nur problematisch, wenn Sie bekommen404 Resource not found
oderRuntimeException: cannot find FacesContext
.url-pattern
desFacesServlet
? Ist es*.xhtml
? Wenn es*.jsf
, dann müssen Sie es ändern, oder öffnen Sie die Seiteindex.jsf?page=profile
stattindex.xhtml?page=profile
. Auch, rechts-klicken Sie die Seite im browser und Quelle Anzeigen, und überprüfen Sie, ob es enthält KEINE EINZIGE Zeile von JSF/Facelets-code. Wenn es von JSF/Facelets-code in den Quelltext im browser an, dann bedeutet es, dass die request-URL nicht übereinstimmenurl-pattern
vonFacesServlet
und damitFacesServlet
nicht aufgerufen wird und damit alle JSF/Facelets-tags sind Links unbearbeitet und an browser, as-ist.FacesServlet
ist nicht abgebildet*.xhtml
. Vielleicht ist es*.jsf
. Sollten Sie dann ersetzen Sie die URL im browser von/index.jsf
oder ersetzen Sie dieurl-pattern
vonFacesServlet
imweb.xml
durch*.xhtml
. Siehe auch 4. Kommentar. Übrigens, am besten ist die Minimierung von Rauschen in dem code, die Sie gehen, um die post in Frage. Es ist viel code in Ihreindex.xhtml
die ist völlig irrelevant für die ist Frage/problem. Siehe zum Beispiel meine xhtml-Beispiele für ein gutes Beispiel für die minimale notwendige code im Zusammenhang mit der Frage.FacesServlet
auf/faces/*
. Sie müssen, um es zu öffnen, indem/faces/index.xhtml
statt (genau wie<welcome-file>
tut!). Dies ist jedoch eine altmodische Art und Weise (JSF 1.0 style) die Zuordnung derFacesServlet
. Ich würde vorschlagen, zu verwenden*.xhtml
und nicht die Dateien in das/faces
Ordner. Auf diese Weise werden Sie nie ein problem von XHTML-Dateien, die von ungeparsten, wenn Sie nicht öffnen Sie es, indemurl-pattern
vonFacesServlet
.http://example.com
Startseite und nicht aufhttp://example.com/index.html
? Wenn ja, hast du das update der<welcome-file>
als auch zu entfernen/faces
?index.xhtml
ein wenig seltsam aussieht sowieso. Ich würde erwarten, dass die<html>
und<h:body>
werden intemplate.xhtml
. Wie funktionierttemplate.xhtml
Aussehen? Wie wird es generiert HTML-browser (Quelle Anzeigen) Aussehen? Sowieso, versuchen, führen Sie das genaue Beispiel, wie in meiner Antwort. Wenn es funktioniert, dann ist diese Frage grundsätzlich schon beantwortet, und die Ursache für das aktuelle problem liegt woanders.ui:include
in einemui:composition
für einetemplate
. Das ist nicht zur Arbeit gehen. Alles, was außerhalbui:define
werden ignoriert. Sie müssenui:include
in einemui:define
oder innerhalbtemplate.xhtml
statt. Durch die Art und Weise, ohne Beziehung zu dem problem, die XML-Seite Erklärungen würden nur MSIE Chaos (ja, entfernen Sie Sie) und der doctype kann heute besser sein, den HTML5-one:<!DOCTYPE html>
. Siehe auch die Antwort.private String page = "index";
oder in bean Konstruktorthis.page = "index";
. Sie müssen auch zu bestätigen, da die enduser können es manuell ändern, indem Sie Anfrage-parameter-änderung! Alternativ können Sie die<ui:include>
im<c:catch>
blocken und ignorieren die Ausnahme. Ich werde aktualisieren, das Beispiel in der Antwort.In der aktualisierten Frage, die folgenden Zeilen sind nicht in Ordnung:
Sollte es so sein:
Das problem ist, dass wenn Sie eine Befehlsschaltfläche in der dynamisch-Datei
die Befehlsschaltfläche wird nicht funktionieren. Der action-routine nie aufgerufen wird. Ich bin immer noch versuchen
eine Lösung zu finden, auch mit Mojarra 2.1.