Servlet交互【重定向 与 请求分派】详解
Servlet交互
在serlvet中,需要調用另外一個資源來對瀏覽器的請求進行響應,兩種方式實現:
調用HttpServletResponse.sendRedirect 方法實現 重定向
調用RequestDispatcher.forward 方法來實現請求分派 (轉發)
1.reponse.sendRedirect("目標URL")
原理:
Servlet執行重定向的時候向客戶端返回302 ,把“目標URL”作為請求頭Location的值發送給客戶端
客戶端瀏覽器接收到302,會自動發送location請求頭指向新的地址
web容器針對這個請求作出響應
特征:
兩次請求和響應
最終請求地址會顯示在地址欄中
第一次請求中的數據會在以后的請求中丟失
2.RequestDispatcher.forward(request,response)
原理:
Servlet執行請求分派,在容器內部 調用其他的servle程序,同時通過forward方法將請求和響應傳遞給被調用Servlet。
客戶端瀏覽器接收到200 ,獲取容器的響應
特征:
一次請求和響應
請求地址不會發生變化
響應是從其他servlet中響應的
具體如圖:
兩者之間的區別:
1.重定向由客戶端來完成工作,請求分派服務器端來完成任務2.重定向會丟失請求對象中的數據,分派不會注意:
重定向和請求分派中的新路徑如果以 / 開頭 意義不同
重定向中, / 代表服務器根路徑
http://localhost:8080請求分派中, / 代表Web應用根路徑
http://localhost:8080/WebContextRoot- 那么重定向的路徑加上“/”怎樣才能和不加“/”所表示的路徑一樣呢?
代碼
重定向:
提交界面
<!--find.html --><!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body><h1>serevlet重定向</h1><hr/><form action="find.do" method="post">搜索:<input type="text" name="find" /> <input type="submit" value="提交"/></form> </body> </html>發起重定向代碼:
public class FindServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");String info = request.getParameter("find");System.out.println("第一個servlet中的信息:"+info);response.sendRedirect("info.do");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}重定向頁面:
public class InfoServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");String info = request.getParameter("find");System.out.println("第二個servlet中的信息:"+info);response.setContentType("text/html;charset=utf-8");response.getWriter().println("第二個servlet中的信息:"+info);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}結果如圖:
在這里數據丟失的原因:
因為重定向是通過目標路徑來請求的,也就是我們所說的 “get”方式,而“get”方式是沒有消息體的,因此重定向之后數據會丟失。
如何能讓數據能夠不丟失呢?
分析:“get”方式的請求數據的提交是以鍵值對的形式跟在URL后面的 其格式為:
那么我們就可以,通過對發起重定向的servlet進行如下修改:
//原來的代碼 response.sendRedirect("info.do"); //修改改后 response.sendRedirect("info.do?find="+info);請求分派:
其他代碼和上面相同,發起重定向的代碼改為請求分派的代碼,帶碼如下:
public class FindServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");String info = request.getParameter("find");System.out.println("第一個servlet中的信息:"+info); // response.sendRedirect("info.do?find="+info);request.getRequestDispatcher("info.do").forward(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}結果如下:
以上就是Servlet交互【重定向 與 請求分派】詳解
轉載于:https://www.cnblogs.com/nm666/p/7904566.html
總結
以上是生活随笔為你收集整理的Servlet交互【重定向 与 请求分派】详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于操作系统编程与裸机编程的区别
- 下一篇: 达梦数据库管理工具介绍