編程思路:下面的UploadServlet.java ,其主要功能為從InputStream 中讀取文件內(nèi)容,將上傳文件保存在根目錄下,且文件名與上傳文件的文件名一致。



































































































首先定義上傳文件最大字節(jié)為1024K(1M),上傳文件保存在根目錄(/)下,從請(qǐng)求的InputStream 讀取實(shí)體數(shù)據(jù),根據(jù)請(qǐng)求頭Content-Type 和contenLength 等值,從實(shí)體數(shù)據(jù)中解析出表單Form 數(shù)據(jù)中的filename 和Content-Type 等值,然后將實(shí)體數(shù)據(jù)中真正屬于上傳文件的內(nèi)容保存到服務(wù)器上的根目錄文件中。
其中用到涉及中文輸出:





















(1) Servlet 編程要求讀者已經(jīng)掌握了Java 語(yǔ)言程序設(shè)計(jì),最好對(duì)面向?qū)ο笠灿幸欢ǖ牧私狻ava 語(yǔ)言程序設(shè)計(jì)最主要的是對(duì)Java 的類庫(kù)的使用,同樣掌握Servlet 編程也要求熟練使用Sun 公司提供的JSDK。
(2) 一個(gè)好的Servlet 程序必須要考慮得全面。由于Servlet 在服務(wù)器上執(zhí)行,為客戶提供服務(wù),有時(shí)可能會(huì)有多個(gè)客戶同時(shí)向一個(gè)服務(wù)器發(fā)請(qǐng)求,這就要求Servlet 程序必須能夠保證良好的并發(fā)性。允許Servlet 并發(fā)執(zhí)行,就要解決Servlet 中變量和同步訪問(wèn)以及共享的問(wèn)題,尤其要特別注意服務(wù)器的一些昂貴的資源。另一方面,Servlet 要把處理結(jié)果返回給客戶,要求Servlet 充分考慮響應(yīng)的速度和響應(yīng)結(jié)果的簡(jiǎn)潔明了,同時(shí)對(duì)客戶的錯(cuò)誤請(qǐng)求有一定的容錯(cuò)性。
(3) 解決Servlet 中文輸出問(wèn)題
當(dāng)Servlet 輸出的文檔中有中文時(shí),需要在Servlet 中使用下面的語(yǔ)句來(lái)指明:




如果在Servlet 中文顯示有問(wèn)題,可從以下幾方面來(lái)考慮:
* 修改區(qū)域設(shè)置---在控制面板中選擇區(qū)域設(shè)置,如設(shè)為英語(yǔ)(美國(guó))。
* 在編譯Servlet 時(shí)加入代碼選項(xiàng),如:javac -encoding iso8859-1 ghqServlet.java
* 在源程序中加入編碼轉(zhuǎn)換函數(shù),如:out.println(new String("請(qǐng)輸入用戶名").getBytes("GBK"),"ISO8859_1"));
或者使用下面的方法:



這樣tempStr 中的中文就可以正確顯示了。
由于Servlet 采用不同的引擎,其中文的解決方法可能不同;因此,當(dāng)出現(xiàn)中文顯示問(wèn)題時(shí),建議一定要多實(shí)驗(yàn),最終總會(huì)得到解決。
(4) Java Servlet 程序彌補(bǔ)了 Applet 程序的不足, Servlet 主要應(yīng)用在HTTP Servlet 接收請(qǐng)求(HttpServletRequest接口)和產(chǎn)生響應(yīng)(HttpServletResponse接口)、使用Cookies 及會(huì)話管理(HttpSession 接口)應(yīng)用、Java Servlet 在網(wǎng)絡(luò)上的編程應(yīng)用如利用Servlet 上傳和下載文件、Servlet 的數(shù)據(jù)庫(kù)編程、在Servlet 中發(fā)送和接受郵件以及Java Servlet 在RMI和XML等方面的應(yīng)用,因此Servlet 的編程應(yīng)用還是比較廣泛的。
通常 Servlet 可以使用以下的方法調(diào)用:
* 客戶通過(guò)訪問(wèn) Servlet 產(chǎn)生的文檔來(lái)調(diào)用
Server 得到一個(gè)訪問(wèn)文檔的請(qǐng)求后,查找配置參數(shù),就會(huì)發(fā)現(xiàn)所需文檔不是一個(gè)靜態(tài)文檔,而是由 Servlet 對(duì)象產(chǎn)生的,于是服務(wù)器就會(huì)把請(qǐng)求傳給 Servlet,Servlet 調(diào)用 "service" 方法產(chǎn)生輸出。這種方法與傳統(tǒng)的調(diào)用 CGI 的方法類似。
* 直接通過(guò) URL 調(diào)用 Servlet
客戶(瀏覽器)使用以下格式的 URL 調(diào)用:
http://Servlet_Host_Name/servlet/<servlet URL>
<servlet URL>是指向 Servlet 位置的普通的URL,它的格式如下所示:
name?para1=value1¶2=value2...
其中,name 是 Servlet 的名字,"?" 后面跟的是一串參數(shù),para1 是第一個(gè)參數(shù)名,value1是它的值,para1 是第二個(gè)參數(shù)名,value2是它的值,以此類推。通常Servlet 存放的位置可能與服務(wù)器不在同一臺(tái)機(jī)器上,這時(shí)服務(wù)器就要?jiǎng)討B(tài)加載、初始化和執(zhí)行Servlet 類。
* 通過(guò) SSI(Server-Side Includes) 標(biāo)志調(diào)用
任何一個(gè)以.sthml 為擴(kuò)展名的文件都是服務(wù)器要分析的文件。在該文件中,如果出現(xiàn)了Servlet標(biāo)志,那么服務(wù)器就會(huì)運(yùn)行該Servlet,并把它的輸出結(jié)果插入標(biāo)志所指示的地方。
* 把 Servlet 放在/servlet/目錄下
如果一個(gè) Servlet 的類文件被放在/servlet/目錄下,那么就可以直接使用它的類名調(diào)用它。
* 通過(guò) Filter Chain 調(diào)用
這種方法一般要把 Servlet 配置成當(dāng)一個(gè)特定的 MIME 類型被設(shè)置為響應(yīng)時(shí)再調(diào)用。
但Servlet 也有它的缺點(diǎn):
* 在復(fù)雜的HTML 網(wǎng)頁(yè)中,加入的動(dòng)態(tài)部分如果用Servlet 來(lái)處理的話,那對(duì)程序員來(lái)說(shuō)簡(jiǎn)直是一場(chǎng)噩夢(mèng)。
* Servlet 要進(jìn)行編譯、放入執(zhí)行碼等復(fù)雜的調(diào)用過(guò)程。
正是由于Servlet存在的缺點(diǎn),才出現(xiàn)使用JSP 技術(shù)來(lái)解決上面的問(wèn)題,這也正是JSP 的優(yōu)點(diǎn)。