Web开发的一点心得(二年工作总结版)

//2006-11-29 23:21

开发Web方面的程序已经有一段时间了,下面总结一下我对Web开发的看法.可能有些认识的还不够深刻和正确,见笑 :)

Web程序的开发我认为大约分4个层次:
1.表现层 (represent layer)
2.控制层 (logic control layer)
3.业务逻辑层 (service layer)
4.数据存储层 (persistent layer)

一个标准的系统大致就是做3件事,I(Input)P(Process)O(Output),也就是输入,处理,输出.在Web开发方面也是一样.

由于开发,部署,移植,性能和代码可重用性的考虑,Web开发将IPO分为了若干层次.我对我上面所说的4个层次作简单的解释:

1.表现层:
 此层的主要作用是:向用户展示信息,并且得到用户输入数据和向用户展示处理后的反馈.
 
2.控制层:
 此层的主要作用是:为了让开发人员和维护人员方便控制Web页面的流向,一目了然的对其走向进行控制.同时此层也可以进行一些简单的预处理,使业务逻辑避开本不该它们触碰的外部检测.此层的大部分任务是程序走向的控制,小部分任务是一般预处理和检测功能.

3.业务逻辑层:
 此层的主要作用是:进行用户所要关心的业务逻辑,进行整个程序的核心业务处理,此层一般会使用从表现层传入的数据并调用数据存储层的接口来进行相应的查询和更新删除保存功能.并将最终处理结果反馈给控制层,由控制层根据处理结果去寻找表现给用户的路径.

4.数据存储层:
 此层的主要作用是:进行数据的查询和持久化过程.

由于每一层对应的开发在现实世界中都有很多相应的技术和框架进行支撑,所以我会简单的介绍一下发展的历史和相关框架.

1.表现层顾名思义就是表现给用户看的东西,同时也应能够得到用户的输入数据.在Web上面就是用html表现给用户和得到用户提交的表单数据.
1.可是要表现出来的数据很多都是动态的,是从业务逻辑中得到的,业务逻辑中的数据或许是从数据库或者socket端口等地得来的,要怎么把这些动态的数据方便的表现给客户呢?
1.为了实现这个目标就会出现相应的技术来支撑,以前是CGI,但在java方面最开始出现的是servlet,可是人们发现用servlet开发,想在把数据显示在页面上的时候要整屏幕的写满:out.print()之类的话语,逻辑和表现常常混杂在一起,不易维护也不易开发和美工.
1.后来sun就把servlet包装了一把,取名叫JSP.JSP就是servlet的一种变形,是运行在服务器上的,大家可千万不要像以前的我一样以为JSP和html一样运行在客户端.JSP把Java程序开发和request对象,session等对象的存取和网页开发融合在一起.但是开发中常常会出现大量的java代码混杂在JSP中,造成了阅读和维护的困难,而且对分层和清晰还有复用都没有一点好处.
1.在后来就有了taglib标签,为的是减少不断出现在页面上的代码,对于不可避免的一些是非判断,循环表示,信息表达,进行了封装,把代码移到一个个java类中去了.在使用时只用调用其标签和传入参数就好了,开发人员也可以自己继承tag的相关接口进行所需要的开发.
1.在再后来,出现了很多各有优点的JSP竞争者,比如很多模版库(如Velocity,FreeMaker)等.标签库也变得越来越丰富了,官方也提供了很多标准标签库供人们简化方便使用.但是不要忘记无论是JSP还是Velocity或者FreeMaker都是要被一个模版引擎解释编译成相应的html代码的,所以在web.xml中都要配置其相应解释引擎的类.
1.现在Ajax的非整个页面的刷新前端的技术也流行起来了,其框架层出不穷,在需要其提供的特性时可以考虑使用.

2.控制层很久以前一般都是使用servlet来进行业务逻辑的处理,再用request.getRequestDispatcher("targetURL").forward/include(request,response)或者response.sendRedirect("targetURL")进行页面流程的转发.前者request方法和后者response的区别就是request和response的信息是否丢失和URL标题是否改变的区别.request的forward()方法会将request和response的信息完好无损的传递给下一个servlet但是浏览器看到的URL却不会改变,而response的sendRedirect()方法则丢失了request和response,但是URL路径会改变.
2.后来在开源世界中出现了一个流行的MVC框架叫做struts,它的1.0版从2001发布,到现在已经快5年了.它是那个年代MVC的典范,用一个ActionServlet作为中心控制器,页面的流向从struts-config.xml中配置.用继承ActionForm的Form通过框架的反射功能自动映射了网页上的同名元素,省去了request.getParameter("name")的步骤.并在Action中进行一些处理和流向控制(千万不要把这里当做处理业务逻辑的地方,这里应该调用业务逻辑层的接口,将页面上传入的数据封装成VO传入接口的方法中,这里的action最好只起到一个流程控制的作用).
2.很久以前struts由于一些被别人看不好的特点,也出现了很多相应的竞争者,如webwork(此框架现在已被struts纳入怀中,准备取长补短融合为struts2.0),springMVC,Tapestry都各有各的优点.

3.业务逻辑层的业务逻辑原先都是在代码中用new来创建实体类,用其进行处理和检测,但是变化多端业务逻辑常常让开发人员更改和实现不同的相关代码,虽然已经使用了接口来编程,但是当实现类变为另外一个实现类的时候还是要在代码中改变其new的对象,然后还要重新编译和部署.
3.后来的人们通过java的反射技术和CGLIB实现了一种叫做IOC/DI的技术,其实就是: 把new 某个接口的具体实现类 'SomeInterface si = (SomeInterface) new SomeInterfaceImpl();' 这个动作用一个工厂方法来代替'SomeInterface si = (SomeInterface) applicationContext.getBean("yourConfigedClassId"),然后把new这个Object的名字从代码中移到配置文件中去,把类名写进配置文件,标上个id,比如是例子中的yourConfigedClassId,然后在代码的getBean()中,传入所需要的id名称,通过反射来进行注入和赋值.当有业务逻辑有更改的时候,只须改变配置文件中配置的具体实现类名,不用改变原有的程序,也不用重新编译业务逻辑代码,只要简单更改配置文件就行了.
3.IOC/DI(控制反转和依赖注入)就是把实例化哪个类的控制权由程序转移到配置文件中,代码中只写接口和传入配置名字的id的工厂方法,程序运行的时候,根据配置信息,把所配的类通过反射注入到程序中.
3.业务逻辑还有很多要注意的事项,比如说写日志阿,事务阿,什么的.有人利用java的动态代理和CGLIB实现了面向切面的编程技术AOP支持.AOP根据切面把所有的进入点统一进行处理,将分散的代码集中在一起进行管理.
3.后来由于各种各样轻量级现实的需要和EJB的重量,有个牛人就写了一套IOC/AOP为核心的Spring框架的轻量级解决方案,很方便的给予了相应的技术支撑,让开发人员乐在其中.
3.不知道我把此层的意思表达清了没,有些话看起来好像挺绕嘴?

//天色已晚,明日还要上班,有空再继续写 :)  2006-11-30 01:26.

//2006-11-30 23:01

4.数据存储层方面一般牵扯到两个概念,一个是DAO,一个是ORM.
4.DAO就是Data Access Object,这个模式旨在解决一个简单的问题:数据访问代码应该放在哪里?这种模式最典型的结构就是:a.一个数据接口工厂类;b.一个数据访问接口(如接口中定义的create(),find(),delete(),update()方法);c.实现数据访问接口的具体实现类;d.值对象(Value Object)这样可以把数据访问的方法抽象在一个接口中,不同数据库的存取代码实现在implement接口的相应实现类中,这样如果有变动或更改(如数据库表的改变或移植到其他数据库),业务逻辑只调用接口,具体实现类的变动便不会影响到上层.
4.ORM就是Object Relation Mapping,因为现在关系数据库已经变得非常成熟,所以大部分数据库依然是关系型的,这样就造成了用jdbc存取出来的ResultSet转变为一个Value Object的冗余代码,也造成了插入和修改的大量代码,最重要的是当数据库表进行了变化的时候,要更改很多处地方,很不方便.ORMapping就是运用反射和动态代理把相应的数据库表映射为一个值对象,极大程度的方便了开发和使用.但是一切遵循的规律就是得到一些,失去一些,得到方便的同时,你不得不告诉程序你要怎么来进行相应的映射,也就是XXX.hbm.xml文件的配置.
4.由于社会有ORM这个需要,便出来了一个名叫Hibernate的框架.Hibernate是ORM的一个非常方便的实现框架,它的优点就像其他很多框架一样有很多,一言难尽,我感觉如果想掌握它的精髓就是了解框架的结构,明白配置文件编写,学会使用HQL.开源世界中还存在一些好的ORM框架,如ibiats,等.
4.关于数据存储层的演化,我的同事小罗每当看到xiaxin和其他两人一起写的<深入浅出Hibernate>的第一章1.2和1.3节的时候都会不由自主的发出感叹:'这部分写的实在是太好了,一步一步由浅入深,一步一步简化,每次当你觉得已经简单的不能再更简单的时候,总会有新的方法来解决,一步一步,最后当一切都用完了,一切都不能再进步的时候,你一抬头,Hibernate出现了.'

Web开发方面我的理解现在只到达了这种水平,这是我十一躺在从家里回深圳的火车上,躺在下铺,望着中铺白底板时突然悟到的,对你的职业一定要'通透',是我当时唯一的感觉.

接下来我打算写一些简单的文章,我的小说还在酝酿中,我发现荒诞小说要是没有一个具体的剧情,看起来似乎不能引人入胜,这是我在看<涨潮海岸>电影时发现的.

呀,跑题了.

接下来我打算写一些简单的文章,只是介绍一些基础的小文章,因为我上周日去逛八卦三路的图书批发市场看到还有人在买struts方面的书,我的一个同事都说struts过时了,我想总要为大家贡献些自己的力量来帮助新人,让他们能够分享些我的经验.

又快跑题了,下面我的文章准备这个顺序写,,,.Spring之所以放在最后是因为它可以起到一个融合这几个框架的容器功能.

其实我说要写的文章就是想把我认为题目里面比较重要的东西说出来,最核心的,最常用,最必须知道的东西简单的说一下,做个引导,具体细节市面上有很多很多书可以看啦. :)

ps:每个框架都有其优缺点,都有其适应的环境,请分析好需求在选择,不要盲目的跟风,但可以学习. :)

12月2号听说窦唯要来深圳,报纸上说它在上步店和南山店,不过是什么店却没说,<雨吁>里面他终于开始发音了,好开心. :D

//2006-12-01 0:56 finished

//12-06 23:19 最近看了几家国际性大软件公司的面试要求,发现他们都要求会EJB和Web Service,可我只是了解些简单的概念,还没怎么接触过呢,有空打算学习一下.大公司原来都不用开源框架阿,真厉害,这可怎么办呢.何去何从?  P:

//12-12 00:37 听同事说:大多银行系统都需要用EJB,因为他们常常牵扯到多个数据库和分布式,大公司需要的主要是稳定的系统架构,要商业化的稳定,不需要频繁的发布和更新的版本.看来我得更加全面的学习和了解整个行业的动向阿,以前我看网上的评论,都以为EJB已经没人用了呢,这回也要学习一下了,还有Web Service.不过要学习的东西真的好多阿,得一步一步来,千万别急,踏踏实实. 最近在重新温习SQL语言,从头到尾在学习一遍.我现在再听yw送给我的雅尼音乐会. :)
<游戏开发中的人工智能>出中文版了,上周日下午的时候在购书中心发现的,还有一本好像叫<大型MMP网络游戏的构架>之类的书,都是很不错. 计划,我现阶段技术方面的计划暂时是重温SQL,快速重温Struts,快速重温Hibernate,仔细重温Spring,然后把这三个框架组合在一起的那几个项目的代码好好学习研究一把,看看它们之间现实中真正是怎么使用的,多看几遍,理解深入.然后简单了解Ajax的原理.然后就开始学习EJB,先速度稍快的全部学习一遍,不要求每个细节,只了解大致构架,目的,好处,用途.然后稍快的浏览一下Web Serivce,达到目标同EJB.然后再回过头来学习一遍前面这些项我那时认为重要的和需要掌握的.每一次学习完毕都要总结一下经验,让潜意识去处理.恩,现在我也只能暂时计划到这里了.
飞速发展,飞速发展. 明年3月,xxx等着我啊.

//12-13 00:36 其实一直想,学习这些也只是一个开发层面的人,运用别人的框架和技术进行架构和编码一些系统,其实只是工具使用者的另一种形式.学习人工智能才是真正的出路,开发拓展新的领域,让我们给机器灵魂吧.
昨天在关外打的来着,和绿的司机聊起来,他说他们一个月上交给公司的大约得一万三左右,我一听,我的天,我这一年多混下来,存折里现在只剩下35块钱.的士司机竟然一个月就上缴给公司那么多钱,那他们一个月得赚多少钱啊,我真的是属于低产阶级阿,平时我还以为我比的士司机赚的钱多呢,真可怜,无语了. :) 

你可能感兴趣的:(经验总结)