一、原理
1. request和response對象是由服務器創建的。我們來使用它們 (我們不創建,僅僅使用,做IDEA的搬運工)
2. request對象是來獲取請求消息,response對象是來設置響應消息
2. request對象繼承體系結構:
ServletRequest – 接口
繼承 |
HttpServletRequest – 接口
實現 |
rg.apache.catalina.connector.RequestFacade 類(tomcat)
二、方法及功能
方法名 | 作用 |
---|---|
isUserInRole | 判斷認證後的用戶是否屬於某一成員組 |
getAttribute | 獲取指定屬性的值,如該屬性值不存在返回Null |
getAttributeNames | 獲取所有屬性名的集合 |
getCookies | 獲取所有Cookie對象 |
getCharacterEncoding | 獲取請求的字符編碼方式 |
getContentLength | 返回請求正文的長度,如不確定返回-1 |
getHeader | 獲取指定名字報頭值 |
getHeaders | 獲取指定名字報頭的所有值,一個枚舉 |
getHeaderNames | 獲取所有報頭的名字,一個枚舉 |
getInputStream | 返回請求輸入流,獲取請求中的數據 |
getMethod | 獲取客戶端向服務器端傳送數據的方法 |
getParameter | 獲取指定名字參數值 |
getParameterNames | 獲取所有參數的名字,一個枚舉 |
getParameterValues | 獲取指定名字參數的所有值 |
getProtocol | 獲取客戶端向服務器端傳送數據的協議名稱 |
getQueryString | 獲取以get方法向服務器傳送的查詢字符串 |
getRequestURI | 獲取發出請求字符串的客戶端地址 |
getRemoteAddr | 獲取客戶端的IP地址 |
getRemoteHost | 獲取客戶端的名字 |
getSession | 獲取和請求相關的會話 |
getServerName | 獲取服務器的名字 |
getServerPath | 獲取客戶端請求文件的路徑 |
getServerPort | 獲取服務器的端口號 |
removeAttribute | 刪除請求中的一個屬性 |
setAttribute | 設置指定名字參數值 |
1.獲取請求行數據
- GET /Http_Demo_war_exploded/demo1?name=zhangsan HTTP/1.1
- 方法:
①. 獲取請求方式 :GET
* String getMethod()
② 獲取虛擬目錄:/Http_Demo_war_exploded
* String getContextPath()
③. 獲取Servlet路徑: /demo1
* String getServletPath()
④. 獲取get方式請求參數:name=zhangsan
* String getQueryString()
⑤ (*)獲取請求URI:/day14/demo1
* String getRequestURI(): /Http_Demo_war_exploded/demo1
* StringBuffer getRequestURL() :http://localhost/day14/demo1
* URL:統一資源定位符 : http://localhost/day14/demo1 中華人民共和國
* URI:統一資源標識符 : /day14/demo1 共和國
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet........");
String method = req.getMethod(); //獲取請求方式 :GET
System.out.println(method);
String contextPath = req.getContextPath(); //(*)獲取虛擬目錄:/Http_Demo:war exploded
System.out.println(contextPath);
String servletPath = req.getServletPath(); //獲取Servlet路徑: /demo1
System.out.println(servletPath);
String queryString = req.getQueryString(); //獲取get方式請求參數:name=zhangsan
System.out.println(queryString);
String requestURI = req.getRequestURI(); //(*)獲取請求URI:/Http_Demo_war_exploded/demo1
System.out.println(requestURI);
StringBuffer requestURL = req.getRequestURL(); //(*)獲取請求URI:http://localhost/Http_Demo_war_exploded/demo1
System.out.println(requestURL);
String protocol = req.getProtocol(); //獲取協議及版本:HTTP/1.1
System.out.println(protocol);
String remoteAddr = req.getRemoteAddr(); //獲取客戶機的IP地址:0:0:0:0:0:0:0:1
System.out.println(remoteAddr);
}
2.獲取請求頭數據
- 方法:
* String getHeader(String name):通過請求頭的名稱獲取請求頭的值
* Enumeration getHeaderNames():獲取所有的請求頭名稱
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet........");
Enumeration<String> headerNames = req.getHeaderNames(); //獲取所有的請求頭名稱
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
String value = req.getHeader(name);
System.out.println(name+"---"+value);
}
}
運行結果:
獲取瀏覽器型號:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet........");
String agent = req.getHeader("user-agent");
if(agent.contains("Firefox")){
System.out.println("火狐來了");
}else if(agent.contains("Chrome")){
System.out.println("谷歌來了");
}
}
假設我做了一個電影網站,我花了300W打廣告,某度,某浪,和某狐各100W,但是我想知道哪裏來的訪問量最多,這個時候我們就可以通過referer來統計各個網站來的訪客數量。
而作爲優酷,我爲了防止被盜取資源,所以要判斷你是從哪個網站來的?如果不是從優酷首頁進來的,我就不給你播放。
防盜鏈方法:防止其他網站盜取資源
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet........");
String referer = req.getHeader("referer");
if(referer.contains("/demo4")){
System.out.println("正常播放");
}else{
System.out.println("想看嗎?來優酷啊");
}
}
3.獲取請求體數據
- 請求體:只有POST請求方式,纔有請求體,在請求體中封裝了POST請求的請求參數
- 步驟:
①. 獲取流對象
* BufferedReader getReader():獲取字符輸入流,只能操作字符數據(高效)
* ServletInputStream getInputStream():獲取字節輸入流,可以操作所有類型數據
* 在文件上傳知識點後講解
②. 再從流對象中拿數據
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost.......");
BufferedReader reader = req.getReader(); //1.獲取字符流
String line = null;
while((line = reader.readLine()) != null){ //2.讀取數據
System.out.println(line);
}
}
4.其他功能
①. 獲取請求參數通用方式:不論get還是post請求方式都可以使用下列方法來獲取請求參數
- String getParameter(String name):根據參數名稱獲取參數值 username=zs&- password=123
- String[] getParameterValues(String name):根據參數名稱獲取參數值的數組 hobby=xx&hobby=game
- Enumeration getParameterNames():獲取所有請求的參數名稱
- Map<String,String[]> getParameterMap():獲取所有參數的map集合
②請求轉發:一種在服務器內部的資源跳轉方式
瀏覽器訪問AServlet,A發現沒有瀏覽器找的資源,但是知道B那裏有,所以轉發給B
步驟:
- 通過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher對象來進行轉發:forward(ServletRequest request, ServletResponse response)
特點:
- 瀏覽器地址欄路徑不發生變化
- 只能轉發到當前服務器內部資源中。
- 轉發是一次請求
@WebServlet("/demo8")
public class http_demo8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo8被訪問了");
/* RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo9");
requestDispatcher.forward(req,resp);*/
//轉發
req.getRequestDispatcher("/demo9").forward(req,resp);
}
}
③共享數據:A完成後需要告知B已經完成到哪了
- 域對象:一個有作用範圍的對象,可以在範圍內共享數據
- request域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享數據
- 方法:
- void setAttribute(String name,Object obj):存儲數據
- Object getAttitude(String name):通過鍵獲取值
- void removeAttribute(String name):通過鍵移除鍵值對
@WebServlet("/demo8")
public class http_demo8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo8被訪問了");
//存儲數據到request中
req.setAttribute("msg","hello");
req.getRequestDispatcher("/demo9").forward(req,resp);
}
}
@WebServlet("/demo9")
public class http_demo9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設置流的字符編碼
System.out.println("Demo9被訪問了");
//獲取demo8的傳送數據
Object msg = req.getAttribute("msg");
System.out.println(msg);
}
}