作者:yarshray
关键字: Java J2EE MVC JSP Servlet MVC Struts
内容简介:
MVC设计模式成为了目前十分流行的一种设计方法.它是一种软件的设计方法模式.并且被大量的开发和实践所证明.因此本文通过介绍Struts框架这种已经实现了MVC模式的软件构件框架了讨论该模式的优势和如何投入到软件开发中去.
本文内容注重理论和实践相结合,比较系统的从多层设计方式到分布式软件开发中所用到的技术,从而切入目前Sun公司退出的J2EE框架模型,然后更加该框架讨论了与之相关的技术,包括JSP,Servlet,用户定义标签等相关主题,然后讨论其优势和缺陷,最后引出文章的主题,Struts框架,该框架通过实现MVC设计模式从而改变了以往的设计方法,使得开发一套基于J2EE框架的应用程序十分具有广泛的适应性和极高的效率.
名人名言:
如果我比笛卡尔看得远些,那是因为我站在巨人们的肩上的缘故。
──牛顿
具有丰富知识和经验的人,比只有一种知识和经验的人更容易产生新的联想和独到的见解。
──泰勒
引言:
现阶段软件开发已经进入了面向对象,组件化,分布应用的阶段.Sun 公司推出的Java2 Enterprise Edition(J2EE)平台已经日趋成熟.并得到了广泛的应用.J2EE中所定义的Web容器中的WEB组件也成为了目前开发WEB应用主要工具和手段.JavaServer Page (JSP)技术,几乎是每一个JAVA WEB应用开发的必须开发组件.
目前的Web容器也是繁花似锦,一些免费的开源的组织也加入到这项运动中来了.如Apache软件组织提供的Tomcat就是一个非常优秀的Web容器,这也推动了Java的Web应用的发展.随着Java的Web技术的成熟和市场的巨大需求.越来越多的开发人员都开始使用一些已经被开发所认同的开发框架了.而现在软件开发的思想观念已经不是”我们是否要使用软件框架” 而是说 ”使用什么软件开发框架”.
因此,选用优秀的开发框架是作为一个软件开发人员所必须的.Jakarta-Struts是由Apache软件组织提供的一套开发源代码的项目,它实现了模型---视图---控制器(Model---View---Controller) MVC 设计模式.其广泛的适应性和高度的扩展能力加上对生产效率的极大提高成为了目前Java的Web开发所逐步认可的标准.
当然,作为我们这些开发人员也同样是一种挑战,我必须要理解这些新的观念和认识并接受这一开发模式的带来的优势,这需要我们对理论的理解和大量的开发实践.
Java WEB应用程序介绍
Java Web应用就是通过在Web容器上开发和部署Java的Web组件来构建应用的工作.其包括的技术主要是Java Server Page 和 Servlet 技术.此外开发一个完整的Java的Web应用还包括以下一些技术:
l JavaBean组件技术
l EJB组件技术
l 用户自定义标记库
l XML标签语言
l J2EE相关容器
图 1 Java Web 应用的技术结构
Servlet控制器组件技术
Servlet在一个典型的Web应用中担任的重要角色就是Servlet非常适合做Web页面之间的消息转发器.因为Servlet是一个被Web容器动态加载的组件模块,它并不十分适合做用户的界面表示,而当Web用户发出请求的时候Servlet组件可以通过Servlet容器来捕获这个请求消息,这样它可以调用模型组件来出来这个消息.
图 2 Servlet 的处理流程
当客户程序(如: 浏览器)首先向Servlet容器发出Web请求,服务器接受到请求以后会调用相应的Servlet组件来执行相应的程序来完成这个请求,然后Servlet组件吧处理结果交给Servlet容器,再由Servlet容器把请求回复给客户程序.这也是一个典型的web应用的执行过程.Java的Servlet技术提供了一组用户的编程接口为开发人员定义了相关的类.
Servlet Api中以下几个比较重点的类决定了Servlet的处理流程:
l HttpServlet :该类提供了用户扩展的能力,用户通过继承该类编写Servlet组件.主要填写Http方法(如: doPost doGet)完成服务.
l HttpServletRequest: 该类提供了接受用户请求数据的能力,该类通常是由Web容器在一次客户请求服务中创建的.Servlet可以通过该对象访问到请求时用户的请求数据.
l HttpServletResponse: 该类用于生成执行后的相应结果.该类也是由Web容器在服务中创建的.
l HttpSession: 该了同类处理客户的会话跟踪.
l ServletContext: Servlet容器为每个Web 应用模块都提供了一个环境来保持该应用模块的状态.这组状态是该模块中所有Web组件可以访问到的共享信息.
以上对Servlet组件有了一个大体的介绍,如果要深入了解有关Servlet的技术可以访问站点: http://www.servlet.com .那里会有详细的介绍.
JSP组件技术
JSP组件技术是对传统静态Web页面(HTML)的扩展,使得传统的静态页面可以加入Java的程序代码,以提供程序编辑产生页面的效果.并且该组件技术也运行的J2EE Web容器上的组件技术.
JSP的本质实际就是Servlet组件技术,只是JSP技术更利于用来做用户的表示界面.
图3 Web容器初次执行浏览器请求处理JSP的过程
JSP页面在初次接受到用户的请求的时候,首先Web容器会翻译JSP脚本文件,然后生成Servlet源代码,在把Servlet源代码编译成java的ByteCode 生成Class文件.然后同Servlet的执行过程一样处理页面流程.
如果读者想更进一步了解Jsp技术,可以http://java.sun.com/products/jsp/ 该站点可以获得更多帮助.
JavaBean组件在Web应用程序的作用
JavaBean 是一种符合特定规范的Java类.在JavaBean中定义了以系列属性和方法.我们通常可以把业务对模型和业务流程模型封装在JavaBean中,简单的说JavaBean很适合在Web应用中充当模型组件的角色.
JSP标准标签中已经定义了一组对JavaBean支持的标签.并定义了JavaBean对象在执行过程中的生命周期.包括 page ,request,session 和 application 四种范围.并提供了对JavaBean访问时的属性支持.
如果要详细了解有关JavaBean,读者可以参考 http://java.sun.com/products/javabeans 站点提供了非常详细的介绍.
用户定义标签
JSP中的用户定义标签为开发者提供了很好界面和功能扩展能力.它支持用户可以在JSP页面中定义相应的业务标记.通常这些标记继承自TagSupport类.并通过重写TagSupport类的相关方法来扩展功能.
在Struts中,Struts框架定义了一组用户标签.其主要包括:
l Bean标签,用来支持JavaBean的访问
l HTML标签 用来支持HTML界面元素的创建和访问
l Logic标签 用来支持逻辑执行
l Neted标签和Tiles标签 用来支持界面表示
EJB组件技术
Enterprise Java Bean 简称 EJB 是一套基于标准的分布式对象组件技术.它是CORBA和 RMI的服务器端Java组件.EJB技术和JavaBean技术一样在企业开发中处理业务逻辑.他们的区别在于EJB组件是分布式的必须运行EJB容器中.而JavaBean组件是运行在调用方内存的组件.
EJB定义了基本用来处理业务流程逻辑的会话Bean和用来维护业务持久状态的实体Bean.以及处理基于消息驱动的消息Bean.
EJB组件所以运行的EJB容器,为EJB组件维护了安全性,事务性,持久性,并行性,等多种服务.并提供了开发,部署,运行等环境的支持.
读者可以访问 http://java.sun.com/products/ejb/index.html 中深入学习这些技术.
XML标记语言
XML标记语言可以用来定义用户自己的标记.XML在WEB服务中使用的非常广泛.如SOAP协议就是由XML定义的.XML可以定义非常通用化并利于被应用程序处理的信息结构.
在Struts框架中XML起到了黏合剂的作用,可以用来配置Struts框架中的各组件的组成框架.
读者可以通过访问 http://www.w3schools.com/xml/default.asp 获得更多的学习资料.
J2EE相关容器
现阶段任何一个分布开发都离不开服务器.对于Web开发则时Web服务器,Web服务器通常用来处理Http请求和回复工作,并提供了安全性,事务性,多任务并行性.现代Web容器还提供了可编程的用户接口.而分布式开发中应用程序的逻辑部分通常放在应用程序的中间件服务器上.EJB容器就是这样一个中间件服务器.该服务器提供了对EJB组件的运行环境的支持.并提供对RMI—IIOP等远程对象调用协议的支持,使得开发EJB组件这里中间件比较容易.使得开发人员更多的关心的是业务逻辑问题.
目前比较流行的开源的Web服务器主要是Apache软件组织的Tomcat服务器.Tomcat不仅是一个优秀的Web服务器更是一个十分便捷的Servlet/JSP容器.而开源的EJB容器比较有代表的当数JBoss 它是由JBoss软件组织开发的,其性能稳定可靠,并有着非常高效的执行速度.
MVC设计模式概述
一般而言,一个计算机程序包括其输入,处理,和输出.而MVC设计模式把输入,处理和输出部分独立成为了独立的程序部分.并在系统运行时将其结合,这样使得开发的耦合度很低.而.
图 4 MVC设计模型
视图,在软件中通常是用户交互的界面.它用来表示数据和提交用户对软件的请求.
模型,用来处理软件的要涉及的业务范围,主要是业务数据模型和业务逻辑模型.
控制器,用来接受用户的请求并调用模型中的处理过程,然后选择相应的视图.
Java的Web应用中MVC的设计模式运用十分多.JSP Model2 体系结构就是结合了JSP,Servlet和JavaBean技术的MVC模式的实现.
图 5 JSP Model2 模型
Struts框架概述
随着软件开发日渐成熟,软件工程师们也变得逐渐成熟起来,我们开始首先设计软件框架结构,这样在开发阶段我们才会井然有序的进行.而对于现代软件开发对软件的开发周期要求越来越迅速,所以如果要自己开发一套框架已经不太现实了.所以我们必须要选择已经成熟的软件框架了.
而Struts对于Java的Web开发而言就是一个不错的选择.Struts框架实质就是JSP Model2模型的实现.
图 6 Struts 实现的MVC框架
1.视图
视图是通过一组JSP程序实现的.这些JSP程序中不能包含业务逻辑,也不能包括模型的信息.模型的信息是通过控制器传递的.在Struts中ActionForm 也被看成是视图的一部分.它其他更新视图,以及视图查询模型状态的桥梁.
2.模型
模型是程序的状态表示,其状态包括,消息中传递的状态,以及共享状态或一次回话中的状态,以及持久状态.而操作这些状态的流程也同样包括在模型中.这些模型也就是业务的总体运作流程和数据.
3.控制器
控制器部分由ActionServlet和Action来实现.ActionServlet也就是Struts框架用来和Web容器交互的接口.该类是Struts框架的核心组件.ActionServlet继承了HttpServlet类.它在MVC模型中扮演中央控制器的角色.当Web容器一接收到客户请求就会交割ActionServlet该类更加struts-config.xml文件的配置信息选择合适Action来处理请求.并传递请求过程中的数据,这些数据是通过ActionForm传递的.Action本身也并不包含业务逻辑的处理代码.它只是负责调用业务的处理代码的.
调用这些代码的方法在execute()方法中.该方法在调用业务处理以后会放回一个ActionForward对象来选择对应的视图.一般而言我们的Action必须直接或间接的继承该类.然后重写excecute()方法以完成我们自己的处理消息.
4.Struts的配置文件 struts-config.xml
该文件实质是一个控制器和视图的黏合剂,控制器之所以能够选择对应的视图,以及视图能够通过对应的控制器查询到模型中的数据都是依赖该文件.该文件是一个XML文件.在该配置文件中每Action都对应一个<Action>标签用来映射Action类的信息.
从软件的需求分析与设计谈起
实现一个完整的基于Struts的WEB应用
总结:
Java的Web应用中使用到的技术非常多,也相对比较复杂.因此开发中开发人员所负责的技术方面也会相对较多,所以我们必须考虑到个人的特长对开发工作进行合理分配,这就需要我们在软件的设计阶段考虑清楚.而MVC这种设计模式能够很好的把业务数据模型和业务处理模型独立出来,这样开发出独立的系统组件,以便于在开发视图阶段能够很好的保持数据的一致性.而在处理视图和模型之间的关系时控制器成为了两者的纽带,这样使得软件项目可以成为一个系统化的工程.
而Struts框架在Java的Web应用中就起到了这个作用.这样使得开发阶段能够很好的利用该框架完成开发项目,我们可以选择合适的模型组件如我们可以使用JavaBean技术来完成业务模型和数据模型的接口,而数据库则可以充当数据模型来保持业务阶段的持久状态.JSP和Struts为我们提供的一组标签这可以完成页面的表示和页面的逻辑等功能使得我们有了丰富的视图功能.并且Struts提供了ActionForm为视图可以和事件进行数据交换接口提供了良好的通道使得在处理Action事件时候可以通过ActionForm从视图中取得数据.而两者之间的桥梁就是Struts-config.xml文件该XML文件可以配置两者之间的联系.这使得接口之间有着极高的灵活性和伸缩性.而在Action中我们有可以调用和包含模型组件的功能.这样使得开发非常具有效率和可扩展能力.
Struts框架事实上已经被很多软件项目所应用,所以足见其适用性时非常可靠的.这里也希望通过该问的介绍能够使得读者对Struts框架有一个足够的了解.
参考资料:
<<精通Struts基于MVC的Java Web 设计与开发>> 作者: 孙卫琴
<<JSP 2.0 技术参考手册>> 作者: 林上杰 林康司
<<J2EE 技术内幕>> 作者: (美)Joseph J.Bambara Paul R.Allen等 译者: 刘堃 等