responseEntity = ResponseEntity.ok()
.headers(headers)
.contentLength(file.length())
.contentType(MediaType.parseMediaType("application/text"))
.body(resource);
return responseEntity;
}
字符流和字节流的区别?
字节流是由字节组成的(byte)
字符流是由字符组成的(char)
Java里字符由两个字节组成. 1字符=2字节
JAVA中的字节流是采用ASCII编码的,
字符流是采用好似UTF编码,支持中文的
Q6、jdk1.8新特性
详细可参考:java8新特性学习笔记
Lambda表达式
函数式接口
方法引用和构造器调用
Stream API
接口中的默认方法和静态方法
新时间日期API
1、Lambda表达式
可以使用Lambda表达式写匿名内部类
public class Lambda {
interface AAA {
void test(int a, int b);
}
public static void main(String[] args) {
AAA aaa = new AAA() { //匿名内部类
@Override
public void test(int a, int b) {
System.out.println(a + "," + b);
}
};
AAA aaa1 = (a, b) -> { //匿名内部类,lambda表达式
System.out.println(a + "," + b);
};
aaa.test(2, 3);
aaa1.test(3, 4);
}
}
2、函数式接口
@FunctionalInterface这个注解声明该接口是一个函数式接口,简单来说,函数式接口是只包含一个方法的接口。比如Java标准库中的java.lang.Runnable和 java.util.Comparator都是典型的函数式接口。
3、方法引用和构造器调用
方法引用 :当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致)!
构造器引用: 与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致!
4、Stream API
Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找、过滤、筛选等操作。
可以使用StreamAPI的filter对集合进行过滤。
5、接口中的默认方法和静态方法
jdk1.8对接口进行了增强
在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法)。
接口里可以声明静态方法,并且可以实现。
Java 8 允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法。
接口里可以声明静态方法,并且可以实现
6、新时间日期API
LocalDate:包含了年月日信息。
LocalTime:LocalTime和LocalDate类似,区别在于LocalTime包含的是时分秒(毫秒)信息。
LocalDateTime:LocalDateTime是LocalDate和LocalTime的组合形式,包含了年月日时分秒信息。
Duration:Duration用于计算两个LocalTime或者LocalDateTime的时间差。
Period:Period用于计算两个LocalDate之间的时长。
Q7、String、StringBuffer和StringBuilder
String是final类,是不可以被继承的,是不可变对象,一旦被创建,就不能修改它的值。对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去。String底层有用到synchronized,因此String是线程安全的。
StringBuffer是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象,可以通过append()方法进行字符串追加,StringBuffer类自带reverse()方法可以实现字符串逆序。StringBuffer底层方法是用synchronized修饰的,因此StringBuffer是线程安全的。
StringBuilder和StringBuffer非常相似,都是可变字符序列,但StringBuilder不是线程安全的,不过StringBuilder的效率要比StringBuffer高。
Q8、JVM调优
JVM常用的垃圾回收算法有四种:标记-清除算法、复制算法、标记-整理算法、分代收集算法。(初级开发一般不会细问,只要能回答上四种算法应该就行了)
Q9、final、finally、finalize的区别与用法
final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
Q10、两个线程同时执行i++100次
可能的结果:最小为2,最大为200。
两个线程a,b,全局变量i。
最大为200:a执行100次i++,i=100。b再执行100次i++,i=200。
最小为2:a执行1次i=i+1,当i=1还未写入内存时,b抢过来CPU,一口气执行了99次并写入内存。此时a将i=1写入内存,替换掉了b的i=99,此时i还是等于1。b再抢得cpu执行一次i++,i变为了2但还未写入内存,此时a一口气执行99次,i=100并写入内存。然后i=2写入内存会替换掉i=100的值,因此i=2。
Q11、线程中sleep和wait的区别
sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用。
sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)。
它们都可以被interrupted方法中断。
2、锁
Q1、悲观锁和乐观锁
悲观锁 ,就是以悲观的态度来处理一切冲突。在数据修改前就先把数据锁住,防止其他人操作数据。在锁释放前,除了加锁者自己,其他人都不可以操作该数据。直到前面的加锁者把锁释放,然后后面的人拿到锁,并对数据加锁后才能对数据进行处理。常见的悲观锁像数据库中的行锁,表锁,读锁,写锁这些都是在做操作之前先上锁,是悲观锁。java线程同步中的synchronized也是悲观锁。
注意: 悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会 。另外还会降低并行性 ,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。
悲观锁实现形式:
1、表锁
lock table users; --给表加写锁
unlock tables; --释放锁
2、行锁
--使用行锁需在建表时使用innodb引擎
create table t_rowLock(id int,txt varchar(50)engine=innodb;
--为了使行锁生效,需关闭自动提交
set autocommit=0;
--InnoDB行锁是通过给索引上的索引项加锁来实现的
alter table t_rowLock add index id_index(id);
alter table t_rowLock add index txt_index(txt);
乐观锁 ,就是以乐观的态度来处理一切冲突。在数据修改前无需加锁,只有在数据要提交时才会进行冲突检测。如果冲突了则提交失败并返回错误的信息给用户。
乐观锁是一种并发类型的锁,其本身不对数据进行加锁通而是通过业务实现锁的功能,不对数据进行加锁就意味着允许多个请求同时访问数据,同时也省掉了对数据加锁和解锁的过程,这种方式大大的提高了数据操作的性能。
乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量
乐观锁实现形式:
乐观锁是通过在表中增加一个字段来控制数据的版本,如果要更新某行数据会校验版本号,版本相同则可以提交更新,版本不同则把数据视为过期。
用户A和用户B都要对uname=zhangsan进行数据更新。
--首先要关闭数据库的自动提交
SET autocommit=0;
--用户A获取要修改数据的版本号,用户A得到数据版本号VERSION=1
SELECT VERSION FROM users WHERE uname='zhangsan';
--用户B获取要修改数据的版本号,用户B得到数据版本号VERSION=1
SELECT VERSION FROM users WHERE uname='zhangsan';
--用户A对version=1的数据进行更新,并更新版本号
UPDATE users SET upwd='AAAAAA' ,VERSION=VERSION+1 WHERE uname='zhangsan' AND VERSION=1;
由于关闭了自动提交,因此此时用户A的update操作,没有提交,所以数据库表中相应的数据没有发生变化。
此时在A还没有提交的时候,B也执行了update的操作。
--用户B对version=1的数据进行更新,并更新版本号
UPDATE users SET upwd='BBBBBB' ,VERSION=VERSION+1 WHERE uname='zhangsan' AND VERSION=1;
由于A还没有提交,所以此时B的操作是处于等待状态,等待A完成提交,B的update才能执行。
A提交之后,B的Update操作也执行成功了。并提交B的操作。
然而却发现此时数据库表中的数据只是操作A进行数据修改的结果,而操作B的数据修改则无效。
这是因为当操作A提交后此时该数据的version已经改变了,version变为2了。而操作B还在用未改变之前的version作为条件修改数据,当然就修改失败了。
这就是乐观锁!!!
Q2、公平锁和非公平锁
1、公平锁
公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。
优点:所有的线程都能得到资源,不会饿死在队列中。 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。
2、非公平锁
非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。
优点:可以减少CPU唤醒线程的开销,整体的吞吐效率会高点,CPU也不必取唤醒所有线程,会减少唤起线程的数量。 缺点:你们可能也发现了,这样可能导致队列中间的线程一直获取不到锁或者长时间获取不到锁,导致饿死。
3、数据库知识
Q1、分页查询
1、Mysql分页查询
//取前5条数据
select * from xxx limit 0,5;
//取第11条到第15条数据,共5条
select * from xxx limit 10,5;
2、Oracle分页查询
rownum关键字:oracle对外提供的自动给查询结果编号的关键字
//每页显示m条数据,查询第n页数据)
select rownum,t.* from (select rownum r,e.* from 要分页的表 e where rownum<=n*m) t where r>n*m-m
3、Sqlserver分页查询
// 1、 先查询当前页码之前的所有数据id
select top ((当前页数-1)*每页数据条数) id from 表名
// 2、再查询所有数据的前几条,但是id不在之前查出来的数据中
select top 每页数据条数 * from 表名 where id not in ( select top ((当前页数-1)*每页数据条数) id from 表名 )
4、DB2分页查询
row_number()(Oracle中为rownum)作为查询的辅助函数
select * from (
select row_number() over(ORDER BY date DESC) as r,e.*
from emp e
where e.name=’A’)
where r between 1 AND 5
Q2、数据库索引
1、索引失效
计算、函数、类型转换会使索引失效
使用 != 或者<> 的时候无法使用索引会导致全表扫描
is not null 也无法使用索引,但是is null是可以使用索引的
like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作
字符串不加单引号索引失效
少用or,用它来连接时会索引失效
2、索引分类
Mysql有普通索引、唯一索引、主键索引、组合索引、全文索引。
//普通索引
create index name_no_index on t_staff(no);
//唯一索引
create unique index name_index on t_staff(name);
//主键索引
ALTER TABLE tbl_name ADD PRIMARY KEY (col_list);
//组合索引
create index name_no_index on t_staff(no,name);
//全文索引
ALTER TABLE tbl_name ADD FULLTEXT index_name (col_list);
创建全文索引可以极大的提升检索效率,解决判断字段是否包含的问题,例如: 有title字段,需要查询所有包含 "政府"的记录. 需要 like "%政府%"方式查询,查询速度慢,当查询包含"政府" OR "中国"的需要是,sql难以简单满足.全文索引就可以实现这个功能。
//全文索引使用
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('精神' IN NATURAL LANGUAGE MODE);
3、索引的优缺点
优点:大大提升查询效率
缺点:建立索引后,执行update、insert、delete操作效率会降低。insert数据时,要额外建立索引耗费存储空间。
4、索引底层
索引底层通常会采用B树实现,因为B树会自动根据两边的情况自动调节,使两端无限趋近于平衡状态。可以使性能最稳定。但B树也有弊端就是当插入/修改操作过多时,B树会不断调整平衡,消耗性能,因此索引不是越多越好。
由于索引底层的B树是三层的,因此无论查找哪个,都最多只需访问三次内存就可以搞定,B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。
Q3、数据库调优
如果要往一张表里插入100w条信息,如何进行性能调优
首先要根据业务需求选择合适的存储引擎,Mysql的存储引擎有MyISM和InnoDB。
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB 是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
在建表的时候尽量使得表中的字段都是定长的
要建立适当的索引来加快查询速度
开启数据库缓存机制,避免重复查询浪费时间和性能
使用e xplain ,如果发现查询缓慢则要在w here 条件后要有索引字段
避免s elect *
聚集索引和非聚集索引
聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个,聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。
Q4、mysql和sql server的区别
1、性能
mysql读写性能一流,即使是针对大量数据也没有问题,但前提是必须是简单查询效率快。如果是复杂查询则mysql的查询效率会下降许多。就是最好不要使用函数/join/group等方式查询。
sqlserver简单查询速度不如mysql,但复杂查询时,性能降低的不多,可见,sqlserver的查询优化作的可能更好。
2、对机器配置要求
3、功能
sqlserver的功能要比mysql要多,sqlserver有一个图形化操作界面比mysql的什么Navicat要强大许多。不过Mysql比sqlserver更加容易上手。
Q5、where、having、order、group by的执行顺序
where肯定在group by 之前,即也在having之前。 where后的条件表达式里不允许使用聚合函数,而having可以。
首先是where xxx对全表数据进行筛选,返回第一个结果集。
针对第一个结果集进行group by分组,然后是having对分组后的结果进行筛选(即使用having的前提条件是分组)
最后是order对最终的一个结果进行排序。
Q6、数据库事务四大属性
ACID:原子性、一致性、隔离性和持久性
一、原子性(atomicity)
一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性。
二、一致性(consistency)
事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
如果数据库系统在运行过程中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这是数据库就处于一种不正确的状态,也就是不一致的状态。
三、隔离性(isolation)
事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。
四、持久性(durability)
一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。--即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态。
4、Spring框架
Q1、Spring IOC和AOP
IOC,即控制反转,是通过依赖注入的方式去实现的。
所谓依赖注入,就是把底层类作为参数传入上层类,实现上层类对下层类的“控制”。把有依赖关系的类放到容器中,解析出这些类的实例,就是依赖注入。目的是实现类的解耦。
可参考:ssm——spring整理_金斗潼关的博客-CSDN博客
Q2、Springboot常用注解
@SpringBootApplication:Springboot项目启动类注解
@MapperScan:加在springboot启动类上,编译后会扫描相应接口的实现类(mybatis)
@Component、@Repository、@Service:用于类注解,表示将该类变成一个bean
@Component:服务层接口
@Service:服务层实现类
@Repository:持久层
@Autowired:自动装配。
@Resource:属性注入=@Autowired+@Qualifier
Q3、Springboot启动流程
入口类的要求是最顶层包下面第一个含有 main 方法的类,使用注解 @SpringBootApplication 来启用 Spring Boot 特性,使用 SpringApplication.run 方法来启动 Springboot项目。
@SpringBootApplication
public class ErpApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(ErpApplication.class, args);
}
public static ConfigurableApplicationContext run(Class primarySource, String... args) {
return run(new Class[]{primarySource}, args);
}
public static ConfigurableApplicationContext run(Class[] primarySources, String[] args) {
return (new SpringApplication(primarySources)).run(args);
}
SpringApplication类中的run方法是有两个参数,run(a,b)。
第一个参数 primarySource:加载的主要资源类。
第二个参数 args:传递给应用的应用参数。
先用主要资源类来实例化一个 SpringApplication 对象,再调用这个对象的 run 方法。
SpringApplication对象的实例化是用到了一个构造方法。
public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
this.sources = new LinkedHashSet();
this.bannerMode = Mode.CONSOLE;
this.logStartupInfo = true;
this.addCommandLineProperties = true;
this.addConversionService = true;
this.headless = true;
this.registerShutdownHook = true;
this.additionalProfiles = new HashSet();
this.isCustomEnvironment = false;
this.lazyInitialization = false;
// 1、初始化资源加载器为null
this.resourceLoader = resourceLoader;
// 2、断言资源类不能为null,否则会报错
Assert.notNull(primarySources, "PrimarySources must not be null");
// 3、初始化资源类集合,并去重
this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
// 4、判断当前web应用类型
this.webApplicationType = WebApplicationType.deduceFromClasspath();
// 5、设置应用上下文并初始化
this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
// 6、设置监听器
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
// 7、找到主入口应用类
this.mainApplicationClass = this.deduceMainApplicationClass();
}
Q4、Spring、SpringMVC和Springboot的区别
Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等;但他们的基础都是Spring 的ioc和 aop,ioc 提供了依赖注入的容器, aop解决了面向切面编程,然后在此两者的基础上实现了其他延伸产品的高级功能。
Spring MVC提供了一种轻度耦合的方式来开发web应用;它是Spring的一个模块,是一个web框架;通过DispatcherServlet, ModelAndView 和 View Resolver,开发web应用变得很容易;解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。
Spring Boot实现了auto-configuration自动配置(另外三大神器actuator监控,cli命令行接口,starter依赖),降低了项目搭建的复杂度。它主要是为了解决使用Spring框架需要进行大量的配置太麻烦的问题,所以它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具;同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box)。
简单来说:
所以,用最简练的语言概括就是:
Spring 是一个“引擎”;
Spring MVC 是基于Spring的一个 MVC 框架;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。
约定大于配置
开发人员仅需规定应用中不符合约定的部分。在没有规定配置的地方,采用默认配置,以力求最简配置为核心思想。
springboot中常见约定:
Maven的目录结构。默认有resources文件夹,存放资源配置文件。src-main-resources,src-main-java。
默认的编译生成的类都在targe文件夹下面
spring boot默认的配置文件必须是,也只能是application.命名的yml文件或者properties文件,且唯一application.yml中默认属性。
数据库连接信息必须是以spring: datasource: 为前缀;多环境配置。该属性可以根据运行环境自动读取不同的配置文件;端口号、请求路径等
Q5、AOP实现原理
AOP : 全称是 Aspect Oriented Programming 即:面向切面编程。AOP可以把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。
AOP的作用及优势:
作用: AOP使用动态代理实现,在程序运行期间,可以在不修改源码的情况下对已有方法进行增强。 优势: 减少重复代码 、提高开发效率 、维护方便。
AOP是通过动态代理实现的,但具体怎么实现我没有动手操作过,只是看过一些相关的面试题。
可以参考下这篇:AOP如何实现及实现原理_Java笔记-CSDN博客_aop原理
Q6、前端调用controller接口的过程
从代码层面简单说一下
5、Linux常用命令
ifconfig --查看网络命令
service network restart --重启网络配置
service iptables status --查看防火墙启用状态
service iptables start/service iptables restart --启用防火墙
service iptables stop --关闭防火墙
service sshd start --开启ssh(使用工具ssh或xshell连接linux时必须先开启)
tar --压缩包相关命令
tar -cvf /home/abc.tar /home/abc --只打包,不压缩
tar -zcvf /home/abc.tar.gz /home/abc --打包,并用gzip压缩
tar -jcvf /home/abc.tar.bz2 /home/abc --打包,并用bzip2压缩
当然,如果想解压缩,就直接替换上面的命令 tar -cvf / tar -zcvf / tar -jcvf 中的“c” 换成“x” 就可以了,例如:tar -zxvf redis-6.2.1.tar.gz --解压
ls --显示文件或目录
ls -l --显示文件或目录以及创建时间
ls -ll --显示文件或目录、创建时间和文件大小
ls -lh --显示文件或目录、创建时间和文件大小
cat xxx --从第一行开始显示文本内容(适用于内容较少的)
tac xxx --从最后一行开始显示,是 cat 的逆顺序
more xxx 一页一页的显示文本内容(适用于内容较多的)
less xxx --与 more 类似,但是比 more 更好的是,它可以往前翻页!
head xxx --只看文本的前面几行
tail xxx --只看文本的后面几行
nl xxx --显示文本内容与行号
cd xxx/ --切换目录
cd / --返回根目录
cd .. --返回上一级目录
touch xxx.txt --创建文件
mkdir xxxs --创建文件夹
vi sentinel.conf --新建一个文件
rm redis6379.conf --删除文件(如果出现是否删除询问,输入 y/n)
rm -f redis6379.conf --强制删除
rmdir rediscluster_conf --删除文件夹
cp redis_conf/redis6379.conf rediscluster_conf --把redis_conf文件夹下的redis6379.conf文件复制到rediscluster_conf文件夹中
cp redis6379.conf redis6380.conf --把redis6379.conf复制一份并把名字改为redis6380.conf
:%s/6379/6380 --把6379替换为6380
可参考:Linux常用命令(面试题)_RuiDer的博客-CSDN博客_linux常用命令面试题
6、Git常用命令
$ git config --global user.name "Atlantide"
$ git config --global user.email "13917052985@163.com"
$ git init
$ git remote add origin https://gitee.com/wulinchun/Graduation_Project.git
$ git add .
$ git commit -m "基于springboot和mybatis的erp系统"
$ git push origin master
$ git push origin master -f --强制提交
https://gitee.com/wulinchun/Video_teaching_platform.git
$ git remote add origin https://gitee.com/wulinchun/Video_teaching_studing_platform.git
$ git commit -m "基于springMVC和jdbc和mysql的视频教学平台"
$ git remote rm origin(删除关联的origin的远程库)
$ git remote update origin --prune --git更新远程分支
可参考:git常用命令与常见面试题总结_From Zero To Hero-CSDN博客_git常用命令面试
gitee在实际工作中都是集成开发工具使用的,拉代码,推分支,合代码等这些操作都不需要用到命令的。
下面的这些git代码可以着重记一下,当你推代码推错了,可以通过回滚本地分支再推到远程分支上实现一个覆盖。
git check CMS //切换到自己的本地分支
git log //查看历史提交记录
git reset --hard 29b4ebb37aad1f57039428806875f6b5e672eee5 //回退到之前指定版本
git push origin CMS --force //强制提交本地代码到远程分支
git pull //同步本地与远程分支
具体可参考:gitee删除上传到的远程分支的提交记录_金斗潼关的博客-CSDN博客
7、Vue
Q1、Vue启动流程
1、最简单的
可以通过引入vue的官方在线开发环境,来使用vue框架。
引入官方提供的vue开发环境以及axios在线地址
2、引入vue.js
3、创建一个vue项目
npm run dev
可参考:Vue+ElementUI+Springboot实现前后端分离的一个demo_金斗潼关的博客-CSDN博客
相关详细vue面试题可参考:Vue进阶(四十七):面试必备:2021 Vue经典面试题总结(含答案)_IT全栈 华强工作室-CSDN博客_vue面试题
Q2、DOM
DOM是文档对象模型,是和javascript相关用来绘制前端的网页。
8、中间件
消息队列: Rabbit MQ
关于消息队列,初级开发只要会用就行了,以RabbitMQ为例,在方法上添加@RabbitListener就可以监听相应队列的消息了。
我之前整理过相关RabbitMQ的学习笔记
RabbitMQ学习整理_金斗潼关的博客-CSDN博客
面试题的话,可以参考这两篇
RabbitMQ几个常用面试题 - woadmin - 博客园
rabbitmq面试题_Java技术博客-CSDN博客_rabbitmq面试题
9、Redis
Q1、Redis几种基本类型及区别和应用场景
Redis是一个开源的key-value存储系统。
Redis的五种基本类型:String(字符串),list(链表),set(集合),zset(有序集合),hash,stream(Redis5.0后的新数据结构)
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性 的。
Redis的应用场景为配合关系型数据库做高速缓存,降低数据库IO
需要注意的是,Redis是单线程的,如果一次批量处理命令过多,会造成Redis阻塞或网络拥塞(传输数据量大)
1、String
string 是Redis的最基本的数据类型,可以理解为与 Memcached 一模一样的类型,一个key 对应一个 value。string 类型是二进制安全的,意思是 Redis 的 string 可以包含任何数据,比如图片或者序列化的对象,一个 redis 中字符串 value 最多可以是 512M。
用法:
Incr:可以给key中的value值加1,如果key不存在则先初始化为0后再加1
Decr: 可以给key中的value值减1,如果key不存在则先初始化为0后再减1
Incrby: 可以给key中的value值 加指定的值 ,如果key不存在则先初始化为0后再 加指定的值
典型使用场景
一、计数
由于Redis单线程的特点,我们不用考虑并发造成计数不准的问题,通过 incrby 命令,我们可以正确的得到我们想要的结果。
二、限制次数
比如登录次数校验,错误超过三次5分钟内就不让登录了,使用setex每次登录设置key自增一次,并设置该key的过期时间为5分钟后,每次登录检查一下该key的值来进行限制登录。
2、hash数据类型
hash 是一个键值对集合,是一个 string 类型的 key 和 value 的映射表, key 还是 key ,但是 value 是一个键值对( key-value )。类比于 Java 里面的 Map> 集合。
用法:
典型使用场景
查询的时间复杂度是O(1),用于缓存一些信息。
3、list数据类型 list 列表,它是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际上是个链表。
列表有两个特点: 1、有序。2、可重复
用法:
典型使用场景
一、栈:通过命令 lpush+lpop
二、队列:命令 lpush+rpop
三、有限集合:命令 lpush+ltrim
四、消息队列:命令 lpush+brpop
4、set数据类型
Redis 的 set 是 string 类型的无序集合。
相对于列表,集合也有两个特点:1、无序 2、不可重复
用法:
典型使用场景
利用集合的交并集特性,比如在社交领域,我们可以很方便的求出多个用户的共同好友,共同感兴趣的领域等。
5、zset数据类型
zset ( sorted set 有序集合),和上面的 set 数据类型一样,也是 string 类型元素的集合,但是它是有序的。
用法:
典型使用场景
和set数据结构一样,zset也可以用于社交领域的相关业务,并且还可以利用zset 的有序特性,还可以做类似排行榜的业务。
6、stream(Redis5.0新数据结构)
redis stream 主要用于消息队列 (MQ,Message Queue) , Redis 本身是有一个 Redis 发布订阅( pub/sub )来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、 Redis 宕机等,消息就会被丢弃。
关于redis的详细可以参考我之前整理的一篇redis学习笔记:Redis学习整理_金斗潼关的博客-CSDN博客
Q2、 在项目中,你用Redis干了些什么
可以谈谈Redis分布式锁——Redisson,Redisson是一个非公平锁,适用于并发的情况下,可以锁住一段代码。
org.redisson
redisson
3.16.2
@Autowired
private Redisson redissonClient;
private final String LOCK="25YEAR";
RLock lock=redissonClient.getLock(LOCK);
lock.lock();
try {
要加锁的代码
}catch (Exception e){
e.printStackTrace();
}
lock.unlock();
再谈谈redisTemplate常用方法,以及分别的对应应用场景,比如登录缓存,有效期这些。
Q3、在springboot中如何找到redis的配置信息
Springboot配置redis: 可参考: Redis在SpringBoot中的配置_MIYAOW-CSDN博客
引入redis依赖:spring-boot-starter-redis,添加配置文件,添加cache的配置类,接下来就可以直接使用了。
Q4、如何用redis存储token信息及配置失效时间
//用户名作为token,设置过期时间为5分钟
redisTemplate.opsForValue().set("token", "username", 5, TimeUnit.MINUTES);
10、Maven
Q1、如何在maven中央仓库找到你想用的包,如果中央仓库没有这个包怎么办
首先可以去mvn repository网站上搜相应的依赖名称,在pom.xml中添加该依赖。让maven自动联网下载相应的jar包,如果自动下载失败,则需手动添加。
具体方法为: Step1、从网上下载相应的jar包。
Step2、cmd进入命令行:
mvn install:install-file -Dfile=f:\modbus4j-3.0.3.jar -DgroupId=com.infiniteautomation -DartifactId=modbus4j -Dversion=3.0.3 -Dpackaging=jar
Q2、Maven dependency的注入过程
在pom.xml写入依赖,加载maven项目时选择“enauto import”,让maven自动去联网下载jar包,如果自动下载jar包失败,则Reimport一下maven窗口。如果jar包还是下载失败或者依赖无法被识别(标红),则需手动往maven仓库里面添加jar包。
11、持久层框架
Q1、Hibernate和Mybatis的区别及应用场景
Hibernate
Hibernate是一个标准的ORM框架,不需要写sql,只需要通过mapping将实体类与数据库的表一一映射关联,通过操作实体类,来改变数据库表中的数据。
此时配置文件就搞定了直接去Main方法写代码
首先创建出Configuration对象调用configure()方法加载配置文件
然后通过Configuration对象调用buildSessionFactory()方法得到SessionFactory()
然后调用openSession()得到Session对象,通过Session对象开启事务
———————————————
增加方法:创建实体对象调用set方法插入数据以后使用session调用save(对象引用)方法将数据同步到数据库中
删除方法:通过session.get(实体.class,id);得到查询的对象 使用session.delete(对象引用)将查询的对象删除
修改方法:通过session.get(实体.class,id);得到查询的对象,使用对象引用修改数据之后使用session.update(对象引用);
查询方法:直接session.get(实体.class,id);
不要忘了提交还有关闭
transaction.commit();
session.close();
hibernate 优点:
hibernate 框架的好处是不用自己写sql,sql语句自动生成,开发效率比较高
hibernate 缺点:
对sql语句进行优化,修改比较困难。
应用场景:
适用于需求变化不多的中小型项目,比如:后台管理系统。
mybatis
mybatis: 专注是sql本身,需要程序员自己编写sql语句,sql修改,优化比较方便。mybatis是一个不完全的ORM框架,虽然程序员自己写sql,mybatis也可以实现映射(输入映射,输出映射)。
应用场景:
适用于需求变化较多的项目,比如:互联网项目
mybatis-plus
Mybatis-Plus(简称MP)是 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 mybatis-plus已经封装好了一些crud方法,我们不需要再写SQL语句了,直接调用这些方法就行。
可参考:Mybatis-plus实现数据库的增删改查操作_金斗潼关的博客-CSDN博客
12、其他
Q1、什么是同步和异步
同步:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程。
异步:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。
Q2、在后端中如何实现一个异步操作
springboot中实现异步:使用注解@Async,@Async注解是加在要异步的方法上,然后在springboot启动类上要加注解@EnableAsync开启异步。
使用@Async注解要注意的地方是必须把相应的接口注入,而不是注入其实现类。可参考:编写异步任务@Async出现bean无法注入的问题解决方案_金斗潼关的博客-CSDN博客
关于异步这块,在jdk1.8中新增了一个CompletableFuture.runAsync()可以实现多线程异步任务。
CompletableFuture completableFuture1 = CompletableFuture.runAsync(() -> {
xxx1();
});
CompletableFuture completableFuture2 = CompletableFuture.runAsync(() -> {
xxx2();
});
CompletableFuture completableFuture3 = CompletableFuture.runAsync(() -> {
xxx3();
});
package com.springboot_redis;
import java.util.concurrent.CompletableFuture;
/**
* @author: wu linchun
* @time: 2021/9/28 21:13
* @description:
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
CompletableFuture completableFuture1 = CompletableFuture.runAsync(() -> {
try {
xxx1();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture completableFuture2 = CompletableFuture.runAsync(() -> {
try {
xxx2();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture completableFuture3 = CompletableFuture.runAsync(() -> {
try {
xxx3();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("异步任务");
Thread.sleep(5000);
}
static void xxx1() throws InterruptedException {
Thread.sleep(1000);
System.out.println("xxx1");
}
static void xxx2() throws InterruptedException {
Thread.sleep(1000);
System.out.println("xxx2");
}
static void xxx3() throws InterruptedException {
Thread.sleep(1000);
System.out.println("xxx3");
}
}
package com.springboot_redis;
import java.util.concurrent.CompletableFuture;
/**
* @author: wu linchun
* @time: 2021/9/28 21:13
* @description:
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
CompletableFuture completableFuture1 = CompletableFuture.runAsync(() -> {
try {
xxx1();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture completableFuture2 = CompletableFuture.runAsync(() -> {
try {
xxx2();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture completableFuture3 = CompletableFuture.runAsync(() -> {
try {
xxx3();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture cf = CompletableFuture.allOf(completableFuture1, completableFuture2, completableFuture3);
//等待并行处理完毕
cf.join();
System.out.println("异步任务");
Thread.sleep(5000);
}
static void xxx1() throws InterruptedException {
Thread.sleep(1000);
System.out.println("xxx1");
}
static void xxx2() throws InterruptedException {
Thread.sleep(1000);
System.out.println("xxx2");
}
static void xxx3() throws InterruptedException {
Thread.sleep(1000);
System.out.println("xxx3");
}
}
Q3、前端后端交互的过程
13、总结
这些题目是我之前以及最近在面试时被问到的,然后做了一个整理以及相应的拓展,部分的回答可能会有不周到或者不合理的地方,如有的话欢迎指正。对于本文中的一些知识点,由于本人学识经验有限,更多的还是偏向于概念+应用。对于实现原理这块,有所了解但因为自己也没有透彻的理解,所以也不好表述,等我后续深入了解后会做相应的补充的。
今天是9/28也算是我在高知特的最后一天了,明天9/29就去下家公司了,也算是无缝衔接了。
累计算下来,也在高知特干了1年零4个月了。因为是人力外包公司,第一年是外包到甲方公司的生产运维,不涉及写代码。然后今年6月份换到另一个甲方做App的后端开发,才算正式开始接触写代码了。原本打算再干久一点,但由于项目的原因,不得已选择跳槽的。感觉还是有点仓促的。
其实对于外包有一点不太好的地方就是人力外包本身就是相当于甲方公司的临时工,不同的项目之间缺乏连续性,因此很难说能够有太多的积累和成长性。
之前在知乎看到一篇回答,有一点点感同身受。
为什么it外包永远在招人? - 知乎 (zhihu.com)
当然外包其实也有很多好的地方,外包其实主要还是看项目,如果项目好的话确实可以学到不少东西,并且也可以积累一些甲方公司的资源的。
个人感觉外包主要适合三种人:
想进一些巨头公司,或者大型银行的,当时由于名额或者其他原因进不了,但可以通过外包进入这些公司,工作几年争取转甲方(不过前提是学历,工作能力过硬)。
应届生或者刚入行的缺乏经验的可以进外包练练手,因为通常对于外包,甲方的要求会低一些,而且外包公司会对员工有简历包装,面试培训这种。再加上甲方也会看在外包公司的面子上,问的差不多就行了。
暂时没有理想的公司,外包也是不错的选择。毕竟外包公司,不管是高知特、中科软、复深蓝、中软国际、软通动力、京北方等,都是具有一定规模的公司。起码相应的福利工资可以得到保障的,抗风险能力强,这绝对比许多初创小公司画大饼的老板要强的多。
之前看到过一篇文章,是讨论产品思维的
技术人员的一点产品思维思考
大多数技术本身并不值钱,技术变现才是王道。技术变现的一种方式就是通过产品,无论是app,网站系统这种实体变现,还是卖课,智商税这种知识变现。都比单纯的会用这些技术强。
之前看到的一篇回答
为什么程序员到一定年纪开始关注管理相关的内容,不再在技术上深入下去? - 知乎
第一个项目的Home Manager有一次和我说过他为什么会从做开发转到管理,他说开发做到后面写代码做需求真的是很枯燥也没有发展空间。当时还没明白他的意思,现在有些明白了。
有机会还是要多读读书,读个研究生,提升一下学历什么的。虽然IT这行讲究实战,但有时候学历真的是决定上限的。多去认识些人,多积累些资源,多见识见识吧。不要让会写代码成为你唯一拿的出手的东西了。不过开始工作的三五年内还是以写好高质量的代码为准。
暂时就这些了,明天还要去新公司报到了。
一年很短,但未来很长。
14、参考资料
Linux | 文本文件查看命令_嵌入式大杂烩-CSDN博客_linux查看文件命令
探讨一下Vue和以前的jQuery两大框架的的区别_别把代码当饭吃-CSDN博客_jquery和vue的区别
面试官:说一下公平锁和非公平锁的区别? - 知乎 (zhihu.com)
你可能感兴趣的:(面试,java,spring,面试)
使用 spring-ai-openai-spring-boot-starter,SpringBoot无缝整合DeepSeek API实战指南
添砖java@
spring boot java spring
前言:本人为完成利用spring-ai-openai-spring-boot-starterspring整合deepseek的任务(因为还可以用本地部署的方式),在博客和AI工具中来回跳动,然而最终还是在官网找到了答案,完成过程中犯错无数,因此挥毫书就本文,希望能给大家带来帮助。一:环境准备以下是本人的环境,或许不是最优,但确保无误1.jdk版本:17(最好是17+)2.maven:3.9.93.
C#控制台应用程序学习——3.8
宣宣猪的小花园.
C#控制台应用程序 c# 开发语言 无人机
一、语言概述1、平台相关性C#主要运行在.NET平台上。.NET提供了一个庞大的类库,C#程序可以方便地调用这些类库来实现各种功能,如文件操作、数据库访问、网络通信等。2、语法风格C#的语法与C、C++和Java有一定的相似性。例如,它使用大括号{}来定义代码块,使用分号;结束语句。二、C#程序的基本结构1、命名空间(Namespace)命名空间用于组织代码,避免命名冲突。例如:usingSyst
用python做一个简单的可以调用手机摄像头进行车牌识别的H5页面
mosquito_lover1
python 计算机视觉
步骤和工具:1.后端:使用Python的Flask框架来处理HTTP请求和响应。2.前端:使用HTML5和JavaScript来访问手机摄像头并捕获图像。3.车牌识别:使用OpenCV和TesseractOCR库来进行车牌识别。步骤1:设置Flask后端首先,安装Flask和其他必要的Python库:pipinstallflaskopencv-pythonpytesseract然后,创建一个简单的
element ui 中 Cascader 级联选择器实现 动态加载 动态禁用 入门_cascader动态加载(2)
2401_84619606
程序员 前端 面试 学习
专业技能一般来说,面试官会根据你的简历内容去提问,但是技术基础还有需要自己去准备分类,形成自己的知识体系的。简单列一下我自己遇到的一些题HTML+CSSJavaScript前端框架前端性能优化前端监控模块化+项目构建代码管理信息安全网络协议浏览器算法与数据结构团队管理开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】最近得空把之前遇到的面试题做了一个整理,包括我本人自己
Day58 图论part08
2401_83448199
图论 算法
拓扑排序精讲拓扑排序看上去很复杂,其实了解其原理之后,代码不难代码随想录importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();intm=sc.nextInt();List>last=newArrayList());}
Day60 图论part10
2401_83448199
图论
今天大家会感受到Bellman_ford算法系列在不同场景下的应用。建议依然是:一刷的时候,能理解原理,知道Bellman_ford解决不同场景的问题,照着代码随想录能抄下来代码就好,就算达标。二刷的时候自己尝试独立去写,三刷的时候才能有一定深度理解各个最短路算法。Bellman_ford队列优化算法(又名SPFA)代码随想录importjava.util.*;publicclassMain{pu
Maven 使用指南:基础 + 进阶 + 高级用法
波波有料
maven java 开发语言
目录前言Maven是Java生态中最流行的项目管理和构建工具之一。它通过pom.xml文件管理项目的依赖、构建生命周期和插件配置。本文将从基础到高级,全面复习Maven的用法,并提供详细的代码示例和注意事项。同时,我们将深入探讨dependencyManagement标签的作用,并解释Maven中所有重要标签的用法。1.基础用法1.1Maven安装与配置1.3pom.xml基础配置1.4常用命令2
SpringBoot框架
小Y在线编码
企业级框架 Java全栈笔记整理 spring boot spring java 程序人生 后端
一、SpringBoot框架1、SpringBoot介绍SpringBoot是Spring家族体系中一员。SpringBootmakesiteasytocreatestand-alone,production-gradeSpringbasedApplicationsthatyoucan“justrun”.WetakeanopinionatedviewoftheSpringplatformandth
一分钟快速搭建 Spring Boot 项目
沉默王二
Java进阶之路 Java程序员进阶之路 java spring boot spring
大家好,我是二哥呀!学Java,自然少不了SpringBoot的学习!作为一名Java技术博主,已经被催了N多次SpringBoot的教程了,再不更新真有点鸽的不成样子——鸽上加鸽。因此我打算在接下来一段时间里间歇性地输出一些SpringBoot方面的文章,包括一些非常入门级的教程和一些非常优质的SpringBoot项目推荐,已经身经百战的starter们忽略就好。《Java程序员进阶之路》在Gi
Kubernetes 网络模型架构详解:组件通信、网络入口与出口
码农阿豪@新空间
包罗万象 kubernetes 网络 架构
个人名片作者简介:java领域优质创作者个人主页:码农阿豪工作室:新空间代码工作室(提供各种软件服务)个人邮箱:[2435024119@qq.com]个人微信:15279484656个人导航网站:www.forff.top座右铭:总有人要赢。为什么不能是我呢?专栏导航:码农阿豪系列专栏导航面试专栏:收集了java相关高频面试题,面试实战总结️Spring5系列专栏:整理了Spring5重要知识点与
redis分布式锁setnx
xiaogg3678
redis 分布式 数据库
packagecom.realize;importredis.clients.jedis.Jedis;importjava.util.UUID;importredis.clients.jedis.params.SetParams;publicclassDistributedLock{privateJedisjedis;privateStringlockKey;privateStringlockVa
Dockerfile 安装echarts插件给java提供服务
xiaogg3678
echarts java 前端
java调用echarts插件,生成图片保存到磁盘然后插入到pptx中报表。Dockerfile文件内容:#基础镜像,如果本地仓库没有,会从远程仓库拉取openjdk:8FROMdocker.io/centos:centos7#暴露端口EXPOSE9311#避免centos日志输出中文乱码ENVLANGen_US.utf8#容器中创建工作目录WORKDIR /usr/local/plugin#容器
vue3之拆若依--记实现后台管理首页(左侧菜单栏、头部信息区域...)
小白小白从不日白
Vue3 vue.js 前端 javascript
效果图前期准备启动若依在本地启动若依后台,跑在自己本地:这里对于如何下载若依相关的前后端代码请参考若依官网:RuoYi若依官方网站|后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|Java开源
springcloud项目部署Nginx+Gateway+其他服务
小白宗轩
spring cloud nginx gateway
一.部署Nginx:Nginx是一个高性能的Web服务器和反向代理服务器。它常用于将流量从公共互联网引导到内部的应用程序服务器。你可以在服务器上安装Nginx,并根据你的需求进行配置。通常的配置包括监听端口、定义服务器块、配置反向代理、设置SSL/TLS等。配置完成后,你可以启动Nginx,并确保它能够正常处理流量。明白它在整体项目中承担的作用:反向代理,负载均衡以及部署静态资源,这也是本章所用到
一致性哈希HashRing
留白1108
哈希算法 算法 一致性哈希
一致性哈希HashRing一致性哈希算法是一种高效的分布式存储和负载均衡技术,广泛应用于分布式系统中,如缓存集群、分布式数据库等。它通过将数据和节点映射到一个环形的哈希空间,实现了数据的均匀分布和节点的动态扩展。本文将详细介绍一致性哈希算法的原理,并通过一个完整的Java实现来展示其应用。一、一致性哈希算法原理一致性哈希算法的核心思想是将数据和节点映射到一个环形的哈希空间中。具体步骤如下:1.哈希
基于一致性哈希的分布式Top-K
留白1108
哈希算法 分布式 算法 TopK
基于一致性哈希的分布式Top-K在分布式系统中,数据的高效存储和快速查询是一个常见的挑战。一致性哈希(ConsistentHashing)是一种常用于分布式存储和负载均衡的技术,而Top-K查询则是数据分析中的经典问题。本文将通过一个Java实现的案例,展示如何结合一致性哈希和多线程技术,高效地完成分布式环境下的Top-K计算。实现思路一致性哈希分片:将数据通过一致性哈希算法分配到不同节点。局部T
SpringBoot 项目基于责任链模式实现复杂接口的解耦和动态编排
公众号:方志朋
spring boot 责任链模式 oracle 后端 java
一、背景项目中有一个OpenApi接口提供给客户(上游系统)调用。这个接口中包含十几个功能点,比如:入参校验、系统配置校验、基本数据入库、核心数据入库、发送给消息中心、发送给MQ.....不同的客户对这个接口的要求也不同,有些功能不需要,有些需要添加特定功能。二、思路基于以上背景,考虑把十几个功能点进行拆分形成独立的功能。因此使用责任链模式实现。创建一个抽象类(ComponentAbstract.
ElasticSearch学习笔记 --- 调研笔记知识点
杨鑫newlfe
大数据挖掘与大数据应用案例 搜索引擎
笔记总结知识点:1.安装ElasticSearch。2.ELasticSearch是使用Java开发并使用Lucene作为核心来实现所有索引和搜索的功能3.使用是通过简单的restfulAPI来使用。4.安装Marvel(ES的管理和监控)5.特点:分布式的实时文件存储,每个字段都被索引并可被搜索分布式的实时分析搜引擎可以扩展到上百台服务器,处理PB级机构化或非结构化数据6.集群是一组具有相同cl
了解Spring中常见的设计模式--责任链模式
tealala
java常用设计模式 设计模式 责任链模式
责任链模式(chainofreaponsiblityPattern):是将链中的每一个节点看作是一个对象,每一个节点对请求的处理不同(或者处理不同的请求),并且内部维护着下一个节点对象;一个请求进来,会从责任链的首部开始向下传递,直到有节点处理请求或者是走完整个链路;优点:1、将请求与处理进行解耦;2、链路中的节点只需要处理自己关心的请求,对于自己不关心的请求放给下一个节点进行处理;3、请求不需要
sql注入基础原理(SQL injection)
????27282
优秀文章 秀秀 sql 数据库 服务器 python java
sql注入基础原理文章目录sql注入基础原理Sql注入简介案例表产生sql注入的写法python相关java相关php相关sql注入相关技术B:基于布尔的盲注特征案例总结E:基于错误案例总结U:基于联合查询案例总结S:堆叠查询案例T:基于时间的盲注案例总结稀奇古怪的字典mysql基础->https://blog.csdn.net/qq_52549196/article/details/122530
《Head First 设计模式》例子的C++实现(2 观察者模式)
liyuanbhu
数据结构与算法 编程杂项 设计模式
最近在学习设计模式,用的是《HeadFirst设计模式》这本书。感觉这本书写的还是很不错的,深入浅出的介绍了各种常用的设计模式。唯一有点不方便的地方是这本书的例子全都是用的Java来实现的。而我主要是用C++。所以就动手将书上的代码用C++来实现了一遍。观察者模式首先是三个接口的代码://observer.h#ifndefOBSERVER_H#defineOBSERVER_HclassObserv
【SpringMVC】SpringMVC的启动过程与原理分析:从源码到实战
工一木子
原理分析 软件架构 SpringMVC SpringMVC 原理分析 MVC
SpringMVC的启动过程与原理分析:从源码到实战SpringMVC是Spring框架中用于构建Web应用的核心模块,它基于MVC(Model-View-Controller)设计模式,提供了灵活且强大的Web开发能力。本文将深入分析SpringMVC的启动过程、核心原理,并通过代码实战演示其工作流程。最后,我们还会探讨SpringMVC在JDK和Spring框架中的应用。一、SpringMVC
【前端】前端面试题
白了少年头z
前端 javascript
前端面试题闭包1.定义:闭包(Closure)是指一个函数能够访问并记住其外部作用域中的变量,即使外部函数已经执行完毕。闭包由两部分组成:一个函数(通常是内部函数)。该函数被创建时所在的作用域(即外部函数的变量环境)functionouter(){letcount=0;//外部函数的变量functioninner(){count++;//内部函数访问外部变量console.log(count);}
【项目实战】单元测试`spring-boot-starter-test` 简化了测试环境的搭建过程,让开发者能够更轻松地编写单元测试和集成测试。
本本本添哥
006 - 单元测试与测试技术 单元测试 集成测试 数据库
一、技术概览1.1定义spring-boot-starter-test是SpringBoot框架的一部分spring-boot-starter-test简化了测试环境的搭建过程,让开发者能够更轻松地编写单元测试和集成测试。spring-boot-starter-test是一个专门为测试SpringBoot应用程序而设计的启动器(starter)spring-boot-starter-test集成了
如何理解idea中的facet?
王摇摆
IDEA Spring intellij-idea java ide
在IntelliJIDEA中,Facet(模块特性)是一种用于为项目模块添加特定功能和配置的概念。它允许您向项目模块添加额外的特性,以支持不同类型的开发,例如Java、Web、Android等。Facet可以理解为一种插件或扩展,它为特定类型的模块提供了额外的功能和配置选项。通过Facet,您可以为模块启用特定的框架、技术或库,并为其提供相关的设置和工具支持。一些常见的Facet类型包括:Java
Java网络编程
serendipity_hky
JavaSE java 网络 开发语言
网络编程文章目录网络编程1.网络编程概述1.1软件架构1.2网络基础2.网络通信要素2.1如何实现网络中主机互相通信2.2通信要素1:IP地址2.3通信要素2:端口号2.4通信要素3:网络通信协议2.5InetAddress的使用3.传输层协议:TCP和UDP3.1TCP协议与UDP协议4.URL编程1.网络编程概述Java提供网络类库,可以实现网络连接。Java实现的跨平台的网络库,程序员面对的
JavaScript数据类型转换
難釋懷
javascript 开发语言
在JavaScript编程中,由于其动态类型特性,经常需要在不同的数据类型之间进行转换。正确地执行类型转换不仅能够避免潜在的错误,还能提高代码的灵活性和可维护性。本文将探讨JavaScript中的常见数据类型转换方法,并提供一些实用的例子来帮助你更好地理解和应用这些技术。一、隐式类型转换JavaScript在某些情况下会自动进行类型转换,这种转换被称为隐式类型转换或强制类型转换。虽然方便,但有时也
IDEA学习篇——Intellij IDEA 导入 eclipse web 项目详细操作
2401_86640450
intellij-idea 学习 eclipse
第六步:点击当前页面的Libraries→上面绿色加号→Java(根据你的需要,我这个项目是以架包的形式)。第七步:选择你项目中所用的架包的目录点击OK第八步:操作完成上一步之后点击Facet→Web,点击右边的加号把文件选中此项目中web.xml点击OK,第二个红框也把remove掉,改成WebRoot点击OK。之后点击apply,最后点击CreateArtifact。第九步:点击Artifac
idea中的WebFacet到底是啥?
cccccchd
intellij-idea java ide
文章目录问题:实践:Facet概念WebFacet问题:刷面经,博客输出,加深理解,20253.5,希望毕业前可以找到工作。实践:Facet概念IDEA中一个项目可以支持多个模块开发,比如Java,Spring,Web开发等等。为了支持这些模块开发,IDEA引入Facet概念。Facet:一种只模块化的配置方式,表示支持该模块的配置JavaFacet:支持JAVA开发SpringFacet:支持S
前 30+ 个 Spring Boot 面试问题及答案
李憨憨--
spring boot 面试 后端
前30+个SpringBoot面试问题及答案这篇文章将向你展示一组精心策划的经常被问到的SpringBoot面试问题,以帮助你在面试中取得好成绩。欢迎来到我们详尽的SpringBoot面试问题指南!SpringBoot在Java生态系统中越来越受欢迎,因为它易于使用,并且提高了开发Java应用程序的生产力。这篇文章将向你展示一组精心策划的经常被问到的SpringBoot面试问题,以帮助你在面试中取
eclipse maven
IXHONG
eclipse
eclipse中使用maven插件的时候,运行run as maven build的时候报错
-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
可以设一个环境变量M2_HOME指
timer cancel方法的一个小实例
alleni123
多线程 timer
package com.lj.timer;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimer extends TimerTask
{
private int a;
private Timer timer;
pub
MySQL数据库在Linux下的安装
ducklsl
mysql
1.建好一个专门放置MySQL的目录
/mysql/db数据库目录
/mysql/data数据库数据文件目录
2.配置用户,添加专门的MySQL管理用户
>groupadd mysql ----添加用户组
>useradd -g mysql mysql ----在mysql用户组中添加一个mysql用户
3.配置,生成并安装MySQL
>cmake -D
spring------>>cvc-elt.1: Cannot find the declaration of element
Array_06
spring bean
将--------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3
maven发布第三方jar的一些问题
cugfy
maven
maven中发布 第三方jar到nexus仓库使用的是 deploy:deploy-file命令
有许多参数,具体可查看
http://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html
以下是一个例子:
mvn deploy:deploy-file -DgroupId=xpp3
MYSQL下载及安装
357029540
mysql
好久没有去安装过MYSQL,今天自己在安装完MYSQL过后用navicat for mysql去厕测试链接的时候出现了10061的问题,因为的的MYSQL是最新版本为5.6.24,所以下载的文件夹里没有my.ini文件,所以在网上找了很多方法还是没有找到怎么解决问题,最后看到了一篇百度经验里有这个的介绍,按照其步骤也完成了安装,在这里给大家分享下这个链接的地址
ios TableView cell的布局
张亚雄
tableview
cell.imageView.image = [UIImage imageNamed:[imageArray objectAtIndex:[indexPath row]]];
CGSize itemSize = CGSizeMake(60, 50);
&nbs
Java编码转义
adminjun
java 编码转义
import java.io.UnsupportedEncodingException;
/**
* 转换字符串的编码
*/
public class ChangeCharset {
/** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */
public static final Strin
Tomcat 配置和spring
aijuans
spring
简介
Tomcat启动时,先找系统变量CATALINA_BASE,如果没有,则找CATALINA_HOME。然后找这个变量所指的目录下的conf文件夹,从中读取配置文件。最重要的配置文件:server.xml 。要配置tomcat,基本上了解server.xml,context.xml和web.xml。
Server.xml -- tomcat主
Java打印当前目录下的所有子目录和文件
ayaoxinchao
递归 File
其实这个没啥技术含量,大湿们不要操笑哦,只是做一个简单的记录,简单用了一下递归算法。
import java.io.File;
/**
* @author Perlin
* @date 2014-6-30
*/
public class PrintDirectory {
public static void printDirectory(File f
linux安装mysql出现libs报冲突解决
BigBird2012
linux
linux安装mysql出现libs报冲突解决
安装mysql出现
file /usr/share/mysql/ukrainian/errmsg.sys from install of MySQL-server-5.5.33-1.linux2.6.i386 conflicts with file from package mysql-libs-5.1.61-4.el6.i686
jedis连接池使用实例
bijian1013
redis jedis连接池 jedis
实例代码:
package com.bijian.study;
import java.util.ArrayList;
import java.util.List;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoo
关于朋友
bingyingao
朋友 兴趣爱好 维持
成为朋友的必要条件:
志相同,道不合,可以成为朋友。譬如马云、周星驰一个是商人,一个是影星,可谓道不同,但都很有梦想,都要在各自领域里做到最好,当他们遇到一起,互相欣赏,可以畅谈两个小时。
志不同,道相合,也可以成为朋友。譬如有时候看到两个一个成绩很好每次考试争做第一,一个成绩很差的同学是好朋友。他们志向不相同,但他
【Spark七十九】Spark RDD API一
bit1129
spark
aggregate
package spark.examples.rddapi
import org.apache.spark.{SparkConf, SparkContext}
//测试RDD的aggregate方法
object AggregateTest {
def main(args: Array[String]) {
val conf = new Spar
ktap 0.1 released
bookjovi
kernel tracing
Dear,
I'm pleased to announce that ktap release v0.1, this is the first official
release of ktap project, it is expected that this release is not fully
functional or very stable and we welcome bu
能保存Properties文件注释的Properties工具类
BrokenDreams
properties
今天遇到一个小需求:由于java.util.Properties读取属性文件时会忽略注释,当写回去的时候,注释都没了。恰好一个项目中的配置文件会在部署后被某个Java程序修改一下,但修改了之后注释全没了,可能会给以后的参数调整带来困难。所以要解决这个问题。
&nb
读《研磨设计模式》-代码笔记-外观模式-Facade
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
* 百度百科的定义:
* Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,
* 隐藏子系统的复杂性,使子系统更加容易使用。他是为子系统中的一组接口所提供的一个一致的界面
*
* 可简单地
After Effects教程收集
cherishLC
After Effects
1、中文入门
http://study.163.com/course/courseMain.htm?courseId=730009
2、videocopilot英文入门教程(中文字幕)
http://www.youku.com/playlist_show/id_17893193.html
英文原址:
http://www.videocopilot.net/basic/
素
Linux Apache 安装过程
crabdave
apache
Linux Apache 安装过程
下载新版本:
apr-1.4.2.tar.gz(下载网站:http://apr.apache.org/download.cgi)
apr-util-1.3.9.tar.gz(下载网站:http://apr.apache.org/download.cgi)
httpd-2.2.15.tar.gz(下载网站:http://httpd.apac
Shell学习 之 变量赋值和引用
daizj
shell 变量引用 赋值
本文转自:http://www.cnblogs.com/papam/articles/1548679.html
Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)
需要给变量赋值时,可以这么写:
Java SE 第一讲(Java SE入门、JDK的下载与安装、第一个Java程序、Java程序的编译与执行)
dcj3sjt126com
java jdk
Java SE 第一讲:
Java SE:Java Standard Edition
Java ME: Java Mobile Edition
Java EE:Java Enterprise Edition
Java是由Sun公司推出的(今年初被Oracle公司收购)。
收购价格:74亿美金
J2SE、J2ME、J2EE
JDK:Java Development
YII给用户登录加上验证码
dcj3sjt126com
yii
1、在SiteController中添加如下代码:
/**
* Declares class-based actions.
*/
public function actions() {
return array(
// captcha action renders the CAPTCHA image displ
Lucene使用说明
dyy_gusi
Lucene search 分词器
Lucene使用说明
1、lucene简介
1.1、什么是lucene
Lucene是一个全文搜索框架,而不是应用产品。因此它并不像baidu或者googleDesktop那种拿来就能用,它只是提供了一种工具让你能实现这些产品和功能。
1.2、lucene能做什么
要回答这个问题,先要了解lucene的本质。实际
学习编程并不难,做到以下几点即可!
gcq511120594
数据结构 编程 算法
不论你是想自己设计游戏,还是开发iPhone或安卓手机上的应用,还是仅仅为了娱乐,学习编程语言都是一条必经之路。编程语言种类繁多,用途各 异,然而一旦掌握其中之一,其他的也就迎刃而解。作为初学者,你可能要先从Java或HTML开始学,一旦掌握了一门编程语言,你就发挥无穷的想象,开发 各种神奇的软件啦。
1、确定目标
学习编程语言既充满乐趣,又充满挑战。有些花费多年时间学习一门编程语言的大学生到
Java面试十问之三:Java与C++内存回收机制的差别
HNUlanwei
java C++ finalize() 堆栈 内存回收
大家知道, Java 除了那 8 种基本类型以外,其他都是对象类型(又称为引用类型)的数据。 JVM 会把程序创建的对象存放在堆空间中,那什么又是堆空间呢?其实,堆( Heap)是一个运行时的数据存储区,从它可以分配大小各异的空间。一般,运行时的数据存储区有堆( Heap)和堆栈( Stack),所以要先看它们里面可以分配哪些类型的对象实体,然后才知道如何均衡使用这两种存储区。一般来说,栈中存放的
第二章 Nginx+Lua开发入门
jinnianshilongnian
nginx lua
Nginx入门
本文目的是学习Nginx+Lua开发,对于Nginx基本知识可以参考如下文章:
nginx启动、关闭、重启
http://www.cnblogs.com/derekchen/archive/2011/02/17/1957209.html
agentzh 的 Nginx 教程
http://openresty.org/download/agentzh-nginx-tutor
MongoDB windows安装 基本命令
liyonghui160com
windows安装
安装目录:
D:\MongoDB\
新建目录
D:\MongoDB\data\db
4.启动进城:
cd D:\MongoDB\bin
mongod -dbpath D:\MongoDB\data\db
&n
Linux下通过源码编译安装程序
pda158
linux
一、程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件:就是通常我们见到的lib目录下的文件 配置文件:这个不必多说,都知道 帮助文档:通常是我们在linux下用man命令查看的命令的文档
二、linux下程序的存放目录 linux程序的存放目录大致有三个地方: /etc, /b
WEB开发编程的职业生涯4个阶段
shw3588
编程 Web 工作 生活
觉得自己什么都会
2007年从学校毕业,凭借自己原创的ASP毕业设计,以为自己很厉害似的,信心满满去东莞找工作,找面试成功率确实很高,只是工资不高,但依旧无法磨灭那过分的自信,那时候什么考勤系统、什么OA系统、什么ERP,什么都觉得有信心,这样的生涯大概持续了约一年。
根本不是自己想的那样
2008年开始接触很多工作相关的东西,发现太多东西自己根本不会,都需要去学,不管是asp还是js,
遭遇jsonp同域下变作post请求的坑
vb2005xu
jsonp 同域post
今天迁移一个站点时遇到一个坑爹问题,同一个jsonp接口在跨域时都能调用成功,但是在同域下调用虽然成功,但是数据却有问题. 此处贴出我的后端代码片段
$mi_id = htmlspecialchars(trim($_GET['mi_id ']));
$mi_cv = htmlspecialchars(trim($_GET['mi_cv ']));
贴出我前端代码片段:
$.aj