Request 和Response 對象都是由服務器創建,管理,銷燬. 由我們來使用.
繼承體系結構:
ServletRequest(接口)<--------繼承<-------HttpServletRequest(接口)<--------實現 org.apache.catalina.connector.RequestFacade@6049a827
ServletResponse(接口)<---------繼承--- HttpServletResponse(接口)<-------------實現------org.apache.catalina.connector.ResponseFacade@3bec9d4
1.請求對象:獲取請求的消息
1)爲了防止編碼格式的錯誤,首先應該設置請求編碼和響應編碼.
//設置請求編碼和響應編碼
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
2)/獲取請求頭
String name = request.getHeader("username");//獲取請求頭的值
long date = request.getDateHeader(name);//獲取日期頭
int i = request.getIntHeader(name);//獲取數字頭
3)獲取請求行
String method = request.getMethod();//獲取請求的方式:get/post
String uri = request.getRequestURI();//獲取Uri
StringBuffer url = request.getRequestURL();//獲取URL
String addr = request.getRemoteAddr();//獲取IP地址
String queryString = request.getQueryString();//獲取請求的參數
String protocol = request.getProtocol();//獲取訪問的版本,瀏覽器的信息
4)獲取請求體:封裝post請求的請求參數
//獲取請求體:封裝post請求的請求參數
BufferedReader reader = request.getReader();
String line = reader.readLine();
5)獲取請求的參數
//獲取請求參數的不同方式
String na = request.getParameter("username");//通過參數名稱獲取值
String[] strings = request.getParameterValues("hobby");//通常用於複選框
Map<String,String[]> map = request.getParameterMap();
//遍歷map集合
Set<String> keySet = map.keySet();
for(String key:keySet){
System.out.println(key);//遍歷參數名
String[] ss = map.get(key);//獲取參數的值
for(String v:ss){
System.out.println(key+"="+v);
}
}
Enumeration names = request.getParameterNames();//通過枚舉的方式獲取
6)中文亂碼的解決:post請求
//處理post請求中文亂碼的問題
String n = request.getParameter("name");//服務器使用ISO-8859-1 的方式解碼
byte[] bys = n.getBytes("ISO-8859-1");
n = new String(bys,"utf-8");
7)重定向和請求轉發
重定向特點:兩次請求,兩次轉發;既可以訪問內部資源,也可以訪問外部資源,地址欄內的地址發生變化
請求轉發:一次請求,一次響應;只可以訪問項目內部的資源;地址欄的地址不發生改變.
//重定向
//1.設置302狀態
response.setStatus(302);
response.setHeader("location", "http:baidu.com");
//重定向:合二爲一
response.sendRedirect("http:baidu.com");
//請求轉發
request.getRequestDispatcher("/demo1").forward(request, response);
重定向和請求轉發的區別:
1.一個web資源收到客戶端請求後,通知服務器去調用另外一個web資源進行處理,稱之爲請求轉發。
2.一個web資源收到客戶端請求後,通知瀏覽器去訪問另外一個web資源,稱之爲請求重定向。
3.RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。
如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對於整個WEB站點的根目錄;如果創建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對於當前WEB應用程序的根目錄。
調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束後,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;調用RequestDispatcher.forward 方法的請求轉發過程結束後,瀏覽器地址欄保持初始的URL地址不變。
4.HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行爲。
5.RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。
2.響應對象:封裝響應的數據,當真正的響應之前,取出裏面的數據,給瀏覽器響應.
1)爲了防止編碼格式的錯誤,首先應該設置請求編碼和響應編碼.
//設置請求編碼和響應編碼
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
2)響應字符串:
//響應一個字符串'
PrintWriter writer = response.getWriter();
writer.write("正在請求");
3)響應一個圖片
//響應一個圖片
String path = this.getServletContext().getRealPath("xxx.jpg");//獲取圖片的真是路徑
//讀取文件
FileInputStream fis=new FileInputStream(new File(path));
//獲取要讀的文件
ServletOutputStream fos = response.getOutputStream();
byte[] by=new byte[1024];
int len=0;
while((len=fis.read(by))!=-1){
fos.write(by,0,len);
fos.flush();
}
//關閉資源
fis.close();
fos.close();