在建立Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個爲表明請求的request和表明響應response。
service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更增強大。
由於request表明請求,因此咱們能夠經過該對象分別得到Http請求的請求行,請求頭和請求體。
請求頭html
請求體java
得到客戶端的請求方式:String getMethod()得到請求的資源:
String getRequestURI()
StringBuffer getRequestURL()
String getContextPath() ---web應用的名稱
String getQueryString() ---- get提交url地址後的參數字符串
username=zhangsan&password=123
request.getRemoteAddr() --- 得到訪問的客戶端IP地址web
//1.得到請求方式 String method = request.getMethod(); System.out.println("method:" + method); //2.得到請求的資源相關的內容 String requestURI = request.getRequestURI(); System.out.println("requestURI:" + requestURI); StringBuffer requestURL = request.getRequestURL(); System.out.println("requestURL:" + requestURL); //3.得到web應用的名稱 String contextPath = request.getContextPath(); System.out.println("web應用:" + contextPath); //4.地址後的參數的字符串 String queryString = request.getQueryString(); System.out.println("queryString:" + queryString); //5.得到客戶端的IP地址 String remoteAddr = request.getRemoteAddr(); System.out.println("remoteAddr:" + remoteAddr);
<form action="/request/line" method="post"> <input type="text" name="username"><br> <input type="password" name="password"><br> <input type="submit" name="提交"><br> </form>
long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)
//1.得到指定的頭 String header = request.getHeader("User-Agent"); System.out.println(header); //2.得到全部頭的名字 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()){ String headerName = headerNames.nextElement(); String headerValue = request.getHeader(headerName); System.out.println(headerName + ":" + headerValue); }
referer頭的做用:執行該此訪問的的來源, 作防盜鏈瀏覽器
//對該新聞的來源進行判斷 String header = request.getHeader("referer"); if (header!=null&&header.startsWith("http://localhost")) { //是從我本身的網站跳轉過去的,能夠看新聞 response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("英雄聯盟IG戰隊奪冠..."); }else{ response.getWriter().write("請不要盜鏈!"); }
請求體中的內容是經過post提交的請求參數,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball
key value username [zhangsan] password [123] hobby [football,basketball]
以上面參數爲例,經過一下方法得到請求參數:
String getParameter(String name)
String(#getParameterValues(java.lang.String))(String name)
Enumeration getParameterNames()
Map<String,String[]> getParameterMap()
注意:get請求方式的請求參數 上述的方法同樣能夠得到
request.setCharacterEncoding("utf-8"); //1.得到單個表單值 String username = request.getParameter("username"); System.out.println(username); String password = request.getParameter("password"); System.out.println(password); //2.得到多個表單的值 String[] hobbys = request.getParameterValues("hobby"); for (String hobby:hobbys){ System.out.println(hobby); } //3.得到全部的請求參數的名稱 Enumeration<String> parameterNames = request.getParameterNames(); while(parameterNames.hasMoreElements()){ System.out.println(parameterNames.nextElement()); } System.out.println("----------------------"); //4.得到全部的參數,封裝到一個Map<String,String[]> Map<String, String[]> parameterMap = request.getParameterMap(); for (Map.Entry<String, String[]> entry:parameterMap.entrySet()){ System.out.println(entry.getKey()); for (String str:entry.getValue()){ System.out.println(str); } System.out.println("----------------------"); }
post提交亂碼:request.setCharacterEncoding("UTF-8"); get提交亂碼:parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
request對象也是一個存儲數據的區域對象,因此也具備以下方法:
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)
注意:request域的做用範圍:一次請求中
得到請求轉發器----path是轉發的地址
RequestDispatcher getRequestDispatcher(String path)經過轉發器對象轉發
requestDispathcer.forward(ServletRequest request, ServletResponse response)服務器
ServletContext域與Request域的生命週期比較?工具
Servlet Context:post
request:性能
轉發與重定向的區別?網站
客戶端地址與服務器端地址的寫法?url
客戶端地址:
服務器端地址:
request得到行的內容
request得到頭的內容
request得到體(請求參數)
得到中文亂碼的解決:
request轉發和域