APP下载

Struts2框架在信息发布系统中的应用研究*

2014-06-13欧阳宏基

微处理机 2014年2期
关键词:配置文件数据源调用

葛 萌,欧阳宏基

(咸阳师范学院信息工程学院,咸阳712000)

1 引言

Struts作为Apache组织的一个开源项目,是一种基于MVC设计模式的Java Web开发框架[1],其第一代产品Struts1在Java Web开发领域具有非常高的市场占有率。随着时间的推移,Struts1的一些弊端逐渐显露出来,例如表现层所支持的技术单一、Action组件与Servlet API紧密耦合并且是单例实现、存在线程安全性问题、侵入式框架、严重依赖于Struts1 API等。因此Struts2在Struts1和WebWork的技术基础上进行了整合。它以WebWork为核心,采用拦截器的机制来处理用户请求,目的是为了使业务逻辑控制器能够与Servlet API完全脱离开,便于开发与测试[2]。分析了Struts2的体系结构,详细描述了Struts2各组件在响应客户端请求时的调用过程。按照MVC设计模式,依据一个Web站点的信息发布系统,详细描述了表现层、控制层和模型层的实现过程,对于利用Struts2开发Java Web应用具有一定的借鉴意义。

2 Struts2体系结构

Struts2的体系结构(如图1所示)与Struts1差别非常大,因为Struts2使用了WebWork的设计核心,而不是Struts1的设计核心。Struts2框架的基本执行流程如下描述:

(1)客户端向Servlet容器(例如 Tomcat)发送HttpServletRequest请求。

(2)该请求经过一系列的过滤器(Filter)进行过滤,其中ActionContextCleanUp是一个可选过滤器,该过滤器对于Struts2和其他框架的集成起作用(例如:SiteMesh Plugin)。

(3)FilterDispatcher是Struts2的核心过滤器,担当MVC模式中控制层的核心功能。FilterDispatcher根据ActionMapper来决定当前用户请求是否需要调用某个Action。

(4)如果 ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给 Action-Proxy。

(5)ActionProxy通过Configuration Manager读取框架的配置文件(struts.xml),找到需要调用的Action类,并创建一个ActionInvocation实例。

(6)ActionInvocation实例使用命名模式来调用,在调用 Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

(7)默认情况下,Action调用execute()方法执行相应的业务逻辑(也可以是Action中其它的方法,但这些方法在调用时需要显示声明)。

(8)当 Action执行完毕,ActionInvocation实例根据配置文件(查找响应的是什么信息如:SUCCESS、ERROR,INPUT等)找到对应的返回结果。返回结果通常是(也可能是另外的一个Action)JSP页面或者FreeMarker的模版来响应用户请求,在表示过程中可以使用Struts2提供的标签。

图1 Struts2体系结构

3 信息发布系统的实现

目前几乎所有Web站点都具备信息的动态维护功能。管理人员合法登录到站点的后台模块就可以对最新信息、文档、图片等资源进行添加、上传等操作,使得前台页面显示的内容呈现出动态变化的过程。本节以咸阳师范学院国际交流学院的Web站点为例,依据MVC模式结合Struts2和FCKEditor框架,详细描述信息发布系统的实现过程。

3.1 表示层的实现

表示层主要由JSP页面、FCKEditor和Struts2标签构成。FCKeditor是目前最优秀的可见即可得网页文档编辑器之一,它采用JavaScript编写,具备功能强大、配置容易、跨浏览器、支持多种编程语言(可以和 PHP、JavaScript、ASP、ASP.NET、Java 等不同的编程语言相结合)、开源等特点[3]。本系统选用的是Java版本的FCKEditor2.6,首先将fckeditorjava-core-2.6.jar包导入到 WEB -INF/lib目录中,然后在需要FCKEditor的JSP页面头部加入以下声明代码。

< %@taglib uri="http://java.fckeditor.net"prefix="FCK"%>

< %@page import="net.fckeditor.*"% >在页面需要显示文档编辑器的位置,加入如下Java代码段:

//以JSP内置对象request为实参创建FCKEditor对象并命名

FCKeditor fckEditor=new FCKeditor(request,"EditorDefault");

//FCKEditor一些简单属性的设置,并通过out内置对象将文档编辑器显示在JSP页面上fckEditor.setValue("");

fckEditor.setHeight("500");

out.println(fckEditor);

Struts2提供了功能强大的标签库,这些标签不依赖于任何的表现层技术,同时支持用户自定义标签以满足页面复杂多变的需求[4]。Struts2提供的标签主要包括:UI类标签、控制类标签和支持Ajax的标签等。使用Struts2标签前需要添加导入标签库的语句:<%@taglib uri="/struts-tags"prefix="s"%>

下面是前台JSP页面显示最新信息标题和发布日期的Struts2控制类标签-iterator的使用代码。

<s:iterator value="list_news"var="infos">

<tr width="100%"height="20">

<td width="85%">

<a class="t1"href="content.jsp?id= < s:property value="#infos.id"/>"target="blank"> <s:property value="#infos.title"/> < /a>

</td>

<td width="15%"><s:property value="#in-fos.publishDate"/>

</td>

</tr>

</s:iterator>

其中value属性的值list_news为相应Action中的一个集合,这个集合里封装的是与数据库表对应的信息实体的JavaBean对象,再通过property标签将需要的属性显示在页面中。

3.2 控制层的实现

控制层主要完成Action和配置文件的定义。Struts2框架有两个核心配置文件,其中struts.xml是整个Struts2应用程序的核心配置文件(存放在项目的src目录下),其中主要包括包配置、命名空间配置、拦截器配置、Action映射及Action处理结果和物理资源之间的映射配置及异常处理配置等。另一个struts.properties配置文件中主要定义了Struts2框架的大量常量属性。但通常推荐也是在struts.xml文件中来配置这些常量属性。以下是本系统中struts.xml配置文件的部分代码。

<struts>

<constant name="struts.i18n.encoding"value="UTF-8"/>

< constant name="struts.multipart.maxSize"value="10701096"/>

<package name="lhy-default"namespace="/bgm"extends="struts-default">

<global-results>

<result name="error" > /bgm/error.jsp < /result>

< /global-results>

<global-exception-mappings>

<exception-mappingresult="error"exception="java.lang.Exception" > < /exception -mapping>

</global-exception-mappings>

</package>

<package name="backgroud"namespace="/bgm"extends="lhy-default">

<action name="InformationManage"class="lhy.action.InformationAction" >

<result name="success">${destinationPage}</result>

<resultname ="error" >/bgm/Information Manage-Result.jsp < /result>

</action>

</package>

</struts>

其中constant标签用于配置相应常量属性。package标签用于定义包配置,name为必填属性,用来指定包的名字,extends为可选属性,用来指定该包继承其他包。如果继承其它包,可以继承其它包中的Action、拦截器等。namespace为可选属性,用来指定该包的命名空间。global-results和globalexception-mapping两个标签结合起来完成异常的声明式处理方式,exception属性指明了处理异常的类型,result属性指明了产生该异常时的返回类型,从而在global-results标签中找到对应的显示页面。由于异常的声明式处理方式配置在一个package标签中,那么其他的package可以进行继承,从而共享这个异常处理方式。action标签用来配置Action对象,name为必填属性(在一个 package中Action的name值唯一),class为必填属性用来指定Action字节码的位置。result为action的子标签,name为可选属性,其值默认是SUCCESS(可选值为SUCCESS、NONE、ERROR、INPUT、LOGIN)表示Action执行的结果,不同的结果定位到不同的资源。

除了配置文件外,控制层最主要的任务是根据用户请求定义相应的Action来进行处理。Struts2的Action采用了低侵入式设计,即Action可以是一个POJO,不与任何Struts2的基类和接口打交道。但实际上为了方便实现Action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类的execute()方法。因为此类中实现了很多的实用接口,提供了很多默认方法,这些默认方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等,这样可以大大简化Action的开发。以下是信息发布业务所对应的Action核心代码。

import com.opensymphony.xwork2.ActionSupport;

public class InformationAction extends ActionSupport{

privateInformationBean infoBean;//HTTP 向Action传递参数采取域模型的方式

public String execute(){

String tag=ERROR;

int opResult=0;

if(opType.equals("add"))//当前执行添加操作

{

//调用模型层组件,执行持久化操作

InfoDAO infoDAO=DAOFactory.getDAOInstance(InfoBean.class);

opResult=infoDAO.addInformation(infoBean);

if(opResult==1)

{

tag=SUCCESS;

destinationPagePath="/lhy/bgm/ShowInfo.jsp";

}

}

r eturn tag;

}}

由于Struts2的Action直接封装了HTTP请求参数,与Servlet API实现了松耦合。Struts2的Action接收HTTP请求参数一共有三种方式:使用Action的属性、域模型、实现ModelDriver泛型接口。本系统采用域模型方式来接收请求参数,此方式的优点在于避免Action内部出现大量与实体相关的属性和实现过多的接口。例如上述代码中的infoBean,它是一个JavaBean对象,内部封装了与信息实体相关的属性。Action类中要提供infoBean的get和set方法。

3.3 模型层的实现

和Struts1一样,Struts2也没有在模型方面提供现成的组件,为了达到Java EE分层模型之间的松散耦合,开发人员需要选取JavaBean或者EJB组件来完成业务逻辑和持久化逻辑。本系统选取JavaBan来实现业务逻辑,利用泛型DAO模式结合JDBC来实现持久化逻辑。DAO模式是Java EE数据持久层所使用的最广泛的模式,它的核心思想是向外部提供一个访问数据源的统一接口,对外隐藏操作数据源的实现细节,以至于将来更换数据持久化方式时不影响上层的调用者。由于一个系统中可能会存在多个需要持久化操作的实体类,这些实体类对数据源的CRUD操作都具有相同点,因此在DAO模式的基础上加入泛型机制可以避免大量重复的CRUD代码并且能够解决强制类型转换所可能产生的异常。

控制层通过Action调用持久化层逻辑的过程如图2所示。DAOFactory通过工厂模式向上层调用者隐藏了具体DAO实现类的创建过程。实体类通常与数据库表对应,每个实体类都有相应的DAO实现,由于不同的实体类基本上都具有相同的CRUD操作,所以定义了泛型DAO接口提取了所有实体类共有的持久化方法,并在泛型实现类中通过模板模式进行抽象,将不同实体类属性与表中字段的映射留给具体泛型实现类去完成。JdbcUtil是采用单例模式设计的一个JDBC工具类,提供了通过DataSource获取Connection对象的方法以及释放相关JDBC资源的方法。为了实现对Connection对象的复用以提高数据库访问的性能,在Tomcat中配置了DBCP连接池。Tomcat Servlet容器将DBCP数据源作为一个JND I数据源,通过配置参数来使用DBCP 连接池[5]。在 DBPool.config 配置文件中定义了连接池的相关参数(初始连接数、最大活动连接数、最小空闲连接数、最大空闲连接数等)。

图2 Action调用持久化层逻辑

4 结束语

论文详细分析了Struts2框架的组成部分以及响应用户请求的执行过程,按照MVC模式的视图、控制、模型三个部分结合信息发布系统详细描述了Struts2框架的实现过程。实践表明:Struts2框架能够简化Web应用的开发过程,使得程序具有清晰的结构框架,并且开发人员能够分工协作,从而提高开发效率和系统的可扩展性和可维护性。

[1]甘文丽,刘为超.基于Struts2和Ajax的企业级Web应用开发[J].工矿自动化,2013,39(2):24 -25.

[2]丁波,晁爱农.基于Struts2框架的 AJAX开发研究[J].计算机工程与设计,2009,30(16):3910 -3911.

[3]董海燕,王卫东.基于JSF、Spring和Hibernate的技术资料综合管理系统设计[J].计算机应用与软件,2012,29(5):214 -214.

[4]陆舟.Struts2技术内幕:深入解析Struts架构设计与实现原理[M].机械工业出版社,2012,185-187.

[5]陈洁.DBCP数据库连接池的自优化配置[J].计算机与现代化,2010(12):112-113.

猜你喜欢

配置文件数据源调用
互不干涉混用Chromium Edge
核电项目物项调用管理的应用研究
基于Zookeeper的配置管理中心设计与实现
忘记ESXi主机root密码怎么办
Web 大数据系统数据源选择*
为View桌面准备父虚拟机
基于不同网络数据源的期刊评价研究
基于系统调用的恶意软件检测技术研究
基于真值发现的冲突数据源质量评价算法
分布式异构数据源标准化查询设计与实现