转发_重定向

news2025/1/18 6:41:19

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;
        }
    
        @Override
        public 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.coloradmin.cn/o/1658759.html

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

相关文章

Node.js安装与配置环境 v20.13.1(LTS)

1 下载 Node.js — Run JavaScript Everywhere LTS -- long-term support&#xff0c;长期维护版本 如果要下载其他版本在download里选择下载 2 安装 一路点击next&#xff0c;默认安装路径C:\Program Files\nodejs 3 环境变量配置 1&#xff09;Path环境变量增加nodejs安装…

GUI-图形化的用户界面

一、概述 所谓GUI&#xff0c;即图形化的用户界面/接口&#xff08;Graphical User Interface&#xff09;&#xff0c;实现了采用图形方式显示的计算机操作用户界面。比如下面的QQ登录界面&#xff1a; 为了不被落下&#xff0c;Java依旧稳定发挥&#xff0c;它也提供了一套…

【全开源】Java U U跑腿同城跑腿小程序源码快递代取帮买帮送源码小程序+H 5+公众号跑腿系统

特色功能&#xff1a; 智能定位与路线规划&#xff1a;UU跑腿小程序能够利用定位技术&#xff0c;为用户提供附近的跑腿服务&#xff0c;并自动规划最佳路线&#xff0c;提高配送效率。订单管理&#xff1a;包括订单查询、订单状态更新、订单评价等功能&#xff0c;全行业覆盖…

Excel Module: Iteration #1 EasyExcel生成下拉列表模版时传入动态参数查询下拉数据

系列文章 EasyExcel生成带下拉列表或多级级联列表的Excel模版自定义校验导入数据(修订) 目录 系列文章前言仓库一、实现1.1 下拉元数据对象1.2 构建下拉元数据的映射关系1.3 框架方式1.3.1 框架实现1.3.2 框架用例模版类加载下拉业务导出接口 1.4 EasyExcel方式1.4.1 EasyExce…

ESP8266基础资源了解

封装的硬件资源 参考1&#xff0c;参考2 常说的esp8266指的是有一个屏蔽罩盖着的模块&#xff0c;里面包含了esp8266芯片和一个能够存储数据和程序的flash&#xff0c;因为esp8266没有存储功能。 使用arduino常用的nodemcu是包含这个模块并含有电源LDO和串口下载的设计电路如…

【知识碎片】2024_05_09

本篇记录了关于C语言的一些题目&#xff08;puts&#xff0c;printf函数的返回值&#xff0c;getchar&#xff0c;跳出多重循环&#xff09;&#xff0c;和一道关于位运算的代码&#xff3b;整数转换&#xff3d;。 C语言碎片知识 如下程序的功能是&#xff08; &#xff09; #…

原来pip是有默认路径的。

今天一直报错&#xff1a; bash: /root/data1/anaconda3/envs/li_3_10/bin/pip: /root/lsc/anaconda3/envs/li_3_10/bin/python: bad interpreter: No such file or directory 原来是root/data1/anaconda3/envs/li_3_10/bin/pip: 这个位置的pip 自身带默认路径&#xff0c;然…

使用css的box-reflect属性制作倒影效果

box-reflect 是一个在 CSS 中创建元素倒影效果的非标准属性。尽管它在过去的一些 WebKit 浏览器中&#xff08;如旧版的 Safari 和 Chrome&#xff09;得到了支持&#xff0c;但由于它并未成为 CSS 标准的一部分&#xff0c;因此在现代浏览器中的兼容性较差。以下是对 box-refl…

C++ | Leetcode C++题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {int n nums.size();if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slo…

03-Fortran基础--Fortran函数和子程序

03-Fortran基础--Fortran函数和子程序 0 引言1 各函数介绍1.1 函数&#xff08;Functions&#xff09;1.2. 子程序&#xff08;Subroutines&#xff09;1.3 递归函数&#xff08;Recursive Functions&#xff09;1.4. 泛型函数&#xff08;Generic Functions&#xff09;1.5. P…

blender 制作圆角立方体模型,倒角实现。cocos 使用。导出fbx

图片&#xff1a; 步骤&#xff1a; 1.首先创建一个立方体&#xff0c;这里可以使用默认的立方体。 2.在属性面板选择如“扳手”图标一样的修改器工具。 3.设置数量和段数实现圆角的圆滑效果&#xff0c;没有菱角。 保存导出相关的教程&#xff1a;

短信平台群发服务有什么优点

短信平台群发服务有什么优点 提高营销效率 短信平台群发服务利用自动化技术&#xff0c;可以帮助企业迅速向大量潜在客户营销信息。相比传统的逐一方式&#xff0c;群发服务可以同时大批目标客户&#xff0c;大大提高了营销效率。企业可以轻松地在短时间内覆盖更多的潜在客户&…

开源免费的定时任务管理系统:Gocron

Gocron&#xff1a;精准调度未来&#xff0c;你的全能定时任务管理工具&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发&#xff0c;是一个轻量级定时任务集中调度和管理系统&#xff0c;用于替代L…

Python 2.x与Python 3.x:初学者该如何选择?

自从Python在1994年首次发布以来,已经经历了多个版本的更新和改进。Python 1.x虽然在发展史上具有重要意义,但早已过时,不再用于实际开发。2000年发布的Python 2.x和2008年发布的Python 3.x则成为了Python家族中最常用的两个版本,形成了一个重要的分界线。特别是Python 3.x…

FPGA+HDMI转换方案,用于网络直播切换直播画面,客户应用:直播,自媒体

FPGAHDMI转换方案&#xff0c;用于网络直播切换直播画面 客户应用:直播&#xff0c;自媒体 主要功能: 1.支持多路HDMI高清输入/输出 2.支持各路输入输出灵活切换 3.支持USB接口 4.支持网口 5.支持音频输出接口 6.支持serders

吴恩达机器学习笔记:第 9 周-17大规模机器学习(Large Scale Machine Learning)17.3-17.4

目录 第 9 周 17、 大规模机器学习(Large Scale Machine Learning)17.3 小批量梯度下降17.4 随机梯度下降收敛 第 9 周 17、 大规模机器学习(Large Scale Machine Learning) 17.3 小批量梯度下降 小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法&…

【SRC实战】利用APP前端加密构造数据包

挖个洞先 https://mp.weixin.qq.com/s/ZnaRn222xJU0MQxWoRaiJg “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合” 01 — 漏洞证明 “ 参数加密的情况&#xff0c;不会逆向怎么办&#xff1f;” 1、新用户首次设置密码时抓包&#xff0c;此处设置为0000…

【最大公约数 唯一分解定理 调和级数】2862. 完全子集的最大元素和

本文涉及知识点 质数、最大公约数、菲蜀定理 组合数学汇总 唯一分解定理 调和级数 LeetCode2862. 完全子集的最大元素和 给你一个下标从 1 开始、由 n 个整数组成的数组。你需要从 nums 选择一个 完全集&#xff0c;其中每对元素下标的乘积都是一个 完全平方数&#xff0c;例…

《系统架构设计师教程(第2版)》第10章-软件架构的演化和维护-06-大型网站系统架构演化实例

文章目录 第一阶段&#xff1a;单体架构第二阶段&#xff1a;垂直架构第三阶段&#xff1a;使用缓存改善网站性能第四阶段&#xff1a;使用服务集群改善网站并发处理能力第五阶段&#xff1a;数据库读写分离第六阶段&#xff1a;使用反向代理和CDN加速网站响应第七阶段&#xf…

Java | Leetcode Java题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) {int n nums.length;if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slow;}fast;}return sl…