转载
在
servlet/JSP
编程中,服务器端重定向可以通过下面两个方法来实现:
1
,运用
javax.servlet.RequestDispatcher
接口的
forward
方法,
2
,或者运用
javax.servlet.http.HttpServletResponse
接口的
sendRedirect
方法。
要运用
RequestDispatcher
接口的
forward
方法,首先要得到一个
RequestDispatcher
对象。
servlet
技术提供了三种方式来得到它:
1.
通过运用
javax.servlet.ServletContext
接口的
getRequestDispatcher
方法,将一个包含路径的
String
传递给其它资源。该路径是相对于
ServletContext
的根路径的。
2. 通过运用 javax.servlet.ServletRequest 接口的 getRequestDispatcher 方法,将一个包含路径的 String 传递到其它资源。该路径是相对于当前的 HTTP 请求的。
3. 通过运用 javax.servlet.ServletContext 接口的 getNamedDispatcher 方法,传递一个包含其它资源名字的 String 。
2. 通过运用 javax.servlet.ServletRequest 接口的 getRequestDispatcher 方法,将一个包含路径的 String 传递到其它资源。该路径是相对于当前的 HTTP 请求的。
3. 通过运用 javax.servlet.ServletContext 接口的 getNamedDispatcher 方法,传递一个包含其它资源名字的 String 。
但要注意,你只有在客户端没有输出时才可以调用
forward
方法。
如果当前页面的缓冲区(
buffer
)不是空的,那么你在调用
forward
方法前必须先清空缓冲区。
否则,会抛出一个
IllegalStateException
。
forward
方法也可以用来将请求发送到一个静态的页面。
在运用
RequestDispatcher
对象的
forward
方法来将一个控件从一个叫做
ABCServlet
的
servlet
传递到另一个叫做
XYZServlet
的
servlet
时,最简单的方法就是把
ABCServlet
和
XYZServlet
的类文件放在同一个目录中。通过这种方法,你就可以从
URL http://domain/VirtualDir/servlet/ABCServlet
来调用
ABCServlet
,从
URL http://domain/VirtualDir/servlet/XYZServlet
来调用
XYZServlet
了。然后运用
forward
方法就很简单了。你可以从
ServletRequest
接口运用
getRequestDispatcher ,
传递第二个
servlet
的名字。在
ABCServlet
中,你可以写下面的代码:
RequestDispatcher rd =
request.getRequestDispatcher("SecondServlet");
rd.forward(request, response);
你不需要在 XYZServlet 前放 / 符号。这种方法是最简单的,因为你根本不需要担心两个 servlets 的路径。
稍复杂的方法就是把下面这个 String 传递到 ServletRequest 的 getRequestDispatcher : "/servlet/XYZServlet"
如果你必须调用一个从 ServletContext 的 getRequestDispatcher 得到的 RequestDispatcher 对象的 forward 方法,你需要将 “/VirtualDir/servlet/XYZServlet” 作为路径参数来传递,如下:
RequestDispatcher rd =
getServletContext().getRequestDispatcher(
"/servlet/XYZServlet");
rd.forward(request, response);
RequestDispatcher rd =
request.getRequestDispatcher("SecondServlet");
rd.forward(request, response);
你不需要在 XYZServlet 前放 / 符号。这种方法是最简单的,因为你根本不需要担心两个 servlets 的路径。
稍复杂的方法就是把下面这个 String 传递到 ServletRequest 的 getRequestDispatcher : "/servlet/XYZServlet"
如果你必须调用一个从 ServletContext 的 getRequestDispatcher 得到的 RequestDispatcher 对象的 forward 方法,你需要将 “/VirtualDir/servlet/XYZServlet” 作为路径参数来传递,如下:
RequestDispatcher rd =
getServletContext().getRequestDispatcher(
"/servlet/XYZServlet");
rd.forward(request, response);
<jsp:forward page=”OtherPage.jsp”/>
在结果
servlet
中就转换成了下面的代码:
pageContext.forward("OtherPage.jsp");
运用
HttpServletResponse
接口的
sendRedirect
方法
该方法把一个命令发送到浏览器,让浏览器对在 location 中指定的 URL 提出请求。该方法可以接受绝对的或相对的 URLs 。如果传递到该方法的参数是一个相对的 URL ,那么 Web container 在将它发送到客户端前会把它转换成一个绝对的 URL 。 如果地址是相对的,没有一个 ’/’ ,那么 Web container 就认为它是相对于当前的请求 URI 的。
该方法把一个命令发送到浏览器,让浏览器对在 location 中指定的 URL 提出请求。该方法可以接受绝对的或相对的 URLs 。如果传递到该方法的参数是一个相对的 URL ,那么 Web container 在将它发送到客户端前会把它转换成一个绝对的 URL 。 如果地址是相对的,没有一个 ’/’ ,那么 Web container 就认为它是相对于当前的请求 URI 的。
你应该运用哪种技巧?
[QUOTE] 为了编写最有效的代码,你应该了解这两种重定向技巧的不同。 forward 方法是在 Web container 内部工作的。 sendRedirect 方法需要到客户端的一个往返。所以 forward 方法比 sendRedirect 要快。但是, 运用 forward 方法有局限性,你只能重定向到同一个 Web 应用程序中的一个资源。而 sendRedirect 方法可以让你重定向到任何 URL 。结论:如果可以解决你的问题,那么就用 forward 方法。只有当你不能用 forward 方法时才运用 sendRedirect 方法。
forward不会改变当前浏览器地址栏中的路径
[QUOTE] 为了编写最有效的代码,你应该了解这两种重定向技巧的不同。 forward 方法是在 Web container 内部工作的。 sendRedirect 方法需要到客户端的一个往返。所以 forward 方法比 sendRedirect 要快。但是, 运用 forward 方法有局限性,你只能重定向到同一个 Web 应用程序中的一个资源。而 sendRedirect 方法可以让你重定向到任何 URL 。结论:如果可以解决你的问题,那么就用 forward 方法。只有当你不能用 forward 方法时才运用 sendRedirect 方法。