Установите параметры запроса GET как управляемые свойства в faces-config.xml
, чтобы вам не нужно было собирать их вручную:
<managed-bean>
<managed-bean-name>forward</managed-bean-name>
<managed-bean-class>com.example.ForwardBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>action</property-name>
<value>#{param.action}</value>
</managed-property>
<managed-property>
<property-name>actionParam</property-name>
<value>#{param.actionParam}</value>
</managed-property>
</managed-bean>
Таким образом, запрос forward.jsf?action=outcome1&actionParam=123
позволит JSF установить * 1006Параметры * и actionParam
как action
и actionParam
свойств ForwardBean
.
Создают небольшое представление forward.xhtml
(настолько маленькое, что оно помещается в буфер ответов по умолчанию (часто 2 КБ), так чтоон может быть сброшен обработчиком навигации, в противном случае вам нужно увеличить буфер ответов в конфигурации сервлетконтейнера), который вызывает метод bean-компонента на beforePhase
из f:view
:
<!DOCTYPE html>
<html xmlns:f="http://java.sun.com/jsf/core">
<f:view beforePhase="#{forward.navigate}" />
</html>
ForwardBean
может выглядеть следующим образом:
public class ForwardBean {
private String action;
private String actionParam;
public void navigate(PhaseEvent event) {
FacesContext facesContext = FacesContext.getCurrentInstance();
String outcome = action; // Do your thing?
facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, outcome);
}
// Add/generate the usual boilerplate.
}
navigation-rule
говорит само за себя (обратите внимание на <redirect />
записи, которые будут делать ExternalContext#redirect()
вместо ExternalContext#dispatch()
под обложками):
<navigation-rule>
<navigation-case>
<from-outcome>outcome1</from-outcome>
<to-view-id>/outcome1.xhtml</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>outcome2</from-outcome>
<to-view-id>/outcome2.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
Альтернативой является использование forward.xhtml
в качестве
<!DOCTYPE html>
<html>#{forward}</html>
и обновление метода navigate()
для вызова на @PostConstruct
(который будет вызван после построения bean-компонента и всех управляемыхнастройка свойства):
@PostConstruct
public void navigate() {
// ...
}
Это имеет тот же эффект, чоднако сторона обзора не является самодокументированной.Все, что он в основном делает, это печатает ForwardBean#toString()
(и тем самым неявно создает бин, если его еще нет).
Примечание для пользователей JSF2, есть более чистый способ передачи параметров с <f:viewParam>
иболее надежный способ обработки перенаправления / навигации с помощью <f:event type="preRenderView">
.См. Также среди прочего: