ProgressBar构件是一个进度条,当一个操作比较费时的时候,用使用进度条可以提高界面的友好度。通常与AjaxProgress构件(表示进度)和HtmlOutputText构件(表示进度消息)连用。
表 30.117. 构件信息
| Component Type | org.operamasks.faces.component.widget.UIProgressBar |
| Component Family | javax.faces.Output |
| Component Class | org.operamasks.faces.component.widget.UIProgressBar |
| Tag Class | org.operamasks.faces.webapp.widget.UIProgressBarTag |
| Renderer Type | org.operamasks.faces.component.widget.UIProgressBar |
| Renderer Class(AJAX) | org.operamasks.faces.render.widget.ajax.AjaxProgressBarRenderer |
+java.lang.Object
++javax.faces.component.UIComponent
+++javax.faces.component.UIComponentBase
++++javax.faces.component.UIOutput
+++++org.operamasks.faces.component.widget.base.UIProgressBarBase
++++++org.operamasks.faces.component.widget.UIProgressBar
表 30.118. 属性
| binding | 定义类 | javax.faces.component.UIComponentBase | ||
| 类型 | javax.el.ValueExpression(javax.faces.component.UIComponent) | |||
| 是否必须 | 否 | 延时求值 | 是 | |
| 一个值表达式,用于把该组件链接到一个ManagedBean的某个属性。 | ||||
| id | 定义类 | javax.faces.component.UIComponentBase | ||
| 类型 | java.lang.String | |||
| 是否必须 | 否 | 延时求值 | 否 | |
| 这个组件的组件标识符。这个值在最近的命名容器类型的父组件范围内,必须是唯一的。 | ||||
| jsvar | 定义类 | org.operamasks.faces.component.widget.UIProgressBar | ||
| 类型 | javax.el.ValueExpression(java.lang.String) | |||
| 是否必须 | 否 | 延时求值 | 是 | |
| 客户端脚本使用的javascript变量名,使用此变量名可以引用脚本中javascript对象 | ||||
| maximum | 定义类 | org.operamasks.faces.component.widget.UIProgressBar | ||
| 类型 | javax.el.ValueExpression(java.lang.Integer) | |||
| 是否必须 | 否 | 延时求值 | 是 | |
| 构件的最大值(即为进度条完成时构件的值) | ||||
| minimum | 定义类 | org.operamasks.faces.component.widget.UIProgressBar | ||
| 类型 | javax.el.ValueExpression(java.lang.Integer) | |||
| 是否必须 | 否 | 延时求值 | 是 | |
| 构件的最小值(即为进度条为空时的值) | ||||
| rendered | 定义类 | javax.faces.component.UIComponentBase | ||
| 类型 | boolean(boolean) | |||
| 是否必须 | 否 | 延时求值 | 是 | |
| 一个标志,指出该组件是否要在任何随后的form提交过程中被渲染或处理。 这个属性的缺省值是true。 | ||||
| style | 定义类 | org.operamasks.faces.component.widget.UIProgressBar | ||
| 类型 | javax.el.ValueExpression(java.lang.String) | |||
| 是否必须 | 否 | 延时求值 | 是 | |
| 构件渲染时应用到构件的CSS风格, 对应于元素的style属性 | ||||
| styleClass | 定义类 | org.operamasks.faces.component.widget.UIProgressBar | ||
| 类型 | javax.el.ValueExpression(java.lang.String) | |||
| 是否必须 | 否 | 延时求值 | 是 | |
| 构件上的CSS样式类 | ||||
| value | 定义类 | javax.faces.component.UIOutput | ||
| 类型 | java.lang.String | |||
| 是否必须 | 否 | 延时求值 | 否 | |
| 构件的当前值 | ||||
| width | 定义类 | org.operamasks.faces.component.widget.UIProgressBar | ||
| 类型 | javax.el.ValueExpression(java.lang.Integer) | |||
| 是否必须 | 否 | 延时求值 | 是 | |
| 构件的宽度 | ||||
下面是一个稍微复杂但是比较常用的例子,可以假设这样的一个场景,当复制一个文件夹的时候,上面的进度条是一个总体的进度,下面的进度条是单个文件的进度,当下面的进度条走完一条时,上面的进度条就向前走一点,直到走完为止,如下代码,当点击"start"按钮的时候,就调用"id"为"complexTask"的ajax:progress的start()方法,接着ajax:progress就会根据"interval"属性的值(默认是1秒)来定时向服务器发送请求,服务器的处理方法由ajax:progress的"action"属性进行绑定,下面的例子绑定的是ProgressBean的complexAction的方法,当服务器得到一个请求的时候,会判断客户端当前的状态,然后再计算下一个状态,回传给客户端,这个过程是通过ProgressStatus的实例status来做的,当客户端接受到服务端的回应后,发现状态改变了,onstatechange事件触发,调用客户端的updateComplexProgress方法,把complexPhaseProgress、complexPhaseProgress和complexMessage都更新,不断的反复这个过程,就可以看到进度条的动画效果了。
<w:page title="Progress Bar Demo">
<div class="examDesc">
<p>使用&amp;amp;amp;lt;ajax:progress&amp;amp;amp;gt;显示任务的进度</p>
</div>
<h:form id='myform' prependId="false">
<w:button accesskey='s' onclick="complexTask.start();" value="start" />
<table>
<tr>
<td>
<w:progressBar id="complexPhaseProgress" minimum="0" maximum="4" />
</td>
</tr>
<tr>
<td>
<w:progressBar id="complexPercentageProgress" />
</td>
</tr>
<tr>
<td>
<h:outputText id="complexMessage" value="idle" />
</td>
</tr>
</table>
<ajax:progress id="complexTask" action="#{ProgressBean.complexAction}"
onstatechange="updateComplexProgress(this);" interval="2"/>
<script type="text/javascript">
function updateComplexProgress(status) {
complexPhaseProgress.setValue(status.phase);
complexPhaseProgress.setState(status.state);
complexPercentageProgress.setValue(status.percentage);
complexPercentageProgress.setState(status.state);
document.getElementById('complexMessage').innerHTML = status.message;
}
</script>
</h:form>
</w:page>ProgressBean的代码:
@ManagedBean(scope=ManagedBeanScope.SESSION)
public class ProgressBean {
private int percentage = 0;
private int phase = 0;
private int maxPhase = 4;
private String phaseMessages[] = { "Initializing...", "Loading...", "Configuring...",
"Running...", "Finished" };
public void complexAction(ProgressStatus status) {
switch (status.getAction().ordinal()) {
case ProgressAction._START:
this.phase = 0;
this.percentage = 0;
status.setPhase(phase);
status.setPercentage(percentage);
status.setMessage(phaseMessages[0]);
status.setState(ProgressState.RUNNING);
break;
case ProgressAction._POLL:
boolean completed = false;
percentage += 25;
if (percentage == 100) {
if (++phase &amp;amp;gt;= maxPhase) {
phase = maxPhase;
completed = true;
}
} else if (percentage &amp;amp;gt; 100) {
percentage = 0;
}
status.setPhase(phase);
status.setPercentage(percentage);
status.setMessage(phaseMessages[phase]);
status.setState(completed ? ProgressState.COMPLETED : ProgressState.RUNNING);
}
}
}