Web项目(六)HttpServletRequest对象之请求转发

在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

  1. doGet():处理get请求
  2. doPost():处理post请求
  3. 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);
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen019

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值