Servlet中的請求轉發與重定向探究
a. 探究過程
b. 經驗總結
1.採用與 Jsp與Servlet 重定向與轉發探究(一) 一樣的servlet Demo,想做測試的請前往此處copy。index.jsp、servlet(ServletRequest.java 與 ServletResponse.java)與web.xml此三文件。
圖1. 修改ServletRequest.java中的代碼:
request.getRequestDispatcher("end.jsp").forward(request, response);
你會看到結果
無影響!
圖2 繼續修改:
request.getRequestDispatcher(request.getContextPath()+"/end.jsp").forward(request, response);
你會看到結果:
message處顯示的是: /servletForR/servletForR/end.jsp(servletForR爲我項目名)
此處報錯。
圖3 繼續修改代碼:
request.getRequestDispatcher(request.getContextPath()+"end.jsp").forward(request, response);
結果:
message處顯示的是: /servletForR/servletForR.jsp
圖4 我們測試response重定向對應的servlet(ServletResponse.java):
response.sendRedirect(request.getContextPath()+"end.jsp");
少了個’/’。結果是:
message處顯示的是: /servletForend.jsp
這不就是少了個‘/’所以拼接錯誤嘛!
圖5 ServletResponse.java繼續修改:
response.sendRedirect("/end.jsp");
結果是:
message處顯示的是: /end.jsp
有沒有發覺!!! 和request請求轉發的區別!!!
好,我們繼續。
圖6 代碼修改:
response.sendRedirect("end.jsp");
結果是:
有沒有感到很奇怪!!!
好吧,我總結下:
如果URL都是“x.jsp”。轉發和重定向指向的都是根目錄下的文件,會在根目錄下索引。
而如果有”/x.jsp”。則有很大的區別。
首先從圖
圖
因此如果以後是在根目錄,則可以選擇都不加‘/’直接“x.jsp即可”。
如果不是在根目錄,在某一文件中。建議:
重定向用 :request.getContextPath()+"/jsp_name"
;
請求轉發用 : /filename/jsp_name
.
例:
重定向:
response.sendRedirect(request.getContextPath()+”/end.jsp”);
請求轉發:
(ns爲webroot下的子文件夾)
request.getRequestDispatcher("/ns/end.jsp").forward(request, response);