Servlet中的請求轉發和重定向


跳轉和重定向

有的時候客戶端請求到達服務端后需要對請求重新轉發到其它Servlet甚至別的服務器,這就需要跳轉重定向

區別

一般來說,跳轉是服務器內部跳轉,例如將請求從一個Servlet轉發給另外一個Servlet處理,是內部之間的轉發。而重定向是告訴客戶端去別的地方請求資源。舉個例子,某人需要去找人事部門打印收入證明,而收入證明需要去財務部蓋章。跳轉的處理方式是:人事部門的人告訴你,你等一下,我去把收入證明打印出來,然后我再去找財務部蓋章,所有資料准備好后,我再全部交給你。重定向的處理方式是:人事部門把收入流水給你打印出來,然后告訴你說,他們的工作已經做完了,現在需要你自己去找財務部蓋章。

這就是跳轉和重定向的本質區別,服務器跳轉的時候,客戶端地址欄不改變,而客戶端重定向的時候,地址欄改變。

跳轉示例

跳轉需要用到RequestDispacher對象,該對象可以從HttpRequest或者ServletContext中獲取。

下面是從HttpRequest對象中調用getRequestDispacher()方法獲取RequestDispacher並跳轉示例代碼:

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

       RequestDispatcher rd = null;

       String region = req.getParameter("region");

       System.out.println("region: " + region);

       switch (region)

       {

              case "asia":

              {

                     System.out.println("asia~~~");

                     rd = req.getRequestDispatcher("/asiaHandler.jsp");

                     break;

              }

              case "emea":

              {

                     System.out.println("emea~~~");

                     rd = req.getRequestDispatcher("/emeaHandler.jsp");

                     break;

              }

              case "ams":

              {

                     System.out.println("ams~~~");

                     rd = req.getRequestDispatcher("/amsHandler.jsp");

                     break;

              }

              default:

              {

                     System.out.println("default~~~");

                     rd = req.getRequestDispatcher("/html/error.html");

                     break;

              }

       }

      

       try

       {

              rd.forward(req, resp);

       } catch (ServletException | IOException e)

       {

              // TODO Auto-generated catch block

              e.printStackTrace();

       }

      

      

}

 

下面是從ServletContext對象中調用getNamedDispacher()方法獲取RequestDispacher對象並跳轉示例代碼:

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

       RequestDispatcher rd = null;

       ServletContext ctx = this.getServletContext();

       String region = req.getParameter("region");

       System.out.println("region: " + region);

       switch (region)

       {

              case "asia":

              {

                     rd = ctx.getNamedDispatcher("AsiaHandler");

                     break;

              }

              case "emea":

              {

                     rd = ctx.getNamedDispatcher("EmeaHandler");

                     break;

              }

              case "ams":

              {

                     rd = ctx.getNamedDispatcher("AMSHandler");

                     break;

              }

       }

      

       try

       {

              rd.forward(req, resp);

       } catch (ServletException | IOException e)

       {

              // TODO Auto-generated catch block

              e.printStackTrace();

       }

}

 

下面演示了用ServletContext對象調用getRequestDispacher()方法獲取RequestDispacher對象,然后實現跳轉:

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

       RequestDispatcher rd = null;

       ServletContext ctx = this.getServletContext();

       String region = req.getParameter("region");

       System.out.println("region: " + region);

       switch (region)

       {

              case "asia":

              {

                     rd = req.getRequestDispatcher("/asiaHandler.jsp");

                     break;

              }

              case "emea":

              {

                     rd = req.getRequestDispatcher("/emeaHandler.jsp");

                     break;

              }

              case "ams":

              {

                     rd = req.getRequestDispatcher("/amsHandler.jsp");

                     break;

              }

 

       }

      

       try

       {

              rd.forward(req, resp);

       } catch (ServletException | IOException e)

       {

              // TODO Auto-generated catch block

              e.printStackTrace();

       }

}

 

請求重定向是服務器發給瀏覽器一個新的地址,讓瀏覽器去請求新的地址。重定向需要用到HttpResponse對象調用sendRedirect()方法。

重定向示例:

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

{

       try

       {

              resp.sendRedirect("http://www.bing.com");

       } catch (IOException e)

       {

              // TODO Auto-generated catch block

              e.printStackTrace();

       }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM