- 博客(77)
- 资源 (5)
- 收藏
- 关注
原创 第8章 原生MVC服务框架一
在Web应用程序中,视图(View)是用户界面的呈现方式,通常由HTML、CSS和JavaScript等前端技术组成,用于展示数据和与用户进行交互。视图通常包含网页的布局、样式和交互行为等方面的定义。视图解析器(View Resolver)是一个用于查找并解析视图的组件。视图解析器的作用是将视图名称解析为实际的视图对象,以便在处理请求时返回正确的响应。视图解析器负责处理视图的查找、渲染和合成工作,使得开发人员可以更专注于业务逻辑的实现,而无需关注具体的视图渲染细节。
2024-05-23 14:41:50
965
原创 Java对象数组
在Java中,对象数组是指由对象类型的元素组成的数组。与基本类型数组不同,对象数组可以存储对象的引用。对象数组的声明和初始化方式与基本类型数组类似。其中,ClassName 是指对象类型的类名,arrayName 是对象数组的名称,arrayLength 是数组的长度。对象数组在Java中具有广泛的用途。它们允许存储和操作多个对象的引用,使代码更加灵活和可扩展。无论是存储对象集合、实现数据结构还是进行排序和搜索,对象数组都是一个重要的数据结构。
2024-05-22 15:04:08
1091
原创 Docker(四) 文件和网络
在 Docker 中,镜像有一个很重要的特性叫做分层。这是一种轻量级的虚拟化机制,可以帮助用户更加高效地制作和管理容器镜像。每个镜像都由一系列分层的文件系统组成,每一层都包含了特定软件包、库和文件。当我们从一个已有的镜像构建容器时,Docker会利用这些分层文件系统来向容器提供所需的文件和配置信息。Docker网络是Docker提供的用于容器间通信以及容器与主机或其他网络实体之间通信的解决方案。Docker支持多种类型的网络,可以根据不同的场景选择不同的网络方案。
2024-05-22 14:40:37
1240
原创 Java接口
接口在JAVA编程语言中是一个抽象类型,通常以interface来声明。从面向对象编程的角度,可以将接口理解为对不同类型的事物的共同的行为特征的抽象。例如,鹰和飞机属于不同类型的事物,但是都有飞行的行为特征。可以把接口看成是特殊的抽象类。
2024-05-21 16:03:50
640
原创 Docker(三) 容器管理
Docker 的容器管理可以通过 Docker CLI 命令行工具来完成。Docker 提供了丰富的命令,用于管理容器的创建、启动、停止、删除、暂停、恢复等操作。以下是一些常用的 Docker 容器命令:1、docker run:用于创建并启动一个容器。使用 docker run 命令时,可以指定容器名称、镜像名称、启动命令、挂载数据卷、网络配置等,以满足不同使用需求。2、docker start/stop/restart:用于启动/停止/重启一个已经创建的容器。
2024-05-21 15:04:20
1267
原创 第7章 处理POST请求参数
表单数据提交方式默认是GET请求,表单还有一种参数传递方式就是POST请求,GET和POST是HTTP协议中最常用的两种请求方法,它们都可以用来传递参数。POST请求是一种常见的HTTP请求方法之一。它通常用于向服务器提交数据,例如提交表单数据、上传文件等。在POST请求中,请求的数据被包含在请求体中,而不是像GET请求一样在URL中传递数据。因此,POST请求相对于GET请求来说更加安全,因为请求的参数不会明文显示在URL上。此外,POST请求没有URL长度限制,可以传输较大的数据。
2024-05-20 10:40:34
743
原创 Docker(二) 镜像管理
Docker中的镜像管理包括创建、查看、构建、保存和删除镜像等操作。Docker提供了客户端命令、编程语言API等操作Docker的方式。本课程中是通过Docker客户端命令实现Docker的操作。Docker命令行官方文档地址:https://docs.docker.com/engine/reference/commandline/cli/。1、搜索并拉取镜像:可以使用docker search命令搜索镜像仓库中的镜像信息,然后使用docker pull命令从镜像仓库拉取镜像到本地。
2024-05-20 09:49:43
961
原创 Java abstract抽象
使用abstract关键字声明,不包含方法体的方法称为抽象方法。这个定义同样晦涩,究其原因是因为在利用泛化设计父类时候,有这种情况全体子类都有相同的方法,但是每个具体方法实现都并不相同,这样只能将方法名抽取到父类,方法体留在每个子类中,这种只有方法名称的方法,就是抽象方法。
2024-05-19 12:07:20
702
原创 Docker(一) Docker概述
Docker是一个开源的容器化平台,允许开发人员将应用程序及其所有依赖项打包到一个轻量、可移植的容器中,然后在不同的环境中部署和运行这些容器。Docker的主要特点包括:1、轻量级:Docker容器利用属于操作系统的核心资源,不需要额外的虚拟化层,因此比虚拟机更轻量、更快捷。2、可移植性:Docker容器提供了一个一致的运行环境,使得容器可以在不同的平台和环境中移植和部署,因为容器中已经包含了应用程序及其依赖的所有组件。
2024-05-19 10:48:33
946
原创 Java static关键字
可以用静态变量存储程序中只有一个就够的数据,比如:办公软件项目中的公司名称和公司LOGO,地图应用中的各类图标,只需要加载一份就可以了。在类中可以使用{}定义代码块,代码块在创建对象时候按照顺序执行,其功能与构造器类似,可以用于初始化对象属性。简单的说就是静态变量在类加载期间在方法区中分配,静态变量是属于类的变量。4、创建对象时候按照类中声明的实例变量分配对象的属性,每创建一个对象,就会分配一组对象属性。因为静态变量是属于类的变量,所以使用“类名.变量名”访问,在类的内部可以省略类名。
2024-05-18 20:33:47
580
原创 Java final关键字
但是在实际工程项目中很少使用final方法,原因是很多框架工具都会采用“动态代理”技术代理(重写)对象的功能,实现灵活的软件功能,如果使用final的方法将直接影响这些框架功能!方法上可以使用final修饰,final的方法在子类中不能被重写修改了。final修饰的方法不会影响方法在当前类中的使用,但是如果派生了子类,则在子类中不能重写修改父类中定义的final方法。final修饰以后也是初始化以后不能再次修改,由于方法参数是在调用方法传递参数值时候初始化的,所以在方法运行期间方法参数变量的值不能修改了。
2024-05-18 20:26:16
1009
原创 Java对象内存管理
在JAVA中,有java程序、虚拟机、操作系统三个层次,其中java程序与虚拟机交互,而虚拟机与操作系统交互。编译好的java字节码文件运行在JVM中。程序中无论代码还是数据,都需要存储在内存中,而java程序所需内存均由JVM进行管理分配,开发者只需关心JVM是如何管理内存的,而无需关注某种操作系统是如何管理内存的,这就保证了java程序的平台无关性。由于Java内存是自动管理的,一般情况下不用人工干预。只有了解内存管理规则才能写出高质量的代码。
2024-05-17 15:12:54
798
原创 Java异常(二)
自定义异常是指开发者创建的异常类,用于表示特定类型的异常情况。尽管Java提供了许多异常类,但在实际应用中可能需要更多自定义的异常来适应特定的业务需求。例如,在进行数据操作时,可能会遇到错误的数据,这些错误的数据出现时应该抛出异常,比如AddException。然而,Java并没有提供这样的异常类,所以需要开发者自己创建一个自定义的异常类来满足需求。通过自定义异常,开发者可以更精确地描述和处理特定的异常情况,提高代码的可读性和可维护性。
2024-05-17 15:02:12
912
原创 Java异常(一)
当我们编写程序时,有时会遇到一些意外情况或错误,这些情况超出了我们预期的正常情况。比如,我们可能会在程序中除以零,试图打开一个不存在的文件,或者因为网络问题无法连接到服务器。这些意外情况就被称为异常。当程序遇到异常时,如果异常没有被捕获和处理,程序可能会崩溃或者出现错误的结果。可以把异常比作现实生活中的意外情况。当你驾驶汽车时,你预期能够平稳地行驶,但如果突然出现了一个障碍物,你就需要采取一些措施来应对这个意外情况,比如刹车或者绕道而行。同样地,程序在执行过程中也会遇到意外情况,需要通过异常处理来应对。
2024-05-16 15:10:33
823
原创 第6章 动态响应页面内容
之前案例虽然收到了表单提交的参数但是收到了404错误,因为确实没有页面与请求URI对应,解决这个办法就可以使用动态页面技术,就是动态生成页面内容。动态响应页面(Dynamic Response Page)是一种动态生成的Web页面,其内容可以根据用户的请求和其他动态变化的数据进行实时生成和更新。与静态页面不同,动态响应页面具有一定的交互性和个性化定制的特点。动态响应页面通常是由服务器端的脚本程序动态生成的,可以根据用户的请求参数、数据库查询结果、计算逻辑等动态生成页面的内容和格式。
2024-05-16 14:58:33
1053
原创 Java大数字类
在Java中,基本数据类型中整型最大范围是64位long型整数。但在实际应用中,可能需要存储超过该范围的整型数字,或者对超过该范围的多个整型数字进行计算。例如,在密码学中需要使用512位的整型数字作为密钥。Java中提供了BigInteger类来表示任意大小的整数,提供了BigDecimal类来表示任意大小且精度完全准确的浮点数。BigInteger和BigDecimal被称为Java中的大数字类,位于java.math包下,两个类均为Number类的子类。
2024-05-15 16:39:55
194
原创 Spring MVC(七) 异常处理
在实际的开发中,不管做什么操作,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。如果能够做到统一的处理,将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。但是这种操作只能处理一个控制器中的相关异常信息,是一种局部的操作,如果想要实现全局的异常处理操作,可以创建一个异常处理类,通过注解@ControllerAdvice就可以实现全局的异常处理了,代码如下。
2024-05-15 16:36:37
223
原创 Java包装类
在进行类型转换时,有一种特殊的转换:将 int 这样的基本数据类型转换为对象,如下图所示:所有基本类型都有一个与之对应的类,即包装类(wrapper)。因此,包装类即基本数据类型对应的类。基本数据类型不能直接参与引用类型的使用或计算,使用包装类将基本数据类型转换为引用数据类型,可以参与到其他引用类型的使用。包装类如下表所示:包装类中也提供了一些与类型相关的常用方法,可以简化开发者对基本数据类型的操作。
2024-05-14 17:46:55
945
原创 Spring MVC(六) 拦截器
preHandle方法和过滤器中的doFilter方法一样,都是在目标方法执行之前调用,因此,可以在preHandle方法中做相应的操作,比如权限控制,日志操作,事务处理等操作。afterCompletion方法是在整个请求处理完毕后的回调方法,即在视图渲染完毕后调用afterCompletion方法,如性能监控中我们可以在此记录结束时间并输出消耗时间。在Spring MVC中要处理这些问题,也同样可以使用过滤器,不过Spring MVC提供了自己的一套处理机制,就是拦截器。此时拦截器就可以正常使用了。
2024-05-14 17:00:56
461
原创 Spring MVC(五) 文件上传
在程序开发中,有时候需要上传一些文件。我们在学习Servlet的时候,也做过文件上传的操作,只不过基于Servlet的文件上传操作起来过于复杂,因此所有的MVC框架都提供了自己的文件上传操作,基本上都是基于FileUpload的文件上传。Spring MVC在处理文件上传的时候,有自己的处理方法,但是也是基于FileUpload的操作,因此在处理文件上传的时候也需要导入commons-fileupload-1.2.2.jar包和commons-io-2.4.jar包。
2024-05-13 12:52:08
955
原创 第5章 处理GET请求参数
表单GET请求参数是指在HTML表单中通过GET方法提交表单数据时所附带的参数信息。在HTML表单中,可以通过表单元素的name属性来指定表单字段的名称,通过表单元素的value属性来指定表单字段的值。当用户提交表单时,浏览器会将表单字段的名称和值以键值对的形式打包成查询字符串(query string),将查询字符串附加到表单的action URL中作为GET请求的参数信息。其中,action属性指定表单提交的目标URL。
2024-05-13 12:46:26
865
原创 Spring MVC(四) 数据校验
在开发过程中有一环必不可少的部分就是数据校验,用户在页面中填写的数据通过表单提交时,前端的JS可以做一些是否合法性的验证,比如是否为空、两次密码是否一致、格式是否正确等等验证。其中注解@NotEmpty就是表示该属性在应用的时候不能为空,注解Email就是表示该属性必须是一个正确的邮箱格式,也就是要包含“@”字符。在添加数据的时候,如果不按照要求操作,就会提示错误,并且无法完成数据的添加操作,如图所示。被注释的元素必须是一个数字,其值必须在可接受的范围内。被注释的元素的大小必须在指定的范围内。
2024-05-11 15:08:15
586
原创 Dubbo
Dubbo是一个高性能、轻量级、基于Java的开源RPC框架,由阿里巴巴公司开发维护。Dubbo提供了一个开放式的、高性能的RPC协议,可以使得服务消费者只需要采用简单的操作即可远程调用服务以及获得结果,避免了复杂而繁琐的调用流程,广泛应用于分布式系统的构建。Dubbo具有如下特点:1、通信协议:默认提供Dubbo协议和简化版的Http协议,高性能、可扩展的TCP通信协议,使得服务消费者只需要采用简单的操作即可远程调用服务,同时具有较低的网络延迟和较高的性能。
2024-05-11 15:04:13
493
原创 Servlet
当我们通过浏览器输入一个地址之后,其实这就是客户端往服务器端发送了一个请求,在这个请求中包括了请求的项目名和项目中的资源名,在上一节中访问的路径后面的“/javaweb01”就是项目名,“/hello”就是资源名。
2024-05-10 15:04:36
827
原创 Spring MVC(三) 参数传递
虽然参数从Controller传递到View有5中不同的操作方法,但是在具体的使用上一般只会采用其中的Model和Map进行传值,大家具体使用哪一种方法,要看具体的操作,本书在接下来的章节中全部采用Model进行传值。
2024-05-10 14:59:28
1138
原创 Spring MVC(二)
在Spring MVC中一般都是使用注解@RequestMapping来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置的映射地址作用一致。在上一节的内容中,我们通过注解@RequestMapping改进了程序,让请求地址可以在方法中通过注解@RequestMapping来指定,代码显得非常简洁。注解@RequestMapping不仅可以修饰方法,还可以用来修饰类。
2024-05-09 14:56:52
1040
原创 第4章 处理多种内容类型
Content-Type是HTTP协议头中的一个字段,它用于描述HTTP请求或响应中所传输的实体数据的媒体类型(MIME类型)。Content-Type告诉客户端和服务器端所传输的数据的实际内容类型,使得客户端和服务器端可以正确地解析和处理数据。 Content-Type一般由两部分组成:媒体类型和字符集。其中,媒体类型指的是数据的格式类型,常见的媒体类型有text、image、audio、video等,每个媒体类型都有一个唯一的标识符,例如text/plain表示纯文本格式,image/jp
2024-05-09 14:51:27
836
原创 Spring MVC(一)
我们在之前学习Servlet的时候,认识了在WEB开发中MVC设计模式,其最为经典的设计就是,通过控制器(Controller)分离模型(Model)和视图(View)。在具体的WEB开发中,我们实现最多的功能就是页面的跳转和参数的传递。每次在使用Servlet进行操作的时候,都要手动的控制页面的跳转,开发效率非常低,虽然也可以使用一定的代码封装(BaseServlet),来简化操作,但是参数的传递只能频繁的使用getParameter方法来处理。
2024-05-08 15:59:02
854
1
原创 微服务架构与Spring Cloud
Spring Cloud是基于Spring Boot开发的一组开源框架和工具,提供了微服务架构中开发分布式系统所需的各种组件和工具。该框架的出现使得在微服务架构中开发分布式系统变得更加简单和高效。Spring Cloud的主要特点包括:1、简化开发:Spring Cloud提供了一系列开箱即用的组件和工具,可以帮助开发者快速实现服务注册、发现、配置、熔断、负载均衡、分布式消息等功能,大大简化了微服务架构系统的开发和部署工作。
2024-05-08 15:44:33
991
1
原创 Java 反射
java.lang.Class类是Java反射机制的基础。从面向对象编程的角度,Class类是对Java程序中的“类”进行的抽象,每个Class的对象代表一个被JVM加载到内存中的“类”。在程序运行时,JVM首先检查要加载的类对应的Class对象是否已经创建。如果没有创建,JVM会根据类名查找.class文件,将其加载到内存中,并创建相应的Class对象。如下图所示:需要注意,Class类的构造器被设计为私有的,也就是说开发者不能主动创建Class类的对象。Class类的对象仅能由JVM创建。
2024-05-07 14:44:04
1067
原创 Java Stream
Java 8 Stream是Java 8中引入的一个新的API,用于处理集合和数组等数据结构的元素。它允许您在数据集上进行功能性操作,例如过滤、映射、排序等,而不需要编写循环或迭代器等底层代码。Java 8 Stream与集合不同,它并不是一个数据结构,而是一种可操作的流。流可以是无限的,也可以是有限的。在使用流进行操作时,不会改变原始数据集合中的数据,而是返回一个新的流。Stream API包含了丰富的操作方法,例如过滤、映射、排序、归约等,使得对数据集合进行操作变得非常方便。
2024-05-07 11:43:14
956
原创 Java Lambda表达式
Java Lambda表达式是Java编程语言中的一个功能,它允许您将代码块作为参数传递给方法或作为返回值从方法中返回。Lambda表达式是一个匿名函数,它没有名称,但它可以像普通方法一样传递参数并执行代码。Lambda表达式的语法类似于函数式编程语言中的函数定义,使用箭头符号"->"来将参数列表和函数体分开。Lambda表达式通常用于简化代码,特别是在使用函数接口(Functional Interface)时,它允许您使用更少的代码来定义方法。
2024-05-06 19:07:31
1004
1
原创 第3章 WebServer重构
在服务端代码的 ClientHandler 中,请求解析、处理请求、返回响应的代码混杂在一起,这样的设计会导致代码难以维护和理解。为了提高代码的可读性、可维护性和可扩展性,我们需要对这些代码进行重构,并按照功能抽取对应的类,从而使后续的开发和维护更加方便。分析目前的代码:重构后软件的整体结构如下图:重构后的结构主要包含以下几个主要组件:1. ClientHandler(Web处理线程):该组件是处理客户端请求的主要线程。
2024-05-06 18:53:48
875
原创 Java集合排序
1、集合排序是指对一个集合中的元素按照特定规则进行重新排列,以使得集合中的元素按照预定义的顺序呈现。在Java中实现集合排序的方式可以分为两大类。使用集合排序API使用支持自动排序的集合2、常用的集合排序API包括以下几种。Collections.sort() 方法Comparable接口Comparator接口3、TreeMap 是一种实现了 SortedMap 接口的有序映射集合。
2024-05-05 15:08:44
1463
原创 Java Set集合
HashSet是Java中实现了Set接口的集合类,它使用哈希表作为底层数据结构,用于存储唯一的元素。HashSet不保证元素的顺序,且不允许重复元素。HashSet底层实际上是使用HashMap对象来存储数据,如下图所示。以下是HashSet的一些特点:1、HashSet基于哈希表,使用哈希函数将元素映射到对应的存储位置。2、HashSet存储的元素是无序的,即元素的插入顺序与遍历顺序不一致。3、HashSet不允许重复元素,每个元素只能出现一次。
2024-05-05 14:53:12
848
1
原创 Java Map集合(二)
HashMap虽然提供了高效的添加和查询功能,但是无法保存元素的添加顺序。在一些特定的应用场景中,可能需要保存键值对的添加顺序,此时可以使用LinkedHashMap来实现。例如:项目既需要提供按用户名快速查询用户信息的功能,也需要提供按用户签到顺序显示用户信息列表的功能。此时需要能够记载元素的添加顺序。LinkedHashMap是在HashMap的基础上维护了一个Entry的双向链表,以此记录元素之间的先后顺序。
2024-05-04 13:15:06
1094
原创 Java Map集合(一)
HashMap类是Map接口最常用的实现类之一,内部基于哈希表存储键值对数据,以提供高效的插入、删除和查找操作。HashMap在实际开发中广泛应用于缓存、索引、数据存储和快速查找等场景。HashMap的内部使用了一个Node类来表示存储在哈希桶(数组)中的键值对。Node类是HashMap的内部私有静态类。final int hash:存储键的哈希码,用于确定键值对在桶数组中的位置。final K key:存储键的值。V value:存储与键相关联的值。
2024-05-04 13:02:48
877
原创 Java List集合
ArrayList是List接口的一个实现类,是程序中最常见的一种集合。在ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存空间中创建一个更大的数组来存储这些元素。ArrayList的主要特点如下:1、动态大小:ArrayList的大小是可以动态增长和缩小的。与普通的数组相比,ArrayList不需要指定初始大小,并且可以根据需要自动调整容量。2、随机访问:ArrayList通过索引来访问集合中的元素。
2024-05-03 20:49:00
602
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人