top
Loading...
利用Servlet開發企業級三層Web應用(二)

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(

″SELECTFROM 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應用,如下圖所示。

java110_1.jpg (7191 字節)

北斗有巢氏 有巢氏北斗