您的位置:首页 > 编程语言 > Java开发

Javaweb Servlet基础学习记录(4)—重定向与请求转发(请求转发)

2020-03-06 18:54 1351 查看

Javaweb Servlet基础学习记录(4)—重定向与请求转发(请求转发)

二、请求转发
 请求转发是指将请求再转发到其他地址,转发过程中使用的是同一个request请求,转发后浏览器地址栏内容不变。
 请求转发过程图(演示由请求ServletA到ServletB的转发过程):

 现实生活举例(图片转载自CSDN博主「阿顾同学」的原创文章,原文链接:https://blog.csdn.net/u010452388/article/details/80398929):

 注释:
 (1)请求转发的过程发生在服务器内部,对客户端是透明的。服务器只能从当前应用内部查找相应的转发资源,而不能转发到其它应用的资源。
 (2)请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发给另外一个资源,并让该资源对此请求进行响应。
 (3)RequestDispatcher接口有以下两个方法:
    Forward()方法:将请求转发给其他资源。
    Include()方法:将其他资源并入到当前请求中。
 代码实现:
 通过HttpServletRequest对象来实现,请求转发语法格式如下:

RequestDispatcher dispatcher = request.getRequestDispatcher(String path);
dispatcher .forward(ServletRequest request, ServletRequest response);

 其中,path参数用以指定转发的URL,只能是相对路径;request和response参数取值为当前请求所对应的HttpServletRequest和HttpServletResponse对象。
 示例:

RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp").forward(request,response);

表示请求转发到当前项目站点的根目录下的index.jsp页面
 演示:
 创建ResultServlet

package com;

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

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

/**
* Servlet implementation class ResultServlet
*/
@WebServlet("/ResultServlet")
public class ResultServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public ResultServlet() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
*      response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 解决中文乱码问题
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<p>请求ResultServlet</p>");
out.flush();
out.close();
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
*      response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

 创建ForwardServlet

package com;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class ForwardServlet
*/
@WebServlet("/ForwardServlet")
public class ForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public ForwardServlet() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
*      response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("请求转发之前");
RequestDispatcher dis = request.getRequestDispatcher("/ResultServlet");
dis.forward(request, response);
System.out.println("请求转发之后");
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
*      response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

 其中

RequestDispatcher dis = request.getRequestDispatcher("/ResultServlet"); 		dis.forward(request, response);
两行一般写为
request.getRequestDispatcher("/ResultServlet").forward(request, response);
前者更直观地表示了借助RequestDispatcher接口对象实现forward。

 运行查看控制台,确认执行了ForwardServlet

 前端输入地址http://localhost:8080/ClassDemo02/ForwardServlet回车

  • 点赞
  • 收藏
  • 分享
  • 文章举报
asdfghjkl_th 发布了16 篇原创文章 · 获赞 0 · 访问量 290 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: