服務器根據請求自動創建傳入HttpServletRequest對象和HttpServletResponse對象
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ……處理代碼 } |
HttpServletRequest(請求)
處理請求行(http:\localhost:8080\pro\haha?name=zs&age=18)
getRequestURL() 獲取?前的路徑 (http:\localhost:8080\pro\haha)
getRequestURI() 獲取站點名到?前的路徑 (pro\haha)
getQueryString() 獲取請求參數(name=zs&age=18)
getMethod() 獲取請求類型(get post)
其他:getProtocol獲取http版本號,getContexPath獲取webapp名(項目名)
處理請求頭
getHeader(String) 獲取單個請求頭內容 string為key值不區分大小寫
getHeaderName() 獲取請求頭名的枚舉集合通過Enumeration<String>接收
獲取請求參數
getParameter(“key”) 獲取客戶端上傳的參數
getParameterValues(“key”) 若一個key對應多個值(多選框等)返回數組對象
getParameterNames() 獲取所有請求參數的名稱, 枚舉類集合接收
getParametermap() 獲取所有請求參數,Map<String,String[]>接收
設置請求的參數(用於對象傳遞中使用)
setAttribute(“key”,value) 設置域對象內容
getAttribute(“key”) 獲取域對象內容
removeAttribute(“key”) 刪除域對象內容
解決請求參數亂碼問題
request接收的參數,在解析過程中使用了默認的編碼方式為 (ISO-8859-1)不支持中文
post請求在Tomcat中都存在報錯,get在Tomcat7中存在報錯
解決方式
post解決方式
request.setCharacterEncoding("UTF-8") 直接設置解析編碼 對get無效
get解決
new String(request.getParameter(key).getBytes("ISO-8859-1"),"UTF-8")
只能一次處理一個參數值的編碼錯誤
若參數本身無編碼錯誤,反而會造成編碼錯誤
請求轉發
用於服務內部的資源跳轉,瀏覽器的地址不會變更
request.getRequestDispatcher(“目標資源”).forward(request,response)
指定轉發路徑,並傳遞請求對象和響應對象.實現對象共享.
目標資源使用外部訪問名
request 作用域只在一次請求中有效中有效,包含請求轉發
HttpServletResponse(響應)
處理響應頭
addHeader(“key”, “value”) 增加響應頭參數
setHeader(“key”, “value”) 設置響應頭參數
設置自動刷新或重定向(不設url可自刷新)
setHeader("refresh", "3;http://www.baidu.com") 3秒后刷新至百度
sendError(500, “錯誤描述”) 設置頁面報錯(響應頭)
輸出響應數據
setContentType(“參數;參數”) 設置響應數據類型和編碼格式
參數在Tomcat 的 web.xml 文件中<mime-mapping>查找獲取
text/html類型為html類型
image/jpeg響應jpg圖片
getOutputStream() 獲取輸出的字節流
getWriter() 獲取輸出的字符流
注: 兩個流不能同時使用 否者報錯(java.lang.IllegalStateException)
流需要關閉.close()
常用文本輸出getWriter().write("輸出文本")
sendRedirect(“url”) 重定向
服務器指導客戶端的行為,客戶端根據重定向立即重新請求對應的數據
http://www.baidu.com或者 端口之后的絕對路徑/相對
亂碼處理
服務器響應的數據編碼與客戶端解析編碼方式存在差異
setContentType("text/html;charset=UTF-8")
設置響應頭中數據類型和編碼類型
響應圖片
獲取當前項目路徑,獲取圖片的絕對路徑
拼接得到圖片完整路徑,生成file, io傳輸
String realPath = getServletContext().getRealPath("/")
獲取項目在服務器中的真實路徑
String filePath = realPath + "/WEB-INF/images/jay.jpg"
獲取圖片路徑,並完成拼接
File file = new File(filePath)
獲取文件
請求轉發和重定向區別
請求轉發
request.getRequestDispatcher(“url”).forward(request,response)
返回請求地址欄不發生改變,只執行一次請求
服務端內部跳轉, request作用域共享,
轉發對象為當前項目資源()
地址站點名后的不完全路徑,從項目名之后開始
重定向
1、地址欄發生改變 2、客戶端跳轉 3、存在兩次請求request作用域不共享
4、指定任意地址,可跨域 若是本服務內容 地址從端口號之后開始
路徑問題
相對路徑 相對於當前資源的路徑開頭不設/
絕對路徑(完整路徑)
1完整絕對路徑
以 http://開頭的,能夠跨域
2部分絕對路徑
以"/"開頭,從當前域名|IP|主機后的端口號開始的
"/"的含義:
請求轉發:
代表的是 http://localhost:8080/站點名/
重定向(客戶端跳轉):
代表的是 http://localhost:8080/