本文參考自Servlet support酷含,大部分代碼引用了原文檔。
快速開(kāi)始
Groovy語(yǔ)言提供了一個(gè)模塊,可以讓我們寫(xiě)用Groovy腳本的方式來(lái)編寫(xiě)Servlet创泄,這叫做Groovlets知染。先看看一個(gè)簡(jiǎn)單的例子吧肋僧。下面這幾個(gè)例子都來(lái)自官方文檔。
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的標(biāo)記模板引擎。不太了解的可以看看我的文章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
當(dāng)然了,還需要配置Servlet來(lái)處理這些Groovlets辫诅。這些Groovlets要放在原來(lái)JSP放的位置凭戴,也就是項(xiàng)目的WEB根目錄下。如果放到源代碼目錄下就錯(cuò)了炕矮。
<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中預(yù)定義了幾個(gè)變量么夫,讓我們能方便的使用。
- request
- response
- context
- application肤视,以上幾個(gè)和JSP中的一樣档痪,直接用就行了
- session,該對(duì)象可能為空钢颂,只有當(dāng)你向session放東西之后它才不為空钞它,不然就要像官方的例子那樣先判斷是不是空,然后手動(dòng)創(chuàng)建一個(gè)session
- params
- headers殊鞭,和上面的params一樣遭垛,都是Map類型
- out,相當(dāng)于
response.getWriter()
- sout 操灿,相當(dāng)于
response.getOutputStream()
- html锯仪,Groovy的標(biāo)記模板,相當(dāng)于
new MarkupBuilder(out)
- json趾盐,輸出json的庶喜,相當(dāng)于
new StreamingJsonBuilder(out)
我的小例子
本來(lái)最后想用Groovlets寫(xiě)點(diǎn)東西,結(jié)果發(fā)現(xiàn)它的語(yǔ)法雖然挺好用救鲤,但是視圖部分有點(diǎn)坑久窟。我用標(biāo)記模板想迭代一個(gè)表格,結(jié)果顯示無(wú)法在空對(duì)象上使用屬性本缠,查了半天沒(méi)找到解決辦法斥扛。所以只好寫(xiě)這么一個(gè)小例子,例子很簡(jiǎn)單丹锹,輸入一個(gè)名稱給服務(wù)器稀颁,然后返回問(wèn)候。
def name = params['name'] ?: '易天'
html.html {
head {
title('主頁(yè)')
link(rel: 'stylesheet', src: 'site.css')
}
body {
h1 "${name} 你好"
form(method: 'get', action: 'index.groovy') {
label(for: 'name', value: '請(qǐng)輸入名稱')
input(id: 'name', type: 'text', name: 'name')
input(type: 'submit', value: '提交')
}
}
}