HttpServletRequest 物件 基本應用
阿新 • • 發佈:2020-09-02
# HttpServletRequest 物件 基本應用
HttpServletRequest物件代表客戶端的請求,當客戶端通過HTTP協議訪問伺服器時,HTTP請求頭中的所有資訊都封裝在這個物件中,開發⼈員通過這個物件的⽅法,可以獲得客戶這些資訊。簡單來說,要得到瀏覽器資訊,就找HttpServletRequest物件。
## 防盜鏈
獲取Referer這個訊息頭,判斷Referer是不是從指定頁面來的。如果不是從指定頁面的,跳轉回指定頁面。
這可以用於保證頁面廣告的觀看,瀏覽量等。
~~~java
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//獲取訊息頭
String referer = req.getHeader("Referer");
//判斷訪問來源
if (referer == null || !referer.contains("/hello.jsp")){
resp.sendRedirect("/hello.jsp");
return ;
}
//確定來源自指定頁面後,開放資源
//設定頁面編碼
resp.setHeader("Content-Type","text/html;charset=UTF-8");
//輸出內容
resp.getWriter().write("這是可以訪問的資源。。。");
}
~~~
直接訪問資源
![image-20200902160440740](https://i.loli.net/2020/09/02/CdbkEfDK4w2hLpx.png)
重定向到指定頁面
![image-20200902160420674](https://i.loli.net/2020/09/02/uaoteUvMblSsy8Q.png)
除錯模式下可以看到 狀態碼 302 (被重定向)。
![image-20200902163002433](https://i.loli.net/2020/09/02/u97R31Lg5iMclVO.png)
## GET 方式提交資料
~~~java
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//重定向
resp.sendRedirect("/request/getServlet?username=ling");
}
~~~
?後接資料。
~~~java
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//請求重定向的 Servlet 為 demoHttpServlet
String username = req.getParameter("username");
System.out.println(username);
}
~~~
用 Request 物件接收指定屬性的值,並列印驗證。
![image-20200902160338308](https://i.loli.net/2020/09/02/t31hQFrOKEqjf7H.png)
## POST 方式表單提交資料
~~~java
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//設定request 字元編碼
req.setCharacterEncoding("UTF-8");
//接收資料
//接收單個值
String username = req.getParameter("username");
String password = req.getParameter("password");
String gender = req.getParameter("gender");
String address = req.getParameter("address");
String textarea = req.getParameter("textarea");
//接收多個值
String[] hobbies = req.getParameterValues("hobbies");
//接收隱藏域的值
String myname = req.getParameter("myname");
//控制檯輸出資料,驗證是否接受資料
System.out.println(username);
System.out.println(password);
System.out.println(gender);
for (String hobby : hobbies) {
System.out.print(hobby);
}
System.out.println(" ");
System.out.println(address);
System.out.println(textarea);
System.out.println(myname);
}
~~~
==相關頁面可自行編寫一個表單==
![image-20200902160520699](https://i.loli.net/2020/09/02/Dijsv91dXoROMCK.png)
![image-20200902160545067](https://i.loli.net/2020/09/02/vtzSy3Aaq28VmnE.png)
這裡需要提醒的是,注意頁面的編碼問題,否則會出現亂碼問題。一般是因為編碼問題引起,==**需要統一編碼**==。
這裡的編碼問題和 GET 方式的有所不同,POST方式提交的資料封裝在 Request 物件裡,而 GET 方式則是儲存在訊息頭中傳遞到下一個Servlet或者頁面中的。因此 GET 方法的編碼問題相對來說有些棘手,因為涉及到 Tomcat 編碼(預設是 ISO 8859-1)和瀏覽器編碼之間的轉換,也可以通過修改Tomcat的編碼來實現等等,工作量遠比 POST 方式直接設定 Request 物件的編碼繁瑣。 因此我給出下面一個建議(真不是我懶不寫了):
==一般情況下提交資料能使用就使用 POST 方式提交。==
## 實現轉發
~~~java
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//獲取 RequestDispatcher 物件,用於實現轉發頁面
RequestDispatcher dispatcher = req.getRequestDispatcher("/forward.jsp");
//使用 RequestDispatcher 的 forward() 方法實現轉發, 並傳入 Request 和 Response 物件
dispatcher.forward(req, resp);
}
~~~
![image-20200902160303559](https://i.loli.net/2020/09/02/Fw4kZOCrdMJKSN8.png)
轉發的同時,還可傳遞資料。
~~~java
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用 Request 物件在轉發時傳遞資料
req.setAttribute("username","ling");
//獲取 RequestDispatcher 物件,用於實現轉發頁面
RequestDispatcher dispatcher = req.getRequestDispatcher("/forward.jsp");
//使用 RequestDispatcher 的 forward() 方法實現轉發, 並傳入 Request 和 Response 物件
dispatcher.forward(req, resp);
}
~~~
~~~jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import ="javax.servlet.*"%>
Title
<% response.getWriter().write("我的名字是: "+(String)request.getAttribute("username")); %> ~~~ 這裡使用 JSP 頁面,雖然現在新的專案一般不用了。 ![image-20200902162305369](https://i.loli.net/2020/09/02/l1RQ8okXg2PIBVU.png) Servlet之間可以通過ServletContext實現通訊,ServletContext也能稱之為域物件。⽽request也可以稱之為域物件,只不過**ServletContext的域是** **整個web應⽤,⽽request的域僅僅代表⼀次http請求。** 可以使⽤ServletContext和request實現Servlet之間的通訊,那麼我們⽤哪⼀種呢? ⼀般的原則:**可以使⽤request就儘可能使⽤request。**因為ServletContext代表著整個web應⽤,使⽤ServletContext會消耗⼤量的資源,⽽request物件會隨著請求的結束⽽結束,資源會被回收。使⽤request域進⾏Servlet之間的通訊在開發中是⾮常頻繁的。 ## web.xml 參照 [HttpServletRespnse 物件相關基本應用](https://www.cnblogs.com/l1ng14/p/13599325.html) 進行
這是轉發而來的頁面。。。。。。
<% response.getWriter().write("我的名字是: "+(String)request.getAttribute("username")); %> ~~~ 這裡使用 JSP 頁面,雖然現在新的專案一般不用了。 ![image-20200902162305369](https://i.loli.net/2020/09/02/l1RQ8okXg2PIBVU.png) Servlet之間可以通過ServletContext實現通訊,ServletContext也能稱之為域物件。⽽request也可以稱之為域物件,只不過**ServletContext的域是** **整個web應⽤,⽽request的域僅僅代表⼀次http請求。** 可以使⽤ServletContext和request實現Servlet之間的通訊,那麼我們⽤哪⼀種呢? ⼀般的原則:**可以使⽤request就儘可能使⽤request。**因為ServletContext代表著整個web應⽤,使⽤ServletContext會消耗⼤量的資源,⽽request物件會隨著請求的結束⽽結束,資源會被回收。使⽤request域進⾏Servlet之間的通訊在開發中是⾮常頻繁的。 ## web.xml 參照 [HttpServletRespnse 物件相關基本應用](https://www.cnblogs.com/l1ng14/p/13599325.html) 進行