虽然这是一个功能很简单的基于Web的应用程序,但是经过认真地探索,最终设计出了具有健壮性,灵活性,可重用性的基于层模式的Web应用的架构。
Ø 基于层模式的Web应用的架构中不同层的作用:
1. 表示层:表示层就是客户端,为用户转换工作流层返回的结果。它包括客户端的软件组件、应用程序、Web浏览器等。这些不同形式的客户端能够以可视形式提供丰富、灵活的用户交互界面,用来表示信息和收集数据,并利用业务逻辑层提供的功能服务完成用户请求,并且还可能会执行一些简单的业务逻辑,比如对用户输入的数据进行简单的检查。整个业务处理的结果最后回传给表示层。
2. 控制层:这是体系结构下的一个业务流程控制层,也称为业务接口,它提供了一个到表示层的简单界面(也称为接口)。工作流层管理内部状态,并使用业务逻辑层提供的自动操作来完成复杂的工作流。
3. 业务逻辑层:业务逻辑层通过隐藏来自更高层的事务逻辑和实施细节来提取业务事务,用于实现业务逻辑以及事务规则处理。这一层是分布式应用系统的关键所在。它负责处理所有来自外观表示层的用户请求,当它通过数据服务层提供的接口处理完请求之后,还要把处理结果返回给外观表示层。这层通常也被称为中间层。业务逻辑层提供执行业务的规则,为具体应用提供事务处理、安全控制以及为满足不同数量客户端的请求而进行性能调整等功能。
4. 数据访问层:数据层的上一层为数据访问层,也称数据持久层。它从数据库中数据的表示形式中提取数据,完成数据的定义、维护、访问与更新,并且包含所有数据库操作公用的例程。数据访问层直接由业务逻辑层使用,管理并响应业务逻辑层的数据请求。
5. 数据层:它距离客户端最远,其中存储了应用所需的信息。
最终的类结构如下图所示:
Ø 用MVC模式来设计表示层,控制层,业务逻辑层,我的blog里有关于MVC模式的介绍:http://blog.csdn.net/lin_bei/archive/2006/08/18/s1093749.aspx,
关于MVC模式的两种实现形式Mode1跟Model 2的比较,http://blog.csdn.net/lin_bei/archive/2006/08/18/1095236.aspx ,
本实验对这两种实现方式都运用到了:
ü 对于学生注册模块,使用Model 1来实现:
这种以JSP为中心的实现方式,详细的实现方式解释如下:
从上图各个jsp页面可以看出来,student.jsp(学生注册页面)充当Model 1里的表示层(View)跟控制层(Controller)的角色,也就是说在student.jsp这个代码里显示用户注册的JSP代码,也有业务流程代码,用来选择下一个要显示的页面,如果说注册成功则是thanks.jsp(addStudent_success.jsp),如果是注册失败则是error.jsp(daoerror.jsp)。而在Controller(student.jsp)里调用了Model层的StudentService类:
这样整个Model 1的架构就很清晰了,我们可以发现这个过程里一个Servlet也没有用到,这就验证了那句话:“Model 1是以JSP为中心(JSP Centric)的设计模型”。
ü 按照实验说明,对于选课模块,使用Model 2来实现:
这种以Servlet为中心的实现方式,详细的实现方式解释如下:
对于上图,对应MVC模式的Model 2实现方式:
显示层(View):register.jsp(作为控制层的输入),register_success.jsp(作为控制层的输出,如果学生选修该门课程成功就转到这个页面),daoerror.jsp(作为控制层的输出,如果学生选修课程时发生错误,如已经选修了,就转到这个错误页面。),
控制层(Controller):RegisterServlet.java(它负责接收客户端请求(控制层的输入,register.jsp)并处理此请求:doPost,将它传递给合适的JSP(success or error))。
模型(Model):RegistService.java Student.java Register.java LessonService.java Lesson.java,MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要。抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只告诉你应该组织管理这些模型,以便于模型的重构和提高重用性。在这个实验里,也是按“以便于模型的重构和提高重用性”的规则来设计Model的。另外,模型是所有的商业逻辑代码片段所在,从上图也可以看出模型提供了两种对象:业务实体对象(Student,Register,Lesson)和业务处理对象(RegistSerivce,LessonService)。业务处理对象封装了具体的处理逻辑,业务实体对象可以通过定义属性描述客户端表单数据。业务处理对象RegistSerivce等并没有直接对可持久的数据进行操作,而是通过那些DAO接口来操作,这也是为了“以便于模型的重构和提高重用性”。
对应下图,我们可以发现这种实现方式跟Model 1相比的不同之处。