基于Struts2和iBATIS的JSP开发框架设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Struts2和iBATIS的JSP开发框架设计与实现
摘要:在jsp应用程序存在异常处理分散、拼接sql语句繁琐易错、上下层次模块间耦合度高等问题,这些问题使系统难以扩展和维护。
本文设计并实现了一个基于struts2和ibatis的jsp开发框架,解决上述问题。
该框架已经实现并在实际开发中使用。
通过对比证明,该框架提高了jsp应用系统的灵活性和扩展性,同时也缩短了开发周期,降低了开发成本。
关键词:struts2;ibatis;jsp开发框架
中图分类号:tp311.52
jsp(java server pages)是常见的b/s架构(browser/server 架构)[1]实现技术之一。
在笔者为学校开发“奖助贷系统”和“认证考试报名系统”等jsp应用系统的过程中,遇到了以下问题:(1)为系统所有模块增加、修改或者移除一个功能时,需要改动大量代码,异常处理分散,当异常处理方式改变时,代码修改量也很大;(2)系统中需要大量动态拼接sql语句,在java中拼接sql语句非常繁琐,而且容易出错;(3)业务逻辑处理和数据存取之间的接口耦合度高,多个开发人员之间沟通成本也很高。
笔者通过对已开发的两个项目进行研究,设计了一个简单的jsp 开发框架,来解决上述三个问题。
1 关键技术简介
1.1 mvc和struts2框架
mvc框架模式全称是model-view-controller[2]。
其中,model
表示业务逻辑和数据存取,view表示数据显示,controller连接model和view两部分。
mvc把数据显示(v)和数据(m)隔离,同时也把两者之间的联系(c)独立出来,三个部分各司其职,互不干扰。
struts2框架[3]对应于controller部分。
它通过编写xml配置文件,控制页面跳转。
struts2的配置代码示例如下:
method=“query”>
/list_s.jsp
/list_t.jsp
struts2的拦截器机制还能对所有请求做相同的处理[4]。
struts2的拦截器机制如图1所示。
图1 struts2拦截器原理
图1中虚线框起来的部分显示,拦截器可以在action调用前后增加一些功能模块。
使用拦截器,不需要每个action自己去调用这些功能模块,而是由struts2的配置自动为action增加这些模块。
这可以解决引言中提出的第一个问题。
1.2 ibatis框架
ibatis是一个持久层框架。
笔者所在学校的web应用程序,其数据都来自数据中心,数据库结构对外是不开放的,仅对外提供必需的sql语句。
这种情况下hibernate等框架并不适用。
ibatis是半自动化的[5]。
它实现的是业务对象和sql语句的映射,非常适合
处理这类情况。
ibatis采用的是在sql语句中使用ibatis标签来拼接sql语句,示例代码如下:
select * from t1 where 1=1
column1 = #a#
从上述代码可以看出,ibatis比java拼接sql语句更简洁,也没有单引号匹配、遗漏逗号等问题。
2 jsp应用开发框架设计
按照mvc的思想,数据显示和业务处理是相互独立的,分开后可以降低耦合度,把model所代表的业务逻辑和数据存取分开,可以进一步降低耦合度。
因此,在笔者设计的框架中,后台采用了比较流行的action-service-dao三层结构。
开发框架结构如图2所示。
图2 jsp应用开发框架结构图
2.1 异常处理
系统运行过程中有可能会遇到网络中断,数据库崩溃等业务无关的问题,还有可能出现用户查找的数据不存在、重复提交数据等业务相关的错误。
框架提供了统一的方式处理这些异常和错误。
框架的异常处理结构如图3所示。
图3 异常处理结构图
图3中的systemexception和businessexception是自定义的两个异常类,分别表示业务无关的异常和业务相关的错误。
这两个异常类不需要有任何的实质性的处理,只需要能记录异常信息即可。
2.2 dao层接口设计
dao层的接口basicdao仅提供五个方法:
public interface basicdao{
public list select(basicvo vo);
public int selectcount(basicvo vo);
public void insert(basicvo vo);
public void update(basicvo vo);
public void delete(basicvo vo);
}
这样设计,避免了dao层方法过度重载和对外接口频繁改动。
dao 层接口简单固定,所以service层无需等待dao层完全实现就可以进行编码和初步测试,开发过程中也不需要和dao层的开发人员进行过多沟通。
假如某个具体的dao层的类因为性能或者其他原因,需要更多个性化方法,可以自行添加其他方法。
3 jsp应用开发框架的实现
实现这个框架,需要为其加上统一的权限验证和异常处理功能,并使用ibatis框架实现dao层。
3.1 权限验证和异常处理
权限验证应该添加在每次action调用之前,而异常处理应该是捕获action抛出的异常,发生在action调用之后。
这两个功能都可以借助struts2的拦截器机制实现。
因为权限验证和异常处理是针对整个系统的,所以笔者在同一个拦截器myinterceptor里实现(也可以分在两个拦截器里实现)。
myinterceptor的核心代码如下:
public class myinterceptor
extends abstractinterceptor {
@override
public string intercept(
actioninvocation arg0)
{
string result = “success”;
int errortype = 0;
if(用户未登录){
result = “error”;
errortype = “nologin”;
} else if(用户没有权限){
result = “error”;
errortype = “noauthor”;
} else {
try{
result = arg0.invoke();
} catch(exception e){
result = “error”;
errortype = “exception”;
}
}
return result;
}
}
系统中不管是出现异常还是业务相关的错误(包括未登录和没有权限),myinterceptor都会返回“error”。
在struts2里配置error 对应的result是一个链式请求mngerror.action,接下来就会进入mngerror对应的方法去处理。
3.2 dao层具体实现
首先用ibatis的配置文件sqlmapconfig.xml创建一个sqlmapclient对象,核心代码如下:
reader reader = resources.
getresourceasreader(”sqlmapconfig.xml”);sqlmapclient sqlmapper = sqlmapclientbuilder. buildsqlmapclient(reader);
reader.close();
接下来,在方法里使用sqlmapper进行增删改查等操作:sqlmapper.queryforlist(“select”, vo);
sqlmapper.queryforobject(“selectcount”, vo);sqlmapper.insert(“insert”, vo);
... ...
4 结语
目前,该框架已经在项目中得到了实际应用,笔者利用这个框架,重新开发了学校的奖助贷管理系统和等级考试报名系统。
该框架提高了web应用程序的灵活性和扩展性,也大大缩短了开发周期。
如何提高框架中数据存取的性能和效率是笔者下一步着重要考虑的
问题。
参考文献:
[1]徐秀敏,郝赫,曹占峰,尹洪苓,朱大勇.基于三层b/s的规划计划信息管理平台[j].计算机系统应用,2013,22(4):51-54.
[2]丁振凡.基于springmvc的网络存储系统[j].计算机系统应用,2013,22(2):178-181.
[3]丁波,晁爱农.基于struts2框架的ajax开发研究[j].计算机工程与设计,2009,30(16):3910-3913.
[4]卞世晖,李龙澍,陈圣兵,李浩.基于aop理念的struts2拦截器的研究与应用[j].电子设计工程,2010,18(1):8-9.
[5]clinton begin,brandon goodin,larry meadors.ibatis in action[m].北京:人民邮电出版社,2008.
作者简介:岳鹏(1986.1-),男,硕士,助理实验师,研究方向:计算机应用。
作者单位:山东大学(威海)网络与信息管理中心,山东威海264209。