;Request - ->封裝了客戶端所有的請求數(shù)據(jù)
1、獲取常用的信息
(1) 獲取客戶端IP——requset.getRemoteAddr(); ??案例:封IP
(2) 請求方式——request.getMethod(); ??
2、獲取HTTP請求頭
(1) *****String getHeader(String name),適合單值頭
(2)int getIntHeader(String name),適合單值int類型的請求頭
(3) long getDateHeader(String name),適合單值毫秒類型的請求頭
(4) Enumeration getHeader(String name),適合用于多值請求頭
案例:
/**
*獲取客戶端的IP地址、請求方式、獲取User-Agent,得到客戶端信息
?*/
public?void?doGet(HttpServletRequest request, HttpServletResponse response)
throws?ServletException, IOException {
//獲取IP
String addr = request.getRemoteAddr();
System.out.println("IP:"?+ addr);
//獲取請求方式
System.out.println("請求方式:"?+ request.getMethod());
//獲取名為User-Agent的請求頭
String useragent = request.getHeader("User-Agent");
// System.out.println(useragent);
// Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
if(useragent.toLowerCase().contains("chrome")){
System.out.println("你好"+addr+",你用的瀏覽器是谷歌");
}else?if(useragent.toLowerCase().contains("firefox")){
System.out.println("你好"+addr+",你用的瀏覽器是火狐");
}else?if(useragent.toLowerCase().contains("msie")){
System.out.println("你好"+addr+",你用的瀏覽器是IE");
}
}
3、獲取請求URL
http://localhost:8080/RequseDemo/AServlet?username=xxx&password=yyy
(1) String getScheme():獲取協(xié)議,http
(2) String getServerName():獲取服務(wù)器名,localhost
(3) String getServerPort():獲取服務(wù)器端口,8080
(4) String getContextPath():獲取項(xiàng)目名,/RequseDemo
(5) String getServletPath():獲取Servlet路徑,/AServlet
(6) String getQueryString():獲取參數(shù)部分問號后面的部分username=xxx&password=yyy
(7) String getRequestURI():獲取請求URL,項(xiàng)目名+Servlet路徑/RequseDemo/AServlet
(8) String getRequestURL():獲取請求REL,http://localhost:8080/RequseDemo/AServlet
案例一:
/**
*獲取URL的信息
?*
?* @author趙奇
?*/
public?void?doGet(HttpServletRequest request, HttpServletResponse response)
throws?ServletException, IOException {
response.getWriter().print("<br/>"?+ request.getScheme() + "<br/>");//獲取協(xié)議名
response.getWriter().print(request.getServerName() + "<br/>");//獲取服務(wù)器名
response.getWriter().print(request.getServerPort() + "<br/>");//獲取端口名
response.getWriter().print(request.getContextPath() + "<br/>");//獲取項(xiàng)目名
response.getWriter().print(request.getServletPath() + "<br/>");//獲取Servlet路徑
response.getWriter().print(request.getQueryString() + "<br/>");//獲取獲取問好后面
response.getWriter().print(request.getRequestURI() + "<br/>");//請求URI
response.getWriter().print(request.getRequestURL() + "<br/>");//請求URL
}
案例二:Referer防盜鏈(Referer請求頭表示請求的來源)
/**
*演示Referer防盜鏈
?* @author趙奇
?*/
public?void?doGet(HttpServletRequest request, HttpServletResponse response)
throws?ServletException, IOException {
String s = request.getHeader("Referer");
// System.out.println(s);
if?(s == null?|| !s.contains("localhost")) {
response.sendRedirect("http://www.baidu.com");
} else?{
System.out.println("hello");
}
}
4、獲取請求參數(shù)
請求參數(shù)是由客戶端發(fā)送給服務(wù)器的,有可能是在請求體中POST,也可能是在URL之后GET
請求參數(shù):有一個(gè)參數(shù)一個(gè)值的,還有一個(gè)參數(shù)多個(gè)值的
> ***** String ?getParameter(String name):獲取指定名稱的請求參數(shù),適合單值請求參數(shù)
> String[] ?getParameterValues(String name):獲取指定名稱的請求參數(shù)值,用于多值請求參數(shù)
>Enumeration ?getParameterNames():獲取所有請求參數(shù)名稱
>***** Map ?getParameterMap():獲取所有請求參數(shù)。
案例:
/**
*演示Request獲取請求參數(shù)
?*
?* @author趙奇
?*/
public?void?doGet(HttpServletRequest request, HttpServletResponse response)
throws?ServletException, IOException {
System.out.println("GET: "?+ request.getParameter("xxx"));
System.out.println("GET: "?+ request.getParameter("yyy"));
}
public?void?doPost(HttpServletRequest request, HttpServletResponse response)
throws?ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println(username + ","?+ password + ","
+ Arrays.toString(hobby));
/*
*測試獲取所有請求參數(shù)的名稱
?*/
Enumeration<String> e = request.getParameterNames();
while?(e.hasMoreElements()) {
System.out.println(e.nextElement());
}
/*
*獲取所有請求參數(shù)并存到Map中
?*/
Map<String, String[]> map = request.getParameterMap();
for?(String name : map.keySet()) {
String[] values = map.get(name);
System.out.println(name + "-"?+ Arrays.toString(values));
}
}
5、請求轉(zhuǎn)發(fā)和請求包含
RequestDispatcher rd = request.getRequestDispatcher(“/MyServlet”);
使用request獲取RequestDispatcher對象,方法的參數(shù)是被轉(zhuǎn)發(fā)或包含的Servlet的Servlet路徑
請求轉(zhuǎn)發(fā):rd.forward(request,response);(重點(diǎn))
請求包含:rd.include(request,response);
有時(shí)一個(gè)請求需要多個(gè)Servlet協(xié)作才能完成,所有需要在一個(gè)Servlet跳到另外一個(gè)Servlet
>一個(gè)請求跨多個(gè)Servlet,需要使用轉(zhuǎn)發(fā)和包含
>請求轉(zhuǎn)發(fā):由下一個(gè)Servlet完成響應(yīng)體,當(dāng)前Servlet可以設(shè)置響應(yīng)頭(留頭不留體)
>請求包含:由兩個(gè)Servlet共同完成響應(yīng)體(都留)
>無論是請求轉(zhuǎn)發(fā)還是請求包含,都在一個(gè)請求范圍內(nèi)使用request和response
6、Request域
Servlet中三大域?qū)ο螅簉equest、session、application,都有如下三個(gè)方法:
(1) void setAttribute(String name,Object value)
(2) Object getAttribute(String name)
(3) Void removeAttribute(String name)
**同一個(gè)請求范圍內(nèi)使用request.setAttribute()、request.getAttribute()來傳值,前一個(gè)Servlet調(diào)用setAttribute()保存值,后一個(gè)Servlet調(diào)用getAttribute()獲取值。
7、請求轉(zhuǎn)發(fā)和重定向的區(qū)別
(1) 請求轉(zhuǎn)發(fā)是一個(gè)請求一次響應(yīng),而重定向是兩次請求兩次響應(yīng)
(2) 請求轉(zhuǎn)發(fā)地址欄不變化,重定向后顯示后一個(gè)請求的地址
(3) 請求轉(zhuǎn)發(fā)只能轉(zhuǎn)發(fā)到本項(xiàng)目的其他Servlet,而重定向不只能重定向到本項(xiàng)目
的其他Servlet,還能定向到其他項(xiàng)目。
(4) 請求轉(zhuǎn)發(fā)是服務(wù)器端行為,只需要給出轉(zhuǎn)發(fā)的Servlet路徑,而重定向需要給出
requestURL,即包含項(xiàng)目名。
(5) 請求轉(zhuǎn)發(fā)和重定向效率是轉(zhuǎn)發(fā)高,因?yàn)槭且粋€(gè)請求
① 需要地址欄發(fā)生變化時(shí)必須使用重定向
② 需要在下一個(gè)Servlet中獲取request域中的數(shù)據(jù)時(shí)必須使用轉(zhuǎn)發(fā)