目錄
1.HttpServletRequest類的作用
每次只要有請求進入 Tomcat 服務器,Tomcat 服務器就會把請求過來的 HTTP 協議信息解析好封裝到 Request 對象中。然後傳遞到 service 方法(doGet 和 doPost)中給我們使用。我們可以通過 HttpServletRequest 對象,獲取到所有請求的信息。
2.HttpServletRequest類的常用方法
getRequestURI()
|
獲取請求的資源路徑
|
getRequestURL()
|
獲取請求的統一資源定位符(絕對路徑)
|
getRemoteHost()
|
獲取客戶端的 ip 地址
|
getHeader()
|
獲取請求頭
|
getParameter()
|
獲取請求的參數
|
getParameterValues()
|
獲取請求的參數(多個值的時候使用)
|
getMethod()
|
獲取請求的方式 GET 或 POST
|
setAttribute()
|
設置域數據
|
getAttribute()
|
獲取域數據
|
getRequestDispatcher()
|
獲取請求轉發對象
|
代碼示例:
web.xml:
<servlet>
<servlet-name>RequestAPIServlet</servlet-name>
<servlet-class>com.study.servlet.RequestAPIServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestAPIServlet</servlet-name>
<url-pattern>/API</url-pattern>
</servlet-mapping>
測試代碼:
public class RequestAPIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// i.getRequestURI() 獲取請求的資源路徑
System.out.println("URI => " + req.getRequestURI());
// ii.getRequestURL() 獲取請求的統一資源定位符(絕對路徑)
System.out.println("URL => " + req.getRequestURL());
// iii.getRemoteHost() 獲取客戶端的ip地址
/**
* 在IDEA中,使用localhost訪問時,得到的客戶端 ip 地址是 ===>>> 127.0.0.1<br/>
* 在IDEA中,使用127.0.0.1訪問時,得到的客戶端 ip 地址是 ===>>> 127.0.0.1<br/>
* 在IDEA中,使用 真實ip 訪問時,得到的客戶端 ip 地址是 ===>>> 真實的客戶端 ip 地址<br/>
*/
System.out.println("客戶端 ip地址 => " + req.getRemoteHost());
// iv.getHeader() 獲取請求頭
System.out.println("請求頭User-Agent ==>> " + req.getHeader("User-Agent"));
// vii.getMethod() 獲取請求的方式GET或POST
System.out.println("請求的方式 ==>> " + req.getMethod());
}
}
結果截圖:
3.獲取請求參數
getParameter()
|
獲取請求的參數
|
getParameterValues()
|
獲取請求的參數(多個值的時候使用)
|
代碼示例
form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form</title>
</head>
<body>
<form action="http://localhost:8080/07_Servlet/parameterServlet">
用戶名:<input type="text" name="username"><br/>
密碼:<input type="password" name="password"><br/>
興趣愛好: <input type="checkbox" name="hobby" value="cpp">C++
<input type="checkbox" name="hobby" value="java">JAVA
<input type="checkbox" name="hobby" value="js">JavaScript<br/>
<input type="submit">
</form>
</body>
</html>
web.xml
<servlet>
<servlet-name>ParameterServlet</servlet-name>
<servlet-class>com.study.servlet.ParameterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ParameterServlet</servlet-name>
<url-pattern>/parameterServlet</url-pattern>
</servlet-mapping>
ParameterServlet.java
public class ParameterServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//獲取用戶名
String username = req.getParameter("username");
//獲取密碼
String password = req.getParameter("password");
//興趣愛好
String[] hobby = req.getParameterValues("hobby");
System.out.println("用戶名:"+username);
System.out.println("密碼:"+password);
System.out.println("興趣愛好:"+ Arrays.asList(hobby));
}
}
結果展示:
4.doGet 請求的中文亂碼解決
String username = req.getParameter("username");
//1 先以 iso8859-1 進行編碼
// 2 再以 utf-8 進行解碼
username = new String(username.getBytes("iso-8859-1"), "UTF-8");
5.doPost 請求的中文亂碼解決
setCharacterEncoding() :設置請求體的字符集
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設置請求體的字符集爲 UTF-8
//要在獲取請求參數之前調用纔有用
req.setCharacterEncoding("UTF-8");
System.out.println("----------doPost-----------");
//獲取用戶名
String username = req.getParameter("username");
//獲取密碼
String password = req.getParameter("password");
//興趣愛好
String[] hobby = req.getParameterValues("hobby");
System.out.println("用戶名:"+username);
System.out.println("密碼:"+password);
System.out.println("興趣愛好:"+ Arrays.asList(hobby));
}
}
6.請求的轉發
請求的轉發:
請求轉發是指,服務器收到請求後,從一次資源跳轉到另一個資源的操作叫請求轉發。
代碼示例:
web.xml
<servlet>
<servlet-name>Servlet1</servlet-name>
<servlet-class>com.study.servlet.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Servlet2</servlet-name>
<servlet-class>com.study.servlet.Servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet2</servlet-name>
<url-pattern>/servlet2</url-pattern>
</servlet-mapping>
Servlet1.java
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//獲取請求參數
String username = req.getParameter("username");
System.out.println("在 Servlet1(櫃檯1) 中查看請求參數(材料):"+username);
//給 材料 蓋一個章,並傳遞到 Servlet2(櫃檯2)
req.setAttribute("key","Servlet1");
//請求轉發(問路:Servlet2怎麼走)
/**
* 請求轉發必須要以斜槓打頭,/ 斜槓表示地址爲:http://ip:port/工程名/ , 映射到IDEA代碼的web目錄
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//走向Servlet2(櫃檯2)
requestDispatcher.forward(req,resp);
}
}
Servlet2.java
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取請求的參數(辦事的材料)查看
String username = req.getParameter("username");
System.out.println("在Servlet2(櫃檯2)中查看參數(材料):" + username);
// 查看 櫃檯1 是否有蓋章
Object key1 = req.getAttribute("key");
String stamp = "Servlet1";
System.out.println("櫃檯1是否有章:" + stamp.equals(key1));
// 處理自己的業務
System.out.println("Servlet2 處理自己的業務 ");
}
}
結果截圖:
7.base 標籤的作用
代碼示例:
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--base 標籤設置頁面相對路徑工作時參照的地址
href 屬性就是參數的地址值
-->
<base href="http://localhost:8080/07_servlet/a/b/">
</head>
<body>
這是 a 下的 b 下的 c.html 頁面<br/>
<a href="../../index.html">跳回首頁</a><br/>
</body>
</html>
8.Web 中的相對路徑和絕對路徑
在 javaWeb 中,路徑分爲相對路徑和絕對路徑兩種:
相對路徑是:
. 表示當前目錄
.. 表示上一級目錄
資源名 表示當前目錄/資源名
絕對路徑:
http://ip:port/工程路徑/資源路徑
在實際開發中,路徑都使用絕對路徑,而不簡單的使用相對路徑。
1、絕對路徑
2、base+相對
9.web 中 / 斜槓的不同意義
在 web 中 / 斜槓 是一種絕對路徑。
/ 斜槓 如果被瀏覽器解析,得到的地址是:http://ip:port/
<a href="/">斜槓a>
/ 斜槓 如果被服務器解析,得到的地址是:http://ip:port/工程路徑
1、<url-pattern>/servlet1url-pattern>
2、servletContext.getRealPath(“/”);
3、request.getRequestDispatcher(“/”);
特殊情況: response.sendRediect(“/”);
把斜槓發送給瀏覽器解析。得到 http://ip:port/