day40_servlet

news2024/11/24 20:54:45

今日内容

零、 复习昨日
一、注解
二、改造项目
三、请求转发
四、重定向

零、 复习昨日

一、注解(Annotation)

注解,又称为注释.它是给程序看的注释.

JDK1.5后才出现的,作用是为了提高开发效率的,如何做到?(一个注解可以简化很多很多代码…)

常见注解: @Override

1.1 自定义注解

1.1.1 新建注解文件

public @interface MyLog {
}

1.1.2 注解加元注解

  • 元注解是给注解加的注解
  • @Target @Retention @Documented @Inherited

@Target

定义自定义注解目标,即注解能作用哪些地方

image-20220902165726025

@Retention

指定注解的保留策略,即注解在什么时期生效.

image-20220902165944320

1.1.3 设置参数

@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {
    
    /**
     * 注解的参数,写法是
     * 数据类型 参数名();
     * 参数名设置成value的话,用注解时可以省略
     *      @注解(值)
     * 如果设置成别的名字,使用时参数名不能省略必须是
     *      @注解(参数名1=值)
     * 一旦注解参数超过2个,使用时全部都有加上参数名
     *      @注解(参数名1=值,参数名2=值)
     */
    int value();
    String m2() default "";
    double m3() default 0.0;
}

1.1.4 使用注解

在需要的地方之间加注解即可

1.2 利用反射读取注解内容

模拟UserDao

public class UserDao {


    @MyLog("查询用户")
    @MyAnno
    public void selectOne() {}

    @MyLog("查询全部用户")
    public void selectAll() {}

    @MyLog("删除用户")
    public void deleteOne() {}

}

测试,反射读取注解

public class TestReflact {

    public static void main(String[] args) throws Exception {
        Class<?> userDaoClass = Class.forName("com.qf.annotation.UserDao");
        Method[] methods = userDaoClass.getDeclaredMethods( );

        for (int i = 0; i < methods.length; i++) {
            Method method = methods[i];
            // 获得方法上的注解
            MyLog log = method.getAnnotation(MyLog.class);
            String value = log.value( );

            System.out.println("log = "+value );
            /**
             * 将来可以再获得请求ip,用户名,等信息,配合日志信息插入到数据库
             * 记录到日志表中
             */
        }
    }
}

二、注解改造项目

问题:

​ 每个请求映射,都需要写web.xml的映射

解决:

​ 提供了注解方案

实现:

​ ps: 同一映射,web.xml配置和注解不能共存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1g4CjAjD-1685257229055)(C:/Users/qiush/AppData/Roaming/Typora/typora-user-images/image-20230524111411581.png)]

三、idea配置热部署

换句话就是,可以实现修改代码不重启服务器.

设置idea的Tomcat为这样

image-20230524112659037

image-20221129095612050

设置完之后,修改前端页面,只需要鼠标离开代码,idea就会自动更新前端代码


设置完之后,修改后端代码,只需要点击下面地方,就可以更新服务器中的代码

image-20221129100901138

四、请求转发

3.1 现有问题

  • 响应的代码与接收请求代码在一起
  • 查询全部的代码与登录的代码在一起
  • 这也没有遵循单一职责,不便于后期维护

3.2 解决

  • 将代码拆开
  • 登录请求完之后,再单独设计个Servlet去做查询全部
  • 查询全部之后再单独的做响应
  • 这就是请求转发

3.3 演示

3.3.1 请求转发跳转servlet

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("1 接收请求" );
        System.out.println("2 调用业务层处理数据" );

       // 查询全部
        /**
         * 请求转发,
         * 是服务器内部动作
         */
        // RequestDispatcher rd = req.getRequestDispatcher("/list");
        // rd.forward(req,resp);

        // 一般会简写
        req.getRequestDispatcher("/list").forward(req,resp);

        System.out.println("5 登录结束...." );

    }
}
@WebServlet("/list")
public class ListServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("3查询全部数据..." );

        System.out.println("4 查询全部响应" );
    }
}

3.3.2 请求转发跳转页面

@WebServlet("/page")
public class PageServlet  extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 请求转发是服务器动作,从服务器根路径出发
         * 服务器资源的根路径:/webapp/
         * a.html b.jsp 都定义在/webapp/下
         * c.jsp在 /webapp/WEB-INF/下,所以请求转发时需要加上WEB-INF
         */
        // req.getRequestDispatcher("/a.html").forward(req,resp);
        // req.getRequestDispatcher("/b.jsp").forward(req,resp);
        req.getRequestDispatcher("/WEB-INF/c.jsp").forward(req,resp);
    }
}

image-20230524151019552

3.4 请求域

  • 在两个servlet请求转发时,会存在A类的数据需要传递给B类
  • 此时就需要使用请求对象的请求域功能
  • req.setAttribute(key,value),这样就可以将数据存储在请求对象
  • 再另外一个servlet使用请求对象取出值req.getAttribute(“key”)

image-20220905102349084

image-20220905102434594

3.5 特点

  • 请求转发地址栏不变,这是一次请求
  • 请求转发是服务器内部行为
  • 当做域对象使用,即相当于容器,可以装载数据
  • 两个servlet中请求域数据在一次请求转发中共享

image-20220905105311320

回忆政府办公场景…

五、重定向

重定向也可以使用Servlet直接的跳转,以及跳转页面.

resp.sendRedirect("路径");

演示:

image-20220905112909073

image-20220905112947513

  • 特点
    • 重定向是响应重定向,是浏览器行为
    • 两次请求
    • 地址栏会变化
    • 请求域数据无法共享

image-20220905113940255

六、路径问题

请求转发是服务器行为,服务器根路径是项目名,

​ 所以发请求,从/开始,不会丢失项目名

重定向是浏览器行为,浏览器根路径是端口

​ 所以发请求,从/开始,就会丢项目名

// req.getContextPath(); // 获得项目名 ,例如 /day40
resp.sendRedirect(req.getContextPath()+"/redirect2"); // 拼接项目名


[外链图片转存中…(img-r55gqFJu-1685257229058)]

六、路径问题

请求转发是服务器行为,服务器根路径是项目名,

​ 所以发请求,从/开始,不会丢失项目名

重定向是浏览器行为,浏览器根路径是端口

​ 所以发请求,从/开始,就会丢项目名

// req.getContextPath(); // 获得项目名 ,例如 /day40
resp.sendRedirect(req.getContextPath()+"/redirect2"); // 拼接项目名


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

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

相关文章

Linux基础开发工具之软件包管理器

目录 前言 1.什么是软件包 2.软件下载的三种方式 3. Linux软件生态 4. 使用yum安装软件 5.yum源的相关介绍 总结&#xff1a; 前言 Linux作为一款操作系统&#xff0c;其自然也和我们其他的操作系统一样需要安装对应得软件去满足我们的需求&#xff0c;因此为了更好的下载…

ICV报告: ADAS SoC市场规模将在2024年迎来较大突破

随着先进驾驶辅助系统&#xff08;ADAS&#xff09;的出现和对于自动驾驶的追求&#xff0c;汽车行业正在经历快速转型。这些技术进步的核心是ADAS SoC&#xff0c;它是实现多个功能集成于单一平台的关键组件。ADAS SoC已经成为智能汽车的重要驱动因素&#xff0c;彻底改变了安…

ArduPilot开源代码之H743+BMI270x2+ChibiOS配置适配

ArduPilot开源代码之H743BMI270x2ChibiOS配置适配 1. 源由2. 配置适配2.1 bootloader配置2.2 flight controller配置 3. 4.3.6固件编译Step 1: 获取源代码Step 2: 准备编译环境Step 3: 复制配置文件Step 4: 编译bootloaderStep 5: 编译飞控 4. 基础配置4.1 机型配置4.2 IMU校准…

通过python采集lazada商品详情数据接口,支持多站点。

为了采集Lazada商品详情&#xff0c;您可以使用Python的网络爬虫库&#xff08;例如BeautifulSoup、Scrapy等&#xff09;来获取页面内容。以下是基本步骤&#xff1a; 安装所需的Python库&#xff08;例如requests、BeautifulSoup等&#xff09;。使用requests库发送GET请求并…

C/C++开发,libiec61850库学习及运用

目录 一、libiec61850库下载编译 1.1 下载 1.2 linux编译&#xff1a; 1.3 win编译 二、案例编译测试 2.1 CMakeLists.txt调整(server_example_goose) 2.2 模型static_model.h/static_model.cpp生成 2.3 案例编译(server_goose) 2.4 客户端编译 2.5 运行测试 一、libiec61850…

SAP-MM 条件类型字段解析

01、“定价类型”&#xff1a;定义此条件类型的代码和描述&#xff0c;代码不能重复&#xff0c;描述可更改&#xff0c;根据实际需要&#xff0c;条件类型可定制&#xff1b; 02、“存取顺序”&#xff1a;表示此条件类型在定价时&#xff0c;要到存取顺序号定义的条件表中读…

学C的第二十二天【深度剖析数据在内存中的存储:1. 数据类型介绍;2. 整型在内存中的存储】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a;学C的第二十一天【初阶测评讲解&#xff1a;1. 计算递归了几次&#xff1b;2. 判断 do while 循环执行了几次&#xff1b;3. 求输入的两个数的最小公倍数&#xff1b;4. 将一句话的单词进…

day39_servlet

今日内容 零、复习昨日 一、接收请求 二、处理响应 三、综合案例 零、复习昨日 见晨考 一、接收请求 浏览器发出请求,经过web.xml映射匹配,找到Servlet对应的方法(doGet/doPost),接收请求数据,可以接收请求中的请求行,请求头,请求正文&#xff0c;具体流程如下 浏览器发出请求 …

OpenAI ChatGPT API + FaskAPI SSE Stream 流式周转技术 以及前端Fetch 流式请求获取案例

先填坑&#xff0c;一贯习惯 nginx如果要支持SSE&#xff0c;要调整一些参数 conf配置文件&#xff0c;AI给的&#xff0c;具体自己没搭&#xff0c;应该是正确的 nginx worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_typ…

Ubuntu下编译运行MicroPython Unix版本

文章目录 github拉取源码更新模块编译运行 github拉取源码 到Github(https://github.com/micropython/micropython)上下载源码 终端输入&#xff0c;如果提示识别不到gh命令&#xff0c;就sudo apt-get install gc安装一下。 再根据提示在终端里登录自己的github账号。 再次…

Hystrix 服务熔断

书籍,人,借阅服务之间相互调用, 高度耦合, 一旦一个服务故障, 其他服务会雪崩, 和多米诺骨牌一样 Hystrix 熔断器, 保险丝 服务降级 提供补救措施发给请求者, 服务可用, 能力下降了 borrow-service 导入依赖 <dependency><groupId>org.springframework.cloud&l…

linux kernel pwn 常用结构体

tty 设备结构体 tty 设备在 /dev 下的一个伪终端设备 ptmx 。 tty_struct&#xff08;kmalloc-1k | GFP_KERNEL_ACCOUNT&#xff09; tty_struct 定义如下 。 /* tty magic number */ #define TTY_MAGIC 0x5401struct tty_struct {int magic;...const struct tty…

python学习-基础知识总结

&#xff08;一&#xff09;基础语法 1.1、注释 程序添加注释&#xff0c;可以用来解释程序某些部分的作用和功能&#xff0c;提高程序的可读性&#xff0c;注释有两种形式&#xff1a; 单行注释&#xff1a;#多行注释&#xff1a;单引号&#xff08;注释内容&#xff09;或双…

【剑指offer】数据结构——字符串

目录 数据结构——字符串直接解【剑指offer】05. 替换空格【剑指offer】17. 打印从1到最大的n位数【剑指offer】20. 表示数值的字符串【剑指offer】37. 序列化二叉树【剑指offer】50. 第一个只出现一次的字符【剑指offer】58. 翻转单词顺序【剑指offer】58.2 左旋转字符串【剑指…

C++多态 万字详解

在经历两个多月的备赛后&#xff0c;最终5.21结果出来后自己也比较满意&#xff0c;以一个省三收尾&#xff08;算法类的&#xff09;。 期间每天偶尔学学新知识&#xff0c;然后主要做题&#xff0c;博客也落下了不少&#xff0c;现在开始继续补&#xff08;可能会些许生疏&a…

【剑指offer】数据结构——数组

目录 数据结构——数组直接解【剑指offer】03.数组中重复的数字排序法集合法原地置换 【剑指offer】04. 二维数组中的查找【剑指offer】29. 顺时针打印矩阵【剑指offer】39. 数组中出现次数超过一半的数字【剑指offer】40. 最小的k个数【剑指offer】45. 把数组排成最小的数【剑…

C++ 实现命令行画心形代码,有多个爱心代码,简单可调数据和字符,可装X,也可用于浪漫的表白,可实现跳动、保存等功能

绘制一个简易爱心 #include <stdio.h> #include <Windows.h>int main() {for (float y 1.5f; y > -1.5f; y - 0.1f){for (float x -1.5f; x < 1.5f; x 0.05f){float z x * x y * y - 1;float f z * z * z - x * x * y * y * y;putchar(f < 0.0f ?…

一文带你了解MySQL之基于规则的优化

前言&#xff1a; 大家别忘了MySQL本质上是一个软件&#xff0c;MySQL的并不能要求使用这个软件的人人都是数据库的高手&#xff0c;就像我写这篇文章的时候并不能要求各位在学之前就会了里边的知识。也就是说我们无法避免某些小伙伴写一些执行起来十分耗费性能的语句。即使是…

【youcans 的图像处理学习课】22. Haar 级联分类器

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的图像处理学习课】22. Haar 级联分类器 3. Haar 特征及其加速计算3.1 Haar 特征3.2 Haar 特征值的计算3.3 积分图像3.4 基于积分图像加速计算 Haar 特…

MATLAB 如何以海森频率格子格纸的形式绘制频率分布曲线?

思路&#xff1a;将水文频率在海森格纸上对应的位置算出来&#xff0c;通过更改坐标轴标签制作海森频率格纸 先放参考链接&#xff1a; norminv 如何利用matlab在海森几率格纸上绘制图形 clc clear close all%% 随机生成径流系列&#xff0c;并计算对应频率 q randi(1000,…