您的位置:首页 > 编程语言 > Java开发

Struts在J2EE Web应用服务上的构架分析与案例设计

2006-08-29 11:06 931 查看
摘要:J2EE是功能强大的Web应用开发技术,但在实际Web开发过程中仍需结合Struts等开发框架来优化设计。本文围绕Struts,详细分析了它与J2EE Web应用服务的构架及联系,并给出了一个实例化的案例设计。

关键词:J2EE;Struts;B/S;WebLogic;MVC;MIS

引言

    近些年来,Web开发技术发展迅猛,其中特别是面向企业级的J2EE技术,受到了广大程序开发者的追捧。但是,尽管J2EE提供了全面和强大的开发技术与体系结构支持,但是在处理复杂的B/S模式交互时,通常会出现业务逻辑与显示逻辑的大量夹杂。这不仅给软件过程设计带来极大的烦恼,而且也给开发、维护及协作带来诸多麻烦。如何运用一种支持J2EE应用服务上的简单、高效的开发框架来解决以上问题,是本文探讨的中心。

J2EE的Web应用服务架构分析

    首先了解一下J2EE Web应用服务的整体架构,用下图表示:


相对于本文关注解决的Web应用服务问题,主要集中于Web层和客户层。其中Web层用来响应Web客户端请求,把数据传递给业务层的商务逻辑组件,把业务层处理结果返回用户,其主要的技术有JSP、Servlet,Web层也是接下来探讨的Struts开发架构的应用层;客户层负责将用户的请求送给服务器,并将服务器的返回结果呈现用户,如IE中的各种页面显示。
    实际的J2EE Web应用服务的开发与运行还必须各种Web应用服务器的支持。因为Web应用服务器不仅承担着对企业信息系统层(主要是数据库)的中介访问,而且也负责相应Web应用程序的上载运行,是J2EE Web应用服务的基础。下面简单介绍WebLogic Server应用服务器,它将在本文的案例设计中用到。
由于J2EE只是一个技术规范,不是直接可以使用的软件,要想进行它的应用开发,必须使用实现了J2EE技术规范的应用服务器。WebLogic Server是Bea公司出品的J2EE应用服务器,功能基本上涵盖了J2EE体系每个层次。
WebLogic Server在分J2EE Web应用服务中工作时可以分以下三层:


作为中间件服务器的WebLogic Server将J2EE和Web Server API融入单一平台,在对数据库操作是建立在J2EE的JDBC技术之上的,并提供了一个非常有用的技术:池连接。它将应用程序与中间件服务器连接,允许客户间接访问它后端连接的多个数据库。
池连接是被J2EE服务器打开和维护的。它在服务器启动时就会建立一定数量的池连接(具体数量由配置参数决定)并一直维持一定数量的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的连接并将其标记为忙。如果没有空闲的连接,池驱动就新建一定数量的连接(具体数量也由配置参数决定)。当使用连接池的调用完成后,池驱动又将此连接标记为空闲(但不断开与数据库的连接),这样其它调用又可使用该连接。
池连接一般比JDBC直接连接更有优越性,因为它提高性能的同时节省了宝贵的资源(直接建立数据库连接不仅耗时,又容易出现占用空连接资源)。
WebLogic Server的池连接工作模式如图:


Struts开发框架的架构分析

在介绍Struts开发框架前,先了解一下MVC的设计开发模式,它是我们在Web应用服务开发时,用来处理业务逻辑与显示逻辑的好方法。
开发Java的Web应用程序,Model1和Model2体系架构是目前流行最广的设计模式。由于早期使用Servlets技术生成HTML代码编写较复杂,已基本不用;而采用Model架构(即用JSP负责业务逻辑和显示逻辑,将用户请求页面返回客户端)尽管开发上手较方便,且使用广泛,但很大一个问题就是业务逻辑和显示逻辑(Java代码和HTML代码)大量混杂在一起,造成代码维护量大,开发效率低下。
Model2,又称Model-View-Control(MVC)架构,它把由三部分组成:
<1>.模型(Model)
模型封装了应用程序的数据结构和业务逻辑,集中体现了应用程序的状态。JavaBean非常适合这个角色,能与数据库进行交互,承担维护应用程序数据的责任。
<2>.视图(View)
视图是模型的外在表现,JSP页面适合完成这个功能,因为它较适合前端展现。
<3>.控制器(Control)
控制器对用户输入进行响应并将模型和视图联系在一起。Servlet适合担当这个角色,因为它能够接收客户端请求根据请求可以操作模型,将变化传给视图去显示。
MVC框架最适合应用程序与用户频繁交互的情况,该框架把程序分成三个部分不仅让程序流程更加明朗,而且可以简化应用的开发过程,故非常适合Web开发。
Struts就是一个Jakarta公司所提供的实现了MVC模型的开发框架。其框架如图:


从上图可以看出Struts框架中ActionServlet、Action充当控制器的角色,JSP充当视图角色,ActionForm充当模型角色。而把Struts组件组织在一起的配置文件是:struts-config.xml。
在struts-config.xml配置文件中可以定义:

· 全局转发:它为Web应用程序中的JSP页面定义一个逻辑名称,并为实际的JSP名称和逻辑名称之间建立映射,好处是可以用容易记的逻辑名称代替不易编码的JSP页面名称。
· ActionMapping:该对象用来进行框架内部的流程控制,把从用户请求的URL映射到对应的Action类,并且将Action类与ActionForm Bean相关联。

· ActionForm Bean:定义用到的模型类Bean。
· JDBC数据源:用来配置在Web应用中使用的数据源。
JSP引擎在接收到一个Web应用的客户请求时,会根据ActionMapping对象定义的映射,将请求转发到相应的Action对象,并且将请求中相应的属性赋给ActionForm对象。Action在处理完毕后,可以根据全局转发中定义的名称将请求转发到后继的JSP页面。这样,一个使用Struts框架的处理流程就结束了。

案例设计

    为了更好地了解和掌握Struts构架在J2EE Web应用程序开发上的实际运用,本人在此举个实际的工程案例:基于J2EE技术的MIS通用服务器端功能模块设计与实现(工程详情可参考本人本科毕业设计)

管理信息系统(Management Information System,MIS)有较强针对性,难以实现通用性。但大多数MIS的服务器端模块功能相似(如用户登录、用户添加/删除/修改、用户权限管理等),且设计原理、思路也相近(包括相应数据库设计)。

实际的案例工程底层数据库为SQL2000,应用服务器为WebLogic,开发环境为JBuilder, 涉及主要J2EE技术有JSP、Servlet、JavaBean、JDBC、JNDI、RMI、XML等,开发应用框架为Struts。

这里我们忽略案例的工程化步骤、UML设计、详细代码设计等,只针对Struts构架的运用,举例一个简单功能的Struts实现过程:

u       框架组件的实施分布

l         model(模型)包中涉及用户登陆的ActionForm:UserActionForm(登陆用户模型);
l         controller(控制器)包中涉及用户登陆的ActionServelt:CheckUserAction(用户登陆控制);
l         dao(业务逻辑)包中涉及用户登陆的Action Class:DbDAO(数据库操作逻辑)和UserDAO(用户相关逻辑);
l         JSP(显示)涉及用户登陆的页面:index.jsp(登陆)、success.jsp(各种操作的成功信息显示)和failture.jsp(各种操作的失败信息显示)。

u     基于Struts的流程实现

<1>.编写一个基于JDBC技术的Java类DbDAO作为最低层的Action Class(业务逻辑)放到已建好的dao包下,让这个类能与WebLogic应用服务器访问,并能执行任意查询、更新等SQL语句;

<2>.编写另一个Java类UserDAO作为能被Action(行为)调用的Action Class(业务逻辑),它主要负责生成及执行SQL语句,须加载并调用最低层的DbDAO类中方法完成对相应的操作。在这里,我们加入一个chkUser()方法,它以ID、password为参数,生成查找数据库User_inf表中有对应ID和password的用户的SQL语句,并且调用DbDAO中执行该SQL语句的select()方法,能完成查找用户的操作;

<3>.把登陆用户看作一个登陆用户模型,它有ID、用户名、密码和用户标志等属性及其相关存储、读取方法。建立方法是新建Web下的“ActionForm”对象实例UserActionForm,放到已建好的model包下,并通过其向导功能添加各属性,默认会生成这些属性的存取方法;
<4>.建立一个使用该模型的Action(行为),方法是新建Web下的“Action”对象实例CheckUserAction,在CheckUserAction的源代码中用impot命令将用到的业务逻辑UserDAO或Java基础包加入,接下来完成这个Action的execute()方法,这个方法中我们要实现从UserActionForm中取得用户传过来的ID和密码属性值,再以它们为参数调用UserDAO的chkUser()方法,查看返回结果是否正确,若不正确全局转发failLogin页面;若正确,继续调用UserDAO的其它方法进一步确定用户名及标志,将它们放入Sessiom和UserActionForm,以待后用,最后全局转发main页面;
<5>.编写登陆index.jsp页面,其主要传递用户填写的ID和密码标单到CheckUserAction.do(即传递给CheckUserAction);
<6>.编写登陆失败的failLogin.jsp页面和登陆成功后的主页面main.jsp页面,其中后者可以从Session中取得用户名及标志,用来确定欢迎对象,再接下来是将这两个页面设置为全局转发,名字为第4步中全局转发时用的名字;
<7>.检查Struts的配置文件struts-config.xml,如果参数都设置和CheckUserAction的execute()方法正确,我们就可以在JBuilder中的Struts Config Editor中清楚的看到自己的成果图(如下),再接着就可以进行相应的调试了,至此一个典型的Struts流程就结束了。
XML配置图(含全部工程)


u     生成的Action示意图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息