2012-09-20 36 views
1

我做了一个NotificationHandler类,这个类包含一个静态列表。 为了允许访问这个列表,我用一个返回这个列表的getter创建了一个SessionScopped bean。构造函数之前的JSF页面加载数据

我的问题是这样的:

我在页面A,我把通知列表,网页A再生,正在显示的通知。

然后我在网页A送我到页面B.

在网页B点击一个链接有一个构造至极销毁清单。 但是,JSF页面在调用构造函数之前显示通知。

我结束了第B与页面发出通知的

通知处理程序:

package com.cog.util; 

import java.util.ArrayList; 
import java.util.List; 

public class NotificationHandler { 

private static List<Notification2> listeDeNotification = new ArrayList<Notification2>(); 

public static void flushNotification(){ 
    listeDeNotification.clear(); 
} 

public static void raiseNotification(NotificationColor color, String code){ 
    listeDeNotification.add(new Notification2(color.toString(), code)); 
} 

public static void raiseNotification(NotificationColor color, String code, String additionalMessage){ 
    listeDeNotification.add(new Notification2(color.toString(), code, additionalMessage)); 
} 

public static void addAdditionalMessage(String code, String additionalMessage){ 
    for(Notification2 n : listeDeNotification){ 
     if (n.getCode().equals(code)){ 
      n.setAdditionalMessage(additionalMessage); 
     } 
    } 
} 

public static Integer getNotificationNumber(){ 
    return listeDeNotification.size(); 
} 

public static List<Notification2> getListeDeNotification(){ 
    return listeDeNotification; 
} 

}

notificationPrinter.xhtml

<composite:interface> 
    <composite:attribute name="liste" /> 
    <composite:attribute name="locale" /> 
</composite:interface> 

<composite:implementation> 
    <ui:repeat value="#{cc.attrs.liste}" varStatus="status" var="l"> 
     <h:panelGrid width="100%" columns="1"> 
      <div id="alert" class="alert #{l.color}"> 
       <button class="close" data-dismiss="alert" type="button">×</button> 
       <span class="rt">#{cc.attrs.locale[l.code]} #{l.additionalMessage}</span> 
      </div> 
     </h:panelGrid> 
    </ui:repeat> 
</composite:implementation> 

AccessorBean

package com.cog.web.beans.util; 

import java.util.List; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import com.cog.util.Notification2; 
import com.cog.util.NotificationHandler; 


@ManagedBean(name = "notificationAccessor") 
@SessionScoped 
public class NotificationAccessorBean { 

    public List<Notification2> getNotificationList(){ 
     return NotificationHandler.getListeDeNotification(); 
    } 

} 

,这就是我把JSF

问题是,我要刷新通知列表悫只有一些网页。

+0

不知道,但听起来像是你应该使用'@ ManagedProperty'从另一个访问的bean,并以这种方式,您将能够如果导航之前访问并刷新通知... – Daniel

+0

不知道我可以这样做,因为NotificationAccessorBean中除了getter之外什么都没有,我应该把它的内容放进去NotificationHandler在bean中? – Eildosa

+0

当你在页面之间导航时,你引用了'action'属性中的任何方法?如果是的话,它可能在某个bean中实现,所以在这个bean中创建一个NotificationHandler的'@ ManagedProperty'并刷新通知(类似这样的) – Daniel

回答

1

由于您使用JSF可以利用其优势(h:commandLink for example),你也可以可能使用preRenderView尝试将其放置在您的网页,并使用其listener刷新列表

看看下面的解释/例如JSF 2 PreRenderViewEvent example

+0

是的,使用preRenderView工作,谢谢= D 但是我知道为什么这是发生:richfaces,当它们在页面上没有richfaces时,构造函数在通知绘制过程之前被调用。 – Eildosa

+0

欢迎您,尽管我不确定richfaces的存在如何改变构造函数调用的顺序。 – Daniel

相关问题