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配置文件,配置要创建的对象类 <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对象
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴黎有个小铁匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值