Servlet中的重定向和请求分派

1.重定向

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

    public void sendRedirect(String location ) throws IOException;

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

    eg:

//Servlet1.java

package com.lkh.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.lkh.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.lkh.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实例,各自属于独立的“请求/响应”过程。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值