与JSF, JSP及其它的集成

当与已存在的Web页面集成时,你或许会问自己几个问题。

  1. 已存在的页面是静态的还是动态生成的?

  2. 若丰富已存在的页面,是轻微的增强(minor enhancement)?或是,重写页面的一部分?

  3. 当添加一个新页面时,使用XUL作为默认的组件集?

依你的请求,有几种途径可以选择。

使用已存在的Servlet

通过将使用FORM包裹ZUL组件,你可以将ZUML组件的内容作为请求参数提交到一个已存在的servlet。参考ZUML页面及XUL组件集一章中用HTML FORM 和Java Servlets一节获取细节。

使用此方法,你可以设计丰富的用户界面而无需修改依存在的servlet,仅是简单的使用ZUL组件替换一些内容。

使用包含丰富

若你想重写已存在页面的一部分,把重写的部分放入一个单独的ZUML文件或许会更好。然后,你可以在已存在的页面内包含此ZUML文件。例如,若使用了JSP技术则可以使用jsp:include。

<jsp:include page="/my/ria.zul"/>

丰富一个静态的HTML页面

若你想通过添加丰富的内容来直接修改一个静态的HTML页面,你可以使用Native命名空间(http://www.zkoss.org/2005/native) 来指定静态内容,然后为需要东逃改变的内容使用XUL 或XHTML组件集 (http://www.zkoss.org/2005/zulhttp://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 JSP标签

ZK为每个ZUL组件都提供了等价的JSP标签。若你喜欢在JSP页面使用ZUL组件,仅需简单的跟随下面的步骤。

  1. 在JSP页面内使用taglib指令指定http://www.zkoss.org/jsp/zul作为TLD文件的URI。

  2. 尽管是可选的,最好指定DOCTYPE为XHTML 1.0 Transitional,因为ZK客户端引擎默认使用它。

  3. 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 JSF组件

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>

使用ZK Filter丰富动态生成的页面

若你想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>