转发_重定向

1.Servlet/JSP单独使用的弊端

当我们用Servlet或者JSP单独处理请求的时候

  • Servlet:拼接大量的html字符串 造成可读性差、难以维护
  • JSP:使得html和Java代码互相交织 也造成了可读性差、难以维护的后果

最合适的做法就是两者结合使用

2.Servlet+JSP处理请求的常见过程

在这里插入图片描述

  • 以上过程就是典型的MVC开发模式 即Model(数据)-View(页面展示)-Controller(控制器)模式 分别对应着上图中的数据库-JSP-Servlet

3.实现

  • 有了前面这层铺垫 再加上Servlet_JSP中介绍的EL和JSTL 那么我们就可以开始实现以下我们的crm项目了 即customer relationship management(客户关系管理系统) 我们采用的方式就是Servlet和JSP结合使用
  • 我们首先先来实现一下Servlet中不拼接html字符串、JSP中不内嵌Java代码的需求 即Servlet转发到JSP这一步
    Customer.java
    package com.mj.bean;public class Customer {// 定义成员变量// 姓名private String name;// 年龄private Integer age;// 身高private Double height;public Customer(String name, Integer age, Double height) {this.name = name;this.age = age;this.height = height;}public Customer() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Double getHeight() {return height;}public void setHeight(Double height) {this.height = height;}@Overridepublic String toString() {return "Customer{" +"name='" + name + '\'' +", age=" + age +", height=" + height +'}';}
    }
    
    ListServlet.java
    import com.mj.bean.Customer;
    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.ArrayList;
    import java.util.List;
    @WebServlet("/list")
    public class ListServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 将用户信息集合以键值对的形式储存到request中request.setAttribute("customers", getCustomers());// 然后将请求发送给JSP 并且跳转到JSP页面request.getRequestDispatcher("page/list.jsp").forward(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}// 定义一个获取用户信息的方法private List getCustomers(){// 首先我们创建一个List集合 用于储存用户信息List<Customer> customers = new ArrayList<>();// 我们还是假设有10个用户for(int i = 0; i < 10; ++i){customers.add(new Customer("张三" + i, 10 + i, 1.70 + i));}// 返回用户信息集合return customers;}
    }
    
    List.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <html>
    <head><title>展示用户信息</title><!-- 设置表格单元格的样式 --><style>th td {border: 1px solid black;}</style>
    </head>
    <body>
    <!-- 我们要以表格的形式来展示用户信息 -->
    <table><thead><tr><th>姓名</th><th>年龄</th><th>身高</th></tr></thead><tbody><c:forEach items="${customers}" var="customer"><tr><td>${customer.name}</td><td>${customer.age}</td><td>${customer.height}</td></tr></c:forEach></tbody>
    </table>
    </body>
    </html>
    
    • 一些小细节:
      • Customer.java中的成员变量统统设置为包装类的原因在于方便判空 我举个例子 比如我设置了一个price成员变量 如果设置为int基本类型 那么就无法判空 相反 如果设置为了包装类Integer的话 那么判空操作就十分容易
      • getRequestDispacher() 可以接收一个参数 表示的是转换的目的地 由于转发操作只能在同一个context中进行 所以你只需要写明Servlet/JSP在当前context中的路径即可
      • 我们在jsp中导入标签库的时候 语句为<%@taglib prefix="c" uri="xxx"%> 其中uri指的是导入的标签库路径 而prefix则为使用标签库中的标签时所加的前缀 设置前缀的意义在于可以区分不同标签库中的相同标签 避免产生歧义
      • 我们利用el获取了customers集合 他的本质为request.getAttribute(“customers”) 但是接下去获取集合中每一个元素的属性时 我们也利用了el 但是他的本质就不是request.getAttribute() 我想说的是el有自己的一套解析方式 他会根据不同的场合做出不同的举动

4.转发

  • 所谓转发 其实就是将请求发送给指定的接收方 并且跳转到接收方的界面
  • 转换操作只能在同一个context(项目 context就是用来定位部署到服务器软件上的项目的) 即只允许你在同一个项目中的不同Servlet/JSP(JSP的本质就是Servlet)进行转发操作

1.转发链条

  • 在同一个请求中 可以转发多次 形成一个转发链条
    • 在一个转发链条上 可以通过request.setAttribute、request.getAttribute进行数据共享(不同的context之间肯定是不可能发生数据共享的 原因在于转发操作只允许在同一个context中进行)
      在这里插入图片描述

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

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

相关文章

OpenCV4.9如何将失焦图片去模糊滤镜(67)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV4.9的基于距离变换和分水岭算法的图像分割(66) 下一篇 :OpenCV4.9去运动模糊滤镜(68) 目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是退化图像模型失焦图像的 PSF 是多少如何恢复…

【Linux调试器】:gdb的使用(常见指令)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux调试器gdb的使用&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

消除模型盲区,让透明件身后模型无所遁形

使用SOLIDWORKS设计产品出工程图&#xff0c;当模型中存在透明零部件时&#xff0c;由于位置摆放可能会遮挡其他零件。 这会影响零件在工程图中展示装配关系。 通常我们会采用剖视图或改变视图方向来展示被遮挡的零件。 SOLIDWORKS 2023版本发布了工程图中透视透明的零部件功能…

BUG:conda: command not found解决方法

文章目录 报错信息解决方法 报错信息 conda: command not found解决方法 直接输入 source ~/.bashrc看看这时输入conda有没有显示。如果没有的话,输入 vim ~/.bashrc 输入i进入编辑模式。之后 export PATH$PATH:[你自己conda的安装目录]输入vim的保存命令&#xff1a; ES…

分布式锁讲解

概括 分布式锁是一种用于在分布式系统中实现同步机制的锁。在单机系统中&#xff0c;我们可以使用如Java中的synchronized关键字或者 ReentrantLock来实现线程间的同步&#xff0c;但在分布式系统中&#xff0c;由于多个节点&#xff08;服务器&#xff09;之间的并发操作&am…

hbase建表预分区的2种方法

以下案例建表并设置预分区,分别测试以下2种方法 1.固定散列 示例:rowkey以日期为前缀 create ‘test’,‘cf1’, SPLITS > [‘202401’, ‘202402’, ‘202403’] put ‘test’,‘20240101’,‘cf1:name’,‘20240101’ put ‘test’,‘20240102’,‘cf1:name’,‘2024010…

Meta-SR: A Magnification-Arbitrary Network for Super-Resolution

CVPR2019https://github.com/XuecaiHu/Meta-SR-Pytorch 问题引入 首个解决任意尺度超分问题的模型&#xff0c;借鉴了meta-learning的思想&#xff1b;weight prediction strategy(meta-learning)&#xff1a;神经网络的权重是由另一个神经网络预测的&#xff0c;而不是通过从…

计算机中GPU快不行的几个标志,看下有没有你遇到的

GPU是处理图形密集型任务的主要组件。尽管它非常耐用,但它最终会磨损并开始失效。在到达生命的终结之前,它通常会显示出即将发生故障的迹象,需要及时修复或更换。本指南详细介绍了这些标志。 在我们开始之前 在深入研究GPU故障的迹象之前,重要的是要承认,下面提到的一些…

Cad图纸加密软件哪个最好用?成都企业都在用的透明加密软件是什么?

企业数据泄露事情频繁发生&#xff0c;为企业带来了不可计算机的经济损失&#xff0c;以及巨大的经营风险。在DT时代的到来&#xff0c;每一家企业的市场竞争本质上是知识产权的竞争&#xff0c;对于制造类企业来讲知识产权无疑是企业的cad图纸&#xff0c;制造类企业cad图纸的…

Java中常用类String的不可变性详解

Java中常用类String的不可变性详解 在Java编程中&#xff0c;String类是一个非常重要的基础类&#xff0c;它用于表示和操作字符串序列。然而&#xff0c;String类的一个核心特性是其不可变性&#xff08;immutable&#xff09;。这个特性在Java编程中有着重要的影响&#xff…

PXE批量部署,一键安装配置多台Linux系统

目录 一、PXE批量部署的优点 二、搭建PXE远程安装服务器 1. 实验初始化设置 2. 一键安装软件包 3. 复制 vmlinuz、initrd.img、pxelinux.0文件 4. 配置PE启动菜单配置文件 5. 修改配置文件&#xff0c; 启动各个软件服务 6. kickstart自动应答文件修改启动菜单配置文件…

【磁盘】用 gdisk 新增分区、删除分区

相关文章&#xff1a; 【Linux学习笔记16】磁盘的分区、格式化、检验与挂载(blkid、lsblk、UUID、parted查看分区的格式、lvm命令) 1. 用 gdisk 新增分区 如果你是按照鸟哥建议的方式去安装你的 CentOS 7&#xff0c;那么你的磁盘应该会预留一块容量来做练习的。如果没有的话…

什么是静态住宅代理IP?

静态住宅代理&#xff08;也称为静态ISP代理&#xff09;是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务&#xff1f;下面我具体分享。 一、什么是静态住宅代理&#xff1f; 首先&#xff0c;我…

【iOS】事件传递与响应机制

文章目录 前言事件UIEvent一、事件传递遍历顺序 二、手势识别三、响应机制UIResponder&#xff08;响应者&#xff09;响应者链 四、相关应用扩大button点击范围穿透事件 总结 前言 提到响应者链与事件传递&#xff0c;如果看过其他人的博客&#xff0c;经常能看到这经典的三张…

苍穹外卖Day06笔记

疯玩了一个月&#xff0c;效率好低&#xff0c;今天开始捡起来苍穹外卖~ 1. 为什么不需要单独引入HttpClient的dependency&#xff1f; 因为我们在sky-common的pom.xml中已经引入了aliyun-sdk-oss的依赖&#xff0c;而这个依赖低层就引入了httpclinet的依赖&#xff0c;根据依…

Docker部署Metabase

文章目录 Docker安装MetabaseCentOS7安装Docker获取最新的 Docker 镜像启动Metabase容器在Metabase初始化时查看日志访问Metabase Metabase 的 ClickHouse 驱动程序安装环境简介删除容器创建容器下载click house驱动放入驱动重启容器将元数据库连接到 ClickHouse报错解决 Docke…

【华为OD机试C卷D卷】部门人力分配(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 部门在进行需求开发时需要进行人力安排。 当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。 这部…

代码随想录算法训练营第36期DAY23

DAY23 530二叉搜索树的最小绝对差 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(null…

YOLOv9改进策略 | 添加注意力篇 | 一文带你改进GAM、CBAM、CA、ECA等通道注意力机制和多头注意力机制

一、本文介绍 这篇文章给大家带来的改进机制是一个汇总篇&#xff0c;包含一些简单的注意力机制&#xff0c;本来一直不想发这些内容的&#xff08;网上教程太多了&#xff0c;发出来增加文章数量也没什么意义&#xff09;&#xff0c;但是群内的读者很多都问我这些机制所以单…

2. SVG的使用方式

可缩放矢量图形&#xff08;SVG&#xff09;是一种基于XML的图像格式&#xff0c;用于网络上的二维图形。SVG允许图形在不同尺寸下保持高质量&#xff0c;这使得它非常适合响应式设计。本文将介绍SVG的几种使用方式&#xff0c;包括实例代码、应用场景以及各自的优缺点。 1 内…