J2EE復(fù)習(xí)(四)servlet
一、什么是Servlet?
Servlet 是在服務(wù)器上運(yùn)行來響應(yīng)客戶端請(qǐng)求的一種java組件。Servlet與具體的客戶服務(wù)端協(xié)議無關(guān),但Servlet常用于HTTP協(xié)議,所以,“Servle”t常被用于“HTTP Servlet”的意思。
Servlet使用的java軟件包:javax.servlet(基本Servlet框架)和javax,servlet.http(HTTP Servlet)
HTTP Servlets典型應(yīng)用包括:
1.通過提交HTML表單操作存儲(chǔ)數(shù)據(jù)。
2.提供動(dòng)態(tài)內(nèi)容,如將從數(shù)據(jù)庫中查詢到的結(jié)果返回給客戶端
3.管理無狀態(tài)的HTTP上的有狀態(tài)的信息,如一個(gè)為多個(gè)同時(shí)存在的客戶管理購物車并映射每一個(gè)請(qǐng)求到正確的客戶的在線購物系統(tǒng)
二、Servlets 和 CGI(Commone Gateway Interface)
最早用來產(chǎn)生動(dòng)態(tài)網(wǎng)頁服務(wù)的方法便是CGI,CGI是一種與語言無關(guān)的接口,此種接口允許服務(wù)器啟動(dòng)通過環(huán)境變化來獲取與此次請(qǐng)求有關(guān)信息的外部程序。每一個(gè)請(qǐng)求都通過CGI程序或者CGI腳本由單獨(dú)的線程響應(yīng)。
Servlets相比CGI的幾個(gè)優(yōu)勢(shì):
1.Servlet中,每個(gè)請(qǐng)求由一個(gè)輕量級(jí)的Java線程處理,不用為每一個(gè)請(qǐng)求啟動(dòng)新的系統(tǒng)線程。
2.一個(gè)Servlet在請(qǐng)求期間會(huì)駐留在內(nèi)存中。
3.響應(yīng)所有并發(fā)的請(qǐng)求只需要唯一一個(gè)實(shí)例,節(jié)省了內(nèi)存并可以使Servlet管理持久數(shù)據(jù)顯得更快捷。
三、Servlet 生命周期
Servlet 的生命周期就是指創(chuàng)建 Servlet 實(shí)例之后其存在的時(shí)間以及何時(shí)消失
生命周期的 3個(gè)方法為:init()、service()、destroy()
1.裝載servlet類以及其他可能使用到的類
2.調(diào)用init(ServletConfig config)方法加載配置信息,初始化servlet
3.調(diào)用service(doGet/doPost)方法處理業(yè)務(wù)邏輯,service方法在初始化前不會(huì)被調(diào)用
4.調(diào)用destroy方法銷毀不再使用的servlet
四、Servlet的部署
1.用myeclipse建立好web工程,寫好HelloClientServlet.java類

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

2.web.xml文件中配置Servlet

2

3

4

5

6

7

8

9

10

3.發(fā)布到本機(jī)web服務(wù)器(使用Tomcat5.5)中,通過http://localhost:服務(wù)器端口號(hào)/工程名/first.do啟動(dòng)servlet。
五、javax.servlet 包的接口介紹
ServletConfig
用來封裝web.xml中對(duì)當(dāng)前Servlet的配置信息
getInitParameter()---可以獲取初始化參數(shù)
ServletContext
代表當(dāng)前Servlet運(yùn)行的上下文環(huán)境,Web容器會(huì)為每一個(gè)Web工程創(chuàng)建一個(gè)對(duì)應(yīng)ServletContext對(duì)象
setAttribute()
getAttribute()
removeAttribute()
ServletRequest
為Servlet所發(fā)送的請(qǐng)求,用ServletRequest封裝
setAttribute()
getAttribute()
removeAttribute()
getParameter()
常用子接口HttpServletRequest
ServletResponse
Servlet對(duì)客戶段所做的響應(yīng),用ServletResponse描述
getWriter():獲取PrintWriter輸出流給客戶發(fā)送的響應(yīng)內(nèi)容
setContentType:設(shè)置響應(yīng)內(nèi)容的響應(yīng)類型和字符集信息
sendRedirect:設(shè)置重新請(qǐng)求路徑
子接口HttpServletResponse
六、過濾器(Filter)
1.Servlet 過濾器是小型的 Web 組件,它們攔截請(qǐng)求和響應(yīng),以便查看、提取或以某種方式操作正在客戶機(jī)和服務(wù)器之間交換的數(shù)據(jù)。
2.生命周期
初始化----當(dāng)容器第一次加載該過濾器時(shí), init() 方法將被調(diào)用。
過濾----doFilter() 方法被容器調(diào)用,同時(shí)傳入分別指向這個(gè)請(qǐng)求/響應(yīng)鏈中的ServletRequest 、 ServletResponse 和 FilterChain 對(duì)象的引用
銷毀----容器緊跟在垃圾收集之前調(diào)用 destroy() 方法
3.編寫字符編碼過濾器
(1)實(shí)現(xiàn)Filter接口中的三個(gè)方法:
init() ----這個(gè)方法在容器實(shí)例化過濾器時(shí)被調(diào)用
doFilter() ----與 servlet 擁有一個(gè) service() 方法(這個(gè)方法又調(diào)用 doPost() 或者 doGet() )來處理請(qǐng)求一樣,過濾器擁有單個(gè)用于處理請(qǐng)求和響應(yīng)的方法―― doFilter()。
destroy() ---這個(gè)方法執(zhí)行任何清理操作,這些操作可能需要在自動(dòng)垃圾收集之前進(jìn)行

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35


36

37

38

(2)web.xml文件中配置字符編碼過濾器

2

3

4

5

6

7

8

9

10

11

12

13

14

七、監(jiān)聽器(ServletContextListener)
1.ServletContext相關(guān)監(jiān)聽接口
(1)javax.servlet.ServletContextListener:監(jiān)聽WEB應(yīng)用,當(dāng)應(yīng)用開始的時(shí)候它會(huì)調(diào)用contextInitialized()方法,當(dāng)應(yīng)用關(guān)閉的時(shí)候,它同樣會(huì)調(diào)用contextDestroyed()方法
(2)javax.servlet.ServletContextAttributeListener:用于監(jiān)聽WEB應(yīng)用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性
2.HttpSession相關(guān)監(jiān)聽接口
(1)javax.servlet.http.HttpSessionListener:監(jiān)聽HttpSession的操作。當(dāng)創(chuàng)建一個(gè)Session時(shí),激發(fā)session Created(HttpSessionEvent se)方法;當(dāng)銷毀一個(gè)Session時(shí),激發(fā)sessionDestroyed (HttpSessionEvent se)方法。
(2)avax.servlet.http.HttpSessionBindingListener:
注意:HttpSessionBindingListener接口是唯一不需要再web.xml中設(shè)定的Listener
當(dāng)我們的類實(shí)現(xiàn)了HttpSessionBindingListener接口后,只要對(duì)象加入Session范圍(即調(diào)用HttpSession對(duì)象的setAttribute方法的時(shí)候)或從Session范圍中移出(即調(diào)用HttpSession對(duì)象的removeAttribute方法的時(shí)候或Session Time out的時(shí)候)時(shí),容器分別會(huì)自動(dòng)調(diào)用下列兩個(gè)方法:
void valueBound(HttpSessionBindingEvent event)
void valueUnbound(HttpSessionBindingEvent event)
(3)avax.servlet.http.HttpSessionAttributeListener:監(jiān)聽HttpSession中的屬性的操作。
當(dāng)在Session增加一個(gè)屬性時(shí),激發(fā)attributeAdded(HttpSessionBindingEvent se) 方法;當(dāng)在Session刪除一個(gè)屬性時(shí),激發(fā)attributeRemoved(HttpSessionBindingEvent se)方法;當(dāng)在Session屬性被重新設(shè)置時(shí),激發(fā)attributeReplaced(HttpSessionBindingEvent se) 方法。
3.寫一個(gè)統(tǒng)計(jì)在線用戶的例子
(1)建立CunterListstener.java類

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

(2)建立index.jsp,查看在線人數(shù)

2

3

4

5

6

7

8

9

10

11

12

3.在web.xml文件中配置監(jiān)聽器

2

3

4

4.發(fā)布工程到Tomcat上,進(jìn)入index.jsp網(wǎng)頁 ,看到網(wǎng)頁內(nèi)容: 當(dāng)前在線人數(shù):1。代表的是只有自己在線。
九、Cookie
Cookie 用于存儲(chǔ) Web 服務(wù)器發(fā)送給客戶端的信息。服務(wù)器通過設(shè)置響應(yīng)標(biāo)題中的 Set-Cookie 方法來發(fā)送 cookie。
javax.servlet.http.Cookie類方法:
getComment/setComment 獲取/設(shè)置Cookie的注釋。
getDomain/setDomain 獲取/設(shè)置Cookie適用的域。
getMaxAge/setMaxAge 獲取/設(shè)置Cookie過期之前的時(shí)間,以秒計(jì)。
getName/setName 獲取/設(shè)置Cookie的名字。
getPath/setPath 獲取/設(shè)置Cookie適用的路徑。
getSecure/setSecure 獲取/設(shè)置一個(gè)boolean值,表示是否Cookie只能通過加密的連接(即SSL)發(fā)送。
getValue/setValue 獲取/設(shè)置Cookie的值。
getPath()返回的如果不指定路徑,Cookie將返回給當(dāng)前頁面所在目錄及其子目錄下的所有頁面。這里的方法可以用來設(shè)定一些更一般的條件。例如,someCookie.setPath("/"),此時(shí)服務(wù)器上的所有頁面都可以接收到該Cookie。
如果不設(shè)置Cookie的過期時(shí)間,則Cookie只在當(dāng)前會(huì)話內(nèi)有效,即在用戶關(guān)閉瀏覽器之前有效,而且這些Cookie不會(huì)保存到磁盤上。
通過HttpServletResponse的addCookie方法加入。

2

由于HttpServletRequest的getCookies方法返回的是一個(gè)Cookie對(duì)象的數(shù)組,因此通常要用循環(huán)來訪問這個(gè)數(shù)組查找特定名字,然后用getValue檢查它的值。

2

3

4

5

6

7

8

9

10

自動(dòng)保存的Cookie,Cookie能夠在瀏覽器退出的時(shí)候自動(dòng)保存下來

2

3

4

5

6

7

8

9

10

11

12

十、Servlet 通信方法
(1)Servlet 使用 RequestDispatcher 接口的 forward() 和include() 方法訪問網(wǎng)絡(luò)資源
將請(qǐng)求從一個(gè) Servlet 轉(zhuǎn)送到同一個(gè)服務(wù)器上的另一個(gè) Servlet

在一個(gè) Servlet 中包含另一個(gè) Servlet 的內(nèi)容

使用javax.servlet.http.HttpServlet.getServletContext()方法創(chuàng)建RequestDispatcher對(duì)象,用于訪問另一個(gè) Servlet 的內(nèi)容

(2)Servlet 上下文
將所有 Servlet 所共有的屬性和資源存儲(chǔ)于 ServletContext 接口對(duì)象。處理上下文屬性的方法為:

返回 Servlet 容器屬性名稱。如果該名稱沒有屬性則返回 null

將對(duì)象綁定到 Servlet 上下文中給定的屬性名稱

刪除給定名稱的屬性
posted on 2009-04-12 11:12 hackiller 閱讀(1156) 評(píng)論(0) 編輯 收藏 所屬分類: J2EE第一次復(fù)習(xí)