Servlet(3)


一.文件上傳下載


1. 文件上傳

文件上傳涉及到前臺(tái)頁(yè)面的編寫和后臺(tái)服務(wù)器端代碼的編寫,前臺(tái)發(fā)送文件, 后臺(tái)接收 并保存文件,這才是一個(gè)完整的文件上傳。?

1) 前臺(tái)頁(yè)面

在做文件上傳的時(shí)候,會(huì)有一個(gè)上傳文件的界面,首先我們需要一個(gè)表單, 并且表單的 請(qǐng)求方式為 POST;其次我們的 form 表單的 enctype 必須設(shè) 為”multipart/form-data”即 enctype="multipart/form-data"意思是設(shè)置表單的 MIME 編碼。默認(rèn)情況下這個(gè)編碼格式 是 ”application/x-www-form-urlencoded”, 不能用于文件上傳;只有使用了 multipart/form-data 才能完整地傳遞文件數(shù)據(jù)。


2)使用到的幾個(gè)核心類

DiskFileItemFactory – 設(shè)置磁盤空間,保存臨時(shí)文件。只是一個(gè)工具類 ServletFileUpload – 文件上傳的核心類,此類接收 request,并解析 ServletFileUpload.parseRequest(request); – List 解析 request

1、 創(chuàng)建一個(gè) DiskFileItemFactory 工廠類,并制定臨時(shí)文件和大小?

2、 創(chuàng)建 ServletFileUpload 核心類,接收臨時(shí)文件,做請(qǐng)求的轉(zhuǎn)換?

3、 通過 ServletFileUpload 類轉(zhuǎn)換原始請(qǐng)求,得到 FileItem 集合?

4、 遍歷集合中的各個(gè)元素并處理?

5、 判斷每個(gè)元素是否是普通表單項(xiàng),如果是則按照普通表單項(xiàng)處理?

6、 如果不是普通表單項(xiàng),則是文件,通過處理的方式進(jìn)行處理(上傳)



2. 文件下載

文件下載即將服務(wù)器上的資源下載(拷貝)到本地,我們可以通過兩種方式 下載。第一種是通過超鏈接本身的特性來下載;第二種是通過手動(dòng)寫出來下載。

1) 超鏈接下載

當(dāng)我們?cè)?HTML 或 JSP 頁(yè)面中使用標(biāo)簽時(shí),原意是希望能夠進(jìn)行跳轉(zhuǎn),但 當(dāng)超鏈接遇到瀏覽器不識(shí)別的動(dòng)態(tài)網(wǎng)頁(yè)時(shí)則會(huì)自動(dòng)下載。例如超鏈接下載但當(dāng)遇 見瀏覽器能夠直接顯示的資源,瀏覽器就會(huì)默認(rèn)顯示出來,比如 txt,png,jpg 等。 當(dāng)然我們也可以通過 download 屬性規(guī)定瀏覽器進(jìn)行下載。但有些瀏覽器并不支持。?


這里,download 也可以不寫任何信息,會(huì)自動(dòng)使用默認(rèn)文件名。這樣當(dāng)用 戶打開瀏覽 器點(diǎn)擊鏈接的時(shí)候就會(huì)直接下載文件。

2) 后臺(tái)實(shí)現(xiàn)下載

Step1:需要通過 HttpServletResponse.setContentType 方法設(shè)置 Content-type 頭字段的值, 為瀏覽器無法使用某種方式或激活某個(gè)程序來處理的 MIME 類型, 例 如 ”application/octet-stream” 或 ”application/x-msdownload” 等?

Step2:需要通過 HttpServletResponse.setHeader 方法設(shè)置 Content-Disposition 頭的值 為”attachment;filename=文件名”?

Step3: 讀取下載文件,調(diào)用 HttpServletResponse.getOutputStream 方法返回 的 OutputStream 對(duì)象來向客戶端寫入附件內(nèi)容。



二.過濾器

1.介紹

Filter 即為過濾,用于在 Servlet 之外對(duì) Request 或者 Response 進(jìn)行修改。 它主要用于對(duì)用戶請(qǐng)求進(jìn)行預(yù)處理,也可以對(duì) HttpServletResponse 進(jìn)行后處理。 使用 Filter 的完整流程: Filter 對(duì)用戶請(qǐng)求進(jìn)行預(yù)處理,接著將請(qǐng)求交給 Servlet 進(jìn)行處理并生成響應(yīng),最后 Filter 再 對(duì)服務(wù)器響應(yīng)進(jìn)行后處理。在一個(gè) web 應(yīng) 用中,可以開發(fā)編寫多個(gè) Filter,這些 Filter 組合 起來稱之為一個(gè) Filter 鏈。?

filter能夠在一個(gè)請(qǐng)求到達(dá)servlet之前預(yù)處理用戶請(qǐng)求,也可以在離開servlet時(shí)處理http響應(yīng):在執(zhí)行servlet之前,首先執(zhí)行filter程序,并為之做一些預(yù)處理工作; 根據(jù)程序需要修改請(qǐng)求和響應(yīng);在servlet被調(diào)用之后截獲servlet的執(zhí)行

2. 實(shí)現(xiàn)

我們可以通過實(shí)現(xiàn)一個(gè)叫做 javax.servlet.Fileter 的接口來實(shí)現(xiàn)一個(gè)過濾器, 其中定義了 三個(gè)方法,init(), doFilter(), destroy()分別在相應(yīng)的時(shí)機(jī)執(zhí)行。后期觀 察生命周期。 Filter 的實(shí)現(xiàn)只需要兩步:?

Step1: 編寫 java 類實(shí)現(xiàn) Filter 接口,并實(shí)現(xiàn)其 doFilter 方法。?

Step2: 在 web.xml 文件中對(duì)編寫的 filter 類進(jìn)行注冊(cè),并設(shè)置它所能攔截 的資源。?

3. 過濾器執(zhí)行的順序

通過觀察 web.xml 中的配置和各個(gè) filter 的執(zhí)行順序,找出 filter 執(zhí)行先后的 依據(jù)。根據(jù)之前觀察 Servlet 生命周期的的方式,觀察一下過濾器的生命周期。

三、監(jiān)聽器

1. 介紹

web 監(jiān)聽器是一種 Servlet 中的特殊的類,它們能幫助開發(fā)者監(jiān)聽 web 中 的特定事件, 比如 ServletContext,HttpSession,ServletRequest 的創(chuàng)建和銷毀;變 量的創(chuàng)建、銷毀和修改等。 可以在某些動(dòng)作前后增加處理,實(shí)現(xiàn)監(jiān)控。例如可 以用來統(tǒng)計(jì)在線人數(shù)等。

2. 實(shí)現(xiàn)

監(jiān)聽器有三類 8 種:⑴監(jiān)聽生命周期:實(shí)現(xiàn)接口 ServletRequestListener、 HttpSessionListener 、 ServletContextListener⑵監(jiān)聽值的變化:實(shí)現(xiàn)接口 ServletRequestAttributeListener、HttpSessionAttributeListener、 ServletContextAttributeListener ⑶針對(duì) session 中的對(duì)象:監(jiān)聽 session 中的 java 對(duì)象(javaBean) 是 javaBean 直接實(shí)現(xiàn)監(jiān)聽器 的接口。這里我們只做一個(gè)簡(jiǎn) 單的演示。假設(shè)我們想做一個(gè)對(duì)在線人數(shù)的監(jiān)控。

Step1:創(chuàng)建一個(gè)監(jiān)聽器,需要實(shí)現(xiàn)某種接口,根據(jù)需求選取 HttpSessionListener?

Step2:在 web.xml 中配置該監(jiān)聽器

創(chuàng)建一個(gè)類,并實(shí)現(xiàn) HttpSessionListener 接口,用來檢測(cè) Session 的創(chuàng)建和 銷毀。 在類中定義一個(gè)成員變量用來存儲(chǔ)當(dāng)前的 session 個(gè)數(shù)。?

四、Servlet3.0 注解?

1. @WebServlet

開發(fā) servlet 項(xiàng)目,使用@WebServlet 將一個(gè)繼承于 javax.servlet.http.HttpServlet 的類定義為 Servlet 組件。在 Servlet3.0 中 , 可以 使用@WebServlet 注解將一個(gè)繼承于 javax.servlet.http.HttpServlet 的類標(biāo)注為可 以處理用戶請(qǐng)求的 Servlet。


2. @WebFilter?


3. @WebListener

Servlet3.0 提供@WebListener 注解將一個(gè)實(shí)現(xiàn)了特定監(jiān)聽器接口的類定義 為監(jiān)聽器。將 實(shí)現(xiàn)了 ServletContextListener 接口的 MyServletContextListener 標(biāo)注為監(jiān)聽器。

4. @MultipartConfig

使用注解@MultipartConfig 將一個(gè) Servlet 標(biāo)識(shí)為支持文件上傳。 Servlet3.0 將 multipart/form-data 的 POST 請(qǐng)求封裝成 Part,通過 Part 對(duì)上傳 的文件進(jìn)行操作。

五.Servlet,過濾器,監(jiān)聽器,攔截器的區(qū)別

1,servlet 流程是短的,url傳來之后,就對(duì)其進(jìn)行處理,之后返回或轉(zhuǎn)向到某一自己指定的頁(yè)面。它主要用來在?業(yè)務(wù)處理之前進(jìn)行控制.

2,filter 流程是線性的, url傳來之后,檢查之后,可保持原來的流程繼續(xù)向下執(zhí)行,被下一個(gè)filter, servlet接收等,而servlet 處理之后,不會(huì)繼續(xù)向下傳遞。filter功能可用來保持流程繼續(xù)按照原來的方式進(jìn)行下去,或者主導(dǎo)流程,而servlet的功能主要用來主導(dǎo)流程。

filter可用來進(jìn)行字符編碼的過濾,檢測(cè)用戶是否登陸的過濾,禁止頁(yè)面緩存等

3, servlet,filter都是針對(duì)url之類的,而listener是針對(duì)對(duì)象的操作的,如session的創(chuàng)建,session.setAttribute的發(fā)生,在這樣的事件發(fā)生時(shí)做一些事情。

可用來進(jìn)行:Spring整合Struts,為Struts的action注入屬性,web應(yīng)用定時(shí)任務(wù)的實(shí)現(xiàn),在線人數(shù)的統(tǒng)計(jì)等

4,interceptor 攔截器,類似于filter,不過在struts.xml中配置,不是在web.xml,并且不是針對(duì)URL的,而是針對(duì)action,當(dāng)頁(yè)面提交 action時(shí),進(jìn)行過濾操作,相當(dāng)于struts1.x提供的plug-in機(jī)制,可以看作,前者是struts1.x自帶的filter,而 interceptor 是struts2 提供的filter.

與filter不同點(diǎn):(1)不在web.xml中配置,而是在struts.xml中完成配置,與action在一起

( 2? ) 可由action自己指定用哪個(gè)interceptor 來在接收之前做事

? ? ? ? 5,struts2中的過濾器和攔截器的區(qū)別與聯(lián)系:

(1)、攔截器是基于java反射機(jī)制的,而過濾器是基于函數(shù)回調(diào)的。

(2)、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器。

(3)、攔截器只能對(duì)Action請(qǐng)求起作用,而過濾器則可以對(duì)幾乎所有請(qǐng)求起作用。

(4)、攔截器可以訪問Action上下文、值棧里的對(duì)象,而過濾器不能。

(5)、在Action的生命周期中,攔截器可以多次調(diào)用,而過濾器只能在容器初始化時(shí)被調(diào)用一次。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容