javascript
开发自定义JSF组件(4) 保存状态与恢复状态
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
完整的教材:
?上一節(jié)教材中,我們的項(xiàng)目已經(jīng)完成了一個(gè)HelloWorld示例。在講保存狀態(tài)與恢復(fù)狀態(tài)之前,我先做一個(gè)錯(cuò)誤的示例,以便讓大家了解什么保存狀態(tài)與恢復(fù)狀態(tài)。
開發(fā)環(huán)境:
- Windows 7
- IntelliJ IDEA 12.1.2
- jboss-6.1.0.Final
- JSF 1.2
修改項(xiàng)目中的helloWorld.xhtml,這個(gè)例子沒(méi)有實(shí)際的意義,只是期待點(diǎn)擊“刷新”按鈕的時(shí)候,重新刷新一下panelGroup區(qū)域。
<!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>如果你啟動(dòng)jboss并打開這個(gè)示例,你會(huì)發(fā)現(xiàn)點(diǎn)擊按鈕后“你好世界”不顯示了,跟期望只是刷新一下有出入。其實(shí)這個(gè)bug就跟保存狀態(tài)、恢復(fù)狀態(tài)有關(guān)系了。
使用JSF的同僚都知道,JSF有6個(gè)生命周期,在恢復(fù)視圖階段,倘若先前曾經(jīng)調(diào)用過(guò)saveState()方法來(lái)存儲(chǔ)狀態(tài)信息,則在此階段調(diào)用組件的restoreState()方法。明白了這個(gè)道理,我們重構(gòu)代碼就容易了,整個(gè)項(xiàng)目中,只需要重構(gòu)UIHelloWorld這個(gè)類就可以了,具體就是重載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、需要保存的狀態(tài)次序與恢復(fù)狀態(tài)的次序要保持一致;2、一般情況都不能丟掉父類的狀態(tài)。
現(xiàn)在再啟動(dòng)jboss運(yùn)行示例,helloWold.jsf頁(yè)面點(diǎn)擊按鈕能正常工作了。
轉(zhuǎn)載于:https://my.oschina.net/zhuzhiou/blog/132147
總結(jié)
以上是生活随笔為你收集整理的开发自定义JSF组件(4) 保存状态与恢复状态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: seajs 的研究二 -- 无题
- 下一篇: 第3章 理解XP