web筆記五:request和response

前面已經說到,當客戶端向服務器發起請求時,容器會將請求有關的信息封裝成一個HttpServletRequest,將輸出信息封裝成一個HttpServletResponse。

一、 HttpServletRequest對象

其中最常用的就是獲取參數,不過現在有了spring和struct,就很少直接使用這個方法了。

System.out.println("parameter name:"+request.getParameter("name"));

獲取請求的信息

System.out.println("uri:"+request.getRequestURI());
System.out.println("context path:"+request.getContextPath());
System.out.println("servlet path:"+request.getServletPath());
System.out.println("path info:"+request.getPathInfo());
System.out.println("Scheme:"+request.getScheme());
System.out.println("請求方式:"+request.getMethod());
System.out.println("ServerPort:"+request.getServerPort());
System.out.println("LocalPort:"+request.getLocalPort());

System.out.println("url:"+request.getRequestURL());
//post請求需要用到request.getInputStream()從請求體拿到參數字符串
//get請求使用request.getInputStream()拿不到任何東西
System.out.println("URL問號(?)後面的參數字符串:"+request.getQueryString());

獲取客戶端信息

System.out.println("瀏覽器信息:"+request.getHeader("User-Agent"));
System.out.println("RemoteHost:"+request.getRemoteHost());
System.out.println("RemoteAddr():"+request.getRemoteAddr());
System.out.println("RemotePort:"+request.getRemotePort());

獲取session和cookie信息

Cookie[] cookies = request.getCookies();
HttpSession session = request.getSession();

其他

request.getRequestDispatcher("").forward(request, response);//轉發

首先我們來看下getRequestURI和getRequestURL的區別,Request URI = context path + servlet path + path info,不包含協議(scheme)和主機(host)信息(但我看API有說明在http1.0中get請求會返回全路徑),所以,如果我們需要獲取全路徑,則最好調用getRequestURL。

contextPath是web應用名稱,servletPath和pathInfo在<url-pattern></url-pattern>設置爲/*或/會有區別。假設我們的contextPath爲helloweb,請求http://localhost:8080/helloweb/abc

設置<url-pattern>/*</url-pattern>時:

servlet path:
path info:/abc

設置<url-pattern>/</url-pattern>時:

servlet path:/abc
path info:null

由此可以看出,url-pattern爲/時pathInfo爲null,url-pattern爲/*時servletPath爲空(不是null)

getServerPort和getLocalPort:
在一般情況下getServerPort和getLocalPort是一樣的,區別就在於ServerPort就是URL中的host裏冒號(:)後面的部分,是明顯可以確定的,但是LocalPort是請求實際到達的端口,有時候不一定跟ServerPort相同。

關於獲取客戶端信息的getRemoteXXX方法,拿到的不一定是發起請求的客戶端的信息,如果中間經過代理(例如Apache,Squid,Nginx等反向代理軟件)的話,返回的信息是最後一個代理服務器的。獲取真實的客戶端的信息在這裏就不闡述了,有需要的可以找度娘。

二、HttpServletResponse對象

輸出:

PrintWriter writer = response.getWriter();//字符流
ServletOutputStream outputStream = response.getOutputStream();//字節流

設置編碼(防止亂碼)

response.setCharacterEncoding("utf-8");
response.setHeader("contentType", "text/html; charset=utf-8");
//相當於執行上面兩條
response.setContentType("text/html;charset=UTF-8");

會話保持

String encodeURL=response.encodeRedirectURL(url);//返回值僅用於sendRedirect
response.sendRedirect(encodeURL);
response.encodeURL("");

設置header、cookie

//下載文件
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
//設置cookie
response.addCookie(cookie);

關於response.setContextType(),默認爲html/text,點擊這裏查看更多的MIME類型。

對於sendRedirect來說,如果客戶端禁用了cookie,爲了保持會話,我們需要先使用encodeRedirectURL對URL進行處理,此時處理後的URL後面會自動拼接加上jsessionid信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章