模式1:
WEB项目几乎全由JSP页面组成,JSP页面负责所有的展示与业务逻辑的处理(业务,数据库连接……)。
缺点:JSP页面兼容了view与controller两种角色,控制逻辑与表现逻辑混杂,导致代码重用性很低,增加了扩展与维护的难度。
模式2 :
基于MVC架构的设计模式,将模型,视图,控制器三者分离,模型采用JAVABEAN来充当,视图采用JSP页面来负责展示,采用Servlet作为前端控制器。三者相互协作,体现了松散耦合的思想。
Servlet控制器主要有2个作用:
1、从客户端视图JSP等组件中接收数据,控制逻辑与简单数据处理。
2、调用JAVABEAN处理实际的逻辑,完成后将数据返回给JSP。
看看MVC模式流程图:
总结出MVC模式的特点:
1、 多个视图对应一个模型,可以减少代码的复制与维护量,并且一旦模型发生改变,只需修改对应的视图页面即可。
2、 将模型返回的数据与视图相分离,数据可以适用于任何显示技术,不再单单局限在JSP页面。例如:webservice , 导出为excel文档……
3、 应用分隔为3层,降低了层与层之间的耦合度,提高了应用的扩展性。
4、 控制层将不同的模型与不同的视图组合在一起,完成不同的请求,可以说是控制了用户请求权限。
5、 更加符合软件工程化的管理,各层各司其职,但是每一层又都具有相同的特征,便于程序代码。
随着MVC模式的发展,01年,Struts1问世,Struts1是第一个完全采用MVC设计模式的框架。03年达到顶峰,但是在不断的应用后,软件需求日渐变化,Struts1出现了局限性以及暴露了其不可修正的缺点。06年 Struts1框架与webwork框架合并,从而诞生出Struts2.
1 Struts设计的第一目标就是使MVC模式应用于web程序设计。
2 Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于Client/Server HTTP交换协议,The Java Servlet API揭示了Java Servlet只是Java API的一个很小子集,这样我们可以在业务逻辑部分使用 功能强大的Java语言进行程序设计。
二是提供了对MVC的一个清晰的实现,这一实现包含了很多参与对所以请求进行处理的关键组件,如:拦截器、OGNL表达式语言、堆栈。
Strust工作原理:
Strust请求与响应可以分为以下几个步骤:
(1) 客户端向Action发用一个请求(Request)
(2) Container通过web.xml映射请求,并获得控制器(Controller)的名字
(3) 容器(Container)调用核心控制器StrutsPrepareAndExecuteFilte或者FilterDispatcher ( Struts2.1.3之前用FilterDispatcher,在Struts2.1.3以后调用StrutsPrepareAndExecuteFilter)
(4) 控制器(Controller)通过ActionMapper获得Action的信息
(5) 控制器(Controller)调用ActionProxy
(6) ActionProxy读取struts.xml文件获取action和interceptor stack(拦截器堆)的信息。
(7) ActionProxy把request请求传递给ActionInvocation(Action调度者)
(8) ActionInvocation依次调用action和interceptor
(9) 根据action的配置信息,产生result
(10) Result信息返回给ActionInvocation
(11) 产生一个HttpServletResponse响应
(12) 产生的响应行为发送给客服端。
Strust2工作流程分析:
ActionInvocation (Action调度者)。
ActionMapper在WEB服务启动时加载。
Interceptor 一系列拦截器的作用是:将request请求的数据解析给XXXAction(业务控制器)。
1、客户端(不一定就是JPS页面)发起请求, 经过一系统的filter后达到StrutsPrepareAndExecuteFilter/FilterDispatcher(核心控制器)【StrutsPrepareAndExecuteFilte或者FilterDispatcher ( Struts2.1.3之前用FilterDispatcher,在 Struts2.1.3以后调用StrutsPrepareAndExecuteFilter)】。
2、核心控制器读取ActionMapper,问询该Action是否存在,如果不存在则返回错误。 如果存在存在则将该请求转交给ActionProxy。
3、ActionProxy读取配置文件struts.xml,查看是否需要表单验证, 如果需要则调用验证框架的validate()进行表单验证。
4、验证完成后,将请求的数据解析出来通过ActionInvocation交给具体的业务控制器 处理。
5、处理完的结果,通过forward请求JSP或其他视图,解析成response, 并返回StrutsPrepareAndExecuteFilter核心控制器,由核心控制器向客户端进行展示。
下一章创建一个简单的Strust框架!