现在的位置: 首页 > 综合 > 正文

SSH面试常被问到的问题

2012年08月19日 ⁄ 综合 ⁄ 共 7685字 ⁄ 字号 评论关闭

我是一名大三的学生,最近也经常在51job上投简历,在这里整理一下SSH面试可能被问到的问题(当然不是我自己被问到过,我还没面过试呢,~~~~(>_<)~~~~ ,是整理自CSDN一位博友的笔记),也希望自己能很快找到一份java web开发的实习工作,同时希望能帮助到也正在面试的童鞋们,O(∩_∩)O哈哈~。

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工作原理
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代码测试方便。

 

Spring工作原理

(一)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中已经配置,最好给用户响应。

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的缺点 缺点是加重浏览器负担,当网速慢时,容易浏览器死

 

抱歉!评论已关闭.