【Jsp精品源码栏目提醒】:本文主要为网学会员提供“ssh面试宝典(必过) - 大学课件”,希望对需要ssh面试宝典(必过) - 大学课件网友有所帮助,学习一下!
2012-SSH 最新笔试面试题Struts1. struts1 和 struts2 的区别?单例模式如果控制? 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 方法暴露了 ServletAPI这使得测试要依赖于容器。
一个第三方扩展:struts TestCase 提供了一套 struts1.2 的模拟对象来进行测试。
Struts2.0 Action 可以通过初始化、设置属性、调用方法来测试“依赖注入”也使得测试更容易。
2. struts 与 spring 是如何继承的 不 懂 题 目 之 意 : 是 否 是 说 的 struts 的 action 都 继 承 自org.apache.struts.action.Action 而 Spring 中的继承就不清楚了。
3. logic 标签有哪几个? 此标签库可以分为三种类型:条件、循环、转发/重定向。
1. 条件类型 没标注的都比较简单 logic:empty logic:notEmpty logic:equal logic:notEqual logic:lessThanlogic:greaterThanlogic:lessEqual logic:greaterEqual logic:present logic:notPresent logic:match logic:notMatch 比较两字符串是否相等,可以比较字符串的开始的、结尾的或其中的某个部分。
location 属性:指定从某个位置开始进行比较。
2. 循环类型 logic:iterate 3. 转发/重定向类型 logic:forward 和 logic:redirect logic:forward 标签和
jsp:forward 标签相似,但它可以使用 globalforward 中的一个 ActionForward 例如:ltlogic:forward namequotloginquot /gt------------------------------------------------------------------------------ 与上面相关的 global forward 中的代码: ltglobal-forwardsgt ltforward namequotloginquot pathquot/loginForm.jspquot/gt lt/global-forwardsgt logic:redirect 标 签 和 上 面 的 标 签 类 似 , 但 它 默 认 调 用 的 方 法 是response.sendRedirect, 取代了上面的 requestDispatcher.forward。
最大的不同是它支持所有 html:link 标签的属性,所以你能够指定 request 参数: ltlogic:redirect namequotloginquot paramIdquotemployeeIdquotparamNamequotemployeequot propertyquotidquot /gt 在 MVC 框架下,不推荐使用这两个标签,你应该是从 controller 中选择下一个 view,而不是从 view 中选择.在
Jsp 页面中不要过多的使用 logic 标签。
4. action 是单实例还是多实例,为什么? action 是单实例的。
当多个用户访问一个请求的时候,服务器内存中只有一个与之对应的 action 类对象。
因为当服务器第一次加载 struts 的配置文件的时候创建了一个 Action 后每发送一个请求服务器都会先去检索相应的范围内requestsession是否存在 这样一个 action 实例如果存在则使用这个实例如果不存在则创建一个action 实例。
5. dispatchAction 是用什么技术实现的? DispatchAction 是 Aciton 的一个子类主要解决了一个请求处理多个功能的问题 普通的 Action 你只能写 execute 方法来处理业务而想用这一个 Action 处理多个任务你必须要请求参数进行解析用 if 语句块来处理 举一个小例子: 有如下一个 url: http://localhost:8080/myApp/addUserAction.do 如果你处理这个 url 的是一个普通的 Action那么就只能在 execute 里面执行插入的相关操作如果换成一下 url: http://localhost:8080/myApp/UserAction.domethodadd 你 就 应 该 根 据 method 对 象 的 值 来 执 行 相 应 的 操 作 如 再 有 一 个 路 径http://localhost:8080/myApp/UserAction.domethoddelete 这个还可以使用那个 Action 来处理的只是多判断一下而已. 如果你用 DispatchAction就简单多了所以 dispatchAction 还是用的Action 的这么一个技术。
6. struts2.0 的 mvc 模式?与 struts1.0 的区别 struts2 的 mvc 模式:当用户在页面提交用户请求时该请求需要提交给struts2 的控制器处理。
struts2 的控制器根据处理结果 决定将哪个页面呈现给客户端。
与 struts1 最大的不同是:struts2 的控制器。
struts2 的控制器不再像 struts1 的控制器需要继承一个 Action 父类甚至可以无需实现 任何接口struts2 的 Action 就是一个普通的 POJO。
实际上,Struts2 的Action 就是一个包含 execute 方法的普通 Java 类 该类里包含的多个属性用于封装用户的请求参数。
7. 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 方法还将初始化数据源和 PlugIn8. Struts/webwork 的工作机制,它有哪些标签 Struts 2 框架的大致处理流程如下: 浏览器发送请求,例如请求/mypage.action、/reports/myreport.pdf 等。
核心控制器 FilterDispatcher 根据请求决定调用合适的 Action。
WebWork 的拦截器链自动对请求应用通用功能,例如 workflow、validation 或文件上传等功能。
回调 Action 的 execute 方法,该 execute 方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据保存到数据库,也可以从数据库中检索信息。
实际上,因为 Action 只是一个控制器,它会调用业务逻辑组件来处理用户的请求。
Action 的 execute 方法处理结果信息将被输出到浏览器中,可以是 HTML页面、图像,也可以是 PDF 文档或者其他文档。
此时支持的视图技术非常多,既支持
JSP,也支持 Velocity、FreeMarker 等模板技术。
HibernateHibernate 工作原理及为什么要用?原理:hibernate,通过对 jdbc 进行封装,对 java 类和 关系数据库进行 mapping,实现了对关系数据库的面向对象方式的操作,改变了传统的 jdbc sql 操作数据的方式,从而使开发人员可以话更多精力进行对象方面的开发1.读取并解析配置文件2.读取并解析映射信息,创建 SessionFactory3.打开 Sesssion4.创建事务 Transation5.持久化操作6.提交事务7.关闭 Session8.关闭 SesstionFactory为什么要用:1. 对 JDBC 访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate 是一个基于 JDBC 的主流持久化框架,是一个优秀的 ORM 实现。
他很大程度的简化 DAO 层的编码工作3. hibernate 的性能非常好,因为它是个轻量级框架。
映射的灵活性很出色。
它支持各种关系数据库,从一对一到多对多的各种复杂关系。
题目 2: 什么是 Hibernate 延迟加载延迟加载机制是为了避免一些无谓的性能开销而提出来的, 所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
在 Hibernate 中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在 Hibernate3 中还提供了对属性的延迟加载。
题目 3:Hibernate 中类之间的关联关系有几种如:一对多、多对多的关系 many-to-one、one-to-many、many-to-many、 one-to-one题目 4: 说下 Hibernate 的缓存机制一、hibernate 一级缓存(1)hibernate 支持两个级别的缓存,默认只支持一级缓存;(2)每个 Session 内部自带一个一级缓存;(3)某个 Session 被关闭时,其对应的一级缓存自动清除;二、hibernate 二级缓存1 二级缓存独立于 session,默认不开启;题目 5: Hibernate 的查询方式本地 SQL 查询、Criteria、Hql题目 6: 如何优化 Hibernate?1.使用双向一对多关联,不使用单向一对多2.不用一对一,用多对一取代3.配置对象缓存,不使用集合缓存题目 7: Struts 工作机制?为什么要使用 Struts?工作机制:Struts 的工作流程:在 web 应用启动时就会加载初始化 ActionServletActionServlet 从struts-config.xml 文件中读取配置信息把它们存放到各种配置对象当 ActionServlet 接收到一个客户请求时将执行如下流程. -1检索和用户请求匹配的 ActionMapping 实例如果不存在就返回请求路径无效信息 -2如果 ActionForm 实例不存在就创建一个 ActionForm 对象把客户提交的表单数据保存到 ActionForm 对象中 -3 根 据 配 置 信 息 决 定 是 否 需 要 表 单 验 证 . 如 果 需 要 验 证 就 调 用ActionForm 的 validate方法 -4如果 ActionForm 的 validate方法返回 null 或返回一个不包含ActionMessage 的 ActuibErrors 对象 就表示表单验证成功 -5ActionServlet 根据 ActionMapping 所包含的映射信息决定将请求转发给哪个 Action如果相应的 Action 实例不存在就先创建这个实例然后调用 Action 的 execute方法 -6Action 的 execute方法返回一个 ActionForward 对象ActionServlet在把客户请求转发给 ActionForward 对象指向的
JSP 组件 -7ActionForward 对象指向
JSP 组件生成动态网页返回给客户为什么要用:1.
JSP、Servlet、JavaBean 技术的出现给我们构建强大的企业应用系统提供了 可能。
但用这些技术构建的系统非常的繁乱。
2. 基于 Struts 开发的应用:不用再考虑公共问题专心在业务实现上结构统一,易于学习、维护新手也可写出好程序1. 什么是 Hibernate 的并发机制?怎么去处理并发问题? Hibernate 并发机制: a、Hibernate 的 Session 对象是非线程安全的对于单个请求单个会话单个的工作单元即单个事务单个线程它通常只使用一次 然后就丢弃。
如果一个 Session 实例允许共享的话,那些支持并发运行的例如 Httprequestsession beans 将会导致出现资源争用。
如果在 Http Session 中有 hibernate 的 Session 的话就可能会出现同步访问 Http Session。
只要用户足够快的点击浏览器的“刷新” 就会导致两个并发运行的线程使用同一个 Session。
b、多个事务并发访问同一块资源可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。
解决方案:设置事务隔离级别。
Serializable:串行化。
隔离级别最高 Repeatable Read:可重复读 Read Committed:已提交数据读 Read Uncommitted:未提交数据读。
隔离级别最差 设置锁:乐观锁和悲观锁。
乐观锁:使用版本号或时间戳来检测更新丢失在ltclassgt的映射中设置 optimistic-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 inServletContext resource /WEB-INF/applicationContext.xml: Initialization of bean failed nested exception isorg.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 namequotpasswordquot 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 inServletContext resource /WEB-INF/applicationContext.xml: Initialization of bean failednested exception isorg.hibernate.PropertyNotFoundException: Could not find a getter for IDin class 错误原因:hibernate 的映射文件中 ID 是大写的,而 pojo 的类中 id 是小写的 解决方法:要么将 pojo 类中的 id 改称大写,要么把 hibernate 的映射文件中的 ID 改称小写。
3. Hibernate 与 jdbc 的联系 hibernate 是 jdbc 的轻量级封装,包括 jdbc 的与数据库的连接(用hibernate.property 的配置文件实现当然本质是封装了 jdbc 的 forname) , 和查询,删除等代码,都用面向对象的思想用代码联系起来,hibernate 通过 hbm 配置文件把 po 类的字段和数据库的字段关联起来比如数据库的 id 在 po 类中就是 pravite Long id public Long getId public setIdLongid 然后 hql 语句也是面向对象的, 它的查询语句不是查询数据库而是查询类的这些实现的魔法就是 xml 文件,其实 hibernate封装的 jdbcxml 文件4. Hibernate 与 spring 的联系 hibernate 中的一些对象可以给 Spring 来管理让 Spring 容器来创建hibernate 中一些对象实例化。
例如:SessionFactory,HibernateTemplate 等。
Hibernate 本来是对数据库的一些操作放在 DAO 层而 Spring 给业务层的方法定义了事务业务层调用 DAO 层的方法很好的将 Hibernate 的操作也加入到事务中来了。
5. Hibernate 自带的分页机制是什么?如果不使用 Hibernate 自带的分页,则 采用什么方式分页? 1、hibernate 自带的分页机制:获得 Session 对象后,从 Session 中获得Query 对象。
用 Query.setFirstResult:设置要显示的第一行数据 Query.setMaxResults:设置要显示的最后一行数据。
2、不使用 hibernate 自带的分页可采用 sql 语句分页, 如:5:为每页显示的记录2 为当前页: select top 5 from table wheretabId not in select tabId top 2-15 from table6. hibernate 的对象的三种持久化状态,并给出解释? 不清楚 hibernate 的对象的三种持久化状态只知道 hibernate 对象的三种状态下面有介绍。
7. hibernate 中一对多配置文件返回的是什么? hibernate 中一对多配置文件会相应的映射为两张表,并且它们之间的关系是一对多的。
例如:一个 student 和 classes 表的关系 。
一个学生只能是一个班的一个班可以有多个学生。
8. update()和 saveOrUpdate()的区别? update和 saveOrUpdate是用来对跨 Session 的 PO 进行状态管理的。
update方法操作的对象必须是持久化了的对象。
也就是说,如果此对象在数据库中不存在的话,就不能使用 update方法。
saveOrUpdate方法操作的对象既可以使持久化了的, 也可以使没有持久化的对象。
如果是持久化了的对象调用 saveOrUpdate则会 更新数据库中的对象;如果是未持久化的对象使用此方法则 save 到数据库中。
9. hibernate 的三种状态之间如何转换 当对象由瞬时状态Transient一 save时,就变成了持久化状态。
当我们在 Session 里存储对象的时候,实际是在 Session 的 Map 里存了一份, 也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象Persistent。
Session 一 Close了,它的缓存也都关闭了,整个 Session 也就失效了, 这个时候,这个对象变成了游离状态Detached,但数据库中还是存在的。
当游离状态Detachedupdate时,又变为了持久状态Persistent。
当持久状态Persistentdelete时,又变为了瞬时状态Transient 此时,数据库中没有与之对应的记录。
10. hibernate 拒绝连接、服务器崩溃的原因?最少写 5 个 1. db 没有打开 2. 网络连接可能出了问题 3. 连接配置错了 4. 驱动的 driver,url 是否都写对了 5. LIB 下加入相应驱动,数据连接代码是否有误 6. 数据库配置可能有问题 7. 当前联接太多了,服务器都有访问人数限制的 8. 服务器的相应端口没有开,即它不提供相应的服务 9 hibernate 有哪些缓存,分别怎么使用 10 你对 hibernate 的了解到了一个什么样的程度? 11 写出一个 sql 语句体现 hibernate 中一对多的关系11. 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,创建 SessionFactory 对象。
在 Hibernate 的启动的过程中,Configuration .