`

zk工具类

    博客分类:
  • ZK
阅读更多

package org.sunflower.demo.web.zk.util;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Map;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Desktop;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Session;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.WebApp;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Label;
import org.zkoss.zul.Messagebox;

/**
 * ZkUtils集合了zk中常用的一些功能,方便开发中的使用
 * 
 * @author sunflower Email:zhangxuehuaemail # gmail dot com
 * 
 */
public class ZkUtils {
	/**
	 * 获取当前
	 * 
	 * @return
	 */
	public static Execution getExecution() {
		Label lbl = new Label();
		lbl.getValue();
		return Executions.getCurrent();
	}

	public static Desktop getDesktop() {
		return getExecution().getDesktop();
	}

	/**
	 * 返回当前桌面的webapp
	 * 
	 * @return
	 */
	public static WebApp getWebApp() {
		return getDesktop().getWebApp();
	}

	/**
	 * 返回指定key的webapp作用域内的对象
	 * 
	 * @param key
	 * @return
	 */
	public static Object getWebAppAttr(String key) {
		return getWebApp().getAttribute(key);
	}

	/**
	 * 设置指定key的webapp作用域对象
	 * 
	 * @param key
	 * @param value
	 */
	public static void setAppAttr(String key, Object value) {
		getWebApp().setAttribute(key, value);
	}

	public URL getResource(String path) {
		return getWebApp().getResource(path);
	}

	/**
	 * 返回给定路径资源的
	 * 
	 * <p>
	 * Notice that, since 3.6.3, this method can retreive the resource starting
	 * with "~./". If the path contains the wildcard ('*'), you can use
	 * {@link Execution#locate} to convert it to a proper string first.
	 */
	public InputStream getResourceAsStream(String path) {
		return getWebApp().getResourceAsStream(path);
	}

	/**
	 * 返回 path虚拟路径的实际路径 .例如, the path "/index.html" returns the absolute file
	 * path on the server's filesystem would be served by a request for
	 * "http://host/contextPath/index.html", where contextPath is the context
	 * path of this {@link WebApp}.
	 * 
	 * <p>
	 * Notice that ZK don't count on this method to retrieve resources. If you
	 * want to change the mapping of URI to different resources, override
	 * {@link org.zkoss.zk.ui.sys.UiFactory#getPageDefinition} instead.
	 */
	public String getRealPath(String path) {
		return getWebApp().getRealPath(path);
	}

	/**
	 * 返回指定文件的mimetype类型 Returns the MIME type of the specified file, or null if
	 * the MIME type is not known. The MIME type is determined by the
	 * configuration of the Web container.
	 * <p>
	 * Common MIME types are "text/html" and "image/gif".
	 */
	public String getMimeType(String file) {
		return getWebApp().getMimeType(file);
	}

	/**
	 * 获得当前请求的session
	 * 
	 * @return
	 */
	public static Session getSession() {
		return Sessions.getCurrent();
	}

	/**
	 * 设置指定key的对象到session作用域
	 * 
	 * @param name
	 * @param value
	 */
	public static void setSessionAttr(String key, Object value) {
		getSession().setAttribute(key, value);
	}

	/**
	 * 获得从当前request的session中取出指定key的对象
	 * 
	 * @param name
	 * @return
	 */
	public static Object getSessionAttr(String key) {
		return getSession().getAttribute(key);
	}

	/**
	 * 获得当前session作用域所有变量
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static Map getSessionAttrs() {
		return getSession().getAttributes();
	}

	/**
	 * 获得指定名称的请求参数
	 * 
	 * @param name
	 *            参数名
	 * @return 参数值
	 */
	public static Object getParameter(String name) {
		return getExecution().getParameter(name);
	}

	/**
	 * 获得所有请求参数
	 * 
	 * @return 参数map
	 */
	public static Object getParamMap() {
		return getExecution().getParameterMap();
	}

	/**
	 * 获得指定名称的请求作用域对象
	 * 
	 * @param name
	 *            请求作用域对象名称
	 * @return 作用域对象
	 */
	public static Object getRequestAttr(String name) {
		return getExecution().getAttribute(name);
	}

	/**
	 * 将指定key的变量设置的到request scope
	 * 
	 * @param name
	 * @param value
	 */
	public static void setRequestAttr(String name, Object value) {
		getExecution().setAttribute(name, value);
	}

	/**
	 * 获得请求作用域所有对象
	 * 
	 * @param name
	 *            请求作用域对象名称
	 * @return 作用域对象
	 */
	@SuppressWarnings("unchecked")
	public static Map getRequestAttrs() {
		return getExecution().getAttributes();
	}

	/**
	 * Sends a temporary redirect response to the client using the specified
	 * redirect location URL.
	 * 
	 * It is the same as sendRedirect(url, null).
	 * 
	 * After calling this method, the caller shall end the processing
	 * immediately (by returning). All pending requests and events will be
	 * dropped.
	 * 
	 * Parameters: uri the URI to redirect to, or null to reload the same page
	 */
	public static void sendRedirect(String uri) {
		getExecution().sendRedirect(uri);
	}

	/**
	 * 请求重定向
	 * 
	 * @param uri
	 *            定向uri
	 * @param target
	 *            显示uri内容的目标窗口,如果target=null,则在当前窗口显示
	 */
	public static void sendRedirect(String uri, String target) {
		getExecution().sendRedirect(uri, target);
	}

	public static void forward(String uri) {
		try {

			getExecution().forward(uri);

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Sends the event to the specified component and process it immediately.
	 * This method can only be called when processing an event. It is OK to send
	 * event to component from another page as long as they are in the same
	 * desktop.
	 * <p>
	 * 详细中文解释见<a href="http://zh.zkoss.org/doc/devguide/ch05s03.html">这里</a>
	 */
	public static void sendEvent(Component comp, Event event) {
		Events.sendEvent(comp, event);
	}

	/**
	 * Sends the event the target specified in the event. *
	 * <p>
	 * 详细中文解释见<a href="http://zh.zkoss.org/doc/devguide/ch05s03.html">这里</a>
	 * <p>
	 * Note: {@link Event#getTarget} cannot be null.
	 */
	public static void sendEvent(Event event) {
		Events.sendEvent(event);
	}

	/**
	 * Posts an event to the current execution.
	 * <p>
	 * The priority of the event is assumed to be 0. Refer to
	 * {@link #postEvent(int, Event)}.
	 * 
	 * <p>
	 * On the other hand, the event sent by {@link #sendEvent} is processed
	 * immediately without posting it to the queue.
	 * 
	 * <p>
	 * Note: if the target of an event is not attached to the page yet, the
	 * event is ignored silently.
	 * <p>
	 * 详细中文解释见<a href="http://zh.zkoss.org/doc/devguide/ch05s03.html">这里</a>
	 * 
	 * @see #sendEvent
	 * @see #echoEvent
	 * @see #postEvent(int, Event)
	 */
	public static final void postEvent(Event event) {
		getExecution().postEvent(event);
	}

	/**
	 * Posts an instance of {@link Event} to the current execution.
	 * <p>
	 * The priority of the event is assumed to be 0. Refer to
	 * {@link #postEvent(int, String, Component, Object)}. 详细中文解释见<a
	 * href="http://zh.zkoss.org/doc/devguide/ch05s03.html">这里</a>
	 * 
	 * @see #postEvent(Event)
	 * @see #postEvent(int, String, Component, Object)
	 */
	public static final void postEvent(String name, Component target,
			Object data) {
		postEvent(0, name, target, data);
	}

	/**
	 * Posts an event to the current execution with the specified priority.
	 * 
	 * <p>
	 * The posted events are processed from the higher priority to the lower
	 * one. If two events are posted with the same priority, the earlier the
	 * event being posted is processed earlier (first-in-first-out).
	 * 
	 * <p>
	 * The priority posted by posted by {@link #postEvent(Event)} is 0.
	 * Applications shall not use the priority higher than 10,000 and lower than
	 * -10,000 since they are reserved for component development.
	 * 
	 * @param priority
	 *            the priority of the event.
	 * @since 3.0.7
	 */
	public static final void postEvent(int priority, Event event) {
		getExecution().postEvent(priority, event);
	}

	/**
	 * Posts an instance of {@link Event} to the current execution with the
	 * specified priority.
	 * 
	 * <p>
	 * The posted events are processed from the higher priority to the lower
	 * one. If two events are posted with the same priority, the earlier the
	 * event being posted is processed earlier (first-in-first-out).
	 * 
	 * <p>
	 * The priority posted by posted by {@link #postEvent(Event)} is 0.
	 * Applications shall not use the priority higher than 10,000 and lower than
	 * -10,000 since they are reserved for component development.
	 * 
	 * @param priority
	 *            the priority of the event.
	 * @since 3.0.7
	 */
	public static final void postEvent(int priority, String name,
			Component target, Object data) {
		Events.postEvent(priority, name, target, data);
	}

	/**
	 * Echos an event. By echo we mean the event is fired after the client
	 * receives the AU responses and then echoes back. In others, the event
	 * won't be execute in the current execution. Rather, it executes after the
	 * client receives the AU responses and then echoes back the event back.
	 * 
	 * <p>
	 * It is usually if you want to prompt the user before doing a long
	 * operartion. A typical case is to open a hightlighted window to prevent
	 * the user from clicking any button before the operation gets done.
	 * 
	 * @since 3.0.2
	 * @see #sendEvent
	 * @see #echoEvent
	 * @param name
	 *            the event name, such as onSomething
	 * @param target
	 *            the component to receive the event (never null).
	 * @param data
	 *            the extra information, or null if not available. It will
	 *            become {@link Event#getData}.
	 */
	public static final void echoEvent(String name, Component target,
			String data) {
		Events.echoEvent(name, target, data);
	}

	/**
	 * 消息提示框
	 * <p>
	 * <b style="color:red;"/>注意</b>:自从zk5.0以后,默认禁用本地事件进程,见zk.xml配置文件
	 * &lt;disable-event-thread&gt;true&lt;/disable-event-thread&gt;启用事件处理线程,
	 * 请将true改为false
	 * ,如果此行注释掉或者没有此行,请添加配置&lt;disable-event-thread&gt;false&lt;/disable
	 * -event-thread
	 * &gt;当禁用事件线程时,如果您使用了messagebox的返回值作为判断的话,那么if语句内的代码永远都不会执行。这两个的区别的详细说明见 <a
	 * href="http://sunflowers.iteye.com/blog/686243">这里<a>
	 * 
	 * @param message
	 *            消息内容
	 * @param title
	 *            窗口标题
	 */
	public static void showInformationBox(String message, String title) {
		show(message, title, Messagebox.INFORMATION);
	}

	/**
	 * 询问提示框
	 * <p>
	 * <b style="color:red;"/>注意</b>:自从zk5.0以后,默认禁用本地事件进程,见zk.xml配置文件
	 * &lt;disable-event-thread&gt;true&lt;/disable-event-thread&gt;启用事件处理线程,
	 * 请将true改为false
	 * ,如果此行注释掉或者没有此行,请添加配置&lt;disable-event-thread&gt;false&lt;/disable
	 * -event-thread
	 * &gt;当禁用事件线程时,如果您使用了messagebox的返回值作为判断的话,那么if语句内的代码永远都不会执行。这两个的区别的详细说明见 <a
	 * href="http://sunflowers.iteye.com/blog/686243">这里<a>
	 * 
	 * @param message
	 *            提示内容
	 * @param title
	 *            窗口标题
	 * @return boolean 类型,true确认,false否
	 */
	public static boolean showQuestionBox(String message, String title) {
		try {
			int flag = Messagebox
					.show(message, title, Messagebox.OK | Messagebox.CANCEL,
							Messagebox.QUESTION, Messagebox.CANCEL);
			return flag == Messagebox.OK;
		} catch (InterruptedException e) {
		}
		return false;
	}

	/**
	 * 警告提示框
	 * <p>
	 * <b style="color:red;"/>注意</b>:自从zk5.0以后,默认禁用本地事件进程,见zk.xml配置文件
	 * &lt;disable-event-thread&gt;true&lt;/disable-event-thread&gt;启用事件处理线程,
	 * 请将true改为false
	 * ,如果此行注释掉或者没有此行,请添加配置&lt;disable-event-thread&gt;false&lt;/disable
	 * -event-thread
	 * &gt;当禁用事件线程时,如果您使用了messagebox的返回值作为判断的话,那么if语句内的代码永远都不会执行。这两个的区别的详细说明见 <a
	 * href="http://sunflowers.iteye.com/blog/686243">这里<a>
	 * 
	 * @param message
	 *            警告内容
	 * @param title
	 *            窗口标题
	 */
	public static void showExclamationBox(String message, String title) {
		show(message, title, Messagebox.EXCLAMATION);
	}

	/**
	 * 错误提示框
	 * <p>
	 * <b style="color:red;"/>注意</b>:自从zk5.0以后,默认禁用本地事件进程,见zk.xml配置文件
	 * &lt;disable-event-thread&gt;true&lt;/disable-event-thread&gt;启用事件处理线程,
	 * 请将true改为false
	 * ,如果此行注释掉或者没有此行,请添加配置&lt;disable-event-thread&gt;false&lt;/disable
	 * -event-thread
	 * &gt;当禁用事件线程时,如果您使用了messagebox的返回值作为判断的话,那么if语句内的代码永远都不会执行。这两个的区别的详细说明见 <a
	 * href="http://sunflowers.iteye.com/blog/686243">这里<a>
	 * 
	 * @param message
	 *            提示内容
	 * @param title
	 *            窗口标题
	 */
	public static void showErrorBox(String message, String title) {
		show(message, title, Messagebox.ERROR);
	}

	/**
	 * 显示Information提示框
	 * 
	 * @param message
	 *            提示内容
	 * @param title
	 *            窗口标题
	 * @param icon
	 *            窗口图标:Messagebox.INFORMATION,Messagebox.QUESTION,Messagebox.EXCLAMATION
	 *            ,Messagebox.ERROR
	 */
	private static void show(String message, String title, String icon) {
		try {

			Messagebox.show(message, title, Messagebox.OK, icon);
		} catch (InterruptedException e) {
			// do nothing
		}
	}

	/**
	 * Returns the fully qualified name of the client or the last proxy that
	 * sent the request. If the engine cannot or chooses not to resolve the
	 * hostname (to improve performance), this method returns the dotted-string
	 * form of the IP address.
	 */
	public static String getRemoteHost() {
		return getExecution().getRemoteHost();
	}

	/**
	 * 
	 * 返回请求客户端的IP地址
	 */
	public String getRemoteAddr() {
		return getExecution().getRemoteAddr();
	}

	/**
	 * 返回本地请求对象(即ServletRequest),如果不可用返回null
	 * 
	 * <p>
	 * The returned object depends on the Web container. If it is based Java
	 * servlet container, an instance of javax.servlet.ServletRequest is
	 * returned.
	 */
	public static Object getNativeRequest() {
		return getExecution().getNativeRequest();
	}

	/**
	 * 返回本地响应对象(即ServletResponse),如果不可用返回null
	 * 
	 * <p>
	 * The returned object depends on the Web container. If it is based Java
	 * servlet container, an instance of javax.servlet.ServletResponse is
	 * returned.
	 */
	public static Object getNativeResponse() {
		return getExecution().getNativeResponse();
	}

	/**
	 * 开始处理
	 * <p>
	 * 在浏览器左上角,会出现一个"处理中,请稍后..."提示框 并禁用桌面上所有组件的行为,用户无法操作
	 * 
	 * @since 5.0
	 */
	public static void startProcessing() {
		Clients.evalJavaScript("zk.startProcessing(1)");
	}

	/**
	 * 结束处理
	 * <p>
	 * 隐藏浏览器左上角的"处理中,请稍后..."提示框 ,并启用用桌面上所有组件的行为,允许用户操作
	 * 
	 * @since 5.0
	 */
	public static void hideStartProcessing() {
		Clients.evalJavaScript("zk.endProcessing()");
	}
}
 
3
0
分享到:
评论

相关推荐

    zk工具类 ZkUtils 1.1版本

    为了方便开发者更好地操作ZooKeeper,通常会封装一些工具类,如本文的主题——ZkUtils 1.1版本。这个工具类提供了简洁易用的API,帮助开发者快速进行ZooKeeper的相关操作。 首先,我们来看ZkUtils的核心功能。它...

    ZK自己总结的工具类

    自己总结ZK开发工具类,里面都是一些ZK经常用到的方法

    dubbo以及ZK的demo

    3. **Zookeeper的安装与配置**:`zookeepermonitor.rar`可能包含了Zookeeper的监控工具,帮助你观察Zookeeper节点的状态和操作。安装Zookeeper通常包括解压、配置环境变量、修改配置文件(如`conf/zoo.cfg`)、创建...

    zoopeeper工具类,操作zk服务的工具

    该jar是用java编写的一个操作zookeeper的工具类,能快速的将远程zk服务节点中的数据导出来,也能快速将数据上传到zk中去!

    zookeeper工具

    Zookeeper是Apache软件基金会开发的一个分布式协调服务,它在分布式应用中扮演着至关重要的角色,尤其是在微服务架构和大数据领域。Dubbo是一个高性能、轻量级的Java远程服务框架,它利用Zookeeper作为服务注册与...

    ZK主题扩展工具.zip

    2. **理解ZK主题结构**:学习ZK的主题架构,了解哪些CSS类和ID与UI组件关联。 3. **选择或创建RGB值**:根据设计规范,为各个元素选取或生成合适的RGB颜色。 4. **修改主题文件**:使用提供的工具,编辑CSS文件,将...

    zk客户端curator2.11

    客户端是Curator Framework,是Apache的项目,它主要的功能...可以总结Curator主要解决以下三类问题: 封装ZK Client与Server之间的连接处理; 提供了一套Fluent风格的操作API; 提供ZK各种应用场景的抽象封装;

    zk模拟工具

    "zk模拟工具" 这个标题表明我们关注的是一个用于模拟Zookeeper操作的工具。Zookeeper是一个分布式的,开放源码的协调服务,它为分布式应用程序提供了高效且可靠的分布式协调。模拟工具通常用于在不实际部署整个...

    zkstudio_2.0.1_indigo

    【标签】"zkstudio" 表明了这个压缩包与ZK Studio这款工具紧密相关,ZK Studio是一个专门为ZK框架定制的开发工具,它包含了许多专为ZK应用程序设计的功能,如可视化组件编辑器、ZUL文件的语法高亮和代码提示,以及ZK...

    zk入门.web框架

    ZK的开发工具主要包括ZK Studio和ZK Package。ZK Studio是一个集成开发环境,可以作为Eclipse或Myeclipse的插件使用。安装过程如下: 1. 对于Eclipse,可以通过Help-&gt;Software Updates-&gt;Find And Install,然后选择...

    ZK资料学习zk框架的助手

    ZK的核心设计理念是“简单、快速、正确”,它采用类Zookeeper协议,提供了一个高可用、高性能、分布式的数据存储和通信机制。ZK基于一个简单的层次结构命名空间,类似于文件系统的目录树结构,允许客户端通过API进行...

    ZK所需jar包

    在Java项目中,将这个jar添加到类路径(classpath)是使用ZK框架的第一步。 其次,Spring4是一个全面的轻量级应用框架,用于简化企业级Java应用的开发。它提供了依赖注入、数据访问、事务管理、AOP(面向切面编程)...

    JAVA实现zookeeper节点批量删除工具类.rar

    本资源提供了一个JAVA实现的Zookeeper节点批量删除工具类,这对于管理和维护Zookeeper集群中的数据结构非常有用。 首先,我们需要了解Zookeeper的基础知识。Zookeeper是一个高可用的分布式服务框架,它主要用于解决...

    zk 开发依赖包

    开发者在进行ZK应用开发时,通常会直接引用此包,因为它提供了构建ZK应用的基本工具和API。 4. **zcommon.jar**:从名字推测,这可能是ZK的公共库,包含了跨模块共享的通用类和方法,可能包括数据结构、辅助函数等...

    ajax框架 zk开发手册

    - **测试与调试**:使用ZK提供的工具进行单元测试和性能测试,确保应用质量。 **6. ZK开发手册** 《ZK开发手册》是ZK框架的官方文档,详细介绍了ZK的使用方法、组件、API、事件处理、集成策略等内容,是开发者学习...

    grovvy Reference zk

    - **Controller**:ZK中的控制器通常是通过Composer类来实现的,负责管理UI组件的状态和事件处理。 - **Model**:ZK支持多种类型的数据模型,包括列表模型、分组模型等,以便于管理不同类型的数据集。 - **View**:...

    zk框架学习

    - **强大的表现层工具**:ZK作为表现层工具,能够与其他流行框架如Hibernate和Spring等进行整合,从而构建完整的Web应用程序。 - **服务端中心架构**:ZK的核心在于其服务端实现,包括ZK加载器和ZK异步更新引擎。...

    ZK Style Guide

    每个ZK组件都有一系列预定义的样式类,可以通过添加或移除这些类来改变组件的外观。了解这些类的用法可以帮助你快速调整组件样式,而无需编写复杂的CSS代码。 5. **事件处理和响应式设计** ZK Style Guide还会...

    Zk中注解的使用(ZkDemo系列)

    总结来说,ZK中的注解是简化开发、增强代码可维护性的关键工具。通过熟练掌握并运用这些注解,开发者能够更轻松地构建出功能丰富且易于维护的ZK应用。在进行ZK开发时,结合标签提供的`源码`和`工具`资源,可以进一步...

Global site tag (gtag.js) - Google Analytics