多层架构和MVC

为什么使用框架

*大家都是用同一个框架,是代码更加统一,更易于维护和管理,大家都遵循同样的规则,交流也会变得简单

*struts处于表示层(Presentation Layer)
*sprint处理业务逻辑层(Business Layer)
*hibernate处于持久层(Presistence Layer)

分层的思想嘛,程序的被划分成更小的粒度,粒度细了,每一层的职责也就更加单一,复用率就会变高,当然程序的耦合性就降低了,扩展性也就增加了 但是层也不能无限制的分,层越多程序的效率越低,因为一个处理流程可能需要数据在多层之间的传递,其中比较优雅的分层式三层架构,它是经过长时间的实践而得出的运用最广的分层模式,技能运用分层带来的好处,也不怎么影响性能 当然也不是说一定要使用三层架构,分几层也是需要具体需要而定的。

 

三层架构和MVC


 三层架构中,DAL(数据访问层)、BLL(业务逻辑层)、WEB层各司其职,意在职责分离。 三层架构意在下层位上层提供服务
MVC是Model-View-Controller,严格说这三个加起来以后才是三层架构中的WEB层,是一种设计模式
也就是说,MVC把三层架构中的WEB层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;
而C层直接与三层中的BLL进行对话。


MVC


 它是分层思想的一种运用,都是为了实现职责的分离,起初MVC是为桌面系统而提出来的一种设计模式,但是由于这种设计模式在框架上大量的使用,使它成为表示层上用的比较火的一种设计模式
MVC(模型-视图-控制)实际上就是对java web开发的model1进行再一次拆分
在model1实现了数据和现实分离的基础上在将显示分割成控制器和视图,让他们的职责更分明,视图只负责显示,而控制器负责获取表单数据,调用业务逻辑,页面的转发
model1体现为jsp+javaBean这样一套开发思路,其中jsp既负责显示,又负责业务逻辑。
model2(也就是MVC)体现为jsp+servlet+javaBean这样一套开发思路,其中jsp只负责数据呈现,servlet负责业务逻辑。
--xml中的限制是通过xsd或者dtd来约束的
--struts
首先,我个人认为很多的servlet会造成资源的浪费,因为servlet在第一次被调用以后,会常驻内存,
虽然是提高了再次调用时的速度,servlet也是是单例的,但也消耗了很多的系统资源,而struts只用到了一个前段处理器actionservlet。当然这不是权衡的关键,因为服务器端缓存和资源占用本身就是个需要权衡的东西,我前段时间用.c#实现了hibernate的数据lazy,结果效果不是很理想,但是后来才清楚服务器端资源的是宝贵的,不能一味的最求访问速度,我也不知道两者性能上有多大差距,但是大量的servlet实例放在服务器内存里面反正我是不太喜欢
所以struts能阻止servlet的膨胀也是他的一个优势,action方面也能通过dispacthAction来避免服务器资源占用太过的问题
还有就是通过配置文件中就能分析整个系统的走向,总比要通过分析一大堆的servlet要来的直接和简单些,况且配置文件加反射的机制和对策略模式恰到好处的运用本省就能给程序带来更高的灵活性。
其次,最重要的是,struts帮助我们做了很多前期的工作,比如他会自动给填充表单数据,并提供使用,底层的东西我们在挨个挨个的自己写了。当然这也是框架本身就能给我们带来的好处,不局限于struts,并且使用框架也能起一定的约束作用,因为都遵循一定的准则就像我和一个中国人交流总要比外国人方便一样
--servlet配置中<load-on-start>2</load-on-start>
表示在web容器启动的时候初始化servlet,最好这样配置,因为actionServlet在init方法中做了很多准备工作
--struts运行流程
首先谈谈实现MVC的框架的核心实现思想,很简单,都是使用一个控制器接受所有的请求,然后将请求分发到不同的处理类上,在处理类上调用业务逻辑,通过处理类的返回信息转发的相应的页面
作为struts也不例外,首先使用一个叫actionSrevlet的servlet作为前端处理器,并且通常情况下该servlet会截取到客户端所有的请求,然后分析url,进行表单数据的收集构造actionForm实例,将请求分发到具体的action实现,在action中负责业务逻辑,并返回转向信息,再由actionServlet解析后分转发 首先在actionServlet截取到一个请求之后,在该servlet的service方法中会构造一个叫RequestProcessor类的对象,并调用该对象的process方法来详细的处理请求
在这个方法中,首先第一步,他会截取request对象带过来的url。
截取到这个url后,开始获取该url对应的actionMapping对象,该对象对应了一个在struts-config.xml中配置的一个action标签的所有信息,通过在actionServlet的init方法中准备好的actionMappings这个hashMap中去找这个url对应的actionMapping实例,其中这个map的key就是actionMapping的path,value就是actionMapping对象,所以他通过这个url起比较key值就能找到
通过url找到了改actionMapping配置信息后,然后处理actionForm,首先他判断有没有该actionMapping对应的actionForm配置信息,如果没有则返回,因为并不是所有的action都不要数据收集
如果有actionForm对应的配置信息,也就是说该action需要actionForm,那么首先它会从在actionMapping中配置的scope范围去找有没有actionForm这个事例,如果有直接使用找到的这个actionForm,如果没有创建它,并将其放入到scope范围中,以便下一个页面也能使用
好了,到这里已经完成了actionForm对象的创建
创建完成后他会执行数据的收集,收集数据之前他会调用该actionForm实例的reset()方法,做数据的重置,然后才是收集数据,在收集数据的过程中,它会借助一个临时的map对象,其中key放表单输入域的name,value放表单输入域的value,然后通过beanUtils的一个方法将这个map中的数据设置到上面的到的actionForm中去
数据收集完成之后调用actionForm的validate方法进行验证,它的处理方式和声明是异常的处理方式完全一样,因为都调用一个处理方法processException()进行处理,这里面还有很多细节就不挨个说了
数据收集完成之后开始创建action对象
和上面的处理机制差不多,首先他会通过actionMapping中的type取得该action的完整路径,然后通过在actionServlet的init方法中准备好的actions这个map集合中去找有没有这个实例,如果有直接用,如果没有创建,并放入acions这个map集合中
所以整个action的生命周期中只有一分action对象存在。
拿到了action实例之后,调用它的excute方法,处理请求。然后解析该方法返回的actionForward对象,进行页面的forward或者redirect.转向到一个jsp或者继续转向到其他action中处理
最后通过jsp引擎生成servlet等一系列操作,response数据到客户端,完成本次处理

posted on 2011-09-09 13:32  xcopys  阅读(531)  评论(0编辑  收藏  举报

导航