三、Spring框架面试题
1、什么是Spring框架?Spring框架有哪些主要模块?
Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。
Spring框架至今已集成了20多个模块。这些模块主要包括核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。
2、使用Spring框架能带来哪些好处?
A、Dependency Injection(DI) 方法使得构造器和JavaBean properties文件中的依赖关系一目了然。
B、与EJB容器相比较,IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下进行应用程序的开发和发布就变得十分有利。
C、Spring并没有闭门造车,Spring利用了已有的技术比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他视图技术。
D、Spring框架是按照模块的形式来组织的。由包和类的编号就可以看出其所属的模块,开发者仅仅需要选用他们需要的模块即可。
E、要测试一项用Spring开发的应用程序十分简单,因为测试相关的环境代码都已经囊括在框架中了。更加简单的是,利用JavaBean形式的POJO类,可以很方便的利用依赖注入来写入测试数据。
F、Spring的Web框架亦是一个精心设计的Web MVC框架,为开发者们在web框架的选择上提供了一个除了主流框架比如Struts、过度设计的、不流行web框架的以外的有力选项。
G、Spring提供了一个便捷的事务管理接口,适用于小型的本地事物处理(比如在单DB的环境下)和复杂的共同事物处理(比如利用JTA的复杂DB环境)。
3、什么是控制反转(IOC)?什么是依赖注入?
控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。
控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们的实际工作中起到了有效的作用。
依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?
在Java中依然注入有以下三种实现方式:构造器注入、Setter方法注入、接口注入
4、请解释下Spring框架中的IoC?
Spring中的 org.springframework.beans 包和 org.springframework.context包构成了Spring框架IoC容器的基础。
BeanFactory 接口提供了一个先进的配置机制,使得任何类型的对象的配置成为可能。ApplicationContex接口对BeanFactory(是一个子接口)进行了扩展,在BeanFactory的基础上添加了其他功能,比如与Spring的AOP更容易集成,也提供了处理message resource的机制(用于国际化)、事件传播以及应用层的特别配置,比如针对Web应用的WebApplicationContext。
org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具体实现,用来包装和管理前面提到的各种bean。BeanFactory接口是Spring IoC 容器的核心接口。
5、BeanFactory和ApplicationContext有什么区别?
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能,包括提供了支持国际化的文本消息、统一的资源文件读取方式、已在监听器中注册的bean的事件
6、ApplicationContext有几种实现方式?
以下是三种较常见的 ApplicationContext 实现方式:
A、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。
B、FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。
C、XmlWebApplicationContext:由Web应用的XML文件读取上下文。
7、Spring有几种配置方式?
将Spring配置到应用开发中有以下三种方式:基于XML的配置、基于注解的配置、基于Java的配置
8、如何用基于Java配置的方式配置Spring?
Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的作用与<bean/> 元素类似。被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以通过在同一个类的内部调用@bean方法来设置嵌入bean的依赖关系。
9、请解释Spring Bean的生命周期?
Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。
Spring框架提供了以下四种方式来管理bean的生命周期事件:
InitializingBean和DisposableBean回调接口
针对特殊行为的其他Aware接口
Bean配置文件中的Custom init()方法和destroy()方法
@PostConstruct和@PreDestroy注解方式
10、Spring Bean的作用域之间有什么区别?
A、singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。
B、prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。
C、request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
D、Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
E、global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。
11、Spring框架中的单例Beans是线程安全的么?
Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。
12、请举例说明如何在Spring中注入一个Java Collection?
Spring提供了以下四种集合类的配置元素:
<list> : 该标签用来装配可重复的list值。
<set> : 该标签用来装配没有重复的set值。
<map>: 该标签可用来注入键和值可以为任何类型的键值对。
<props> : 该标签支持注入键和值都是字符串类型的键值对。
13、请解释Spring Bean的自动装配?
A、使用XML配置文件实现自动装配:
<bean id="employeeDAO" class="com.scme.EmployeeDAOImpl" autowire="byName" />
B、使用@Autowired注解来自动装配指定的bean。
在使用@Autowired注解之前需要在按照如下的配置方式在Spring配置文件进行配置才可以使用。
<context:annotation-config />
也可以通过在配置文件中配置AutowiredAnnotationBeanPostProcessor 达到相同的效果。
<bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
配置好以后就可以使用@Autowired来标注了。
@Autowired
public EmployeeDAOImpl ( EmployeeManager manager ) {
this.manager = manager;
}
14、请解释自动装配模式的区别?
A、no:这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。
B、byName:该选项可以根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
C、byType:该选项可以根据bean类型设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
D、constructor:造器的自动装配和byType模式类似,但是仅仅适用于与有构造器相同参数的bean,如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
E、autodetect:该模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。
15、Spring 框架中都用到了哪些设计模式?
代理模式—在AOP和remoting中被用的比较多。
单例模式—在spring配置文件中定义的bean默认为单例模式。
模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
前端控制器—Spring提供了DispatcherServlet来对请求进行分发。
视图帮助(View Helper )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。
依赖注入—贯穿于BeanFactory / ApplicationContext接口的核心理念。
工厂模式—BeanFactory用来创建对象的实例。
16、@Required 注解
@Required表明bean的属性必须在配置时设置,可以在bean的定义中明确指定也可通过自动装配设置。如果bean的属性未设置,则抛出BeanInitializationException异常。
17、@Autowired 注解
@Autowired 注解提供更加精细的控制,包括自动装配在何处完成以及如何完成。它可以像@Required一样自动装配setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。
18、@Qualifier 注解
当有多个相同类型的bean而只有其中的一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用消除这种混淆,指明需要装配的bean。
19、Spring支持的事务管理类型
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。
20、Spring框架的事务管理有哪些优点?
为不同的事务API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了统一的编程模型。
为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA).
支持声明式事务管理。
可以和Spring 的多种数据访问技术很好的融合。
21、解释AOP
面向切面编程,或AOP允许程序员模块化横向业务逻辑,或定义核心部分的功能,例如日志管理和事务管理。
22、切面(Aspect)
AOP的核心就是切面,它将多个类的通用行为封装为可重用的模块。该模块含有一组API提供 cross-cutting功能。例如,日志模块称为日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。
23、连接点(Join point)
连接点代表应用程序中插入AOP切面的地点。它实际上是Spring AOP框架在应用程序中执行动作的地点。
24、通知(Advice)
通知表示在方法执行前后需要执行的动作。实际上它是Spring AOP框架在程序执行过程中触发的一些代码。
Spring切面可以执行一下五种类型的通知:
before(前置通知):在一个方法之前执行的通知。
after(最终通知):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
after-returning(后置通知):在某连接点正常完成后执行的通知。
after-throwing(异常通知):在方法抛出异常退出时执行的通知。
around(环绕通知):在方法调用前后触发的通知。
25、切入点(Pointcut)
切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。
26、有几种不同类型的自动代理?
BeanNameAutoProxyCreator:bean名称自动代理创建器
DefaultAdvisorAutoProxyCreator:默认通知者自动代理创建器
Metadata autoproxying:元数据自动代理
27、什么是Spring的MVC框架?
Spring提供了一个功能齐全的MVC框架用于构建Web应用程序。Spring框架可以很容易的和其他的MVC框架融合(如Struts),该框架使用控制反转(IOC)将控制器逻辑和业务对象分离开来。它也允许以声明的方式绑定请求参数到业务对象上。
28、DispatcherServlet
Spring的MVC框架围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应
29、WebApplicationContext
WebApplicationContext继承了ApplicationContext,并添加了一些web应用程序需要的功能。和普通的ApplicationContext 不同,WebApplicationContext可以用来处理主题样式,它也知道如何找到相应的servlet。
30、什么是Spring MVC框架的控制器?
控制器提供对应用程序行为的访问,通常通过服务接口实现。控制器解析用户的输入,并将其转换为一个由视图呈现给用户的模型。Spring 通过一种极其抽象的方式实现控制器,它允许用户创建多种类型的控制器。
31、@Controller annotation
@Controller注解表示该类扮演控制器的角色。Spring不需要继承任何控制器基类或应用Servlet API。
32、@RequestMapping annotation
@RequestMapping注解用于将URL映射到任何一个类或者一个特定的处理方法上。
33、简单的谈一下SpringMVC的工作流程?
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet调用HandlerAdapter处理器适配器
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
34、如何解决POST请求中文乱码问题,GET的又如何处理呢?
在web.xml中配置org.springframework.web.filter.CharacterEncodingFilter过滤器可以解决POST请求中文乱码问题;对已GET请求产生的中文乱码可以对请求参数重新编码的方式处理,例如:String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8");
35、SpringMVC与Struts2的主要区别?
①springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
②springmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
③Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request对象内容进行解析成方法形参,将响应数据和页面封装成ModelAndView对象,最后又将模型数据通过request对象传输到页面。 Jsp视图解析器默认使用jstl。
四、MyBatis框架面试题
1、JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
① 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
② Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
③ 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决: Mybatis自动将java对象映射至sql语句。
④ 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。
2、MyBatis编程步骤是什么样的?
① 创建SqlSessionFactory
② 通过SqlSessionFactory创建SqlSession
③ 通过sqlsession执行数据库操作
④ 调用session.commit()提交事务
⑤ 调用session.close()关闭会话
3、使用MyBatis的mapper接口调用时有哪些要求?
① Mapper接口方法名和mapper.xml中定义的每个sql的id相同
② Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
③ Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
④ Mapper.xml文件中的namespace即是mapper接口的类路径。
4、SqlMapConfig.xml中配置有哪些内容?
properties(属性)、settings(配置)、typeAliases(类型别名)、typeHandlers(类型处理器)、objectFactory(对象工厂)、
plugins(插件)、environments(环境集合属性对象)、environment(环境子属性对象)、transactionManager(事务管理)、
dataSource(数据源)、mappers(映射器)
5、简单的说一下MyBatis的一级缓存和二级缓存?
Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。
6、Mybatis比IBatis比较大的几个改进是什么?
a.有接口绑定,包括注解绑定sql和xml绑定Sql ,
b.动态sql由原来的节点配置变成OGNL表达式,
c. 在一对一,一对多的时候引进了association,在一对多的时候引入了collection节点,不过都是在resultMap里面配置
7、什么是MyBatis的接口绑定,有什么好处?
接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置
8、接口绑定有几种实现方式,分别是怎么实现的?
接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select@Update等注解里面包含Sql语句来绑定,另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名
9、什么情况下用注解绑定,什么情况下用xml绑定?
当Sql语句比较简单时候,用注解绑定,当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多
10、MyBatis实现一对一有几种方式?具体怎么操作的?
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置association节点配置一对一的类就可以完成;
嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置
11、MyBatis里面的动态Sql是怎么设定的?用什么语法?
MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where,trim节点,where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉
12、IBatis和MyBatis在核心处理类分别叫什么?
IBatis里面的核心处理类交SqlMapClient, MyBatis里面的核心处理类叫做SqlSession
13、#{}和${}的区别是什么?
${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换。#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值。
14、Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
15、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。
16、Mybatis都有哪些Executor执行器?它们之间的区别是什么?
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。
17、Mybatis中如何指定使用哪一种Executor执行器?
在Mybatis配置文件中,可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。
五、Struts2面试题(扩展)
1、Struts2的核心是什么,体现了什么思想?
Struts2的核心是拦截器,基本上核心功能都是由拦截器完成,拦截器的实现体现了AOP(面向切面编程)思想
2、模型驱动与属性驱动是什么 模型驱动使用时注意什么问题?
模型驱动与属性驱动都是用来封装数据的。
1.模型驱动:在实现类中实现ModelDriven<T>接口使用泛型把属性类封装起来,重写getModel()方法,然后在实现类里创建一个属性类的实例,通过这个实例拿到封装进来的值,拿返回值的时候使用工具进行值拷贝。
2.属性驱动:在实现类里定义属性,生成get与set方法,通过属性来拿值。
注意:模型驱动使用时注意的是在使用前先把属性类实例化,否则会出现空指针错误,拿返回对象的值需要用拷贝内存因为地址发生改变。
3、Struts2是怎样进行值封装的?
struts2的值封装实际上是采用了ognl表达式.struts2的拦截器经过模型驱动时会先判断action是否实现了ModelDriven,如果是则拿到模型的实例放在了栈的顶部,到属性驱动的时候会从栈里面把栈顶的实例给取出来,从页面传进来的值放在一个map集合当中,
通过map集合进行迭代会通过ognl技术把值封装到实例中。
4、Strust2如何访问Servlet API?
1:通过ActionContext可以获得request,application,session三个作用域(struts2实际上是通过适配器来把servlet的api转换为一个map,
并把这些map放在ActionContext里面)。
2:通过ActionContext的子类ServletActionContext去获取原滋原味的API。
3:可以通过实现ServletRequestAware接口,重写里面的setServletRequest方法可以获得request,实际上是通过set的依赖注入。
5、什么是拦截器 说说Struts2用拦截器来干什么 说出6个拦截器来?
在访问类的某个方法或者属性之前执行,拦截的是Action的请求,进行拦截然后在方法的执行前或者之后加入某些操作。
国际化,表单重复提交,类型转换,自动装配,数据封装,异常处理,模型驱动,请求参数,处理类型转换错误,日志拦截器
6、struts2的请求处理流程?
1.客户端发送请求。
2.经过一系列的过滤器(如:ActionContextCleanUp、SiteMesh等)到达核心控制器(FilterDispatcher)。
3.核心控制器通过ActionMapper决定调用哪个Action,如果不是调用Action就直接跳转到jsp页面。
4.如果ActionMapper决定调用了某个Action,核心控制器就把请求的处理交给一个代理类(ActionProxy)。
5.代理类通过配置管理器(Configuration Manager)找到配置文件(struts.xml)找到需要调用的Action类。
6.代理类还要创建一个Action的调度器(ActionInvocation)。
7.由调度器去调用Action,当然这里还涉及到一些相关的拦截器的调用。
8.Action执行完后,这个调度器还会创建一个Result返回结果集,返回结果前还可以做一些操作(结果集前的监听器)。
7、Struts2有哪些优点?
实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现。有丰富的tag可以用,大大提高了开发效率。
8、拦截器和过滤器的区别?
1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
六、Hibernate面试题(扩展)
1、hibernate的三种状态之间如何转换?
当对象由瞬时状态(Transient)一save()时,就变成了持久化状态;
当我们在Session里存储对象的时候,实际是在Session的Map里存了一份, 也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(Persistent)。 Session 一 Close()了,它的缓存也都关闭了,整个Session也就失效了,这个时候,这个对象变成了游离状态(Detached),但数据库中还是存在的。
当游离状态(Detached)update()时,又变为了持久状态(Persistent)。
当持久状态(Persistent)delete()时,又变为了瞬时状态(Transient), 此时,数据库中没有与之对应的记录。
2、update和saveOrUpdate的区别?
update()和saveOrUpdate()是用来对跨Session的PO进行状态管理的。
update()方法操作的对象必须是持久化了的对象。也就是说,如果此对象在数据库中不存在的话,就不能使用update()方法。
saveOrUpdate()方法操作的对象既可以使持久化了的,也可以使没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会 更新数据库中的对象;如果是未持久化的对象使用此方法,则save到数据库中。
3、Hibernate工作原理?
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
4、为什么要使用hibernate?
.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
.hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
5、Hibernate缓存机制?
A:hibernate一级缓存
(1)hibernate支持两个级别的缓存,默认只支持一级缓存;
(2)每个Session内部自带一个一级缓存;
(3)某个Session被关闭时,其对应的一级缓存自动清除;
B:hibernate二级缓存
(1) 二级缓存独立于session,默认不开启;
6、get和load区别?
1)get如果没有找到会返回null, load如果没有找到会抛出异常。
2)get会先查一级缓存, 再查二级缓存,然后查数据库;load会先查一级缓存,如果没有找到,就创建代理对象, 等需要的时候去查询二级缓存和数据库。
7、Hibernate的查询方式有哪些?
本地SQL查询、Criteria、Hql、OID检索
七、JS&JQuery面试题(扩展)
1、 jquery中的选择器吗,请讲一下有哪些选择器?
jQuery中的选择器大致分为:基本选择器,层次选择器,过滤选择器,表单选择器
2、 jquery中的选择器 和 css中的选择器有区别吗?
jQuery选择器支持CSS里的选择器,jQuery选择器可用来添加样式和添加相应的行为CSS 中的选择器是只能添加相应的样式
3、你觉得jquery中的选择器有什么优势?
简单的写法 $('ID') 来代替 document.getElementById()函数,支持CSS1 到CSS3 选择器完善的处理机制(就算写错了id也不会报错)
4 你在使用选择器的时候有有没有什么觉得要注意的地方?
1 选择器中含有".","#","[" 等特殊字符的时候需要进行转译
2 属性选择器的引号问题
3 选择器中含有空格的注意事项
5 jquery对象和dom对象是怎样转换的?
jquery转DOM对象:jQuery 对象是一个数组对象,可以通过[index]的丰富得到相应的DOM对象还可以通过get[index]去得到相应的DOM对象。DOM对象转jQuery对象:$(DOM对象)
6 你是如何使用jquery中的ajax的?
如果是一些常规的ajax程序的话,使用load(),$.get(),$.post(),就可以搞定了,一般我会使用的是$.post() 方法。如果需要设定beforeSend(提交前回调函数),error(失败后处理),success(成功后处理)及complete(请求完成后处理)回调函数等,这个时候我会使用$.ajax()
7 你觉得jquery中的ajax好用吗,为什么?
好用的。 因为jQuery提供了一些日常开发中需要的快捷操作,例 load,ajax,get,post等等,所以使用jQuery开发ajax将变得极其简单,我们就可以集中精力在业务和用户的体验上,不需要去理会那些繁琐的XMLHttpRequest对象了。
8 jquery中$.get()提交和$.post()提交有区别吗?
1 $.get() 方法使用GET方法来进行异步请求的。$.post() 方法使用POST方法来进行异步请求的。
2 get请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器的,这种传递是对用户不可见的。
3 get方式传输的数据大小不能超过2KB 而POST要大的多
4 GET 方式请求的数据会被浏览器缓存起来,因此有安全问题。
9 jquery中的load方法一般怎么用的?
load方法一般在 载入远程HTML 代码并插入到DOM中的时候用,通常用来从Web服务器上获取静态的数据文件。如果要传递参数的话,可以使用$.get() 或 $.post()。
10 在jquery中你是如何去操作样式的?
答: addClass() 来追加样式 ,removeClass() 来删除样式,toggle() 来切换样式
11 你使用过jquery中的动画吗,是怎样用的?
使用过。hide() 和 show() 同时修改多个样式属性。像高度,宽度,不透明度。 fadeIn() 和fadeOut() fadeTo() 只改变不透明度。slideUp() 和 slideDown() slideToggle() 只改变高度。animate() 属于自定义动画的方法.
13 你一般用什么去提交数据,为什么?
一般我会使用的是$.post() 方法。如果需要设定beforeSend(提交前回调函数),error(失败后处理),success(成功后处理及complete(请求完成后处理)回调函数等,这个时候我会使用$.ajax()
14 你在jquery中使用过哪些插入节点的方法,它们的区别是什么?
append(),appendTo(),prepend(),prependTo(),after(),insertAfter(),before(),insertBefore() 大致可以分为 内部追加和外部追加append() 表式向每个元素内部追加内容。appendTo()表示 讲所有的元素追加到指定的元素中。例$(A)appendTo(B) 是将A追加到B中下面的方法解释类似。
15 你使用过包裹节点的方法吗,包裹节点有方法有什么好处?
wrapAll(),wrap(), wrapInner() 需要在文档中插入额外的结构化标记的时候可以使用这些包裹的方法应为它不会帛画原始文档的语义
16 jquery中如何来获取或和设置属性?
jQuery中可以用attr()方法来获取和设置元素属性removeAttr() 方法来删除元素属性
17 如何来设置和获取HTML 和文本的值?
html()方法 类似于innerHTML属性 可以用来读取或者设置某个元素中的HTML内容
注意:html() 可以用于xhtml文档 不能用于xml文档text() 类似于innerText属性 可以用来读取或设置某个元素中文本内容。val() 可以用来设置和获取元素的值
18 你jquery中有哪些方法可以遍历节点?
children() 取得匹配元素的子元素集合,只考虑子元素不考虑后代元素 next() 取得匹配元素后面紧邻的同辈元素。prev() 取得匹配元素前面紧邻的同辈元素。siblings() 取得匹配元素前后的所有同辈元素。closest() 取得最近的匹配元素。find() 取得匹配元素中的元素集合 包括子代和后代
19子元素选择器 和后代选择器元素有什么区别?
子代元素是找子节点下的所有元素,后代元素是找子节点或子节点的子节点中的元素20 在jquery中可以替换节点吗?
可以在jQuery中有两者替换节点的方式 replaceWith() 和 replaceAll()
21你觉得beforeSend方法有什么用?
发送请求前可以修改XMLHttpRequest对象的函数,在beforeSend中如果返回false 可以取消本次的Ajax请求。XMLHttpRequest对象是唯一的参数所以在这个方法里可以做验证
22 siblings() 方法 和 $('prev~div')选择器是一样的嘛?
$('prev~div') 只能选择'#prev'元素后面的同辈<div>元素而siblings()方法与前后的文职无关,只要是同辈节点就都能匹配。
23 有哪些查询节点的选择器?
:first 查询第一个,:last 查询最后一个,:odd查询奇数但是索引从0开始:even 查询偶数,:eq(index)查询相等的 ,:gt(index)查询大于index的 ,:lt查询小于index:header 选取所有的标题等
24 nextAll() 能 替代$('prev~siblindgs')选择器吗?
能。 使用nextAll() 和使用$('prev~siblindgs') 是一样的
25 jQuery中有几种方法可以来设置和获取样式
addClass() 方法,attr() 方法
26 $(document).ready()方法和window.onload有什么区别?
两个方法有相似的功能,但是在实行时机方面是有区别的。 window.onload方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行的。 $(document).ready() 方法可以在DOM载入就绪时就对其进行操纵,并调用执行绑定的函数。
27 jQuery是如何处理缓存的?
要处理缓存就是禁用缓存.
1 通过$.post() 方法来获取数据,那么默认就是禁用缓存的。
2 通过$.get()方法 来获取数据,可以通过设置时间戳来避免缓存。可以在URL后面加上+(+new Date)例 $.get('ajax.xml?'+(+new Date),function () { //内容 });
3 通过$.ajax 方法来获取数据,只要设置cache:false即可。
28 $.getScript()方法 和 $.getJson() 方法有什么区别?
1 $.getScript() 方法可以直接加载.js文件,并且不需要对javascript文件进行处理,javascript文件会自动执行。
2 $.getJson() 是用于加载JSON 文件的 ,用法和$.getScript()
29 $("#msg").text(); 和 $("#msg").text("<b>new content</b>");有什么区别?
1 $("#msg").text() 是 返回id为msg的元素节点的文本内容
2 $("#msg").text("<b>new content</b>"); 是 将“<b>new content</b>” 作为普通文本串写入id为msg的元素节点内容中, 页面显示粗体的<b>new content</b>
30 radio单选组的第二个元素为当前选中值,该怎么去取?
$('input[name=items]').get(1).checked = true;
31 选择器中 id,class有什么区别?
在网页中 每个id名称只能用一次,class可以允许重复使用
32 你使用过哪些数据格式,它们各有什么特点?
HTML格式 ,JSON格式,javascript格式,XML格式
1 HTML片段提供外部数据一般来说是最简单的。
2 如果数据需要重用,而且其他应用程序也可能一次受到影响,那么在性能和文件大小方面具有优势的JSON通常是不错的选择。
3 而当远程应用程序未知时,XML则能够为良好的互操作性提供最可靠的保证。
33 jQuery 能做什么?
1 获取页面的元素
2 修改页面的外观
3 改变页面大的内容
4 响应用户的页面操作
5 为页面添加动态效果
6 无需刷新页面,即可以从服务器获取信息
7 简化常见的javascript任务
34 在ajax中data主要有几种方式?
三种,html拼接的,json数组,form表单经serialize()序列化的。
35 :jQuery中的hover()和toggle()有什么区别?
hover()和toggle()都是jQuery中两个合成事件。
hover()方法用于模拟光标悬停事件。 toggle()方法是连续点击事件。
36 你知道jQuery中的事件冒泡吗,它是怎么执行的,何如来停止冒泡事件?
知道,事件冒泡是从里面的往外面开始触发。在jQuery中提供了stopPropagation()方法可以停止冒泡。
37 例如 单击超链接后会自动跳转,单击"提交"按钮后表单会提交等,有时候我想阻止这些默认的行为,该怎么办?
可以用 event.preventDefault()或在事件处理函数中返回false,即 return false;
38.在jquery中你有没有编写过插件,插件有什么好处?你编写过那些插件?它应该注意那些?
插件的好处:对已有的一系列方法或函数的封装,以便在其他地方重新利用,方便后期维护和提高开发效率插件的分类:封装对象方法插件 、封装全局函数插件、选择器插件
注意的地方:
1.插件的文件名推荐命名为jquery.[插件名].js,以免和其他的javaScript库插件混淆
2.所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上
3.插件应该返回一个jQuery对象,以保证插件的可链式操作
4.避免在插件内部使用$作为jQuery对象的别名,而应使用完整的jQuery来表示,这样可以避免冲突或使用闭包来避免
5.所有的方法或函数插件,都应当一分好结尾,否则压缩的时候可能出现问题。在插件头部加上分号,这样可以避免他人的不规范代码给插件带来影响
6.在插件中通过$.extent({})封装全局函数,选择器插件,扩展已有的object对象通过$.fn.extend({})封装对象方法插件
39. jQuery 库中的 $() 是什么?
$() 函数是 jQuery() 函数的别称。$() 函数用于将任何对象包裹成 jQuery 对象,接着就被允许调用定义在 jQuery 对象上的多个不同方法。甚至可以将一个选择器字符串传入 $() 函数,它会返回一个包含所有匹配的 DOM 元素数组的 jQuery 对象。
40. 网页上有 5 个 <div> 元素,如何使用 jQuery来选择它们?
另一个重要的 jQuery 问题是基于选择器的。jQuery 支持不同类型的选择器,例如 ID 选择器、class 选择器、标签选择器。鉴于这个问题没提到 ID 和 class,你可以用标签选择器来选择所有的 div 元素。jQuery 代码:$("div"),这样会返回一个包含所有 5 个 div 标签的 jQuery 对象。更详细的解答参见上面链接的文章。
41. jQuery 里的 ID 选择器和 class 选择器有何不同?
ID 选择器使用 ID 来选择元素,比如 #element1,而 class 选择器使用 CSS class 来选择元素。当你只需要选择一个元素时,使用 ID 选择器,而如果你想要选择一组具有相同 CSS class 的元素,就要用 class 选择器。
42. 如何在点击一个按钮时使用 jQuery 隐藏一个图片?
jQuery对象.hide()。
43. $(document).ready() 是个什么函数?为什么要用它?
ready() 函数用于在文档进入ready状态时执行代码。当DOM 完全加载(例如HTML被完全解析DOM树构建完成时),jQuery允许你执行代码。使用$(document).ready()的最大好处在于它适用于所有浏览器,jQuery帮你解决了跨浏览器的难题。
44. JavaScript window.onload 事件和 jQuery ready 函数有何不同?
JavaScript window.onload 事件和 jQuery ready 函数之间的主要区别是,前者除了要等待 DOM 被创建还要等到包括大型图片、音频、视频在内的所有外部资源都完全加载。如果加载图片和媒体内容花费了大量时间,用户就会感受到定义在 window.onload 事件上的代码在执行时有明显的延迟。
另一方面,jQuery ready() 函数只需对 DOM 树的等待,而无需对图像或外部资源加载的等待,从而执行起来更快。使用 jQuery $(document).ready() 的另一个优势是你可以在网页里多次使用它,浏览器会按它们在 HTML 页面里出现的顺序执行它们,相反对于 onload 技术而言,只能在单一函数里使用。鉴于这个好处,用 jQuery ready() 函数比用 JavaScript window.onload 事件要更好些。
45. 如何找到所有 HTML select 标签的选中项?
使用了属性选择器/表单选择器和表单过滤选择器来实现,先通过属性选择器或者表单选择器获取所有的select标签,再通过表单过滤选择器筛选出选中项
46. jQuery 里的 each() 是什么函数?你是如何使用它的?
each() 函数允许你遍历一个元素集合。你可以传一个函数给 each() 方法,被调用的 jQuery 对象会在其每个元素上执行传入的函数
47. 你是如何将一个 HTML 元素添加到 DOM 树中的?
可以用 jQuery 方法 appendTo() 将一个 HTML 元素添加到 DOM 树中。这是 jQuery 提供的众多操控 DOM 的方法中的一个。你可以通过 appendTo() 方法在指定的 DOM 元素末尾添加一个现存的元素或者一个新的 HTML 元素。
48. $(this) 和 this 关键字在 jQuery 中有何不同?
$(this) 返回一个 jQuery 对象,你可以对它调用多个 jQuery 方法,比如用 text() 获取文本,用val() 获取值等等。而 this 代表当前元素,它是 JavaScript 关键词中的一个,表示上下文中的当前 DOM 元素。你不能对它调用 jQuery 方法,直到它被 $() 函数包裹,例如 $(this)。
49. 你如何使用jQuery来提取一个HTML 标记的属性 例如. 链接的href?
可以使用attr() 方法来获取任意一个HTML元素的一个属性的值.jQuery对象.attr(“属性名”);
50. 你如何使用jQuery设置一个属性值?
attr()既可以用来获取html元素的属性值,也可以用来设置属性值。 只需要在调用attr()的同时带上一个值 例如jQuery对象. attr(name, value), 这里name是属性的名称,value是属性的新值。
51. jQuery中 detach() 和 remove() 方法的区别是什么?
detach() 会保持对过去被解除元素的跟踪, 因此它可以被取消解除, 而 remove() 方法则会保持过去被移除对象的引用.
52. 你如何利用jQuery来向一个元素中添加和移除CSS类?
通过利用 addClass() 和 removeClass() 这两个 jQuery 方法
53. 使用 CDN 加载 jQuery 库的主要优势是什么 ?
除了报错节省服务器带宽以及更快的下载速度这许多的好处之外, 最重要的是,如果浏览器已经从同一个CDN下载类相同的 jQuery 版本, 那么它就不会再去下载它一次.
54. jQuery.get() 和 jQuery.ajax() 方法之间的区别是什么?
ajax() 方法更强大,更具可配置性, 让你可以指定等待多久,以及如何处理错误。get() 方法是一个只获取一些数据的专门化方法。
55. jQuery 中的方法链是什么?使用方法链有什么好处?
方法链是对一个方法返回的结果调用另一个方法,这使得代码简洁明了,同时由于只对 DOM 进行了一轮查找,性能方面更加出色。
56. 你要是在一个 jQuery 事件处理程序里返回了 false 会怎样?
这通常用于阻止事件向上冒泡。
57. 哪种方式更高效:document.getElementbyId("myId") 还是 $("#myId")?
第一种,因为它直接调用了 JavaScript 引擎。
八、AJAX面试题(扩展)
1、什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识)?
AJAX是“Asynchronous JavaScript and XML”的缩写。他是指一种创建交互式网页应用的网页开发技术。
Ajax包含下列技术:
基于web标准(standards-basedpresentation)XHTML+CSS的表示;
使用 DOM(Document ObjectModel)进行动态显示及交互;
使用 XML 和 XSLT 进行数据交换及相关操作;
使用 XMLHttpRequest 进行异步数据查询、检索;
使用 JavaScript 将所有的东西绑定在一起。
2、为什么要用Ajax?
Ajax应用程序的优势在于:
1. 通过异步模式,提升了用户体验
2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大量用户下的服务器负载。
3、AJAX最大的特点是什么?
Ajax可以实现动态不刷新(局部刷新)就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
4、请介绍一下XMLhttprequest对象。
Ajax的核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。通过XMLHttpRequest对象,Web开发人员可以在页面加载以后进行页面的局部更新。
5、AJAX技术体系的组成部分有哪些。
HTML,css,dom,xml,xmlHttpRequest,javascript
6、AJAX应用和传统Web应用有什么不同。
在传统的Javascript编程中,如果想得到服务器端数据库或文件上的信息,或者发送客户端信息到服务器,需要建立一个HTML form然后GET或者POST数据到服务器端。用户需要点击”Submit”按钮来发送或者接受数据信息,然后等待服务器响应请求,页面重新加载。因为服务器每次都会返回一个新的页面, 所以传统的web应用有可能很慢而且用户交互不友好。使用AJAX技术, 就可以使Javascript通过XMLHttpRequest对象直接与服务器进行交互。通过HTTP Request, 一个web页面可以发送一个请求到web服务器并且接受web服务器返回的信息(不用重新加载页面),展示给用户的还是通一个页面,用户感觉页面刷新,也看不到到Javascript后台进行的发送请求和接受响应。
7、AJAX请求总共有多少种CALLBACK。
Ajax请求总共有八种Callback
onSuccess
onFailure
onUninitialized
onLoading
onLoaded
onInteractive
onComplete
onException
8、在浏览器端如何得到服务器端响应的XML数据。
XMLHttpRequest对象的responseXMl属性
9、 XMLHttpRequest对象在IE和Firefox中创建方式有没有不同。
有,IE中通过new ActiveXObject()得到,Firefox中通过newXMLHttpRequest()得到
10、介绍一下XMLHttpRequest对象的常用方法和属性。
open(“method”,”URL”) 建立对服务器的调用,第一个参数是HTTP请求 方式可以为GET,POST或任何服务器所支持的您想调用的方式。
第二个参数是请求页面的URL。
send()方法,发送具体请求
abort()方法,停止当前请求
readyState属性 请求的状态 有5个可取值0=未初始化 ,1=正在加载
2=以加载,3=交互中,4=完成
responseText 属性 服务器的响应,表示为一个串
reponseXML 属性 服务器的响应,表示为XML
status 服务器的HTTP状态码,200对应ok 400对应not found
11、什么是XML ?
XML是扩展标记语言,能够用一系列简单的标记描述数据
12、XML的解析方式?
常用的用dom解析和sax解析。dom解析是一次性读取xml文件并将其构造为DOM对象供程序使用,优点是操作方便,但是比较耗内存。Sax是按事件驱动的方式解析的,占用内存少,但是编程复杂
13、AJAX的全称是什么? 介绍一下AJAX?
AJAX的全称是Asynchronous JavaScript And XML,AJAX是2005年由Google发起并流行起来的编程方法, AJAX不是一个新的编程语言,但是它是一个使用已有标准的新的编程技术。使用AJAX可以创建更好,更快,更用户界面友好的Web应用。AJAX技术基于Javascript和HTTP Request.
14、AJAX都有哪些优点和缺点?
优点:
1、最大的一点是页面无刷新,用户的体验非常好。
2、使用异步方式与服务器通信,具有更加迅速的响应能力。
3、可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,ajax的原则是“按需取数据”,可以最大程度的减少冗余请求,和响应对服务器造成的负担。
4、基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。
缺点:
1、ajax不支持浏览器back按钮。
2、安全问题 AJAX暴露了与服务器交互的细节。
3、对搜索引擎的支持比较弱。
4、破坏了程序的异常机制。
5、不容易调试。