基于MVC系统架构模式中的软件系统控制层设计原则、目标和设计示例
- 格式:pdf
- 大小:102.05 KB
- 文档页数:3
1.1基于MVC系统架构模式中的软件系统控制层设计原则、目标和设计示例
1、设计的原则和目标
(1)控制器的作用
对请求进行处理并实现对业务层组件进行调度。
(2)设计的目标
一般应该分为前端和后端两个控制器,设计的主要目标是如何降低与业务处理层组件的藕合度。
2、控制器设计
(1)前端控制器
通过Filter组件或者Struts中的ActionServlet组件来实现。
(2)各种后端业务控制器
通过Servlet组件或者Struts中的Action组件来实现。
3、关于HttpServletRequest/HttpServletResponse等对象
控制层中的数据结构,例如HttpServletRequest/HttpServletResponse等对象,应该被限制在控制层上。如果将这些对象或者数据传递到其它层(主要是业务逻辑层)中,将大大地降低了代码的的重用性,令代码变得复杂,并且增加了层间的耦合------因为我们希望域对象应该是可重用的组件,如果它们的实现依赖协议或者层相关的细节,它们可重用性就很差,同时维护和调试高耦合的应用更加困难。=
一个常用的解决方法是不让控制层的数据结构和商业层共享,而是拷贝相关的状态数据到一个更常见的数据结构(比如VO对象)中再共享。
4、常用到的设计模式----命令设计模式的应用
在项目中的Servlet组件中为了更好地对业务模型组件进行调度,采用命令设计模式。通过Command设计模式实现把命令的请求和命令的执行相互分离,对命令的请求者以统一的形式进行命令请求(功能调用)。
详细的实现代码请参考NetBook的Web应用。
NetBookBussBean netBookBussBean=
NetBookCommander.produceCommandRequest(4,dataSource,enCoding,request);
boolean OKOrNot=
netBookBussBean.doNetBookModel(actionMapping,actionForm,request,response);
5、编程实现线程安全的控制层组件
(1)控制器Servlet仅仅创建一个类的实例
控制器Servlet仅仅创建一个类的实例,并用于所有的请求。这样需要编写Servlet 类使其能够在一个多线程环境中正确运行。帮助线程安全编程的最重要的原则就是在你的Servlet类中仅仅使用局部变量而不是实例变量(类中的成员变量)。
因为局部变量的创建于一个分配给(由JVM)每个请求线程的栈中,所以没有必要担心会共享它们。
(2)控制器Servlet默认是以多线程方式执行的
由于Servlet和JSP默认是以多线程方式执行的,这是JSP与ASP,PHP,PERL等脚本语言不一样的地方,也是它的优势之一,但如果不注意多线程中的同步问题,会使所写的Servlet或者JSP程序有难以发现的错误。
由于当客户端第一次请求某一个Servlet或者JSP文件时,服务端把该JSP编译成一个CLASS文件,并创建一个该Servlet或者JSP类的实例,然后创建一个线程处理客户端的请求。如果有多个客户端同时请求该Servlet或者JSP文件,则服务端会创建多个线程。
每个客户端请求对应一个线程。以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间。
(3)采用局部变量代替实例变量
1)因为实例变量是在堆中分配的,被属于该实例的所有线程共享,不是线程安全的。
2)而局部变量在堆栈中分配,因为每个线程都有它自己的堆栈空间,所以这样线程就
是安全的了。
6、编程实现线程安全的Struts框架中的Action 类
控制器Servlet(ActionServlet)仅仅创建一个Action 类的实例,并用于所有的请求。这样需要编写Action 类使其能够在一个多线程环境中正确运行,就象你必须安全地编写一个servlet的 service() 方法一样。
帮助线程安全编程的最重要的原则就是在我们的 Action 类中仅仅使用局部变量而不是实例变量(类中的成员变量)。
因为局部变量的创建于一个分配给(由JVM)每个请求线程的栈中,所以没有必要担心会共享它们。