Это - интересная идея. Мне было бы любопытно знать, как это удается на практике.
Получение правил перехода
Навигация обрабатывается NavigationHandler. Овладение NavigationHandler не является трудным, но API не выставляет правила, которые это использует.
Поскольку я вижу его, Вы можете:
Теперь, у Вас есть другая проблема также. Куда Вы собираетесь сохранить отображения для поиска представлений? Твердый код их в бобах?
Используя правила перехода
От руки я могу думать о двух способах, которыми Вы могли создать содержащие параметр URL из бэкенда. Оба включают определение боба некоторого вида.
<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>
Источник:
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;
}
}
ДОБРАТЬСЯ
Для ПОЛУЧИТЬ запроса можно использовать UIParameters, чтобы установить значения и позволить рендереру создать список параметров.
<h:outputLink value="#{navBean.urlLink}">
<f:param name="foo" value="#{navBean.value}" />
<h:outputText value="get" />
</h:outputLink>
POST
Если Вы хотите установить URL на представление во время действия POST, можно сделать это с помощью перенаправления в действии (вызванный кнопкой или линией передачи команд).
<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
<h:outputText value="post" />
</h:commandLink>
Примечания
Обратите внимание, что ExternalContext.encodeActionURL используется для кодирования строки. Это - хорошая практика для создания кода, который является портативным через контексты (портлеты, и так далее). Вы использовали бы encodeResourceURL, если бы Вы кодировали ссылку на изображение или загружаете файл.
Вы рассмотрели форму?
<h:form>
<h:commandLink value="Click to see the message" action="#{handler.outcome}" />
<h:inputHidden id="msgId" value="#{bean.msgId}"/>
</h:form>
Вы могли использовать линию передачи команд с вложенными тегами параметрического усилителя. Это - в основном то же, как hubbardr сказал выше:
<h:form>
<h:commandLink value="click here" action="${handler.outcome}">
<f:param name="msgId" value="${bean.id}" />
</h:commandLink>
</h:form>
Затем в Вашем бобе поддержки необходимо сделать:
Map requestMap = FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap();
String msgId = (String) requestMap.get("msgId");
И затем сделайте то, что необходимо сделать.
Пробовали использовать PrettyFaces? Это расширение JSF с открытым исходным кодом, разработанное специально для создания закладок страниц JSF / JSF с помощью запросов GET.
PrettyFaces - SEO, динамические параметры, закладки и навигация для JSF / JSF2