当与已存在的Web页面集成时,你或许会问自己几个问题。
已存在的页面是静态的还是动态生成的?
若丰富已存在的页面,是轻微的增强(minor enhancement)?或是,重写页面的一部分?
当添加一个新页面时,使用XUL作为默认的组件集?
依你的请求,有几种途径可以选择。
通过将使用FORM包裹ZUL组件,你可以将ZUML组件的内容作为请求参数提交到一个已存在的servlet。参考ZUML页面及XUL组件集一章中用HTML FORM 和Java Servlets一节获取细节。
使用此方法,你可以设计丰富的用户界面而无需修改依存在的servlet,仅是简单的使用ZUL组件替换一些内容。
若你想重写已存在页面的一部分,把重写的部分放入一个单独的ZUML文件或许会更好。然后,你可以在已存在的页面内包含此ZUML文件。例如,若使用了JSP技术则可以使用jsp:include。
<jsp:include page="/my/ria.zul"/>
若你想通过添加丰富的内容来直接修改一个静态的HTML页面,你可以使用Native命名空间(http://www.zkoss.org/2005/native
) 来指定静态内容,然后为需要东逃改变的内容使用XUL 或XHTML组件集 (http://www.zkoss.org/2005/zul
和 http://www.w3.org/1999/xhtml
) 。
<!-- test.zhtml --> <html xmlns="http://www.zkoss.org/2005/native" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:z="http://www.zkoss.org/2005/zul"> <head> <title>Hi ZK</title> </head> <body> <h:ul id="list"><!-- dynamically changeable --> <h:li><z:textbox/></h:li> </h:ul> <p>Static content</p> </body> </html>
ZK为每个ZUL组件都提供了等价的JSP标签。若你喜欢在JSP页面使用ZUL组件,仅需简单的跟随下面的步骤。
在JSP页面内使用taglib指令指定http://www.zkoss.org/jsp/zul作为TLD文件的URI。
尽管是可选的,最好指定DOCTYPE为XHTML 1.0 Transitional,因为ZK客户端引擎默认使用它。
ZK JSP页面的必须以page标签(ZK的 org.zkoss.zul.jsp.PageTag)开始,即表示此为一个JSP文件。
下面为一个简单的例子。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <%@ taglib uri="/WEB-INF/tld/zul/jsp/zul2jsp.tld" prefix="z" %> <html> <head> <title>Test of ZUL on JSP</title> </head> <body> <h1>1. Header outside z:page</h1><z:page> <h2>2. Header in z:page</h2> <z:window title="Test" border="normal"> <p>3. Content in z:window</p> </z:window> <p>4. Content in z:page after z:window</h2></z:page> <p>5. Content after z:page</p> </body> </html>
每个ZUL组件都被一个JSP标签包装,且每个属性都被一个标签属性包装。此外,混合使用JSP标签与其它标签是你的自由。因此,使用ZK JSP标签更直接。
ZK为每个ZUL组件提供了对应的JSF组件。使用方法类似于ZK JSP标签,只是taglib URI 为http://www.zkoss.org/jsf/zul
。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Validator Example</title> </head> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://www.zkoss.org/jsf/zul" prefix="z"%> <body> <f:view> <h:form id="helloForm"> <z:page> <z:window z:title="Validator Example" width="500px" border="normal"> --Validate input day must in weekend--<br/> <z:datebox id="dbox" format="yyyy/MM/dd" f:value="#{ValidatorBean.value}" f:validator="#{ValidatorBean.validateDate}"/> <h:message style="color: red; font-style: oblique;" for="dbox" /> <br/> <h:commandButton id="submit" action="#{ValidatorBean.doSubmit}" value="Submit" /> </z:window> <h:messages/> </z:page> </h:form> <a href="../index.html">Back</a> </f:view> </body> </html>
若你想ajax-ize一个动态生成的HTML页面(例如,输出一个JSP页面),可以使用ZK Filter处理生成的页面。你必须使用web.xml
启用ZK filter,如下所示。
<filter> <filter-name>zkFilter</filter-name> <filter-class>org.zkoss.zk.ui.http.DHtmlLayoutFilter</filter-class> <init-param> <param-name>extension</param-name> <param-value>html</param-value> </init-param> </filter> <filter-mapping> <filter-name>zkFilter</filter-name> <url-pattern>/my/dyna.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>zkFilter</filter-name> <url-pattern>/my/dyna/*</url-pattern> </filter-mapping>
此处,url-pattern
是独立于应用程序的。extension
参数(init-param
)定义了动态输出的语言。默认为html
。若为xul/html
,则指定zul
作为扩展名。
提示 : 在大多数情况下,ZK JSP标签更易于使用且比ZK filter消耗更少的内存。参考性能提示一章中。
注意,若你想过滤来自include和/或forward的输出,要使用REQUEST和/或INCLUDE指定适配器(dispatcher)元素。查阅Java Servlet 规范获取细节。 例如,
<filter-mapping> <filter-name>zkFilter</filter-name> <url-pattern>/my/dyna/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>