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配置文件, 配置要创建的对象类 < bean id = "emp" class = "com.lanou.bean.Emp" / >
创建 工厂类, 使用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中${}和#{}有什么区别
$和#都充当的是占位符, 不过它们的底层实现不同. $的底层是有statement实现的, #的底层是由PreparedStatement实现的
#是先编译sql语句, 然后在传值, 给传入的值都加双引号
$传值是字符串拼接, 不会给传入的值添加双引号
$会造成SQL注入问题, $不会
只有在传入是数据库对象的时候才会使用$
按照某个表进行查询时传入表名
按照某个列进行查询时传入列名
传入非数据库对象的时候, 最后都使用#
13、Spring中AutoWired和,Resource之间区别是什么
AutoWried: 按照类型进行匹配-- - spring框架自带的, 查看当前Spring容器中那个bean类型和引用类型一致, 就进行注入, 如果有多个匹配类型就会报错.
Resource: 默认按照名称进行注入, 如果找不到对应的名称按照bean类型进行注入
14、Hibernate中延迟加载是什么,如何实现,如何取消
lazy: 延迟加载, 懒加载. 当真正使用到数据的时候, 才会向数据库发送sql语句进行查询, 加载数据都内存中, 可以避免无谓的开销
实体对象: < class / > 标签中添加lazy属性, true 为延迟加载, false 为不延迟加载
集合类: < set/ >
属性类型; < peoperty/ >
15、Hibernate的二级缓存和MyBatis二级缓存区别
两个缓存都是sessionfactory级别的缓存
Hibernate二级缓存:
是应用程序级别缓存, 生命周期依赖于应用程序
默认没有开启, 在配置文件中开启
需要借助第三方插件, 可以将数据缓存在内存中, 也可以将数据缓存在内存中
mybatis二级缓存:
mybatis的二级缓存不需要借助第三方插件, 默认下是开启的, 哪一个mapper需要开启缓存只需要在对应的映射文件中进行开启, 配置< catch / > 就可以
16、Hibernate和MyBatis中分别是如何实现表之间的关联查询
hibernate:
一对一关联 < one- to- one> 以及< cascade/ > 标签进行关联查询
一对多关联 一方在xml中根据< set/ > 和< one- to- many/ > 标签进行管理 多方中根据< many- to- one/ > 标签进行关联
多对多关联 < set/ > 和 < many- to- many/ > 标签进行关系
mybatis:
一对一 借助< resultMap/ > 标签做关联映射
一对多 一方映射文件中在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文件中借助< constant/ > 标签限制文件的大小
引入默认拦截器, 借助拦截器限制文件上传的类型
19、Hibernate中对象的状态有哪些,他们之间是如何转换
有三种: 临时态, 持久态和游离态
临时态: 内存中有对象, 数据库中没有与之对应的数据.
新创建出来的对象和持久态对象调用了delete ( ) 方法属于临时态
持久态: 内存中有对象, 数据库中有与之对应的数据, 修改对象的属性, 数据库中的数据也会随之改变
临时态调用sava或者savaOrupdate方法
通过get或者load方法从数据库中加载出来的对象
游离态调用了update或者savaupdate方法
所有的持久态对象都会存在session缓存中
游离态: 内存中有对象, 数据库中有与之对应的数据, 修改对象的属性, 数据库中的数据不会跟着改变
session关闭时
清空session缓存
从session缓存中踢出某个持久态 session. evict ( )
20、SpringMvc中的执行流程是什么,与Struts有什么区别
* * * springmvc的执行流程* * *
浏览器发起请求, 请求被提交到前端控制器
前端控制器接受都请求之后, 调用处理器映射器, 处理器映射器根据请求路径和自身的映射规则, 找到处理器, 并返回给前端控制器找到的处理器类型和执行链
前端控制器根据找到的处理器类型去找对应的处理器适配器, 处理器适配器调用处理器中的业务方法
处理器中的业务方法处理之后, 会给适配器返回一个ModelAndview对象
处理器适配器将ModelAndView返回给前端控制器
侵短控制器拿到ModelAndView, 取出对象中的视图名称, 再根据视图解析器的配置, 找到相对应得视图页面
前端控制器再取出ModelAndview中的数据模型对jsp页面进行渲染填充, 生成响应页面
前端控制器将生成的jsp页面返回给浏览器进行展示
* * * struts的执行流程* * *
浏览器发起请求, 请求被提交到web. xml前端过滤器
前端过滤器解析出请求路径, 再根据struts. xml文件中的action配置调用那个方法处理
action中处理完之后返回一个字符串
前端过滤器接受到返回的字符串, 再根据struts. xml中的result决定是重定向还是转发, 找到对应的页面返回给前端
21、SpringMvc处理器映射器和处理器适配器作用分别是什么,他们之间有什么关系?
处理器映射器: 根据用户提交的url和自身的映射规则找到对应的处理器
处理器适配器: 根据处理器类型找到对用的处理器适配器, 处理器适配器调用处理器中的业务方法
关系: 都是由前端控制器控制, 映射器是找到处理器类型, 适配器是调用该处理器的方法
22、视图解析器的作用是什么?
前端控制器拿到视图名称之后, 根据视图解析器找到对应的jsp页面
23、SpringMvc如何防止中文乱码问题
自定义过滤器
使用spring框架自带的过滤器 CharacterEncodingFilter
24、Struts2中如何给前端页面返回一个JSON字符串
strust. xml中配置package 继承json- default
在action中result type= "json"
25、Hibernate中get和load方法有什么区别
get获取的对象是非延迟加载方法, 只要调用get ( ) 方法就会立即向数据库发送sql语句, 无论这个对象有没有被使用, 当前id没有查询到对象的时候返回null
load方法获取对象是延迟加载的方法, 当调用load ( ) 方法的时候, 会返回一个代理对象, 代理对象只会保存对象的id属性, 不会像数据库发送sql语句, 只有在访问这个对象的其他属性时候, 才会向数据库发送sql语句, 完成完整的查询.
26、如何编写HQL语句,他与SQL语句有什么异同点
HQL语句是面向对象, SQl语句是面向数据库
HQL语句不支持select * 查询, 因为默认就是select *
SQL语句: select 列名 from 表名;
HQL语句: select 属性 from 类名;
HQL语句不支持除了分组函数以外的 其他函数: count ( ) / AVG ( ) / MIN ( ) / MAX ( ) / SUM ( )
HQL不支持join-- on的表连接查询
27、列举出Spring中常用注解
@autoWried 按照类型注入
@Controller web层实现
@Service Service层实现
@Respository dao层实现
@component 普通的bane组件
28、SpringMvc中处理器和JSP页面之间怎样传值
jsp给controller传值
在方法中添加参数HttpservletRequest request. getParamter ( "key" )
在业务方法中直接定义参数来传值
请求参数和方法参数的名称一致, 可以直接传值
请求参数和方法参数的名称不一致, 利用@requestparam ( "请求参数" ) 方法参数名
在方法中定义实体对象传值
实体对象的属性名和请求参数一致
实体对象提供有get和set方法
实体对象传过来存在request中
Controller传值给jsp页面
返回值是ModelandView, 通过mav对象getmodel ( ) 或者getModelMap ( ) 后存入值传会给jsp页面
返回值类型是string
在方法中定义HttpServletRequest或者HttpSession存入值
在方法中定义Model或者ModelMap对象存入值
29、在SSH整合中如何实现分页查询,如何使用二级缓
query. setFirstResult ( )
query. setMaxResult ( )
在applicationContent. xml文件中配置
开启二级缓存, 指定二级缓存提供商, 指定二级缓存文件
配置一个encache. xml
30、SpringMvc如何处理静态资源文件
在spring- mvc中配置 < mvc: default - servlet- handler/ >
配置< mvc: resourses loaction= "/static/" Mapper= "/ static >
告诉spring框架那些事静态资源, 当这些指定的静态资源请求到达时, 不进入dispatcherServlet, 而是直接去访问静态资源, 由spring框架自己处理静态资源, 允许静态资源存放在任由目录下
31、SpringMvc中拦截器如何编写,它与Struts中,拦截器有什么区别
自定义拦截器类实现handlerInterceptor
在拦截器中重写相应的方法
在配置文件中对拦截器进行注册< mvc: interceptors/ >
区别: spring拦截之后是去寻找controller
struts拦截后是去找struts配置文件中的action
32、SpringMvc对异常的处理方式有哪些
局部异常处理: 在controller中配置局部异常处理器, 处理当前controller中方法抛出的异常, 使用注解 @ExceptionHandler
全局异常处理: 统一处理controller处理器中方法抛出的异常
33、SpringMvc如何返回重定向与转发类型视图
转发: spring默认转发到另外一个jsp页面
返回值是string, 重定向只能通过session传值
转发到一个jsp页面
return "视图名称"
转发到另外一个url地址
return "forward:url地址"
重定向一个url地址
return "redirect:url地址"
返回值是ModeAndView
转发 mav. setViewName ( "forwrd: / emp/ listAll. do ) ;
重定向: mav. setviewName ( "redirect:/emp/listAll.do" ) ;
View view = new RedirectView ( "URL地址" ) ;
mav. setView ( view) ;
34、Struts2与SpringMvc有什么异同点
struts2框架是类级别的拦截器, 一个类对应一个request上下文. SpringMvc是方法级别的拦截, 一个方法对应一个request上下文
struts2是基于filter实现的, SpringMvc是基于servlet实现的
springmvc方法之间基本是独立的, 独享request和response之间的数据, 请求数据通过参数获取, 处理结果通过modelMap交回给框架.
struts虽然方法之间是独立的, 但是action中的变量是可以共享的
springmvc处理ajax很方便, 只需要一个注解@responseBody , 直接返回响应文本
拦截器的实现机制不一样 struts有自己的拦截器机制, Springmvc用的是独立的Aop方式, 导致Springmvc的配置文件比struts的配置文件多
35、Hibernate与MyBatis有什么异同点
Hibernate和Mybatis都是数据持久层的ORM框架, 简化封装了JDBC的操作.
Hibernate是全自动的, mybatis是半自动的
hibernate支持面向对象, 不用自己写sql语句, 但是不支持特定的Sql优化
mybatis是基于sql开发的一款框架, 支持sql的优化. 将sql语句写在xml文件中, 便于管理和维护
hibernate的可移植性好, 只需要在xml文件中修改数据库的方言就可以
hibernate支持多表之间的级联操作, mybatis只支持多表之间的级联查询
36、MyBatis接口映射规则
定义: 通过一定的映射规则, 根据我们定义的接口可以自动生成对应的实现类, 然后重写接口满足映射负责的方法, 那么满足这个规则的接口, 我们称之为映射接口
映射规则:
sql映射文件的namespace和映射接口的全限定名一致
sql定义语句的id和映射接口的方法名一致
sql语句的paramterType和映射接口的参数类型一致
sql定义语句的resultType和映射接口的返回值一致
增删没有resultType, 映射接口返回值类型写void
建议规范:
sql映射文件放在和映射接口统一包下
映射接口名以Mapper结尾, 便于区分其他接口
37、JS中常用数据类型有哪些
string number Boolean undefined null object
38、JS对象的创建方式有哪些,如何将一个JS对象转换为JSON字符串
第一种方式: 直接new Object ( )
var people = new Object ( ) ;
第二种方法: 借助构造器
function Point ( x, y) {
指定属性
this . x = x ;
this . y = y;
指定方法
this . distance = function ( x, y) {
return ( this . x- x) * ( this . y- y) ;
}
}
构建对象
var p = new Point ( 3 , 4 ) ;
第三种方式: 创建json字符串格式的js对象