service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強大
request獲得請求行
獲得客戶端的請求方式(post,get):String getMethod()
獲得請求的資源:
String getRequestURI() 所有地址,包含本地地址
StringBuffer getRequestURL() 只是網絡資源
String getContextPath() ---web應用的名稱
String getQueryString() ---- get提交url地址後的參數字符串,username=zhangsan&password=123
request獲得客戶機(客戶端)的一些信息,request.getRemoteAddr() --- 獲得訪問的客戶端IP地址
可以看出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類型
防盜鏈
referer頭的作用:執行該此訪問的的來源,當從某個頁面資源調到某個頁面資源時才會有該頭,顯示是哪個頁面鏈接了該地址,也就是說瀏覽器直接訪問不會產生該頭,因為這不是從一個頁面跳轉到另外一個頁面
只要你不是在以http://localhost為頭的鏈接訪問來的,我就不讓你來訪問
通過request獲得請求體
String getParameter(String name)
String[] getParameterValues(String name)獲得所有name為鍵的值,有些一個name對應多個value,比如複選框可以使用這個來獲取所有的參數
Enumeration getParameterNames()獲得所有請求參數的name
Map
getParameterMap()獲得所有的請求參數的鍵值對,就算name所對應的值只有一個也要存儲到數組中
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)
舉例
可以看到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解決編碼的方式
閱讀更多 幻風的編程日記 的文章