提问者:小点点

JSF2中未显示命令链接操作参数


在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.2,
  • Liferay 7.4 ga1
  • Liferay Faces。

共1个答案

匿名用户

我通过使用隐式导航来解决这个问题。似乎显式导航不仅仅适用于JSF 2. x,这是我从这篇文章中得出的结论。在引用的帖子中,据说根本不需要faces-config.xml文件。但我认为一件事是不需要的事实,另一个非常不同的事情是强制不必使用它。就我个人而言,从我的JSF1.x经验来看,我曾经喜欢页面导航在配置文件中的组织方式,比如faces-config.xml