1 / 42

第 10 章 Servlet、過濾器與JavaBeans

第 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 個部分,如下所示:

Download Presentation

第 10 章 Servlet、過濾器與JavaBeans

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第10章 Servlet、過濾器與JavaBeans • 10-1 Java的類別與物件 • 10-2 建立Java Servlet • 10-3 Servlet過濾器(Servlet Filter) • 10-4 建立JavaBeans • 10-5 在JSP程式使用JavaBeans

  2. 10-1 Java的類別與物件 • 10-1-1 Java的類別與物件 • 10-1-2 類別的繼承

  3. 10-1-1 Java的類別與物件-說明 • Java類別宣告是物件的原型宣告,對於物件原型宣告的類別可以分為2個部分,如下所示: • 成員資料(Data Member):物件的資料部分,屬於基本資料型態的變數、常數或其它的物件的「成員變數」(Member Variables)。 • 成員方法(Method Member):物件的操作部分,即程式與函數。 • 物件使用變數儲存狀態稱為「屬性」(Property)或「實例變數」(Instance Variables,也稱為副本變數),各種行為的程序和函數,在Java稱為方法(Methods)。

  4. 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; } }

  5. 10-1-1 Java的類別與物件-建構子 • 在類別中與類別同名的方法是建構子,這是物件的初始方法,程式碼的撰寫方式和其它成員方法相同,類別呼叫此方法來建立物件和指定初值。類別的建構子擁有一些特點,如下所示: • 建構子與類別同名,例如:類別Customer的建構子方法是Customer()。 • 建構子沒有傳回值,不過也不用指明void。 • 建構子支援方法的「過載」(Overload),簡單的說,就是擁有多個同名的建構子,只需擁有不同的參數型態和個數。

  6. 10-1-1 Java的類別與物件-宣告物件變數 • 在Java程式宣告類別後,就可以將類別當作資料型態,使用資料型態宣告物件變數,如下所示: Customer joe;

  7. 10-1-1 Java的類別與物件-建立物件實例 • 在Java語言建立物件是使用new運算子,這個指令可以依照類別範本建立物件,然後傳回指向此物件的參考指標,這個過程稱為「實體化」(Instantiation),將類別實體化成物件實例,如下所示: joe = new Customer("陳會安","台北縣");

  8. 10-1-1 Java的類別與物件-存取物件變數與方法 • 在建立好物件後,就可以存取物件的變數與呼叫方法,以Customer類別建立的joe物件為例,如下所示: out.println("姓名: "+joe.getName()+"<br>"); out.println("地址: "+ joe.getAddress()+"<br>"); out.println("年齡: " + joe.age + "<br>");

  9. 10-1-2 類別的繼承-說明 • 「繼承」(Inheritance)是物件導向程式設計的重要觀念,繼承是宣告的類別繼承現存類別的部分或全部的成員資料和方法、新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法或資料。

  10. 10-1-2 類別的繼承-父類別 • 在Java程式宣告繼承類別前,需要先有一個父類別來繼承,例如:父類別Vehicle定義車輛的基本資料,其類別宣告如下所示: class Vehicle { private string name; private double price; public Vehicle(String name, double price) { … } public String getVehicleInfo() { … } }

  11. 10-1-2 類別的繼承-子類別 • 現在我們可以宣告類別繼承存在的Vehicle類別,例如:轎車Car類別的宣告,如下所示: class Car extends Vehicle { private int doors; public Car(String name, double price, int doors) { … } public String getCarInfo() { … } }

  12. 10-2 建立Java Servlet • 10-2-1 第一個Java Servlet程式 • 10-2-2 Java Servlet的執行過程 • 10-2-3 Java Servlet的同步處理

  13. 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>"); } }

  14. 10-2-1 第一個Java Servlet程式-範例說明 • 在doGet()方法需要處理ServletException的例外處理(IOException是因為使用Java I/O串流),傳入2個介面物件HttpServletRequest和HttpServletResponse,其說明如下所示: • HttpServletRequest:客戶端到伺服端請求的介面物件,如果有表單欄位送出資料,就是使用此物件讀取。 • HttpServletResponse:伺服端回應到客戶端的介面物件,通常是用來回應輸出結果的HTML文件。

  15. 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>

  16. 10-2-2 Java Servlet的執行過程 • Java Servlet執行是Web伺服器的Servlet容器控制。執行過程的相關方法說明,如下表所示:

  17. 10-2-3 Java Servlet的同步處理-說明 • Java Servlet支援多執行緒,在伺服器載入單一Servlet物件就可以回應多位使用者的HTTP請求,換句話說,Servlet程式需要考量同步問題,以避免2或多位使用者同時存取實例變數、方法或Servlet造成的資料存取錯誤。

  18. 10-2-3 Java Servlet的同步處理-同步程式區塊 • 同步程式區塊(A Block of Synchronized Code)可以避免多位使用者同時存取實例變數,例如:網頁訪客計數的pageCount變數,如下所示: synchronized(this) { pageCount++; } • 上述程式碼使用synchronized關鍵字同步實例變數pageCount的存取,在同一時間只允許一位使用者將pageCount變數加一。

  19. 10-2-3 Java Servlet的同步處理-同步方法 • 同步方法(A Synchronized Method)是同步一整個方法,例如:同一時間只允許一位使用者新增資料庫的圖書記錄資料,所以addBook()方法就是一個同步方法,如下所示: public static synchronized int addBook() throws SQLException { ……… }

  20. 10-2-3 Java Servlet的同步處理-單執行緒的Servlet • 單執行緒的Servlet(A Servlet of Single Thread Model)只需實作SingleThreadModel介面,就成為單執行緒的Servlet,如下所示: public class Ch10_2_3 extends HttpServlet implements SingleThreadModel { ……… }

  21. 10-3 Servlet過濾器(Servlet Filter) • 10-3-1 Servlet過濾器的基礎 • 10-3-2 <filter>和<filter-mapping> 標籤定義過濾器 • 10-3-3 建立Servlet過濾器

  22. 10-3-1 Servlet過濾器的基礎-說明 • Servlet過濾器(Servlet Filter)是Servlet 2.3 API新增的功能,它不是Servlet,而是一種能夠轉換HTTP請求或修改HTTP回應的物件。 • Servlet過濾器(Servlet Filter)是一種Web應用程式的強大工具,它是一個Java類別,可以在客戶端請求真正存取Web應用程式資源前,攔截客戶端請求來進行額外處理;或當Web應用程式回應訊息送回客戶端前,中途攔截回應訊息進行一些額外的處理。

  23. 10-3-1 Servlet過濾器的基礎-圖例

  24. 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>

  25. 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>

  26. 10-3-3 建立Servlet過濾器-步驟 • 在JSP容器的Web應用程式建立Servlet過濾器的步驟,如下所示: • Step 1:建立Java類別檔案,這是一個實作Filter介面的類別檔。 • Step 2:在web.xml檔案使用<filter>標籤定義Servlet過濾器。 • Step 3:在web.xml檔案使用<filter-mappint>標籤定義哪些URL網址需要使用過濾器。

  27. 10-3-3 建立Servlet過濾器-說明 • Servlet過濾器是一個實作Filter介面的Java類別,Java的介面(Interface)是在類別繼承架構中,用來定義類別行為,內含常數和方法宣告,但是並沒有實作程式碼。 • Java類別是使用implements關鍵字實作介面,如果實作的介面不只一個,請使用","逗號分隔,而且實作介面的類別需要實作所有介面方法。

  28. 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 { …… } }

  29. 10-4 建立JavaBeans • 10-4-1 JavaBeans的基礎 • 10-4-2 建立JavaBeans

  30. 10-4-1 JavaBeans的基礎-說明 • JavaBeans的目的是建立重複使用的軟體元件,可以使用在「視覺化開發工具」(Visual Builder Tool, VBT),讓開發工具直接將現成的JavaBean元件新增到其它的Java應用程式。 • JavaBeans API的java.beans.*套件可以讓Java語言開發可重複使用的元件。事實上,Java類別只需實作java.io.Serializable介面,即可以建立JavaBeans 。

  31. 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; } …………… }

  32. 10-4-1 JavaBeans的基礎-架構說明 • JavaBeans的屬性(Properties)是JavaBeans類別的成員變數,不過並不是直接將它宣告成public,而是需要透過一組setXXX()和getXXX()方法來存取,其特性如下所示: • 屬性可為讀/寫、唯讀和唯寫。 • 屬性為簡單屬性(Simple Properties)或索引屬性(Indexed Properties)。

  33. 10-4-2 建立JavaBeans-簡單屬性 • 簡單屬性使用setXXX()設定和getXXX()方法取得成員變數值,例如:定義JavaBean的usrname屬性,如下所示: public void setUsername(String name) { username = name; } public String getUsername() { return username; }

  34. 10-4-2 建立JavaBeans-索引屬性 • 索引屬性代表陣列內容的成員變數,換句話說,這是一組資料的屬性,其定義方法和簡單屬性並沒有什麼不同,只是設定和取得的內容是陣列物件,例如:定義JavaBean的languages屬性,如下所示: public String[] getLanguages() { return items; } public void setLanguages(String[] value) { items = value; }

  35. 10-5 在JSP程式使用JavaBeans • 10-5-1 在JSP程式使用JavaBean • 10-5-2 使用Introspection機制設定 JavaBean屬性值 • 10-5-3 JavaBean的物件範圍 • 10-5-4 刪除JavaBean

  36. 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。

  37. 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"/>

  38. 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>

  39. 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屬性值。

  40. 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"/>

  41. 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程式都可以存取。

  42. 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"/>

More Related