- 什么是Request棋凳?
- 為什么要使用Request?
- 怎么使用Request?
- 其它功能
- 中文亂碼問題解決
1. 什么是Request髓废?
HttpServletRequest對(duì)象代表客戶端的請(qǐng)求,當(dāng)客戶端通過HTTP協(xié)議訪問服務(wù)器時(shí)草描,HTTP請(qǐng)求頭中的所有信息都封裝在這個(gè)對(duì)象中览绿,通過這個(gè)對(duì)象提供的方法,可以獲得客戶端請(qǐng)求的所有信息穗慕。
2. 為什么要使用Request饿敲?
- 使用Request對(duì)象來分析出對(duì)應(yīng)的Servlet去執(zhí)行對(duì)應(yīng)的業(yè)務(wù)邏輯
- 使用Request對(duì)象來獲取、轉(zhuǎn)發(fā)逛绵、數(shù)據(jù)共享等功能
3. 怎么使用Request怀各?
根據(jù)HTTP協(xié)議我們可以得知,一次數(shù)據(jù)請(qǐng)求包含:
- 請(qǐng)求行:請(qǐng)求方式 請(qǐng)求url 請(qǐng)求協(xié)議/版本
- 請(qǐng)求頭:客戶端瀏覽器告訴服務(wù)器一些信息
- 請(qǐng)求空行:空行术浪,就是用于分割POST請(qǐng)求的請(qǐng)求頭瓢对,和請(qǐng)求體的。
- 請(qǐng)求體:封裝POST請(qǐng)求消息的請(qǐng)求參數(shù)的
3.1 獲取請(qǐng)求行數(shù)據(jù)
方法 | 說明 |
---|---|
String getMethod() | 獲取請(qǐng)求方式 |
String getContextPath() | 獲取虛擬目錄 |
String getServletPath() | 獲取Servlet路徑 |
String getQueryString() | 獲取get方式請(qǐng)求參數(shù) |
String getRequestURI() | 獲取請(qǐng)求URI |
String getRemoteAddr() | 獲取客戶機(jī)的IP地址 |
示例代碼
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//獲取虛擬目錄
System.out.printf(req.getContextPath()+"\n");
//獲取URI
System.out.printf(req.getRequestURI()+"\n");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
效果演示
補(bǔ)充
- URL:統(tǒng)一資源定位符 : http://localhost/day14/demo1 中華人民共和國
- URI:統(tǒng)一資源標(biāo)識(shí)符 : /day14/demo1 共和國
3.2 獲取請(qǐng)求頭數(shù)據(jù)
方法 | 說明 |
---|---|
String getHeader(String name) | 通過請(qǐng)求頭的名稱獲取請(qǐng)求頭的值 |
Enumeration<String> getHeaderNames() | 獲取所有的請(qǐng)求頭名稱 |
3.3 獲取請(qǐng)求體數(shù)據(jù)
請(qǐng)求體:只有POST請(qǐng)求方式胰苏,才有請(qǐng)求體硕蛹,在請(qǐng)求體中封裝了POST請(qǐng)求的請(qǐng)求參數(shù)
步驟:
- 獲取流對(duì)象
BufferedReader getReader():獲取字符輸入流,只能操作字符數(shù)據(jù)
ServletInputStream getInputStream():獲取字節(jié)輸入流硕并,可以操作所有類型數(shù)據(jù)
在文件上傳知識(shí)點(diǎn)后講解 - 再從流對(duì)象中拿數(shù)據(jù)
4. 其它功能
4.1 獲取請(qǐng)求參數(shù)
獲取請(qǐng)求參數(shù)通用方式:不論get還是post請(qǐng)求方式都可以使用下列方法來獲取請(qǐng)求參數(shù)
方法 | 說明 |
---|---|
String getParameter(String name) | 根據(jù)參數(shù)名稱獲取參數(shù)值 username=zs&password=123 |
String[] getParameterValues(String name) | 根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組 hobby=xx&hobby=game |
Enumeration<String> getParameterNames() | 獲取所有請(qǐng)求的參數(shù)名稱 |
Map<String,String[]> getParameterMap() | 獲取所有參數(shù)的map集合 |
示例代碼
html頁面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用戶登錄</h1>
<form action="demo" method="POST">
用戶名:<input type="text" name="username"/>
<br/>
密 碼:<input type="password" name="password"/>
<br/>
<input type="checkbox" name="usertype" value="administrator"/>管理員
<input type="checkbox" name="usertype" value="user"/>普通用戶
<br/>
<input type="submit" value="提交">
</form>
</body>
</html>
Servlet頁面
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//防止中文亂碼
req.setCharacterEncoding("utf-8");
//獲取username的參數(shù)(輸入值)
System.out.printf(req.getParameter("username")+ "\n");
//獲取password的參數(shù)(輸入值)
System.out.printf(req.getParameter("password")+ "\n");
//根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組
String [] result= req.getParameterValues("usertype");
for (String s : result) {
System.out.println(s);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
演示結(jié)果
4.2 請(qǐng)求轉(zhuǎn)發(fā)
一種在服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式
4.2.1 步驟:
- 通過request對(duì)象獲取請(qǐng)求轉(zhuǎn)發(fā)器對(duì)象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher對(duì)象來進(jìn)行轉(zhuǎn)發(fā):forward(ServletRequest request, ServletResponse response)
4.2.2. 特點(diǎn):
- 瀏覽器地址欄路徑不發(fā)生變化
- 只能轉(zhuǎn)發(fā)到當(dāng)前服務(wù)器內(nèi)部資源中法焰。
- 轉(zhuǎn)發(fā)是一次請(qǐng)求
示例代碼
LoginServlet
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user_name = req.getParameter("username");
if (user_name.equals("aaa")){
req.getRequestDispatcher("/failServlet").forward(req,resp);
}
}
}
FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設(shè)置編碼
resp.setContentType("text/html;charset=utf-8");
//輸出
resp.getWriter().write("登錄失敗,用戶名或密碼錯(cuò)誤");
}
}
效果展示
4.3 共享數(shù)據(jù)
- 域?qū)ο螅阂粋€(gè)有作用范圍的對(duì)象倔毙,可以在范圍內(nèi)共享數(shù)據(jù)
- request域:代表一次請(qǐng)求的范圍埃仪,一般用于請(qǐng)求轉(zhuǎn)發(fā)的多個(gè)資源中共享數(shù)據(jù)
方法 | 說明 |
---|---|
void setAttribute(String name,Object obj) | 存儲(chǔ)數(shù)據(jù) |
Object getAttitude(String name) | 通過鍵獲取值 |
void removeAttribute(String name) | 通過鍵移除鍵值對(duì) |
示例代碼
LoginServlet
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user_name = req.getParameter("username");
if (user_name.equals("aaa")){
//存放數(shù)據(jù)
req.setAttribute("shareData",user_name);
//轉(zhuǎn)發(fā)
req.getRequestDispatcher("/failServlet").forward(req,resp);
}
}
}
FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設(shè)置編碼
resp.setContentType("text/html;charset=utf-8");
//獲取存放數(shù)據(jù)
String data =(String) req.getAttribute("shareData");
//輸出
resp.getWriter().write("登錄失敗,用戶名或密碼錯(cuò)誤");
resp.getWriter().write("用戶"+data+"不允許登錄陕赃!");
}
}
效果顯示
4.4 獲取ServletContext
ServletContext getServletContext()
5. 中文亂碼問題
中文亂碼問題:
- get方式:tomcat 8 已經(jīng)將get方式亂碼問題解決了
- post方式:會(huì)亂碼解決:在獲取參數(shù)前卵蛉,設(shè)置request的編碼request.setCharacterEncoding("utf-8");