request:請求
操作請求行
格式:
請求方式 請求資源 協議/版本
常用方法:HttpServletRequest
掌握
String getMethod():獲取請求方式
String getRemoteAddr():獲取ip地址
String getContextPath() :在java中獲取項目名稱 (例如/demo1)
瞭解:
getRequestURI():獲取的是 從項目名到參數之前的內容 /demo1/regist
getRequestURL():獲取的帶協議的完整路徑 http://localhost/demo1/regist
String getQueryString():get請求的所有參數 username=tom&password=123
String getProtocol():獲取協議和版本
例如:請求行
GET /demo1/row?username=tom&password=123 HTTP/1.1
//獲取 請求方式
String m=request.getMethod();
System.out.println("方式:"+m);
//獲取請求資源
String uri = request.getRequestURI();
String url = request.getRequestURL().toString();
System.out.println("uri:"+uri);
System.out.println("url:"+url);
//獲取請求參數的字符串
String s = request.getQueryString();
System.out.println("get請求參數:"+s);
//獲取協議版本
String p = request.getProtocol();
System.out.println("協議:"+p);
System.out.println("-------重要的----");
//獲取請求的ip
String ip = request.getRemoteAddr();
System.out.println("ip:"+ip);
//獲取項目名
String path = request.getContextPath();
System.out.println("項目路徑:"+path);
輸出:
方式:GET
uri:/demo1/row
url:http://localhost/demo1/row
get請求參數:username=tom&password=123
協議:HTTP/1.1
-------重要的----
ip:0:0:0:0:0:0:0:1
項目路徑:/demo1
操作請求頭
格式:key/value(value可以是多個值)
常用方法:
★String getHeader(String key):通過key獲取指定的value (一個)
瞭解:
Enumeration getHeaders(String name) :通過key獲取指定的value(多個)
Enumeration getHeaderNames() :獲取所有的請求頭的名稱
int getIntHeader(String key):獲取整型的請求頭
long getDateHeader(String key):獲取時間的請求頭
重要的請求頭:
user-agent:瀏覽器內核 msie firefox chrome
referer:頁面從那裏來 防盜鏈
//獲取瀏覽器內核
String agent = request.getHeader("user-agent");
System.out.println(agent);
操作請求參數
操作請求參數 ★
username=tom&password=123&hobby=drink&hobby=sleep
常用方法:
String getParameter(String key):獲取一個值
String[] getParameterValues(String key):通過一個key獲取多個值
Map<String,String[]> getParameterMap():獲取所有的參數名稱和值
//獲取username
String username = request.getParameter("username");
System.out.println("username:"+username);
//獲取愛好 多個值
String[] hobby = request.getParameterValues("hobby");
System.out.println("hobby:"+Arrays.toString(hobby));
//獲取所有
System.out.println("============");
Map<String, String[]> map = request.getParameterMap();
for(String key:map.keySet()){
System.out.println(key+"::"+Arrays.toString(map.get(key)));
}
輸出:
username:tom
---------values---------
hobby:[drink, sleep]
=====map=======
username::[tom]
password::[123]
hobby::[drink, sleep]
請求亂碼
請求的中文亂碼:
對於get請求:參數追加到地址欄,會使用utf-8編碼,服務器(tomcat7)接受到請求之後,使用iso-8859-1解碼,所以會出現亂碼
對於post請求,參數是放在請求體中,服務器獲取請求體的時候使用iso-8859-1解碼,也會出現亂碼
通用的方法:
new String(參數.getBytes("iso-8859-1"),"utf-8");
針對於post請求來說:只需要將請求流的編碼設置成utf-8即可
request.setCharacterEncoding("utf-8");
請求轉發
域對象:
request:
創建:一次請求來的時候
銷燬:響應生成的時候
作用:
一次請求裏面的數據
請求轉發(請求鏈,請求串)
request.getRequestDispatcher("內部路徑").forward(request,response);
<a href="/demo1/dis1?money=10">g_請求轉發借錢</a><br>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我說:稍等");
//將借錢人的姓名放入reuqest中
request.setAttribute("username", "++");
//請求轉發
request.getRequestDispatcher("/dis2").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
// /dis2 servlet代碼
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("老師曰:需要多少? 我答:"+request.getParameter("money"));
System.out.println("老師又曰:幹嘛用啊? 我答:借給"+request.getAttribute("username"));
}
response:響應
作用:
往瀏覽器寫東西
組成部分:
響應行 響應頭 響應體
操作響應行
格式:
協議/版本 狀態碼 狀態碼說明
狀態碼:
1xx:已發送請求
2xx:已完成響應
200:正常響應
3xx:還需瀏覽器進一步操作
302:重定向 配合響應頭:location
304:讀緩存
4xx:用戶操作錯誤
404:用戶操作錯誤.
405:訪問的方法不存在
5xx:服務器錯誤
500:內部異常
常用方法:
setStatus(int 狀態碼):針對於 1 2 3
瞭解 :
sendError(int 狀態碼):針對於 4xx和5xx
操作響應頭
格式:key/value(value可以是多個值)
常用的方法:
setHeader(String key,String value):設置字符串形式的響應頭
瞭解:setIntHeader(String key,int value):設值整形的響應頭
瞭解:setDateHeader(String key,long value):設值時間的響應頭
addHeader(String key,String value):添加置字符串形式的響應頭 之前設置過則追加,若沒有設置過則設置
瞭解:addIntHeader(String key,int value):添加整形的響應頭
瞭解:addDateHeader(String key,long value):添加時間的響應頭
常用的響應頭:
location:重定向
refresh:定時刷新
content-type:設置文件的mime類型,設置響應流的編碼及告訴瀏覽器用什麼編碼打開
content-disposition:文件下載
重定向:
方式1:
★response.sendRedirect("/demo1/loc2");
方式2:
response.setStatus(302);
respooen.setHeader("location","/demo1/loc2");
定時刷新:
方案1:設置頭 refresh 昨天做過
respooen.setHeader("refresh","秒數;url=跳轉的路徑");
方案2:http的meta標籤
<meta http-equiv="refresh" content="3;url=/demo1/refresh2.html">
// 重定向
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我說:借錢~~");
System.out.println("我又說:找A老師");
//方式1:理解
//設狀態碼 302
//response.setStatus(302);
//設置響應頭
//response.setHeader("location", "/demo1/loc2");
//方式2:重要,訪問完這個servlet後,瀏覽器會跳轉到/demo2/loc2
response.sendRedirect("/demo2/loc2");
}
操作響應體 處理響應中文亂碼:
頁面上要展示的內容
常用方法:
Writer getWriter():字符流
ServletOutputStream getOutputStream() :字節流
自己寫的東西用字符流,其他一概用字節流.
處理響應中文亂碼:
方式1:★
response.setContentType("text/html;charset=utf-8");
方式2:理解
response.setHeader("content-type", "text/html;charset=utf-8");
注意:
兩個流互斥
當響應完成之後,服務器會判斷一下流是否已經關閉,若沒有關閉,服務器會幫我們關閉.(底層使用的緩衝流)
請求轉發和重定向區別
重定向發送兩次請求,請求轉發一次請求
重定向地址欄發生該表,請求轉發不變
重定向是從瀏覽器發送,請求轉發是服務器內部
重定向不存在request域對象,請求轉發可以使用request域對象
重定向是response的方法,請求轉發是request的方法
重定向可以請求站外資源,請求轉發不可以