- 博客(53)
- 收藏
- 关注
原创 Maven-基本概念
应运而生,Ant可以实现跨平台的使用,但是像Make一样仍然需要维护一个build.xml脚本用于构建项目,但是不同项目的build.xml是有诸多重复的——这意味着我们在做一些重复的工作。Maven的依赖管理在一定程序上解决了版本冲突的问题。在我们编写完代码后,我们会编译、测试、打包、部署我们的代码,这个过程就是构建项目——个人理解就是把我们。在Maven诞生之前,开发者需要手动去下载需要的jar包并添加到类路径下。作为构建工具,但是Make工具与操作系统关联,于是该工具难以实现跨平台的使用。
2024-03-10 17:28:04 342
原创 JVM-垃圾回收
当新生代内存空间不足时会发生一次Minor GC,会将伊甸园区存活的对象和FROM区的对象复制到TO区,这些存活的对象的年龄会加1,并交换FROM区和TO区。可以作为根对象的是:虚拟机栈中引用的对象(如方法参数、局部变量等)、方法区中类静态属性引用的对象、常量引用的对象等。这种判断某一对象是否是垃圾的方法的原理是:记录某个对象被引用的次数,如果引用次数是0说明是垃圾。也是先标记(根据上述的判断垃圾的算法),然后再整理,会将占用的内存移动到连续的位置。:它是Serial收集器的老年代版本,也是单线程的。
2024-02-27 22:02:48 863
原创 JVM-堆
堆是Java虚拟机内存结构中的一部分。通过new关键字创建的对象都会分配在堆中。堆中的对象是线程共享的,需要考虑线程安全问题,堆中有垃圾回收机制。虽然堆中有垃圾回收机制,但是如果当堆中的数据都仍需要使用,便不能被回收。因此大量的数据是有可能造成堆内存溢出的。
2024-02-24 19:36:18 353
原创 JVM-本地方法栈
本地方法栈中存放的是执行了本地方法(Native Method)的线程。当线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机管理控制的区域。需要注意的是,本地方法是由非Java语言(如C和C++)实现的,并且被编译为本地代码。当Java代码调用这些本地方法时,JVM会进入本地方法栈来执行这些代码。由于本地方法栈不受JVM的直接管理,因此可能会存在一些与Java虚拟机栈不同的行为和限制。本地方法栈是Java虚拟机中内存结构的一部分,与虚拟机栈的功能类似。
2024-02-22 23:24:04 413
原创 JVM-虚拟机栈
由于栈帧过多,导致栈帧所用的内存之和超出了给栈分配的内存,造成了StackOverflow错误。用-Xss参数可以设置栈的大小,例如-Xss256k表示设置栈的大小是256k字节。Java虚拟机栈是Java虚拟机内存结构中的一部分,是每个线程运行的内存空间。每个虚拟机栈由多个栈帧组成,每次调用一个方法会创建一个新的栈帧。也可以用jstack 进程id命令,定位到具体哪两个(多个)线程出现死锁。
2024-02-22 23:11:43 554
原创 JVM-程序计数器
程序计数器(Programming Counting Register)是Java虚拟机内存结构中的一部分。作用是记录解释器将要执行的下一条指令(字节码)的地址。解释器会读取程序计数器中保存的下一条待执行指令的地址,并将地址对应的指令加载到内存中执行,程序计数器会更新为下一条指令的地址。
2024-02-22 22:16:41 167
原创 Spring-JDBCTemplate
一、引子我们在JavaWeb阶段向读者介绍过JDBC(请回顾JDBC基本概念),由于JDBC使用上的繁琐,又介绍了MyBatis的使用(请回顾MyBatis基本概念)。现在又写一篇文章用来介绍JDBCTemplate,似乎是翻来覆去讲一些重复的东西。实则不然,虽然只了解一门技术便可完成需求的实现,但是当你需要参与项目的技术选型时,横向了解多门技术,并能区分各方之间的优劣,将大大帮助你洞悉哪一项技术更适应你的项目特点。二、基本概念我们知道:JDBC(Java数据库连接)就是Java程序用于连接数据
2024-02-21 22:57:40 380
原创 SpringMVC-请求
中提到了如何给客户端返回响应,那么本节来介绍一下如何承接客户端的响应。注解用于从URL路径中提取名为。在这个例子中,可以直接使用。注解用于从请求中获取名为。的参数,并将其值传递给。的变量,并将其值传递给。对象来获取请求参数。
2024-02-05 22:32:46 886
原创 SpringMVC-响应数据
至此我们完成了SpringMVC-响应的介绍,请读者继续关注,笔者将在下一篇文章中为大家介绍SpringMVC-请求的介绍。届时将可以利用SpringMVC框架完成大部分的请求与响应啦~
2024-02-05 00:23:53 747
原创 SpringMVC-组件解析
中,为读者解释了如何使用SpringMVC框架,将承接客户端请求的工作从原生的Servlet转移到我们熟知的Controller中。那么我们不禁会好奇,SpringMVC框架到底做了什么,是怎么把请求分发给Controller的呢?这里我们先不去过多演示关于SpringMVC组件的自定义使用方法,重点是了解请求的执行流程,以及由@WebServlet注解演变到@Controller的过程中发生了什么。这样才能更加深刻的了解框架与技术的更迭。
2024-02-04 22:58:53 832
原创 SpringMVC-基本概念
我们每每需要去继承一个HttpServlet接口,然后针对不同请求类型(GET或POST),覆盖对应的方法,在方法中又需要去通过spring-web依赖提供的工具类去获取IoC容器,然后从容器中取出相应的service层的对象来处理逻辑。中抛出了一个问题:为什么我们一直在自用Java Web阶段使用的Servlet来承接客户端浏览器的请求呢,我们熟知甚至是已经在日常开发中经常使用的Controller又与之有什么关系呢?我们会发现,上面一段话中,继承接口,重写方法,获取容器,获取对象都是通用的操作。
2024-02-01 00:12:26 1188
原创 Spring-集成Web
至此,我们便完成了Spring集成Web的介绍,我们可以看到我们只需要完成监听器的配置与初始参数的配置,接着就可以利用工具类获取到IoC容器了。但是我们根据Java类加载顺序知道,静态代码块会在类第一次被加载的时候自动执行,这意味着创建容器的耗时操作将落在第一次被访问的Servlet时,这似乎也不太优雅。我们此时删除import,重新引入时发现了两个工具类供我们选择,一个是我们在上一步中自己实现的,下一个是spring-web提供的。如此典型的优化动作,Spring作为一个优秀的框架,当然为我们做好了。
2024-01-31 00:30:17 798
原创 Spring-集成Junit
在测试类上使用@ContextConfiguration注解,它的作用就是加载Spring的配置文件或配置类,让Spring的环境能够构建起来。当然介绍Spring集成Junit只是本篇分享的一小部分目的,笔者一贯愿意以最精简的代码实现理想的效果,更重要的,是想让读者在继续深入学习Spring之前能更好地体会易于集成其它框架的这一优势。在测试类中,你可以使用@Autowired注解来自动注入你需要测试的对象,这样你就可以在测试方法中直接使用这个对象了。在测试类中,你可以创建一些测试方法来测试你的代码。
2024-01-24 22:29:31 870
原创 Spring-注解开发
名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。@Qualifier注解用于解决歧义性问题,当有多个相同类型的Bean时,可以使用该注解指定要注入的Bean。我们拥有了上面的3个注解后,似乎可以将大部分的xml配置转化为注解了,但是请读者思考有哪些情景依靠这3个注解无法注解化呢?,可以在配置文件中声明Bean,把对象的创建权交给Spring容器,并且实际演示了如何配置一个经典的Bean——
2024-01-24 21:06:33 979
原创 Spring-配置数据源
至此,我们发现,使用Spring配置数据源与我们使用原生的Java代码配置数据源的做法本质上是一样的。当然Spring官方也会考虑到一点,请读者关注下一篇文章,我们将介绍Spring框架提供的一个更优的做法来创建对象——Spring-注解开发。的相关内容,但是我们配置的所有类都是我们定义的,我们似乎很轻松地把这些类的创建交给Spring容器来管理了。那么,我们是否能配置一些不是由我们定义的类呢,把这些外部的类也交由Spring容器来管理?我们是否很快想到了一个我们完成Web项目的对象——数据源。
2024-01-23 00:49:17 444
原创 Spring-配置文件
当选择为singleton时,表示每次问IoC容器索要的对象是同一个,而选择为prototype时,则生成的对象是不同的。我们注意到这里引用其它对象作为成员变量时,用的关键字是"ref",实际上这里有其它选项:当需要注入的是普通属性如int, float时,应使用"value"关键字;想象这样一个场景,我们上面的HelloWorld类中有一个成员属性是HelloSpring对象,我们怎么给HelloWorld对象设置这样的一个成员属性对象呢?可以想象,当项目的功能逐渐增加时,配置文件会变得异常庞大。
2024-01-22 21:21:26 994 2
原创 Spring-简介
就像搭房子一样,框架就如同是墙体结构,房地产开发商将墙体结构给客户搭建好了,至于细节的装修,比如刷什么颜色的漆,选用什么样的家具、什么颜色的灯光等等这些都将交由客户自己完成。所谓控制,即创建对象的控制权,所谓反转,指过去创建对象的控制是由开发者自己掌握的,现在则交给了Spring框架。的使用,我们的通用操作是注册驱动,获取连接,获取执行SQL对象等,执行SQL,处理查询结果等。4、集成了其它优秀的框架:如SpringMVC,MyBatis等,集成了其它框架的能力会让我们的工作更加省心。弥补了OOP的缺陷。
2024-01-21 21:11:19 444
原创 JavaWeb-Listener
由于框架的新兴,监听器的使用已经逐渐淡化,我们在这里仅介绍第一个,对Servlet Context的创建进行监听的监听器ServletContextListener,这个监听器会在后续介绍SpringMVC时再次提到。,Listener)之一,监听器的监听对象可以是application, session, request三个对象,监听的事件是这些对象的创建或销毁,或者是这些对象的某些属性的增删改。于是在启动Web项目时,控制台便会打印出代码片段中的输出语句了。
2024-01-21 14:29:22 356
原创 JavaWeb-Filter
Filter:过滤器,JavaWeb三大组件(Servlet,Filter,Listener)之一。(3)我们在拦截器中设置,要访问hello.jsp页面会被拦截,必须先校验session域中的登录状态,校验不通过则转到登录页面a.html中。(2)在登录的servlet中,我们完成用户名与密码的验证,并利用session将登录状态设置为已登录,并跳转到hello.jsp页面中。在一个系统中,我们不允许未登录状态下去访问一些资源,如果拦截器发现是未登录状态时,则不允许访问目标资源,自动跳转到登录页面。
2024-01-21 13:19:56 425
原创 JavaWeb-Cookie与Session
setMaxAge(int seconds): 参数表示让这个Cookie的存活时间(单位秒),即使关闭浏览器,也会持久化存储在硬盘中,下次打开浏览器Cookie依然是有效的。以上便是对cookie和session的介绍,接下来,笔者将会用本篇的知识来实现一个用户登录、注册、记住我、验证码的小demo,请读者继续关注。分析:由于cookie需要频繁地在客户端与服务端传递,显然是不安全的,而用户信息显然是敏感数据,毫无疑问,这个场景需要使用session。在下次进入网站时,此前加入的商品依然可以显示出来。
2024-01-20 20:35:29 1081
原创 JSP-简化
至此,我们利用EL与JSTL简化了JSP的开发,大大提升了JSP代码的可读性与易维护性。但是请读者思考,即使JSP克服了代码书写上的复杂,还存在什么问题呢?请关注下一篇文章。
2024-01-16 01:49:46 408
原创 JSP-概念
一、引子很多读者可能听过JSP,并且知道这是一门过时的技术了。在Spring,SpringBoot已经成为主流的今天,笔者为什么还要介绍JSP的相关内容呢?笔者常常提到一个概念:理解一门技术,要理解这个技术为什么产生,是解决了当时的什么问题,这样能帮助我们将不断迭代的技术连贯起来。那么,JSP是为什么产生的呢,我们一直使用Servlet来完成JavaWeb的开发有何不妥?JSP又是为何过时的,或者说JSP又存在哪些缺陷?阅读完笔者这几篇关于JSP的文章,读者将会更加明白JavaWeb的技术更迭历程,对全
2024-01-15 22:30:45 983
原创 Servlet- Response
Response的体系结构与Request完全一样,其中ServletResponse与HttpServletResponse都是Java官方定义的接口,ResponseFacade是Web服务器(Tomcat)的实现类。的相关内容后,接下来就是Servlet- Response的内容。读者阅读完本篇文章后将可以自如地解析请求、设置响应,完成对客户端的响应。Response响应分为响应字符数据与响应字节数据。
2024-01-15 19:36:36 392
原创 Servlet-Request
我们注意到我们定义的Servlet类若实现Servlet接口时,请求参数是ServletRequest类型的,若继承HttpServlet抽象类时,请求参数是HttpServletRequest类弄的,而这两个请求参数的类型都接口类型。一文中,我们讲到过Servlet中的service方法是由Web服务器(如Tomcat)调用的,那么它在调用方法时传递的参数不可能是接口类型的,必然有其实现类。如上图,在Tomcat中,这一实现类就是RequestFacade类。
2024-01-13 23:06:37 728
原创 Servlet-体系结构
因此,我们后续需要创建Servlet时,只需继承HttpServlet抽象类,重写doGet与doPost方法即可。Servlet的体系结构我们也已然清晰:(可在一个Servlet实现类右键后点击Diagrams选项展示)
2024-01-13 20:11:21 447
原创 Servlet-执行流程&生命周期
在WebServlet注解中:可以添加loadOnStartup参数,参数值可以是负整数、0、正整数。当参数值是负整数时,这个Servlet在第一次被访问时创建Servlet对象;当参数值0或正整数时,服务器启动时创建Servlet对象。数字越小优先级越高。中,我们抛出了一个问题:我们定义一个类实现了Servlet接口后,是谁创建了这个类的对象呢,又是谁调用了类中的service方法呢?我们只创建了Servlet类,并没有new一个Servlet对象,而客户端访问的ip+port实际是Web服务器程序。
2024-01-13 19:05:46 485
原创 Servlet-基本概念
因为Servlet需要运行在Web服务器(如Tomcat),而Web服务器中已引入了这个依赖,所以会导致依赖冲突。实现一个Servlet类,为用户提供动态资源响应,实际上就是实现一个Servlet接口并运行。service方法是被谁调用的呢,其它方法又有什么作用呢,是否存在更简便的方法呢?这青蛙service方法被调用了。Servlet的简称,是用Java编写的服务器端程序,主要功能在于交互式地浏览和生成数据,生成。而Servlet就是一门服务端的动态Web资源开发技术,它对用户的请求会响应动态的内容。
2024-01-13 01:10:07 427
原创 Tomcat-快速使用
bin目录:bin是binary的缩写,里面主要是可执行文件。在windows下是.bat文件,在linux和mac os下是.sh文件;conf目录:conf是configuration的缩写,里面当然与配置相关;lib目录:lib是library的缩写,tomcat也是由Java语言编写的,这里面是tomcat运行时依赖的jar包;logs目录:tomcat运行过程中的日志文件;temp目录:临时数据与临时文件;webapps目录:将Web工程置于该目录下,即完成了部署;
2024-01-11 01:43:03 525
原创 JavaWeb- Tomcat
中谈到,客户端与服务端之间在请求-响应的过程中,对于HTTP协议的操作是通用的,而这部分通用的处理即是Web服务器完成的,这使得开发者可以更关注Web应用中的业务逻辑。在网络服务出现之前,计算机只能浏览编辑本机上的资源,我们肯定是期望能够访问其它计算机上的资源的,于是Web项目与处理HTTP通用操作的Web服务器便应运而生了。试想这样一个过程::用户在客户端发出请求至Web服务器,Web服务器对其做出响应,返回相应的数据至客户端,即一次HTTP请求-响应(详见。,这也是读者们经常读到的答案。
2024-01-10 21:53:19 750
原创 JavaWeb-HTTP
我们可以思考一下,客户端浏览器遵循HTTP协议请求服务端时,服务端会遵循HTTP协议的格式解析请求报文,例如判断请求方式(GET还是POST或其它),根据不同请求方式解析请求参数。这是一个通用的过程,而且与我们的业务逻辑是不相关的。说白了,就是一段包含跳转链接的文本,其中的链接可以跳转至一个新的文本,一张图片,一段音频,一段视频等等语义扩大后的文本。由于超文本需要在计算机之间传输,为了识别传输的文本内容,那么就需要约定一种传输文本的格式。:最开始的计算机是没有网络的,所有的文本也只能在本机上编辑,查看。
2024-01-10 00:39:45 690
原创 MyBatis-快速使用
MyBatis的基本概念与产生背景已经在上一篇文章中介绍过,本篇将完成如下几步,实现MyBatis的快速使用:(1)实体类的创建(2)导入MyBatis依赖(3)编写MyBatis核心配置文件(4)SQL映射文件:实现了SQL与Java代码的分离(5)Java代码使用框架。
2024-01-09 00:31:26 384
原创 MyBatis-基本概念
笔者一直提到的一个概念是:理解一个技术,要理解这个技术为什么产生,是解决了当时的什么问题,这样能帮助我们将不断迭代的技术连贯起来。此外,(一)中提到的一个词,持久层框架:持久层指的是可以将数据持久保存的处理层,持久层框架说白了就是将数据保存到数据库内的框架。通过上面概念的铺垫,我们知道MyBatis的出现是为了解决JDBC的一些不便之处,参照。(1)SQL语句常常与业务代码结合在一起,可读性差,且不易维护;(2)需要手动设置参数,获取结果若要封装成对象需要手动处理。翻译如下:MyBatis 是一款优秀的。
2024-01-07 22:23:03 422
原创 JDBC-数据库连接池(druid)
数据库连接池的使用比较简单,只需要引入要使用的数据源依赖,配置好数据源信息,调用数据源的创建连接的方法即可。此外,相较在JDBC基本概念里的示例,我们把配置与代码进行了分离,减小了代码的耦合。
2024-01-07 21:00:37 603
原创 JDBC-常用API
在上一篇里介绍了JDBC的概念、产生原因及简单使用。本篇将介绍JDBC的常用API,包括Connection,Statement, ResultSet, PreparedStatement。
2024-01-07 17:25:44 566
原创 JDBC-基本概念
从上面的代码,可以看到使用JDBC时用到的DriverManager,Connection,Statemement需要引入的包都是java.sql,这意味着这几个类是由Java官方推出的,这正印证了JDBC是一套Java官方定义的一套接口与类这句话。查看这些接口的实现,可以索引到引入的MySQL驱动对这些接口的实现,而这些实现类的导入包,则换成了com.mysql.xxx,即由数据库厂商所实现的。因此,JDBC(Java数据库连接)就是Java程序用于连接数据库的一套标准的API,由一系列的接口与类组成。
2024-01-07 13:52:48 1330
原创 Java基础-异常
Java中异常都继承自Throwable类,Throwable有两个子类:Error类与Exception类。Error类用来表示编译时和系统错误,Exception类是可以被抛出的基本类型。程序员关心的基类型通常是Exception。: 返回异常发生时的简要描述;: 返回异常发生时的详细信息;对象封装的异常信息;
2023-12-18 23:25:27 355
原创 Java基础-String, StringBuilder, StringBuffer区别
(2)线程安全性,可以简单理解为当有多个线程操作同一个对象时是不出错。由于String是不可变的,所以肯定是线程安全的;StringBuffer在调用时加了锁,所以也是线程安全的;而StringBuilder没有加锁,是线程不安全的。(3)我们知道String的+号可以实现字符串的拼接,StringBuilder和StringBuffer的append方法也可以实现字符串的拼接,那我们应该如何选择?
2023-12-13 22:20:30 432
原创 Java基础-引用拷贝、浅拷贝、深拷贝
直接复制对象的引用。如下代码,copy是ex对象的引用拷贝,那么copy和ex是同一个引用,指向的也是同一个对象,那么自然拷贝对象和原对象的属性也是同一个。:深拷贝不仅会创建一个新的对象,对象中的对象类型的成员属性也会创建一个新的,而不是引用原对象的成员。(2)对于数据类型是引用数据类型的成员变量,比如说成员变量是某个字符串、数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据;
2023-12-08 16:17:13 501
原创 Java基础- 静态方法与静态属性
因为静态方法是Class-level的,静态方法在被调用时,与某个实例无关,自然也与实例的成员方法和成员属性无关。此外从内存的角度:静态方法属于类,因此在加载类时就会为静态方法分配内存,而成员方法属于实例,需要在实例初始化时才分配内存。在类的非静态成员不存在的时候静态方法就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。静态方法与静态属性都是类级别的(class-level)属于整个类,不属性类的某个对象实例。(2)可以用类名.静态方法的方式来获取该方法/属性,不需要创建实例,节省内存。
2023-12-07 21:28:26 490
原创 Java基础-包装类
所有整数型的包装类都在[-128, 127]之间做了缓存,即预先生成了这区间内的整数型对象。此外浮点型没有缓存机制。本质上装箱是调用包装类的.valueOf()方法,拆箱是调用包装类的.xxxValue()方法。:由于i1, i2会触发缓存机制,所以i1与i2相等, i3, i4不在缓存机制范围内,所以不等。整数型:byte, short, int, long -> Integer, Short, Integer, Long。:包装类的比较与对象相同,==比较的内在地址,.equals()比较的才是值。
2023-12-06 01:34:30 383 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人