上篇文章我們講了servlet的基本原理,這章將講一下剩余的部分。
HttpServletRequest 接口
該接口是 ServletRequest 接口的子接口,封裝了 HTTP 請求的相關信息,由 Servlet 容器創建其實現類對象並傳入 service(ServletRequest req, ServletResponse res)方法中。我們請求的詳細信息都可以通過 HttpServletRequest 接口的實現類對象獲取。這個實現類對象一般都是容器創建的,我們不需要管理。
HttpServletRequest 主要功能
獲取請求參數
1)什么是請求參數?
請求參數就是瀏覽器向服務器提交的數據
2)瀏覽器向服務器如何發送數據
a)附在 url 后面,如:http://localhost:8989/MyServlet/MyHttpServlet?userId=20
b)通過表單提交
<form action="MyHttpServlet" method="post"> 你喜歡的足球隊<br /><br /> 巴西<input type="checkbox" name="soccerTeam" value="Brazil" /> 德國<input type="checkbox" name="soccerTeam" value="German" /> 荷蘭<input type="checkbox" name="soccerTeam" value="Holland" /> <input type="submit" value="提交" /> </form>
3)使用HttpServletRequest對象獲取請求參數
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //一個name對應一個值 String userId = request.getParameter("userId");
System.out.println("userId="+userId); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //一個name對應一組值 String[] soccerTeams = request.getParameterValues("soccerTeam"); for(int i = 0; i < soccerTeams.length; i++){ System.out.println("team "+i+"="+soccerTeams[i]); } }
在請求域中保存數據
數據保存在請求域中,可以轉發到其他Servlet或者jsp頁面,這些Servlet或者jsp頁面就會 從請求中再取出數據
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //將數據保存到request對象的屬性域中request.setAttribute("attrName", "attrValueInRequest"); //兩個Servlet要想共享request對象中的數據,必須是轉發的關系 request.getRequestDispatcher("/ReceiveServlet").forward(request, response); }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //從request屬性域中獲取數據 Object attribute = request.getAttribute("attrName"); System.out.println("attrValue="+attribute); }
HttpServletResponse 接口
HttpServletResponse 是 ServletResponse 接口的子接口,封裝了 HTTP 響應的相關信息,由
Servlet 容器創建其實現類對象並傳入 service(ServletRequest req, ServletResponse res)方法中。主要功能:
1)使用 PrintWriter 對象向瀏覽器輸出數據
//通過PrintWriter對象向瀏覽器端發送響應信息 PrintWriter writer = res.getWriter(); writer.write("Servlet response"); writer.close();
2)實現請求重定向
請求轉發與重定向
請求轉發和重定向是 web 應用頁面跳轉的主要手段,應用十分廣泛,所以我們一定要搞清楚他們的區別。
請求轉發:
1)第一個 Servlet 接收到了瀏覽器端的請求,進行了一定的處理,然后沒有立即對請求進行響應,而是將請求“交給下一個 Servlet”繼續處理,下一個 Servlet 處理完成之后對瀏覽器進行了響應。在服務器內部將請求“交給”其它組件繼續處理就是請求的轉發。對瀏覽器來說,一共只發了一次請求,服務器內部進行的“轉發”瀏覽器感覺不到,同時瀏覽器地址欄中的地址不會變成“下一個 Servlet”的虛擬路徑。
2)在轉發的情況下,兩個 Servlet 可以共享 Request 對象中保存的數據
3)轉發的情況下,可以訪問 WEB-INF 下的資源
4)當需要將后台獲取的數據傳送到 JSP 上顯示的時候,就可以先將數據存放到 Request 對象中,再轉發到 JSP 從屬性域中獲取。此時由於是“轉發”,所以它們二者共享 Request 對象中的數據。
public class ForwardServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("forwardServlet doGet"); //請求的轉發 //1.調用HTTPServletRequest 的getRequestDispatcher()方法獲取RequestDispatcher對象 //調用getRequestDispatcher()方法時需要傳入轉發的地址 String path = "testServlet"; RequestDispatcher requestDispatcher = request.getRequestDispatcher("/"+path); //2.調用調用HTTPServletRequest 的forward(request,response)進行請求的轉發 requestDispatcher.forward(request,response); } }
請求重定向:
1)第一個 Servlet 接收到了瀏覽器端的請求,進行了一定的處理,然后給瀏覽器一個特殊的響應消息,這個特殊的響應消息會通知瀏覽器去訪問另外一個資源,這個動作是服務器和瀏覽器自動完成的,但是在瀏覽器地址欄里面能夠看到地址的改變,會變成下一個資源的地址。
2)對瀏覽器來說,一共發送兩個請求,所以用戶是能夠感知到變化的。
3)在重定向的情況下,不能共享 Request 對象中保存的數據。
public class RedirectServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("RedirectServlet doGet"); //執行請求的重定向,直接調用reponse.sendRedirect(path)方法 //path為重定向的地址 String path = "testServlet"; response.sendRedirect(path); } }
轉發與重定向的區別:
|
轉發 |
重定向 |
瀏覽器地址欄 |
不會變化 |
會變化 |
Request |
同一個請求 |
兩次請求 |
API |
Request 對象 |
Response 對象 |
位置 |
服務器內部完成 |
瀏覽器完成 |
WEB-INF |
可以訪問 |
不能訪問 |
共享請求域數據 |
可以共享 |
不可以共享 |
目標資源 |
必須是當前 Web 應用中的資源 |
不局限於當前 Web 應用 |
圖解轉發和重定向