【Jsp精品源码栏目提醒】:网学会员,鉴于大家对Jsp精品源码十分关注,论文会员在此为大家搜集整理了“企业面试题总结(SSH框架技术运用) - 软件工程”一文,供大家参考学习!
Struts1Struts2SpringHibernateiBatis一.Struts1.谈谈你 mvc 的理解 MVC 是 Model—View—Controler 的简称。
即模型—视图—控制器。
MVC 是一种
设计模式,它强制性的把应用程序的输入、处理和输出分开。
MVC 中的模型、视图、控制器它们分别担负着不同的任务。
视图: 视图是用户看到并与之交互的界面。
视图向用户显示相关的数据,并接受用户的输入。
视图不进行任何业务逻辑处理。
模型: 模型表示业务数据和业务处理。
相当于 JavaBean。
一个模型能为多个视图提供数据。
这提高了应用程序的重用性 控制器: 当用户单击 Web 页面中的提交按钮时控制器接受请求并调用相应的模型去处理请求。
然后根据处理的结果调用相应的视图来显示处理的结果。
MVC 的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。
控制器调用相应的视图来显示处理的结果。
并通过视图呈现给用户。
2.struts1.2 和 struts2.0 的区别?如何控制两种框架中的单例模式? struts1.2 和 struts2.0 的对比 a、Action 类: struts1.2 要求 Action 类继承一个基类。
struts2.0 Action 要求继承 ActionSupport 基类 b、线程模式 struts1.2 Action 是单例模式的并且必须是线程安全的因为仅有一个 Action 的实例来处理所有的请求。
单例策略限制了 Struts1.2 Action 能做的事情并且开发时特别小心。
Action 资源必须是线程安全的或同步的。
struts2.0 Action 为每一个请求产生一个实例因此没有线程安全问题。
c、Servlet 依赖 struts1.2 Action 依赖于 Servlet API因为当一个 Action 被调用时 HttpServletRequest 和HttpServletResponse 被传递给 execut 方法。
struts2.0 Action 不依赖于容器允许 Action 脱离容器单独测试。
如果需要Struts2 Action仍然可以访问初始的 Request 和 Response。
但是其他的元素减少或者消除了直接访问 HttpServletRequest 和 HttpServletResponse的必要性。
d、可测性 测试 struts1.2 Action 的一个主要问题是 execute 方法暴露了 Servlet API这使得测试要依赖于容器。
一个第三方扩展:struts TestCase 提供了一套 struts1.2 的模拟对象来进行测试。
Struts2.0 Action 可以通过初始化、设置属性、调用方法来测试“依赖注入”也使得测试更容易。
3.项目中为什么使用 SSH 1. 使用 Struts 是因为 struts 是基于 MVC 模式的很好的将应用
程序进行了分层,使开发者更关注于业务逻辑的实现;第二,struts 有着丰富的 taglib如能灵活运用,则能大大提高开发效率。
2. 使用 Hibernate:因为 hibernate 为 Java 应用提供了一个易用的、高效率的对象关系映射框架。
hibernate 是个轻量级的持久性框架,功能丰富。
3. 使用 Spring:因为 spring 基于 IoCInversion of Control,反向控制和 AOP 构架多层
j2ee 系统的框架,但它不强迫你必须在每一层中必须使用 Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块; 采用 IoC 使得可以很容易的实现 bean 的装配,提供了简洁的 AOP 并据此实现事务管理Transcation Managment等等4.struts 如何实现国际化 以下以两国语言中文,英文为例: 1. 在工程中加入 Struts 支持 2. 编辑 ApplicationResource.properties 文件在其中加入要使用国际化的信息 例如:lable.welcome.chinaWelcome 3. 创建英文资源文件 ApplicationResource_en.properites 4. 创 建 临 时 中 文 资 源 文 件 ApplicationResource_temp.properites 例 如 :lable.welcom.china中国欢迎您 5. 对临时中文资源文件进行编码转换。
可以使用 myeclipse 的插件也可以在 dos 下执行: native2ascii -encoding gb2312 ApplicationResource_temp.propertiesApplicationResource_zh_CN.properties 6. 在
jsp 中加入 struts 的 bean 标记库 lt taglib uriquot/WEB-INF/struts-bean.tldquotprefixquotbeanquotgt 显示信息: ltbean:message keyquotlabel.welcome.chinaquotgt可以在 struts-config.xml 文件中定义多个资源包,而每个资源包可使用 key 属性指定包的名称。
5.struts2.0 的
常用标签 1. 往 action 里传值:ltinput namequotuserNamequot typequottextquot classquotinput6quot sizequot15quotgt 2. 显示标签 property 用于输出指定值:lts:property valuequotuserName quot/gt 3. 用 于 从 页 面 往 action 中 user 的 对 象 内 传 值 : lts:text namequotuser.userName quotidquotusernamequot/gt 4. 判断lts:ifgt lt/s:ifgt 用于在页面中判断指定数据 lts:if testquotuserName adminquotgt….lt/s:ifgt lts:elsegt…. lt/s:elsegt 5. 迭代lts:iteratorgt用于将 List、Map、ArrayList 等集合进行循环遍历 lts:iterator valuequotuserListquot idquotuserquot statusquotuquotgt lts:property valuequotuserNamequot/gtlt/agt lt/s:iteratorgt6.struts1 中怎么配置 form-bean 配置:在配置文件 struts-config.xml 中: ltform-beans gt ltform-bean namequotquot typequotquotgtlt/form-beangt lt/form-beansgt name: 指定 form 的名字 type 指定 form 的类型:包名类名; action 配置:在配置文件 struts-config.xml 中 ltaction-mappings gt ltaction pathquotquot attributequotquot inputquotquot namequotquot parameterquotquot scopequotrequestquot typequotquot gtlt/actiongt lt/action-mappingsgt path:请求 Action 的名字 attribute:form 的名字与 form-bean 中的 name 对应 input:输入页的路径 name: 如果配置了 attributename 不起作用与 attribute 一样 使用分发 Action parameter:时指定调用分发 Action 中的方法名 scope:Action 的范围 type:Action 的类型:包名类名;8.action 是单实例还是多实例,为什么? action 是单实例的。
当多个用户访问一个请求的时候,服务器内存中只有一个与之对应的 action 类对象。
因为当服务器第一次加载 struts 的配置文件的时候创建了一个 Action 后每发送一个请求服务器都会先去检索相应的范围内requestsession是否存在 这样一个 action 实例如果存在则使用这个实例如果不存在则创建一个 action 实例。
9.dispatchAction 是用什么技术实现的? DispatchAction 是 Aciton 的一个子类主要解决了一个请求处理多个功能的问题 普通的 Action 你只能写 execute 方法来处理业务而想用这一个 Action 处理多个任务你必须要请求参数进行解析用 if 语句块来处理10.struts2.0 的 mvc 模式? struts2 的 mvc 模式:当用户在页面提交用户请求时该请求需要提交给 struts2 的控制器处理。
struts2 的控制器根据处理结果 决定将哪个页面呈现给客户端。
11.struts 的处理流程。
一、ActionServlet 的初始化ActionServlet 作为 Struts 组件的前端控制器,由于 web.xml 的相应配置:ltload-on-startupgt0lt/load-on-startupgt在应用一加载时即会被实例化并调用其 init 方法,init 方法所做的主要工作有二:1. 加载 struts 配置文件,并创建用于封装配置信息的 ModuleConfig 对象2. 加载资源文件,并创建用于封装资源文件的 MessageResources 对象需 要 注 意 两 点 : 如 果
web.xml 有 多 模 块 配 置 , 将 创 建 多 个 ModuleConfig 对 象 和MessageResources 对象分别用于封装各个模块的 struts 配置文件和资源文件。
针对各个模块所创建的 ModuleConfig 对象和 MessageResources 对象将存储在 ServletContext中,对应的属性名中有该模块名称的相应标识。
另外,如果有相应配置的话,init 方法还将初始化数据源和 PlugIn二、ActionServlet 的 process所有形如.do 的请求(根据 web.
xml 中的相关配置)将提交给 ActionServlet,最终将调用其process 方法。
process 方法的主要工作有三:1. 根据请求信息获知所请求的模块名称,从 ServletContext 中获得与请求模块对应的的ModuleConfig 对象,并存储到 request 中。
2. 根据模块信息获得相应的 RequestProcessor 对象,一个模块对应一个 RequestProcessor对象,RequestProcessor 对象将关联与所属模块对应的 ModuleConfig 对象。
3. 调用 RequestProcessor 对象的 process 方法,将 request 和 response 作为参数传递给它。
三、RequestProcessor 的 processRequestProcessor 对象的 process 方法的主要工作有五步:1. 调用自己的 processPreprocessrequest response方法,该方法不进行任何操作,用于子类重写扩展其功能。
2. 获得与请求地址所匹配的 ActionMapping 对象,AcionMapping 对象用于封装一个特定acion 的配置信息。
3. 根据 ActionMapping 中的配置信息获得 ActionForm 对象(该对象将缓存到 request 或session 中),并将 表 单 数 据 填 充 到 ActionForm 中 , 然 后 根 据 ActionMapping 的 配 置 决 定 是 否 验 证ActionForm,如果验证,将调用 ActionForm 的 validate 方法,若其返回的 ActionErros 对象中包含 ActionMessage 对象则表示验证失败,将转向 action 配置信息 input 属性所指示的地址。
4. 如果 ActionForm 无需验证或验证通过将创建并缓存与请求地址匹配的 Action 对象,将ActionMapping对象、ActionForm 对象、request 和 response 作为参数调用其 execute 方法。
5. 根据 Action 对象的 execute 方法返回的 ActionForward 对象,将请求转发或重定向到该ActionForward所封装的地址。
二.Hibernate1.Hibernate
工作原理?hibernate,通过对 jdbc 进行封装,对 java 类和 关系数据库进行 mapping,实现了对关系数据库的面向对象方式的操作,改变了传统的 jdbc sql 操作数据的方式,从而使开发人员可以话更多精力进行对象方面的开发1.读取并解析配置文件2.读取并解析映射信息,创建 SessionFactory3.打开 Sesssion4.创建事务 Transation5.持久化操作6.提交事务7.关闭 Session8.关闭 SesstionFactory2.为什么要用 Hibernate?对 JDBC 访问数据库的代码做了封装,对 java 类和 关系数据库进行 mapping,实现了对关系数据库的面向对象方式的操作,改变了传统的 jdbc sql 操作数据的方式,大大简化了数据访问层繁琐的重复性代码。
Hibernate 是一个基于 JDBC 的主流持久化框架,是一个优秀的 ORM 实现。
他很大程度的简化 DAO 层的编码工作。
hibernate 的性能非常好,因为它是个轻量级框架。
映射的灵活性很出色。
它支持各种关系数据库,从一对一到多对多的各种复杂关系。
3.什么是 Hibernate 的并发机制?怎么去处理并发
问题? Hibernate 并发机制: a、Hibernate 的 Session 对象是非线程安全的对于单个请求单个会话单个的工作单元即单个事务单个线程它通常只使用一次 然后就丢弃。
如果一个 Session 实例允许共享的话,那些支持并发运行的例如 Http requestsessionbeans 将会导致出现资源争用。
如果在 Http Session 中有 hibernate 的 Session 的话就可能会出现同步访问 HttpSession。
只要用户足够快的点击浏览器的“刷新” 就会导致两个并发运行的线程使用同一个 Session。
b、多个事务并发访问同一块资源可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。
解决
方案:设置事务隔离级别。
Serializable:串行化。
隔离级别最高 Repeatable Read:可重复读 Read Committed:已提交数据读 Read Uncommitted:未提交数据读。
隔离级别最差 设置锁:乐观锁和悲观锁。
乐观锁:使用版本号或时间戳来检测更新丢失在ltclassgt的映射中设 置opti
mistic-lockquotallquot可以在没有版本或者时间戳属性映射的情况下实现 版本检查,此时Hibernate 将比较一行记录的每个字段的状态 行级悲观锁:Hibernate 总是使用数据库的锁定机制,从不在内存中锁定对象!只要为 JDBC 连接指定一下隔 离级别,然后让数据库去搞定一切就够了。
类LockMode 定 义 了 Hibernate 所 需 的 不 同 的 锁 定 级 别 :LockMode.UPGRADELockMode.UPGRADE_NOWAITLockMode.READ2.Hibernate 和 spring 中常出现的几个异常 org.springframework.beans.factory.BeanCreationException: Error creating bean with name sessionFactory defined in ServletContext resource/WEB-INF/applicationContext.xml: Initialization of bean failed nested exception is org.hibernate.MappingException:Repeated column in mapping for entity:com.xindeco.myregister.pojo.MyRegisterInfo column: password should be mapped with insertquotfalsequot updatequotfalsequot 出错原因: password 和 repassword 同时对应数据库表中的 password 一列,同时 update和 insert 都设为 true。
xml 文件如下: ltproperty namequotpass
wordquot typequotjava.lang.Stringquot updatequottruequot insertquottruequot accessquotpropertyquot columnquotpasswordquot length quot32quot /gt ltproperty namequotrepasswordquot typequotjava.lang.Stringquot updatequotfalsequot insertquotfalsequot accessquotpropertyquot columnquotpasswordquot length quot32quot /gt 解决方法:将 repassword 的 insert 和 update 设为 false。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name sessionFactory defined in ServletContext resource/WEB-INF/applicationContext.xml: Initialization of bean failednested exception isorg.hibernate.PropertyNotFoundException: Could not find a getter for ID in class 错误原因:hibernate 的映射文件中 ID 是大写的,而 pojo 的类中 id 是小写的 解决方法:要么将 pojo 类中的 id 改称大写,要么把 hibernate 的映射文件中的 ID 改称小写。
4.Hibernate 与 jdbc 的联系 hibernate 是 jdbc 的轻量级封装,包括 jdbc 的与数据库的连接(用 hibernate.property 的配置文件实现当然本质是封装了 jdbc 的 forname) , 和查询,删除等代码,都用面向对象的思想用代码联系起来,hibernate 通过 hbm 配置文件把 po 类的字段和数据库的字段关联起来比如数据库的 id 在 po 类中就是 pravite Long id public Long getId public setIdLong id 然后 hql 语句也是面向对象的, 它的查询语句不是
查询数据库而是查询类的这些实现的魔法就是 xml 文件,其实 hibernate封装的 jdbcxml 文件5.Hibernate 与 spring 的联系 hibernate 中的一些对象可以给 Spring 来管理让 Spring 容器来创建 hibernate 中一些对象实例化。
例如:SessionFactory,HibernateTemplate 等。
Hibernate 本来是对数据库的一些操作放在 DAO 层而 Spring 给业务层的方法定义了事务业务层调用 DAO 层的方法很好的将 Hibernate 的操作也加入到事务中来了。
6.Hibernate 自带的分页机制是什么?如果不使用 Hibernate 自带的分页,则采用什么方式分页? 1、hibernate 自带的分页机制:获得 Session 对象后,从 Session 中获得 Query 对象。
用Query.setFirstResult:设置要显示的第一行数据 Query.setMaxResults:设置要显示的最后一行数据。
2、不使用 hibernate 自带的分页可采用
sql 语句分页, 如:5:为每页显示的记录2 为当前页: select top 5 from table where tabId not inselect tabId top 2-15 from table7.hibernate 的对象的三种持久化状态,并给出解释? 不清楚 hibernate 的对象的三种持久化状态只知道 hibernate 对象的三种状态下面有介绍。
8.hibernate 中一对多配置文件返回的是什么? hibernate 中一对多配置文件会相应的映射为两张表,并且它们之间的关系是一对多的。
例如:一个 student 和 classes 表的关系 。
一个学生只能是一个班的一个班可以有多个学生。
9.update()和 saveOrUpdate()的区别? update和 saveOrUpdate是用来对跨 Session 的 PO 进行状态管理的。
update方法操作的对象必须是持久化了的对象。
也就是说,如果此对象在数据库中不存在的话,就不能使用 update方法。
saveOrUpdate方法操作的对象既可以使持久化了的,也可以使没有持久化的对象。
如果是持久化了的对象调用 saveOrUpdate则会 更新数据库中的对象;如果是未持久化的对象使用此方法则 save 到数据库中。
10.hibernate 的三种状态之间如何转换 当对象由瞬时状态Transient一 save时,就变成了持久化状态。
当我们在 Session 里存储对象的时候,实际是在 Session 的 Map 里存了一份, 也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象Persistent。
Session 一 Close了,它的缓存也都关闭了,整个 Session 也就失效了, 这个时候,这个对象变成了游离状态Detached,但数据库中还是存在的。
当游离状态Detachedupdate时,又变为了持久状态Persistent。
当持久状态Persistentdelete时,又变为了瞬时状态Transient 此时,数据库中没有与之对应的记录。
11.hibernate 拒绝连接、服务器崩溃的原因?最少写 5 个1. db 没有打开2.
网络连接可能出了问题3. 连接配置错了4. 驱动的 driver,url 是否都写对了5. LIB 下加入相应驱动,数据连接代码是否有误6. 数据库配置可能有问题7. 当前联接太多了,服务器都有访问人数限制的8. 服务器的相应端口没有开,即它不提供相应的服务9 hibernate 有哪些缓存,分别怎么使用10 你对 hibernate 的了解到了一个什么样的程度?11 写出一个 sql 语句体现 hibernate 中一对多的关系12.Hibernate 介绍Hibernate 是一个开放
源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得
Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate 可以应用在任何使用JDBC 的场合,既可以在 Java 的客户端程序使用,也可以在 Servlet/
JSP 的 Web 应用中使用,最具革命意义的是,Hibernate 可以在应用 EJB 的 J2EE 架构中取代 CMP,完成数据持久化的重任。
Hibernate 的核心接口一共有 5 个,分别为:Session、SessionFactory、Transaction、Query和 Configuration。
这 5 个核心接口在任何开发中都会用到。
通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
下面对这五个核心接口分别加以介绍。
Session 接口:Session 接口负责执行被持久化对象的 CRUD 操作CRUD 的任务是完成与数据库的交流,包含了很多常见的 SQL 语句。
。
但需要注意的是 Session 对象是非线程安全的。
同时,Hibernate 的 session 不同于
JSP 应用中的 HttpSession。
这里当使用 session 这个术语时,其实指的是 Hibernate 中的 session,而以后会将 HttpSesion 对象称为用户 session。
SessionFactory 接口:SessionFactroy 接口负责初始化 Hibernate。
它充当数据存储源的代理,并负责创建 Session 对象。
这里用到了工厂模式。
需要注意的是 SessionFactory 并不是轻量级的,因为一般情况下,一个项目通常只需要一个 SessionFactory 就够,当需要操作多个数据库时,可以为每个数据库指定一个 SessionFactory。
Configuration 接口:Configuration 接口负责配置并启动 Hibernate,创建 SessionFact.