一吮炕、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ā)不一樣。
- 方式一:手動(dòng)方案