一個有彈性的和動態的開發環境正在受到前所未有的關注,甚至連腳本語言也顯現出這方面的特性,這也正是我們所需要的,也就是說,我們永遠需要建立易維護,並且可滿足我們需求的應用程序。如果我們要想使用腳本語言參與進來,我們應該考慮一下Java SE 6所提供的一個新的腳本API:一個與語言無關的允許開發人員在Java代碼中使用腳本語言的框架。使用這套新API,我們不僅可以利用腳本語言的特性,而且還能使用很多和Java相關器工具。
在本文中,我們提供了一個實例,這個實例將盡可能體現這套API的特性。並且使用這套API實現一個基於Model View Controller(MVC)模式的Web應用程序,這個程序同時還使用了Groovy框架(一個基於Java平台的動態腳本語言,Groovy負責實現商業邏輯,也就是MVC中的M層)。並且使用了不同的技術來實現MVC中的View層。對於控制層(Controller)層來說,我們使用WebLEAF,這是一個用於開發基於MVC模式的Web程序的開源框架。為了使這個例子更容易部署和運行,我們使用了一個基於Java的數據庫:HSQLDB,這個數據庫允許的們只通過兩個文本文件來創建一個簡單的數據庫。為了實現可以產生HTML用戶接口的view層,在本文中我們采用了XSLT技術,這是一種可以將XML文檔轉換成另外一種形式的語言,同時還使用了FreeMarker,這是一個流行的處理XML的模板引擎,如它可以使XML作為輸入數據變得很容易。
在本文的例子中我們將首先開發一個web頁,它將顯示數據庫的不同項,並允許我們選擇一個,以便我們可以查看某項的詳細信息。雖然這個程序很簡單,但它足以清楚地表述本文要講的內容了。
一、進行准備工作
第一步是建立健全個基本的標准Web應用程序結構,並且將最新的WebLEAF 3.x庫加進來,這個版本可以非常好地支持新的Java腳本API,我們可按如下的五步進行:
1. 首先建立一個叫Test的目錄。
2. 然後在Test目錄中建立一個WEB-INF目錄。
3. 在WEB-INF目錄中建立兩個目錄:lib和classes。
4. 將開載的WebLEAF3.jar文件放到Test\WEB-INF\lib中。
5. 然後在Test\WEB-INF中建立一個標准化sevlet描述文件web.xml,它的內容如下:
<?xml version="1.0"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<!--
WebLEAF controller servlet configuration
-->
<servlet>
<servlet-name>WebLEAFController</servlet-name>
<servlet-class>org.leaf.LEAFManager</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- End controller servlet -->
</web-app>
這個配置文件告訴Servlet容器實例化一個WebLEAF控制Servlet,並當Context開始時啟動它。在這裡我們要注意一個的值是2,一會我們要解釋一下這個值為什麼不是1,而是2。
最後,我們需要在WEB-INF中建立一個WebLEAF配置文件test.leaf.conf,內容如下:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE WADSET SYSTEM "http://www.uib.es/leaf/LEAFwad.dtd">
<WADSET>
<WAD
NAME="Test"
INIT_MODE="INITS_ON_START_UP"
XML_ALLOW_SHOW="TRUE"
XSLT_NO_CACHE="TRUE"
>
</WAD>
</WADSET>
雖然上面的配置文件只是最小化配置,但它對於本文的例子已經足夠了。
二、建立數據庫
在這一節我們來為本文的例子建立一個數據庫。按著我們上面所說的,將使用HSQLDB數據庫,第一步是下載HSQLDB JDBC驅動,本文使用的是1.8.0版本,將其解壓後的jar文件復制到Test\WEB-INF\lib中。
然後,我們需要建立一個test數據庫,並向數據庫中加入一些模擬數據。因此,我們在WEB-INF中建立一個db目錄,並在這個目錄中放兩個文件。第一個文件叫Test.properties,它的內容如下:
#HSQL Database Engine
#Fri Apr 20 18:52:47 CEST 2007
hsqldb.script_format=0
runtime.gc_interval=0
sql.enforce_strict_size=false
hsqldb.cache_size_scale=10
readonly=false
hsqldb.nio_data_file=true
hsqldb.cache_scale=14
version=1.8.0
hsqldb.default_table_type=memory
hsqldb.cache_file_scale=1
sql.compare_in_locale=false
hsqldb.log_size=200
modified=no
hsqldb.cache_version=1.7.0
hsqldb.original_version=1.7.1
hsqldb.compatible_version=1.8.0
第二個文件叫Test.script,它的內容如下:
CREATE SCHEMA PUBLIC AUTHORIZATION DBA
CREATE MEMORY TABLE TTST_ITEM(ITE_CODE CHAR(32) NOT NULL PRIMARY KEY,
ITE_NAME VARCHAR(100) NOT NULL,ITE_DESCRIPTION VARCHAR(300))
CREATE USER SA PASSWORD ""
GRANT DBA TO SA
SET WRITE_DELAY 60
SET SCHEMA PUBLIC
INSERT INTO TTST_ITEM VALUES(
'06e8da2682ce842b01a47de7823ec779','Parents','Links for parents')
INSERT INTO TTST_ITEM VALUES(
'1ab94df54312961a015749157fe05097','Web related','Item description')
INSERT INTO TTST_ITEM VALUES(
'1acc5e9d4312961a0157491547be91fa','Source control','That must be about source')
INSERT INTO TTST_ITEM VALUES(
'1ad80b204312961a015749159fe5205a','JBuilder Plugins','Plugin? What's that')
在使用時應注意,HSQLDB驅動只有在發布時還使用完全路徑,我們將使用WebLEAF中的AutoConfigurer Servlet來自動配置路徑。為了達到這個目的,我們在classes中建立一個webapp.properties文件,這個文件只有簡單的一行,內容如下:
db.location=REAL_PATH/WEB-INF/db
我們還需要在web.xml中加入Autoconfigurer Sevvlet,內容如下:
<?xml version="1.0"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<!--
Autoconfiguration servlet
-->
<servlet>
<servlet-name>AutoConfigurer</servlet-name>
<servlet-class>org.leaf.util.AutoConfigurer</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>FILE_NAME.1</param-name>
<param-value>WEB-INF/classes/webapp.properties</param-value>
</init-param>
<init-param>
<param-name>NODES_NAME.1</param-name>
<param-value>db.location</param-value>
</init-param>
<init-param>
<param-name>PATTERN.1</param-name>
<param-value>(.*)/WEB-INF/(.*)</param-value>
</init-param>
<init-param>
<param-name>FORMAT.1</param-name>
<param-value>{0}WEB-INF/{1}</param-value>
</init-param>
</servlet>
<!-- End Autoconfiguration servlet -->
<!--
WebLEAF controller servlet configuration
-->
<servlet>
<servlet-name>WebLEAFController</servlet-name>
<servlet-class>org.leaf.LEAFManager</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- End controller servlet -->
</web-app>
上面的培植告訴Autoconfigurer Servlet檢查webapp.properties文件和驗證db.location屬性是否指向了正確的路徑。而且Autoconfigurer Servlet首先被裝載,而且是在WebLEAF Controller Servlet之前,這應該感謝load-on-startup的功勞(值小的先裝載,值大的後裝載)。這將保證Autoconfigurer Servlet在WebLEAF Controller Servlet(LEAFManager)訪問數據庫之前驗證db.location屬性是否正確。