本文參考自 Servlet support ,大部分代碼引用了原文檔。
快速開始
Groovy語言提供了一個子產品,可以讓我們寫用Groovy腳本的方式來編寫Servlet,這叫做Groovlets。先看看一個簡單的例子吧。下面這幾個例子都來自官方文檔。
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
也可以使用Groovy的标記模闆引擎。不太了解的可以看看我的文章
Groovy模闆引擎,或者直接看原文檔。
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
當然了,還需要配置Servlet來處理這些Groovlets。這些Groovlets要放在原來JSP放的位置,也就是項目的WEB根目錄下。如果放到源代碼目錄下就錯了。
<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>
在Groovlets中預定義了幾個變量,讓我們能友善的使用。
- request
- response
- context
- application,以上幾個和JSP中的一樣,直接用就行了
- session,該對象可能為空,隻有當你向session放東西之後它才不為空,不然就要像官方的例子那樣先判斷是不是空,然後手動建立一個session
- params
- headers,和上面的params一樣,都是Map類型
- out,相當于
response.getWriter()
- sout ,相當于
response.getOutputStream()
- html,Groovy的标記模闆,相當于
new MarkupBuilder(out)
- json,輸出json的,相當于
new StreamingJsonBuilder(out)
我的小例子
本來最後想用Groovlets寫點東西,結果發現它的文法雖然挺好用,但是視圖部分有點坑。我用标記模闆想疊代一個表格,結果顯示無法在空對象上使用屬性,查了半天沒找到解決辦法。是以隻好寫這麼一個小例子,例子很簡單,輸入一個名稱給伺服器,然後傳回問候。
def name = params['name'] ?: '易天'
html.html {
head {
title('首頁')
link(rel: 'stylesheet', src: 'site.css')
}
body {
h1 "${name} 你好"
form(method: 'get', action: 'index.groovy') {
label(for: 'name', value: '請輸入名稱')
input(id: 'name', type: 'text', name: 'name')
input(type: 'submit', value: '送出')
}
}
}