当前位置: 首页 > 知识库问答 >
问题:

每当Facelet页面加载时,在支持bean中运行代码块

邹英发
2023-03-14

我正在使用JSF构建一个网站。我想在每次加载Facelet页面时运行一段代码,我需要使用会话范围支持bean。我尝试使用backingbean的构造函数来运行代码块,但它只是第一次运行,我使用了以下代码

<c:forEach var="p" items="#{statusBean.statusList}"
                        varStatus="loop">

由于statusBean是会话作用域,因此它在加载页面时第一次运行构造函数。

当页面加载时(不仅仅是第一次加载),是否还有其他方法可以运行代码块?

共有1个答案

鲜于宏义
2023-03-14

实现这一点有不同的方法。首先,您必须定义“Facelets页面加载时”的含义。我想你的意思是在页面呈现之前。

预渲染视图事件

使用JSF 2. x,最简单的方法是为PreRenderView事件创建一个系统事件监听器。为此,您首先需要在页面中添加一个f: event标记,如下所示:

<f:event type="javax.faces.event.PreRenderViewEvent"
    listener="#{bean.preRenderView}"/>

必须在视图根目录(f:view)上注册PreRenderViewEvent的侦听器。因此f:event必须是f:view的直接子级,如果不使用f:view,则必须是顶级的某个位置。使用模板f:event必须放在保证相同的ui:define中。

在呈现视图之前,将调用listener属性中引用的侦听器方法。该方法可能如下所示:

public void preRenderView(ComponentSystemEvent ev) {
    //Do something
}

@预渲染视图

如果将CDI与MyFaces CODI一起使用,只需使用@PreRenderView注释托管bean方法,就会在呈现页面之前调用该方法。

查看动作

使用JSF2.2(还不是最终版本),您可以使用视图操作在生命周期的不同阶段调用方法。有关详细信息,请参阅我在JSF2.2视图操作上的JSFlive帖子。

您可以在我的GitHub存储库中找到PreRenderView事件的示例并查看操作

 类似资料:
  • 我要求在JSF2.2页面上输入2个输入值。我们正在使用Primefaces控件。然后通过h:command按钮将这些值提交给托管bean方法。 然后,基于这些值,我想将同一JSF页面上的一个单独的输出字段设置为一个特定的值。 因此,我目前的问题是尝试连接一个托管bean,以便它将一个值返回到我的JSF页面上的字段,在本例中,字段名是mgrs。主要的问题是,我要处理的是生成返回值的第三方库,我不确定

  • PrimeFaces 5.0、JSF 2.2、Glassfish 4.1.1、, 我假设我的设置中有些东西没有正确配置,但我不确定该看什么。。。 所以我使用managedbeans来支持JSF页面。在页面上的PrimeFace元素中,如果我使用oncomplete属性,它引用的方法将在页面加载时被调用。我不想让它在每次加载页面时调用这个方法,我也不认为应该这样! 我已经在几页和不同的元素中对此进行

  • 我想调用我的函数main()使用html onload事件和console.log文本导入从另一个(生成Object.js)文件,但当我导入函数,onload事件停止工作和函数main()不再使用。 HTML: 生成对象。js: main.js: 当我尝试控制台时。main()中的log(“text”)可以正常工作,但当我尝试使用导入的函数时却不行。我该怎么做才能解决这个问题? Chrome控制台

  • 在Visual Studio代码中: 我已经正确配置了OpenJDK 14。当我试图运行我的项目时,我收到以下错误:java。lang.UnsupportedClassVersionError:(类文件版本56.65535)是使用不受支持的预览功能编译的。这个版本的Java运行时只识别类文件版本58.65535的预览功能 这个类是一个依赖项,它存储在Nexus存储库中,所有这个项目都是用JDK 1

  • 问题内容: 我得到了一些在程序中生成的Java字节码(即已编译的Java源代码)。现在,我想将此字节代码加载到当前运行的Java- VM中并运行特定功能。我不确定如何做到这一点,我对Java类加载器进行了一些研究,但没有找到直接的方法。 我找到了一个在硬盘上接收类文件的解决方案,但是我得到的字节码在字节数组中,我不想将其写入磁盘,而是直接使用它。 谢谢! 问题答案: 您需要编写一个自定义的类加载器