在Liferay-Faces portlet上,我想从一个. xhtml页面导航到另一个传递参数的.xhtml页面,以便第二个页面显示传递的参数。由于我不想给出任何关于我传递的参数的线索,我决定根据POST请求来处理该任务,所以我选择使用
faces-config. xml:
<managed-bean>
<managed-bean-name>bUser</managed-bean-name>
<managed-bean-class>es.my.samples.UserBean</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>WEB-INF/views/index.xhtml</from-view-id>
<navigation-case>
<from-action>#{bUser.viewDetailsAction}</from-action>
<from-outcome>action-view-details</from-outcome>
<to-view-id>WEB-INF/views/result1.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
第1页(index. xhtml):
<h:form>
<h:commandLink value="commandLink" action="#{bUser.viewDetailsAction()}">
<f:param name="id" value="13" />
</h:commandLink>
</h:form>
第2页(结果2. xhtml):
<h:panelGrid columns="2">
<h:outputLabel value="Requested id: " />
<h:outputText value="#{bUser.id}" />
</h:panelGrid>
可视bean(UserBean.java):
@ManagedBean(name = "bUser")
@ViewScoped
public class UserBean {
private String id;
public UserBean() {
logger.trace("bean created");
}
@PostConstruct
public void postConstruct() {
logger.trace("start");
logger.trace("this.id:" + this.id);
}
public String getId() {
return id;
}
public void setId(String id) {
logger.trace("start [id]:" + id);
this.id = id;
}
@PreDestroy
public void preDestroy() {
logger.trace("start");
logger.trace("this.id:" + this.id);
}
public String viewDetailsAction() {
String _return = "action-view-details";
Map<String,String> params =
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
this.id = params.get("id");
logger.trace("this.id:" + this.id);
return _return;
}
作为设置为http://localhost:8080/web/guest/mission
的URL,当我按下命令链接时,屏幕上会显示以下错误消息(翻译):
找不到结果为{2}的操作{1}的视图ID'/WEB-INF/view/index. xhtml'的匹配导航大小写。
如果我省略faces-config. xml文件中的行
[TRACE] UserBean:<init>():start
[TRACE] UserBean:<init>():this.id:null
[TRACE] UserBean:<init>():bean created
[TRACE] UserBean:postConstruct():start
[TRACE] UserBean:postConstruct():this.id:null
[TRACE] UserBean:viewDetailsAction():this.id:13
[TRACE] UserBean:viewDetailsAction():_return:action-view-details
[TRACE] UserBean:preDestroy():start
[TRACE] UserBean:preDestroy():this.id:13
13:47:11,454 DEBUG [DebugPhaseListener:53] AFTER phaseId=[INVOKE_APPLICATION 5] viewId=[/WEB-INF/views/result1.xhtml]
13:47:11,539 DEBUG [DebugPhaseListener:69] BEFORE phaseId=[RENDER_RESPONSE 6] viewId=[/WEB-INF/views/result1.xhtml]
[TRACE] UserBean:<init>():start
[TRACE] UserBean:<init>():this.id:null
[TRACE] UserBean:<init>():bean created
[TRACE] UserBean:postConstruct():start
[TRACE] UserBean:postConstruct():this.id:null
13:47:11,832 DEBUG [DebugPhaseListener:53] AFTER phaseId=[RENDER_RESPONSE 6] viewId=[/WEB-INF/views/result1.xhtml]
而且,URL从http://localhost:8080/web/guest/mission
变成了http://localhost:8080/web/guest/mission?p_auth=TBepgy6o
我不知道我执行我想要的方法是否正确。如果不是,我将感谢任何澄清;如果我走在正确的道路上,我将感谢关于为什么要执行第二RENDER_RESPONSE阶段的任何澄清。
背景:
我通过使用隐式导航来解决这个问题。似乎显式导航不仅仅适用于JSF 2. x,这是我从这篇文章中得出的结论。在引用的帖子中,据说根本不需要faces-config.xml
文件。但我认为一件事是不需要的事实,另一个非常不同的事情是强制不必使用它。就我个人而言,从我的JSF1.x经验来看,我曾经喜欢页面导航在配置文件中的组织方式,比如faces-config.xml
。