web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強大

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

request獲得請求行

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

獲得客戶端的請求方式(post,get):String getMethod()

獲得請求的資源:

String getRequestURI() 所有地址,包含本地地址

StringBuffer getRequestURL() 只是網絡資源

String getContextPath() ---web應用的名稱

String getQueryString() ---- get提交url地址後的參數字符串,username=zhangsan&password=123

request獲得客戶機(客戶端)的一些信息,request.getRemoteAddr() --- 獲得訪問的客戶端IP地址

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

可以看出uri和url的區別

通過request獲得請求頭

long getDateHeader(String name)

String getHeader(String name)獲得指定頭的值,返回值為String類型

Enumeration getHeaderNames()獲得所有頭的名字

Enumeration getHeaders(String name)獲得所有name的值,有些name含有多個值

int getIntHeader(String name)獲得指定頭的值,返回值為int類型

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

防盜鏈

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

referer頭的作用:執行該此訪問的的來源,當從某個頁面資源調到某個頁面資源時才會有該頭,顯示是哪個頁面鏈接了該地址,也就是說瀏覽器直接訪問不會產生該頭,因為這不是從一個頁面跳轉到另外一個頁面

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

只要你不是在以http://localhost為頭的鏈接訪問來的,我就不讓你來訪問

通過request獲得請求體

String getParameter(String name)

String[] getParameterValues(String name)獲得所有name為鍵的值,有些一個name對應多個value,比如複選框可以使用這個來獲取所有的參數

Enumeration getParameterNames()獲得所有請求參數的name

Map getParameterMap()獲得所有的請求參數的鍵值對,就算name所對應的值只有一個也要存儲到數組中

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

request是一個域對象

創建:訪問servlet時創建request

銷燬:響應結束request銷燬

request對象也是一個存儲數據的區域對象,所以也具有如下方法:

setAttribute(String name, Object o)

getAttribute(String name)

removeAttribute(String name)

這些方法是常用的,response的域的作用範圍:一次請求中,比如轉發就是一次請求,則A轉發到B,則A中setAttribute,B中也可以getAttribute

request完成請求轉發

獲得請求轉發器----path是轉發的地址

RequestDispatcher getRequestDispatcher(String path)

通過轉發器對象轉發

requestDispathcer.forward(ServletRequest request, ServletResponse response)

舉例

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?

可以看到path直接寫servlet,沒有寫應用名稱/servlet,因為這個不是是客戶端去訪問服務器的地址,就是不是瀏覽器去訪問的地址,而是服務器內部資源的跳轉的地址,總結

客戶端地址:

是客戶端去訪問服務器的地址,服務器外部的地址,特點:寫上web應用名稱,比如:直接輸入地址或者重定向,location.href

服務器端地址:

服務器內部資源的跳轉的地址,特點:不需要寫web應用的名稱,比如轉發

轉發與重定向的區別?

1)重定向兩次請求,轉發一次請求

2)重定向地址欄的地址變化,轉發地址不變

3)重新定向可以訪問外部網站 轉發只能訪問內部資源

4)轉發的性能要優於重定向

轉發不會執行後面的代碼,重定向會執行後面的代碼,所以重定向一般後面加上return

表單提交的數據,都是String類型

get,post請求亂碼問題

因為我們在瀏覽器中寫東西,它會自動編碼,傳輸到servlet,而request無論它用什麼編碼的,request都會自動按照iso8859-1的方式解碼,所以我們從request.getparameter的方式獲取的數據都是解碼好的,這就使得當我們向服務器傳輸中文的時候,會出現亂碼問題

request解決編碼的方式

解決post提交方式的亂碼:request.setCharacterEncoding("UTF-8");

解決get提交的方式的亂碼:

parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

URLEncoder.encode(filename, "UTF-8");

一般表單提交多用post提交

reponse解決編碼的方式

web程序開發:HttpServletRequest是什麼,怎麼用,用在哪?


分享到:


相關文章: