JavaWeb总结(四)
使用Servlet發(fā)送服務(wù)器端響應(yīng)信息
Servlet?API中定義一個(gè)專(zhuān)門(mén)的接口類(lèi)javax.servlet.http.HttpServletResponse用于創(chuàng)建HTTP響應(yīng),包括HTTP協(xié)議的狀態(tài)行、響應(yīng)頭以及消息體;
?
HTTP響應(yīng)示例
設(shè)置響應(yīng)狀態(tài)行
-?狀態(tài)行分為HTTP協(xié)議、狀態(tài)碼和狀態(tài)描述三個(gè)部分
-?狀態(tài)描述與狀態(tài)碼直接相關(guān)
-?HTTP協(xié)議由服務(wù)器確定?
-?通過(guò)設(shè)置狀態(tài)碼來(lái)實(shí)現(xiàn)許多重要功能(可以把用戶(hù)重定向到另一個(gè)網(wǎng)站,可以指示附加的文檔是圖片、PDF或HTML……)
HTTP狀態(tài)碼:
100-199:表示信息性代碼,標(biāo)示客戶(hù)端應(yīng)該采取的其他動(dòng)作,請(qǐng)求正在進(jìn)行。
200-299:表示客戶(hù)請(qǐng)求成功。
300-399:表示用于已經(jīng)移走的資源文件,指示新的地址。
400-499:表示由客戶(hù)端引發(fā)的錯(cuò)誤。
500-599:表示由服務(wù)器端引發(fā)的錯(cuò)誤。
設(shè)置狀態(tài)碼
-?使用HttpServletResponse的setStatus()方法?
//setStatus方法的參數(shù)是一個(gè)整數(shù) //使用HttpServletResponse中的常量 setStatus(HttpServletResponse.SC_NOT_FOUND );-?設(shè)置狀態(tài)代碼返回描述信息
?
response設(shè)置狀態(tài)碼為404
?
未找到文件web服務(wù)器返回404應(yīng)答
HTTP的響應(yīng)信息是由狀態(tài)行、響應(yīng)頭、空行和消息體(內(nèi)容文檔)按照次序組成并以流的方式向?yàn)g覽器發(fā)送的。
?
HTTP響應(yīng)信息按次序組成并向?yàn)g覽器發(fā)送數(shù)據(jù)流
| 提示:在Servlet規(guī)范中沒(méi)有規(guī)定Servlet必須緩存消息體,因而要在使用PrintWriter輸出消息體前設(shè)置狀態(tài)碼。 |
HttpServletResponse為兩種常見(jiàn)的情形提供了專(zhuān)用的方法:
- sendError方法
public?void?sendError(int?code,String?message)
該方法生成一個(gè)404應(yīng)答,同時(shí)生成一個(gè)簡(jiǎn)短的HTML錯(cuò)誤信息文檔發(fā)生給客戶(hù)。
response.sendError(404,"路徑錯(cuò)誤");
?
sendError結(jié)果示意圖
-sendRedirect方法
Public?void?sendRedirect(String?url)
該方法生成一個(gè)302應(yīng)答,同時(shí)在Location頭中指示新文檔的URL路徑(類(lèi)似a標(biāo)簽跳轉(zhuǎn)效果,會(huì)產(chǎn)生兩次請(qǐng)求和響應(yīng))。
設(shè)置響應(yīng)頭
HttpServletResponse對(duì)象用于操縱響應(yīng)的HTTP頭
-?containsHeader(String?name):返回一個(gè)布爾值,指示是否設(shè)置了指定的響應(yīng)頭。
-?setHeader(String?name,String?value):用一個(gè)給定的名稱(chēng)和字符串設(shè)置響應(yīng)頭的通用方式。如果響應(yīng)頭已經(jīng)被設(shè)置,新的值將覆蓋當(dāng)前的值。在設(shè)置值之前可以用containsHeader判斷頭是否存在;
-?setIntHeader(String?name,int?value):用一個(gè)給定的名稱(chēng)和整型值設(shè)置響應(yīng)頭。如果響應(yīng)頭已經(jīng)被設(shè)置,新的值將覆蓋當(dāng)前的值。在設(shè)置值之前可以用containsHeader判斷頭是否存在;
-?setDateHeader(String?name,long?date):?用一個(gè)給定的名稱(chēng)和日期值設(shè)置響應(yīng)頭。這里的日期值應(yīng)該是反映自1970-1-1日(GMT)以來(lái)的精確到毫秒的長(zhǎng)整型。如果響應(yīng)頭已經(jīng)被設(shè)置,新的值將覆蓋當(dāng)前的值。在設(shè)置值之前可以用containsHeader判斷頭是否存在;
-?addHeader(String?name,String?value):在response中添加一個(gè)給定名稱(chēng)和字符串值的響應(yīng)頭,而不管是否已經(jīng)存放在同名的響應(yīng)頭。該方法允許響應(yīng)頭有多個(gè)值。
-?addIntHeader(String?name,intvalue):在response中添加一個(gè)給定名稱(chēng)和整型值的響應(yīng)頭。該方法允許響應(yīng)頭有多個(gè)值。
- addDateHeader(String?name,long?value):在response中添加一個(gè)給定名稱(chēng)和日期值設(shè)置響應(yīng)頭。這里的日期值應(yīng)該是反映自1970-1-1日(GMT)以來(lái)的精確到毫秒的長(zhǎng)整型。該方法允許響應(yīng)頭有多個(gè)值。
-?setContentType(String?mimeType):用于設(shè)置返回給客戶(hù)端內(nèi)容內(nèi)容的MIME類(lèi)型。
-?addCookie(Cookie?cookie):用于向set-Cookie插入一個(gè)Cookie。由于在HTTP響應(yīng)中會(huì)存在多個(gè)Set-Cookie行,所以沒(méi)有對(duì)應(yīng)的setCookie方法。
目的用于告訴客戶(hù)端
-?發(fā)送回來(lái)的內(nèi)容的類(lèi)型?
-?有多少內(nèi)容正被發(fā)送?
-?發(fā)送內(nèi)容的服務(wù)器的類(lèi)型?
設(shè)置響應(yīng)消息體
-?HttpServletResponse對(duì)象負(fù)責(zé)將信息返回給客戶(hù)端?
-?HttpServletResponse對(duì)象只產(chǎn)生一個(gè)空的HTTP響應(yīng)
-?傳回自定義的內(nèi)容需要使用getWriter()或者getOutputStream()方法?
-?getWriter()傳送普通文本?
-?getOutputStream()傳送二進(jìn)制內(nèi)容?
傳遞文本流?
getWriter()方法用于得到一個(gè)輸出流?
PrintWriter out = response.getWriter();//與寫(xiě)HTML一樣,不過(guò)需要println和print方法去拼寫(xiě) out.println("<html>");out.println("<head>");out.println("<title>Hello World!</title>”); out.println("</html>");out.println("</head>");傳遞二進(jìn)制流
getOutputStream()方法可以對(duì)發(fā)送到客戶(hù)端的信息進(jìn)行更多控制
該方法返回javax.servlet.?ServletOutputStream對(duì)象?
ServletOutputStream允許開(kāi)發(fā)者寫(xiě)原始字節(jié)?
OutputStream比使用PrinterWriter發(fā)送文本效率更高
可以動(dòng)態(tài)地創(chuàng)建任何形式的數(shù)字內(nèi)容?
package?com.java.downLoad;
import?java.io.IOException;
import?java.io.InputStream;
import?javax.servlet.ServletContext;
import?javax.servlet.ServletException;
import?javax.servlet.ServletOutputStream;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
/**
?*?Servlet?implementation?class?DownLaod
?*/
public?class?DownLaod?extends?HttpServlet?{
private?static?final?long?serialVersionUID?=?1L;
protected?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException?{
doPost(request,?response);
}
protected?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException?{
//獲取文件名字
String?filename?=?request.getParameter("filename");
//設(shè)置文件MIME類(lèi)型??
ServletContext?sc?=?this.getServletContext();
response.setContentType(sc.getMimeType(filename));??
?????? //設(shè)置Content-Disposition,名字為當(dāng)前時(shí)間毫秒數(shù)?
?????? InputStream?fiels?=?null;
?????? response.setHeader("Content-Disposition",?"attachment;filename="+System.currentTimeMillis());?
//獲取文件并且轉(zhuǎn)化為流
?????? fiels?=?sc.getResourceAsStream("/downLoad/"+filename);
//傳輸流
ServletOutputStream?out?=?response.getOutputStream();
byte[]?buf?=?new?byte[1024];
int?length?=?0;
while((length=fiels.read(buf))!=-1){
out.write(buf,?0?,length);
}
//關(guān)閉流
if(out!=null){
out.close();
out.flush();
}
if(fiels!=null){
fiels.close();
}
}
}
設(shè)置請(qǐng)求重定向
-?可以選擇別的服務(wù)器端程序來(lái)處理請(qǐng)求
-?把請(qǐng)求重定向到一個(gè)完全不同的URL上
重定向原理
?
瀏覽器發(fā)送HTTP請(qǐng)求
?
Servlet把302響應(yīng)碼和Location響應(yīng)頭發(fā)送給客戶(hù)端和瀏覽器
?
瀏覽器根據(jù)Location頭中新的URL重新發(fā)出HTTP請(qǐng)求
設(shè)置自動(dòng)刷新和等待頁(yè)
-?在指定時(shí)間內(nèi)自動(dòng)刷新當(dāng)前頁(yè)或到一個(gè)新的頁(yè)面
-?根據(jù)時(shí)間來(lái)控制響應(yīng)?
-?想在響應(yīng)中有一個(gè)短時(shí)間的暫停??
response.setHeader("Refresh",?"time;?URL=url"?);
?
轉(zhuǎn)載于:https://www.cnblogs.com/HackerBlog/p/5949049.html
總結(jié)
以上是生活随笔為你收集整理的JavaWeb总结(四)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JMeter3.0_插件管理
- 下一篇: JavaFX上手--第1天