Java 平台为自己赢得了服务器端应用程序开发的首选平台的名声。Servlet 是服务器端 Java 技术的强大支柱,因此有无数的框架是围绕着 Servlet API 建立 起来的,其中包括 Strut、JavaServer Faces (JSF) 和 Tapestry。您可能已经猜到,Groovy 也是以 Servlet API 为基础建立起来的框架,不过,这个框架的目的是简化开发。

Groovlet 和 GroovyServer Pages(GSP)框架的目的是提供一种优雅而又简单的平台,将它用于构建复杂程度不高的 Web 应用程序。就像 GroovySql 不是数据库开发的惟一选择一样,Groovlet 框架也不是 像 Strut 那样具有更丰富功能的框架的替代品。Groovlet 只是 开发人员寻求容易配置和产生工作代码的快速方法时的一种选择。

例如,不久前,我需要 ―― 快速地 ―― 提供一个 stub 应用程序,以测试像 xml-rpc API 这样的客户端。显然可以用一个 servlet 快速编写出所需要的功能,但是我从没想过钻研 Strut,一秒钟也没有。我考虑过使用基本的普通 Java Servlet API 编写 servlet 及其相关的逻辑,但是由于需要尽快地使用这项功能,所以我选择了使用 Groovlet 快速完成它。

Groovlet 和 GSP

使用 Groovlet 和 GSP 的前提条件相当简单:需要一个 servlet 容器,以及最新、最伟大 版本的 Groovy。这些框架的好处是它们通过一个 web.xml 文件将所选模式的所有 URL 映射到特定的 servlet。因此, 建立 Groovlet 和 GSP 的实现的第一步是定义一个 Web 应用程序上下文,并更新它的相关 web.xml 文件。 这个文件将包括特定的 servlet 类定义以及它们对应的 URL 模式。

我将使用 Apache Jakarta Tomcat,并且已创建了一个名为 groove 的上下文。目录结构如清单 3 所示:

清单 3. groove 上下文的目录列表
./groove:
drwxrwxrwx+   3 aglover  users        0 Jan 19 12:14 WEB-INF
./WEB-INF:
-rwxrwxrwx+   1 aglover  users      906 Jan 16 14:37 web.xml
drwxrwxrwx+   2 aglover  users        0 Jan 19 17:12 lib
./WEB-INF/lib:
-rwxrwxrwx+   1 aglover  users   832173 Jan 16 14:28 groovy-1.0-beta-9.jar
-rwxrwxrwx+   1 aglover  users    26337 Jan 16 14:29 asm-1.5.2.jar

在 WEB-INF 目录中要有一个 web.xml 文件,它至少有一个清单 4 中的元素:

清单 4. 一个完全配置的 web.xml 文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=
    "http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    <servlet>
      <servlet-name>GroovyServlet</servlet-name>
      <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>GroovyTemplate</servlet-name>
        <servlet-class>groovy.servlet.TemplateServlet</servlet-class>    
	</servlet>
    <servlet-mapping>
        <servlet-name>GroovyServlet</servlet-name>
        <url-pattern>*.groovy</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>GroovyTemplate</servlet-name>
        <url-pattern>*.gsp</url-pattern>
    </servlet-mapping>
</web-app>

上述 web.xml 文件中的定义声明了以下内容:所有以 .groovy 结尾的请求(如 http://localhost:8080/groove/hello.groovy)都将发送给 类 groovy.servlet.GroovyServlet, 而所有以 .gsp 结尾的请求 都将送给类 groovy.servlet.TemplateServlet

下一步是将两个 jar 放到 lib 目录中:groovy 发行版本的 jar(在这里是 groovy-1.0-beta-9.jar)和 对应的 asm jar (对于 groovy beta-9 来说是 asm-1.5.2.jar)。

瞧,就是这么简单 ―― 我已经准备好了。

Groovlet,请出场

编写 Groovlet 无疑很简单,因为 Groovy 只有很少的几个 对类继承扩展的要求。使用 Groovlet 不需要扩展javax.servlet.http.HttpServletjavax.servlet.GenericServlet 或者一些华而不实的 GroovyServlet 类。事实上,创建 Groovlet 就像创建一个 Groovy 脚本一样简单。甚至不必 创建一个类。在清单 5 中,我编写了一个简单的 Groovlet,它 做两件事:打印一些 HTML,然后提供一些关于它所在的容器的信息。

清单 5. 开始使用 Groovlet
println """
<html><head>
<title>Groovlets 101</title>
</head>
<body>
<p>
Welcome to Groovlets 101. As you can see
this Groovlet is fairly simple.
</p>
<p>
This course is being run on the following servlet container: </br>
${application.getServerInfo()}
</p>
</body>
</html>
"""

如果在浏览器中观看这个 Groovy,它看起来与图 1 所示类似。

仔细观察清单 5 中的 Groovlet,会让您回想起第一次编写 Groovy 脚本的时候。 首先,没有 main 方法或者类定义,只有一些简单的代码。而且,Groovlet 框架隐式地提供实例变量,比如 ServletRequestServletResponseServletContext  HttpSession。注意我是如何通过application 变量引用 ServletContext 的实例的。如果想获得 HttpSession 的实例,那么就要使用 session 变量名。与此类似,可以对ServletRequest  ServletResponse 分别使用 request  response

那些 GSP 呢?

到目前为止,我主要关注于编写 Groovlet。不过,正如您将会看到的那样, 很容易用 Groovy 的 GSP 页对 Groovlets 框架进行补充,就像 JSP 补充 Servlet API 一样。

表面上,GSP 看起来很像 JSP,实际上它们不可能有太大的差别,因为 GSP 框架其实就是一个模板引擎。如果不熟悉模板引擎,那么可能需要快速地 回顾一下上月的文章

虽然 GSP 和 JSP 是根本不同的技术,但是 GSP 是加入表达 Web 应用程序的视图的很 好候选人,这一点它们是类似的。您可能会想起来,在上月的文章中,有一项促进视图的技术可以将应用程序的业务逻辑问题与其相应的视图分离。 如果快速查看一下清单 6 中的诊断 Groovlet,就可以看出 GSP 代码改进了哪些地方。

是的,Groovlet 有些简陋,不是吗?问题在于它混合了应用程序逻辑和大量输出 HTML 的 println。幸运的是,可以通过创建一个简单的 GSP 来补充这个 Groovlet,从而解决这个问题。

示例 GSP

创建 GSP 与创建 Groovlet 一样容易。GSP 开发的关键是认识到 GSP 实质上 是一个模板,因此,它最适合有限的逻辑。我将在清单 7 中创建一个 简单的 GSP 作为开始:

清单 7. 一个简单的 GSP
<html>
<head><title>index.gsp</title></head>
<body>
<b><% println "hello gsp" %></b>
<p>
<% wrd = "Groovy"
   for (i in wrd){ 
 %>
 <h1> <%=i%> <br/>
   
 <%} %>
</p>
</body>
</html>

观察上面的 GSP 可能很容易让您回想起标准 Groovy 模板开发。 像 JSP 一样,它使用 <%, 但是, 与 Groovlet 框架类似,它允许您访问常用 servlet 对象,比如 ServletRequestServletResponseServletContext  HttpSession 对象。

结束语

如您所见,当所需要的功能相当简单并且需要尽快完成时,Groovlet 和 GSP 是进行服务器端开发的当然之选。 这两个框架都特别灵活,并且其代码到视图的转化时间事实上是无可匹敌的。

不过,需要强调的是,Groovlet 不是 Strut 的替代品。GSP 框架不是直接 在速度上与其他产品竞争。GroovySql 不是 Hibernate 的替代品。而 Groovy 也不是 Java 语言的替代品。

无论如何,这些技术是补充,在大多数情况下,Groovy 是快速开发的更简单的一种选择。 就像 GroovySql 是直接使用 JDBC 的替代方法一样,Groovlet 和 GSP 实际上是直接使用 Servlet API 的替代品。