Servlet學(xué)習(xí)筆記4: Servlet中的request與response

一吮炕、HttpServletRequest

1. 簡(jiǎn)介

HttpServletRequest對(duì)象代表客戶端的請(qǐng)求惯疙,當(dāng)客戶端通過(guò)HTTP協(xié)議訪問(wèn)服務(wù)器時(shí)欺旧,HTTP請(qǐng)求頭中的所有信息都封裝在這個(gè)對(duì)象中昔汉,開發(fā)人員通過(guò)這個(gè)對(duì)象的方法督赤,可以獲得客戶這些信息嘁灯。
request就是將請(qǐng)求文本封裝而成的對(duì)象,所以通過(guò)request能獲得請(qǐng)求文本中的所有內(nèi)容躲舌,請(qǐng)求頭丑婿、請(qǐng)求體請(qǐng)求行没卸。

2.相關(guān)方法

  • 請(qǐng)求頭
  String getHeader(String name) //根據(jù)頭名稱得到頭信息值
  long getDateHeader(java.lang.String name) //獲得指定頭內(nèi)容Date
  int getIntHeader(java.lang.String name)  //獲得指定頭內(nèi)容int
  Enumeration getHeaderNames() //得到所有頭信息name
  Enumeration getHeaders(String name) //根據(jù)頭名稱得到相同名稱頭信息值
  • 請(qǐng)求體/請(qǐng)求正文
    表單獲取相關(guān)
String getParameter(name)   //根據(jù)表單中name屬性的名羹奉,獲取value屬性的值方法
String[] getParameterValues(String name)  //專為復(fù)選框取取提供的方法
getParameterNames()   //得到表單提交的所有name的方法
Map<String , String[]> getParameterMap()   //得到表單提交的所有值的方法 //做框架用,非常實(shí)用
getInputStream    //以字節(jié)流的方式得到所有表單數(shù)據(jù)

非表單數(shù)據(jù)相關(guān)

oid setAttribute(String name, Object value);
Object getAttribute(String name);
Void removeAttribute(String name);

請(qǐng)求轉(zhuǎn)發(fā)相關(guān)

RequestDispatcher getRequestDispatcher(String path)//得到請(qǐng)求轉(zhuǎn)發(fā)或請(qǐng)求包含的協(xié)助對(duì)象
forward(ServletRequest request, ServletResponse response) //轉(zhuǎn)發(fā)的方法
include(ServletRequest request, ServletResponse response) //請(qǐng)求包含

編碼相關(guān)

//解決post方式編碼
request.setCharacterEncoding("UTF-8"); //告訴服務(wù)器客戶端什么編碼,只能處理post請(qǐng)求方式 
//解決get方式編碼
String name = new String(name.getBytes(“iso-8859-1”),”UTF-8”);
  • 請(qǐng)求行
  getMethod();     //獲得請(qǐng)求方式
  getRequestURL();    //返回客戶端發(fā)出請(qǐng)求時(shí)的完整URL
  getRequestURI();    //返回請(qǐng)求行中的資源名部分约计。
  getContextPath();   // 當(dāng)前應(yīng)用的虛擬目錄 
  getQueryString() ;    //返回請(qǐng)求行中的參數(shù)部分诀拭。
  getProtocol(); 
  getScheme();
  getServerName();
  getServerPort();
  getContextPath();
  getServletPath();
  getRemoteAddr(); 

3. 應(yīng)用

  • 各種表單輸入項(xiàng)數(shù)據(jù)的獲取
  • request對(duì)象實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)
    • 請(qǐng)求轉(zhuǎn)發(fā)指一個(gè)web資源收到客戶端請(qǐng)求后,通知服務(wù)器去調(diào)用另外一個(gè)web資源進(jìn)行處理煤蚌。
    • request對(duì)象提供了一個(gè)getRequestDispatcher方法耕挨,該方法返回一個(gè)RequestDispatcher對(duì)象,調(diào)用這個(gè)對(duì)象的forward方法可以實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)铺然。
    • request對(duì)象同時(shí)也是一個(gè)域?qū)ο笏仔ⅲ_發(fā)人員通過(guò)request對(duì)象在實(shí)現(xiàn)轉(zhuǎn)發(fā)時(shí),把數(shù)據(jù)通過(guò)request對(duì)象帶給其它web資源處理魄健。

二赋铝、HttpServletResponse

1. 簡(jiǎn)介

代表服務(wù)器的響應(yīng)。這個(gè)對(duì)象中封裝了向客戶端發(fā)送數(shù)據(jù)沽瘦、發(fā)送響應(yīng)頭革骨,發(fā)送響應(yīng)狀態(tài)碼的方法农尖。

getOutputStream和getWriter方法

  • 用于得到輸出二進(jìn)制數(shù)據(jù)、輸出文本數(shù)據(jù)的ServletOuputStream良哲、Printwriter對(duì)象
  • getOutputStream和getWriter這兩個(gè)方法互相排斥盛卡,調(diào)用了其中的任何一個(gè)方法后,就不能再調(diào)用另一方法筑凫。 會(huì)拋異常滑沧。
  • Servlet程序向ServletOutputStream或PrintWriter對(duì)象中寫入的數(shù)據(jù)將被Servlet引擎從response里面獲取,Servlet引擎將這些數(shù)據(jù)當(dāng)作響應(yīng)消息的正文巍实,然后再與響應(yīng)狀態(tài)行和各響應(yīng)頭組合后輸出到客戶端滓技。
  • Serlvet的service方法結(jié)束后,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對(duì)象是否已經(jīng)調(diào)用過(guò)close方法棚潦,如果沒(méi)有令漂,Servlet引擎將調(diào)用close方法關(guān)閉該輸出流對(duì)象。

應(yīng)用

  • 向客戶端輸出中文數(shù)據(jù)
    • 用OutputStream(字節(jié)流)發(fā)送數(shù)據(jù)
    • 用PrintWriter(字符流)發(fā)送數(shù)據(jù)
  • 文件下載
//通過(guò)路徑得到一個(gè)輸入流
        String path = this.getServletContext().getRealPath("/WEB-INF/classes/美女.jpg");
        FileInputStream fis = new FileInputStream(path);
        //創(chuàng)建字節(jié)輸出流
        ServletOutputStream sos = response.getOutputStream();
        
        //得到要下載的文件名
        String filename = path.substring(path.lastIndexOf("\\")+1);
        
        //設(shè)置文件名的編碼, 如果文件名是中文丸边,需要URLEncoder
        filename = URLEncoder.encode(filename, "UTF-8");//將不安全的文件名改為UTF-8格式
        
        //告知客戶端要下載文件
        response.setHeader("content-disposition", "attachment;filename="+filename);
        response.setHeader("content-type", "image/jpeg");
        
        //執(zhí)行輸出操作
        int len = 1;
        byte[] b = new byte[1024];
        while((len=fis.read(b))!=-1){
            sos.write(b,0,len);
        }
        
        sos.close();
        fis.close();
  • 生成驗(yàn)證碼:BufferedImage
  • 定時(shí)刷新頁(yè)面
    • 利用Refresh刷新到其他組件
    • response.setHeader("Refresh", "3;URL=index.html");
  • 重定向跳轉(zhuǎn)
    • 方式一:手動(dòng)方案
      response.setStatus(302);  //狀態(tài)碼302就代表重定向
      response.setHeader("location","http://www.baidu.com");
    • 方式二:使用封裝好的叠必,通過(guò)response.sendRedirect("http://www.baidu.com");
      特點(diǎn):服務(wù)器告訴瀏覽器要跳轉(zhuǎn)的頁(yè)面,是瀏覽器主動(dòng)去跳轉(zhuǎn)的頁(yè)面妹窖,瀏覽器知道纬朝,也瀏覽器的地址欄中url會(huì)變,是瀏覽器重新發(fā)起一個(gè)請(qǐng)求到另外一個(gè)頁(yè)面骄呼,所以request是重新發(fā)起的玄组,跟請(qǐng)求轉(zhuǎn)發(fā)不一樣。

參考:https://www.cnblogs.com/zhangyinhua/p/7629221.html


Servlet知識(shí)點(diǎn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谒麦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哆致,更是在濱河造成了極大的恐慌绕德,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摊阀,死亡現(xiàn)場(chǎng)離奇詭異耻蛇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)胞此,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門臣咖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人漱牵,你說(shuō)我怎么就攤上這事夺蛇。” “怎么了酣胀?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵刁赦,是天一觀的道長(zhǎng)娶聘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)甚脉,這世上最難降的妖魔是什么丸升? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮牺氨,結(jié)果婚禮上狡耻,老公的妹妹穿的比我還像新娘。我一直安慰自己猴凹,他們只是感情好夷狰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著精堕,像睡著了一般孵淘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歹篓,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天瘫证,我揣著相機(jī)與錄音,去河邊找鬼庄撮。 笑死背捌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洞斯。 我是一名探鬼主播毡庆,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼烙如!你這毒婦竟也來(lái)了么抗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亚铁,失蹤者是張志新(化名)和其女友劉穎蝇刀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徘溢,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吞琐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了然爆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片站粟。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖曾雕,靈堂內(nèi)的尸體忽然破棺而出奴烙,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布缸沃,位于F島的核電站恰起,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏趾牧。R本人自食惡果不足惜检盼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翘单。 院中可真熱鬧吨枉,春花似錦、人聲如沸哄芜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)认臊。三九已至圃庭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間失晴,已是汗流浹背剧腻。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涂屁,地道東北人书在。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拆又,于是被迫代替她去往敵國(guó)和親儒旬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345