标签: prerenderview

何时使用f:viewAction/preRenderView与PostConstruct?

什么时候应该使用f:viewActionor preRenderView事件来初始化页面的数据而不是使用@PostConstruct注释?基于支持bean的范围类型使用一个或另一个的基本原理例如,如果支持bean是@RequestScoped,那么在呈现视图之前选择使用f:viewActionpreRenderView覆盖@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)

jsf postconstruct jsf-2 prerenderview viewaction

90
推荐指数
1
解决办法
7万
查看次数

何时使用preRenderView与viewAction?

什么时候应该使用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)

jsf-2 prerenderview jsf-2.2

15
推荐指数
1
解决办法
1万
查看次数

PreRenderView逐步调用每个回发

我对执行的顺序和执行次数有疑问f:event type="preRenderView".

在这里我的搜索,我发现从BalusC在通常的回答这个这个职位涉及到我的问题-它仍然留下了两个问题要问:

  1. 当我f:event type="preRenderView"在模板文件中放置一个(用于管理常见任务,例如关于适用于我所有视图的用户状态的检查)和f:event type="preRenderView"每个视图中的另一个(用于处理视图特定的初始化)时,我想知道为什么调用视图中的监听器方法在模板之前.

  2. 当我把所有内容按照建议放在<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)

cdi jsf-2 prerenderview

6
推荐指数
1
解决办法
8683
查看次数

如何在preRenderView侦听器方法中执行导航

我从什么可以<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)

navigation listener jsf-2 prerenderview

6
推荐指数
1
解决办法
1万
查看次数

每个ajax请求都会调用preRenderView

我正在使用jquery waypoints和jsf跟随链接实现无限滚动.我有一个xhtml的prerender,需要无限滚动.现在,当waypoint发送ajax请求时,为什么每个滚动它调用prerender,这意味着整个页面都被重新刷新.请让我知道如何解决这个问题.

ajax jsf primefaces infinite-scroll prerenderview

4
推荐指数
1
解决办法
4689
查看次数

URL重定向不适用于preRenderView事件

我终于在页面之间传递了消息,但这并没有将我重定向到用户登录页面(../../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 redirect prerenderview jsf-2.2

2
推荐指数
1
解决办法
1434
查看次数