什么时候应该使用f:viewActionor preRenderView事件来初始化页面的数据而不是使用@PostConstruct注释?基于支持bean的范围类型使用一个或另一个的基本原理例如,如果支持bean是@RequestScoped,那么在呈现视图之前选择使用f:viewAction或preRenderView覆盖@PostConstruct初始化支持bean是不相关的,因为两者会结果是一样的吗?
f:viewAction或preRenderView
<f:metadata>
<f:viewAction action="#{myBean.initialize}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
<f:metadata>
<f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
要么
@PostConstruct
public class MyBean
{
@PostConstruct
public void initialize()
{
}
}
Run Code Online (Sandbox Code Playgroud) 什么时候应该使用preRenderView事件来初始化页面的数据而不是使用viewAction?它们在使用上是否相同,是否具有相同的效果?
preRenderView事件
<f:metadata>
<f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
要么
的viewAction
<f:metadata>
<f:viewAction action="#{myBean.initialize}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud) 我对执行的顺序和执行次数有疑问f:event type="preRenderView".
在这里我的搜索,我发现从BalusC在通常的回答这个和这个职位涉及到我的问题-它仍然留下了两个问题要问:
当我f:event type="preRenderView"在模板文件中放置一个(用于管理常见任务,例如关于适用于我所有视图的用户状态的检查)和f:event type="preRenderView"每个视图中的另一个(用于处理视图特定的初始化)时,我想知道为什么调用视图中的监听器方法在模板之前.
当我把所有内容按照建议放在<f:metadata><f:event [..] /></f:metadata>后面时ui:define,它会在从登录页面重定向到该页面后被调用两次,但是当我将它调高一级后才ui:composition调用一次.
更新:示例
以下示例演示了上述行为:
这是模板文件template_test.xhtml,包含一个preRenderView事件监听器,用于调用所有视图的处理程序中的公共方法:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="de" lang="de" xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<link rel="stylesheet" type="text/css" href="../resources/css/style.css" />
</h:head>
<h:body>
<f:event type="preRenderView" listener="#{testHandler.initCommon()}" />
<div id="content">
<ui:insert name="content" />
</div>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
这是视图文件test.xhtml,还包含一个侦听器,用于preRenderView在处理程序中调用视图特定方法的事件,以及通过处理程序方法重定向的命令按钮:
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml" …Run Code Online (Sandbox Code Playgroud) 我从什么可以<f:metadata>,<f:viewParam>和<f:viewAction>开始?
我有一个预呈现视图事件监听器:
<f:metadata>
<f:event type="preRenderView" listener="#{loginBean.performWeakLogin()}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
它调用以下方法:
public String performWeakLogin() {
FacesContext facesContext = FacesContext.getCurrentInstance();
String parameter_value = (String) facesContext.getExternalContext().getRequestParameterMap().get("txtName");
if (parameter_value != null && parameter_value.equalsIgnoreCase("pippo")) {
try {
return "mainPortal";
} catch (IOException ex) {
return null;
}
} else {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
和以下导航规则:
<navigation-rule>
<from-view-id>/stdPortal/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>mainPortal</from-outcome>
<to-view-id>/stdPortal/stdPages/mainPortal.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud)
但是,它不执行导航.它使用命令按钮时,如下所示:
<p:commandButton ... action="#{loginBean.performWeakLogin()}" />
Run Code Online (Sandbox Code Playgroud) 我正在使用jquery waypoints和jsf跟随链接实现无限滚动.我有一个xhtml的prerender,需要无限滚动.现在,当waypoint发送ajax请求时,为什么每个滚动它调用prerender,这意味着整个页面都被重新刷新.请让我知道如何解决这个问题.
我终于在页面之间传递了消息,但这并没有将我重定向到用户登录页面(../../index.xhtml),而是显示了禁止的页面:
public String permission() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
String isLog = (String) sessionMap.get("isLogged");
if(isLog != "TRUE") {
System.out.println("*** The user has no permission to visit this page. *** ");
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Info : ", "Loggez-vous"));
context.getExternalContext().getFlash().setKeepMessages(true);
//context.getExternalContext().redirect("../../index.xhtml");
return "../../index.xhtml?faces-redirect=true";
} else {
System.out.println("*** The session is still active. User is logged in. *** ");
}
return "../../index.xhtml?faces-redirect=true";
}
Run Code Online (Sandbox Code Playgroud)
当然,限制页面有这个:
<f:event type="preRenderView" listener="#{userloginMB.permission()}"/>
Run Code Online (Sandbox Code Playgroud)
使用get external context重定向会使消息丢失.
jsf-2 ×4
jsf ×3
jsf-2.2 ×2
ajax ×1
cdi ×1
listener ×1
navigation ×1
primefaces ×1
redirect ×1
viewaction ×1