SSH和SSM框架面试题

SSH和SSM框架面试题


仅用于自己学习笔记,有错误请指出

1、Struts2的执行流程是什么
浏览器向服务器发起请求,请求被提交到web.xml前端过滤器
前端过滤器解析出请求的路径,再根据struts.xml中的action配置,决定将请求交给那个方法来进行处理
action中处理完请求之后,返回给前端一个字符串
前端过滤器拿到字符串之后,再根据struts.xml中的result配置决定是重定向还是分发,一般是转发,如果是转发就去找相对应的jsp页面,最后将jsp页面返回给前端
2、值栈和OGNL作用分别是什么
概念:值栈:struts2的数据管理中心,存储action相关的数据和信息
存放的数据有:action中的对象,action中的属性和action环境相关的数据(request,session,application)
ValueStack是struts中的一个接口,OgnlValueStack是ValueStack的实现类.客户端发起请求,struts2框架会创建一个OgnlvalueStack值栈实例,OgnlValueStack贯穿整个action的生命周期,struts中使用OGNL将请求的参数封装为对象存储在值栈中,并通过OGNL表达式读取值栈中的对象属性.
OGNL:对象图导航语言,它是一种功能强大的开源表达式语言.使用这种表达式语言,可以存取对象的任意属性.
用于简化jsp代码中的java代码,访问数据,跟jsp中的EL表达式功能相似
作用:用于获取数据和用作类型转换
3、Struts中JSP如何给Action传值
通过from表单进行传值
通过ajax进行传值
通过url进行传值
4、拦截器的作用,以及拦截器和过滤器之间的区别
拦截器的作用:动态拦截action调用的对象.定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可以重用的部分的方式.
区别:
底层实现不同.拦截器基于反射实现的,过滤器基于函数回调实现的.
过滤器依赖于servlet容器.拦截器不需要依赖任何容器
过滤器会对所有的请求其作用,拦截器只会作用于action,只对action
拦截器可以访问action上下文,值栈中的对象,过滤器不能
在action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化的时候被调用一次.
拦截器可以获取IOC容器 中的各个bean,和值栈中的数据,而过滤器不行
5、Ioc是什么,底层如何实现的,Ioc与DI之间关系
IOC:控制反转.获得对象依赖的方式反转了,改变了对象的创建方式.原来有new构造器创建的方式现在由spring容器进行创建和管理.
底层实现:
创建xml配置文件,配置要创建的对象类
创建 工厂类,使用dom4j解析配置文件,得到id对应的class属性
根据反射创建类对象(Class.forName)
IOC和DI之间的关系:IOC是一种思想,DI是实现这种思想的的途径
DI:依赖注入,DI的作用是维护对象之间的关系,将一起工作具有关系的对象之间通过构造器或者set方法传入值建立关系
DI注入的方式:
通过set方式注入
通过构造器方式注入
接口注入(p命名空间简化set方法注入值)
6、AOP作用是什么,底层如何实现在哪些地方会用到,分别简述切面,切入点和通知
AOP:面向切面编程:将一个系统中共同的业务逻辑提取出来,进行单独的封装成一个组件(切面),然后以配置的方式作用于系统中,实现程序的可插拔性,提高代码的复用性,提升系统的灵活性和性能
底层实现:JDK动态代理,只支持接口注入
CGLIB:可以支持普通类的注入
那些地方会用到:事物开启,日志记录,安全验证,权限验证
切面:系统中共通的业务提取出来,在某个时刻或者某个阶段共同调用
切入点:找到目标方法,给它追加共通的业务逻辑,在spring中提供了切入点表达式帮助我们找到目标方法execution
通知:什么时候调用这个共通的业务逻辑,用于指定切面方法作用到系统中的时机.
前置通知,后置通知,环绕通知,异常通知,最终通知
7、什么是动态代理模式
给目标对象提供一个代理类来控制目标对象的访问,在不修改目标对象的前提下,对目标对象进行功能扩展.代理对象和目标对象实现共同的接口或者继承共同的类.
代理类在程序运行前就存在成为静态代理,代理类在程序运行的时候创建称为动态代理.
8、什么是spring容器
spring容器是spring的核心,所有的java类和javabean都会被当做一个bean组件,这些bean组件由spring容器负责统一管理和创建,维护这些对象之间的关系
9、spring如何管理Bean对象
spring管理bean对象的实例化
构造器构造对象
静态工厂构建对象
实例工厂构建对象
spring管理bean的作用域
scope
singleton:单例模式 默认值,容器中只有一个对象
prototype:多例,每次getBean()返回一个新的对象
web应用中
request,一个请求对应一个对象
session:一个session对应一个bean对象
global-session:多个session对应一个bean对象
spring管理对象的生命周期
实例化—>初始化–>业务逻辑–>销毁
init-method bean的初始化方法,对象在实例化完成之后自动调用
destory-method bean的销毁方法 单例对象在容器关闭的时候调用
spring管理对象的延迟实例化
在默认情况下,单例的bean在容器启动的时候就会构建对象
lazy-init=“true” 将单例对象的实例化延迟到调用getBean()的时候创建
10、什么是Restful
表现层状态转移,是一种软件设计风格,主要作用是将网上的资源进行统一的定位和规定统一的操作方式,符合这种rest设计框架的应用 程序被称为restful风格
资源(Resources)
REST的名称"表现层状态转化"中,省略了主语。“表现层"其实指的是"资源”(Resources)的"表现层"。
所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。
所谓"上网",就是与互联网上一系列的"资源"互动,调用它的URI。
表现层(Representation)
“资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层”(Representation)。
比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。
URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而URI应该只代表"资源"的位置。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。
状态转化(State Transfer)
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。
互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
综述
综合上面的解释,我们总结一下什么是RESTful架构:
  (1)每一个URI代表一种资源;
  (2)客户端和服务器之间,传递这种资源的某种表现层;
  (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
11、用过哪些数据库连接池,有什么区别
dbcp:没有自动回收空闲链接的功能,c3p0有自动回收空闲链接的功能,
对数据库的处理方式也不同,dbcp提供最大连接数,c3p0提供最大空闲时间
12、MyBatis中${}和#{}有什么区别
KaTeX parse error: Expected 'EOF', got '#' at position 2: 和#̲都充当的是占位符,不过它们的底…的底层是有statement实现的,#的底层是由PreparedStatement实现的
#是先编译sql语句,然后在传值,给传入的值都加双引号
$传值是字符串拼接,不会给传入的值添加双引号
S Q L , 会造成SQL注入问题, 不会
只有在传入是数据库对象的时候才会使用$
按照某个表进行查询时传入表名
按照某个列进行查询时传入列名
传入非数据库对象的时候,最后都使用#
13、Spring中AutoWired和,Resource之间区别是什么
AutoWried:按照类型进行匹配—spring框架自带的,查看当前Spring容器中那个bean类型和引用类型一致,就进行注入,如果有多个匹配类型就会报错.
Resource:默认按照名称进行注入,如果找不到对应的名称按照bean类型进行注入
14、Hibernate中延迟加载是什么,如何实现,如何取消
lazy:延迟加载,懒加载.当真正使用到数据的时候,才会向数据库发送sql语句进行查询,加载数据都内存中,可以避免无谓的开销
实体对象:标签中添加lazy属性,true为延迟加载,false为不延迟加载
集合类:
属性类型;
15、Hibernate的二级缓存和MyBatis二级缓存区别
两个缓存都是sessionfactory级别的缓存
Hibernate二级缓存:
是应用程序级别缓存,生命周期依赖于应用程序
默认没有开启,在配置文件中开启
需要借助第三方插件,可以将数据缓存在内存中,也可以将数据缓存在内存中
mybatis二级缓存:
mybatis的二级缓存不需要借助第三方插件,默认下是开启的,哪一个mapper需要开启缓存只需要在对应的映射文件中进行开启,配置就可以
16、Hibernate和MyBatis中分别是如何实现表之间的关联查询
hibernate:
一对一关联 以及标签进行关联查询
一对多关联 一方在xml中根据和标签进行管理 多方中根据标签进行关联
多对多关联 和 标签进行关系
mybatis:
一对一 借助标签做关联映射
一对多 一方映射文件中在result标签中定义collection 在对方映射文件中定义 多方在映射文件中借助resultMap标签和assocation标签
多对多:两个一对多
17、Spring如何管理事物,事物的传播特性和隔离级别有哪些
事物的概念:事物是一种机制,一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事物是一个不可拆分的工作逻辑单元.
spring管理事物有两种方式
声明式管理事物:使用springAop对事物进行管理,使用xml文件或者注解来对事物进行配置,可以使业务逻辑和事物管理隔离,实现解耦合
编程式管理事物:直接在代码中开启事物和提交事物,控制起来灵活但是不便于管理
事物的特性:原子性,一致性,隔离性,持久性
事物的传播行为:
propagation_requierd:如果当前没有事物就创建一个事物,如果已经存在一个事物中,加入这个事物中
propagation_supports:支持当前事物,如果没有当前事物,就以非事物方法执行
propagation_mandatory:使用当前事物,如果没有当前事物,就抛出异常
propagation_required_new:新建事物,如果当前事物存在,把当前事物挂起.
propagation_not_support:以非事物方式执行操作,如果当前事物存在,就把当前事物挂起
propagation_never:以非事物的方式执行,如果当前事物存在,则抛出异常
propagation_nested:如果当前存在事物,则嵌套事物内执行.如果当前没有事物,则执行与propagation_required类似的操作
18、Struts如何实现文件上传下载.如何限制上传文件的大小和类型
获取前端传入的需要上传的文件(属性,get和set方法)
获取服务器上传的路径
根据服务器上传路径创建一个文件对象
判断文件夹是否存在,不存在则创建一个文件夹
根据服务器上传的路径和上传的文件名创建一个文件输出流对象
创建一个读取数据的字节数组
使用输入流对象循环获取需要上传的文件,并使用输入流写入该文件
关闭流
在sturts.xml文件中借助标签限制文件的大小
引入默认拦截器,借助拦截器限制文件上传的类型

猜你喜欢

转载自blog.csdn.net/qq_42361748/article/details/83149765
今日推荐