利用Ajax的部分提交特性,使得界面上的时间能每秒刷一次。整个页面是不会刷新的,只是部分刷新。
前台调用很简单:
<ice:form id="serviceTime">
<tr align="right">
<ice:outputText id="service" value="#{SystemService.serverTime}"/>
</tr>
</ice:form>
对应的java类就不需要写什么。
另写一个java 类
import java.util.Calendar;
import java.text.DateFormat;
import java.util.TimeZone;
import java.text.SimpleDateFormat;
import com.icesoft.faces.async.render.IntervalRenderer;
import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
/**
*
* @author chenshu
*/
public class SystemService implements Renderable{
private DateFormat serverFormat;
private PersistentFacesState state;
private final int renderInterval = 1000;
private IntervalRenderer clock;
private TimeZone serverTimeZone;
public SystemService()
{
init();
}
private void init() {
serverTimeZone = TimeZone.getDefault();
serverFormat = buildDateFormatForTimeZone(serverTimeZone);
state = PersistentFacesState.getInstance();
}
public static DateFormat buildDateFormatForTimeZone(TimeZone timeZone) {
SimpleDateFormat currentFormat = new SimpleDateFormat("EEE, HH:mm:ss");
Calendar currentZoneCal = Calendar.getInstance(timeZone);
currentFormat.setCalendar(currentZoneCal);
currentFormat.setTimeZone(timeZone);
return currentFormat;
}
public PersistentFacesState getState() {
return state;
}
public void setRenderManager(RenderManager renderManager) {
clock = renderManager.getIntervalRenderer("clock");
clock.setInterval(renderInterval);
clock.add(this);
clock.requestRender();
}
public void renderingException(RenderingException renderingException) {
/*
if (log.isDebugEnabled()) {
log.debug("Rendering exception: " + renderingException);
}*/
if (renderingException instanceof FatalRenderingException) {
performCleanup();
}
}
public void dispose() throws Exception {
/*
if (log.isInfoEnabled()) {
log.info("Dispose TimeZoneBean for a user - cleaning up");
}*/
performCleanup();
}
protected boolean performCleanup() {
try {
if (clock != null) {
clock.remove(this);
if (clock.isEmpty()) {
clock.dispose();
}
clock = null;
}
return true;
} catch (Exception failedCleanup) {
/*
if (log.isErrorEnabled()) {
log.error("Failed to cleanup a clock bean", failedCleanup);
}
*/
}
return false;
}
public String getServerTime() {
return formatCurrentTime(serverFormat);
}
public static String formatCurrentTime(DateFormat dateFormat) {
Calendar cal = dateFormat.getCalendar();
cal.setTimeInMillis(System.currentTimeMillis());
return dateFormat.format(cal.getTime());
}
}
在配置文件中要做修改
<managed-bean>
<managed-bean-name>SystemService</managed-bean-name>
<managed-bean-class>OA.System.SystemService</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>renderManager</property-name>
<value>#{renderManager}</value>
</managed-property>
</managed-bean>
在jsf 中,如果把后台(facesContext)比做一颗树,那么前台jsp页面tag 就对应于树的一个结点。如果页面有10个tag(tag中的内容都是保存在facesContext中的),那么facesContext树就会有11个结点(根结点是jsp:root)。
当页面重新喧染的时候,原来的facesContetx 与新的facesContext 会进行比较,不同的部分就会被改变,而相同的部分是不会改变。(页面部分)