HttpServletRequest與HttpServletResponse作為Servlet中doGet、doPost等方法中傳遞的參數,承接了Http請求與響應中的大部分功能,請求的解析與響應的返回都需要靠這兩個對象進行,他們中的所有方法及功能在下邊總結了一下,希望能對學習Java Web開發有所幫助。
1、HttpServletRequest:
/* * 記錄各個request.get的值 * request.getAsyncContext();AsyncContext * 獲取異步傳輸的文本內容 * request.getAttribute(String);Object * Attribute與Parameter不同,Attr是在程序里用SetA設置進去的,而Par是接收網頁的參數 * 多用於session的設值,session.setA,可以設置自己的類型,getP只能接收String,而getA可以為object * request.getAttributeNames();Enumeration<String> * 獲取一個枚舉類型,hasmoreelement,nextelement * request.getAuthType();String * 返回身份驗證方法的名稱,basic,SSL,form,client_cert和digest,若沒有身份驗證則為null * AuthType可在web.xml中配置,使用<login-config><auth-method>xx<real-name>xxx來配置 * 一般用於遠程網頁鏈接,即輸入網頁地址,彈出一個登陸界面,那里的時候才會用 * 讀取文件頭中的Authorization信息 * request.getCharacterEncoding();String * 返回網頁使用的編碼,在網頁的charset中的值 * request.getContentLength();int * 只用於POST請求,表示所發送數據的字節數 * request.getContentLengthLong();long * 同上,用於數據量非常大時,long八個字節 * request.getContentType();String * 獲取content-type,包括編碼。<meta content="text/html; charset=gb2312" http-equiv="Content-Type"/> * Content-Type,用於定義網絡文件的類型和網頁的編碼,決定瀏覽器將以什么形式、什么編碼讀取這個文件 * request.getContextPath();String * 獲取項目的根目錄名,如本項目應該是/MyTestWeb。返回指定servlet上下文(web應用)的URL的前綴。 * 用絕對路徑時,可以使用getRealPath()(不推薦),request.getSession().getServletContext().getRealPath("/") * request.getCookies();Cookie[] * 很明顯,返回網頁的cookies,數組形式cookie是名稱+值的形式保存的 * request.getDateHeader("String");long * 用於將指定頭信息的部分轉換成方便轉換為時間類型的長整數型,簡化getHeaders * request.getDispatcherType();DispatcherType * 未知... * request.getHeader("headname");String * 獲取指定頭信息 * request.getHeaderNames();Enumeration<String> * 獲取名字的枚舉,用於遍歷 * request.getHeaders("headersname");Enumeration<String> * 獲取一個name的多個值序列,返回請求給出的指定類型的所有HTTP頭標的名稱的枚舉值,它對具有多取值的頭標非常有用。 * request.getInputStream();ServletInputStream繼承自io.InputStream * 獲取請求內容,可以獲取post方法在網頁中通過send傳遞的內容,但是要通過InputStreamReader實例化 * 同時InputStreamReader也不能直接被讀取為字符串,要使用BufferedReader實例化InputStreamReader * 之后就可以使用BufferedReader的readline來獲取中間的數據了。 * 或者直接使用InputStream的read方法寫給read的參數,byte數組 * 該方法只能讀取一次,因為是流,所以讀完就沒了 * request.getIntHeader("head");int * 從頭內容獲取數值 * request.getLocalAddr();String * 獲取本地地址,根據訪問方法不同而不同,為127.0.0.1或者公網ip * request.getLocale();Locale(util中) * 獲取本地位置信息,若ZHCN等等 * request.getLocales();Enumeration<Locale> * 有多個位置信息時獲取枚舉 * request.getLocalName();String * 獲取本地IP的名稱,如127.0.0.1就是localhost * request.getLocalPort();int * 獲取端口號,本應用就是8081 * request.getMethod();String * 獲取Http方法,有get,head,put,delete,post,options * request.getParameter("code");String * 獲取提交參數,即網址?后面的內容,一一對應關系。即便是POST,這個也只能獲取?后面的參數 * POST與GET的不同是可以send里面寫內容,網址里面傳遞的參數還是一樣的 * request.getParameterMap();Map<String,String[]> * 返回類型是String[]的原因是參數名稱有可能相同,如果用getPara返回同名參數多個值的會把各個值結合起來 * PS:遍歷Map的方法,Set<Entry<String, String[]>> set = map.entrySet();先獲取EntrySet * 然后獲取EntrySet的迭代器Iterator<Entry<String, String[]>> it = set.iterator(); * 接着使用迭代的getNext來獲取各個元素Entry<String, String[]> entry = it.next(); * 最后使用Entry.getvalue獲取字符串數組 * request.getParameterNames();Enumeration<String> * 獲取參數名的枚舉 * request.getParameterValues("code");String[] * 獲取同名參數的多個值 * request.getPart("file");Part * 用於上傳文件,一個Part為一個文件,mime類型為multipart/form-data * 程序中需要添加@MultipartConfig注解 * request.getParts();Collection<Part> * 獲取一個Part的集合,用於上傳多個文件 * request.getPathInfo();String * 返回在URL中指定的任意附加路徑信息。不帶參數,一般是相對於Servlet的路徑 * pathinfo返回的字符串是經過Servlet服務器URL Decode過的。 * 輸出:URL中Servlet路徑之后、查詢字符串之前的那部分。 * request.getPathTranslated();String * 映射到服務器實際路徑之后的路徑信息。 * request.getProtocol();String * 獲取協議信息和版本號,即HTTP/1.1 * request.getQueryString();String * 這是字符串形式的附加到URL后面的查詢字符串,數據仍舊是URL編碼的。 * 在Servlet中很少需要用到未經解碼的數據,一般使用getParameter訪問各個參數。 * request.getReader();BufferedReader * 獲取BufferedReader,和inputStream那一大堆獲取的內容一樣。。。 * request.getRealPath("/");String * 獲取絕對路徑,被廢棄了,請使用request.getSession().getServletContext().getRealPath("/") * request.getRemoteAddr();String * 客戶端的IP * request.getRemoteHost();String * 客戶端的主機名 * request.getRemotePort();int * 客戶端的端口號 * request.getRemoteUser();String * 客戶端的用戶名 * request.getRequestDispatcher("");RequestDispatcher * 請求轉發,獲取請求過來的地址,與該地址共享一個Request * request.getRequestedSessionId();String * 返回這個請求相應的session id * request.getRequestURI();String * 獲得請求URL,不包含請求內容,不包含域名 * request.getRequestURL();StringBuffer * 獲取URL,包含域名,不包含請求內容 * 未被Servlet服務器URL Decode過。 * request.getScheme();String * 返回協議名稱,http * request.getServerName();String * 獲得服務器名,本地IP * request.getServerPort();int * 獲取服務器端口號 * request.getServletContext();ServletContext * 獲取該Servlet的相關信息,getServletConfig().getServletContext().getServerInfo() * request.getServletPath();String * URL中調用Servlet的那一部分,不包含附加路徑信息和查詢字符串。 * request.getSession();HttpSession * 獲取Session對話,用於與網頁通信,很有用 * equest.getSession(boolean);HttpSession * request.getSession(true):若存在會話則返回該會話,否則新建一個會話。 * request.getSession(false):若存在會話則返回該會話,否則返回NULL * request.getUserPrincipal();Principal * 返回一個java.security.Principal 對象,該對象包含當前授權用戶的名稱 * 使用request.getUserPrincipal().getName()得到用戶名 * 沒有通過認證就沒有返回值,是用戶登錄后才有值的,通過了JAAS認證,也就是登錄 * * request.authenticate(HttpServletResponse response);boolean * 證明是真實的、可靠的或有效的;鑒定,使生效 * request.changeSessionId();String * Change the session id of the current session associated with this request and return the new session id. * request.isAsyncStarted();boolean * 異步傳輸是否開始 * request.isAsyncSupported();boolean * 是否支持異步傳輸 * isRequestedSessionIdFromCookie();boolean * SessionId是否是從cookies中獲得的 * request.isRequestedSessionIdFromUrl();boolean * SessionId是否是從URL中獲取的,已廢棄 * request.isRequestedSessionIdFromURL();boolean * 同上,這個沒廢棄 * request.isRequestedSessionIdValid();boolean * 檢查SessionId是否是有效的 * request.isSecure();boolean * 是否是安全的,即是否使用了安全協議,如https * request.isUserInRole("role");boolean * 判斷用戶是否是某個種類的角色,類型可以在web.xml中配置(tomcat-users.xml) * request.login("user", "password");void * 使用用戶名和密碼進行登錄 * request.logout();void * 用戶登出 * request.notify();request.notifyAll();void * 用於線程操作,詳細見教材 * request.removeAttribute("at");void * 刪除某個屬性值,對應set * request.setAttribute("at", request);void * 設置某個屬性值 * request.setCharacterEncoding("utf-8");void * 設置獲取各個字符時使用的編碼方式,應與網頁的編碼方式一樣 * 僅僅只適用於設置post提交的request body的編碼而不是設置get方法提交的queryString的編碼。 * 該方法告訴應用服務器應該采用什么編碼解析post傳過來的內容。 * request.startAsync(request, response);void * 開始異步傳輸,可以不帶參數 * request.upgrade();void * 開始更新? * request.wait(12); * 實現了線程的類都有該方法,用於等待 */
2、HttpServletResponse
/* * response對象 * response.addCookie(new Cookie("a","aa"));void * 增加cookie * response.addDateHeader("date", 23456789l);void * 在頭部增加日期 * response.addHeader("asf", "sff");void * 增加頭部信息 * response.addIntHeader("fsf", 12);void * 在頭部增加數值類型 * response.encodeRedirectUrl("utf-8");廢棄 * response.encodeRedirectURL("utf-8");String * 通過指定的編碼對URL進項編碼,並攜帶sessionid,跨應用 * response.encodeUrl("utf-8");廢棄 * response.encodeURL("utf-8");String * 通過指定的編碼對URL進項編碼,並攜帶sessionid,本應用 * 假如有sessionId,且不是從cookie中獲得的,就放到url尾部,否則直接返回原url。 * response.flushBuffer();vodi * 立即發送緩沖區字符給客戶端即瀏覽器 * response.getBufferSize();int * 獲取緩沖區大小 * response.getCharacterEncoding();String * 獲取編碼類型 * response.getContentType();String * 獲取Content的MIME類型和編碼 * response.getHeaderNames();Collection<String> * 獲取所有Header的name列表 * response.getHeaders("aa");Collection<String> * 獲取所有aa的頭的值列表 * response.getLocale();Locale * 獲取本地信息,如zhcn * response.getOutputStream();ServletOutputStream繼承自OutputStream * 獲取輸出流,和inputStream對應,bufferedReader和printWriter對應 * response.getStatus();int * 獲取response的狀態碼,有200,301,404,500 * response.getWriter();PrintWriter * 獲取一個PrintWriter,用於向response返回數據,從而向客戶端返回數據,比Stream使用方便 * response.isCommitted();boolean * 調用PrintWriter對象的close()方法關閉底層輸出流,方法在關閉輸出流之前會先把緩沖區內的數據提交到客戶端。 * 因此在調用PrintWriter 對象的 close()方法之前,response.isCommitted()方法返回 false; * 而在調用PrintWriter對象的close()方法之后,response.isCommitted()方法返回true。 * response.reset();void * 清除buffer,設置頁面不緩存,同時清除狀態碼和頭,如果已經發送數據則跑出異常 * response.resetBuffer();void * 只清除buffer * response.sendError(1,"123");void * response.sendError(123); * response.sendError(1,"123"); * setStatus方法用來設置Servlet向客戶端返回的狀態碼,它用來設置沒有出錯的狀態。 * 如果Servlet運行出錯,Servlet可以使用sendError方法設置狀態碼, * 如sendError(int sc)方法設置錯誤狀態代碼。sendError(int sc,String msg)方法除了設置狀態碼 * 還向客戶發出一條錯誤信息。 * response.sendRedirect("xx.html"); * 返回一個重定向,並把新的request與response交給重定向的頁面進行處理 * sendRedirect方法向客戶發出臨時重新導向的響應。它生成的響應狀態碼為302。 * 該響應給了客戶一個新的URL分區。如果緩沖器已經被清空,這個方法會彈出一個IllegalStateException例外。 * response.setBufferSize(123); * 設置緩沖區大小 * response.setCharacterEncoding("utf-8"); * 設置字符編碼 * response.setContentLength(123); * 設置返回內容的長度,在header中也有 * response.setContentLengthLong(1345l); * 長度非常長是使用 * response.setContentType("dfd"); * 設置ContentType,包括編碼和類型信息 * 網頁的Http頭中ContentType("text/html; charset=GBK")的作用: * 告訴瀏覽器網頁中數據是什么編碼\ * 表單提交時,通常瀏覽器會根據ContentType指定的charset對表單中的數據編碼,然后發送給服務器的。 * 這里需要注意的是:這里所說的ContentType是指http頭的ContentType,而不是在網頁中meta中的ContentType。 * response.setDateHeader("asd", 123l); * 修改日期頭 * response.setHeader("sfds", "sdfsdf"); * 修改頭 * response.setIntHeader("sf", 3123); * 設置數值頭 * response.setLocale(locale ); * 設置本地環境 * response.setStatus(1); * 設置Http狀態碼,為出錯的情況用 * response.setStatus(12, "dasd"); * 設置狀態碼並帶一條消息 * * * */
3、用於測試的代碼
AsyncContext async = request.getAsyncContext(); String attribute = (String) request.getAttribute("code"); Enumeration<String> enumer = request.getAttributeNames(); String authtype = request.getAuthType(); String character = request.getCharacterEncoding(); int len = request.getContentLength(); long lenl = request.getContentLengthLong(); String contenttype = request.getContentType(); String contextpath = request.getContextPath(); Cookie[] cook = request.getCookies(); long dataHeader = request.getDateHeader(""); DispatcherType dispatcher = request.getDispatcherType(); String header = request.getHeader("headname"); Enumeration<String> headernames = request.getHeaderNames(); Enumeration<String> headersname = request.getHeaders("headersname"); ServletInputStream ins = request.getInputStream(); int i = request.getIntHeader("head"); String add = request.getLocalAddr(); Locale locale = request.getLocale(); Enumeration<Locale> locales = request.getLocales(); String localname = request.getLocalName(); int port = request.getLocalPort(); String method = request.getMethod(); String codep = request.getParameter("code"); Map<String,String[]> map = request.getParameterMap(); Enumeration<String> Pnames = request.getParameterNames(); String[] values = request.getParameterValues("code"); Part pa = request.getPart("file"); Collection<Part> pas = request.getParts(); String pathin = request.getPathInfo(); String trans = request.getPathTranslated(); String protoc = request.getProtocol(); String query = request.getQueryString(); BufferedReader br = request.getReader(); String rp = request.getRealPath("/"); String ra = request.getRemoteAddr(); String rh = request.getRemoteHost(); int rport = request.getRemotePort(); String ru = request.getRemoteUser(); RequestDispatcher rd = request.getRequestDispatcher(""); String rsi = request.getRequestedSessionId(); String uri = request.getRequestURI(); String scheme = request.getScheme(); String servern = request.getServerName(); int sport = request.getServerPort(); ServletContext scon = request.getServletContext(); String spath = request.getServletPath(); HttpSession session1 = request.getSession(); HttpSession session2 = request.getSession(true); Principal prc = request.getUserPrincipal(); boolean authe = request.authenticate(response);//證明是真實的、可靠的或有效的;鑒定,使生效 String cs = request.changeSessionId(); boolean iss = request.isAsyncStarted(); boolean isss = request.isAsyncSupported(); boolean issr = request.isRequestedSessionIdFromCookie(); boolean irsi = request.isRequestedSessionIdFromUrl(); boolean irss = request.isRequestedSessionIdFromURL(); boolean isiv = request.isRequestedSessionIdValid(); boolean isivs = request.isSecure(); boolean isr = request.isUserInRole("role"); request.login("user", "password"); request.logout(); request.notify(); request.notifyAll(); request.removeAttribute("at"); request.setAttribute("at", request); request.setCharacterEncoding("utf-8"); request.startAsync(); request.startAsync(request, response); //request.upgrade(); response.addCookie(new Cookie("a","aa")); response.addDateHeader("date", 23456789l); response.addHeader("asf", "sff"); response.addIntHeader("fsf", 12); boolean ch = response.containsHeader("asf"); String eru = response.encodeRedirectUrl("utf-8"); String eru1 = response.encodeRedirectURL("utf-8"); String eu = response.encodeUrl("utf-8"); String eu1 = response.encodeURL("utf-8"); response.flushBuffer(); int bs = response.getBufferSize(); String ge = response.getCharacterEncoding(); String cont = response.getContentType(); String se = response.getHeader("aa"); Collection<String> ghn = response.getHeaderNames(); Collection<String> ghn1 = response.getHeaders("aa"); Locale sss = response.getLocale(); ServletOutputStream ost = response.getOutputStream(); int rs = response.getStatus(); PrintWriter writer1 = response.getWriter(); boolean isc = response.isCommitted(); response.reset(); response.resetBuffer(); response.sendError(1,"123"); response.sendError(123); response.sendRedirect("xx.html"); response.setBufferSize(123); response.setCharacterEncoding("utf-8"); response.setContentLength(123); response.setContentLengthLong(1345l); response.setContentType("dfd"); response.setDateHeader("asd", 123l); response.setHeader("sfds", "sdfsdf"); response.setIntHeader("sf", 3123); response.setLocale(locale ); response.setStatus(1); response.setStatus(12, "dasd");
上面的內容只是作為總結,並沒有說明各個方法的作用以及取出來的對象的作用,比如說Session,是一個很有用的對象,要知道他的用法,請看后面的博文。
關於Http客戶端,即瀏覽器發送請求及接受響應的各部分內容,請參考后面的博文。