接着JavaBean的是JSP的开发模式,这属于一个比较深入的话题。但是这里做了一个详细的介绍。对以后的Java Web开发框架的学习有很大益处的。在书或者视频上,详细介绍了MVC设计模式和JSP开发模式,同时分别用JSP中的两种模式演示了用户登录和注册功能。
    在开发一个软件之前,必须先设计好其架构,一个基本的架构思想是将软件分成不同的模块,问题的关键就是如何划分模块。MVC(模型-视图-控制器)是20世纪80年代为Smalltalk-80编程语言发明的一种软件设计模式,它是一种分离业务逻辑与显示界面的设计方法。MVC的模型(Model)部分负责管理程序的业务数据,视图(View)部分负责显示界面,控制器(Controller)部分则负责与用户进行交互(接受请求和选择响应视图)。在这种模式中,一个视图可以查询多个模型,一个模型发生更改时可以通知多个视图,一个控制器可以操作多个模型和视图。采用MVC模式构建的程序工作时,用户根据某个视图的显示信息进行操作,操作请求通过视图组件提交给控制器,控制器再根据请求信息调用模型组件的业务方法修改模型的数据状态。控制器调用模型组件进行处理后,根据模型返回结果选择相应的视图组件显示处理结果和模型中的数据。另外,当模型组件的数据发生改变后,它可以通知与之相关的视图组件更新显示以保持与模型数据的同步状态。模型的"状态改变通知"一般都是使用观察者通知模式来实现的,可以将多个视图注册为一个模型的观察者,模型在数据状态发生改变时,主动给所有注册的视图发送消息。综上所述,MVC的数据模块和现实模块实现了良好的松耦合,只要它们相互连接的接口保持不变,对其中一个得修改不会影响到另外一个,所以,采用MVC模式构建的系统具有极高的可维护性、可扩展性、可移植性和组件的可复用性。
    为了更好的利用JSP来开发Web应用程序,在早期的JSP规范中定义了两种使用JSP的模式:Model 1和Model 2。模式一主要采用JSP + JavaBean技术,JSP页面负责处理请求和输出响应结果,并将其中发生的一些业务逻辑交给JavaBean处理。这一模式最大的特点就是将一次请求的响应过程完全交给一个JSP页面负责,这样JSP做了控制器和视图两个角色的工作。所以该模式不是纯粹的MVC模式。因此模式二借鉴了MVC模式来实现显示内容与业务逻辑的完全分离,它综合采用Servlet+JSP+JavaBean技术,由Servlet处理请求和控制业务流程,JSP输出响应结果,JavaBean负责具体的业务数据和业务逻辑。从以上可以看出,两个模式之间的最大区别就是将处理请求的功能与产生显示内容的功能分配给两个独立的模块来完成。在模式二中,JavaBean是模型,它位于Web服务器端,而最终的视图位于用户的浏览器端,只有浏览器发出请求后,服务器才会做出响应,没有请求就没有响应,所以,在Web应用中难以实现MVC模式的"状态改变通知"事件,视图不能随模型的改变而自动更新。因此,模式二是MVC模式一个变体,通常有人称作Web MVC。模式二由于Servlet不再担负生成显示内容的任务,而JSP也只是简单的从Servlet创建好的JavaBean对象中检索数据,然后将结果插入JSP的预定义模板,从而使不懂JAVA代码的普通HTML设计人员完全可以编写和维护JSP页面。同时,只要各个组件相互连接的接口不变,任意一个组件发生修改,其他组件都不用随之改变。
    视频演示了模式一与模式二,由于以后常用的应该是模式二,所以下面举例说明用模式二实现用户注册功能的设计:
    视图:
      register.jsp为显示用户注册表单的页面,它的注册请求提交给ControllerServlet程序处理。
      logonSuccess.jsp是用户登录成功后进入的页面,新注册成功的用户自动完成登录,直接进入logonSuccess.jsp页面。
    控制器:
      ControllerServlet是作为控制器的Servlet程序,它负责处理注册用户信息的请求,注册成功后跳转到logonSuccess.jsp页面,注册失败时跳回到register.jsp页面重新显示注册表单和失败的帮助信息。
    模型:
      RegisterFormBean.java是封装注册表单信息的JavaBean程序,ControllerServlet将注册表单信息绑定到RegisterFormBean对象上,然后调用RegisterFormBean对象的方法对各个属性(也就是注册表单内的各个字段中所填写的数据)进行语法格式方面的校验。
      UserBean.java为代表用户信息的JavaBean程序,ControllerServlet根据用户注册信息创建出一个UserBean对象后添加到DbUtil对象中,logonSuccess.jsp页面从UserBean对象中提取用户信息进行显示。
      DbUtil.java是用于访问数据库的辅助类,它相当于一个DAO(数据访问对象),这里用DbUtil类中封装的一个HashTable对象来代替数据库,HashTable对象中的每一个元素即为一个UserBean对象。