Request和Response生成過程
回顧一下Servlet的調用過程,我們創建一個MyServlet類,並且定義了相關方法處理最初來自客戶端瀏覽器的http請求,在方法中將"hello"寫入response中,代碼如下:
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
最終我們打開瀏覽器,輸入http://localhost:8080/demo/myServlet就可以在頁面上看到可愛的hello。
事實上,當我們輸入網址,到看到頁面的hello,短短的時間內,瀏覽器,服務器以及Servlet三者之間的交互如下
這張圖網上有,因爲字體太小了,我就想把裏面的字畫大個一些,並結合這個例子分析一下。
我們之前分析過:服務器生成req和res對象,調用HttpServlet的service方法時,將會轉化成HttpServletRequest和HttpServletResponse對象,處理數據之後,response對象返回給服務器,服務器將response對象作爲響應返回給瀏覽器。
因此,request和response是啥,也就一目瞭然了,一個代表請求,一個代表響應,他們與HTTP協議都有着密不可分的協議。當然這兩個對象也會有相關的方法,去設置響應的內容,或者獲取請求的內容。
繼承結構
ServletRequest:request頂級接口,定義了request應該具有的基本方法。
HttpServletRequest:繼承於ServletRequest的接口,增加了關於http協議相關的API。
常用方法
瀏覽器輸入:http://localhost/demo/requestDemo1?username=summerday&gender=male
一、和客戶端相關的信息
/**
* @auther Summerday
*
* 請求客戶端參數API
*/
@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取客戶端發出請求的完整URL:http://localhost/demo/requestDemo1
StringBuffer requestURL = request.getRequestURL();
System.out.println("請求完整URL:"+requestURL.toString());
//獲取資源名URI :/demo/requestDemo1
String requestURI = request.getRequestURI();
System.out.println("請求資源URI:"+requestURI);
//返回請求行中的參數部分:username=summerday&gender=male
String queryString = request.getQueryString();
System.out.println("請求參數:"+queryString);
//返回發出請求的客戶機IP地址:ipv6地址 0:0:0:0:0:0:0:1
String remoteAddr = request.getRemoteAddr();
System.out.println("客戶機IP:"+remoteAddr);
//獲取客戶端的請求方式:GET
String method = request.getMethod();
System.out.println("請求方式:"+method);
//獲取當前web應用虛擬目錄的名稱:/demo
String contextPath = request.getContextPath();
System.out.println("虛擬目錄:"+contextPath);//畫個重點!
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
二、獲取請求頭信息
/**
* @auther Summerday
*
* 獲取請求頭信息
*/
@WebServlet("/RequestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//getHeader(name) 根據傳入的name獲取對應的值
String header = request.getHeader("Host");
System.out.println("Host的值爲:"+header);
//getHerders(String name) 根據傳入的name,獲取所有的值
Enumeration<String> hosts = request.getHeaders("Host");
while (hosts.hasMoreElements()){
String s = hosts.nextElement();
System.out.println("host:"+s);
}
//getHeaderNames() --- Enumeration<String> 獲取所有HeaderNames
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String s = headerNames.nextElement();
System.out.println("headerNames:"+s);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
三、獲取請求參數
/**
* @auther Summerday
*
* 獲取請求參數
*/
@WebServlet("/RequestDemo3")
public class RequestDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設置POST方式提交解碼方式
request.setCharacterEncoding("utf-8");
//獲取參數名爲"username"的值
String username = request.getParameter("username");
String nickname = request.getParameter("nickname");
System.out.println("username:"+username+", nickname:"+nickname);
//獲取名爲hobby的多個值(多選框的應用,一個name,多個value)
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
//獲取全部請求參數的名稱
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
String s = parameterNames.nextElement();
System.out.println("names:"+s);
}
//將全部參數名及參數值傳入map String name:String[] values
Map<String, String[]> map = request.getParameterMap();
for (Map.Entry<String, String[]> entry : map.entrySet()) {
System.out.println(entry.getKey()+":"+ Arrays.toString(entry.getValue()));
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
可以發現,這些獲取請求參數的方法,離不開form表單中各項的name屬性。