`

Servlet中的重定向和请求分派

    博客分类:
  • J2EE
阅读更多

1.重定向

    在Servlet中的接口HttpServletRequest提供了sendRedirect()方法用于生成302相应码和Location响应头,从而通知客户端去重新访问Location响应头指定的URL,其定义如下:

    public void sendRedirect(String location ) throws IOException;

   对于sendRedirect()方法不仅可以重定向到当前应用程序中的其他资源,也可重定向到一个容器中的其他应用程序中的资源。

    eg:

 

 

//Servlet1.java 

package com.redrect; 

import java.io.IOException; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class Servlet1 extends HttpServlet { 

@Override 
protected void doGet(HttpServletRequest request, 
   HttpServletResponse response) throws ServletException, IOException { 
  // TODO Auto-generated method stub 
  this.doPost(request, response); 
} 

@Override 
protected void doPost(HttpServletRequest request, 
   HttpServletResponse response) throws ServletException, IOException { 
  // TODO Auto-generated method stub 
  response.sendRedirect("Servlet2"); //重定向到指定路径的资源 
  // RequestDispatcher dis=request.getRequestDispatcher("Servlet2"); 
  // dis.forward(request, response); 
} 

} 
//Servlet2.java 

package com.redrect; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class Servlet2 extends HttpServlet { 

@Override 
protected void doGet(HttpServletRequest request, 
   HttpServletResponse response) throws ServletException, IOException { 
  // TODO Auto-generated method stub 
  this.doPost(request, response); 
} 

@Override 
protected void doPost(HttpServletRequest request, 
   HttpServletResponse response) throws ServletException, IOException { 
  // TODO Auto-generated method stub 
  response.setContentType("text/html;charset=utf-8"); 
  PrintWriter out = response.getWriter(); 
  out.println("<html>"); 
  out.println(" <head><title>servlet2</title></head>"); 
  out.println(" <body>"); 
  out.println("从Servlet2中获取请求参数name的值:"); 
  out.println(request.getParameter("name")); 
  out.println(" </body>"); 
  out.println("</html>"); 
} 

} 

 

同时要在项目中的web.xml对Servlet进行声明:

<servlet> 
  <servlet-name>Servlet1</servlet-name> 
  <servlet-class>com.lkh.redrect.Servlet1</servlet-class> 
</servlet> 
<servlet-mapping> 
  <servlet-name>Servlet1</servlet-name> 
  <url-pattern>/Servlet1</url-pattern> 
</servlet-mapping> 
<servlet> 
  <servlet-name>Servlet2</servlet-name> 
  <servlet-class>com.redrect.Servlet2</servlet-class> 
</servlet> 
<servlet-mapping> 
  <servlet-name>Servlet2</servlet-name> 
  <url-pattern>/Servlet2</url-pattern> 

 

 



2.请求分派

    在Servlet中定义一个接口RequestDispatcher

    其方法如下:

    public void forward(ServletRequest request,ServletResponse response) throws ServletException,IOException;

    public void include(ServletRequest request,ServletResponse response) throws ServletException,IOException;

    对于forward()方法用于将请求转发到RequestDispatcher实例封装的资源,include()方法用于将RequestDispatcher实例封装的资源作为当前响应的一部分包含进来。

    获取RequestDispatcher实例的方式有两种:

    (1)调用ServletContext接口提供的getRequestDispatcher(String url) 方法

    (2)调用ServletRequest接口提供的getRequestDispatcher(String url) 方法

    ServletContext接口提供的getRequestDispatcher(String url) 方法中的路径参数必须以”/"开头

    ServletRequest接口提供的getRequestDispatcher(String url) 方法中的路径参数可以是相对路径也可为绝对路径。

    eg:

    只要将上面中的Servlet1.java 中的doPost()代码改为

    RequestDispatcher dis=request.getRequestDispatcher("Servlet2");
    dis.forward(request, response);

3.重定向和请求分派的比较:

    <1>请求分派只能将请求转发给同一个web应用中的其他组件,而重定向不仅可以定向到当前应用程序中的其他资源,也可重定向到其他站点的资源上

    <2>重定向的访问过程结束后,浏览器的地址栏显示的URL会发生改变,变成重定向的目标URL,而请求分派的浏览器地址栏保持初始的URL

    <3>请求分派的发起者和被调者之间共享相同的request实例和response实例,属于同一个“请求/响应”而重定向的发起者和被调用者使用各自的request实例和response实例,各自属于独立的“请求/响应”过程。

 

分享到:
评论
1 楼 hongmeikaile 2011-04-27  
写的很好,对我有帮助

相关推荐

Global site tag (gtag.js) - Google Analytics