【web后端(十一)】jsp、servlet_会话管理_servletContext应用示例

Jakarta EE 实验 — Web 聊天室(Web Chatroom)开发(一) 摘要:本实验基于Jakarta Servlet技术开发了一个简易Web聊天室系统。项目采用Maven Webapp架构,使用Session管理用户状态,ServletContext实现应用级数据共享(在线用户列表和消息列表)。系统包含登录、聊天和退出功能,通过JSP页面展示界面,Servlet处理业务逻辑。实验重点演示了Session的生命周期管理(自动超时和手动销毁)、请求转发与重定向的区别,以及web.xml的配置方法。系统采用Tomcat服务器运行,数据非持久化,消息通过页面刷新实现广播。该实验完整实 阅读详情

示例:

写一个servlet,定期连接到数据库,并把读到的数据缓存到ServletContext当中。

 

 

我们设置的休眠时间为一分钟,即一分钟之后,再次刷新表格。我们在数据库里增加的信息,就能够再次执行后显示在浏览器页面上。

 

 

我们一分钟之后再执行一下

 

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DB {
    public static Connection getConntect() {
        Connection conn = null;
        try {
            String driverClass = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://192.168.93.88/mysql";
            String username = "root";
            String password = null;
            Class.forName(driverClass);
            conn = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    //关闭数据库连接
    //这里传一个connection的引用,我们要知道关那个数据库
    public static void close(Connection conn) {
        try {
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 

import javax.servlet.ServletContext;
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.sql.*;
import java.util.ArrayList;
//这里的loadOnStartup = 1指的是,服务器一启动就加载了。
//这里加载的顺序是1。
//@WebServlet(name = "GateServlet", loadOnStartup = 1)
public class GateServlet extends HttpServlet {
    //数据库的数据时缓存在缓存上访问的,
    //即直接存到应盘上的,这样提高效率。

    //这了缓存只初始化一次,即数据不变。
    //所以我们可以加个计数器,让数据库每隔一段时间执行一次。

    /*创建线程*/
    class CacheThread extends Thread {
        //关联的目的:
        //通过构造方法,将ServletContext类要用的对象的引用穿件来。
        //为了让run方法也能用,便用关联的方法,在类里面再加一个引用。
        //把我们传进来的引用,再赋给这个引用,别的方法就都能用了。


        //为了run里面能用,我们要用关联,
        //要在类里边加一个引用。
        //我们再在构造那里,
        //将传进来的引用的地址赋给类自己的引用。
        private ServletContext context;

        /*创建构造函数*/
        //需要一个构造来创建对象。
        public CacheThread(ServletContext context) {
            this.context = context;
        }

        public void run() {
            while (true) {
                //到数据库读数据
                Connection conn = null;

                //执行语句
                PreparedStatement prst = null;

                //结果集
                ResultSet rs = null;

                //取原数据的
                ResultSetMetaData meta = null;

                conn = DB.getConntect();

                //准备语句对象
                //在创新语句对象的时候,就必须提供sql。
                //查emp里面所有的信息
                String sql = "select * from emp";
                try {
                    prst = conn.prepareStatement(sql);

                    //返回结果集的方法
                    //结果集的对象不能缓存,
                    //因为它是连线集。
                    rs = prst.executeQuery();

                    //将结果集的原数据取出来
                    meta = rs.getMetaData();

                    //下面把连线集合转为离线集合
                    //创建表集,表集里面又有行集。
                    //所以要再套一个ArrayList
                    ArrayList<ArrayList<String>> table = new ArrayList<>();

                    while (rs.next()) {
                        //表行,表行里面的表列存的是字符串类型
                        ArrayList<String> row = new ArrayList<>();

                        //jdbc下标从1开始
                        for (int i = 1; i <= meta.getColumnCount(); i++) {
                            //通过索引将表列中的数据转成字符串取出来
                            row.add(rs.getString(i));
                        }
                        //将表行放到表集里
                        table.add(row);
                    }
                    //缓存离线数据
                    //网缓存里加数据的时候,
                    //传进来一个context引用就可以了。
                    context.setAttribute("table", table);

                    //休眠:
                    //由于run方法反复执行,速度太快,
                    //我们让其休息一下。
                    Thread.sleep(60000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                DB.close(conn);
            }
        }
    }

    @Override
    public void init() throws ServletException {
        //run拿不到servlet,则由init来创建Cachethread。
        //这个类需要servlet,就将其引用传进去。
        //再在上面写一个构造函数。
        new CacheThread(this.getServletContext()).start();
    }
}

 

import javax.servlet.ServletContext;
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.ArrayList;

@WebServlet(name = "ViewServlet", urlPatterns = "/vis")
public class ViewServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //先要拿到ServletContext
        ServletContext servletContext = request.getServletContext();
        //先取出离线集
        ArrayList<ArrayList<String>> table = (ArrayList<ArrayList<String>>) servletContext.getAttribute("table");
        //渲染成表格输出
        //取输出字符流
        PrintWriter pw = response.getWriter();
        pw.println("<table border='1'>");
        pw.println("<th>");
        pw.println("empno");
        pw.println("</th>");
        pw.println("<th>");
        pw.println("ename");
        pw.println("</th>");
        pw.println("<th>");
        pw.println("job");
        pw.println("</th>");
        pw.println("<th>");
        pw.println("mgr");
        pw.println("</th>");
        pw.println("<th>");
        pw.println("hiredate");
        pw.println("</th>");
        pw.println("<th>");
        pw.println("salary");
        pw.println("</th>");
        pw.println("<th>");
        pw.println("comm");
        pw.println("</th>");
        pw.println("<th>");
        pw.println("deptno");
        pw.println("</th>");
        for (int i = 0; i < table.size(); i++) {
            pw.println("<tr>");
            ArrayList<String> row = table.get(i);
            for (int j = 0; j < row.size(); j++) {
                pw.println("<td>");
                pw.println(row.get(j));
                pw.println("</td>");
            }
            pw.println("</tr>");
        }
        pw.println("</table>");
    }
}

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
   
    <servlet>
        <servlet-name>GateServlet</servlet-name>
        <servlet-class>edu.xalead.web.GateServlet</servlet-class>
        <!--注意,GateServlet里注解不起作用,而在xml里面起作用了。-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>ViewServlet</servlet-name>
        <servlet-class>edu.xalead.web.ViewServlet</servlet-class>
    </servlet>
   
    <servlet-mapping>
        <servlet-name>GateServlet</servlet-name>
        <url-pattern>/gas</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ViewServlet</servlet-name>
        <url-pattern>/vis</url-pattern>
    </servlet-mapping>
</web-app>

 

Jakarta EE 实验 — Web 聊天室(JSP版) 本文介绍了基于JakartaEE技术栈的Web聊天室实现方案。系统采用JSP+Servlet架构,使用Maven构建,运行在Tomcat10+服务器上。主要功能包括用户登录、消息收发、在线用户查看、退出功能,并实现了敏感词过滤、权限控制和消息条数限制。关键技术点包括:通过ServletContext共享全局数据,使用Filter处理编码和权限验证,利用Listener管理应用初始化和会话生命周期。文章提供了完整的项目创建步骤、代码实现和详细解释,并附有测试方案。该实验项目可作为学习JakartaEE中Ser 阅读详情

相关推荐

【小程序】支付宝直付通解决方案

支付宝直付通是支付宝为小程序提供的一种支付解决方案,可以实现小程序中直接使用支付宝进行支付。以上是一个简单的支付宝直付通解决方案及相关代码示例。具体的使用还需要根据自己的业务需求进行定制化开发和调整。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1281

java线程休眠方法详解

------------------------------------java线程休眠方法详解--------------------- 线程的休眠  线程的休眠是很必要,在做服务器端的时候为了减少服务器的压力我们需要休眠。 如果休眠是在同步代码中执行,休眠不会让出锁对象。 public  class SaleTicket implements Runnable{    // 因为是共享对象所以...

李昆鹏的博客 9502

KAN神经网络实战:如何用Python快速搭建你的第一个可解释性模型

本文提供了使用Python和PyTorch快速搭建首个KAN(Kolmogorov-Arnold Networks)神经网络模型的实战指南。通过对比传统MLP,详细解析了KAN利用可学习的边函数实现更高可解释性的核心原理,并逐步演示了从环境配置、数据准备、核心模块实现到模型训练与可视化的完整流程,帮助开发者掌握这一新兴的可解释性AI模型构建方法。

convnet3designer的博客 472

Java的线程睡眠sleep

一点睛 如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过Thread类的静态方法sleep()方法来实现。 当当前线程调用sleep()方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,处于sleep()中的线程也不会执行,因此sleep()方法常用来暂停程序的执行。 二代码 public class SleepTe...

实践求真知 8919

【spark源码修改】hive3.1.3 spark3.5.4编译,需要修改源码,最终编译成功

【spark源码修改】hive3.1.3 spark3.5.4编译,需要修改源码,最终编译成功,附带问题分析详细过程

spark_dev的博客 1911

RT-Thread Studio与CubeMX联合编程(超级详细)

RT-Thread Studio与CubeMX联合编程 本文章参考以下文章: https://blog.youkuaiyun.com/qq_40824852/article/details/122596043 https://zhuanlan.zhihu.com/p/395106066 https://blog.youkuaiyun.com/m0_37697335/article/details/108890584 一、简介 经过上次对RT-Thread Studio的初步尝试,发现RT-Thread Studio中存在官方支

zhuzhu的博客 3万+

【web后端(十三)】jsp、servlet_生命周期、过滤器

Servlet生命周期 serlvet请求是单实例多线程 1.初始化 Serlvet是配置到web.xml当中,服务器读取配置自动实例化并置入ServletContext容器当中。当Servlet刚刚实例化,就会调用void init()方法,所以我们初始化Servlet的代码并不是写在构造函数中,而是推荐写到init()方法当中 2.服务请求 service(request,respo...

LED_of_Java的博客 357

开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述

综上,大多数工作均基于CLIP预训练的图像编码器和文本编码器。GlIP为解决目标检测任务提供了先例,后续很多工作常与目前较为广泛使用的目标检测网络结构相结合,从而构建新的开放词汇目标检测器。如ViLD基于Mask R-CNN、RegionCLIP基于R-CNN、VLDet和BARON基于Faster R-CNN。更具有创新性的工作是Detic,提出了使用图像分类的数据集来对目标检测器的分类头进行训练。

yangsn0719的博客 4400

java script 代码放在jsp 还是放在servlet_ServletContext JSP

会话:四种:1 :Session–保存在服务器上默认的30分2:Cookie 客户端的,maxAge3:重写 url - > url;jsessionid=xxxxxxx - > response.encodeRedirectUri(url);4:隐藏表单 1:ServletContext2:JSP–3:用JSP来重构项目。1:ServletContext特点:1:一个应用程序一个...

weixin_31221157的博客 263

AI爬虫:一文讲通AI爬虫技术和原理,及34个AI爬虫工具推荐

AI 爬虫 是一种结合了传统网络爬虫技术和人工智能(AI)技术的工具,能够更智能、高效地从网页中提取和处理数据。与传统爬虫相比,AI 爬虫能够更好地处理动态内容、复杂网页结构以及非结构化数据,同时具备数据清洗、分类、情感分析等高级功能。

数据知道的博客 1万+

39、高频 LLC 谐振转换控制系统动态优化算法分析与研究

本文针对高频下LLC谐振转换器动态性能差的问题,提出一种基于谐振电容器充放电估计动态切换时间的优化控制算法。通过改进状态轨迹控制方法,突破传统算法在谐振频率与开关频率相等条件下的限制,并结合新型采样策略有效抑制电压过冲。算法在MATLAB和SABER中完成仿真验证,并搭建基于STM32F407的原型系统进行测试,结果表明该方法显著缩短动态响应时间,提升系统稳定性。研究为高频、高功率密度开关电源的动态优化提供了可行解决方案。

linux6sysadmin的博客 111

[Servlet 3]会话管理、进阶API、监听过滤器

Java Servlet3:会话管理,进阶API,监听器与过滤器的实现

JacinLee的博客 506

基于simulink的预测电流控制策略的三相逆变器仿真

本文详细介绍了在Simulink中实现基于预测电流控制策略的三相逆变器仿真方法。主要内容包括:准备工作(安装必要软件及工具箱)、构建三相逆变器基础模型、设计预测电流控制器(包含状态空间建模和控制器设计)、实现控制逻辑、添加示波器观察输出、配置仿真参数以及运行仿真分析结果。通过MATLAB代码示例和Simulink模块说明,展示了如何选择最优开关状态来最小化电流误差。该仿真方法为研究快速响应、高精度的逆变器控制提供了实用工具,但需注意实际应用中可能需要的调试工作。

amy_mhd的博客 272

基于Servlet和JSP服务器应用对象

基于Servlet和JSP服务器应用对象 文章目录前言已经学完Servlet和JSP,这篇主要介绍其相关的服务器应用对象。一、服务器应用和Web服务器二、服务器应用对象1.ServletContext对象2.HttpSession对象三、总结 前言 已经学完Servlet和JSP,这篇主要介绍其相关的服务器应用对象。 一、服务器应用和Web服务器 提到“web服务器”时,通常要把它认为是以HTTP为核心、web UI为向导的应用。当有人说到“应用服务器”时,你可能想到“高负载、企业级特性、事务和队列、多通

qq_51795666的博客 384

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JavaWeb笔记:第06章 Tomcat |Servlet |HTTP协议 |request |response |ServletContext |Cookie |Session |JSP

JavaWeb笔记:第06章 Tomcat | Servlet | HTTP协议 | request | response | ServletContext | Cookie | Session

IAMLSL的博客 993

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

(Servlet+Jsp)Web编程笔记(一套就够了)

文章目录Web编程技术笔记1. BS架构与CS架构2. idea安装及使用3. Servlet介绍1. 新建一个Servlet2. 配置web服务器Servlet有两种配置方式1. 注解方式2. xml配置方式**3. Tomcat所对应的Servlet/JSP规范和JDK版本:**4. Servlet体系结构:1. Servlet继承体系2. Servlet: 接口3. HttpServlet: 抽象类4 HttpServletRequest: 请求对象5. HttpServletRespo

有时间可以指导毕业设计,可以私聊我。一个热爱编程的smallCuteMonkey,可以私信我 524

ServletContext 与application的异同

相同:其实servletContext和application 是一样的,就相当于一个类创建了两个不同名称的变量。在 servlet中ServletContext就是application对象。大家只要打开jsp编译过后生成的Servlet中的 _jspService()方法就可以看到如下的声明: ServletContext application = null; application = pageContext.getSe...

一只苟延残喘的卑微蝼蚁 767

Servlet交互与JSP

Servlet交互与JSP 一、Servlet注解的使用 在自己所定义的Servlet类上面写上@WebServlet(“/路径名”),就不用在web.xml中写 注意:修改项目的web.xml中 metadata-complete=“false”>,把true写成false启用注解 二、Servlet功能 (一)servlet的三大职责 接收参数(封装,接受前台数据) ---->...

EstherLty的博客 938

Servlet和JSP复习笔记

1. 理解典型的Web应用     1.1  浏览器客户端、Web服务器、应用服务器、数据库服务器         1.1.1  在我们的项目里Tomcat即是Web服务器,又是应用服务器。         1.1.2 Web服务器一般用来处理静态的内容,HTML,CSS之类的东西         1.1.3 应用服务器主要负责在服务器端运行的应用程序,比如说我们的Servlet和JSP

积累与坚持 533

servlet 数据存储几种方式和jsp 作用域

有几个对象 1、Session:一个用户第一次访问网站,有一个唯一的id 存在客户电脑里(cookie) 2、request:从浏览器的一次请求 3、ServletContext:可以表示多个sevlet,相同整个应用的存数据的对象 4、coockies:用户记录一些用户访问网站的信息

monica12的专栏 3324

快速了解 servlet(SpringMVC 的底层)

Servlet是 Java EE/Jakarta EE 的核心技术,用于处理 Web 请求,开发者需要手动处理很多细节。基于 Servlet 之上,通过注解和封装提供了更高层次的 Web 开发体验,简化了请求处理、依赖管理和数据绑定。这两者在设计上有相似之处(比如注解驱动开发),但 Spring Boot 更注重开发的简便性和功能的完整性。

小程xy的博客 2338

【web后端(十)】jsp、servlet_会话管理_servletContext

服务器的工作过程: 服务器在第一次启动的时候,会读一个部署描述符文件,也就是.xml文件。这是一个规范,是约定好的。我们在里面写的servlet的配置,里面有servlet的名字。只要读到servelt,服务器就会实例化它们的名字。servlet不再是字符串,而这些实例的键就是url。每一个servlet的url是不同的,但是它们的根localhost:8080是一样的。也就是说,服务器拿地址请...

LED_of_Java的博客 259

Servlet和JSP重点总结

一、Servlet作用 在Servlet规范中,指定【动态资源文件】开发步骤 在Servlet规范中,指定Http服务器调动动态资源文件规则 在Servlet规范中,指定Http服务器管理动态资源文件实例对象规则 二、Servlet接口实现类开发步骤 创建一个java类继承与HttpServlet父类,使之成为一个Servlet接口实习类 重写HttpServlet父类两个方法,doGet或doPost 将Serclet接口实现类信息注册到Tomcat服务区 网站---->web-----&gt

weixin_55232658的博客 430

java Servlet、JSP

什么是Servlet 采用JAVA语言编写的服务器端程序,运行在web服务器中的servlet容器中,主要功能是提供请求\响应的web服务模式,生成动态web内容。 servlet的优点: 1.较好的可移植性,无需修改代码就可以部署在多种不同类型的web服务器上。 2.执行效率高,Servlet针对每个请求创建一个线程执行,有更短的响应时间。 3.功能强大,可以与web服务器进行交互 4.使用方便 5.可扩展性强 servlet生命周期可以分为加载、创建、初始化、处理客户请求、卸载 1.加载:容器通过类加载

JIE_ling8的博客 374
上一篇: 【web后端(十)】jsp、servlet_会话管理_servletContext
下一篇: 【web后端(十二)】jsp、servlet_servlet初始化参数、servelt上下文参数
寻爻青年
博客等级 码龄8年 27粉丝 137原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻爻青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值