3.實現中間層
下面以BookServlet為例,說明如何實現中間層的Servlet。
(1)初始化Servlet
public class BookServlet extends HttpServlet {
protected Connection dbConnection;
protected PrepareStatement readQuery;
protected PrepareStatement writeQuery;
protected String dbName=″jdbc:odbc:BookDatabase″;
protected String bookName;
protected String bookISBN;
public void init(ServletConfig config) throws ServletExecption
{
try {
Class.forName(″sun.jdbc.odbc.JdbcOdbcDriver″);
dbConnection=DriverManager.getConnection(dbName,″″,″″);
}
catch(Exception e)
{
System.out.println(″Can not initialize database″);
}
}
Servlet的init()函數在Servlet被初次激活時進行調用,對於BookServlet,在init()中我們創建其與圖書數據庫的連接(當然應該已經在ODBC中定義BookDatabase),這裡使用的是Java JDBC API中的Connection對象。
(2)實現service()操作
當客戶端向Servlet進行請求時,Servlet的service()函數被調用,在service()中我們應該實現中間層的所有功能。
public void service(HttpServletRequest request,HttpServletResponse reponse)
throws ServletException,IOException
{
bookName=request.getParameter(″BookName″);
bookISBN=request.getParameter(″BookISBN″);
if (bookName==null && bookISBN==null)
doQueryBook(request,reponse);
else doNewBook(request,reponse);
}
首先,我們通過參數HttpServletRequest取得客戶端的輸入參數,這些參數是用戶在HTML頁面中的編輯框中輸入的,然後我們根據用戶的需要進行庫查詢或庫更新的操作。
◆查詢數據庫信息並向浏覽器返回結果頁面
查詢數據庫信息首先應該根據查詢條件,構建一個SQL語句(本例僅簡單地返回所有記錄),然後設置PrepaerStatement對象,通過運行其executeQuery()向後台數據庫服務器請求結果。取得查詢結果後,Servlet通過HTTPServletResponse生成一個結果HTML頁面返回給浏覽器。
public void doQueryBook(HttpServletRequest request,HttpServletResponse reponse)
{
try {
readQuery=dbConnection.prepareStatement(
″SELECTFROM BOOKTABLE″);
String htmlHead=″〈html〉〈head〉〈title〉查詢結果〈/title〉〈/head〉
″;
String htmlBody=″〈body〉″+;
ResultSet readResult=readQuery.executeQuery();
while(readSet.next())
{
String Name=readResult.getString(″BookName″);
String ISBN=readResult.getString(″ISBN″);
htmlBody+=Name+″ ″+ISBN+″
″;
}
htmlBody+=″〈/body〉″+〈/html〉″
PrintWriter output=new PrinterWrite(response.getOutputStream());
response.setContentType(″text/html″);
output.println(htmlHead+htmlBody+htmlTail);
}
catch(Exception e)
{ … … … }
}
◆將數據寫入數據庫
將數據寫入數據庫的過程與查詢類似,也是先構建一個SQL語句,對於本例來說,其寫入的SQL語句為:
String writeSql=″INSERT INTO BookTable (BookName,ISBN) Values(″+bookName+″,″+bookISBN+″)″;
然後調用PrepareStatement::executeUpdate();
4.利用Servlet實現中間層的進一步討論
通過上面的圖書管理的例子,可以看出利用Servlet技術實現中間層是十分方便的,其操作過程類似於CGI編寫的中間層。但由於Servlet是基於線程的,而且不會在每個用戶進行請求時創建一個獨立的進程完成操作(CGI是通過創建進程進行操作的),因此其性能優於CGI。同時,由於Servlet是用Java語言進行編寫的,因此其可移植性、代碼重用性也超過CGI。此外,Servlet還可利用Sockets與其他的Servlet或Applet進行通訊,因此可以實現更為復雜的Web應用.