六、 JavaBean
JSP網頁吸引人的地方之一就是能結合JavaBean技術來擴充網頁中程序的功能。
JavaBean是一種Java類 (class),通過封裝屬性和方法成為具有某種功能或者處理某個業務的對象。JavaBean被組織成為package(數據包)以便進行管理,實際上就是把一組JavaBean一起放在某某目錄中,每個類的定義前加上package某某,本例中為test。目錄test必須放在系統環境CLASSPATH包含的目錄下,系統才能找到其中的JavaBean。JSWDK在缺省狀態下將\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\ 加入CLASSPATH。建立自己的JavaBean和package時,就放在這個目錄中也不失為一種簡易的方法。
下面介紹一個簡單的JavaBean框架。用文本編輯器創建一個文本文件helloWorld.java,并保存在\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\test目錄下,其內容如下:
package test; public class helloWorld { public String name = "My first bean"; public String getHi() { return "Hello from " + name; } }
helloWorld.java編輯好后,在DOS狀態下,進入目錄\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\,用JDK的javac命令編譯helloWorld.java如下:
javac helloWorld.java
注意,Java是區分大小寫的,在程序中,編譯命令行中字母的大小寫都不能寫錯。
編譯成功就表示建立了一個JavaBean。下面看如何在JSP中使用這個JavaBean。用文本編輯器創建一個文本文件hi-bean.jsp,并保存在\jswdk-1.0.1\webpages\test目錄下,其內容如下:
<html> <head> <title>JavaBean 試驗</title> </head> <body> <jsp:useBean id="helloBean" scope="session" class="test.helloWorld" /> <%= helloBean.getHi() %> <hr> <% helloBean.name = "JSP"; out.print(helloBean.getHi()); %> </body> </html>
在JSP網頁中,使用 <jsp:useBean ... />語法來創建JavaBean對象,并命名為helloBean。讀者可從這個簡單的例子中看出設置、獲取JavaBean屬性,以及調用JavaBean方法的做法。在瀏覽器的地址欄中鍵入http://localhost:8080/test/hi-bean.jsp,得到結果如圖3所示。
注意,如果修改和重新編譯了JavaBean程序,則需要關閉和重新啟動JSWDK的Web服務器以后修改的結果才會有效。如果僅僅修改JSP文件,則不用重新啟動JSWDK的Web服務器.
雖然,這僅僅完成了一個非常簡單的JavaBean框架,但是遵循這個框架可以設計出多種多樣的JavaBean。例如,從JSP中訪問數據通常就是通過JavaBean來實現的。
七、 數據庫連接
數據庫連接對動態網站來說是最為重要的部分,Java中連接數據庫的技術是JDBC(Java Database Connectivity)。很多數據庫系統帶有JDBC驅動程序,Java程序就通過JDBC驅動程序與數據庫相連,執行查詢、提取數據等等操作。Sun公司還開發了JDBC-ODBC bridge,用此技術Java程序就可以訪問帶有ODBC驅動程序的數據庫,目前大多數數據庫系統都帶有ODBC驅動程序,所以Java程序能訪問諸如Oracle、Sybase、MS SQL Server和MS Access等數據庫。下面介紹如何用Access實現一個動態FAQ(常見問題及答案)網站。
首先建立一個Access數據庫faq.mdb,其中的表faqs有字段id(自動增量型,并設為主關鍵字)、subject(文字型,長度200)、answers(備注型)。這個表中可以存放一些編程知識的常見問題及答案。
然后,在Control Panel(控制面板)的ODBC Datasource模塊中加入System DSN,取名faq,并指向faq.mdb。
創建一個JavaBean,名為faq.java,并保存在\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\test目錄下。faq.java 的內容如下:
package test; import java.sql.*;
public class faq { String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; String sConnStr = "jdbc:odbc:faq"; Connection conn = null; ResultSet rs = null;
public faq() { try { Class.forName(sDBDriver); } catch(java.lang.ClassNotFoundException e) { System.err.println("faq(): " + e.getMessage()); } }
public ResultSet executeQuery(String sql) { rs = null; try { conn = DriverManager.getConnection(sConnStr); Statement stmt = conn.createStatement(); rs = stmt.executeQuery(sql); } catch(SQLException ex) { System.err.println("aq.executeQuery: " + ex.getMessage()); } return rs; } }
用上一節介紹的方法編譯faq.java以后,在\jswdk-1.0.1\webpages\test目錄下創建JSP文件faq.jsp,其內容如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>我的FAQ !</title> </head> <body> <p><b>這是我的FAQ!</b></p> <%@ page language="java" import="java.sql.*" %> <jsp:useBean id="workM" scope="page" class="test.faq" /> <% ResultSet RS = workM.executeQuery("SELECT * FROM faqs"); String tt; while (RS.next()) { tt = RS.getString("Answer"); out.print("<LI>" + RS.getString("Subject") + "</LI>"); out.print("<pre>" + tt + "</pre>"); } RS.close(); %>
在瀏覽器的地址欄中鍵入http://localhost:8080/test/faq.jsp,faq.jsp調用JavaBean,從數據庫中讀出內容并輸出。
限于篇幅,本文不能列舉JSP-JavaBean-JDBC/ODBC-數據庫的復雜例子,讀者可以從本文最后所推薦的網址中找到并下載到數據庫連接范例。
|