Мне нужно изменить контекст моего сайта, используя параметр, отправленный клиентом.
Например, если я вызываю http://localhost:8084/JSF/
, я загружаю обычный index.xhtml
со страницей «Домашняя страница» в шаблоне content
(по умолчанию). Но, если я позвоню http://localhost:8084/JSF/index.xhtml?page=profile
, мне нужен своего рода переключатель в index.xhtml
и включить/вставить шаблон профиля (или страницу, определяющую профиль) в мою область content
.
Я думаю, что для этого мне нужно управлять сервлетом, потому что я не думаю, что смогу создать своего рода переключатель в своем index.xhtml. Поэтому я думаю, что мне нужно загрузить какой-то шаблон вместо другого.
Какой сервлет мне нужно использовать? Или мне нужно создать свой собственный сервлет для этого?
Ваше здоровье
ОБНОВЛЕНИЕ (добавлено по предложению 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>
@RequestScoped
. Вы пропустили это в обновлении вопроса, я добавил его в своем обновлении ответа. Что касаетсяweb.xml
, минимальной записью должно бытьFacesServlet
, но это должно быть в порядке, если другие страницы JSF работают нормально. Это будет проблематично, только если вы получите404 Resource not found
илиRuntimeException: cannot find FacesContext
. 24.11.2010url-pattern
изFacesServlet
? Это*.xhtml
? Если это*.jsf
, то его нужно изменить или открыть страницу поindex.jsf?page=profile
вместоindex.xhtml?page=profile
. Кроме того, щелкните правой кнопкой мыши страницу в браузере и выберите Просмотр исходного кода и убедитесь, что она не содержит НИ ОДНОЙ строки кода JSF/Facelets. Если в исходном коде в браузере есть код JSF/Facelets, это означает, что URL-адрес запроса не соответствуетurl-pattern
изFacesServlet
и, следовательно,FacesServlet
не вызывается, и поэтому все теги JSF/Facelets остаются необработанными и отправляются в браузер как -является. 24.11.2010FacesServlet
не отображается на*.xhtml
. Может быть, это*.jsf
. Затем вы должны заменить URL-адрес в браузере на/index.jsf
или заменитьurl-pattern
изFacesServlet
вweb.xml
на*.xhtml
. См. также 4-й комментарий. Кстати, лучше всего свести к минимуму шум в коде, который вы собираетесь опубликовать в вопросе. В вашемindex.xhtml
много кода, который совершенно не имеет отношения к реальному вопросу/проблеме. См., например, мои примеры xhtml для хорошего примера минимально необходимого кода, связанного с вопросом. 24.11.2010FacesServlet
с/faces/*
. Вместо этого вам нужно открыть его с помощью/faces/index.xhtml
(точно так же, как это делает<welcome-file>
!). Однако это старомодный способ (стиль JSF 1.0) отображенияFacesServlet
. Я предлагаю использовать*.xhtml
и не помещать файлы в папку/faces
. Таким образом, вы никогда не столкнетесь с проблемой неразбора файлов XHTML, если они не открываютсяurl-pattern
изFacesServlet
. 24.11.2010http://example.com
, а не наhttp://example.com/index.html
? Если да, обновили ли вы также<welcome-file>
, чтобы удалить/faces
? 24.11.2010index.xhtml
все равно выглядит немного странно. Я ожидаю, что<html>
и<h:body>
будут вtemplate.xhtml
. Как выглядитtemplate.xhtml
? Как выглядит сгенерированный HTML в браузере (Просмотреть исходный код)? В любом случае, попробуйте запустить точный пример, как в моем ответе. Если это работает, то на этот вопрос в основном уже дан ответ, и причина вашей текущей проблемы кроется где-то еще. 24.11.2010ui:include
вui:composition
дляtemplate
. Это не сработает. Все, что находится за пределамиui:define
, будет игнорироваться. Вместо этого вам нужно поместитьui:include
вui:define
или внутриtemplate.xhtml
. Между прочим, не связанные с проблемой, объявления XML-страниц только навредят MSIE (поэтому удалите их), а тип документа в настоящее время может быть лучше HTML5:<!DOCTYPE html>
. См. также этот ответ. 24.11.2010private String page = "index";
или в конструкторе компонентаthis.page = "index";
. Вам также необходимо проверить его, поскольку конечный пользователь может изменить его вручную путем изменения параметра запроса! В качестве альтернативы вы можете поместить<ui:include>
в блок<c:catch>
и проигнорировать исключение. Я обновлю пример в ответе. 24.11.2010