Hi All,
I am trying to find a way to avoid saveState tag on client side,
finally I got an idea, please give me comments regardless my thought
wrong or right. Actually it is way to save server side data/model. We
define DataSaveManager to manage save/remove a data in a session. When
code saves data into session, sametime need set possible pages the data
will be used, or create a data path rules. In phaseListener after
RENDER_RESPONSE(6), we check the data in session, if current viewRoot
isn't in possible pages list or data path rules list, the data will be
removed automatically. Of couse, code can remove any data anytime. If
the way works, we may find a way to do it in config file. We can add
possiblePageList in ManageBean defination section and pageRuleList in
Navigation Rules section.
Codes looks like
/**
* @author zli
*
*/
public class MposPhaseListener 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
for( int pi =
0;pi<pageRuleList.size();pi++ ){
//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;
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);
}
}
}
/* (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;
}
}
public class DataSaveManager{
public final static String sessionID="_DATA_SAVE_SESSION_ENTRY";
public static Map getSessionDataMap(){
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext ext = context.getExternalContext();
return (Map)ext.getSessionMap().get(sessionID);
}
/**
*
* @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);
}
}
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;
}
}
If this is possible, so we can make it in JSF1.2, it will solve lots problems.
--
Zhong Li
WebJabber.Net
- new thought about saveState Zhong Li
- Re: new thought about saveState Mike Kienenberger
- Re: new thought about saveState Zhong Li
- Re: new thought about saveState Mike Kienenberger
- Re: new thought about saveState Werner Punz
- Re: new thought about saveState Mike Kienenberger
- Re: new thought about saveState Werner Punz
- Re: new thought about saveState Zhong Li
- Re: new thought about saveState Werner Punz
- Re: new thought about saveState Zhong Li
- Re: new thought about saveState Zhong Li

