在Java Web开发中,请求转发(Request Forwarding)是一种常见的技术,用于将请求从一个Servlet转发到另一个Servlet或JSP页面。这种技术在Web应用程序中起着非常重要的作用,可以用于实现模块化、重用代码以及构建更加灵活的应用程序。本文将详细解释什么是请求转发,为什么它重要,如何使用它,以及提供示例代码来说明其工作原理。
什么是请求转发?
请求转发是指将一个HTTP请求从一个Servlet转发到另一个Servlet或JSP页面的过程。它允许在Web应用程序中的不同组件之间共享请求和响应对象,从而实现模块化的代码和更好的代码重用。
请求转发通常在以下情况下使用:
模块化开发:将Web应用程序划分为不同的模块或组件,每个模块负责不同的任务。请求转发可用于在这些模块之间传递控制。
代码重用:将一些常用的功能实现为Servlet或JSP页面,然后可以在不同的页面中重用这些功能。
URL隐藏:用户访问一个URL,但希望在不暴露实际资源的情况下提供响应。请求转发允许隐藏Servlet或JSP页面的实际URL。
请求处理流程:将请求传递给一个Servlet,由该Servlet负责处理请求的一部分,然后将请求传递给下一个Servlet,以便处理其他部分。
目前我们学习的都是一次请求,对应一个 Servlet
通俗点说,我们以登录举例,输入用户名密码以后,跳转到JSP页面,需要显示出用户名密码,这就要用到请求转发
但是在实际开发中,往往业务比较复杂,需要在一次请求中,使用到多个 Servlet 完成
一个任务(Servlet 链, 流水作业) 如图
实例登录,成功以后转发到success.jsp页面
代码,新建index.jsp页面
<%--
Created by IntelliJ IDEA.
User: shadowpee
Date: 2020/12/27
Time: 15:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<div>
<%--这里表单表示的意思是以get方式提交表单,提交到我们的Login请求--%>
<form action="${pageContext.request.contextPath}/login" method="get">
用户名:<input type="text" name="username"><><br>
密码:<input type="password" name="password"><br>
爱好:
<input type="checkbox" name="hobbys" value="唱歌">唱歌
<input type="checkbox" name="hobbys" value="游戏">游戏
<input type="checkbox" name="hobbys" value="代码">代码
<br>
<input type="submit">
</form>
</div>
</body>
</html>
LoginServlet
- doGet():处理get请求
- doPost():处理post请求
- service():处理get/post方式请求。如果servlet中同时定义了这三种方法,那么servlet会调用service方法。
package com.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] parameterValues = req.getParameterValues("hobbys");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(parameterValues));
//通过请求转发:
req.setCharacterEncoding("utf-8");
//这里的”/“代表当前web应用,所以不需要写项目名:/request_war
req.getRequestDispatcher( "/success.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
success.jsp
<%--
Created by IntelliJ IDEA.
User: shadowpee
Date: 2020/12/27
Time: 15:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登录成功</h1>
</body>
</html>
实例2登录成功以后转发到另一个SuccessServlet
将index.jsp action改为login2
<form action="${pageContext.request.contextPath}/login2" method="get">
package com.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
@WebServlet("/login2")
public class LoginServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] parameterValues = req.getParameterValues("hobbys");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(parameterValues));
//通过请求转发:
req.setCharacterEncoding("utf-8");
//这里的”/“代表当前web应用,所以不需要写项目名:/request_war
req.getRequestDispatcher( "/success").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
SuccessServlet
package com.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
@WebServlet("/success")
public class SuccessServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] parameterValues = req.getParameterValues("hobbys");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(parameterValues));
//通过请求转发:
req.setCharacterEncoding("utf-8");
System.out.println("转发到successservlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}