ExtJS实战(10)-项目总结
好啦,整个应用看完了。大家是不是大有斩获呢!?呵呵,我们来做个项目总结吧。
1. Spring的作用是什么?
很多人在做SSH的应用时,很清楚Struts和Hibernate的职责和作用,但是却对Spring的作用有点迷惑。为什么呢?因为我们看到了很多Struts的API和Hibernate的API,但是却没有看到多少Spring的API。那么,大家还记得Spring定义吗?我们说它是一个非侵入式框架,也就是说,虽然看不到它的存在,却处处感觉到它的温暖。正所谓‘润物细无声’,这正是春天的奥义!呵呵,扯远了。想想Spring做了哪些事情吧,Struts框架里面最重要的的组件Action交给它管理,Hibernate里面最重要的组件SessionFactory也交给它管理,Service里面的方法自动置身在声明式事务的管理之中,这些难道还不能说明Spring这个‘黏合剂’的重要地位吗?!其实我们这里还是有点破坏了Spring的非侵入式特点,因为我们在写DAO层的时候继承了一个类:HibernateDaoSupport。而这个类是Spring对Hibernate框架的一个帮助支持类,属于Spring的API。不过也正是因为它的支持,我们DAO层的代码才能那么简洁!
2. 使用SSH的javaEE四层体系架构的传值组件有哪些,可以简化吗?
一切软件开发,最重要的是数据。那么,数据存储靠后台数据库,数据展现靠web页面(jsp,freemarker,velocity,pdf,excel等各种视图的简称!),也就是说,数据永远是在web页面和后台数据库之间传递。那么,数据在传递的时候,一般是打包封装传递,而不会是零散的。这个很好理解,假如你想从北京运输一批军火到上海,当然是用卡车或者飞机装载,而不会傻到一杆枪一杆枪地搬运!(罪过,罪过,怎么举这种例子!)那么,使用SSH组合框架在数据传输过程中的卡车就叫传值组件,分别有ActionForm,DTO,POJO三种。我个人倾向于3种组件都要使用。为什么呢?持怀疑态度的人一般是对各个组件之间属性值的拷贝深恶痛绝。其实这里面是有原因和技巧的。ActionForm的存在是理所当然地,因为它和页面表单数据结合的非常紧密,而且Struts能够自动把页面表单上的数据装载到ActionForm实例中,还能够把放置在request或session区域中的ActionForm实例中的属性直接显示到页面上。这样的功能是我们非常需要的。我们没理由摒弃它。POJO的存在也是理所当然的,因为它和数据库中的表集合的非常紧密,基本上我们都是一个POJO类对应一张数据表,这不正是ORM吗?!对于各种类型的实体关系,譬如一对一,多对一,多对多,单向还有双向的关系,我们都可以用POJO类与类之间的关联来实现。而且,更重要的是,我们都有很智能化的工具,譬如MyEclipse来直接反转表来生成。没有比这个更让人兴奋了。POJO类压根就不需要我们动手写!那么,DTO呢?有了POJO,它还有存在的必要吗?我觉得必要是大大的。首先,POJO是持久化类,有不同的状态。再其次,在一个复杂的应用中,它里面会有譬如日期,图片,金额这样的复杂数据类型,还会有不同类之间复杂的依赖关系(一个类,或者类的集合做另一个类的属性是常有的)。所以,它是不适合直接传递到页面上做显示的。又由于ActionForm是Struts特有的组件,不便于移植。所以在ActionForm和POJO之间找一个桥梁-DTO是非常必要的。那么,可能有人会说:ActionForm和DTO之间数据的转换还是很麻烦啊?大家想想,如果我们将DTO作为ActionForm的属性呢?这样是不是变得非常方便?!
3. DTO的设计要遵循什么样的原则?
(1) 尽可能使用比较简单的数据类型,比如JAVA的基本数据类型,还是String类型。
(2) 和POJO保持极大程序的相似,便于用工具类来拷贝。但要注意类型不同的属性名称不能相同。
(3) 要兼顾页面显示和数据库存储,设计要相对宽松。
4. 为什么使用ExtJS?
用最少的代码做出做炫的效果,这大概是extjs最吸引人的地方。基于对象、组件,便开发更轻松,调试更方便。为开发者屏蔽了浏览器间的差异(呵呵,这个是所有JS框架都提供的)。很酷的如例子Desktop、Portal、Organizer。Tree、TabPanel这样常用的东西,就直接封装成组件,并外挂很多事件函数。Ajax使用起来非常方便,直接request相应URL,参数以JSON传递。返回的也是JSON,{success:true}或{failure:true},就可以执行success或failure时设定的任务。还可以很方便地继承扩展类,制作更适合自己的类。extent函数就是专用的。和其它的编程语言一样,extjs可以添加成员,添加函数,添加事件。所有的这些,也都是JSON的格式。Organizer例子中,扩展出一个新的组件:ImageDragZone。这个组件可以直接在其他程序中复用。