说说你对solr的理解
solr是一个独立的企业级搜索应用服务器,它对外提供类似于web-service的API接口, 用户可以通过HTTP请求,向搜索引擎服务器提交一定格式的文件, 生成索引, 也可以通过HTTP GET操作提出查找请求,并且得到返回的数据, solr是一个高性能,基于Lucene的全文搜索服务器, 同时对其进行了扩展, 提供了比Lucene更为丰富的查询语言, 同时实现了可配置,可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面, 是一款非常优秀的全文搜索引擎.
简单介绍一下shiro
shiro的三大组件, subject 用户的操作, sucuritymanange管理所有的用户, realms 进行权限信息的验证
是一个java权限框架,可以帮我们完成 认证, 授权 ,加密, 会话管理, web集成, 缓存功能.
四大基石
- 身份验证, 授权, 会话管理, 加密
1. 身份验证/登录 验证用户是不是拥有相应的身份
2. 授权 即权限验证, 验证某个已验证的用户是够拥有某个权限,即判断用户是够能做某些事,如验证某个用户是否拥有某个角色,或者细粒度的验证某个用户对某个资源是否具有某个权限
3. 会话管理, 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中, 会话可以是普通javase环境的. 也可以是如web环境的
4. 加密, 保护数据的安全性, 如密码加密存储到数据库, 而不是明文存储;
shiro可以做什么
- 验证用户信息
- 用户访问控制,比如用户时候被赋予了某个角色,时候允许访问某些资源
- 在任何环境都可以使用session API 即使不是web项目或者没有EJB容器
- 事件相应(在身份验证, 访问控制期间, 或者session生命周期中)
- 集成多种用户信息数据源
- SSO- 单点登录
- Remember Me 记住我
- Shiro尝试在任何环境下实现这些功能, 而不依赖其他框架, 容器或应用服务器.
shiro不会去维护用户,维护权限,这些需要我们自己去设计提供, 然后通过现已对的接口注入给shiro即可
java集合类型
- list (是一个有序的集合 元素的存取顺序相同,可以存储重复的元素)
- arrarList 底层结构是数组, 查找速度快,由于日常开发使用最多的就是查询数据,遍历数据,所以arrayList是最常用的集合)
- LinkedList(底层结构是链表,双向链表,增删改快)
- vector(已经被arraylist 集合所代替)
- set(她是一个无序的集合, 存取的顺序可能不同)
- HashSet 元素唯一,不能重复. 底层结构是哈希表结构, 元素的存于取的顺序不能保证一致, 存储的内容是键值对的映射
- 如何保证数据一致, hashCode() 与 equals()方法.
- LinkedHashSet 元素唯一不能为重复, 底层结构是哈希表结构+链表结构. 元素的存于取 是一致的
- HashSet 元素唯一,不能重复. 底层结构是哈希表结构, 元素的存于取的顺序不能保证一致, 存储的内容是键值对的映射
- map 底层实际上是数组和链表来组成的
- HashMap 线程不安全
- Hashtable 线程是安全的
- TreeMap 存取的顺序是有序的,所以速度比上面两个要慢,
- LinkedHashMap 使用链表维护键值对, 所以比HashMap 慢.
- queue (没用过)
用于模拟队列这种数据结构, 队列通常是指 先进先出 的容器 队列的头部保存在队列中存储时间最长的元素, 尾部保存存放时间最短的元素, 新元素插入到列队的尾部, 取出元素会返回队列头部的元素, 通常, 队列不允许随机访问队列的元素.
如何解决跨域问题
- jsonp dataType:‘jsonp’,
- response.setHeader(“Access-Control-allow-Origin”,request.getHeader(“Origin”)); 设置响应头
- response.setHeader(“Access-Control-Allow-Credentials”, “true”);
- Nagix 在nginx.conf 中进行配置修改ip地址
什么是值传递, 什么是引用类型传递
对象被值传递, 以为这传递了对象的一个副本, 因此就算改变了对象副本, 也不会改变原对象的值,
对象如果被引用传递,意味着传递的并不是实际的对象,而是对象的引用,因此外部对引用对象的改变也会反射到所有对象上.(引用传递 是传的地址值)
基本数据类型
引用数据类型
java支持多继承吗 为什么
java如果支持多继承的话, 如果两个父类有相同的方法,且子类没有覆盖改方法, 就无法确定调用的是哪一个父类的方法.
java为什么支持实现多接口
接口全是抽象方法,实现谁都无所谓, 所以接口可以多实现
因为接口定义的方法都是抽象的,而且不能再就扣中实现方法,所以接口实现多个接口,并不会是接口的结构变得很复杂, 相反, 这样做还能给一个团队在开发的过程中提供很多便利.
什么是注解,为什么使用注解
注解可以看做是对一个类或方法的一个扩展的模板, 每个方法按照注解类中的规则为类注解不同的参数,再用到的地方可以得到不同的类中注解的各种参数和值,
优点 开发速度快 容易修改错,
缺点, 管理分散, 不遵循OCP开发原则 (开闭原则)
什么是数据库索引
是一种帮助mysql高效的获取数据的数据结构, 这些数据结构以谋嶂方式引用数据,这种结构就是索引, 简单理解就是排好序的快速查询数据结构.
request response区别
Request 和 Response 对象起到了服务器与客户机之间的信息传递作用。 request 对象用于接收客户端游览器提交的数据 response 对象的功能则是将服务器的数据发送到客户端游览器
session和cookie的区别
首先都是为了记录用户的状态用的
cookie是存在客户端游览器上的, session是存在服务器上的
cookie是不安全的, session比较占用服务器资源
cookie保存的数据最大不能超过4k 考虑安全就是用session
很多游览器限制一个站点最多存放20个cookie 重要的信息就放在session
其他信息就可以存放在cookie
什么是json
json就是一个字符串, 只不过元素会使用特定的符号标注.
json是一种传递对象的语法, 对象可以是name/value 数组和其他对象
spring的特点
- 方便解耦, 简化开发,通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合
- AOP编程的支持,
- 声明事物的支持,
- 方便程序的测试,
- 方便集成各个优秀的框架.
- 降低java API(接口)的使用难度,
优点
- 低入侵式编程, 代码污染极低,
- 独立与各种应用服务器.
- spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
- AOP支持允许将一些通用的任务进行集中式管理,从而提供了更好的复用. 比如 安全 事物 日志等
- ORM和DAO提供了与第三方持久层框架的良好整合, 并简化了底层的数据库访问.
- spring并不强制应用完全依赖于spring. 开发者可自由选用spring框架的部分或全部
#{}和${}的区别
#{} 的参数替换是发生在 DBMS 中,而 ${} 则发生在动态解析过程中。
#{}相当于占位符,可以有效的防止sql注入,
${}表示拼接字符串,可以将传递过来的内容拼接在sql中不会进行jbdc类型转换
myBatis的执行操作
创建sqlsessionfactory 然后创建sqlsession 然后执行数据库操作, 然后提交事务 .commit() 关闭会话(关流).close
myBatis是什么
是一个持久层框架,对jbdc操作数据库的过程进行了封装, 实现了JPA规范(JPA是java持久化解决方案,负责吧数据保存到数据库,不是框架) 用来连接数据库并对其进行增删改查的操作的开源框架
ORM是什么
是对象映射意思
他的作用是在关系型数据库和对象之间的一个映射, 这样,我们在具体的操作数据库的时候, 就不需要再去和复杂的sql语句打交道,只要像平时一样操作他就可以了
什么是持久化
把数据保存到可永久保存的存储设备中, 持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件上,XML数据文件中等等.
什么是持久层
专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联
为什么要做持久化和ORM设计
在目前的企业系统设计中MVC为主要的系统架构模式,
mvc中的M包含了复杂的业务逻辑和数据逻辑以及数据存取机制等等,
将这些复杂的业务逻辑和数据逻辑分离,
以将系统的紧耦合关系转化为松耦合关系
是降低系统耦合度迫切要做的,
也是持久层的工作,
MVC模式实现了架构上将表现层和数据处理层分离的解耦合,
而持久化的设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合,
而ORM是持久化设计中最重要也是最复杂的技术
springMVC 简介-----------------------------(缺东西)
是一个基于spring实现了Web MVC设计模式的请求驱动类型的web框架
是spring的一个子框架,拥有spring的特性
使用mvc的架构模式的设计思想,将web层进行指责解耦,并管理应用所需对象的声明周期,为简化日常开发,提供了很大遍历.
list应用场景
ArrayList 程序在集合的开头和结尾进行增删改查的时候可以用arrayList
LinkedList 在删除和插入的时候比较快
操作时间
Date & Calendar 格式化时间使用SimpeDateFormat
String字符串拼接
“+” 或者 concat
spring的七个模块
Core
Context
DAO
ORM
AOP
Web
Web MVC
redis数据类型 如何存取
set zset string Hash List
如何存取 List 存lpush左压 取 pop右弹
什么是依赖注入
一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖,不是对象从容器中查找依赖, 而是容器在对象初始化的时候主动的将依赖传递给他
项目的整体架构
使用ssm框架进行开发,采用分布式的系统架构,前台系统和单点登录系统采用了集群的方式部署
后台管理系统采用来Maven的多模块化的管理, 其中采用了水平切分的方式,
将pojo dao service web 分层开发, 这样做的好处就是重用性更高
系统内部接口调用采用HttpClient 并且使用httpClient的连接池技术,
接口提供端采用RESTful方式的接口定义;
系统之间的通知机制采用MQ的方式,
使用RabbitMQ的实现,
使用了RabbitMQ的消息订阅模式的消息机制;
系统的接口还对JS的跨域做了支持,
采用了jsonp的解决方法,
在后台接口中扩展了spirng提供的jackson数据转化器实现;
搜索系统使用了solr实现,
在保证系统高性能的前提下,
尽可能为公司节约成本,
我们使用MySQL数据库进行集群(oracle收费)。
在部署方面,
采用了Nginx+tomcat的模式,
其中nginx的作用一方面是做反向代理、负载均衡、另一方面是做图片等静态资源的服务器。
依赖注入有哪几种方式
构造方法注入,setter注入,基于注解的注入。
为什么要使用maven
能够自动关联和下载依赖, 方便管理项目依赖,方便升级, 方便打包
下载的时候去maven的中央仓库,因为是国外网站, 所以下载速度慢, 所以我们使用阿里的景象
spring的事物管理
事物就是对一些数据库的操作进行统一的提交和回滚, 如果成功,那么就一起成功, 如果失败,则会回滚到之前的操作, 这样就可以有效的防止数据发生错误.
spring都有哪些注解
@Component 标注一个普通的spring Bean类
@Conterller 标注一个控制组件类
@Service 标注一个业务逻辑组件类
@Repository 标注一个DAO组件类
spring MVC都有哪些注解
@Conterller
@RequestMapping
@RequestParam
@ResponseBody
springMVC的执行流程
用户发送url到前段控制器
前段控制器请求处理器映射器执行handler
处理器映射器将结果返回给前段控制器
前段控制器调用处理器适配器执行handler
处理器适配器执行handler
执行完毕后给处理器适配器返回modelandview
处理器适配器像前段控制器返回modleandview
(如果需要解析视图前段控制器请求视图解析器解析视图
然后视图解析器像前段控制器返回view)
前段控制器返回用户
过滤器
依赖web容器
基于函数回调, 他可以对几乎所有的请求进行过滤, 但是缺点是一个过滤器事例只能在容器来初始化一次
使用过滤器的目的: 用来做一些过滤操作,获取我们想要的数据
使用场景
在过滤器中修改字符编码
在过滤器中修改httpservletrequest(当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息)
的参数 如 过滤低俗文字, 危险字符
拦截器
依赖于web框架, 在mvc中就依赖mvc框架
在实现上 基于java的反射机制 属于面向切面编程的一种运用 就是在servcie前
调用一个方法 或者在方法后调用一个方法,
优点
由于拦截器是基于web框架的调用因此可以使用spring 的依赖注入 进项一些业务的操作, 同时一个拦截器实例在一个conterller 生命周期之内可以多次调用
缺点
是只能对conterller请求进行拦截, 对其他的一些比如直接访问静态资源的请求则没办法进项拦截处理
session 和request的区别
request对象的生命周期是针对客户端的一次请求,当请求完毕后,request的资源会被释放,
session的生命周期是针对客户端的一个会话周期, session里面的内容将会一直存在,即使关闭了这个游览器 session也不一定会马上被释放掉
优缺点
request占用资源少, 安全性高, 缺乏持久性,
session消耗资源大,安全性不如request ,
JDBC是什么
是java语言的定义的一套标准,规范了客户端程序访问关系数据库的应用接口,接口的及具体实现由各关系数据库自己实现
AOP面向切面编程
AOP面向切面编程是一种思想
AOP核心概念
横切关注点
— 对哪些方法进项拦截,拦截后怎么处理, 这些关注点称之为横切关注点
切面
—类是对物体特征的抽象,切面就是对横切关注点的抽象
连接点
—被拦截到的点,因为spring只支持方法类型的连接点,所以在spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
切入点
—对连接点进行拦截的定义
通知
—所以通知指的就是指拦截到连接点之后要执行的代码,通知分为前置,后置,异常,最终,环绕 通知五类
目标对象
—代理的对象目标
织入
—将切面应用到目标对象并导致代理对象创建的过程
引用
—在修改代码的前提下,引入可以在运行期为类动态的添加一下方法和字段
spring中的aop代理有spring的ioc容器负责生成,管理,其依赖管理也由ioc容器负责管理.
因此aop代理可以直接使用容器中的其他bean实例作为目标,这种关系可由ioc容器的依赖注入提供.
重载与重写的区别
重载是指在用一个类中的多个方法名相同,方法参数不同,
重写就是子类和父类拥有相同的方法名字,参数和返回值类型.
什么是控制反转
是一种设计思想,以为这将你设计好的对象交给容器控制, 而不是你在对象内部直接控制
反转就是由容器来帮忙创建及注入依赖,因为由容器来帮我们查找及注入依赖对象,对象只能被动的接收依赖对象,所以是反转.
什么是序列化和反序列化
把对象转换为字节数组的过程就叫序列化,
用途
把对象的字节序列永久的保存到硬盘上,通常存放在一个文件中, 或者网络上传输对象的字节序列
把字节序列转化为对象的过程叫做反序列化
多态!!!
同样的引用调用同样的方法却做了不同的事
多态存在的三个必要条件 继承, 重写, 父类引用指向子类
程序中定义的引用变量,所指的就提类型和通过引用变量发出的方法调用在程序时并不确定,
而是在程序运行的时候才能确定, 即一个引用变量,只有在程序运行的时候才能确定,因为只有程序运行的时候才会有具体的类, 不用修改程序代码就可以改变程序运行所绑定的具体代码,让程序可以选择多个运行状态,
优点 提高代码的可复用性, 可扩充性, 可维护性
反射
就是把一个类的各个成分映射成一个个java的对象,
反射有三种方法, getClass .classs forName
get与post
get 从指定的资源请求数据
get请求 可被缓存 会保留在游览器的历史当中 可以被收藏为标签 有长度限制 只应当用于取回数据 数据放在rul中最大2k 以? 分割参数之间使用&相连
post 像指定的资源提交要被处理的数据 放在请求体中 不会被缓存 不会保留在游览器的记录中 不能被收藏为标签 对长度没有要求 比get请求安全
Request和Response的区别
Request 和 Response 对象起到了服务器与客户机之间的信息传递作用。
Request 对象用于接收客户端浏览器提交的数据,
而 Response 对象的功能则是将服务器端的数据发送到客户端浏览器。
什么是分布式,什么是集群,什么是负载均衡
将一套系统拆分成不同子系统部署在不同服务器上(这叫分布式),
然后部署多个相同的子系统在不同的服务器上(这叫集群),
部署在不同服务器上的同一个子系统应做负载均衡。
Collection和Collections区别
collecyion是一个集合接口, 它提供了对集合对象进行基本操作的通用接口方法。
collection接口在java类库中有很多具体的实现,
接口的意义是为了各种具体的集合提供了最大化的统一操作方式。
collections是一个包装类 它包含有各种有关集合操作的静态多态方法。
此类不能实例化,就像一个工具类,服务于Java的Collection框架。
Collection是一个集合接口和Collections是一个包装类
一个http请求所经历的步骤
建立tcp连接, web游览器向web服务器发送请求命令 web服务器应答, web服务器发送响应头信息, web服务器关闭tcp连接
封装
封装就是指利用抽象数据类型把数据和基于数据的操作封装起来, 使其成为一个不可分割的整体, 数据隐藏在抽象数据中, 尽可能的隐藏细节, 只保留一些接口使其与外界繁盛关系 . 也就是说用户无需知道内部的数据和方法的具体实现细节, 只需根须留在外面的接口进行操作就可以了. 为什么封装 方便复用,也能防止一些误操作。 封装的好处, 实现了 专业的分工. 减少耦合 隐藏信息,实现细节 类内部的结构能自由的修改 可以对成员进行更精准的控制
继承
一个类只能继承一个父类, 继承就是吸收了已有类的数据属性和行为, 并且扩展了新的能力 继承避免了对一般类和特殊类之间的共同特征进行重复描述, 同时通过继承可以清晰的表达每一项共同特征所适应的概念范围, 在一般的类中定义的属性和操作适应于这个类本身以及它一下的没一层特殊类的全部对象, 运用继承原则使得系统模式比较简练也比较清晰 为什么需要继承 继承可以降低代码的重复性, 加强了代码的复用性, 便于维护和修改
接口与抽象类的区别
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
反射中,Class.forName和classloader的区别
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
string、stringbuilder、stringbuffer区别
首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
3. 总结一下
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况