1. 程式人生 > >HttpServletRequest對象小結

HttpServletRequest對象小結

ctp enc map() tomcat安裝 沒有 ont 組件 rec 對象類型

當客戶端通過HTTP協議訪問服務器時,請求所有信息都封裝在HttpServletRequest對象中,可通過它獲取到請求的所有信息,其常用方法如下:

  getRequestURL方法返回客戶端發出請求時的完整URL。
  getRequestURI方法返回請求行中的資源名部分。
  getQueryString 方法返回請求行中的參數部分。
  getPathInfo方法返回請求URL中的額外路徑信息。額外路徑信息是請求URL中的位於Servlet的路徑之後和查詢參數之前的內容,它以“/”開頭。
  getRemoteAddr方法返回發出請求的客戶機的IP地址。
  getRemoteHost方法返回發出請求的客戶機的完整主機名。

  getRemotePort方法返回客戶機所使用的網絡端口號。
  getLocalAddr方法返回WEB服務器的IP地址。
  getLocalName方法返回WEB服務器的主機名。

  getHeader(string name)方法:String
  getHeaders(String name)方法:Enumeration
  getHeaderNames()方法

  • getParameter(String)方法(常用)
  • getParameterValues(String name)方法(常用)
  • getParameterNames()方法(不常用)
  • getParameterMap()方法(編寫框架時常用)
  • setAttribute(String name,Object o)方法,將數據作為request對象的一個屬性存放到request對象中,例如:request.setAttribute("data", data);
  • getAttribute(String name)方法,獲取request對象的name屬性的屬性值,例如:request.getAttribute("data")
  • removeAttribute(String name)方法,移除request對象的name屬性,例如:request.removeAttribute("data")
  • getAttributeNames方法,獲取request對象的所有屬性名,返回的是一個,例如:Enumeration<String> attrNames = request.getAttributeNames();

1、getAttribute()和getParameter()方法區別

getAttribute表示從request範圍取得設置的屬性,必須要先setAttribute設置屬性,才能通過getAttribute來取得,設置與取得的為Object對象類型
getParameter表示接收參數,參數為頁面提交的參數,包括:表單提交的參數、URL重寫(就是xxx?id=1中的id)傳的參數等,因此這個並沒有設置參數的方法(沒有setParameter),而且接收參數返回的不是Object,而是String類型。

request.getAttribute()方法返回request範圍內存在的對象,而request.getParameter()方法是獲取http提交過來的數據。
request.getParameter()方法是通過容器的實現來取得通過類似post,get等方式傳入的數據,會從Web客戶端傳到Web服務器端,代表HTTP請求數據。request.getParameter()方法返回String類型的數據。

request.setAttribute()和getAttribute()方法傳遞的數據只會存在於Web容器內部,在具有轉發關系的Web組件之間共享, request.setAttribute()和getAttribute()只是在web容器內部流轉。這兩個方法能夠設置Object類型的共享數據。

2、HTTP請求內容

在HTTP請求中,第一行是請求行(request-line),用來說明請求類型、要訪問的資源(URL)以及使用的HTTP版本;
緊接著是多行頭部(headers)信息,用來說明服務器要使用的附加信息;
頭部信息之後是一個回車換行符(/r/n),用於標明頭部信息的結束。
以上是必須內容,根據需要可在頭部信息結束之後增加主體數據(request-body);
主體數據之後是一個回車換行符(/r/n),用於標明主體數據的結束。

需要註意的是
請求行(request-line)中的URL部分必須以application/x-www-form-urlencoded方式編碼。
主體數據(request-body)的編碼方式由頭部(headers)信息中的Content-Type指定。
主體數據(request-body)的長度由頭部(headers)信息中的Content-Length指定。

如果請求中需要附加主體數據,即增加request-body部分,則必須使用POST方式發送HTTP請求。HTML超鏈接(<a></a>)只能用GET方式提交HTTP請求,HTML表單(<form></form>)則可以使用兩種方式提交HTTP請求。
在HTTP請求中,request-line總是以application/x-www-form-urlencoded方式編碼。enctype標簽屬性只對request-body起作用。也就是說只有在method="POST"的情況下,設置enctype才起作用。設置enctype標簽屬性後,在HTTP請求的頭部(headers)信息中會多出一行Content-Type信息,並且request-body部分將會以Content-Type指定的MIME進行編碼。這些操作都是由客戶端瀏覽器自動完成的。
在沒有指定enctype標簽屬性時,表單以默認的application/x-www-form-urlencoded方式對request-body進行編碼。如果表單域中的NAME或VALUE含有非法字符(如中文字符),客戶端瀏覽器會自動對其進行URL Encoding處理。

3、請求亂碼問題

針對post請求產生的亂碼問題,要設置請求對象編碼與客戶端發請求時Content-Type中指定都編碼類型一致。針對get請求或通過鏈接(本質上也是get請求)傳遞中文亂碼問題,則可通過url編碼、獲取參數後轉碼或修改tomcat配置文件中URIEncoding來解決。

1、如果提交方式為post,想不亂碼,只需要在服務器端設置request對象的編碼即可,客戶端以哪種編碼提交的,服務器端的request對象就以對應的編碼接收,比如客戶端是以UTF-8編碼提交的,那麽服務器端request對象就以UTF-8編碼接收(request.setCharacterEncoding("UTF-8"))

2、如果提交方式為get,設置request對象的編碼是無效的,request對象還是以默認的ISO8859-1編碼接收數據,因此要想不亂碼,只能在接收到數據後再手工轉換,步驟如下:

  1).獲取獲取客戶端提交上來的數據,得到的是亂碼字符串,data="???è?????"

   String data = request.getParameter("paramName");

  2).查找ISO8859-1碼表,得到客戶機提交的原始數據的字節數組

   byte[] source = data.getBytes("ISO8859-1");

  3).通過字節數組以指定的編碼構建字符串,解決亂碼

   data = new String(source, "UTF-8");

  通過字節數組以指定的編碼構建字符串,這裏指定的編碼是根據客戶端那邊提交數據時使用的字符編碼來定的,如果是GB2312,那麽就設置成data = new String(source, "GB2312"),如果是UTF-8,那麽就設置成data = new String(source, "UTF-8")

get方式提交中文數據亂碼產生的原因是“tomcat”編碼設置的問題。
解決方法:在tomcat安裝目錄下面的server.xml文件中
<Connector connection Timeout="20000" port="8080" URIEncoding="UTF-8" prorocol="HTTP/1.1" redirectPort="8443"/>
URIEncoding即為tomcat的url編碼方式,設置成為utf-8即可正常編碼帶中文的鏈接

http://www.cnblogs.com/xdp-gacl/p/3798347.html

HttpServletRequest對象小結