30.47. <w:progressBar>

ProgressBar构件是一个进度条,当一个操作比较费时的时候,用使用进度条可以提高界面的友好度。通常与AjaxProgress构件(表示进度)和HtmlOutputText构件(表示进度消息)连用。

30.47.1. 构件信息

表 30.117. 构件信息

Component Typeorg.operamasks.faces.component.widget.UIProgressBar
Component Familyjavax.faces.Output
Component Classorg.operamasks.faces.component.widget.UIProgressBar
Tag Classorg.operamasks.faces.webapp.widget.UIProgressBarTag
Renderer Typeorg.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.47.2. 属性

表 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)
是否必须 延时求值
构件的宽度

30.47.3. 构件API

30.47.4. 示例

下面是一个稍微复杂但是比较常用的例子,可以假设这样的一个场景,当复制一个文件夹的时候,上面的进度条是一个总体的进度,下面的进度条是单个文件的进度,当下面的进度条走完一条时,上面的进度条就向前走一点,直到走完为止,如下代码,当点击"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;amp;lt;ajax:progress&amp;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;amp;gt;= maxPhase) { 
          phase = maxPhase; 
          completed = true; 
        } 
      } else if (percentage &amp;amp;amp;gt; 100) { 
        percentage = 0; 
      } 
      status.setPhase(phase); 
      status.setPercentage(percentage); 
      status.setMessage(phaseMessages[phase]); 
      status.setState(completed ? ProgressState.COMPLETED : ProgressState.RUNNING); 
    } 
  } 
}