阶段一模块四

Spring MVC源码解析 - WebApplicationInitializer及其子类 目录 一. WebApplicationInitializer 二. AbstractContextLoaderInitializer 三. AbstractDispatcherServletInitializer 四.AbstractAnnotationConfigDispatcherServletInitializer 简单地介绍WebApplicationInitializer... 阅读详情

作业要求

自定义简易版 SpringBoot,实现 SpringBoot MVC 及内嵌 Tomcat 启动、DispatcherServlet 注册和组件扫描功能。

  • 程序通过 main 方法启动,可以自动启动 Tomcat 服务器
  • 可以自动创建和加载 DispatcherServlet 组件到 ServletContext 中
  • 可以自动通过 @ComponentScan 扫描 Controller 等组件
  • Controller 组件可以处理浏览器请求,返回响应结果

作业提示

当实现了 Servlet 3.0 规范的容器(比如 Tomcat 7 及以上版本)启动时,会通过 SPI 扩展机制自动扫描所有 jar 包里 META-INF/services/javax.servlet.ServletContainerInitializer 文件中指定的全路径类(该类需实现 ServletContainerInitializer 接口),并实例化该类,并回调类中的 onStartup 方法。

传统 SpringMVC 框架 web.xml 的配置内容

<web-app>
   <!-- 初始化Spring上下文 -->
   <listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
   <!-- 指定Spring的配置文件 -->
   <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>/WEB-INF/app-context.xml</param-value>
   </context-param>
   <!-- 初始化DispatcherServlet -->
   <servlet>
       <servlet-name>app</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value></param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
       <servlet-name>app</servlet-name>
       <url-pattern>/app/*</url-pattern>
   </servlet-mapping>
</web-app>

Spring 官方文档中给出了基于 Servlet 3.0 规范如何使用 Java 代码实现 web.xml 配置的 example

public class MyWebApplicationInitializer implements WebApplicationInitializer {

   @Override
   public void onStartup(ServletContext servletCxt) {

       // Load Spring web application configuration
       //通过注解的方式初始化Spring的上下文
       AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
       //注册spring的配置类(替代传统项目中xml的configuration)
       ac.register(AppConfig.class);
       ac.refresh();

       // Create and register the DispatcherServlet
       //基于java代码的方式初始化DispatcherServlet
       DispatcherServlet servlet = new DispatcherServlet(ac);
       ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
       registration.setLoadOnStartup(1);
       registration.addMapping("/app/*");
   }
}

以上知识点为作业实现基础,以此为基础完成简易版 SpringBoot,并创建 Controller,能够完成方法访问。

作业实现过程

  1. 创建 maven 工程,导入以下依赖:

    <properties>
    	<java.version>1.8</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>8.5.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
    </dependencies>
    
  2. 创建 SpringApplication 类,编写 run 方法(方法中要求完成 Tomcat 的创建及启动)

  3. 创建 Spring 的配置类 AppConfig 该类上要通过 @ComponentScan 来进行包扫描

  4. 创建 MyWebApplicationInitializer 实现 WebApplicationInitializer 接口,重写 onStartup 方法(WebApplicationInitializer 实现 web.xml 的配置)

提示:
仿写上面 Spring 官方给出的例子,完成 AppConfig 的注册,并基于 Java 代码的方式初始化 DispatcherServlet

  1. 创建 MySpringServletContainerInitializer,实现 ServletContainerInitializer 接口,重写 onStartup 方法,方法中调用第 4 步中 MyWebApplicationInitializer 的 onStartup 方法

提示:
Servlet 3.0+ 容器启动时将自动扫描类路径以查找实现 Spring 的 Webapplicationinitializer 接口的所有实现,将其放进一个 Set 集合中,提供给 ServletContainerInitializer 中 onStartup 方法的第一个参数。

  1. 创建文件:META-INF/services/javax.servlet.ServletContainerInitializer,在该文件中配置 ServletContainerInitializer 的实现类 MySpringServletContainerInitializer

  2. 编写一个 Controller 测试类及目标方法,响应输出 “hello” 即可

  3. 编写一个启动类 MyRunBoot,通过执行 main 方法启动服务

提示:
main 方法调用第 2 步中 SpringApplication 的 run 方法启动

分析

这次作业看似十分复杂,实际上非常简单,并且已经将思路告诉了我们。实际上,这次作业就是分为两个内容:一是创建内嵌的 Tomcat 容器,二是实现 DispatcherServlet 加载到 ServletContext 中。但是在实现的过程中仍旧有一些地方需要我们注意。

代码

  1. 项目依赖 pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>cn.worstone</groupId>
        <artifactId>AutoConfigFramework</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.3.3</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>5.3.3</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.3.3</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>8.5.32</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
                <version>8.5.32</version>
            </dependency>
        </dependencies>
    
    </project>
    

    这里有一个 tomcat-embed-jasper 依赖,这是因为内嵌的 Tomcat 容器启动的时候需要使用 JspServlet,如果不引入这个依赖会抛出 NoSuchClassException。但是这个依赖是否引入没有什么影响。

  2. SpringApplication

    package cn.worstone;
    
    import org.apache.catalina.LifecycleException;
    import org.apache.catalina.startup.Tomcat;
    
    import javax.servlet.ServletException;
    
    public class SpringApplication {
    
        public static void run() {
            // 创建 Tomcat 容器
            Tomcat tomcat = new Tomcat();
            // 此 Tomcat 端口是否自动部署
            tomcat.getHost().setAutoDeploy(false);
            // 设置 Tomcat 端口
            tomcat.setPort(8080);
            // 启动 Tomcat
            try {
                String baseDir = System.getProperty("user.dir");
                tomcat.addWebapp("/", baseDir);
                tomcat.start();
            } catch (LifecycleException e) {
                e.printStackTrace();
            } catch (ServletException e) {
                e.printStackTrace();
            }
            System.out.println("Tomcat Start...");
            // 开启异步服务, 接收请求
            tomcat.getServer().await();
        }
    
    }
    
    
  3. ApplicationConfiguration

    package cn.worstone.config;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ComponentScan("cn.worstone")
    public class ApplicationConfiguration {
    }
    
  4. SpringWebApplicationInitializer

    package cn.worstone;
    
    import cn.worstone.config.ApplicationConfiguration;
    import org.springframework.web.WebApplicationInitializer;
    import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
    import org.springframework.web.servlet.DispatcherServlet;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRegistration;
    
    public class SpringWebApplicationInitializer implements WebApplicationInitializer {
    
        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
            System.out.println("Load Spring web application configuration...");
            // Load Spring web application configuration
            // 通过注解的方式初始化 Spring 上下文
            AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
            // 注册 Spring 的配置类(替代传统项目中 XML 的 Configuration)
            ac.register(ApplicationConfiguration.class);
            ac.refresh();
    
            System.out.println("Create and register the DispatcherServlet...");
            // Create and register the DispatcherServlet
            // 基于 Java 代码的方式初始化 DispatcherServlet
            DispatcherServlet servlet = new DispatcherServlet(ac);
            ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcherServlet", servlet);
            registration.setLoadOnStartup(1);
            registration.addMapping("/*");
        }
    }
    
  5. SpringServletContainerInitializer

    package cn.worstone;
    
    import javax.servlet.ServletContainerInitializer;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import java.util.Set;
    
    // @HandlesTypes(WebApplicationInitializer.class)
    public class SpringServletContainerInitializer implements ServletContainerInitializer {
    
        @Override
        public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
            System.out.println("SpringServletContainerInitializer...");
            // new SpringWebApplicationInitializer().onStartup(servletContext);?
        }
    }
    
  6. META-INF/services/javax.servlet.ServletContainerInitializer

    cn.worstone.SpringServletContainerInitializer
    
  7. HelloController

    package cn.worstone.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
    
        @RequestMapping("hello")
        public String hello() {
            return "Hello World !";
        }
    }
    
  8. RunApplication

    package cn.worstone;
    
    public class RunApplication {
    
        public static void main(String[] args) {
            SpringApplication.run();
        }
    }
    

问题

  1. Tomcat 9.x 版本没有报错,但是无法启动
  2. registration.setLoadOnStartup(1); 报 NullPointerException
  3. SpringServletContainerInitializer 中的 Set 集合为 null
  4. java.lang.ClassNotFoundException: org.apache.jasper.servlet.JspServlet
【WY】数据分析 — Pandas 阶段一 :基础语法 四 —— 时间模块 版权声明:本文为博主原创文章,未经博主允许不得转载。 文章目录一、时间模块 一、时间模块 版权声明:本文为博主原创文章,未经博主允许不得转载。 阅读详情

相关推荐

小土堆学习笔记1:Dataset类代码实践

上一页中反复提到“类”,这究竟是什么东西?按我的理解(肯定不准确也不正式),class类就是某一个东西的共性,而且是等待被确认的共性。比如每台手机都有它自己的品牌、框架、价格等等属性,class类正是这些尚不确定的属性;而一旦确认了这些属性,就能够确认这到底是一台什么型号什么状态的手机,在确认了全部属性后就知道,这是一台Apple 16 Pro Max。抽象的不确定的共性就是类,具体的确定的个性就是示例。这个共性可以被用于多个编程目的,只不过某一个具体的编程行为还有它自己的独特性。

qq_40525602的博客 1626

异常org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.configurecontext()

依赖冲突问题spring-plugin的解决记录欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页

清都高眠事事休的博客 6749

BCIC IV 2a数据集实战:从MATLAB导入到EEG信号分析全流程

本文提供了BCIC IV 2a数据集从MATLAB导入到EEG信号分析的完整实战流程。详细解析了数据集结构,区分了EEG与EOG信号,并演示了信号可视化、基础预处理(滤波、分段、基线校正)等关键步骤,帮助脑机接口研究者快速上手处理这一经典运动想象数据集。

weixin_29047919的博客 470

SpringMVC的零配置WebApplicationInitializer

在SpringMVC框架中,WebApplicationInitializer是一个接口,用于在Servlet 3.0及以上版本的web应用程序中初始化Spring容器。通过实现WebApplicationInitializer接口,可以实现零配置的SpringMVC应用程序,即在web.xml文件中不需要配置任何Servlet或Filter。

weixin_52721608的博客 899

保姆级教学:从0搭建微信小程序SpringBoot+Vue(一)

目标:实现一个微信小程序从后端数据库MySQL获取的商品展示页。 框架:后端采用SpringBoot,前端采用Vue,数据库MySQL。 部署工具:IntelliJ IDEA 2024.2专业版+HbuilderX+Node+微信开发者工具,jdk1.8已安装

weixin_44545610的博客 4927

平衡电桥在高压绝缘检测中的动态切换策略与误差优化

本文深入探讨了平衡电桥在高压绝缘检测中的动态切换策略与误差优化方法。通过分析四种基本切换模式及智能切换时序设计,显著提升检测精度与范围。结合电阻选型黄金法则和软件补偿技术,有效降低测量误差,为电动汽车电池管理系统提供可靠的安全保障。

weixin_30275415的博客 473

Java异常:org.apache.catalina.deploy.WebXml addServlet

异常描述:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet 异常原因:主要是因为手动的添加了依赖jar包(主要是tomcat/lib下面的jar包),发布项目时同时将手动添加的jar包发布到tomcat目录下了,这时候会造成jar包冲突。在tomcat启动的时候报上面的错误。

yexiaozang的专栏 2万+

第10章 shellcode实战:18 神级开源shellcode工具:donut

Donut是一款shellcode生成器,可将C/C++、C#生成的PE文件转换为shellcode文件,同时支持JS、XSL、VBS脚本转换为shellcode。以下“原生”EXE/DLL指非托管PE文件(包括并不限于C/C++、delphie等编写生成的可执行文件),可以直接由系统加载运行,区别于.Net生成的托管文件。被处理exe/dll为32位程序,则需要用32为的shellcode加载器启用,exe/dll为64位的就用64位shellcode加载器启用。

李小咖·网安技术库 2796

Spring MVC —— 关于 WebApplicationInitializer

WebApplicationInitializer

小水牛的博客 2570

基于STM32设计的指纹考勤机_348

随着信息化管理需求的日益增长,传统的人工考勤方式已难以满足现代社会对高效、精准和安全的考勤管理要求。为解决这一问题,本项目设计并实现了一款基于STM32的指纹考勤机系统。该系统采用AS608指纹识别模块进行人员身份识别,ESP8266无线模块实现与上位机APP的通信,支持人员信息录入、考勤时间段设置、考勤记录保存与查询等功能。系统通过SQLite数据库存储考勤数据,并提供导出EXCEL表格功能,方便数据管理与统计分析。该系统具有高效的考勤管理能力和良好的用户交互体验,能够广泛应用于企业、学校等机构的考勤管理

528

利用SIMULINK搭建一个16QAM调制解调收发系统

1发送模块设计 根据前面介绍的理论知识,我们可以知道16QAM的基本结构,首先我来设计QAM发送段的SIMULINK仿真模块。 图1 16QAM的发送端模块 他的基本工作流程为:将信号通过两路升余弦滤波器,得到滤波以后的信号,滤波器的作用就是为了防止码间干扰。然后将滤波以后的信号和SIN,COS相乘得到调制信号,将调制 下面一一介绍每个模块的具体参数设置以及各个部分信号的波形图。 图2 产生随机数据的信号源 第一部分信号是产生一组随机的数字,作为信源,第二个模块将信号...

FPGA/MATLAB学习教程/源码/项目合作开发 4776

阶段一模块四 反射

内容输出来源:拉钩教育Java就业训练营 1 反射概念 在某些特殊场合中编写代码时不确定要创建什么类型的对象,也不确定要调用什么样的方法,这些都希望通过运行时传递的参数来决定,该机制叫做动态编程技术,也就是反射机制。 反射机制就是用于动态创建对象并且动态调用方法的机制。 2 Class类 java.lang.Class类的实例可以用于描述Java应用程序中的类和接口,也就是一种数据类型。 该类没有公共构造方法,该类的实例由Java虚拟机和类加载器自动构造完成,本质上就是加载到内存中的运行时类。 2.1 获取

wangxu123445678的博客 129

【腾讯小龙虾WorkBuddy专栏04】一文搞懂WorkBuddy的「专家」和「专家团」

WorkBuddy专家与专家团:专业级AI协作解决方案 WorkBuddy的专家(Expert)与专家团(Expert Team)功能颠覆了通用AI的局限性,提供角色化、可交付的专业服务。 核心优势 专家:深度垂直领域的AI顾问,具备人设、方法论、工具链,如全栈开发专家能直接交付完整项目,而非代码片段。 专家团:多智能体协作,自动拆解复杂任务(如竞品分析、全栈开发)并分发给对应角色,并行执行后整合输出,效率提升显著。 使用场景 单专家:解决专业问题(如SQL优化、UI设计)。

AI人人懂 2034

阶段一模块四 IO流

内容输出来源:拉钩教育Java就业训练营 1 IO流 IO就是Input和Output的简写,也就是输入和输出的含义。 IO流就是指读写数据时像流水一样从一端流到另外一端,因此得名为“流"。 1.1 分类 按照读写数据的基本单位不同,分为 字节流 和 字符流。 其中字节流主要指以字节为单位进行数据读写的流,可以读写任意类型的文件。 其中字符流主要指以字符(2个字节)为单位进行数据读写的流,只能读写文本文件。 按照读写数据的方向不同,分为 输入流 和 输出流(站在程序的角度)。 其中输入流主要指从文件中读取数

wangxu123445678的博客 174

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

阶段一模块四 多线程

内容输出来源:拉钩教育Java就业训练营 1 多线程 程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件。 进程 - 主要指运行在内存中的可执行文件。 目前主流的操作系统都支持多进程,为了让操作系统同时可以执行多个任务,但进程是重量级的,也就是新建一个进程会消耗CPU和内存空间等系统资源,因此进程的数量比较局限。 线程就是进程内部的程序流,也就是说操作系统内部支持多 进程的,而每个进程的内部又是支持多线程的,线程是轻量的,新建线程会共享所在进程的系统资源,因此目前主流的开发都是采用多线程。 多线程

wangxu123445678的博客 147

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

阶段一模块四 网络编程

内容输出来源:拉钩教育Java就业训练营 1 七层网络模型 1.1 网络模型 1.2 相关协议(笔试) 1.2.1 协议的概念 计算机在网络中实现通信就必须有一些约定或者规则,这种约定和规则就叫做通信协议,通信协议可以对速率、传输代码、代码结构、传输控制步骤、出错控制等制定统一的标准。 1.2.2 TCP协议 传输控制协议(Transmission Control Protocol),是一种面向连接的协议,类似于打电话。 建立连接 => 进行通信 => 断开连接 在传输前采用"三次握手"方式。

wangxu123445678的博客 173

阶段一模块四任务四:网络编程

第十九章 网络编程 19.1 网络编程的常识 目前主流的网络通讯软件有:微信、QQ、飞信、阿里旺旺、陌陌、探探、… 19.1.1 七层网络模型 OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985 年研究的网络互连模型。 OSI七层模型和TCP/IP五层模型的划分如下: 当发送数据时,需要对发送的内容按照上述七层模型进行层层加包后发送出去。 当接收数据时,需要对接收的内容按照上述七层模型相反的次序层层拆包并显示出来。 19.1.2 相关的协议

weixin_41930667的博客 211

阶段四模块一 JSP核心技术

内容输出来源:拉钩教育Java就业训练营 1 JSP概述 JSP是Java Server Pages的简称,跟Servlet一样可以动态生成HTML响应, JSP文件命名为xxx.jsp。 与Servlet不同,JSP文件以HTML标记为主,然后内嵌Java代码段,用于处理动态内容。 JSP与Servlet的关系: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ErauPghz-1612855029264)(JSP核心技术.assets/第三章 JSP核心技术.jpg)] 2

wangxu123445678的博客 244

阶段四模块一 Servlet核心技术(上)

内容输出来源:拉钩教育Java就业训练营 1 基本概念 1.1 C/S架构 ​ C/S架构(Client/Server,客户端/服务器模式),是一种比较早的软件体系结构,也是生活中很常见的结构。这种结构将需要处理的业务合理地分配到客户端和服务器端,客户端通常负责完成与用户的交互任务,服务器通常负责数据的管理。 C/S架构的主要优点如下: 客户端的界面和功能可以很丰富。 应用服务器的负荷较轻。 响应速度较快。 C/S架构的主要缺点如下: 适用面窄,用户群固定。 维护和升级的成本高,所有的客户端都需要更新版本。

wangxu123445678的博客 234

学习笔记

阶段四 模块一 任务一 17

kimyundung的博客 175

阶段一模块四任务五:反射

方法声明 功能介绍 static Class<?> forName(String className) 用于获取参数指定类型对应的Class对象并返回 T newInstance() 用于创建该Class对象所表示类的新实例 第二十章 反射机制 20.1 基本概念 通常情况下编写代码都是固定的,无论运行多少次执行的结果也是固定的,在某些特殊场合中编写 代码时不确定要创建什么类型的对象,也不确定要调用什么样的方法,这些都希望通过运行时传递 的参数来决定,该机制叫做动态编程技术,也就是反射机制。 通

weixin_41930667的博客 155

阶段一模块四 异常机制和File类

内容输出来源:拉钩教育Java就业训练营 1 异常机制 java.lang.Throwable类是Java语言中错误(Error)和异常(Exception)的超类。 其中Error类主要用于描述Java虚拟机无法解决的严重错误,通常无法编码解决,如:JVM挂掉了 等。 其中Exception类主要用于描述因编程错误或偶然外在因素导致的轻微错误,通常可以编码解决, 如:0作为除数等。 1.1 异常分类 java.lang.Exception类是所有异常的超类,主要分为以下两种: RuntimeExcepti

wangxu123445678的博客 174

阶段一模块四任务二:IO流

第十七章 IO流 17.1 IO流的概念 IO就是Input和Output的简写,也就是输入和输出的含义。 IO流就是指读写数据时像流水一样从一端流到另外一端,因此得名为“流"。 17.2 基本分类 按照读写数据的基本单位不同,分为 字节流 和 字符流。 其中字节流主要指以字节为单位进行数据读写的流,可以读写任意类型的文件。 其中字符流主要指以字符(2个字节)为单位进行数据读写的流,只能读写文本文件。 按照读写数据的方向不同,分为 输入流 和 输出流(站在程序的角度)。 其中输入流主要指从文件中读取数据内容

weixin_41930667的博客 102

阶段四模块一 Servlet核心技术(下)

内容输出来源:拉钩教育Java就业训练营 1 Servlet+JDBC应用(重点) 在Servlet中可以使用JDBC技术访问数据库,常见功能如下: 查询DB数据,然后生成显示页面,例如:列表显示功能。 接收请求参数,然后对DB操作,例如:注册、登录、修改密码等功能。 为了方便重用和便于维护等目的,经常会采用DAO(Data Access Object)模式对数据库操作进行独立封装。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fiJtDx4T-1612599357345)

wangxu123445678的博客 168

阶段一模块四任务一:异常机制和File类

第十六章 异常机制和File类 16.1 异常机制(重点) 16.1.1 基本概念 异常就是"不正常"的含义,在Java语言中主要指程序执行中发生的不正常情况。 java.lang.Throwable类是Java语言中错误(Error)和异常(Exception)的超类。 其中Error类主要用于描述Java虚拟机无法解决的严重错误,通常无法编码解决,如:JVM挂掉了 等。 其中Exception类主要用于描述因编程错误或偶然外在因素导致的轻微错误,通常可以编码解决, 如:0作为除数等。 16.1.2 异常

weixin_41930667的博客 134

阶段一模块四任务三:多线程

第十八章 多线程 18.1 基本概念 18.1.1 程序和进程的概念 程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件。 进程 - 主要指运行在内存中的可执行文件。 目前主流的操作系统都支持多进程,为了让操作系统同时可以执行多个任务,但进程是重量级的, 也就是新建一个进程会消耗CPU和内存空间等系统资源,因此进程的数量比较局限。 18.1.2 线程的概念 为了解决上述问题就提出线程的概念,线程就是进程内部的程序流,也就是说操作系统内部支持多 进程的,而每个进程的内部又是支持多线程的,线程是轻量的

weixin_41930667的博客 135
上一篇: 阶段一模块三
下一篇: 阶段二模块一
LiveForCode
博客等级 码龄5年 2粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值