HttpServletRequest和HttpServletResponse
Web服務器收到一個http請求,會針對每個請求創建一個HttpServletRequest和HttpServletResponse對象,向客戶端發送數據找HttpServletResponse,從客戶端取數據找HttpServletRequest.
HTTP 協議是基於請求-響應的協議,客戶端請求一個文件,服務器對該請求進行響應。HTTP 使用 TCP 協議,默認使用 80 端口。最初的
HTTP 協議版本是 HTTP/0.9,後被 HTTP/1.0 替代。目前使用的版本是 HTTP/1.1,在 HTTP
協議中,總是由主動建立連接、發送 HTTP
請求的客戶端來初始化一個事務。服務器不負責連接客戶端,或創建一個到客戶端的回調連接(callback connection)。
HttpServletRequest
公共接口類HttpServletRequest繼承自ServletRequest.客戶端瀏覽器發出的請求被封裝成爲一個HttpServletRequest對象。所有的信息包括請求的地址,請求的參數,提交的數據,上傳的文件客戶端的ip甚至客戶端操作系統都包含在其內。
常用方法
1.獲得客戶機信息
getRequestURL方法返回客戶端發出請求時的完整URL。
getRequestURI方法返回請求行中的資源名部分。
getQueryString 方法返回請求行中的參數部分。
getRemoteAddr方法返回發出請求的客戶機的IP地址
getRemoteHost方法返回發出請求的客戶機的完整主機名
getRemotePort方法返回客戶機所使用的網絡端口號
getLocalAddr方法返回WEB服務器的IP地址。
getLocalName方法返回WEB服務器的主機名
getMethod得到客戶機請求方式
getServerPath()獲取請求的文件的路徑
2.獲得客戶機請求頭
getHeader(string name)方法
getHeaders(String name)方法
getHeaderNames方法
3.獲得客戶機請求參數(客戶端提交的數據)
getParameter(name)方法 獲取請求中的參數,該參數是由name指定的 getParameterValues(String
name)方法 獲取指定名稱參數的所有值數組。它適用於一個參數名對應多個值的情況。如頁面表單中的複選框,多選列表提交的值。getParameterNames方法
返回一個包含請求消息中的所有參數名的Enumeration對象。通過遍歷這個Enumeration對象,就可以獲取請求消息中所有的參數名。getCharacterEncoding() 返回請求的字符編碼方式
getAttributeNames()返回當前請求的所有屬性的名字集合賦值:setAttribute()
getAttribute(String name) 返回name指定的屬性值
getsession()返回和客戶端相關的session,如果沒有給客戶端分配session,則返回null
getParameterMap():返回一個保存了請求消息中的所有參數名和值的Map對象。Map對象的key是字符串類型的參數名,value是這個參數所對應的Object類型的值數組
RequestDispatcher.forward
方法的請求轉發過程結束後,瀏覽器地址欄保持初始的URL地址不變。方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行爲。request.setCharacterEncoding(“utf-8”);
getReader() 獲取請求體的數據流
getInputStream() 獲取請求的輸入流中的數據
通過輸入輸出流獲取 :getInputStream() 和 getReader()
在讀取的時候通過流對象.read()方法讀取
出現亂碼的原因和解決
1.Java程序中默認的是中文字符----unicode
2.系統會把在java程序中的unicode字符按照某種字符集編碼的方式轉換成字節數組,再通過瀏覽器輸出,瀏覽器在輸出的時候要進行解碼,只有在這兩種方式一樣的情況下,纔不會出現亂碼。
注:
(1)某種字符編碼是用reponse對象去設置的,而且必須是在out.println之前使用,要不會出現錯誤,會拋找不到
設置的字符編碼而出錯。
設置編碼的兩種方式:
response.setContentType(“text/html;charset=utf-8”);
request.setCharacterEncoding(“utf-8”);
(2)瀏覽器會把字節數組轉換成字符
系統默認的編碼方式爲ISO8859-1,如果沒有指定字符編碼,則輸出的都是亂碼,而且ISO8859-1不支持中文,所以不管瀏覽器在解碼的時候用的是什麼字符集編碼,在瀏覽器上的都是亂碼。
Post方式提交出現亂碼
請求中之所以會產生亂碼,就是因爲服務器和客戶端溝通的編碼不一致造成的,因此解決的辦法是:在客戶端和服務器之間設置一個統一的編碼,之後就按照此編碼進行數據的傳輸和接收。
解決辦法:由於客戶端是以UTF-8字符編碼將表單數據傳輸到服務器端的,因此服務器也需要設置以UTF-8字符編碼進行接收,要想完成此操作,服務器可以直接使用從ServletRequest接口繼承而來的"setCharacterEncoding(charset)"方法進行統一的編碼設置。使用request.setCharacterEncoding(“UTF-8”);設置服務器以UTF-8的編碼接收數據後,此時就不會產生中文亂碼問題了
request.setCharacterEncoding("UTF-8");
Get方式提交出現亂碼
對於以get方式傳輸的數據,request即使設置了以指定的編碼接收數據也是無效的,默認的還是使用ISO8859-1這個字符編碼來接收數據,客戶端以UTF-8的編碼傳輸數據到服務器端,而服務器端的request對象使用的是ISO8859-1這個字符編碼來接收數據,服務器和客戶端溝通的編碼不一致因此纔會產生中文亂碼的。
解決辦法:在接收到數據後,先獲取request對象以ISO8859-1字符編碼接收到的原始數據的字節數組,然後通過字節數組以指定的編碼構建字符串,解決亂碼問題。
//接收數據
String name = request.getParameter("name");
//獲取request對象以ISO8859-1字符編碼接收到的原始數據的字節數組,然後通過字節數組以指定的編碼構建字符串,解決亂碼問題
name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;