h5自適應網(wǎng)站源碼seo的重要性
系列文章目錄
1、JavaWeb基礎(chǔ)專項復習1——XML文件-CSDN博客
2、JavaWeb基礎(chǔ)專項復習2——JSP文件-CSDN博客
3、JavaWeb基礎(chǔ)專項復習2——Servlet相關(guān)知識-CSDN博客
4、JavaWeb基礎(chǔ)專項復習4——會話對象Session and Cookie-CSDN博客
文章目錄
- 系列文章目錄
- 文章目錄
- 1、Tomcat 請求響應機制
- 2、HttpServletRequest 功能
- 2.1 獲取請求頭數(shù)據(jù)
- 2.2 獲取請求相關(guān)其他方法
- 3、HttpServletRequest獲取參數(shù)
- 3.1 傳遞參數(shù)方式
- 3.2 獲取參數(shù)方法
- 3.3 中文亂碼處理
- 3.3.1 POST 請求:
- 3.3.2 GET 請求:
- 3.6 HttpServletRequest請求轉(zhuǎn)發(fā)
- 3.7 request 作用域
- 4、HttpServletResponse 功能
- 4.1 功能介紹
- 4.2 設(shè)置狀態(tài)碼和其他方法
- 4.3?設(shè)置響應頭信息
- 4.4 中文亂碼問題
- 4.5 重定向
1、Tomcat 請求響應機制
Web 服務器接收到客戶端的 HTTP 請求后,會為每次請求創(chuàng)建request
和response
對象,分別用于獲取客戶端數(shù)據(jù)和向客戶端輸出數(shù)據(jù)。
2、HttpServletRequest 功能
HttpServletRequest在JavaWeb中非常重要的一個類。它是Servlet的service()方法的參數(shù)之一。所以必須要掌握它
request的功能可以分為以下幾種:
- 封裝了請求頭數(shù)據(jù);
- 封裝了請求正文數(shù)據(jù),如果是GET請求,那么就沒有正文;
- request是一個域?qū)ο?/strong>,可以把它當成Map來添加獲取數(shù)據(jù);
- 做請求的轉(zhuǎn)發(fā)(一次請求一次數(shù)據(jù))·(重定向(兩次請求,兩次數(shù)據(jù)))
2.1 獲取請求頭數(shù)據(jù)
通過request.getHeader("請求頭名稱")
獲取指定請求頭數(shù)據(jù)
request.getHeaderNames()
可獲取所有請求頭名稱。
response.setContentType("text/html;charset=utf-8");
Enumeration names = request.getHeaderNames();
while(names.hasMoreElements()) {String name = (String)names.nextElement();String value = request.getHeader(name);System.out.println(name + ": " + value);response.getWriter().println(name + ": " + value + "<br/>");
}
2.2 獲取請求相關(guān)其他方法
涵蓋獲取請求正文字節(jié)數(shù)、請求類型、請求方法、客戶端 IP 地址等眾多方法,還能操作請求 URL 各部分信息。
- int getContentLength():獲取請求正文的字節(jié)數(shù),GET請求沒有正文,沒有正文返回-1;
- String getContentType():獲取請求類型,如果請求是GET,那么這個方法返回null;如果是POST請求,那么默認為application/x-www-form-urlencoded(理解為字符串類型),其它類型以后再學;
- String getMethod():返回請求方法,例如:GET post delete put?
- Locale getLocale():返回當前客戶端瀏覽器支持的Locale。java.util.Locale表示國家和言語,這個東西在國際化中很有用;
- String getCharacterEncoding():獲取請求編碼,如果沒有setCharacterEncoding(),那么返回null。表示使用ISO-8859-1編碼;GBK UTF-8
- void setCharacterEncoding(String code):設(shè)置請求編碼,只對正文有效!注意,對于GET而言,沒有正文!!!所以此方法只能對POST請求中的參數(shù)有效!
- http://localhost:8080/hello/oneServlet?name=zhangSan
- String getContextPath():返回上下文路徑,例如:/項目名稱
- String getQueryString():返回請求URL中的參數(shù),例如:name=zhangSan
- String getRequestURI():返回請求URI路徑,例如:/hello/oneServlet
- StringBuffer getRequestURL():返回請求URL路徑,例如:http://localhost/hello/oneServlet,即返回除了參數(shù)以外的路徑信息;
- String getServletPath():返回Servlet路徑,例如:/oneServlet
- String getRemoteAddr():返回當前客戶端的IP地址;
- String getRemoteHost():返回當前客戶端的主機名,但這個方法的實現(xiàn)還是獲取IP地址;
- int getRemotePort():返回客戶端的端口號,每次請求都會變;
- String getSchema():返回請求協(xié)議,例如:http;
- String getServerName():返回主機名,例如:localhost
- int getServerPort():返回服務器端口號,例如:80
3、HttpServletRequest獲取參數(shù)
3.1 傳遞參數(shù)方式
GET 和 POST,GET 可在地址欄、超鏈接、表單中傳遞參數(shù);POST 主要在表單中傳遞。
GET:
- 地址欄中直接給出參數(shù):http://localhost/param/ParamServlet?p1=v1&p2=v2;
- 超鏈接中給出參數(shù):
<a href=” http://localhost/param/ParamServlet?p1=v1&p2=v2”>點一下</a>
- 表單中給出參數(shù):<form method=”GET” action=”ParamServlet”>…</form>
- Ajax
POST:
- 表單中給出參數(shù):<form method=”POST” action=”ParamServlet”>…</form>
- Ajax
3.2 獲取參數(shù)方法
String getParameter(String name)
獲取單值參數(shù);String[] getParameterValues(String name)
獲取多值參數(shù)(如復選框);Enumeration getParameterNames()
獲取所有參數(shù)名;Map getParameterMap()
獲取所有參數(shù)的 Map 集合。
單值參數(shù)接收示例
前臺接收
<form action="ParamServlet" method="post"><input type="text" name="p1"/><br/><input type="text" name="p2"/><br/><input type="submit" value="提交"/><br/>
</form>
<a href="ParamServlet?p1=v1&p2=v2">Param</a>
后臺接收
String s1 = request.getParameter("p1");
String s2 = request.getParameter("p2");
response.getWriter().print("p1 = " + s1 + "<br/>");
response.getWriter().print("p2 = " + s2 + "<br/>");
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()) {String name = (String)names.nextElement();String value = request.getParameter(name);System.out.println(name + " = " + value);
}Map<String, String[]> map = request.getParameterMap();
Set<String> keySet = map.keySet();
for(String key : keySet){String[] vals = map.get(key);System.out.print(key+" :");System.out.println(key+" :" + Arrays.toString(vals));System.out.println();
}
多值參數(shù)接收
多值參數(shù)主要就是多選checkbox
例如在注冊表單中,如果讓用戶填寫愛好,那么愛好可能就是多個。那么hobby參數(shù)就會對應多個值:
前臺接收
<form action="ParamServlet" method="post">上網(wǎng):<input type="checkbox" name="hobby" value="netplay" /><br/>踢球:<input type="checkbox" name="hobby" value="football" /><br/>看書:<input type="checkbox" name="hobby" value="read" /><br/>編程:<input type="checkbox" name="hobby" value="programme" /><br/><input type="submit" value="提交"/><br/>
</form>
后臺接收
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));Map<String, String[]> map = request.getParameterMap();
Set<String> keySet = map.keySet();
for(String key : keySet){String[] vals = map.get(key);System.out.println(key+" :" + Arrays.toString(vals));
}
3.3 中文亂碼處理
3.3.1 POST 請求:
我們知道,請求信息中,只有POST存在正文,所謂POST參數(shù)編碼就是就是請求正文的編碼。默認情況下,使用getParameter()獲取POST請求參數(shù)時,使用的是ISO-8859-1編碼。
方法一,針對字符串本身進行手動轉(zhuǎn)碼
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("name:"+name);
方法二,在獲取參數(shù)前使用request.setCharacterEncoding("UTF-8")
設(shè)置編碼。
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println("name:"+name);
對于每個請求,只需要調(diào)用request的setCharacterEncodng()一次,然后所有g(shù)etParameter()都會使用這個編碼來解讀參數(shù)。但要注意,只對請求正文有效,即POST參數(shù)。
該方法 必須放在獲取參數(shù)值之前
3.3.2 GET 請求:
方法一,對字符串單獨解碼
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("name:"+name);
方法二,在 Tomcat 的server.xml
中配置URIEncoding="UTF-8"
,但 Tomcat8.5 及以上版本無需設(shè)置即可支持 URL 傳遞中文。(不建議使用get請求傳遞中文參數(shù))
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8"/>
3.6 HttpServletRequest請求轉(zhuǎn)發(fā)
用于在 Servlet 中執(zhí)行后臺業(yè)務邏輯后跳轉(zhuǎn)頁面,地址欄不變,可跳轉(zhuǎn)到靜態(tài)頁面或 Servlet,還能在請求域內(nèi)設(shè)置和獲取屬性值。
request.getRequestDispatcher("/success.html").forward(request, response);
此時我們可以給request來設(shè)置當前域中的屬性值,在該域之內(nèi)(當前請求完成之前)都能獲得到該屬性值。
request.setAttribute("name", "txjava");
request.getAttribute("name");
3.7 request 作用域
范圍是一次請求響應內(nèi),每個線程請求會新生成HttpServletRequest
和HttpServletResponse
對象。
ServletContext
ServletContext 代表整個 Web 應用程序的上下文,在服務器啟動時為每個 Web 應用創(chuàng)建一個 ServletContext 對象,所有 Servlet 共享這個對象。它主要用于在整個 Web 應用的不同部分之間共享數(shù)據(jù)、獲取 Web 應用的全局信息等。HttpSession
HttpSession 用于在服務器端跟蹤客戶端的會話狀態(tài)。每個客戶端訪問服務器時,服務器會為其創(chuàng)建一個唯一的 HttpSession 對象,通過會話 ID 來識別不同的客戶端。它可以在用戶的多次請求之間保持數(shù)據(jù),適用于存儲用戶的登錄信息、購物車內(nèi)容等。HttpServletRequest
HttpServletRequest 代表客戶端的請求,當客戶端向服務器發(fā)送請求時,服務器會創(chuàng)建一個 HttpServletRequest 對象,該對象封裝了客戶端請求的所有信息,如請求頭、請求參數(shù)、請求方法等.
4、HttpServletResponse 功能
request是請求對象,而response是響應對象。
response對象用于響應client請求,向客戶輸出信息。
他封裝了JSP產(chǎn)生的響應,并發(fā)送到client以響應client請求。
4.1 功能介紹
用于響應客戶端請求,包括設(shè)置響應頭信息、發(fā)送狀態(tài)碼、設(shè)置響應正文、重定向等功能。
- 設(shè)置響應頭信息;addHeader(“reFresh”, “5;URL=xxxx”);
- 發(fā)送狀態(tài)碼;sendError(404);
- 設(shè)置響應正文;getWriter().print(“fdsfdsa”);
- 重定向:sendRedirect(“path”);
4.2 設(shè)置狀態(tài)碼和其他方法
- response.setContentType("text/html;charset=utf-8")設(shè)置響應類型和編碼
- response.setCharacterEncoding(“utf-8”):如果響應類型為文本,那么就需要設(shè)置文本的編碼類型,然后瀏覽器使用這個編碼來解讀文本。注意!如果沒有設(shè)置contentType,那么瀏覽器會認為contentType為text/html,如果沒設(shè)置編碼,那么默認為ISO-8859-1編碼。所以以上兩點在使用response返回結(jié)果之前必須設(shè)置。
- response.setStatus(200):設(shè)置狀態(tài)碼
- response.sendError(404, “您要查找的資源不存在”):發(fā)送錯誤狀態(tài)碼并顯示錯誤信息。
4.3?設(shè)置響應頭信息
- response.setHeader(“contentType”, “text/html;charset=utf-8”):與setContentType()方法的功能相同。setContentType()方法屬于便捷方法;
- 刷新(定時重定向):response.setHeader("Refresh","5; URL=http://www.baidu.com"):5秒后自動跳轉(zhuǎn)到百度主頁。
4.4 中文亂碼問題
通過setContentType("text/html;charset=utf-8")
和setCharacterEncoding("UTF-8")
解決。
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("張三");
4.5 重定向
使用sendRedirect
方法,可重定向到不同主機,會使request
中的屬性失效并開啟新的request
對象。
這一點與轉(zhuǎn)發(fā)不同。在client瀏覽器上將會得到跳轉(zhuǎn)后的地址,并又一次發(fā)送請求鏈接;用戶能夠從瀏覽器的地址欄中看到跳轉(zhuǎn)后的地址
response.sendRedirect("/param_demo/success.html");