SpringMvc快速入门
概述SpringMVC是一种基于]ava实现MVC模型的轻量级Web框架
优点
使用简单,开发便捷(相比于Servlet)
灵活性强
入门案例
使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标
12345678910111213<!--SpringMVC--><dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version></dependency><dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1&l ...
MyBatis入门
介绍什么是MyBatis
MyBatis是一款优秀的持久层(Dao)框架,用于简化JDBC开发
MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github
官网:https://mybatis.org/mybatis-3/zh/index.html
MyBatis 优点
如何写Mapper代理开发
定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
设置SQL映射文件的namespace属性为Mapper接口全限定名
在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
编码
通过SqlSession的getMapper方法获取Mapper接口的代理对象
调用对应方法完成sq的执行
细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件 ...
Spring入门
Spring快速入门开发步骤
导入Spring开发的基本包坐标(Maven)
编写Dao接口和实现类
创建Spring核心配置文件
在Spring配置文件中配置UserDaoImpl
使用Spring的API获得Bean实例
applicationXml配置文件Bean标签的属性scope:指对象的作用范围
注:
singleton:加载配置文件时创建bean对象
prototype:getBean时创建bean对象
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
Bean实例化三种方式
无参构造方法实例化(常用)
工厂静态方法实例化
工厂实例方法实例化
Bean的依赖注入依赖注入:它是Spring框架核心IOC的具体实现。
在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
IOC解耕只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。
那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让Spring 来维护了。
简单的说,就是 ...
Java垃圾回收机制
Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。
该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。
垃圾回收机制的核心思想对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。
触发主GC(Garbage Collector)的条件JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大。更值得关注的是主GC的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主GC:
当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但下面这点的条件除外;
Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两 ...
非对称加密和对称加密
非对称加密和对称加密在加密和解密过程、加密解密速度、传输的安全性上都有所不同,具体介绍如下:
加密和解密过程不同
对称加密过程和解密过程使用的同一个密钥,加密过程相当于用原文+密钥可以传输出密文,同时解密过程用密文-密钥可以推导出原文。
非对称加密采用了两个密钥,一般使用公钥进行加密,使用私钥进行解密;也可以私钥加密,公钥进行解密。一般公钥是对所有人公开的,原始数据使用公钥加密后,只有拥有私钥的人才能解密。 也就是说只有公钥的情况下是无法解开加密的数据的。
非对称加密流程图:
对称加密流程图:
加密解密速度不同
对称加密解密的速度比较快,适合数据比较长时的使用。非对称加密和解密花费的时间长、速度相对较慢,只适合对少量数据的使用。
传输的安全性不同
对称加密的过程中无法确保密钥被安全传递,密文在传输过程中是可能被第三方截获的,如果密码本也被第三方截获,则传输的密码信息将被第三方破获,安全性相对较低。
非对称加密算法中私钥是基于不同的算法生成不同的随机数,私钥通过一定的加密算法推导出公钥,但私钥到公钥的推导过程是单向的,也就是说公钥无法反推导出私钥。所以安全性较高。
...
JavaScript判断设备类型的实现
项目中碰到前端某个页面提供APP的不同设备版本下载,需要在用户打开的时候识别用户设备并跳转到对应的选项卡,Js代码如下:
1234567891011121314151617181920212223242526272829303132333435<script> // 判断不同设备的方法 var isMac = /macintosh|mac os x/i.test(navigator.userAgent); var isAndroid = /(Android)/i.test(navigator.userAgent); var isWin = /(win32|win64)/i.test(navigator.userAgent); var isIos = /(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent); if(isWin) { // 通过id获取标签 var twin = document.getElementById("tab_windows"); var pwi ...
Java中的移位运算符:<<,>>,>>>
Java中有三种移位运算符
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
二进制
十进制
备注
代码
1010
10
原始数
number
1010
20
左移一位
number = number << 1;
1010
10
右移一位
number = number >> 1;
用代码看一下具体实现:
12345678910111213141516171819202122public class Test {12 13 public static void main(String[] args) {14 int number = 10;15 //原始数二进制16 printInfo(number);17 number = numbe ...
Maven快速入门
认识Maven没有Maven管理项目会出现的问题
很多模块,模块之间没有关系,手动管理关系,比较繁琐
需要很多第三方功能,需要很多jar文件,需要手动从网络中获取各个jar包
需要管理jar的版本
管理jar文件之间的依赖。项目中a.jar需要用到b.jar里面的类
Maven的用处人工管理项目很麻烦,于是maven就来了,用maven有如下好处:
maven可以管理jar文件
自动下载jar和他的文档,源代码
管理jar直接的依赖,a.jar需要b.jar,maven会自动下载b.jar
管理需要的jar版本
编译、打包、测试、部署程序
Maven的构建构建主要包含项目的编译、测试、运行、打包、部署等,Maven支持的构建包括:
清理(clean),把之前的项目编译的东西删除,为新的编译代码做准备
编译(compile),把程序源代码批量编译为执行代码
测试(test),maven可以执行测试程序代码,验证你的功能是否正确,并生成测试报告
打包(package),把你的项目中所有的class文件,配置文件等所有资源放到一个压缩文件中
这个压缩文件就是项目的结果文件,通常 ...
用户态线程和内核态线程
学习了用户态和内核态,用户态和内核态是内存中完全隔离的两个区域:
内核空间(Kernal Space),这个空间只有内核程序可以访问;
用户空间(User Space),这部分内存专门给应用程序使用。
用户态想要执行系统调用调用时,需要切换到内核态执行
用户态线程用户态线程也称作用户级线程(User Level Thread)。操作系统内核并不知道它的存在,它完全是在用户空间中创建。
用户级线程有很多优势,比如。
管理开销小:创建、销毁不需要系统调用。
切换成本低:用户空间程序可以自己维护,不需要走操作系统调度。
但是这种线程也有很多的缺点。
与内核协作成本高:比如这种线程完全是用户空间程序在管理,当它进行 I/O 的时候,无法利用到内核的优势,需要频繁进行用户态到内核态的切换。
线程间协作成本高:设想两个线程需要通信,通信需要 I/O,I/O 需要系统调用,因此用户态线程需要支付额外的系统调用成本。
无法利用多核优势:比如操作系统调度的仍然是这个线程所属的进程,所以无论每次一个进程有多少用户态的线程,都只能并发执行一个线程,因此一个进程的多个线程无法利用多核的优势。
操作系 ...
时间复杂度
什么是大O算法导论给出的解释:大O用来表示上界的,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。
我们看一下快速排序,都知道快速排序是O(nlogn),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。
但是我们依然说快速排序是O(nlogn)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界。如图所示:
O(logn)中的log是以什么为底?平时说这个算法的时间复杂度是logn的,那么一定是log 以2为底n的对数么?
其实不然,也可以是以10为底n的对数,也可以是以20为底n的对数,但我们统一说 logn,也就是忽略底数的描述。
递归算法的时间复杂度递归算法的时间复杂度本质上是要看: 递归的次数 * 每次递归中的操作次数。
例子:计算x的n次方
最直观的就是用for循环,常规思路:
1234567int function1(int x, int n) { int result = 1; // 注意 任 ...