Servlet 支持

你可以用 Groovy 编写 (Java) Servlet(称为 Groovlet)。

还有一个 GroovyServlet

此功能将自动编译你的 .groovy 源文件,将其转换为字节码,加载类并缓存,直到你更改源文件。

这是一个简单的示例,向你展示了 Groovlet 可以实现的功能。

注意使用隐式变量来访问会话、输出和请求。另请注意,这更像一个脚本,因为它没有类包装器。

if (!session) {
  session = request.getSession(true)
}

if (!session.counter) {
  session.counter = 1
}

println """
<html>
    <head>
        <title>Groovy Servlet</title>
    </head>
    <body>
        <p>
Hello, ${request.remoteHost}: ${session.counter}! ${new Date()}
        </p>
    </body>
</html>
"""
session.counter = session.counter + 1

或者,使用 MarkupBuilder 做同样的事情

if (!session) {
    session = request.getSession(true)
}

if (!session.counter) {
    session.counter = 1
}

html.html { // html is implicitly bound to new MarkupBuilder(out)
  head {
      title('Groovy Servlet')
  }
  body {
    p("Hello, ${request.remoteHost}: ${session.counter}! ${new Date()}")
  }
}
session.counter = session.counter + 1

1. 隐式变量

以下变量可在 Groovlet 中使用

变量名 绑定到 备注

请求 (request)

ServletRequest

-

响应 (response)

ServletResponse

-

上下文 (context)

ServletContext

-

应用 (application)

ServletContext

-

会话 (session)

getSession(false)

可能为空!参见 <1>

参数 (params)

一个 Map 对象

头 (headers)

一个 Map 对象

输出 (out)

response.getWriter()

参见 <2>

标准输出 (sout)

response.getOutputStream()

参见 <2>

html

new MarkupBuilder(out)

参见 <2>

json

new StreamingJsonBuilder(out)

参见 <2>

  1. 只有当已经存在会话对象时,才会设置会话变量。请参阅上面示例中的 if (session == null) 检查。

  2. 这些变量不能在 Groovlet 内部重新赋值。它们在首次访问时绑定,例如允许在使用 out 之前调用 response 对象上的方法。

2. 设置 Groovlet

将以下内容添加到你的 web.xml

<servlet>
    <servlet-name>Groovy</servlet-name>
    <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Groovy</servlet-name>
    <url-pattern>*.groovy</url-pattern>
</servlet-mapping>

然后将所需的 groovy jar 文件放入 WEB-INF/lib

现在将 .groovy 文件放入,例如,根目录(即你放置 html 文件的地方)。GroovyServlet 负责编译 .groovy 文件。

因此,例如使用 tomcat,你可以这样编辑 tomcat/conf/server.xml

<Context path="/groovy" docBase="c:/groovy-servlet"/>

然后通过 https://:8080/groovy/hello.groovy 访问它