Servlet转发与重定向

news2024/12/25 12:54:23

在这里插入图片描述

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:JAVA开发者成长之路
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Servlet转发与重定向
更多内容点击👇
      Servlet应用(Request+response对象)

本文目录

    • 转发
      • 【1】页面跳转
      • 【2】数据传递
      • 【3】转发特点
      • 【4】转发过程
    • 重定向
      • 【1】页面跳转
      • 【2】数据传递
      • 【3】重定向特点
      • 【4】重定向过程
    • 转发和重定向总结

在这里插入图片描述

转发

 转发的作用在服务器端,将请求发送给服务器上的其它资源,以共同完成一次请求的处理。

【1】页面跳转

 在调用业务逻辑的Servlet中,服务器端跳转主要通过 RequestDispatcher 接口来实现:

  1. 获取接口:+getRequestDispatcher(“String path”):RequestDispatcher
  2. 跳转方法:+forward(ServletRequest request,ServletResponse response):void

示例代码一

package cn.lqgx.www;

import entity.Student;
import service.StudentService;
import service.impl.StudentServiceImpl;

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.io.PrintWriter;
import java.util.List;
@WebServlet("/show")
public class StudentShow extends HttpServlet {
    StudentService studentService=new StudentServiceImpl();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Student> studentList = studentService.selectAllStudents();

        req.setAttribute("students",studentList);
        req.getRequestDispatcher("/StudentAllServlet").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

 使用forward跳转时,是在服务器内部跳转,地址栏不发生变化,属于同一次请求。

在这里插入图片描述

【2】数据传递

 forward表示一次请求,是在服务器内部跳转,可以共享同一次request作用域中的数据。

  1. request作用域:拥有存储数据的空间,作用范围是一次请求有效(一次请求可以多次转发)
    • 可以将数据存入request后,在一次请求过程中的任何位置进行获取
    • 可传递任何数据类型(基本数据类型、对象、数组、集合等)
  2. 存数据:request.setAttribute(key,value);
    • 以键值对形式存储在request作用域中。key为String类型,value为Object类型
  3. 取数据:request.getAttribute(key);
    • 通过String类型的key获取Object类型的value

示例代码二:根据 示例代码一 传递的数据,在显示层获取数据并显示。

package cn.lqgx.www;

import entity.Student;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

@WebServlet(name = "StudentAllServlet", value = "/StudentAllServlet")
public class StudentAllServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Student> studentList=(List<Student>)request.getAttribute("students");
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter printWriter=response.getWriter();
        response.setContentType("text/html;charset=UTF-8");
        printWriter.write("<html lang=\"en\">");
        printWriter.write("<head>");
        printWriter.write("<meta charset=\"UTF-8\">");
        printWriter.write("<title>Title</title>");
        printWriter.write("<style>");
        printWriter.write("td{width:200px;height:45px;line-height:45px;text-align:center;}");
        printWriter.write("table tr:nth-child(odd){background:green;}");
        printWriter.write("table tr:nth-child(even){background:#FE5F97;}");
        printWriter.write("th{height:40px;line-height:40px;text-align:center;background:white;}");
        printWriter.write("caption{height:45px;line-height:45px;text-align:center;}");
        printWriter.write("</style>");
        printWriter.write("</head>");
        printWriter.write("<body>");
        printWriter.write("<table border=\"1\" width=\"100%\" cellspacing=\"0\">");
        printWriter.write("<caption align=\"top\">所有学生信息</caption>");
        printWriter.write("<thead>");
        printWriter.write("<tr>");
        printWriter.write("<th>学号</th>");
        printWriter.write("<th>姓名</th>");
        printWriter.write("<th>年龄</th>");
        printWriter.write("<th>性别</th>");
        printWriter.write("<th>地址</th>");
        printWriter.write("<th>电话号码</th>");
        printWriter.write("</tr>");
        printWriter.write("</thead>");
        printWriter.write("<tbody>");

        for (int i = 0; i < studentList.size(); i++) {
            printWriter.write("<tr>");
            printWriter.write("<td>"+studentList.get(i).getSid()+"</td>");
            printWriter.write("<td>"+studentList.get(i).getSname()+"</td>");
            printWriter.write("<td>"+studentList.get(i).getSage()+"</td>");
            printWriter.write("<td>"+studentList.get(i).getSsex()+"</td>");
            printWriter.write("<td>"+studentList.get(i).getSaddress()+"</td>");
            printWriter.write("<td>"+studentList.get(i).getSphoneNum()+"</td>");
            printWriter.write("</tr>");
        }
        printWriter.write("</tbody>");
        printWriter.write("</table>");
        printWriter.write("</body>");
        printWriter.write("</html>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

【3】转发特点

  1. 转发是服务器行为
  2. 转发是浏览器只做了一次访问请求
  3. 转发两次跳转之间传输的信息不会丢失,多以可以通过request进行数据的传递
  4. 转发只能将请求转发给同一个Web应用中的组件

【4】转发过程

  1. 浏览器向服务器发送请求
  2. 服务器接收请求并处理请求
  3. 这时服务器发现有转发代码存在,
  4. 直接跳转到新的资源(注意:这个过程是连续的,在这个过程中session可以跟随传递)
  5. 网页显示返回结果,地址栏不会变化

重定向

 重定向作用在客户端,客户端将请求发送给服务器中,服务器响应给客户端一个新的请求地址,客户端重新发送新请求。

【1】页面跳转

 在调用业务逻辑的Servlet中,编写以下代码:

 response.sendRedirect(“目标URI”);

 URI:统一资源标识符(Uniform Resource Identifier),用来表示服务器中定位一个资源,资源在Web项目中的路径(、project/source)

 使用redirect跳转时,是在客户端跳转,地址栏发生变化,属于多次请求

在这里插入图片描述
示例代码三:

package cn.lqgx.Servlet;

import cn.lqgx.entity.Book;
import cn.lqgx.service.BookService;
import cn.lqgx.service.Impl.BookServiceImpl;

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;

@WebServlet(name = "ServletUpdateTrue", value = "/ServletUpdateTrue")
public class ServletUpdateTrue extends HttpServlet {
    BookService bookService=new BookServiceImpl();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //通过response输出在控制台
        int bid= Integer.parseInt(request.getParameter("bid"));
        String isbn= request.getParameter("isbn");
        String name= request.getParameter("name");
        String author= request.getParameter("author");
        String press= request.getParameter("press");
        double price= Double.parseDouble(request.getParameter("price"));
        String classification= request.getParameter("classification");
        Book book=new Book(bid,isbn,name,author,press,price,classification);
        //先查询要添加的数据是否存在数据库中
        int num =bookService.updateBook(book);
        if(num>0){
            //重新显示所有信息
            response.sendRedirect("ServletShow");
        }else {
//            printWriter.println("<h1>修改失败!</h1>");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

【2】数据传递

 sendRedirect跳转时、地址栏改变,代表客户端重新发送的请求。属于两次请求。

  1. response没有作用域,两次request请求中的数据无法共享
  2. 传递数据:通过URI的拼接进行数据传递(“WebProject/b?username=zhangsan”);

【3】重定向特点

  1. 重定向是客户端行为
  2. 重定向是浏览器做了至少两次的访问请求
  3. 重定向浏览器地址改变
  4. 重定向两次跳转之间传输的信息会丢失(request范围)
  5. 重定向可以指向任何的资源,包括当前应用程序中的其它资源、同一个站点上的其它应用程序中的资源、其它站点的资源

【4】重定向过程

  1. 浏览器向服务器发送请求
  2. 服务器接收请求并处理请求
  3. 这时服务器发现有重定向代码存在
  4. 服务器会立即通知浏览器,告诉它,你去访问这个资源
  5. 这时浏览器会对新资源重新发起访问(这个过程是断开的,中间不连续)
  6. 地址栏产生相应的变化

转发和重定向总结

 当两个Servlet需要传递数据时,选择forward转发,不建议使用sendRedirect进行传递。二者区别如下:

  1. 转发地址栏不会变化,重定向会变化。
  2. 转发是一次请求,而重定向是两次。
  3. 转发速度较快,重定向较慢(因为浏览器要重新发起请求)。
  4. 由于重定向是重新对资源发起访问,而浏览器默认访问方式为get,所以对应的新响要换成get,当然这是默认情况。注意一下即可。
  5. 转发不会造成信息丢失,而重定向则会造成信息丢失。
  6. 转发只能将请求转发给同一个WEB应用中的组件,重定向可以指向任何的资源,包括当前应用程序中的其他资源,同一个站点上的其他应用程序中的资源,其他站点的资源。

  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式】代理模式——静态动态代理

【设计模式】代理模式——静态&动态代理 文章目录【设计模式】代理模式——静态&动态代理一&#xff1a;代理模式概述二&#xff1a;代理模式结构三&#xff1a;静态代理四&#xff1a;JDK动态代理1&#xff1a;简介2&#xff1a;步骤五&#xff1a;CGLIB动态代理六&am…

Python -- 元组、字典、集合

目录 1.元组的使用 1.1 访问元组 1.2 修改元组 1.3 count,index 1.4 定义只有一个数据的元组 2.字典的基本使用 2.1 字典的增删改查 2.2 字典的遍历 3.集合的使用 4.通用方法 1.元组的使用 Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。元组使…

测试人必备的Linux常用命令大全...【全网最全面整理】

Linux常用命令大全&#xff08;非常全&#xff01;&#xff01;&#xff01;&#xff09; 最近都在和Linux打交道&#xff0c;感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制&#xff0c;当然&#xff0c;这也是很多人喜欢linux的原因&#xff0c…

基于BP神经网络的数字识别系统仿真,带GUI界面

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 OCR&#xff08;Optical Character Recognition&#xff09;即光学字符识别技术&#xff0c;是通过扫描仪把印刷体或手写体文稿扫描成图像&#xff0c;然后识别成相应的计算机可直接处理的字符。…

SoapUI、Jmeter、Postman三种接口测试工具的比较分析

推荐阅读&#xff1a; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 前段时间忙于接口测试&#xff0c;也看了几款接口测试工具&#xff0c;简单从几个角度做了个比较&#xff0c;拿出来与…

水库信息化监测系统有哪些?水库信息化监测解决方案

一、背景分析 全国现有水库9.8万余座&#xff0c;小型水库占95.3%。小型水库数量最多&#xff0c; 主要分布山东、安徽、江西、广东、湖南、湖北、四川和云南&#xff0c;每个省小型水库数量超过5000座 全国中小型水库9万余座&#xff0c;其中4万余座存在病险&#xff0c;195…

图解设计模式:动动手玩转适配器模式

前言 &#x1f4e3; &#x1f4e3; &#x1f4e3; &#x1f4e2;&#x1f4e2;&#x1f4e2; ☀️☀️点开就是缘分认识一下&#xff0c;我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 &#x1f4d2; 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#xff0c;…

C++进阶 继承

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍C中继承的概念 继承的概念及定义 继承的概念 继承是一种面向对象编程的概念&#xff0c;它指的是一个类&#xff08;称为子类…

Win10关闭安全中心的病毒和威胁实时保护

一、遇到问题 想必大家在下载软件时&#xff0c;经常会遇到这样的问题&#xff1a;当我们下载好一个软件安装包时&#xff0c;当双击进行安装时&#xff0c;电脑却报出“无法成功完成操作&#xff0c;因为文件包含病毒或潜在的垃圾软件”。这是Win10的安全中心误以为此为问题软…

ShardingJDBC读写分离

ShardingJDBC是什么 看一看ChatGPT对他的解释&#xff1a; ShardingJDBC是一个数据库连接池&#xff0c;它为数据库的分片和读/写拆分提供支持。它允许您跨多个物理数据库和服务器分发数据&#xff0c;并根据设置的配置将读写操作路由到适当的数据库。 以下是它的工作原理&…

基于java+springmvc+mybatis+vue+mysql的校园拼车系统

项目介绍 本系统采用java语言开发&#xff0c;后端采用ssm框架&#xff0c;前端采用vue技术&#xff0c;数据库采用mysql进行数据存储。 管理员后台页面&#xff1a; 功能&#xff1a;首页、个人中心、学生管理、司机管理、订单信息管理、接单信息管理、留言信息管理 学生后…

小米(Android)刷NetHunter安装指南,无需ssh执行kali命令

一、安装NetHunter 前提&#xff1a;确保手机已经root&#xff0c;已装上magisk。如果没有root&#xff0c;可用尝试magisk root 后执行此文 1、下载Nethunter&#xff1a;Get Kali | Kali Linux 然后push 到sdcard 里&#xff0c; 2、打开magisk&#xff0c;选择刚刚下好的…

【问答篇】Java 基础篇面试题(一)

每天进步一点~ 01、问&#xff1a;空字符串的作用 package com.neuedu.nineteen;public class Test {public static void main(String[] args) {String s"";for (char i a; i < d; i) {ssi;//输出abcsis;//输出cba}System.out.println(s);} } 答&#xff1a;如…

[附源码]Node.js计算机毕业设计高校迎新管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

(五)springcloud之Nacos注册中心-2

最近因口罩事件&#xff0c;也被“阳"了。自己在宿舍&#xff0c;闲来无事。整理下Nacos的注册中心的知识点。 模块&#xff1a; 1.父工程&#xff08;管理版本&#xff09; 2.公共模块&#xff1a;Common-API 3.测试模块&#xff1a;NacosClientConfigConsumer80 版本&am…

Vue3基础语法(⼀)

文章目录02——Vue3基础语法&#xff08;⼀&#xff09;VSCode代码片段模板语法Mustachev-once指令v-textv-htmlv-prev-bind绑定class对象语法数组语法绑定style动态绑定属性绑定一个对象v-on基本使用参数传递修饰符02——Vue3基础语法&#xff08;⼀&#xff09; 上一节中的问…

股票列表接口数据API

国内股票行情股票列表接口数据API&#xff0c;包含5分钟、日线。 JSON返回示例 { "code": "000000", "message": "success", "result": [ "2017-04-10 14:55:00,15.190,15.230,15.180,15.190,3838901", &qu…

毕业设计-基于大数据的股票预测系统-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

数据挖掘|主成分分析|

一、主成分分析 在实际问题中&#xff0c;我们经常会遇到研究多个变量的问题&#xff0c;而且在多数情况下&#xff0c;多个变量之间常常存在一定的相关性。由于变量个数较多再加上变量之间常常存在一定的相关性&#xff0c;势必增加了分析问题的复杂性。如何从多个变量中综合为…

2022年下半年的软考成绩今天可以查询啦!!!

自2022年11月5-6日软考考试完成后&#xff0c;经过一个多月的等待&#xff0c;终于在2022年12月15日软考成绩出来啦&#xff01; 相信很多小伙伴们都怀着激动与愉悦的心情&#xff0c;迫切想查询一下自己的成绩&#xff01; 下面是弘博创新小编整理的软考成绩查询流程。 软考成…