Jsf 2 如何在具有to view id的portlet环境中,在JSF导航规则之后设置会话参数

Jsf 2 如何在具有to view id的portlet环境中,在JSF导航规则之后设置会话参数,jsf-2,portlet,portal,Jsf 2,Portlet,Portal,我们目前在使用JSF2的portlet环境中面临一个问题 应用程序正在为实际用户会话创建动态门户页面……可以将其视为用户可以编辑实体的Eclipse编辑器视图。所以现在我称动态视图编辑器为:-) 我们现在面临的问题如下。用户导航到编辑器并在portlet上工作。当然,每个portlet中显示的视图会随着时间的推移而变化。现在,他想查看另一个编辑器中显示的另一个实体但是当他导航回第一个编辑器时,portlet的状态会变回默认视图。 在portlet世界中,每个portlet通过存储在Portlet

我们目前在使用JSF2的portlet环境中面临一个问题

应用程序正在为实际用户会话创建动态门户页面……可以将其视为用户可以编辑实体的Eclipse编辑器视图。所以现在我称动态视图编辑器为:-)

我们现在面临的问题如下。用户导航到编辑器并在portlet上工作。当然,每个portlet中显示的视图会随着时间的推移而变化。现在,他想查看另一个编辑器中显示的另一个实体但是当他导航回第一个编辑器时,portlet的状态会变回默认视图。

在portlet世界中,每个portlet通过存储在PortletSession中的参数获得它应该显示的视图,我也可以轻松地更改该参数。我知道这个参数造成了问题,因为当编辑器发生更改时,portlet总是会检查这个参数以决定显示哪个视图

request.getPortletSession().setAttribute("com.ibm.faces.portlet.page.view", "/MyPage.xhtml");
我的想法是,以某种方式为每个JSF导航添加一个回调,将该参数设置为导航将要显示的视图(可能包括视图参数)。 有可能有一个标准的回调吗?如果没有,是否可以在将设置此参数的导航规则中执行某种EL

以某种方式为每个JSF导航添加一个回调

您可以在自定义环境中执行该作业。以下是一个启动示例:

public class MyNavigationHandler extends ConfigurableNavigationHandler {

    private NavigationHandler parent;

    public MyNavigationHandler(NavigationHandler parent) {
        this.parent = parent;
    }

    @Override
    public void handleNavigation(FacesContext context, String from, String outcome) {

        // TODO: Do your job here. 

        // Keep the following line untouched. This will perform the actual navigation.
        parent.handleNavigation(context, from, outcome);        
    }

    @Override
    public NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome) {
        return (parent instanceof ConfigurableNavigationHandler)
            ? ((ConfigurableNavigationHandler) parent).getNavigationCase(context, fromAction, outcome)
            : null;
    }

    @Override
    public Map<String, Set<NavigationCase>> getNavigationCases() {
        return (parent instanceof ConfigurableNavigationHandler)
            ? ((ConfigurableNavigationHandler) parent).getNavigationCases()
            : null;
    }

}

工作顺利。执行handleNavigation后,ViewRoot将更新,我可以设置参数。目前看来,我们必须通过表单提交来处理所有导航,因为我看不到一种方法可以将NavigationHandler用于h:link(但这很有意义,因为这将导致一个普通的html链接)。谢谢您的提示。您可以通过自定义的
视图处理程序处理
(只需扩展
ViewHandlerWrapper
)。使用呈现页面时运行的PhaseListener有意义吗?然后,它可能也适用于普通链接。您无法在其中确定是否执行了导航。这可能只是对同一视图的回发。或者,如果您实际上不需要“每次导航”,而是“每次回发”,那么
PhaseListener
确实是一个更好的地方。然后在
调用应用程序的后置阶段完成这项工作。PhaseListener工作得非常好。因为我只需要将portlet更新为显示的视图,所以我使用了Render_响应阶段,每次都将视图设置为当前portlet会话。这样我们就可以再次使用普通链接了。
<application>
    <navigation-handler>com.example.MyNavigationHandler</navigation-handler>
</application>