0

我正在使用Mojarra 2.1.6实现构建一个 JSF 应用程序。我的应用程序屏幕是@ViewScoped,每个 bean 都从一个视图销毁到另一个视图。我还想要一种导航栏或面包屑,这样用户就可以使用它从一个页面返回到另一个页面。为了实现这一点,我正在使用 Primefaces p:button,以这种方式:

<h:panelGroup
      rendered="#{!navigationManager._DisableNavigationButtons}">
<p:toolbar>
    <p:toolbarGroup>
        <ui:repeat value="#{navigationManagerSystem._Navegables}"
                                        var="item">
            <p:button value="#{item._Title}" outcome="#{item._IncludePath}">
                <f:param name="params" value="#{item._NavigationParams}" />
            </p:button>
        </ui:repeat>
        <p:button disabled="true"
            value="#{navigationManagerSystem._Navegable._Title}" />
    </p:toolbarGroup>
</p:toolbar>

正如你在这段代码中看到的,它基本上是一个带有按钮的工具栏,这个按钮保存旧的 url,所以当用户点击其中一个时,他可以返回。

但是,我的问题是我有一些页面正在接收视图参数,我想做一些通用的事情,所以最好的办法是将参数保存在java.util.ListnavigationManagerSystem是一个@SessionScopedbean)中,以便在用户单击按钮时恢复它们回去,达到老豆状态。

但是上面的例子是行不通的,即使是目标页面也是这样写的

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
template="/templates/general_template.xhtml">

<ui:define name="metadata">
    <f:metadata>
        <f:viewParam id="user" name="user"
            value="#{navegableUserData._ParamUser}" required="true"
            requiredMessage="User is required" />
        <f:viewParam id="params" name="params"
            value="#{navegableUserData._NavigationParams}" />
        <f:event type="preRenderView"
            listener="#{navegableUserData.initialize}" />
    </f:metadata>
    <h:message for="user" />
</ui:define>

<ui:define name="general_content">
    <p:outputPanel autoUpdate="false" id="Datos_Loged" name="Datos_Loged"
        layout="block">
        <h:form id="SystemUserForm">
            <ui:include
                src="/system/manage_user/content/edit_user/system_user_data/system_user.xhtml" />
        </h:form>
    </p:outputPanel>
</ui:define>

_NavigationParamssetter 没有被调用,我有一个转换异常。我不知道在 JSF 中是否有更好的方法来做到这一点,也许是维护@ViewScopedbean...

4

2 回答 2

0

f:viewParam, f:param 管理 GET 参数的设置、转换和验证。因此,url 将类似于 newPage.jsf?param=10。如果您尝试将类列表放入 get 参数中,则会出现错误,因为 get 参数必须是字符串。

于 2013-01-02T13:51:01.027 回答
0

我认为解决方案可以是不直接通过视图传递参数。只需将它们托管到navigationManager bean 中,该 bean@SessionScoped控制按钮队列。无论如何,我需要知道单击了哪个按钮才能从我的@ViewScopedbean 中恢复参数,通过视图的索引值就足够了,不是吗?

这样,我还可以删除单击后的按钮,以保持面包屑更新。

无论如何,欢迎其他想法。

于 2013-01-02T14:14:17.010 回答