Primefaces BlockUI组件示例教程

时间:2020-02-23 14:41:37  来源:igfitidea点击:

Primefaces BlockUI用于通过可选的Ajax集成来阻止JSF组件的交互性。

Primefaces BlockUI

TagBlockUI
Component Classorg.primefaces.component.blockui.BlockUI
Component Typeorg.primefaces.component.BlockUI
Component Familyorg.primefaces.component
Renderer Typeorg.primefaces.component.BlockUIRenderer
Renderer Classorg.primefaces.component.blockui.BlockUIRenderer

Primefaces BlockUI属性

NameDefaultTypeDescription
idnullStringUnique identifier of the component.
bindingnullObjectAn el expression that maps to a server side UIComponent instance in a backing bean
widgetVarnullStringName of the client side widget.
triggernullStringIdentifier of the component(s) to bind.
blocknullStringIdentifier of the component to block.
blockedfalseBooleanBlocks the UI by default when enabled.
renderedtrueBooleanBoolean value to specify the rendering of the component

Primefaces BlockUI入门

BlockUI组件与ajax行为集成在一起,而无需像往常那样关联p:ajax组件。
通过提供触发属性,您可以定义将在激活后用于启动blockUI组件的那些源,从而确定要阻止的组件的定义块属性。
正如它出现在属性中一样,触发器属性可以与多个源相关联,而可以与仅使用一个组件标识的块属性相关联。

下面我们来看一个非常基本的示例,该示例为您提供了一个动作源,该动作源将在调用BlockUI组件后立即启动它。
到时候,BlockUI组件将阻止已识别的组件。

<html xmlns="https://www.w3.org/1999/xhtml"
	xmlns:ui="https://java.sun.com/jsf/facelets"
	xmlns:h="https://java.sun.com/jsf/html"
	xmlns:f="https://java.sun.com/jsf/core"
	xmlns:p="https://primefaces.org/ui">
<h:head>
	<title>BlocuUI</title>
	<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
	<div style="width: 30%">
		<p:panel id="messagePanel">
			<h:outputText value="JouranlDev Message Blocked !!"></h:outputText>
		</p:panel>
		#{' '}
		<p:commandButton id="action" value="Block Message"
			action="#{blockUIManagedBean.someAction}"></p:commandButton>
		<p:blockUI trigger="action" block="messagePanel"></p:blockUI>
	</div>
</h:form>
</html>
package com.theitroad.prime.faces.beans;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class BlockUIManagedBean {
	public String someAction() throws InterruptedException{
		Thread.currentThread().sleep(4000);
		return "";
	}
}

这是上述示例的详细说明:

  • 我们定义了包含消息组件的面板。

  • 该命令动作负责触发blockUI组件。

  • 一旦激活动作源,面板组件messagePanel将被阻止。

  • 该命令动作将延迟4秒钟,使blockUI组件在可接受的时间段内可见。

上面执行代码的结果如下:

上面显示的消息没有被阻止,因此可以选择并且可读。

一旦阻止消息动作被激活,面板组件将被阻止。

上面的面板组件现在无法选择,您将要学习如何使其不可见。

Primefaces BlockUI多个来源

如我们所见,blockUI组件已用于通过激活某些操作源来阻止视图中已渲染的组件。
现在,是时候实现相同的原理了,但是这次是使用两个不同的动作源。

<html xmlns="https://www.w3.org/1999/xhtml"
	xmlns:ui="https://java.sun.com/jsf/facelets"
	xmlns:h="https://java.sun.com/jsf/html"
	xmlns:f="https://java.sun.com/jsf/core"
	xmlns:p="https://primefaces.org/ui">
<h:head>
	<title>BlocuUI</title>
	<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
	<div style="width: 30%">
		<p:panel id="messagePanel">
			<h:outputText value="JouranlDev Message Blocked !!"></h:outputText>
			<p:commandButton id="action2" value="Panel Block Message Action"
				action="#{blockUIManagedBean.someAction}"></p:commandButton>
		</p:panel>
		#{' '}
		<p:commandButton id="action1" value="Block Message Action"
			action="#{blockUIManagedBean.someAction}"></p:commandButton>
		<p:blockUI trigger="action1 action2" block="messagePanel"></p:blockUI>
	</div>
</h:form>
</html>
package com.theitroad.prime.faces.beans;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class BlockUIManagedBean {
	public String someAction() throws InterruptedException{
		Thread.currentThread().sleep(4000);
		return "";
	}
}

这是上面列出的代码的详细说明:

  • 索引视图定义了两个动作,其中之一在面板内部列出,这是blockUI组件的目标,而第二个动作则在面板外部。
    这两个动作都将导致面板被阻止,但是这次,当外部动作被触发时,内部动作也将被阻止。
    阻止操作意味着不再使用该操作,即用户将无法点击。

  • 对于长时间的阻止,我们添加了Thread.currentThread()。
    sleep(4000)。

执行以上代码的结果如下:

您已经注意到,直到blockUI消失,内部动作源才被激活。
如果您激活了内部操作,则相同的blockUI也将显示。

Primefaces BlockUI自定义内容

如我们所承诺的,当显示BlockUI组件时,它也适用于您显示一些自定义内容。
诸如加载图像之类的自定义内容可能导致被阻止组件的内容不可见。

通过将BlockUI组件与所需的任何组件(例如graphicImage)相关联,您将获得在显示BlockUI时显示的自定义内容。
在下面的示例中,我们将使用像ajax loader这样的图像作为自定义内容,以隐藏被阻止组件的内容。

<html xmlns="https://www.w3.org/1999/xhtml"
	xmlns:ui="https://java.sun.com/jsf/facelets"
	xmlns:h="https://java.sun.com/jsf/html"
	xmlns:f="https://java.sun.com/jsf/core"
	xmlns:p="https://primefaces.org/ui">
<h:head>
	<title>BlocuUI</title>
	<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
	<div style="width: 30%">
		<p:panel id="messagePanel">
			<h:outputText value="JouranlDev Message Blocked !!"></h:outputText>
		</p:panel>
		#{' '}
		<p:commandButton id="action" value="Block Message"
			action="#{blockUIManagedBean.someAction}"></p:commandButton>
		<p:blockUI trigger="action" block="messagePanel">
			<p:graphicImage value="#{resource['images/ajax-loader.gif']}"></p:graphicImage>
		</p:blockUI>
	</div>
</h:form>
</html>
package com.theitroad.prime.faces.beans;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class BlockUIManagedBean {
	public String someAction() throws InterruptedException{
		Thread.currentThread().sleep(4000);
		return "";
	}
}

执行结果如下:

您已经注意到:

  • 将Ajax加载程序图像添加到项目中,以便与BlockUI组件结合使用。

  • 一旦激活了阻止消息操作,BlockUI组件就会与关联的Ajax加载器图像一起显示,这将导致面板内容看不到。

  • 我们使用了jsf 2框架已实现的资源概念。
    资源变量引用位于webapp文件夹下面的resources文件夹。
    下面是已开发项目的目录结构。

Primefaces BlockUI客户端API

Primefaces使您能够使用客户端API来操纵和控制视图的组件。
定义widgetVar属性将帮助您控制组件,并因此调用受控组件提供的所有那些行为。
BlockUI组件为您提供了两个可能由JavaScript代码调用的客户端方法。
show()和hide()主要是可用于BlockUI的唯一使它分别被阻止和解除阻止的方法。
下面的示例展示了如何使用两个JavaScript函数控制BlockUI组件的机制。

<html xmlns="https://www.w3.org/1999/xhtml"
	xmlns:ui="https://java.sun.com/jsf/facelets"
	xmlns:h="https://java.sun.com/jsf/html"
	xmlns:f="https://java.sun.com/jsf/core"
	xmlns:p="https://primefaces.org/ui">
<h:head>
	<title>BlocuUI</title>
	<script name="jquery/jquery.js" library="primefaces"></script>
	<script>
		function show(){
			PF('blockUI').show();
		}

		function hide(){
			PF('blockUI').hide();
		}
	</script>
</h:head>
<h:form>
	<div style="width: 30%">
		<p:panel id="messagePanel">
			<h:outputText value="JouranlDev Message Blocked !!"></h:outputText>
		</p:panel>
		#{' '}
		<p:blockUI widgetVar="blockUI" block="messagePanel">
			<p:graphicImage value="#{resource['images/ajax-loader.gif']}"></p:graphicImage>
		</p:blockUI>
		<br
		<input type="button" onclick="show();" value="Show BlockUI"
		<input type="button" onclick="hide();" value="Hide BlockUI"
	</div>
</h:form>
</html>
package com.theitroad.prime.faces.beans;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class BlockUIManagedBean {
	public String someAction() throws InterruptedException{
		Thread.currentThread().sleep(4000);
		return "";
	}
}

执行以上代码的结果将是:

一旦激活了Show BlockUIHTML输入,面板组件将被阻止,其中Hide BlockUI将导致面板被阻止。

Primefaces BlockUI阻止的属性

还需要提及一个剩余的属性。
阻止属性使阻止行为直观地发生。
默认情况下为false以有条件地进行阻止行为。
在任何情况下,如果要立即阻止组件,则在显示视图后,只需将此属性设置为true即可。
以下示例显示了将此属性设置为true的影响。

<html xmlns="https://www.w3.org/1999/xhtml"
	xmlns:ui="https://java.sun.com/jsf/facelets"
	xmlns:h="https://java.sun.com/jsf/html"
	xmlns:f="https://java.sun.com/jsf/core"
	xmlns:p="https://primefaces.org/ui">
<h:head>
	<title>BlocuUI</title>
	<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
	<div style="width: 30%">
		<p:panel id="messagePanel">
			<h:outputText value="JouranlDev Message Blocked By Default !!"></h:outputText>
		</p:panel>
		#{' '}
		<p:blockUI blocked="true" block="messagePanel"></p:blockUI>
	</div>
</h:form>
</html>
package com.theitroad.prime.faces.beans;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class BlockUIManagedBean {
	public String someAction() throws InterruptedException{
		Thread.currentThread().sleep(4000);
		return "";
	}
}