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对象