当前位置: 代码迷 >> J2EE >> 小弟我们爱分享————J2EE常见面试题分享(夕水溪上版)
  详细解决方案

小弟我们爱分享————J2EE常见面试题分享(夕水溪上版)

热度:56   发布时间:2016-04-22 00:20:53.0
我们爱分享————J2EE常见面试题分享(夕水溪下版)
本帖最后由 xishuixixia 于 2011-09-22 11:00:33 编辑 首先说明一下,如果想要word版本的,请发邮件给我:greenyouyou@163.com或者上我的博客看:http://greenyouyou.blog.163.com/

下面开始分享:


(一)spring
1.什么是spring
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是简化企业开发。
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中已经配置,最好给用户响应。
  相关解决方案