面试题目总结
SSH
回忆当初面试,SSH方面的,被问到很多相同的问题,随之,就将这些面试题总结出来,给即将面试的童鞋一些小小总结,没办反,现在SSH依然这么火。 大家都是被逼的!
Struts1工作原理
Struts1工作原理图
1、初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动 时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象。(面向对象思想)
2、发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。
3、form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。
4、派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。
5、处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象。服务器通过ActionForward对象进行转发工作。
6、返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。
7、查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp页面。
8、响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。 Struts1优缺点(为什么要用strust1)
1.优点:
①开源的框架,结构清晰
②是MVC的经典实现(MVC是一种思想,而不是一种技术)
③处理异常机制,实现国际化
④具有强大的标签库
⑤解决了JSP页面存在大量的JAVA代码,维护起来方便
⑥在formBean中会自动提交,不会去使用传统的get、set方法得到值、取值
2.缺点:
①配置复杂
②测试不方便
③依赖web容器
④action是一个单例模式,必须设置为线程安全
Struts2工作原理
struts2工作原理图
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是, 也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标 签。在这个过程中需要涉及到ActionMapper
在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的
Struts2优缺点(即为什么要用struts2)
Struts2就会自动的进行验证。还有很多,比如国际化资源文件等。
Struts2的开发中来,如果你重来没有用过任何框架,你也可以通过快速的学习,加入到Struts2的应用开发中来,因为它足够的简单。
大量的拦截器:
Struts2本身提供了大量的可重用的拦截器,比如类型转换拦截器,很多时候我们从页面取得参数,这个时候它是String类型的,我们需要手动。
基于插件的框架:
Struts2是一个基于插件的框架,社区中提供了很多实用的插件,比如jfreechat/json等等,使用这些插件可以简化我们的开发,加快开发进度。
struts2最大的缺点莫过于在好多web服务器上支持不好,例如在websphere5.5,weblogic8.1及以前版本支持非常查,需要用最新的。
多种视图的支持:
多种视图的支持:jsp,freemarker,Veloctiy,只要你愿意,你甚至可以通过轻松的改造让它支持pdf,同一个项目中你可以支持多种视图。
更加的模块化:
与Struts1.X 相比,Struts2更加的模块化,可以轻松将配置信息按功能界限拆分成多个文件,便于管理和团队协作开发。
与Spring的集成:
与Struts1.x相比,Struts2不必再自己编写singleton,进一步的降低了程序间的耦合性,就Struts2内部本身而言,降低了框架本身的偶合性。
基于pojo易于测试:
在Struts1.x中我需要Mock出这两个Http对象,使我们很难编写Action的单元测试,与Struts1.x相比,Struts2的Action 不再依赖于
HttpServletRequest和HttpServletResponse对象,使我们能够更方便的针对Action编写单元测试。
Hibernate工作原理
1. 读取并解析配置文件
2. 读取并解析映射信息,创建SessionFactory
3. 打开Sesssion
4. 创建事务Transation
5. 持久化操作
6. 提交事务
7. 关闭Session
8. 关闭SesstionFactory
Hibernate优缺点
优点:
1: hibernate是基于ORMapping技术的开源的框架,对JDBC进行了轻量级的封装,使用面向对象的思维来操纵数据库。
2:hibernate提供了session缓存和二级缓存,对于不需要进行复杂查询的系统,性能有提升。
3:低侵入式设计
缺点:
1:hibernate学习成本太高。
2:不适合有复杂的sql查询(统计) 。
3:不适合大量的聚集操作,(存储过程)
优缺点补充:
1、 不需要编写的SQL语句(不需要编辑JDBC),只需要操作相应的对象就可以了,就可以能够存储、更新、删除、加载对象,可以提高生产效;
2、因为使用Hibernate只需要操作对象就可以了,所以我们的开发更对象化了;
3、使用Hibernate,移植性好(只要使用Hibernate标准开发,更换数据库时,只
需要配置相应的配置文件就可以了,不需要做其它任务的操作);
4、Hibernate实现了透明持久化:当保存一个对象时,这个对象不需要继承Hibernate中的任何类、实现任何接口,只是个纯粹的单纯对象—称为POJO对象(最纯粹的对象—这个对象没有继承第三方框架的任何类和实现它的任何接口)
5、Hibernate是一个没有侵入性的框架,没有侵入性的框架我们一般称为轻量级框架
6、Hibernate代码测试方便。
说下jsp下EL语言实现原理?
el是能够嵌入到jstl中的一种语言,jsp2.0以后支持直接在jsp页面中写el,他使直接在jsp页面嵌入java代码得到简化,
并且对java语言进行了封装,比如弱类型等机制,这些都借鉴了javascript等脚本语言
简单说下以下代码的实现原理(DriverManager是怎么获取到连接的?)
Class.forName("oracle.jdbc.driver.OracleDriver");
DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orci8","java","8888888");
Class.forName("oracle.jdbc.driver.OracleDriver");
相当于执行oracle.jdbc.driver.OracleDriver里面的静态代码部分
DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orci8","java","8888888");
copy个例子:
jdbc:oracle:thin:@192.168.3.98:1521:orcl
jdbc:表示采用jdbc方式连接数据库
oracle:表示连接的是oracle数据库
thin:表示连接时采用thin模式(oracle中有两中模式)
jdbc:oralce:thin:是一个jni方式的命名
@表示地址
1521和orcl表示端口和数据库名
@192.168.3.98:1521:orcl整个是一快
也就是说是这样[jdbc]:[oracle]:[thin]:[@192.168.3.98:1521:orcl]
每个 JDBC 驱动必须实现 java.sql.Driver 接口,而 Class.forName 会在类加载器中加载,此时
并不会产生 Driver 的对象,这种加载只会执行这个类中的静态块。而 JDBC 规范要求所有实现
java.sql.Driver 接口的类,必须在静态块中调用 DriverManager.registerDriver 方法把自己注
册到 DriverManager 中去。DriverManager 通过搜寻已注册的 Driver 实现类,调用 connect 方法
从而获得连接。当然了 connect 方法是在 Driver 接口中声明的,由具体的 JDBC Driver 类去实现。
这就是采用 Class.forName 方式获得连接的办法。
(一)spring
1.什么是spring
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是简化企业开发。s
2.什么是控制反转?
以一个例子来说明:
public class PersonServiceBean {
private PersonDao personDao = new PersonDaoBean();
public void save(Person person){
personDao.save(person);
}
}
PersonDaoBean是在应用内部创建及维护的。所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。
3.spring优点
1)降低组件之间的耦合度,实现软件各层之间的解耦。(通过控制反转)
2)可以使用容器提供的众多服务,如:事务管理服务,AOP
3)容器提供单例模式支持,开发人员不再需要自己编写实现代码。 4容器提供的众多辅作类,使用这些类能够加快应用的开发,
如: JdbcTemplate、 HibernateTemplate。
5)Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。
4.实例化spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext(new String[]{"bean.xml}");
5.bean的作用域
1)singleton(默认)
我 们得默认配置就是singleton,当然也可以通过scope属性去指定相应的作用域,sigleton作用域会在容器启动时初始化bean(可以通过 在构造函数中打印得出结论),当然我们也可以通过指定指定Bean节点的lazy-init="true" 来延迟初始化bean,这时候,只有第一次获 取bean才会初始化bean(当然不建议这样做)。在默认为singleton的情况下,我们获得的多个bean都是同一个(打印p1==p2为 true)。
2)prototype
每次从容器获取bean都是新的对象。只有在调用getBean方法的时候才会初始化bean,并且每次获得的bean都不一样。
6.DI
public class PersonServiceBean implements PersonService
private PersonDao personDao;
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
public void save(){
personDao.add(); }}
大致可以分为三种方式:1)构造器注入 2)set方法注入 3)注解方式注入
7.AOP
我觉得AOP技术主要会用于权限拦截,比方说我们要根据用户的权限判断用户能不能执行某一个方法,这里就会用到AOP
8.jdbctemplate与hibernatetemplate以及他们的事务管理
9.AOP实现原理——为目标对象创建代理对象。
(二)Hibernate
1.什么是hibernate
hibernate是一个开源的ORM框架,它对JDBC进行了非常轻量级的对象封装,通过它我们可以使用对象编程思维来操纵数据库。
2.hibernate与jdbc的区别
首 先先从他们俩的来历说起,由于java是一门面向对象的语言,而数据库采用的是关系模型,要在他们之间建立起关系,就必须解决模式不匹配的问题。有两种方 法:一是jdbc手工配置(setString(),getString());二是使用ORM框架,比方说hibernate。
1)jdbc使用效率高,但是在java代码中嵌入了过多的sql逻辑
2)hibernate使用效率没有jdbc高,但是使用它程序员可以用面向对象的思维来操作数据库
3)hibernate可以实现跨数据库平台,只需要改方言以及驱动等。
3.session接口
Save,get,load,update,delete,这些方法进行简单说明
4.query接口
List,uniqueResult,setString,setParameterList
5.POJO类
1)瞬时(与session没有关系,与数据库也没有关系)
2)持久(与session有关系,与数据库也有关系)
3)脱管(与session没有关系,与数据库有关系,一般主键都有值)
6.Hibernate的Generator属性
Identity,native,assigned,uuid
7.SessionFactory中两个方法的对比
1)open session每次都是新的,需要close。
2)getCurrentsession从上下文找,如果有,用旧的,如果没有,建新的。
8.mysql转义
select username from gg_user where username like '%xiao/_%' escape '/';
9.cascade and inverse
set中将inverse设置为true
10.缓存(一级缓存和二级缓存)
一 级缓存是session级别的缓存,二级缓存了?我经常用的二级缓存是ehcache,首先我们需要在hibernate的配置文件中配置二级缓存,引入 二级缓存对应的
jar文件,接下来配置ehcache.xml,然后为需要缓存的pojo类添加缓存配置(在其配置文件中)
11.懒加载
1)先说什么是懒加载以及其作用
2)Get和load方法
3)一对多和多对一中的懒加载
12.数据关联
(三)Struts2
1.stuts2概述
struts2是在webwork2基础发展而来的,他也属于MVC框架。他有以下优点:
1)struts2并没有像struts1那样跟servletAPI有着紧密的耦合,比方说struts2中的session,他是一个map,而不是我们经常用的httpsession
2)struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。
3)struts2提供了类型转换其,我们可以把特殊的请求参数转换成需要的类型。
4)struts2中提供了多种表现层技术,如jsp,velocity
5)struts2的输入校验可以对指定方法进行校验
6)在struts1中进行多次访问的时候用到的是同一个Action对象。而struts2则是每一次访问都会创建一个Action对象,所以struts2不会有线程安全问题的发生
2.struts2工作原理
首 先是加载web.xml配置文件,配置文件中设置过滤器,默认过滤所有的请求,如果用户的请求为以action结尾,他将会被转入struts2框架处 理。进入struts2框架,首先会经过一系列的拦截器(interceptor),他是struts2的核心,然后到action中,action会返 回一个结果,这个结果在result中已经配置,最好给用户响应。
3.类型转换
日期,arraylist等等
4.result的各种转发类型
dispatcher(默认),redirect,redirectAction,plainText
(四)Jsp and servlet
1.MVC
M是指javabean,负责数据的处理
V是指JSP,用于页面的呈现
C是指servlet,负责业务逻辑处理
能够画出示意图、
2.四个作用域对象
四个作用域对象分别有:pageContext,request,session,Application request:表示请求信息,对用的类型是
javax.servlet.http.HttpServletRequest
session:对应的类型是javax.servlet.http.HttpSession
application:表示整个应用的上下文,对应类型为
javax..servlet.jsp.ServletContext
3.重定向和请求转发的区别
1)浏览器地址栏
重定向后浏览器地址栏发生改变,而请求转发不改变,所以使用请求转发时应该注意刷新带来的重复提交问题。
2)请求次数与请求响应对象
重定向中有两次请求,而请求转发中只有一次请求。重定向中生成两组不同的请求响应对象,而请求转发过程只有一组,所以可以利用他来传request对象。
3)传值
重定向传值只能依靠地址后加?,而请求转发可以使用request对象的attribute方法。
4)路径参数
重定向中的路径参数为绝对路径。请求转发中的路径为相对路径。
4.b/s与c/s
B/S即Browser/Server结构,在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。 C/S即Client/Server结构,客户端需要安装专用的客户端软件。
5.http
浏览器要从web服务器上读取数据,需要有一个一问一答的过程。就像两个国家元首会晤过程得遵守一定的外交礼节,浏览器与服务器之间也得遵守一定的规则,这个规则就是HTTP协议。HTTP请求由三部分组成,分别是:请求行,消息报头,请求正文。
6.servlet生命周期
加 载类,实例化(运行构造函数),初始化(执行init方法),服务(service),销毁(destroy),可回收.注意:当我们配置文件中指定 load-on-startup 属性时,若他的值是一个大于等于0的整数,容器会在启动的时候加载这个servlet类并调用他的init方法。
7.AJAX应用与传统WEB应用有什么不同?
在 传统的web编程中,如果想得到服务器端数据或者想发送客户端数据到服务器,需要建立一个HTML form然后get或者post数据到服务器端。用户 需要点击“submit” 按钮来发送数据或者接受数据,然后等待服务器响应请求,页面重新加载。因为服务器每次都会返回一个新的页面,所以传统的web 应用很慢并且用户体验度不好。使用AJAX技术,就可以使javascript通过
XMLHttpRequest对象直接与服务器进行交互。通过 XmlHttpRequest对象,一个web页面可以发送请求到服务器并接受服务器端数据,用户感觉不到页面的刷新,已经得到了意想不到的效果。
8.Ajax的全称是什么?介绍下Ajax
Ajax 的全称是Asynchronous javascript and xml,Ajax技术可以使
javascript通过XMLHttpRequest对 象直接与服务器进行交互,通过
XMLHttpRequest对象,一个页面可将请求发送到服务器或者接受服务器端数据,用户感觉不到页面刷新,但是已经得 到意想不到的效果,比如新浪微博
9.介绍一下XMLHttpRequest对象
1)创建XMLHttpRequest对象(需要考虑不同的浏览器)
2)设置连接信息xml.open("GET","servlet",true);
3)注册回调函数
4)发送数据,开始和服务器进行交互
5)在回调函数中接受响应数据
10.说说Ajax的缺点
缺点是加重浏览器负担,当网速慢时,容易浏览器死掉
面试问AOP的原理
面向切面编程,把散落在程序中的公共部分提取出来,做成切面类,这样的好处在于,代码的可重用,一旦涉及到该功能的需求发生变化,只要修改该代码就行,否则,你要到处修改,如果只要修改1、2处那还可以接受,万一有1000处呢。 AOP底层的东西就是JDK动态代理和CGLIB代理,说白了就是增强类的功能。 最常用的AOP应用在数据库连接以及事务处理上。