Google App Engine (GAE) 提供免費配額(500MB 儲存、月均 500 萬頁面瀏覽),但犧牲部分靈活性(不支持所有核心 Java 庫)。開源社群迅速推出適配框架,Gaelyk 即是典型代表——專為 Groovy 打造的輕量 MVC 框架,注入易用性 API,配合 Eclipse 插件實現極速開發部署。
war/WEB-INF/lib<static-files>
<exclude path="/WEB-INF/**.groovy" />
<exclude path="**.gtpl" />
</static-files>
防止 GAE 靜態服務 Groovy 模板文件(.gtpl),由 Gaelyk 處理。
<servlet>
<servlet-name>GroovletServlet</servlet-name>
<servlet-class>groovyx.gaelyk.GaelykServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>TemplateServlet</servlet-name>
<servlet-class>groovyx.gaelyk.GaelykTemplateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GroovletServlet</servlet-name>
<url-pattern>*.groovy</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>TemplateServlet</servlet-name>
<url-pattern>*.gtpl</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.gtpl</welcome-file>
</welcome-file-list>
def formatter = new SimpleDateFormat("MM/dd/yyyy")
def offensedate = formatter.parse("${params.of_month}/${params.of_day}/${params.of_year}")
def ticket = new Entity("ticket")
ticket.officer = params.officer
ticket.license = params.plate
ticket.issuseDate = offensedate
ticket.location = params.location
ticket.notes = params.notes
ticket.offense = params.offense
ticket.save()
redirect "viewticket.groovy?id=${ticket.key.id}"
Gaelyk 增強 Entity,動態屬性賦值極簡潔。
import com.google.appengine.api.datastore.Query
import static com.google.appengine.api.datastore.FetchOptions.Builder.withLimit
def query = new Query("ticket")
query.addSort("issuseDate", Query.SortDirection.DESCENDING)
def tickets = datastoreService.prepare(query).asList(withLimit(10))
request.setAttribute("tickets", tickets)
forward "index.gtpl"
.gtpl 支援 include、Groovy 腳本塊,類似 JSP 但更強大:
<% include "/WEB-INF/includes/header.gtpl" %>
<% def ticket = request.getAttribute("ticket") %>
<table>
<tr><td>${ticket.officer}</td>...</tr>
</table>
<% include "/WEB-INF/includes/footer.gtpl" %>
Eclipse 插件一鍵 Deploy,Google 自動處理基礎設施。Gaelyk 讓雲端開發如本地般輕鬆,免費額度足夠中小流量應用。