420 likes | 562 Views
第 10 章 Servlet、過濾器與JavaBeans. 10-1 Java 的類別與物件 10-2 建立 Java Servlet 10-3 Servlet 過濾器( Servlet Filter ) 10-4 建立 JavaBeans 10-5 在 JSP 程式使用 JavaBeans. 10-1 Java的類別與物件. 10-1-1 Java 的類別與物件 10-1-2 類別的繼承. 10-1-1 Java 的類別與物件 - 說明. Java 類別宣告是物件的原型宣告,對於物件原型宣告的類別可以分為 2 個部分,如下所示:
E N D
第10章 Servlet、過濾器與JavaBeans • 10-1 Java的類別與物件 • 10-2 建立Java Servlet • 10-3 Servlet過濾器(Servlet Filter) • 10-4 建立JavaBeans • 10-5 在JSP程式使用JavaBeans
10-1 Java的類別與物件 • 10-1-1 Java的類別與物件 • 10-1-2 類別的繼承
10-1-1 Java的類別與物件-說明 • Java類別宣告是物件的原型宣告,對於物件原型宣告的類別可以分為2個部分,如下所示: • 成員資料(Data Member):物件的資料部分,屬於基本資料型態的變數、常數或其它的物件的「成員變數」(Member Variables)。 • 成員方法(Method Member):物件的操作部分,即程式與函數。 • 物件使用變數儲存狀態稱為「屬性」(Property)或「實例變數」(Instance Variables,也稱為副本變數),各種行為的程序和函數,在Java稱為方法(Methods)。
10-1-1 Java的類別與物件-宣告類別 • 客戶資料Customer類別的宣告,如下所示: class Customer { private String name; private String address; public int age; public Customer(String name, String a) { this.name = name; address = a; } public String getName(){ return name; } public String getAddress(){ return address; } }
10-1-1 Java的類別與物件-建構子 • 在類別中與類別同名的方法是建構子,這是物件的初始方法,程式碼的撰寫方式和其它成員方法相同,類別呼叫此方法來建立物件和指定初值。類別的建構子擁有一些特點,如下所示: • 建構子與類別同名,例如:類別Customer的建構子方法是Customer()。 • 建構子沒有傳回值,不過也不用指明void。 • 建構子支援方法的「過載」(Overload),簡單的說,就是擁有多個同名的建構子,只需擁有不同的參數型態和個數。
10-1-1 Java的類別與物件-宣告物件變數 • 在Java程式宣告類別後,就可以將類別當作資料型態,使用資料型態宣告物件變數,如下所示: Customer joe;
10-1-1 Java的類別與物件-建立物件實例 • 在Java語言建立物件是使用new運算子,這個指令可以依照類別範本建立物件,然後傳回指向此物件的參考指標,這個過程稱為「實體化」(Instantiation),將類別實體化成物件實例,如下所示: joe = new Customer("陳會安","台北縣");
10-1-1 Java的類別與物件-存取物件變數與方法 • 在建立好物件後,就可以存取物件的變數與呼叫方法,以Customer類別建立的joe物件為例,如下所示: out.println("姓名: "+joe.getName()+"<br>"); out.println("地址: "+ joe.getAddress()+"<br>"); out.println("年齡: " + joe.age + "<br>");
10-1-2 類別的繼承-說明 • 「繼承」(Inheritance)是物件導向程式設計的重要觀念,繼承是宣告的類別繼承現存類別的部分或全部的成員資料和方法、新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法或資料。
10-1-2 類別的繼承-父類別 • 在Java程式宣告繼承類別前,需要先有一個父類別來繼承,例如:父類別Vehicle定義車輛的基本資料,其類別宣告如下所示: class Vehicle { private string name; private double price; public Vehicle(String name, double price) { … } public String getVehicleInfo() { … } }
10-1-2 類別的繼承-子類別 • 現在我們可以宣告類別繼承存在的Vehicle類別,例如:轎車Car類別的宣告,如下所示: class Car extends Vehicle { private int doors; public Car(String name, double price, int doors) { … } public String getCarInfo() { … } }
10-2 建立Java Servlet • 10-2-1 第一個Java Servlet程式 • 10-2-2 Java Servlet的執行過程 • 10-2-3 Java Servlet的同步處理
10-2-1 第一個Java Servlet程式-範例 package Ch10; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Ch10_2_1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=Big5"); request.setCharacterEncoding("Big5"); PrintWriter out = response.getWriter(); out.println("<html>"); ………… out.println("</body></html>"); } }
10-2-1 第一個Java Servlet程式-範例說明 • 在doGet()方法需要處理ServletException的例外處理(IOException是因為使用Java I/O串流),傳入2個介面物件HttpServletRequest和HttpServletResponse,其說明如下所示: • HttpServletRequest:客戶端到伺服端請求的介面物件,如果有表單欄位送出資料,就是使用此物件讀取。 • HttpServletResponse:伺服端回應到客戶端的介面物件,通常是用來回應輸出結果的HTML文件。
10-2-1 第一個Java Servlet程式-執行Servlet • 在JSP容器執行Java Servlet需要在web.xml檔案定義<servlet>和<servlet-mapp>標籤,如下所示: <servlet> <servlet-name>hello</servlet-name> <servlet-class>Ch10.Ch10_2_1</servlet-class> </servlet> <servlet-mapping> <url-pattern>Ch10_2_1</url-pattern> <servlet-name>hello</servlet-name> </servlet-mapping>
10-2-2 Java Servlet的執行過程 • Java Servlet執行是Web伺服器的Servlet容器控制。執行過程的相關方法說明,如下表所示:
10-2-3 Java Servlet的同步處理-說明 • Java Servlet支援多執行緒,在伺服器載入單一Servlet物件就可以回應多位使用者的HTTP請求,換句話說,Servlet程式需要考量同步問題,以避免2或多位使用者同時存取實例變數、方法或Servlet造成的資料存取錯誤。
10-2-3 Java Servlet的同步處理-同步程式區塊 • 同步程式區塊(A Block of Synchronized Code)可以避免多位使用者同時存取實例變數,例如:網頁訪客計數的pageCount變數,如下所示: synchronized(this) { pageCount++; } • 上述程式碼使用synchronized關鍵字同步實例變數pageCount的存取,在同一時間只允許一位使用者將pageCount變數加一。
10-2-3 Java Servlet的同步處理-同步方法 • 同步方法(A Synchronized Method)是同步一整個方法,例如:同一時間只允許一位使用者新增資料庫的圖書記錄資料,所以addBook()方法就是一個同步方法,如下所示: public static synchronized int addBook() throws SQLException { ……… }
10-2-3 Java Servlet的同步處理-單執行緒的Servlet • 單執行緒的Servlet(A Servlet of Single Thread Model)只需實作SingleThreadModel介面,就成為單執行緒的Servlet,如下所示: public class Ch10_2_3 extends HttpServlet implements SingleThreadModel { ……… }
10-3 Servlet過濾器(Servlet Filter) • 10-3-1 Servlet過濾器的基礎 • 10-3-2 <filter>和<filter-mapping> 標籤定義過濾器 • 10-3-3 建立Servlet過濾器
10-3-1 Servlet過濾器的基礎-說明 • Servlet過濾器(Servlet Filter)是Servlet 2.3 API新增的功能,它不是Servlet,而是一種能夠轉換HTTP請求或修改HTTP回應的物件。 • Servlet過濾器(Servlet Filter)是一種Web應用程式的強大工具,它是一個Java類別,可以在客戶端請求真正存取Web應用程式資源前,攔截客戶端請求來進行額外處理;或當Web應用程式回應訊息送回客戶端前,中途攔截回應訊息進行一些額外的處理。
10-3-2 <filter>和<filter-mapping>標籤定義過濾器-<filter>標籤 • <filter>標籤定義Servlet過濾器的別名、類別和傳入參數,作為<filter-mapping>標籤對應的Servlet過濾器資訊,例如:在web.xml檔案的<filter>標籤如下所示: <filter> <filter-name>characterEncoding</filter-name> <filter-class>Ch10.Ch10_3_3</filter-class> <init-param> <param-name>encoding</param-name> <param-value>Big5</param-value> </init-param> </filter>
10-3-2 <filter>和<filter-mapping>標籤定義過濾器-<filter-mapping>標籤 • <filter-mapping>標籤可以將URL網址對應到<filter>標籤定義的Servlet過濾器,也就是說,定義哪些URL網址需要使用<filter>標籤定義的Servlet過濾器,例如:定義Servlet過濾器使用範圍的<filter-mapping>標籤,如下所示: <filter-mapping> <url-pattern>/*</url-pattern> <filter-name>characterEncoding</filter-name> </filter-mapping>
10-3-3 建立Servlet過濾器-步驟 • 在JSP容器的Web應用程式建立Servlet過濾器的步驟,如下所示: • Step 1:建立Java類別檔案,這是一個實作Filter介面的類別檔。 • Step 2:在web.xml檔案使用<filter>標籤定義Servlet過濾器。 • Step 3:在web.xml檔案使用<filter-mappint>標籤定義哪些URL網址需要使用過濾器。
10-3-3 建立Servlet過濾器-說明 • Servlet過濾器是一個實作Filter介面的Java類別,Java的介面(Interface)是在類別繼承架構中,用來定義類別行為,內含常數和方法宣告,但是並沒有實作程式碼。 • Java類別是使用implements關鍵字實作介面,如果實作的介面不只一個,請使用","逗號分隔,而且實作介面的類別需要實作所有介面方法。
10-3-3 建立Servlet過濾器-範例 • 例如:Servlet過濾器的Ch10_3_3類別,如下所示: package Ch10; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Ch10_3_3 implements Filter { ……….. public void init(FilterConfig config) { …… } public void destroy() { …… } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { …… } }
10-4 建立JavaBeans • 10-4-1 JavaBeans的基礎 • 10-4-2 建立JavaBeans
10-4-1 JavaBeans的基礎-說明 • JavaBeans的目的是建立重複使用的軟體元件,可以使用在「視覺化開發工具」(Visual Builder Tool, VBT),讓開發工具直接將現成的JavaBean元件新增到其它的Java應用程式。 • JavaBeans API的java.beans.*套件可以讓Java語言開發可重複使用的元件。事實上,Java類別只需實作java.io.Serializable介面,即可以建立JavaBeans 。
10-4-1 JavaBeans的基礎-架構 package Ch10; import java.io.Serializable; public class Ch10_4_2 implements Serializable { private String username; …………… public Ch10_4_2() { …… } public void setUsername(String name) { username = name; } public String getUsername() { return username; } …………… }
10-4-1 JavaBeans的基礎-架構說明 • JavaBeans的屬性(Properties)是JavaBeans類別的成員變數,不過並不是直接將它宣告成public,而是需要透過一組setXXX()和getXXX()方法來存取,其特性如下所示: • 屬性可為讀/寫、唯讀和唯寫。 • 屬性為簡單屬性(Simple Properties)或索引屬性(Indexed Properties)。
10-4-2 建立JavaBeans-簡單屬性 • 簡單屬性使用setXXX()設定和getXXX()方法取得成員變數值,例如:定義JavaBean的usrname屬性,如下所示: public void setUsername(String name) { username = name; } public String getUsername() { return username; }
10-4-2 建立JavaBeans-索引屬性 • 索引屬性代表陣列內容的成員變數,換句話說,這是一組資料的屬性,其定義方法和簡單屬性並沒有什麼不同,只是設定和取得的內容是陣列物件,例如:定義JavaBean的languages屬性,如下所示: public String[] getLanguages() { return items; } public void setLanguages(String[] value) { items = value; }
10-5 在JSP程式使用JavaBeans • 10-5-1 在JSP程式使用JavaBean • 10-5-2 使用Introspection機制設定 JavaBean屬性值 • 10-5-3 JavaBean的物件範圍 • 10-5-4 刪除JavaBean
10-5-1 在JSP程式使用JavaBean-建立JavaBean物件 • 在JSP程式宣告和初始化JavaBean類別是使用<jsp:useBean>動作元素,簡單的說,就是建立JavaBean物件,如下所示: <jsp:useBean id="user" class="Ch10.Ch10_4_2" scope="page"/> • 上述屬性id是參考JavaBean的變數名稱,class屬性指定JavaBean的完整套件名稱Ch10.Ch10_4_2,這就是第10-4-2節建立的JavaBean。
10-5-1 在JSP程式使用JavaBean-存取簡單屬性 • 在JSP程式存取簡單屬性是使用<jsp:setProperty>和<jsp:getProperty>動作元素,首先指定JavaBean的username屬性值,如下所示: <jsp:setProperty name="user" property="username" value="陳會安"/> • 在JSP程式取得JavaBean屬性值是使用<jsp:getProperty>動作元素,如下所示: <jsp:getProperty name="user" property="username"/>
10-5-1 在JSP程式使用JavaBean-存取索引屬性 • JavaBean的索引屬性值是一種陣列物件,我們可以使用JSTL的<c:set>標籤來指定屬性值,如下所示: <c:set target="${user}" property="languages" value="${langs}"/> • 取出索引屬性值也可以使用JSTL的<c:forEach>標籤,如下所示: <c:forEach var="item" items="${user.languages}"> [<c:out value="${item}"/>] </c:forEach>
10-5-2 使用Introspection機制設定JavaBean屬性值-建立 • 在JSP程式建立JavaBean後,我們可以使用Introspection機制設定JavaBean屬性,如下所示: <jsp:useBean id="user“ class="Ch10.Ch10_4_2" scope="session"/> <jsp:setProperty name="user" property="*"/> • 上述<jsp:useBean>標籤建立Session範圍的JavaBean物件,<jsp:setProperty>標籤的property屬性為"*",表示使用Introspection機制設定JavaBean屬性值。
10-5-2 使用Introspection機制設定JavaBean屬性值-說明 • Introspection機制可以直接將HTTP請求的URL參數或表單欄位內容,自動指定成同名JavaBean屬性的值,並且自行處理型態轉換。 • 如果只有特定屬性需要使用Introspection機制,就可以在property屬性指定JavaBean的屬性名稱,如下所示: <jsp:setProperty name="user" property="username"/> • 若屬性名稱和參數名稱不同,我們可以使用param屬性指定對應的參數名稱,如下所示: <jsp:setProperty name="user" property="username" param="name"/>
10-5-3 JavaBean的物件範圍 • 在JSP程式載入每一個JavaBean時,可以指定scope屬性的物件範圍,JavaBeans的物件範圍說明,如下所示: • Page範圍:JavaBean將會在目前JSP程式建立和刪除,這是<jsp:useBean>動作元素的預設範圍。 • Request範圍:JavaBean物件可以隨著HTTP請求從一頁JSP程式到另一個JSP程式。 • Session範圍:JavaBean物件只需屬於同一個交談期(Session)生命周期的JSP程式都可以存取。 • Application範圍:JavaBean物件只需屬於同一個Web應用程式生命周期,直到卸除Web應用程式或JSP容器關機前的JSP程式都可以存取。
10-5-4 刪除JavaBean • 在JSP程式載入JavaBean後,如果需要刪除JavaBean,可以使用pageContext隱含物件的removeAttribute()方法,如下所示: <% pageContext.removeAttribute("user"); %> • 上述程式碼刪除名為user的變數,也就是名為user的JavaBean。JSTL是使用<c:remove>標籤來刪除JavaBean,如下所示: <c:remove var="user1" scope="session"/>