Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

可以在 Groovy 中写普通的 Java Servlets(也就是 Groovlets)。
有一个 GroovyServlet

这一特性会自动编译 .groovy 源文件成字节码,这个类会装载并缓存在虚拟机中,直到源文件改变。

下面是一个 Groovlet 的示例。
注意 session、output、request 这些内置变量的使用,另外因为没有 class 包裹着,它更像是一个脚本。

Code Block
java
java
if (!session) {
  session = request.getSession(true);
}

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

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

或者使用 MarkupBuilder 完成相同的功能:

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

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

html.html {    // html 隐式地绑定在 new MarkupBuilder(out)。
  head {
      title("Groovy Servlet")
  }
  body {
    p("Hello, ${request.remoteHost}: ${session.counter}! ${new Date()}")
  }
}
session.counter = session.counter + 1

内置变量

以下变量可以直接在 Groovlets 中使用:

变量名

绑定对象

说明

request

ServletRequest

-

response

ServletResponse

-

context

ServletContext

和 Struts 不同

application

ServletContext

和 Struts 不同

session

getSession(false)

可为空(null)! 参见 (star) A

params

 

Map 对象

headers

 

Map 对象

out

response.getWriter()

参见 (star) B

sout

response.getOutputStream()

参见 (star) B

html

new MarkupBuilder(out)

参见 (star) B

(star) A:如果 session 对象存在,就设置到变量中,如果不存在不会新建一个 session,所以它可能为空。(The session variable is only set, if there was already a session object.)可以像上面代码中那样通过 'if (session == null)' 检查是否为空。

(star) B:这个变量在 Groovlet 中不能被赋值。它们在第一次被访问时被绑定,例如允许在使用 'out' 之前调用 'response' 的方法。(They are bound on first access, allowing to e.g. calling methods on the 'response' object before using 'out'.)

配置 groovylets

将以下内容添加到 web.xml:

Code Block
xml
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.jarantlr.jarasm.jar,或者将 groovy-all-xyz.jar 复制到 WEB-INF/lib - 这基本上包含了 antlr 和 asm jar 包。
现在将 .groovy 文件放到所谓的根目录(也就是你放置 html 文件的地方)。groovy servlet 会编译 .groovy 文件的。

如果你使用 tomcat,可以这样修改 tomcat/conf/server.xml 文件:

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

通过 http://localhost:8080/groovy/hello.groovy 访问。