JSF - 自定义 NavigationHandler 结果值无效?

2023-12-01

我自己编写了一个自定义的 NavigationHandler ,与下面的非常相似,但只是使用堆栈来保存历史记录:

http://jsfatwork.irian.at/book_de/custom_component.html#!idx:/custom_component.html:fig:backnavigationhandler-code

public class HistoryNavigationHandler extends NavigationHandler
{
    private final NavigationHandler navigationHandler;

    private final Stack<String> outcomes;

    public HistoryNavigationHandler(final NavigationHandler navigationHandler)
    {
        this.navigationHandler = navigationHandler;
        this.outcomes = new Stack<String>();
    }

    @Override
    public void handleNavigation(final FacesContext context, final String fromAction, final String outcome)
    {
        if (outcome != null)
        {
            if (outcome.equals("back"))
            {
                final String lastViewId = this.outcomes.pop();

                final ViewHandler viewHandler = context.getApplication().getViewHandler();
                final UIViewRoot viewRoot = viewHandler.createView(context, lastViewId);
                context.setViewRoot(viewRoot);
                context.renderResponse();

                return;
            }
            else
            {
                this.outcomes.push(context.getViewRoot().getViewId());
            }
        }
        this.navigationHandler.handleNavigation(context, fromAction, outcome);
    }
}

在 faces-config.xml 中注册这个:

<navigation-handler>
    package.HistoryNavigationHandler
</navigation-handler>

导致以下日志警告和一条消息,其中存在先前有效的链接:

Warning: jsf.outcome.target.invalid.navigationhandler.type

Something like: this link is disabled because a navigation case could not be matched

问题是什么?


自 JSF 2 以来,NavigationHandler已被替换为ConfigurableNavigationHandler。所有 JSF 2 特定标签/组件,例如<h:link>等等都依赖它。这NavigationHandler保留是为了向后兼容。

这是一个如何正确扩展的启动示例ConfigurableNavigationHandler:

public class HistoryNavigationHandler extends ConfigurableNavigationHandler {

    private NavigationHandler wrapped;

    public HistoryNavigationHandler(NavigationHandler wrapped) {
        this.wrapped = wrapped;
    }

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

        // TODO: Do your job here. 

        wrapped.handleNavigation(context, from, outcome);        
    }

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

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

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSF - 自定义 NavigationHandler 结果值无效? 的相关文章

随机推荐

  • Git - 如何将本地存储库提交到另一个本地存储库的子文件夹?

    我有一段时间开始了一个 Django 项目 并将其托管在 bitbucket 上 现在我需要将它托管在 openshift 上 方法是它们为您提供一个 git 存储库 每次您推送时它们都会自动部署 问题是存储库附带了几个用于配置和设置的顶级
  • 同一主机/端口上的 Wcf HTTP 和 HTTPS

    Hello 我知道如何为 http 或 https 创建自托管 wcf 但不能同时创建 我想要这两个网址的 wcf https 127 0 0 1 13070 ProxySips http 127 0 0 1 13070 ProxySips
  • rust 宏扩展忽略标记 `,` 和任何后续内容

    这确实有效 macro rules x2 x expr gt x x let a x2 0 但非常相似 macro rules x2 x expr gt x x removed brackets let a x2 0 added brack
  • 如何让msbuild不重建所有项目

    我们有CCnet msbuild tfs 为每个项目配置构建 我们没有使用解决方案进行构建 问题是如果我们只创建 1 个项目 我们应该如何配置构建而不再次重建所有项目 与源代码控制中的一个确切项目相关的更改 有什么办法可以提出一些条件吗 应
  • 在 Flask 应用程序中运行 Dash 应用程序

    我有一个现有的 Flask 应用程序 并且我想要一条通往另一个应用程序 更具体地说 第二个应用程序是阴谋冲刺应用程序 如何在现有 Flask 应用程序中运行 Dash 应用程序 app route plotly dashboard def
  • 如何在DataGridTextColumn中显示Enum类型?

    我已经列出了列表 并将这些列表绑定到工作正常的数据网格 但在该规则类中 我有一个枚举类型 即 类型 因此在数据网格中 我将类型列设置为空 那么我如何获得枚举输入数据网格列请帮助我 谢谢 nagaraju 通常它应该通过绑定直接转换为它的字符
  • 通过IP地址获取用户位置[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我有一个用 C 编写的 ASP NET 网站 在此站点上 我需要根据用户的位置自动显示起始页 我可以根据用户的IP地址获取用户所在城市的名称吗 您需
  • ASP.NET 表单身份验证

    我有以下 ASP NET 表单身份验证配置
  • 有序地图实现

    我正在寻找一个 Map 实现 它按照添加键值对的顺序迭代键值对 例如 Map orderedMap instantiation omitted for obvious reasons orderMap put 4 d orderMap pu
  • 如何使用 GPML (Matlab) 进行回归的 2D 高斯过程?

    我有一个Nx2输入矩阵称为X 我也有输出值Y这是一个向量Nx1 我创建一些数据进行测试 如下所示 Xtest linspace x min x max n Ytest linspace y min y max n 所以 矩阵Z is of
  • 如何在 Flutter 中制作 AlertDialog?

    我正在学习在 Flutter 中构建应用程序 现在我来到了警报对话框 我以前做过Android and iOS 但是如何在 Flutter 中发出警报呢 以下是一些相关的问题 如何在 Flutter 中设置 AlertDialog 操作的样
  • 在批处理文件中将字符串转换为整数

    我有一个从文件中读取的变量 var 13 145 我想将此值添加到另一个值 set a var var 5 但结果是13 5 not 13145 5 如何从字符串中删除这个 不要添加逗号 set var 13145 另外 在分配变量时 不要
  • 如何正确处理 onclick 事件和 onblur

    以下帖子与我之前提出的问题相关here 尽管这两个问题是独立的 但它们确实与我实现的相同功能相关 预测文本 我遇到的问题与这两个事件的方式有关onblur and onclick叫做 当用户在文本框中输入一些字符并决定单击建议而不是完成输入
  • 在 Android 中禁用后退按钮(不起作用)

    package com my app import java io ByteArrayOutputStream import java io File import java io FileOutputStream import java
  • 在 Mac 上安装的 VSTS 代理中运行 powershell 构建步骤?

    我在 mac 上安装了 VSTS 构建代理来构建 xamarin iOS 项目 构建工作正常 直到我添加了 powershell 构建步骤 即使我安装了 powershell for mac https github com PowerSh
  • 在 SwiftUI 中读取带有子节点的 Firebase 实时数据库父节点时出现问题

    我有以下 Firebase 实时数据库结构 posts user1 uid Kfm0p2EMcrpN8XcLOR5 created at 1490119356 786182 image height 374 9999999999999 im
  • indexedDB 最高键路径

    我在 indexedDB 中有一个使用 Emberjs 适配器填充的数据库 我已经像这样设置了键路径 this addModel App Device keyPath key 当我第一次解析数据时 我的密钥会自动递增 如下所示 data d
  • FullCalendar 限制事件数量并有更多链接

    我发现有人请求向日历添加 更多 链接并限制活动数量 这件事已经完成了吗 或者有人实施了自己的解决方案 可以分享吗 如果是这样 请发布您的代码 随着新版本 v2 1 0 beta2 于 17 天前发布Arshaw做了以下事情 已解决的问题 带
  • java中通过多线程从数据库读取

    我正在使用java中的多线程从vertica数据库读取数据 我有大约 2000 万条记录 我正在打开 5 个不同的线程 其中有这样的选择查询 start threadnum while start 20000 lt totalRecords
  • JSF - 自定义 NavigationHandler 结果值无效?

    我自己编写了一个自定义的 NavigationHandler 与下面的非常相似 但只是使用堆栈来保存历史记录 http jsfatwork irian at book de custom component html idx custom