术语“转发”是在这个问题上含糊不清。在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来完成的。 –