ActionMessage的ActionErrors对象,就表示表单验证成功。
(5)ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。(当Action中需要写多个方法时,此Action必须继承一个DispatchAction,否者将只执行默认的Action的execute()方法) (6)Action的execute()方法返回一个ActionForward对象(return mapping.findForward();),ActinoServlet再把客户请求转发给ActionForward对象只想的JSP组件。
(7)ActionForward对象指向的JSP组件生成动态网页,返回给客户。 对于以上流程的流程(4),如果ActionForm的validate()方法返回一个或多个ActionMessage的ActionErrors对象,就表示表单验证失败,此时
ActionServlet将直接把请求转发给包含用户提交表单的JSP组件( input=\验证失败要转的页面\。再这种情况下,不会再创建Action对象并 调用Action的execute()方法。
1.4 struts1 和struts2 的区别
1.都是MVC的WEB框架, 2 struts1的老牌框架,应用很广泛,有很好的群众基础,使用它开发风险很小,成本更低!struts2虽然基于这个框架,但是应用群众并多,相对不成熟,未知的风险和变化很多,开发人员相对不好招,使用它开发项目的风险系数更大,用人成本更高!
3.struts2毕竟是站在前辈的基础设计出来,它会改善和完善struts1中的一些缺陷,struts1中一些悬而未决问题在struts2得到了解决。 4.struts1的前端控制器是一个Servlet,名称为ActionServlet,struts2的前端控制器是一个filter,FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器.!StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher的.!
5.struts1的action需要继承Action类,struts2的action可以不继承任何类;struts1对同一个路径的所有请求共享一个Action实例,struts2对同一个路径的每个请求分别使用一个独立Action实例对象,所有对于struts2的Action不用考虑线程安全问题。
6.在struts1中使用formbean封装请求参数,在struts2中直接使用action的属性来封装请求参数。
7.struts1中的多个业务方法放在一个Action中时(即继承DispatchAction时),要么都校验,要么都不校验;对于struts2,可以指定只对某个方法进行校验,当一个Action继承了ActionSupport且在这个类中只编写了validateXxx()方法,那么则只对Xxx()方法进行校验。
(一个请求来了的执行流程进行分析,struts2是自动支持分模块开发,并可以不同模块设置不同的url前缀,这是通过package的namespace来实现的;struts2是支持多种类型的视图;struts2的视图地址可以是动态的,即视图的
名称是支持变量方式的,举例,论坛发帖失败后回来还要传递boardid。视图内容显示方面:它的标签用ognl,要el强大很多,在国际化方面支持分模块管理,两个模块用到同样的key,对应不同的消息;)
与Struts1不同,Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的。
给我印象最深刻的是:struts配置文件中的redirect视图的url不能接受参数,而struts2配置文件中的redirect视图可以接受参数。
2. struts 优缺点 优点:
1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现
2. 有丰富的tag可以用 ,Struts的 标记库(Taglib),如能灵活动用,则能大大提高开发效率。另外,就目前国 内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。
3. 页面导航.页面导航将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的 维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。 4. 提供Exception处理机制 . 5. 数据库链接池管理 6. 支持I18N 缺点:
1. 转到展示层时,需要配置forward,每一次转到展示层,相信大多数都是直接转到jsp,而涉及到转向,需要配置forward,如果有十个展示层的 jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之 后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器,如果业务变更复杂频繁的系统,这样的操作简单不可想
象。现在就是这样, 几十上百个人同时在线使用我们的系统,大家可以想象一下,我的烦恼有多大。
2. Struts的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了 线程安全的问题。
3.测试不方便. Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难 实现。不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试。
4. 类型的转换. Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons- Beanutils进行类型转化。但它的转化都是在Class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。
5. 对Servlet的依赖性过强. Struts处 理Action时必需要依赖ServletRequest 和ServletResponse,所有它摆脱不了Servlet容器。
6.前端表达式语言方面.Struts集 成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达 式语言在Collection和索引属性方面处理显得很弱。
7. 对Action执行的控制困难. Struts创 建一个Action,如果想控制它的执行顺序将会非常困难。甚至你要重 新去写Servlet来实现你的这个功能需求。 8. 对Action 执行前和后的处理. Struts处 理Action的时候是基于class的hierarchies, 很难在action处理前和后进行操作。
9.对事件支持不够. 在struts中, 实际是一个表单Form对应一个Action类(或 DispatchAction),换一句话说:在Struts中实际是一 个表单只能对应一个事件,struts这 种事件方式称为application event[align=left][/align],application event和component event相比是一种粗粒度的事件。
Struts重要的表单对象ActionForm是一种对象,它代表了一种应用,这个对象中至少包含几个字段,这些字段是 Jsp页面表单中的input字段,因为一个表单
对应一个事件,所以,当我们需要将事件粒度细化到表单中这些字段时,也就是说,一个字段对应一个事件时, 单纯使用Struts就不太可能,当然通过结合JavaScript也是可以转弯实现的。
3. Struts的validate框架是如何验证的?
在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。
4. 说下Struts的设计模式
单例模式 、Factory(工厂模式)、Proxy(代理模式)
四、spring 1、Spring特点
Spring 为企业应用提供一个轻量级的解决方案,包括:基于依赖注入的核心机制,基于AOP的声明式事务管理,与多种持久层技术的整合。Spring 致力于javaEE应用各层的解决方案,不仅仅专注某一层方案,但它不强迫你必须在每一层 中必须使用Spring,因为 它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的MVC,对不同的数据访问技术提供了统一的 接口,采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现Transcation Managment等 优点:
a 轻量:从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并 且Spring所需的处理开销也是微不足道的。
b 低侵入式设计,代码污染极低
c 独立于各种应用服务器,可以真正实现Write Once,Run Anywhere的承诺:通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消
除各种各样自定义格式的属性文件的需要。有了Spring,仅需要看看类的JavaBean属性。I oC的使用完成了这种简化。
Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦 Spring aop 容器允许将一些通用的任务:如日志,事物,安全处理等进行集中式管理,提高复用。Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适用于许多web应用。例如,Spring能使用AOP提供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数 据 库打交道,甚至不需要一个JTA实现。
Spring 的ORM和DAO 提供了与第三方持久框架的良好整合,并且简化了底层的数据库的访问
Spring能消除在许多工程上对Singleton的过多使用。
Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
开发者可自由选用Spring框架的部分或全部,Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或 其他为J2EE的 API特制的framework,Spring致力于解决剩下的问题。 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。
使用Spring构建的应用程序易于单元测试。
Spring提倡面向接口编程,请讲一下你对它的理解,它有什么好处。
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。既用接口设计可达到效果, 面向接口编程是组件间实现高度解耦的灵丹妙药
2、 spring工作机制和使用