《zk框架学习总结》word版 本文关键词:框架,学习,zk,word
《zk框架学习总结》word版 本文简介:ZK学习总结WebKey项目组2010年2月7日信息技术研究所地址:河北工业大学北辰校区西教①238室邮编:300401电话:(022)60435838E-Mail:前言按照项目计划,2010年1月29日至2010年3月5日为前期准备阶段,而春节之前主要对ZK进行深入学习。按照安排,组中各成员分别针
《zk框架学习总结》word版 本文内容:
ZK
学习总结
WebKey项目组
2010年2月7日
信息技术研究所
地址:河北工业大学北辰校区
西教①
238室
邮编:300401
电话:(022)60435838
E-Mail:
前
言
按照项目计划,2010年1月29日至2010年3月5日为前期准备阶段,而春节之前主要对ZK进行深入学习。按照安排,组中各成员分别针对ZK框架进行了学习,并记录了各自的学习过程、内容。现进行整理、总结,以便日后查阅或者供新成员学习之用。
本文档的内容参考了ZK官方资源,但重要体现自己的理解及应用,要求编写成员每个例子代码都自己编写一遍,运行出来,加上自己体会总结各个组件用法。
目前项目组只掌握了每个组件的独立用法,对于需要几个组件共同工作完成的业务还没有很好的解决方法。另外,对于自定义组件还需特别研究。
本手册只是为年前学习之总结,日后还会不断补充。自然其中可能会有错误或不足之处,希望大家多多指教。
具体分工:
陈磊:前言、第一章、第四章11节、第五章1、2、3、4、6节
刘建波:第二章、第四章12节、第五章5节
冯新红:第三章
王鸿淼:第四章1、2、3、4、5节
方国建:第四章6、7、8、9、10节
2010年2月7日
WebKey项目组
目
录
1
了解ZK1
1.1
理解ZK1
1.2
ZK特点1
2
ZK环境搭建3
2.1安装环境前,需要下载的东西:3
2.2安装过程3
2.3
第一个用Eclipse创建的ZK项目:Hello
World7
2.4例子中的配置分析12
3
组件基础属性及事件15
3.1
ID属性15
3.2
IF和unless属性16
3.3
use和apply属性16
3.4
forEach属性20
3.5
事件处理20
4
组件属性及重要函数28
4.1
标签组件28
4.2
按钮组件30
4.3
日历组件31
4.4
图像组件32
4.5
窗口34
4.6
布局组件39
4.7
标签页44
4.8
网格48
4.9
菜单56
4.10
列表框59
4.11
树形组件64
5
应用示例71
5.1
功能简介71
5.2
建立项目环境71
5.3
登陆功能72
5.4
权限判断73
5.5
页面布局实现74
5.6
权限管理实现75
5.7
信息中心模块77
5.8
示例配置代码79
1
了解ZK
1.1
理解ZK
ZK官方网站及>中有关于ZK的定义:“ZK是一个事件驱动(event-driven)的,基于组件(component-based)的,用以丰富网络程序中用户界面的框架。ZK包括一个基于AJAX事件驱动的引擎(engine),一套丰富的XUL和XHTML,以及一种被称为ZUML(ZK
User
Interface
Markup
Language,ZK用户界面标记语言)的标记语言”。
通过这么一段时间的接触,体验到ZK是C/S构架在WEB应用中的实现。写过C/S程序的同学应该能够理解C/S构架特点,如C++,.NET等语言的应用程序构架,以上语言在编写C/S构架程序的时候都是基于各个组件的应用,如窗口、按钮、列表等,用面向对象的语言来说,C/S程序是由各个可视化的对象组成的。
最简单的程序需要有以下几个步骤,第一,编写前台数据输入页面,然后编写后台处理数据的代码,最后编写数据处理的结果的页面。以上的3个步骤在B/S框架中通常是独立分开的,而目前ZK框架则将三者能够绑定在一起,在一个ZK得页面中完成。像桌面程序一样,每个显示页面关联一个后台程序,页面中元素值及属性在后台程序中均能够随时得到,后台程序也能够控制页面元素。
ZK是基于组件的,每个组件都有对应的HTML页面显示,又会对应一个JAVA
对象。于是用户可以通过后台程序中对组件JAVA对象的处理来更新页面的HTML显示,而页面中元素的从属关系则体现在Java中的List类,每个组件都能够获得属于其中的元素列表(List)。
1.2
ZK特点
通过这么一小段时间的ZK学习与应用,总结一点我认为特点与体会。
1.组件多样,能够轻松完成普通web程序很难完成的树、图表、页面局部动态变换、标签页、分页网格等功能,是实现富客户端应用的良好工具。
2.开发模式简单,只需要掌握各个组件应用变可以轻松完成应用开发。
但利用ZK开发还有些缺点的地方
1.学习资料较少,只有官方网站中的例子,且例子均是局部功能,没有完整的WEB项目参考。这样就不能了解类包及页面如何分配等相关知识,如目前比较缺少在ZK中通用的对数据库进行增删改查的例子,打开2个window间数据传递等功能。
2.感觉网格不是很好用,网格中的一行可以显示一条数据,但如何通过一行直接获得绑定的数据?还是事件处理部分,事件处理是一个组件的特定函数,即一个类的函数,而函数中处理数据经常需要其他组件的数据,如何获得其他组件数据?唯一的方法似乎是事件监听类为组件的内部类。
3.版本问题,目前ZK最新式5.0,其中官网中的DEMO均是此版本的,而其他的DEMO及Eclipse的插件均是3.6版本的ZK,导致从例子中学习的一些程序代码在其他环境中运行出错。
4.编译源码问题,由于功能需要,需要对项目源代码进行重新编译,但ZK的编译需要在Linux或模拟Linux环境下运行,不是很方便,目前还没掌握。
2
ZK环境搭建
2.1安装环境前,需要下载的东西:
作为一个基于
java
的
web
framework,再使用
ZK
之前,需要成功安装
JDK
和
tomcat5.5
或者更高的版本,所以要提前下载的东西为:
①下载JDK(Java
SE)安装包;
②下载Tomcat安装包;
③下载Eclipse
IDE
软件开发工具安装包,我们项目组目前Eclipse环境为3.4;
④下载ZK
Library;
⑤下载ZK
Studio
对于ZK
Library可以再http://www.jsfw8.com)中下载到本地机器。安装之后需要配置环境变量。
2.2.2
安装Servlet容器
Apache
Tomcat是当前广为流行的Servlet容器之一,安装简单,使用方便,可以使用官方网站提供的两种安装方法。第一种使用Installer包安装,第二种是快速安装方法,是Tomcat提供的一个.ZIP文件。第二种具体操作过程是:首先,可已访问官方网站下载.zip文件;其次,将文件解压到本地机器;然后装tomcat,装完后启动tomcat测试是否可以正常运行,以便查看环境变量测试的是否正确(默认端口是8080)。在地址栏直接键入http:/localhost:8080/或者输入http://127.0.0.1:8080。
2.2.3安装Eclipse
可以到www.eclipse.org下载eclipse,可以选择:
Download
now
下载完成后,只需要将下载的压缩文件eclipse-SDK-3.4-in32.zip解压到指定位置,例如D:/Eclipse即可完成安装。记下来就可以。安装后,会弹出一个画面选择工作空间,自己指定一个就可以。
2.2.4安装插件
通过自己在Eclipse下安装ZK插件的学习体会,总结了在Eclipse下安装插件主要有三种方式,我认为第三种方式比较好(推荐),具体的安装过程如下:
第一种方法:主要借助于Eclipse的向导来安装插件。通过Help/Software
Updates/Find
and
Install,在弹出的菜单中选择“Search
for
new
features
to
install”,点“Next”,在下一菜单中选择“New
Local
Site”或“New
Archived
Site”,找到你下载的插件所在目录,选中安装即可。
第二种方法:在Eclipse的主目录(%ECLIPSE_HOME%)下有一个plugins目录和features目录。将插件解压缩后,在解压缩后的文件夹里一般可以看到plugins文件夹,有的插件解压缩后还可以看到一个features文件夹。一般将plugins文件夹下的内容直接拷贝到%ECLIPSE_HOME%/plugins目录下,如果解压缩后的插件目录下还有features文件夹,则把该文件夹下的内容也拷贝到%ECLIPSE_HOME%/features下。重新启动Eclipse之后就可以使用刚刚安装的插件了。
第三种方式:就是在Eclipse主目录下创建一个links目录,然后将你自己的插件放在你想放的任何地方,这个时候你放插件的目录就是插件目录(%PLUGIN_HOME%),然后在你的%ECLIPSE_HOME%/links/目录下创建一个link文件,比如要安装一个
Lomboz插件,可以在links目录下创建一个Lomboz.eclipse.link文件,link文件的名称随便取。这个Lomboz.eclipse.link文件指向的存放Lomboz插件的目录(%PLUGIN_HOME%)。假如你的Lomboz插件的zip/rar文件解压缩后放在C:/eclipse_plugins/Lomboz.eclipse下(如果是插件是jar文件则可以不用解压缩),则Lomboz.eclipse.link文件的内容就应该是:path=C://eclipse_plugins//Lomboz.eclipse。注意:path所指的文件路径一定要增加一个“/”转义符来分开。
其余插件的安装也是如此,比如安装Eclipse多国语言包,通过安装Eclipse多国语言包,Eclipse可以自动实现开发环境的本地化,即自动根据操作系统的语言环境选择语言包进行本地化,先到http://download.eclipse.org/eclipse/downloads/下载Eclipse3.2版本的多国语言包,其名称为Language
pack。按照前面的第三种方式安装即可。
2.2.5
配置ZK环境(ZK库)
1.打开Eclipse(前提条件是已经安装好了ZK
studio插件),如果没有安装,请先按照前面的介绍安装插件;
2.点击菜单Window->Preferences(From
menu
goto
Windows
>
Preferences
);
3.在打开的这个窗口上选择ZK->ZK
Packages(On
the
Preferences
Window,select
ZK
>
ZK
Packages);
4.点击Add
Diretory
选择到你下载的ZK
Library包,不用解压,直接是ZIP文件,如下图:
5.会跳出一个窗口来,点击OK
6.给这个包命名,一般就用默认的,点击OK;
7.再选择上那个ZK
Library就行了,如果你不选择,会自动选择最后你引入的版本的。到此,ZK的环境就配置完了。
2.3
第一个用Eclipse创建的ZK项目:Hello
World
2.3.1
创建项目过程
1.启动Eclipse,我倾向于在Java
EE
下创建项目
2.如果没有建立Server的话,需要先打开Window-》show
view
->
other…->servers
à右击选择New
->Server,然后选择tomcat即可;
3.选择File->New->Dynamic
Web
Project,输入项目名称,例如我给项目其名字为MyZK;
4.点Next,再点Finish就完成了一个ZK项目的创建;
5.右击项目名称,选择properties----》Java
BuidPath给项目导入ZK的Jar包,将%ZK_HOME%/dist/lib目录下的所有jar文件(如果需要更多ZK附加功能,加入ext与zkforge目录下的jar文件)到WebContent/WEB-INF/lib目录下。
6.创建一个新的ZUL文件(Creating
a
new
ZUL
file):helloworld;
7.创建完.zul文件后,写入ZK代码;
8.启动Tomcat服务器,选择MyZK,运行;
9.在浏览器里输入:http://localhost:8080/MyZK/first.zul,就可以看到下面的内容。
2.4例子中的配置分析
2.4.1项目目录结构
在Eclipse下搭建的ZK环境上开发的程序,比如对于上面的例子项目MyZK,其目录结构如下所示:
下面对于上面的目录中的文件,我通过查找资料,进行了总结,对于Zk的配置文件大体的意思是:
①WEB-INF/web.xml
定义了必须的servlet,及运行ZK应用程序所需要的监听器;
②WEB-INF/zk.xml为ZK的配置描述文件;
③WEB-INF/lib
包括了ZK的必须库文件;
④该应用程序所需的重要jar包文件说明:
.
bsh.jar:
BeanShell
Java
代码解释器
.
commons-el.jar:
Apache的EL表达式解释器
.
zcommon.jar
:
ZK的通用库
.
zhtml.jar:
XHTML
相关组件
.
zk.jar
:
ZK核心代码
.
zkplus.jar
:与Acegi
Security,Spring,Hibernate,和data
binding集成的代码
.
zul.jar
:XML相关组件
.
zweb.jar:web相关功能代码
2.4.2关于web.xml的配置
在web.xml中为ZK定义必须的servlet
,及listener,我把在该项目MyZK下的web.xml文件中的代码拷贝如下:
MyZK
Used
to
cleanup
when
a
session
is
destroyed
ZK
Session
cleaner
org.zkoss.zk.ui.http.HttpSessionListener
The
ZK
loader
for
ZUML
pages
zkLoader
org.zkoss.zk.ui.http.DHtmlLayoutServlet
update-uri
/zkau
1
The
asynchronous
update
engine
for
ZK
auEngine
org.zkoss.zk.au.http.DHtmlUpdateServlet
LoginServlet
LoginServlet
servlet.LoginServlet
zkLoader.zul
zkLoader.zhtml
auEngine
/zkau/*
LoginServlet
/userlogin
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
index.zul
2.4.3关于zk.xml的配置
.xml文件是对ZK配置的描述性文件,我把在该项目MyZK下的zk.xml文件中的代码拷贝如下:
ajax
/timeout.zul
3
组件基础属性及事件
3.1
ID属性
为了读取
Java
代码或EL
表达式中的组件,我们可以使用id
属性来标识它。在下面的例子中,我们为label
设置了一个标识,这样当一个按钮被按下时,我们就可以操纵label
的值了。如下面两个例子可以让你领会id的作用
Do
you
like
ZK?
当按下“Yes”按钮的时候,可以看到如下效果。
id属性在EL表达式中的应用,如下代码:
这段代码实现的是将文本框中的值赋给标签,“source”就代表着文本框,我们只需对其进行操作就相当于对文本框操作了。
3.2
IF和unless属性
if
和unless
属性被用于控制是否创建一个组件,在下面的例子中,两个label只有在请求中含有一个为vote
的属性时才被创建:
如果两个属性都被指定,将不会创建组件除非它们的值都被赋值为true。
3.3
use和apply属性
在页面中嵌入代码不当会增加维护的难度,有两种途径可以从视图中分离出代码。
一种途径是你可以监听所关心的事件,然后调用合适的方法进行处理。例如,可以调用
onCreate,onOK,onCancel事件来完成初始化(initialize),处理(process)和取消(cancel)等工作。
另外,必须有一个名称为MyManager
的Java
类,内容像下面一样:
import
org.zkoss.zul.Messagebox;
import
org.zkoss.zul.Window;
public
class
MyManager
{
public
static
void
init(Window
main)
{
main.setTitle(“关注我的请求!“);
}
public
static
void
save(Window
main)
throws
InterruptedException
{
main.setTitle(“save“);
Messagebox.show(“您的信息已经保存!“);
}
public
static
void
cancel(Window
main)
throws
InterruptedException
{
main.setTitle(“cancel“);
Messagebox.show(“你取消的请求已经完成!“);
}
}
按下“save”按钮的时候,程序运行的效果如下:
但是,上面的方法需要你在ZUML页面内嵌入一些代码。在用户界面(UI)内嵌入代码的优点是可以很容易的动态改变行为(特别是在原型阶段),但是这仍然会展现一些维护代码且性能会有一些降低。于是引出了use和apply属性的使用。
3.3.1
use
属性
若不想在
ZUML
页面内使用Java
代码,你可以继承一个组件的实现来处理事件,如下。
import
org.zkoss.zul.Messagebox;
import
org.zkoss.zul.Window;
public
class
MyWindow
extends
Window
{
public
void
onCreate()
{
this.setTitle(“关注我的变化!“);
}
public
void
onSave()
{
this.setTitle(“save“);
}
public
void
onCancel()
{
this.setTitle(“cancel“);
}
}
然后,使用use
属性指定类,如下。
执行效果如下:
3.3.2
apply
属性
若你喜欢使用MVC(模型-试图-控制者)方法,例如,你不想在window(视图)内嵌入处理代码,可以实现一个类来初始化window。这个类必须实现org.zkoss.zk.ui.util.Composer
接口。
import
org.zkoss.zk.ui.Component;
import
org.zkoss.zk.ui.util.Composer;
import
org.zkoss.zul.Window;
public
class
MyComposer
implements
Composer
{
public
void
doAfterCompose(Component
comp)
throws
Exception
{
((Window)
comp).setTitle(“Apply
can
be
used
as
this!“);
//
do
whatever
initialization
you
want
}
}
在这里我们假设你有三个监听器,
MyCreate,MyOK,和
MyCancel。参考下面的事件章节获取事件监听器的解释。然后,使用
apply
属性指定类,如下。
按下apply按钮,程序执行效果如下:
window
仍然作为org.zkoss.zul.Window
的一个实例被创建,且作为comp
参数被传递给doAfterCompose
方法。然后,你可以处理你所希望的初始化。若你想apply
多个composer,使用逗号隔开。另外,你可以使用EL
表达式来返回类,它的名称,Composer
实例,或Composer
实例的集合。示意的代码如下:
3.3.3
与
forward
属性一起使用
window
通常由一些按钮,菜单项目和其他组件组成。例如,
当用户点击按钮时,onClick
事件会被送至按钮本身。但是这些事件最好在window内处理而不是散落这些按钮。为了这样,你可以按如下方式使用forward
属性。
.
在这里OK
按钮的forward
属性指定接收onClick
事件后将其作为onOK
事件转向空间所有者(例如,window)。同样,针对Cancel
按钮的onClick
事件会转向onCancel
事件。因此你可以在MyWindow
命名空间内处理onOK
和onCancel事件,如下。
public
class
MyWindow
extends
Window
{
public
void
onOK()
{
//called
when
the
OK
button
is
clicked
(or
the
ENTER
buttonis
pressed)
}
public
void
onCancel()
{
//called
when
the
Cancel
button
is
clicked
(or
the
ESC
button
is
pressed)
}
}
除了将onClick
事件forward
至空间所有者,你可以使用forward
属性将任何事件forward
至任何组件。
3.4
forEach属性
forEach
属性用来控制要创建多少个组件,如果你为这个对象指定一个对象集合,ZK
装载机(ZK
loader)将为每个被指定的集合项目创建一个组件。在下面的ZUML
页面中,listitem
元素将被赋值三次(分别为“Monday“,“Tuesday“和“Wednesday“),然后产生三个list
项目。
contacts
=
new
String[]
{
“Monday“,“Tuesday“,“Wednesday“,“Thursday“,“Friday“,“Saturday“,“Sunday“};
代码运行的效果如下:
除了使用foreach,还可以通过forEachBegin
和forEachEnd
来控制迭代(iteration)。
3.5
事件处理
事件(org.zkoss.zk.ui.event.Event)用来通知服务器发生了什么。每种类型的事件都由一种不同的类来表示。例如,org.zkoss.zk.ui.event.MouseEvent
来代表鼠标活动,如点击。为了响应事件,服务器需要为其注册一个或多个事件监听器。由两种方法来注册一个事件监听器。一种是通过在标记语言中指定onXxx
属性。另一种方法是为你要监听的组件或页面调用addEventListener
方法。
除了在浏览器端由客户活动触发的事件,一个应用程序可以使用org.zkoss.zk.ui.event.Events
类中的sendEvent
和postEvent
方法来触发事件。
3.5.1桌面和事件处理
如上所述,桌面是页面的集合,这些页面服务于同样的URL
请求。一个桌面当然是事件监听器能读取的范围。
当一个事件被触发时,它就和桌面联系在一起。ZK
分离基于关联桌面及流水事件(pipelines
events)分成单独的队列。因此,同一桌面的事件可以被顺序处理。另一方面,不同桌面的事件可以被并行处理。
一个事件监听器是被允许读取事件关联桌面内任何页面的任何组件的。它也被允许将一个组件从一个页面移到另一个页面,只要这些页面在同一桌面内。另一方面,它不能读取到其它桌面的组件。
[注]:
开发人员可以在一个事件监听器中将一个组件从一个桌面卸载,然后在另外的事件监听器中将其添加到另外一个桌面。
3.5.1.1
桌面及创建组件
当一个组件在一个事件监听器中被创建时,它就自动被分配到被处理的事件相关联的桌面。即使组件不属于一个页面这种分配也会发生。这就意味着你在事件监听器中创建的任何组件可以用于监听正在处理的同一桌面。如果一个组件是在一个线程(thread)而不是任何事件监听器中创建的话,它就不属于任何桌面。在这种情况下,可以将它添加到任何一个桌面,只要添加发生在一个合适的监听程序中。当然,一旦组件被添加到一个桌面,它就一直属于这个桌面。对于大多数应用程序而言,很少在线程(thread)而不是事件监听器中创建组件。然而,如果有一个长操作(long
operation),你或许会在后台线程(background
thread)中执行它。那么,你可以在后台准备一些组件树,然后在合适的事件被接收时将它们添加到桌面。关于此的详细信息,参看事件监听与处理一节的详细介绍。
3.5.2
事件监听与处理
3.5.2.1通过标记语言添加事件监听器
添加一个事件监听器最简单的方法就是在一个ZUML
页面内声明一个属性。用来监听的属性的值是可以被BeanShell
解释的任何Java
代码。
点击“say
welcome”按钮,效果如下图所示:
3.5.2.2通过程序添加或移除事件监听器
有两种方法通过程序添加或移除事件监听器。
第一种
声明一个成员
当用你自己的类重定义(overriding)一个组件后,你可以声明一个成员函数成为事件监听器。在一个ZUML页面中,你可以使用use属性来指定你想使用的类,即用它去替换默认类。如下所示,它使用了MyWindow来替换默认的org.zkoss.zul.Window。
然后你淂实现MyWindow.java
同过继承默认的类,就像下面一样:
public
class
MyWindow
extends
org.zkoss.zul.Window
{
public
void
onOK()
{
//add
an
event
listener
.//handles
the
onOK
event
(sent
when
ENTER
is
pressed)
}
}
如果你想获得关于事件的更多信息,你可以按如下方式声明:
public
void
onOK(org.zkoss.zk.ui.event.KeyEvent
event)
{
.
}
不同的事件或许与不同的事件对象相关联。
第二种
动态地添加与移除事件监听器
开发人员可以使用org.zkoss.zk.ui.Component
接口中的addEventListene
和removeEventListener
方法来动态地添加或移除事件监听器。如下所示,动态添加的事件监听器必须实现org.zkoss.zk.ui.event.EventListener
接口。
void
init(Component
comp)
{
.
comp.addEventListener(“onClick“,new
MyListener());
.
}
class
MyListener
implements
org.zkoss.zk.ui.event.EventListener
{
public
void
onEvent(Event
event)
throws
UiException
{
.//processing
the
event
}
}
(1)
延期事件监听器
默认情况下,当客户端的事件被触发时就会被送到服务器。但是,许多事件仅用于维持服务器端的现状,而不是向客户端提供视觉响应(visual
response)。换句话说,这些监听器的事件并不需要马上被送出。相反,它们应该仅被提交一次,以降低客户端和服务器端的来往,以提高服务器的性能。为求描述方便,我们称它们为延期事件监听器(Deferrable
Event
Listeners)。为了使一个事件监听延期,必须实现org.zkoss.zk.ui.event.Deferrable接口(和
EventListener)并且使用isDeferrable
方法返回true,就像下面一样。
public
class
DeferrableListener
implements
EventListener,Deferrable
{
private
boolean
_modified;
public
void
onEvent(Event
event)
{
_modified
=
true;
}
public
boolean
isDeferrable()
{
return
true;
}
}
当客户端的一个事件(例如,选择一个列表项目(list
item))被触发时,如果没有为其注册事件监听器或仅有延期(deferrable)的监听器被注册,ZK
不会将事件送出。一方面,如果至少有一个非延期(non-deferrable)监听器,事件会被马上送到服务器端,和所有的队列事件(queued
events)一起。没有事件会丢失,到达顺序是保存好的。
[提示]:当有非延期监听器为用户提供视觉响应,可以使用使用延期的(deferrable)事件监听器维持(maintaining)服务器状态。
(2)
为页面动态地添加和移除事件监听器
开发人员可以为页面(org.zkoss.zk.ui.Page)动态地添加和移除事件监听器。一旦被添加,所有被指定名字的事件会被送到指定页面的任何组件,这些页面将会被送到监听器。
所有的页面级(page-level)事件监听器都是非即时。换言之,isArap
方法被忽略了。
一个典型的例子是使用页面级事件监听器来维护修改标志(modification
flag),如下:
import
org.zkoss.web.servlet.dsp.action.Page;
import
org.zkoss.zk.ui.event.Deferrable;
import
org.zkoss.zk.ui.event.Event;
import
org.zkoss.zk.ui.event.EventListener;
import
org.zkoss.zul.Window;
import
org.zkoss.zk.ui.*;
public
class
ModificationListener
implements
EventListener,Deferrable
{
private
final
Window
_owner;
private
final
Page
_page;
private
boolean
_modified;
public
ModificationListener(Window
owner)
{
//
Note:
we
have
to
remember
the
page
because
unregister
might
//
be
called
after
the
owner
is
detached
_owner
=
owner;
_page
=
(Page)
owner.getPage();
((org.zkoss.zk.ui.Page)
_page).addEventListener(“onChange“,this);
((org.zkoss.zk.ui.Page)
_page).addEventListener(“onSelect“,this);
((org.zkoss.zk.ui.Page)
_page).addEventListener(“onCheck“,this);
}
/**
Called
to
unregister
the
event
listener./
public
void
unregister()
{
((org.zkoss.zk.ui.Page)
_page).removeEventListener(“onChange“,this);
((org.zkoss.zk.ui.Page)
_page).removeEventListener(“onSelect“,this);
((org.zkoss.zk.ui.Page)
_page).removeEventListener(“onCheck“,this);
}
/**
Returns
whether
the
modified
flag
is
set./
public
boolean
isModified()
{
return
_modified;
}
public
void
onEvent(Event
event)
throws
Exception
{
}
public
boolean
isDeferrable()
{
return
false;
}
}
3.5.2.3调用顺序
调用事件监听器的顺序如下。假定接收的是onClick
事件。
1.
如果监听器实现了org.zkoss.zk.ui.event.Express
接口,依次为添加到目标组件(targeting
component)的onClick
事件调用事件监听器。按照添加的顺序调用。
2.
调用目标组件的onClick
属性指定的脚本语言。
3.
如果监听器没有实现org.zkoss.zk.ui.event.Express
接口,依次为添加到目标组件的onClick
事件调用事件监听器。按照添加的顺序调用。
4.
调用目标组件的onClick
成员方法。
5.
依次为添加到目标组件所属页面的的onClick
事件调用事件监听器。按照添加的顺序调用。org.zkoss.zk.ui.event.Express
接口是一个装饰器(decorative
interface),用来改变调用事件监听器的优先级。注意,如果事件监听器被添加到页面,而不是组件,这个接口是没有意义的。
3.5.2.4事例:一个异步产生标签的工作线程
package
Test;
import
org.zkoss.lang.Threads;
import
org.zkoss.zk.ui.Desktop;
import
org.zkoss.zk.ui.Executions;
import
org.zkoss.zul.Label;
public
class
WorkingThread
extends
Thread
{
private
static
int
_cnt;
private
Desktop
_desktop;
private
Label
_label;
private
final
Object
_mutex
=
new
Integer(0);
/**
Called
by
thread.zul
to
create
a
label
asynchronously.
To
create
a
label,*
it
start
a
thread,and
wait
for
its
completion./
public
static
final
Label
asyncCreate(Desktop
desktop)
throws
InterruptedException
{
final
WorkingThread
worker
=
new
WorkingThread(desktop);
synchronized
(worker._mutex)
{
//
to
avoid
racing
worker.start();
Executions.wait(worker._mutex);
return
worker._label;
}
}
public
WorkingThread(Desktop
desktop)
{
_desktop
=
desktop;
}
public
void
run()
{
_label
=
new
Label(“Execute
“+
++_cnt);
synchronized
(_mutex)
{
//
to
avoid
racing
Executions.notify(_desktop,_mutex);
}
}
}
然后,在一个事件监听器中,我们使用ZUML
页面来调用这个工作线程,如在onClick事件中。使用的代码如下所示:
timer.start();
Label
label
=
Test.WorkingThread.asyncCreate(desktop);
main.
篇2:采购框架协议
采购框架协议 本文关键词:框架,协议,采购
采购框架协议 本文简介:采购框架协议采购方:(以下称“甲方”)供应商:(以下称“乙方”)经甲乙双方友好协商,依据《中华人民共和国合同法》及相关法律规定,就甲方向乙方采购产品及服务事宜达成协议如下:一、总则本合同为框架合同,其条款适用于依据本合同所签订的所有采购订单(以下简称“订单”)。本合同及其附件一(订单格式)以及本合同
采购框架协议 本文内容:
采购框架协议
采购方:
(以下称“甲方”)
供应商:
(以下称“乙方”)
经甲乙双方友好协商,依据《中华人民共和国合同法》及相关法律规定,就甲方向乙方采购产品及服务事宜达成协议如下:
一、总则
本合同为框架合同,其条款适用于依据本合同所签订的所有采购订单(以下简称“订单”)。本合同及其附件一(订单格式)以及本合同项下的所有采购订单组成甲、乙双方之间唯一的、完整的合同。如果本合同的条款与订单存在不一致,应以订单为准。订单未规定的内容以本合同规定为准。本合同的任何修改、补充、放弃均须有书面记录,并且有甲、乙双方授权代表人签字确认,并加盖合同专用章或公司公章方为有效,否则均视为无效。
二、本合同与订单
2.1甲方预计在本协议有效期内向乙方采购
套本合同所规定的产品
。
2.2甲方就本合同所规定的产品,通过订单的形式向乙方定货,订单内容以附件一规定的内容为准,未经双方书面确认,任何一方不得对订单格式进行修改。
2.3乙方应在收到订单后的二(2)个工作日内以书面方式予以确认(如果以传真方式确认甲方的订单,应确保该传真件与原件一致)。如果乙方发现订单不可接受或需要修改,应在收到订单后的三(3)个工作日内以书面形式通知甲方;如果乙方未在该时间内书面通知予以确认订单或通知不可接受订单或进行修改,则视为乙方已接受了甲方下达的该订单。该订单一经乙方接受即生效,任何一方在双方达成一致前均不得单方取消该订单。
2.4如乙方对订单提出修改意见或认为不可接受,乙方须以书面的形式通知甲方,甲方书面同意接受修改后,该修改后的订单才能生效。
2.5
乙方知悉,只有甲方下达的订单才对产品的交付和付款具有法律效力。
三、订单的变更和取消
3.1订单的取消和变更:在生效订单后规定的交货日期以内,如果甲方更改和取消订单的全部或任何部分,包括但不限于数量、交货日期等,甲方应将修改后的信息在交货期内以书面方式通知乙方,并须经过乙方的书面确认,如因此产生的相关费用由甲方承担。
3.2
如果乙方在生效订单规定的交货日期以后没有交货,则每逾期一天,乙方应向甲方支付采购物品总价款的
0.3
%作为违约金,不限于此,甲方有权更改和取消订单的全部或任何部分,包括但不限于:数量、交货日期,甲方不承担由此产生的任何费用。
3.3乙方对于自身有产品停产、业务转型的情况须提前3个月以书面形式通知甲方并提供替代方案。
四、交货
4.1乙方应该在每个订单规定的交货日期内,按照订单要求的产品、交付时间、地点和数量及时交付。如果甲方采购物品为分期分批交付的,则乙方应按照甲方的要求,按照甲方指定的方式、规则和程序在以下交付地点,分期分批交付采购物品。
交付地点:
4.2
除不可抗力因素外,乙方未能按照订单规定交付采购物品的,包括但不限于迟延交货、交货数量不足等,甲方有权解除订单或本合同,且甲方有权要求乙方赔偿因此给甲方造成的损失,甲方根据本条款行使权利并不影响其同时行使第3.2条的权利。
4.3如果发生乙方无法或可能无法按期交货时,乙方应及时将理由、对策及预定交货时间等内容告知甲方,同时配合甲方对此所进行的必要处理。甲方有权针对乙方无法按期交货的行为解除订单或本合同。
4.4
即使存在以上各款所述的情形,甲方根据本合同相关约定行使本合同的解除权并不影响甲方行使损害赔偿请求权。
4.5如果乙方早于订单要求交付日期交付,在甲方选择下,可以1)将货物退回给乙方,由乙方承担退货费用并确认发货期;2)收货并保留付款,直到按要求的交付日期计算的应付款日再支付。
五、价格和支付
5.1采购订单生效后,甲方需支付订单额的50%作为订金,甲方收到货物及17%增值税发票后15天内支付订单余款。如果订单中的约定与本条约定不一致,则以订单约定为准。
5.2乙方银行账户信息如下:
如果银行账户信息发生变更,应及时通知甲方。
5.3甲方有权在其应付给乙方的货款中扣除乙方当期因为少交货的产品或者由于产品质量导致退货的产品所对应的货款,如果甲方扣除乙方所欠的款项,应该事先通知乙方。
5.4
订单中的价格为含税价,并已包含运输费用与交付采购物品有关的所有费用,除此之外,甲方无须再向乙方支付其他任何费用。
六.
检验与验收
6.1甲方在接受采购物品之后应迅速对采购物品进行检验(以下简称“收货检验”)。甲方有权根据自己的需要决定采购物品的检验方式,即有权决定对乙方交付的采购物品实行外观检验还是开箱检验。
6.2收货检验是检验产品的外观、规格、数量、型号等是否与订单相符。如不符,甲方有权拒收,并要求乙方在甲方规定的时间内提供符合甲方要求的采购物品。乙方应在甲方提出异议后
3个
工作日内对甲方的异议予以答复,并且承担由此带来的一切费用和责任。
6.3双方同意,即使本采购物品已经完成验收,但是也不能证明乙方交付的产品全部为合格品。即乙方交付采购物品并不免除乙方根据本合同的约定所承担的质量保证和保修责任。
6.4甲方须在收到乙方交付的采购物品之日起三个工作日内收货验收,并将经甲方签字盖章确认后的货物收货验收单据副本提交给乙方
。
七.
所有权转移与风险承担
7.1
非因甲、乙双方任何一方的责任而引起的采购物品的灭失及毁损等风险,在乙方向甲方交付采购物品前由乙方承担,在采购物品向甲方交付(即乙方将货品运抵甲方指定的送货地点视为交付)完毕后由甲方承担。
八.
包装和质量
8.1采购物品应均为原出厂包装,并以适当方式运输,以确保采购物品在仓储运输过程中不受损伤,使之完好安全到达甲方指定地点。
8.2
乙方应保证提供给甲方的采购物品其外观和质量不存在任何缺陷或瑕疵。如有运输造成的损坏或外观方面的缺欠,乙方应在收到甲方的通知后负责退换,退换货所涉及的费用由乙方承担。
8.3
采购物品应符合国家或行业的标准,且具有生产厂商产品质量保证检验合格证明书及根据法律法规要求的其它相关认证与证明文件。
九、可追溯性条款
9.1
对于甲方有追溯性要求的产品,为了保持其唯一性和可追溯性,乙方应按照甲方的要求,以清晰牢固的方式在产品和外包装上标识该物资的名称、型号、规格、制造商、批号、机器序列号、生产日期等信息,以便于对该产品实施有效的追踪控制。该标识应与其包装、签收单及附带文件保持严格的一致性。基于追溯性的要求,乙方应在甲方要求时向甲方提供生产档案和相关文件以供查询。
十、乙方交付产品时需向甲方提供的文件
10.1销售的在中国大陆
生产的产品,乙方交付产品时需向甲方提供下列文件:产品说明书、合格证等相关证明文件。对于有追溯性要求的产品,乙方还需遵循本合同第
九
条之规定。
10.2如果乙方交付的产品是在中国境外生产,在甲方有需要时,应该向甲方提供该采购物品的原产地证,商检证明等(如有)。乙方保证应在甲方要求时提供符合法律法规要求的证明材料。
十一、权利瑕疵担保
11.1
乙方保证其提供采购物品和服务的过程和结果不会侵犯任何第三方的知识产权和其它民事权利。乙方并保证将采取一切合理的措施以确保其执行本合同项下的权利义务是合法的,对于因侵犯任何第三方的任何权利而使甲方遭受的任何请求、损失、责任、费用等,乙方应承担全部的赔偿责任(包括合理的律师费)。
十二、
售后服务
12.1乙方应对其提供给甲方的采购物品自交付完毕之日起提供
12
个月的免费保修期,保修期结束后乙方应对该物品提供终身维修服务。在任何情形下,乙方就采购物品提供的保修期限和保修服务的内容不能低于国家法律法规的有关规定及采购物品自身附带的保修卡规定。
12.2保修期内,乙方应在接到甲方通知后的
十个工作日内按照甲方指示免费完成对出现故障的采购物品(由于甲方或甲方的最终用户使用不当或操作失误造成的损坏除外)的修理或更换,必要时乙方应向甲方提供备用物品。对于甲方或甲方的最终用户使用不当或操作失误造成的采购物品故障,乙方应负责修理或更换,所需费用由甲方承担。
12.2保修期结束后,乙方应以低于乙方公布的一般市场配件及维修服务价的优惠价向甲方提供采购物品的配件及维修服务。
12.3乙方根据本合同约定在为甲方或甲方的最终用户在甲方指定的场所提供服务时应遵守甲方的相关管理规定。如果因为乙方提供本合同所约定的服务给甲方造成损失或导致甲方承担任何责任的,则乙方应对甲方遭受的任何请求、损
失、责任、费用等,承担全部的赔偿责任(包括合理的律师费)。
十三、
权利和义务的转让
13.1
未经甲方事先书面同意,乙方不得将其在本合同项下的权利和义务的全部或部分向其它任何第三方转让。
十四、
保密
14.1
乙方对本合同签订的事实及本合同的内容、在本合同的签订和履行过程中获知的甲方的所有商业信息、技术信息,包括但不限于甲方的顾客信息、数据等(“秘密信息”)自获知日起应予以保密,不得用于履行本合同以外的任何目的,且不得向第三者泄漏或公开。
十五、不可抗力
15.1
由于天灾、水灾、火灾、爆炸、战争、叛乱、造反等任何一方所无法预见、无法避免且不能克服的原因导致该方无法履行或延迟履行本合同时,任何一方不承担与此相关的责任,且不能视为违约。在以上原因发生后的10日内,受到影响的一方应及时通知另一方,并应采取积极有效的措施尽量避免损失的扩大。如该事件严重影响本合同的履行或致使无法履行且持续30日以上(包括30日)的,任何一方均可书面通知对方立即终止本合同。
十六、独立订约人
16.1
本合同任何内容均不得被解释为在双方之间建立一个聘用和受聘的关系。在履行本合同的过程中,每一方将作为独立订约人行事并具有独立订约人的身份,而不得充当或作为另一方的代理人、合伙人、合营伙伴、员工或受托人。任何一方均无权代表任何其他方承担或创建任何明示或默示的义务或做出任何明示或默示的陈述或保证,也无权在任何方面使另一方受到约束。
十七、合同的解除
即使本合同中有其他约定,如双方之中的一方在本合同有效期内发生以下情况时,另一方即可立即全部或部分解除本合同。
17.1
由监督机关吊销营业执照或处以停业等的处分时;
17.2
进入破产、重整、和解的程序时;
17.3
被采取第三人提起的临时扣押、财产保全、强制执行等措施,可认定资产状况极度恶化的严重事态已发生时;
17.4
开出的票据或支票被拒付或陷入被停止支付或支付不能的状态时;
17.5
解散、合并或重要经营资产的转让时。
17.6在一方或一方法定代表人严重违法或因违法嫌疑而成为司法程序的对象时,或受到行政警告、制裁等事件发生时,且因此类处分导致双方之间的交易难以为继时,双方中未违反一方可以全部或部分解除本合同。
17.7在一方违反本合同的义务时,另一方虽向其发出限期予以履约或改正的催告,但仍然没有予以履约或改正的,双方可以立即全部或部分解除本合同。
17.8如果市场发生变化导致甲方不再需要继续购买乙方本产品的,则甲方有权以书面方式提前90天通知乙方解除本合同,经双方书面确认后本合同方可解除,如因此给乙方造成损失,甲方须赔偿乙方因甲方解除合同所造成的实际损失。
17.9如果因自然灾害、事故或其他原因使乙方的工厂停工、生产设备等停止运转,或者乙方的生产能力显著下降,导致甲方认定难以继续交易的,甲方可以与乙方协商并双方书面确认后全部或部分解除本合同。
17.10
在一方发生上述条款所规定的解除事由时,则该方对有解除权一方负有的一切债务可视为已到偿还期限。
十八、期限
18.1本合同的有效期自*年*月*日起,至*年*月*日止。本合同终止时甲乙双方可以就延长合同另行进行协商,并以书面形式予以确定。
18.2如果在本合同签订之前,甲方已经通过订单向乙方采购物品,则本合同自动适用于该订单。
18.3如果订单在前款所指的本合同终止或解除时已成立但未履行完毕,除非甲方另有书面指示,否则该订单在履行完毕后方可终止,在订单继续存续期间适用本合同的条款。
十九、适用法律及争议解决
19.1
本合同的效力、理解与执行适用中华人民共和国法律。甲、乙之间就履行本合同和项目说明书所产生的争议,双方应友好协商解决,如果经友好协商仍不能解决争议时,则任何一方均可以将该争议提交甲方所在地的人民法院进行裁决,但如《中华人民共和国民事诉讼法》关于级别管辖和专属管辖另有规定除外。
二十、法律遵守与记录保管
20.1
乙方在履行本合同及采购订单时,应遵守所适用的中国或外国法律法规,包括但不限于环境保护、进出口、质量安全、禁止贿赂、禁止雇用童工等法律法规。如乙方有任何违反行为,甲方可立即全部或部分解除本合同或订单,并要求乙方赔偿因合同解除而蒙受的损失。为确认乙方的法律法规遵守情况,在甲方要求提供有关资料时,乙方应及时提交。
二十一、其他
21.1
各方应支付其各自因履行本合同而产生及发生的、适用法律规定的相关税收。
21.2
本合同一式四份,甲乙双方各执二份。本合同甲乙双方授权代表签字、加盖合同专用章后生效。
(以下无正文)
甲方:
乙方:
(盖章)
(盖章)
授权代表:
授权代表:
日期:
日期:
篇3:框架合作协议
框架合作协议 本文关键词:合作协议,框架
框架合作协议 本文简介:科技公司与第一太平公司XX楼宇综合通讯业务合作框架协议二〇年月甲方:公司乙方:地址:法定代表人:一、合作内容双方本着相互合作、优势互补、利益共赢的原则,自愿结成合作伙伴关系。并在友好协商的基础上达成如下条款:(一)甲乙双方同意以甲方为统一受理平台,统一管理乙方名下的XX楼宇一切的通信业务,包括但不限
框架合作协议 本文内容:
科技公司
与
第一太平
公司
XX楼宇综合通讯业务合作框架协议
二〇
年
月
甲方:公司
乙方:
地址:
法定代表人:
一、
合作内容
双方本着相互合作、优势互补、利益共赢的原则,自愿结成合作伙伴关系。并在友好协商的基础上达成如下条款:
(一)甲乙双方同意以甲方为统一受理平台,统一管理乙方名下的XX楼宇一切的通信业务,包括但不限于移动通讯业务,固网通信业务等的拓展以及维护管理。
(二)甲方负责XX楼宇内所有通信业务的支撑和运营管理工作,并负责向乙方楼宇内客户开展服务推广、客户跟进、客户签约等市场营销工作,收取相关客户使用该应用服务的费用。乙方负责向甲方提供楼宇内的通信线路以及工程施工准入审批等相关物业协助。
(三)双方就合作产品技术规范进行确认,以保证计费、对账等正常业务工作的开展。
(四)甲乙双方合作模式以楼宇综合电信业务总收入计提为基础,按年度对实际获得利润进行分配。乙方不得单方向第三方转让本合同项下全部或部分甲方应付账款,否则该转让行为无效。对于乙方确需转让本合同项下甲方应付账款的,双方应就该转让事项签署书面补充协议,书面补充协议经双方签字并加盖公章或合同专用章后生效。
(五)如遇国家税收政策发生较大变化(甲方纳入营业税改征增值税试点范围)且乙方为增值税纳税人时,乙方提供给甲方的发票必须为增值税专用发票。
(六)双方将建立专门的对口团队以保证双方的合作能持续有效开展,并指定专人进行业务支持。联系方式(包括:联系人姓名、手机、传真、固定电话及邮箱等)若有变更,变更一方需在变更后的【
】日内将更新资料以书面形式提供给对方。
(七)合作楼宇内的通信业务销售工作由甲方客户经理开展,也可由甲方允许准入的电信运营商人员开展,具体事宜由甲方统一负责统筹。
(八)由甲方负责销售或者合作销售的合作产品,由甲方负责宣传策划及业务推广。
二、
客户服务
(一)甲方负责按照楼宇内客户的要求提供高质量服务,向最终用户提供400客户服务热线,解答最终用户提出的咨询及查询,受理最终用户和各运营商转交的投诉、故障申告和建议,解决因自身原因引起的相关问题,提供不少于7×8小时的客服专席等内容。
(二)甲方接到客户咨询、办理和投诉后,由甲方客服部门负责问题跟进并回复客户。
三、
承诺与保证
(一)双方各自拥有的知识产权等合法权利归各方自有,任何单位和个人不得对其进行侵害。
(二)乙方保证,如发生第三方以任何形式向甲方及/或其关联方提出任何形式的权利主张,乙方均应积极参与、协助甲方及/或其关联方解决纠纷。如因第三方向甲方及/或其关联方提出权利主张并因此导致甲方及/或其关联方受到任何损失或支出任何费用的,乙方应负责全额赔偿甲方及/或其关联方受到的全部损失和支出的全部费用。
(三)双方应保证对所提供的数据、信息、应用系统、软硬件等资源拥有合法的知识产权或其他相关权利或已就使用该等资源获得合法的授权。双方保证签订和履行本协议不会侵犯第三方的任何合法权益(包括但不限于专利权、商标权、著作权等)。任何一方按照本协议的约定使用对方提供的数据、信息、应用系统、软硬件等资源而侵犯任何第三方的合法权益,资源提供方应负责解决相关纠纷(但依法须由资源接受方参与纠纷解决的除外)。双方确认,如乙方将与第三方达成的任何有法律效力的文件(包括但不限于和解协议、调解协议等)中涉及甲方承担义务或责任的,乙方均须在该等文件达成前取得甲方书面同意,否则,乙方无权对甲方的权利、义务、责任等作出任何安排;如有违反,乙方应向甲方承担赔偿损失等法律责任。如因第三方向资源接受方提出权利主张并因此导致资源接受方受到任何损失或支出任何费用的,资源提供方应负责赔偿资源接受方受到的全部损失和支出的全部费用(包括但不限于一切行政处罚罚款、诉讼费用、律师费用、差旅费、和解金额、损害赔偿金等)。
(四)双方保证将按照本协议约定内容及有关法律、法规等规范性文件的规定,合法地使用对方所提供的数据、信息、应用系统、软硬件等资源。如任何一方违法及/或违约使用对方提供的资源,应向守约方承担赔偿损失等法律责任;如因此造成第三方的合法权益受到损害,应由违约方向第三方承担全部法律责任,如因此导致守约方受到损失或支出费用的,违约方还应负责赔偿守约方受到的全部损失和支出的全部费用。
(五)因合作业务造成客户投诉索赔的,如界定属合作产品质量问题,甲方可根据先行赔付原则对客户进行赔偿。赔偿涉及金额在与乙方结算费用中予以扣除。
四、
保密条款
(一)未经对方事先书面许可,任何一方不得向第三方披露本协议的具体内容,也不得向第三方披露因签订和履行本协议获知的对方任何尚未公开的信息、资料(但法律法规另有规定、有权机关要求提供的除外)或将保密信息用于本协议以外的事项。如有违反并因此导致守约方受到损失,违约方应负责全额赔偿。一方向其聘请的律师事务所、会计师事务所等中介机构及/或其工作人员透露本协议的具体内容的,不视为违反保密义务,但该方应要求该等中介机构及其工作人员履行保密义务。
(二)当需要对外披露时,双方应共同协商,待双方统一步骤和宣传口径后,方可对外披露(但法律法规另有规定、有权机关要求提供或一方事先书面授权对方可以对外披露的除外)。
(三)任何一方均有义务确保从事本协议项下合作事项或知悉、了解上述保密信息的人员(包括但不限于该方雇员、代表、代理、顾问等)应承担与该方同样的保密义务,并就前述人员违反保密义务的行为向对方承担连带责任。
(四)本协议的保密条款在本协议终止后持续有效,直至保密信息成为公知信息或一方以书面形式免除对方的保密义务之日止。
五、
争议解决
(一)本协议的订立、履行、解释、争议解决等,均应适用中华人民共和国法律(为本协议之目的,港、澳、台地区的法律除外)。
(二)双方因本协议的履行或与本协议有关的其他事项而发生的争议,应由双方友好协商解决。如协商不成或不愿协商,则任何一方有权将争议提交甲方住所地人民法院解决。
(三)除争议事项外,双方可继续行使本协议项下的其它权利,并应继续履行本协议项下的其它义务,但争议事项导致甲方订立本协议的目的无法实现的除外。
六、
不可抗力
(一)不可抗力(指不能预见、不能避免并不能克服的客观情况)发生后,遭遇不可抗力的一方,应当立即书面通知对方,积极采取措施以避免或减轻不可抗力可能给对方造成的损失,并应在不可抗力发生后的【15】日内向对方提供政府部门出具的证明不可抗力发生及其影响的书面证明文件。
(二)在不可抗力影响消除后的合理时间内,双方均存在履约能力的,应当继续履行本协议,但法律、行政法规另有规定或双方另有书面约定的除外。
(三)因不可抗力导致双方或一方不能履行或不能完全履行本协议时,根据不可抗力对协议履行造成的影响,双方全部或部分免除责任,但法律另有规定的除外。一方迟延履行后发生不可抗力的,不能免除责任。
七、
其他
(一)双方将根据实际情况,在本协议的原则下,就具体合作模式、收入结算等另行签订书面形式的具体项目合作合同或协议。若具体项目合作合同或协议与本协议内容不一致的,应以具体项目合作合同或协议为准。
(二)除双方另有书面约定外,各方保留对向对方所提供资料和文件的版权和/或其他合法权益。甲乙双方共同完成的技术成果的权利归属及行使等事项,由双方另行协商确定并签署书面补充协议。
(三)本协议一式肆份,双方各执贰份,具有同等的法律效力。
(四)本协议有效期为拾年,自双方法定代表人或授权代表签字并加盖各自公章或合同专用章之日起生效。协议到期前,双方可协商是否签署后续合作协议;若任何一方提出终止业务合作,则应以妥善处理既有客户为核心商议具体方案。
(以下无正文,仅为甲乙双方的签字、盖章处)
甲方:公司(盖章)
授权代表:
(签字)*年*月*日
乙方:
公司(盖章)
授权代表:
(签字)*年*月*日