術語「轉發」是在這個問題上含糊不清。在JSP/Servlet世界中,從MVC概念中更多地瞭解到「轉發」,即請求URL(在瀏覽器地址欄中可見)有效地調用作爲控制器的servlet(與其URL模式匹配的web.xml
或@WebServlet
)準備模型並使用JSP作爲視圖來呈現模型。該JSP反過來被「轉發」調用。這是通過RequestDispatcher#forward()
完成:
request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response);
這確實不能反映JSP在瀏覽器地址欄中的URL。這完全發生在服務器端。基本上,servlet「加載」JSP並將請求/響應傳遞給它,以便它可以完成生成HTML內容的工作。請注意,上述示例中的JSP隱藏在/WEB-INF
文件夾中,這使得最終用戶嘗試在瀏覽器地址欄中輸入完整路徑時無法訪問該文件夾。
在一般的web開發世界中,術語「轉發」是也是,它從URL轉發中知道,它基本上與URL重定向相同。這反過來確實會導致瀏覽器地址欄的更改。這是在JSP/Servlet世界更正式地稱爲「重定向」(儘管大多數初學者最初將其與「轉發」混淆)。這是通過HttpServletResponse#sendRedirect()
完成:
response.sendRedirect("another-servlet-url");
基本上,服務器通過與Location
頭,客戶端應該在給定Location
新的GET請求的HTTP響應3NN告訴客戶。以上是實際上是相同的,如下:
response.setStatus(302);
response.setHeader("Location", "another-servlet-url");
,因爲它是客戶,誰是被指示做的工作(web瀏覽器),你看到正在反映了這個網址的變化早在瀏覽器地址欄中。
術語 「URL重寫」 是也曖昧。在JSP/Servlet世界中,「URL重寫」是將會話ID附加到URL的形式,以便無Cookie瀏覽器仍然可以維持與服務器的會話。您可能會在URL中看到過;jsessionid=somehexvalue
屬性。這是默認不會自動完成的,但大多數基於Servlet的MVC框架都會自動完成。這是由HttpServletResponse#encodeURL()
或encodeRedirectURL()
完成:
String encodedURL = response.encodeURL(url); // or response.encodeRedirectURL(url)
// Then use this URL in links in JSP or response.sendRedirect().
(這又是一個-again-含糊的字眼隨着「URL編碼」你通常認爲的percent encoding有此設施提供任何Servlet API的。中,通常要由URLEncoder#encode()
或通過JSTL的<c:url>
和<c:param>
或通過基於servlet的MVC架構提供的任何用戶界面組件,例如完成的,MVC-技術上更正確的,在JSP JSF的<h:outputLink>
)
在一般web開發(尤其是使用Apache HTTPD/PHP的人),「URL重寫」更多地被稱爲Apache HTTPD的mod_rewrite
正在做的事情:將傳入的URL映射到具體的資源,而不反映客戶端的URL更改。在JSP/Servlet世界中,這也是可能的,並且通常通過使用RequestDispatcher#forward()
的Filter
實現完成。衆所周知的實現是the Tuckey's URLRewriteFilter。
我承認,這也讓我感到困惑長,當我剛開始用JSP/Servlet的,肯定的,同時具有在執行Apache/PHP的世界我的根。
你的假設是不正確的。轉發/重定向是通過向瀏覽器返回一個3xx以及一個新的URL來完成的。 –