JavaWeb+JSP内置对象+Session+Cookie+ 过滤器Filter+ 监听器Listener(超详细)

news2024/11/15 4:45:19

🙈作者简介:练习时长两年半的Java up主
🙉个人主页:老茶icon
🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎
📚系列专栏:Java全栈,计算机系列(火速更新中)
💭 格言:种一棵树最好的时间是十年前,其次是现在
🏡动动小手,点个关注不迷路,感谢宝子们一键三连

目录

  • 课程名:JavaWeb
    • 内容/作用:知识点/设计/实验/作业/练习
    • 学习:JavaWeb+JSP内置对象+Session+Cookie+ 过滤器Filter+ 监听器Listener(超详细)
  • 内容:
      • 续前章内容:在线图书商城
      • 续前章内容:在线图书商城
  • 带有外键关联的表的查询
    • 表结构
    • 实体类
    • 数据访问层
      • 方式一:定义连接查询的sql语句,适合关联字段比较少的情况
      • 方式二:分别编写不同表的查询,使用子查询。
  • JSP内置对象
  • Session和Cookie
    • session
      • session共享数据的原理
      • session对象常用方法
      • 设置项目全局session有效时长
    • cookie
      • 创建cookie
      • 保存cookie
      • 遍历cookie
    • session和cookie的对比
  • 过滤器Filter
    • 使用
  • 监听器Listener
    • 常用的监听器
    • 实现一个监听器
    • 完整代码
  • 总结

课程名:JavaWeb

内容/作用:知识点/设计/实验/作业/练习

学习:JavaWeb+JSP内置对象+Session+Cookie+ 过滤器Filter+ 监听器Listener(超详细)

内容:

续前章内容:在线图书商城

续前章内容:在线图书商城

   

带有外键关联的表的查询

表结构

主表book_type

在这里插入图片描述

从表

在这里插入图片描述

实体类

主表

public class BookType{
    private int typeId;
    private String typeName;
}

从表

public class BookInfo {
    private int bookId;
    //外键
    private int typeId;
    private String bookName;
    private String bookAuthor;
    private int bookPrice;
    private String publisher;
    private String publishDate;
    private int bookNum;
    private String bookImg;
    //额外添加一个属性:外键关联的表的实体对象
    private BookType bt;
}

数据访问层

方式一:定义连接查询的sql语句,适合关联字段比较少的情况

BookInfoDao类

public class BookInfoDao{

    private Connection conn;
    private PreparedStatement pst;
    private ResultSet rs;

    /*
    	查询从表数据
    */
    public List<BookInfo> queryAll() {
        List<BookInfo> list = new ArrayList<>();
        //定制连接查询的sql
        String sql = "select bi.*,type_name from book_info bi,book_type bt where bi.type_id=bt.type_id";
        conn = DBHelper.getConn();
        try {
            pst = conn.prepareStatement(sql);
            rs = pst.executeQuery();
            while (rs.next()) {
                /*
                	1-9是bi.*表示从表中的数据
                */
                int bookId = rs.getInt(1);
                int typeId = rs.getInt(2);
                int bookPrice = rs.getInt(5);
                int bookNum = rs.getInt(8);
                String bookName = rs.getString(3);
                String bookAuthor = rs.getString(4);
                String publisher = rs.getString(6);
                String publishDate = rs.getString(7);
                String bookImg = rs.getString(9);
                //10是额外的主表中的数据type_name
                String typeName= rs.getString(10);
                //创建从表对象,不包含外键属性
                BookInfo bookInfo = new BookInfo(bookId, typeId, bookName, bookAuthor, bookPrice, publisher, publishDate, bookNum, bookImg);
                //给外键属性赋值
                bookInfo.setBt(new BookType(typeId,typeName));
                list.add(bookInfo);
            }
        } catch (SQLException e) {
            System.out.println("查询所有异常" + e);
        } finally {
            DBHelper.release(conn, pst, rs);
        }
        return list;
    }
}

方式二:分别编写不同表的查询,使用子查询。

BookTypeDao

public class BookTypeDao{

    private Connection conn;
    private PreparedStatement pst;
    private ResultSet rs;

    /*
    	根据类型编号查询类型对象
    */
    public BookType findByTypeId(int typeId){
        String sql = "select * from book_type where type_id=?";
        conn = DBHelper.getConn();
        try {
            pst = conn.prepareStatement(sql);
            pst.setInt(1,typeId);
            rs = pst.executeQuery();
            while (rs.next()) {
                //返回查询到的图书类型对象
                return     new BookType(rs.getInt(1),rs.getString(2));
            }catch (SQLException e) {
                System.out.println("根据类型编号查询类型异常" + e);
            } finally {
                DBHelper.release(conn, pst, rs);
            }
            return null;
        }
    }
}

BookInfoDao

public class BookInfoDao{

    private Connection conn;
    private PreparedStatement pst;
    private ResultSet rs;

    //子查询时,需要用到另一个dao类中的方法
    private BookTypeDao bookTypeDao = new BookTypeDao();

    /*
    	查询从表数据
    */
    public List<BookInfo> queryAll() {
        List<BookInfo> list = new ArrayList<>();
        //定制连接查询的sql
        String sql = "select * from book_info";
        conn = DBHelper.getConn();
        try {
            pst = conn.prepareStatement(sql);
            rs = pst.executeQuery();
            while (rs.next()) {
                /*
                	1-9是bi.*表示从表中的数据
                */
                int bookId = rs.getInt(1);
                int typeId = rs.getInt(2);
                int bookPrice = rs.getInt(5);
                int bookNum = rs.getInt(8);
                String bookName = rs.getString(3);
                String bookAuthor = rs.getString(4);
                String publisher = rs.getString(6);
                String publishDate = rs.getString(7);
                String bookImg = rs.getString(9);
                //调用根据类型编号查询类型对象的方法
                BookType bt= bookTypeDao.findByTypeId(typeId);
				//创建从表实体对象
                BookInfo bookInfo = new BookInfo(bookId, typeId, bookName, bookAuthor, bookPrice, publisher, publishDate, bookNum, bookImg);
                //给外键属性赋值
                bookInfo.setBt(bt);

                list.add(bookInfo);
            }
        } catch (SQLException e) {
            System.out.println("查询所有异常" + e);
        } finally {
            DBHelper.release(conn, pst, rs);
        }
        return list;
    }
}

JSP内置对象

在JSP中,可以不用定义,就能直接使用的对象,称为内置对象。

一共有9个内置对象

“rrppsoace”

  • pageContext

    作用域对象,当前页面作用域。

  • request

    作用域对象,请求作用域。

  • session

    作用域对象,会话作用域。

  • application

    作用域对象,项目作用域。

  • response

    响应对象

  • out

    输出对象,相当于Servlet中的response.getWriter()方法的返回值对象

  • page

    表示当前页面自身对象,相当于servlet中的this

  • config

    配置对象,获取servlet的配置信息

  • exception

    异常对象,只能使用在有isErrorPage="true"声明的jsp页面中,用于获取异常对象

Session和Cookie

session

session称为会话,是一个作用域,使用session.setAttribute()保存数据,使用session.getAttribute()获取数据。

默认session会话有效期为30分钟,可以更改,超时或关闭浏览器,session失效。

保存在session中的数据,可以在同一个站点下的不同页面中共享。

session共享数据的原理

  • 访问任意JSP页面时,默认都会创建一个JSESSIONID(可以取消自动创建),是一段session编号,保存在一个cookie文件中

    <%--所有jsp页面中,默认开启了session--%>
    <%@ page session="true"%>
    
    <%--让页面默认不使用session--%>
    <%@ page session="false"%>
    

    自动生成的cookie文件信息,可以看出,随着浏览器关闭,session到期

在这里插入图片描述

  • 再次访问该页面时,会查询JSESSIONID是否存在,如果存在,直接使用,如果不存在,重新创建新的JSESSIONID
  • 保存该JSESSIONID的cookie文件,有效期为浏览会话结束。所以关闭浏览器,session失效

session对象常用方法

常用方法说明
getAttribute(String str)获取session中保存的数据,返回值为Object类型
setAttribute(String str,Object obj)将obj保存在session中,命名为str
removeAttribute(String str)移除保存在session中的对象str
invalidate()销毁session
getId()获取JSESSIONID
getMaxInactiveInterval()获取session有效时长,单位为秒,默认为1800
setMaxInactiveInterval(int second)设置session有效时长,单位为秒
getCreationTime()获取session创建时间,返回值为时间毫秒
getLastAccessedTime()获取最后一次访问session的时间,返回值为时间毫秒

设置项目全局session有效时长

在web.xml文件中设置,单位为分钟

<!--设置项目中所有session的有效时长,单位分钟-->
<session-config>
    <session-timeout>5</session-timeout>
</session-config>

cookie

cookie是一个用于保存数据的对象,实际是一个保存在客户本地的文件。关闭浏览器,cookie依然存在。手动清理或自动超时清理后,数据随之消失。

cookie通常用于更久地保存数据,即便关闭浏览器,也能一直存在。如登录信息、购物车信息等

cookie中保存的数据有上限(4kb),

cookie在浏览器中保存的数量也有上限(30~300根据浏览器不同略有变化)。

创建cookie

//Cookie(String name,String value);
Cookie ck = new Cookie("str","hello");
//设置有效时长,单位为秒,如果不设置,关闭浏览器,cookie失效
ck.setMaxAge(7*24*3600);//7天

保存cookie

response.addCookie(ck);

遍历cookie

Cookie[] cks = request.getCookies();
for(Cookie ck : cks){
    ck.getName();//获取name
    ck.getValue();//获取value
}

session和cookie的对比

  • session中保存的数据可以是任意类型,没有大小限制;cookie中保存的是键值对,单个值大小上限为4kb

  • session中保存的数据存在服务器中,cookie中保存的数据存在浏览器中。

  • session到期或随着浏览器关闭而失效,cookie如果设置了有效时长,即使关闭浏览器也会存在,在到期或手动清理时失效

过滤器Filter

是一个特殊的servlet

在这里插入图片描述

使用

1.新建一个类,继承HttpFilter

2.重写doFilter()方法,设置过滤条件

package com.hqyj.book_shop.filter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
 * 自定义过滤器
 * 1.创建一个类,继承HttpFilter
 * 2.重写受保护的doFilter方法
 * 3.配置过滤器
 * */
public class MyFilter extends HttpFilter {

    @Override
    protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
        //获取当前访问的uri(地址)
        String uri = req.getRequestURI();
        System.out.println(uri + "访问过滤器");
        //如果登录成功后,session会保存customer。
        //过滤器中判断当前session中是否存在customer
        if (req.getSession().getAttribute("customer") != null) {
            chain.doFilter(req, res);
            return;
        }
        //如果session中没有customer,只能放行登录、注册页及其相关静态资源和customer模块
        if (uri.contains("html")  || uri.contains("jquery")|| uri.contains("customer")) {
            chain.doFilter(req, res);
        }else{
            //否则跳转登录页
            res.sendRedirect("http://localhost:8080/book_shop/pages/login.html");
        }
    }
}

3.配置过滤器,过滤一切请求

<!--声明一个过滤器-->
<filter>
    <!--过滤器名,无限制-->
    <filter-name>myFilter</filter-name>
    <!--过滤器类全限定名-->
    <filter-class>com.hqyj.book_shop.filter.MyFilter</filter-class>
</filter>
<!--配置过滤器映射-->
<filter-mapping>
    <!--过滤器名,与上方对应-->
    <filter-name>myFilter</filter-name>
    <!--过滤一切请求-->
    <url-pattern>/*</url-pattern>
</filter-mapping>

监听器Listener

监听一些特殊的事件,当这些事件发生的时候,监听器的代码就会执行 作用:框架的加载和初始化, 记录日志。。。

常用的监听器

  • ServletContextListenser application监听器

  • HttpSessionListener session监听器

  • ServletRequestListenser request监听器

实现一个监听器

  1. 创建一个类,实现监听器接口
  2. 重写初始化和销毁的方法
  3. 在web.xml中配置监听器
<!-- 配置监听器-->
<listener>
<!-- 监听器的类名-->
<listener-class>com.hqyj.book_shop.listener.MyListener</listener-class>
</listener>
  1. 也可以通过注解的方式配置监听器: @WebListener

完整代码

package com.hqyj.book_shop.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class MyListener implements ServletContextListener, HttpSessionListener,
ServletRequestListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("应用初始化:tomcat服务器启动时执行");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("应用销毁:tomcat停止时");
    }
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("请求结束:一个请求后台响应完成后执行");
    }
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("请求开始:发起请求时执行");
    }
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("session创建:浏览器第一次发送请求时执行");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session销毁: 超时之后(或代码结束session)执行");
    }
}

总结

   好好学习,天天向上。

往期专栏
Java全栈开发
数据结构与算法
计算机组成原理
操作系统
数据库系统
物联网控制原理与技术

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

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

相关文章

从 Milvus 2.2 到 2.2.6,我们是如何持续稳定升级的

最近&#xff0c;Milvus 发布了 2.2.6 版本&#xff0c;在修复了一些 bug 后&#xff0c;Milvus 变得越发稳定。 事实上&#xff0c;自 Milvus 升级至 2.X 版本以来&#xff0c;我们一直在努力改进及优化&#xff0c;推出了诸如从文件中批量导入数据、基于磁盘的近似最近邻&…

通过ppt制作圆形图标及自定义形状图形制作

今天做PPT时&#xff0c;需要一个圆形的截图&#xff0c;日常截图都是方形的&#xff0c;能不能把截图裁剪为一个圆形呢&#xff1f;于时从网上找了一下&#xff0c;发现还真有。 制作工具&#xff1a;PPT 制作步骤&#xff1a; 1、准备图片 将截图或图片插入PPT中 2、在…

(04)基础强化:接口,类型转换cast/convert,异常处理,传参params/ref/out,判断同一对象

一、复习 1、New的截断是指什么&#xff1f; new除了新开空间创建初始化对象外&#xff0c;还有一个隐藏父类同名方法的作用。 当子类想要隐藏父类同名的方法时用new&#xff0c;用了new后父类同名方法将到此为止&#xff0c;后面 继承的…

electron+vue3全家桶+vite项目搭建【15】vue3+sass实现多主题一键切换,支持electron多窗口同步更新

文章目录 引入实现效果展示实现思路整理实现步骤1.定义全局主题样式变量2.定义主题模板3.封装颜色工具类4.初始化主题色5.主进程监听颜色修改6.补充主题状态管理7.主题一键切换组件8.测试案例 引入 我们之前在这篇文章中集成了 sass&#xff0c;接下来我们结合sass的变量定义&…

银行数字化转型导师坚鹏:宏观经济形势分析与银行发展模式创新

宏观经济形势分析与银行发展模式创新 课程背景&#xff1a; 很多学员存在以下问题&#xff1a; 不知道我国目前的宏观经济形势&#xff1f; 不清楚宏观环境对我国经济的影响&#xff1f; 不知道银行未来主要的发展模式&#xff1f; 课程特色&#xff1a; 精彩解读宏…

最新:机器学习在生态、环境经济学中的实践技术应用及论文写作

查看原文>>>最新&#xff1a;机器学习在生态、环境经济学中的实践技术应用及论文写作 目录 专题一、理论基础与软件介绍 专题二、数据的获取与整理 专题三、常用评价方法与相关软件详细教学&#xff08;案例详解&#xff09; 专题四、写作要点与案例的讲解 近年来…

Redis数据库常用语句

Redis数据库常用语句 前言1. 键(Key)的基本操作1.1 增加新的键值对1.2 访问键的值1.3 修改键值对1.4 键值对的删除1.5 判断键值对是否存在1.6 获取所有键1.7 删除所有的键&#xff1a; 2. Redis 中的列表2.1 列表加入新元素2.2 获取列表长度2.3 获取指定下标的元素2.4 获取指定…

Android App 架构 面试专题,你可能会被问到的 20 个问题

iveData 是否已经被弃用? 没有被弃用。在可以预见的未来也没有废弃的计划。 LiveData 可以使用简单的方式获取一个易于观察、状态安全的对象。虽然其缺少一些丰富的操作符&#xff0c;但是对于一些简单的 UI 业务场景已经足够。 Flow 有 LiveData 相同的功能&#xff0c;其…

1.栈的介绍-C语言调用函数(二)

1.栈的介绍-C语言调用函数&#xff08;一&#xff09;_双层小牛堡的博客-CSDN博客 接着上面 函数调用的约定 在栈帧中 主要的是主调函数如何存入实参 让被调用函数能够访问 这种是通过函数见的调用规定来规范的 并且 调用规定还规范了 函数执行完后应该由主函数实现 清除参…

[测试猿课堂]小白怎么学测试?史上最全《软件测试》学习路线

熬夜3天&#xff0c;联合3位猿计划教育的总监级授课老师&#xff0c;整理了这份《软件测试小白学习路线》&#xff0c;全文接近6000字&#xff0c;请大家耐心看完&#xff01; 对于很多想通过自学转行软件测试的同学&#xff0c;痛点并不是学习动力&#xff0c;而是找不到清晰…

Apache SeaTunnel 3 分钟入门指南

简介 新一代分布式超高性能云原生数据同步工具 - Apache SeaTunnel 已经在B站、腾讯云、字节等数百家公司使用。 SeaTunnel 是 Apache 软件基金会下的一个高性能开源大数据集成工具&#xff0c;为数据集成场景提供灵活易用、易扩展并支持千亿级数据集成的解决方案。SeaTunnel …

《计算机网络--自顶向下方法》第三章--运输层

3.1概述和运输层服务 运输层协议为运行再不同主机上的应用进程之间提供了逻辑通信&#xff08;logic communication&#xff09;功能 运输层协议是在端系统中而不是在路由器中实现的 3.1.1运输层和网络层的关系 运输层协议至工作在端系统中 在端系统中&#xff0c;运输层…

基于Mybatis使用MySql存储过程,实现数据统计功能

1、前言 作为一个工作了很多年的程序员来说&#xff0c;没有在实际工作中真正使用过存储过程&#xff0c;其实对存储过程本身有过了解和学习&#xff0c;在日常的学习中&#xff0c;也会看过一些存储过程的相关介绍&#xff0c;不过“纸上得来终是浅”&#xff0c;正好这次做统…

Linux 利用网络同步时间

yum -y install ntp ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ntpdate ntp1.aliyun.com 创建加入crontab echo "*/20 * * * * /usr/sbin/ntpdate -u ntp.api.bz >/dev/null &" >> /var/spool/cron/rootntp常用服务器 中国国家授…

力扣sql中等篇练习(十三)

力扣sql中等篇练习(十三) 1 每位学生的最高成绩 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 #先找到最大的元素 然后分组即可,不用管某些字段(grade)是不是聚合字段 SELECT e1.student_id,min(e1.course_id) course_id,e1.grade FROM Enrollment…

setup.py方式打包自己的python代码并可以用pip install安装

setup.py方式打包自己的python代码并可以用pip install安装 所需文件及目录规范示例演示引用自己打的包 所需文件及目录规范 注意setup.py文件和MANIFEST.in文件需要放在和你需要打包的目录同一级下&#xff0c;例如我这里需要打包的就是webconsole文件夹&#xff08;这里webc…

gl-opendrive插件(车俩3D仿真模拟自动驾驶)

简介 本插件基于免费opendrive开源插件、Threejs和Webgl三维技术、vue前端框架&#xff0c;blender开源建模工具等进行二次开发。该插件由本人独立开发以及负责&#xff0c;目前处于demo阶段&#xff0c;功能还需待完善&#xff0c;由于开发仓促代码还需优化。 因此&#xff…

35岁测试人,面临职场危机,打了一场漂亮的翻身仗...

“夜深知雪重&#xff0c;时闻折竹声”。雪折&#xff0c;一种在雪的载荷下&#xff0c;植物&#xff08;多指树&#xff09;的躯干或枝条被不断堆积的雪花压断的现象。我的刚刚经历了人生的第一次“雪折”。 我是一个有点聪明且勤奋好学的人&#xff0c;从考入省重点大学起&a…

Windows环境下C++ 安装OpenSSL库 源码编译及使用(VS2019)

参考文章https://blog.csdn.net/xray2/article/details/120497146 之所以多次一举自己写多一篇文章&#xff0c;主要是因为原文内容还是不够详细。而且我安装的时候碰到额外的问题。 1.首先确认一下自己的代码是Win32的还是Win64的&#xff0c;我操作系统是64的&#xff0c;忘…

java websocket实现聊天室 附源码

目录 1.Socket基础知识 2.socket代码实现 2.1 引入依赖 2.2 配置websocket 2.3 websocket的使用 2.4 webSocket服务端模块 2.5 前端代码 3.测试发送消息 4.websocket源码地址 1.Socket基础知识 Socket&#xff08;套接字&#xff09;用于描述IP地址和端口&#xff0c…