1. 描述 Struts 体系结构?对应各个部分的开发工作主要包括哪些?
Struts 是 MVC 的一种实现,它将 Servlet 和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts 继承了 MVC 的各项特性,并根据 J2EE 的特点,做了相应的变化与扩展。Struts 的体系结构与工作原理如下图所示:
1)模型(Model)
在 Struts 的体系结构中,模型分为两个部分:系统的内部状态和可以改变状态的操作(事务逻辑)。内部状态通常由一组 Actinform Bean 表示。根据设计或应用程序复杂度的不同,这些 Bean 可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。比如购物车 bean,它拥有用户购买商品的信息,可能还有 checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。小型程序中,操作可能会被内嵌在 Action 类,它是 struts 框架中控制器角色的一部分。当逻辑简单时这个方法很适合。建议用户将事务逻辑(要做什么)与 Action 类所扮演的角色(决定做什么)分开。
2)视图(View)
视图主要由 JSP 建立,struts 包含扩展自定义标签库(TagLib),可以简化创建完全国际化用户界面的过程。目前的标签库包括:Bean Tags、HTML tags、Logic Tags、Nested Tags 以及Template Tags等。
3)控制器(Controller)
在 struts 中,基本的控制器组件是 ActionServlet 类中的实例 servelt,实际使用的 servlet 在配置文件中由一组映射(由 ActionMapping 类进行描述)进行定义。对于业务逻辑的操作则主要由 Action、ActionMapping、ActionForward 这几个组件协调完成的,其中 Action 扮演了真正的业务逻辑的实现者,ActionMapping 与 ActionForward 则指定了不同业务逻辑或流程的运行方向。struts-config.xml 文件配置控制器。
2. 简要描述如何结合 struts、hibernate、spring 开发 Web 应用?
答:
Struts 可以将 jsp 页面的表单关联起来,就是把 JSP 页面的表单数据封装成 javaBean,这样的话,在 action 中你再也不需要使用传统的request.getParameter(“name”)
;还有 struts 有一个控制器,你在 struts 编程中的控制器(XxxAction)都是继承总的 ActionServlet,它能集中处理请求,然后转到相关的页面。还有 struts 的表单验证组件,不用你写 js 验证了,只需要你配置一下文件就可以了。另外 struts 的令牌机制可以防表单重复提交。
Spring 是一个轻量级容器,非侵入性.包含依赖注入,AOP 等。它是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。
Hibernate: 它可以让我们以 OO 的方式操作数据库,这让我们看到了 hibernate 的强大之处,体验到操作数据的方便。但 hibernate 最耀眼之处是 hibernate 的缓存机制,而不是以 OO 的方式操作数据库。Hibernate 的缓存机制不外乎是一级缓存 session,二级缓存 sessionFactory ,和第三方缓存如 ehcache 。也就是 hibernate 的最强大的地方是它的缓存,理解了这个才能真正的理解 hibernate,Hibernate 的命名查询/命名参数查询,就是将 hql 语句放在一个单独的 xml 文件之中,它仍然让人们以面向对象的方式去操纵数据,而不用在以 OO 的方式写着代码的同时,然后再转变思维,用面向关系的方式去写那些 sql 语句。但 hibernate 不仅做了这些,它的 native sql 查询方式,完全满足 sql 语句的偏爱者,它像 ibatis一样,将 sql 语句放在配置文件之中。
3. 说明反转控制(IOC)和面向方向编程(AOP)在 spring 中的应用
答:Spring 核心容器(Core)提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(Ioc)模式将应用程序的配置和依赖性规范与实际的应用代码程序分开。Spring 的声明式事务基于 AOP 实现,却并不需要程序开发者成为 AOP 专家,亦可轻易使用 Spring 的声明式事务管理。
4. 简述基于 Struts 框架 Web 应用的工作流程
答:在 web 应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml 文件中读取配置信息,把它们存放到各种配置对象中,当 ActionServlet 接收到一个客户请求时,将执行如下流程.
1) 检索和用户请求匹配的 ActionMapping 实例,如果不存在,就返回请求路径无效信息;
2) 如果 ActionForm 实例不存在,就创建一个 ActionForm 对象,把客户提交的表单数据保存到ActionForm对象中;
3) 根据配置信息决定是否需要表单验证.如果需要验证,就调用 ActionForm 的 validate() 方法;
4) 如果 ActionForm 的 validate() 方法返回 null 或返回一个不包含 ActionMessage 的 ActionErrors 对象, 就表示表单验证成功;
5 )ActionServlet 根据 ActionMapping 所包含的映射信息决定将请求转发给哪个 Action,如果相应的 Action 实例不存在,就先创建这个实例,然后调用 Action 的 execute() 方法;
6) Action 的 execute() 方法返回一个 ActionForward 对象,ActionServlet 在把客户请求转发给 ActionForward 对象指向的 JSP 组件;
7) ActionForward 对象指向 JSP 组件生成动态网页,返回给客户;
5. 在项目中用过 Spring的 哪些方面?及用过哪些 Ajax 框架?
答:在项目使用过 Spring IOC ,AOP,DAO,ORM,还有上下文环境。
在项目使用过 Ext,Juery 等 Ajax 框架.
6. MVC 模式中 M,V,C 每个代表意义,并简述在 Struts 中 MVC 的表现方式。
答:
MVC 是 Model-View-Controller 的缩写,Model代表的是应用的业务逻辑(通过 JavaBean,EJB 组件实现),View 是应用的表示层(由 JSP 页面产生)Controller是通过应用的处理过程控制,(一般是一个 servlert)通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用。
在 Struts 框架中 Controller 功能由 ActionServlet 和 ActionMapping 对象构成,核心是一个 Servlet 类型的对象 ActionServlet,它用来接收客户端的请求。ActionServlet 包括一组基于配置的 ActionMapping 对象,每个 ActionMapping 对象实现了一个请求到一个具体的 Model 部分的 Action 处理器对象之间的映射。
Model 部分由 Action 和 ActionForm 对象构成。所有的 Action 处理器对象都是开发者从 Struts 的 Action 类派生的子类。Action 处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的 View 组件以产生响应。Struts 提供的 ActionForm 组件对象可以通过定义属性描述客户端表单数据,开发者可以从它派生子类对象,并利用它和 Struts 提供的自定义标记库相结合,可以实现对客户端的表单数据的良好封装和支持,Action 处理器对象可以直接对它进行读写,而不再需要和 request、response 对象进行数据交互。通过 ActionForm 组件对象实现了对 View 和 Model 之间交互的支持(View 部分是通过 JSP 技术实现的)。Struts 提供了自定义的标记库,通过这些自定义标记库可以非常容易地和系统的 Model 部分交互,通过使用这些自定义标记库创建的
JSP 表单,可以实现对 Model 部分中的 ActionForm 的映射,完成对用户数据的封装。
7. Hibernate 中的 Java对象有几种状态,其相互关系如何(区别和相互转换)。
答:在 Hibernate 中,对象有三种状态:临时状态、持久状态和游离状态。 临时状态:当 new 一个实体对象后,这个对象处于临时状态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被 jre 垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过 Session 的 save 或者 SaveOrUpdate 把临时对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久对象;
持久状态:持久化对象的实例在数据库中有对应的记录,并拥有一个持久化表示(ID)。对持久化对象进行 delete 操作后,数据库中对应的记录将被删除,那么持久化对象与数据库记录不再存在对应关系,持久化对象变成临时状态。
持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化对象是脏的(Dirty)。
游离状态:当 Session 进行了 Close、Clear 或者 evict 后,持久化对象虽然拥有持久化标识符和与数据库对应记录一致的值,但是因为会话已经消失,对象不在持久化管理之内,所以处于游离状态(也 叫:脱管状态)。游离状态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。
8. 对 Hibernate 的延迟加载如何理解,在实际应用中,延迟加载与 session 关闭的矛盾是如何处理的?
答:延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载。那么 Hibernate 是怎么知识用户在什么时候使用数据了呢?又是如何加载数据呢?其实很简单,它使用了代理机制。返回给用户的并不是实体本身,而是实体对象的代理。代理对象在用户调用 getter 方法时就会去数据库加载数据。但加载数据就需要数据库连接。而当我们把会话关闭时,数据库连接就同时关闭了。这种情况就叫做未初始化的关系。
9. Struts1 中 actionform 和 action 属于 MVC 哪一层,为什么?
答:actionform 和 action 属于 MVC 的 Model层,Action 用来处理业务逻辑,actionform 保存用户表单数据以便于在不同页面间传递。而 MVC 中的 model 层就是业务逻辑层,该层用于实现具体的业务逻辑、状态维护及管理。
10. struts2 中,Action 通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的?
答:
1)可以直接通过与表单元素相同名称的数据成员(需要存在符合命名规范 set 和 get 方法)获取页面表单数据。
2)会把处理好的数据成员放入值栈中,到页面可以使用 struts2 标签取值就可以了。
11. 说明什么是工厂模式?
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
12. struts 中如何实现国际化,涉及哪些文件?
解答:“国际化”是指一个应用程序在运行时能够根据客户端请求所来自的国家/地区、语言的不同而显示不同的用户界面。Struts 框架通过使用
13. Struts 框架可以支持以下哪种程序开发语言?(选择1项)
A.C