javascript
开发自定义JSF组件(4) 保存状态与恢复状态
2019獨角獸企業重金招聘Python工程師標準>>>
完整的教材:
?上一節教材中,我們的項目已經完成了一個HelloWorld示例。在講保存狀態與恢復狀態之前,我先做一個錯誤的示例,以便讓大家了解什么保存狀態與恢復狀態。
開發環境:
- Windows 7
- IntelliJ IDEA 12.1.2
- jboss-6.1.0.Final
- JSF 1.2
修改項目中的helloWorld.xhtml,這個例子沒有實際的意義,只是期待點擊“刷新”按鈕的時候,重新刷新一下panelGroup區域。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:ida="http://www.regaltec.com/ida40" xmlns:h="http://java.sun.com/jsf/html" xmlns:a4j="http://richfaces.org/a4j"> <f:view><head><title>Hello World</title></head><body><a4j:form><a4j:commandButton value="刷新" reRender="out" /></a4j:form><h:panelGroup id="out"><ida:helloWorld name="世界" /></h:panelGroup></body> </f:view> </html>如果你啟動jboss并打開這個示例,你會發現點擊按鈕后“你好世界”不顯示了,跟期望只是刷新一下有出入。其實這個bug就跟保存狀態、恢復狀態有關系了。
使用JSF的同僚都知道,JSF有6個生命周期,在恢復視圖階段,倘若先前曾經調用過saveState()方法來存儲狀態信息,則在此階段調用組件的restoreState()方法。明白了這個道理,我們重構代碼就容易了,整個項目中,只需要重構UIHelloWorld這個類就可以了,具體就是重載UIHelloWorld組件的saveState和restoreState方法,完整的代碼如下:
public class UIHelloWorld extends UIOutput {private String name;public String getName() {if (StringUtils.isNotBlank(this.name)) {return name;}ValueExpression _ve = getValueExpression("name");if (_ve != null) {return (String)_ve.getValue(getFacesContext().getELContext());} else {return null;}}public void setName(String name) {this.name = name;}@Overridepublic String getFamily() {return "com.regaltec.faces.HelloWorld";}@Overridepublic Object saveState(FacesContext context) {Object values[] = new Object[2];values[0] = super.saveState(context);values[1] = name;return values;}@Overridepublic void restoreState(FacesContext context, Object state) {Object values[] = (Object[]) state;super.restoreState(context, values[0]);name = (String) values[1];} }注意:1、需要保存的狀態次序與恢復狀態的次序要保持一致;2、一般情況都不能丟掉父類的狀態。
現在再啟動jboss運行示例,helloWold.jsf頁面點擊按鈕能正常工作了。
轉載于:https://my.oschina.net/zhuzhiou/blog/132147
總結
以上是生活随笔為你收集整理的开发自定义JSF组件(4) 保存状态与恢复状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: seajs 的研究二 -- 无题
- 下一篇: 第3章 理解XP