I did some tests, it works great.
You need added phase-listener in jsf config file.
<lifecycle>
<phase-listener>com.webjabber.net.jsf.datasave
.SaveDataPhaseListener</phase-listener>
</lifecycle>
This is my codes for using it, data saved in the Constructor.
private List unitList;
public UnitList(){
SaveData saveData = DataSaveManager.getSaveData("_UNIT_LIST_DATA");
if( saveData!=null ){
System.out.println("Saved list");
unitList = (List)saveData.getData();
}else{
System.out.println("New list");
unitList = getDataFromDB("UnitList");
LinkedList possiblePageList = new LinkedList();
possiblePageList.add("/unitadmin/unitList..jsp");
possiblePageList.add("/unitadmin/unitEdit.jsp");
DataSaveManager.saveData("_UNIT_LIST_DATA",unitList,possiblePageList,null);
}
}
</lifecycle>
This is my codes for using it, data saved in the Constructor.
private List unitList;
public UnitList(){
SaveData saveData = DataSaveManager.getSaveData("_UNIT_LIST_DATA");
if( saveData!=null ){
System.out.println("Saved list");
unitList = (List)saveData.getData();
}else{
System.out.println("New list");
unitList = getDataFromDB("UnitList");
LinkedList possiblePageList = new LinkedList();
possiblePageList.add("/unitadmin/unitList..jsp");
possiblePageList.add("/unitadmin/unitEdit.jsp");
DataSaveManager.saveData("_UNIT_LIST_DATA",unitList,possiblePageList,null);
}
}
--
Zhong Li
WebJabber.Net
Files, This mail list doesn't allow attach file, so have to post here
-------------------------------------------DataSaveManager.java-------------------------------------------------------
/*
* Created on Oct 4, 2005
*
*/
package com.webjabber.net.jsf.datasave;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
/**
* @author zli
*
*/
public class DataSaveManager {
public final static String sessionID="_DATA_SAVE_SESSION_ENTRY";
public static Map getSessionDataMap(){
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext ext = context.getExternalContext();
Map sessionData = (Map)ext.getSessionMap().get(sessionID);
if( sessionData ==null ){
sessionData = new HashMap();
ext.getSessionMap().put(sessionID,sessionData);
}
return sessionData;
}
/**
*
* @param data
* @param possiblePageList is LinkedList
* @param pageRuleList is LinkedList wrap of LinkedList
*/
public static void saveData(String dataId, Object data, LinkedList possiblePageList, LinkedList pageRuleList){
getSessionDataMap().put(dataId,new SaveData(dataId,data, possiblePageList, pageRuleList));
}
public static void removeData(String dataId){
getSessionDataMap().remove(dataId);
}
public static SaveData getSaveData(String dataId){
return (SaveData)getSessionDataMap().get(dataId);
}
}
-------------------------------------------SaveData.java------------------------------------------------------
/*
* Created on Oct 4, 2005
*
*/
package com.webjabber.net.jsf.datasave;
import java.util.LinkedList;
/**
* @author zli
*
*/
public class SaveData {
String dataId;
Object data;
LinkedList possiblePageList;
LinkedList pageRuleList;
public SaveData(String dataId, Object data, LinkedList possiblePageList, LinkedList pageRuleList){
this.dataId = dataId;
this.data = ""> this.possiblePageList = possiblePageList;
this.pageRuleList = pageRuleList;
}
public Object getData(){
return data;
}
public LinkedList getPossiblePageList(){
return possiblePageList;
}
public LinkedList getPageRuleList(){
return pageRuleList;
}
public String getDataId(){
return dataId;
}
}
---------------------------------------------SaveDataPhaseListener.java---------------------------------------------------------
/*
* Created on Oct 4, 2005
*
*/
package com.webjabber.net.jsf.datasave;
import java.util.LinkedList;
import java.util.Map;
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
/**
* @author zli
*
*/
public class SaveDataPhaseListener implements PhaseListener{
/* (non-Javadoc)
* @see javax.faces.event.PhaseListener#afterPhase(javax.faces.event.PhaseEvent)
*/
public void afterPhase(PhaseEvent arg0) {
System.out.println("afterPhase:"+arg0.getPhaseId());
String viewId = arg0.getFacesContext().getViewRoot().getViewId();
Map sessionData = DataSaveManager.getSessionDataMap();
Set removeIds = new HashSet();
if( sessionData!=null ){
Iterator itr = sessionData.keySet().iterator();
while( itr.hasNext() ){
String dataId = (String)itr.next();
SaveData saveData = (SaveData)sessionData.get(dataId);
LinkedList possiblePageList = saveData.getPossiblePageList();
//we check if the viewId in possible page
if(possiblePageList!=null && possiblePageList.contains(viewId) ){
//we need keep it;
continue;
}
LinkedList pageRuleList = saveData.getPageRuleList();
if( pageRuleList!=null ){
//we check and consume rules
boolean isInRule = false;
for( int pi = 0;pi<pageRuleList.size();pi++ ){//consume all rules
//try one rule
LinkedList rulePath = (LinkedList)pageRuleList.get(pi);
if( rulePath.contains(viewId) ){
if( viewId.equals(rulePath.get(0)) ){//cosume it
rulePath.remove(0);//cosumed.
//we need keep it;
isInRule = true;
}
}
}
if( isInRule )continue;
}
//this data is useless, put in removeIds
removeIds.add(dataId);
}
//remove data
itr = removeIds.iterator();
while(itr.hasNext()){
String dataId = (String)itr.next();
sessionData.remove(dataId);
System.out.println("clean:"+dataId);
}
}
}
/* (non-Javadoc)
* @see javax.faces.event.PhaseListener#beforePhase(javax.faces.event.PhaseEvent)
*/
public void beforePhase(PhaseEvent arg0) {
//System.out.println("beforePhase:"+arg0.getPhaseId());
}
/* (non-Javadoc)
* @see javax.faces.event.PhaseListener#getPhaseId()
*/
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
//return PhaseId.ANY_PHASE;
}
}

