admin 管理员组

文章数量: 1184232


2024年3月28日发(作者:access中医药数据库下载)

维普资讯

计算机与现代化 

2007年第11期 

JISUANJI YU XIANDAIHUA 总第147期 

文章编号:1006-2475(2007)11-0135-03 

Struts+Hibernate下实现Excel文件的导人导出 

杨勇虎,汤德俊 

(东北大学东软信息学院,辽宁大连116023) 

摘要:在软件开发中Excel文件的导入导出功能是经常遇到的一种需求,例如:导入由Excel保存的原始数据,利用Excel 

打印等。本文介绍了在Struts+Hibernate的框架下实现此功能的方法和实现过程。利用框架式的方法实现,不仅可以有 

很好的封装性,而且有很好的日志处理方法。 

关键词:Excel;导入导出;Struts+Hibernate;架构 

中图分类号:TP311 ・文献标识码:A 

Rendition of lmpo ̄atxi Exporting Excel File Based on F ̄mework of Struts&Hibernate 

YANG Yong—hu,TANG De-jun 

(Neusfot Institute of Information,Dalian 116023,China) 

Abstract:Importing and exporting Excel file is often required in the development of software,for example,importing the original 

data saved by Excel,printing the data by using Excel,and SO on.The paper proposes a method and a process of eralization based 

on the framework of Strusts&Hibernate.The method not only has a good encapsulation,but also has a good log. 

Key words:Excel;importing&exporting;Struts+Hibernate;framework 

0 引 言 1 Excel文件导入功能分析及实现 

目前进行软件开发中,很多的业务需求都涉及到 

Struts由ActionServlet、Action、FormBean、Action— 

与Excel数据的交互,例如:有很多原始数据是以Excel 

Mapping、ActionForward、ActionError和Struts标记库 

文件的形式存储的,需要导人到数据库中,相应在Web 

等基本组件组成。借助于这些组件实现Excel文件 

页中应该具有导人的功能。另一方面,众所周知,Web 

上传,各组件间协作机制和实现过程为: 

上的打印是比较困难的,常见的Web上打印的方法大 

Step 1 ActionServlet接收来自客户端的H1-rP文 

概有三种:(1)直接利用IE的打印功能。一般来说,这 

件上传请求(通常为,一c.do请求),在视图Web页中 

种方法可以做些扩展,而不是单单地调用javascript: 

加入文件控件,核心代码为: 

print()这样简单,在这里不再叙述。这种方法可以适 

<html:form action=”/InputStuScoreAction.do”enctype 

用于简单的数据打印,对系统要求不高,但不足之处在 

”multipart/form-data”> 

于可以控制的能力比较差,比如处理分页等问题。(2) 

<td>文件位置:</td> 

利用水晶报表或其他第三方工具,如微软的Reporting 

<td><html:file property!”thaFila”/></td> 

<td> 

service。水晶报表或其他第三方控件的打印,一般是 

<html:submit property=”method”> 

导出到Excel,Word,PDF等再进行打印的,效果比较 

<bean:message key ”StuScore.inputScore”/> 

好,但编程比较复杂,控制起来也不大方便,而且这些 

</html:submit> 

工具都是要收费的。(3)将数据库的数据或要打印的 

</td> 

内容导出到Excel,Word中去打印。使用这种方法,适 

</html:form> 

应性比较强,控制较好。本文将介绍如何在Structs+ 

Step 2针对此请求调用配置文件struts—conilg. 

Hibernate架构上使用Excel o 

xml中的ActionMapping类得到Action对象。在配置 

收稿日期:2006.10—16 

作者简介:杨勇虎(1977.),男,内蒙古集宁人,东北大学东软信息学院讲师,工程师,硕士,研究方向;信息管理和决策支持系 

统;汤德俊(1978-),男,安徽人,讲师,工程师,硕士,研究方向:算法设计与分析。 

维普资讯

136 计算机与现代化 2007年第11期 

文件structs—config.xml中,具体的FormBean和Ac— 

tionMapping为: 

<form-bean nanle=”InputStuSeoreForm” 

type=”student。manage.aetionform.InputStuScoreForm”/> 

<action path=”/InputStuSeoreAction” 

name=”InputStuScoreForm” 

type=”student.manage.action。InputStuSeoreAetion” 

input=”/jsp/studentZmanage/inputStuScore。jsp” 

parameter=”method”scope:”request”> 

<forward name=”success”path=”/PreInputStuSeoreAe- 

tion。do”/> 

</action> 

Step 3 Action调用ActionMapping映射表中的方 

法得到FormBean对象,FormBean对象负责接收一些 

文件上传的信息。建立一个InputStuSeoreForm.java 

类用来保存请求的参数,其中该文件中的变量名称要 

与HTTP请求参数中的名称一致,使用get和set方法 

得到文件上传的参数,该类用于获得Web中要上传 

的文件,导人org。apache.struts.upload.FormFile类。 

Step 4将FormBean中的上传文件的基本参数传递 

给对象Action中的doinput()方法,该方法是LookupDis— 

patehAetion类中分发的—个业务方法。核心代码为: 

public class LookForlnputStuSeoreAction extends LookupDis・ 

patehAetion{ 

protected Map getKeyMethodMap(){ 

Map map new HashMap(); 

map。put(”StuScore。inputScore”,”dolnput”); 

erturn map; 

} 

public AetionForward dolnput(AetionMapping mapping,Ac- 

tionForm form, 

HttpServletRequest request, 

HttpServletResponse response){ 

InputStuSeoreForm theForm=(InputStuSeoreForm)form; 

FormFile file=theFomr.getTheFile(); 

Stirng ifleName=file.getFileName(); 

try{ 

InputSteram steram=file.getlnputStream(); 

CSVReader csvreader=new CSVReader(stream); 

List list=csvreader.getList(); 

Iterator it=null; 

if(1ist!=nul1){ 

StuSeoreCtrl stuScoreCtlf=new StuSeoreCtrl(); 

stuSeoreCir1.inputSeore(1ist); 

request.setAttribute(”SUCCESS”,”1”); 

} 

steram.close(); 

}catch(…){ 

} 

file。destroy(); 

erturn mapping.ifndForward(“SUCCESS“); 

} 

} 

Step 5在doinput方法中调用一个自定义的类 

CSVReader,该类主要进行Excel文件的解析,并返回 

个List对象,用来存储Excel文件的解析结果。具 

体核心代码为: 

public class CSVReader extends BufferedReader{ 

private boolean IIIing true; 

ArrayList biglist=new ArrayList(); 

public CSVReader(InputStream inputStream){ 

super(new InputStreamReader(inputStream)); 

} 

public List getList()throws IOExeeption{ 

Stirng[]C=new Stirng[size+1]; 

while((C=readRow(size))!=nul1){ 

ArrayiLst llst=new ArrayList(); 

ofr(int i=1;i<size+1;i++) 

list.add(C[i]); 

biglist。add(1ist); 

} 

} 

return biglist; 

} 

public String[]readRow(int eolumnSize)throws IOExeep— 

tion{ 

return parameter; 

} 

ifnal public static ArrayList eradColumnValue(String line) 

return list; 

} 

private Stirng getSubstring(String line,int idxO,int idx1) 

} 

} 

Step 6 List对象作为参数进人业务逻辑层。然 

后进人BO层,在BO层中将List对象的所有内容要 

传递给hibernate映射的实体对象,最后进人数据 

DAO层,调用hibernate.session中的save()方法,保 

存到数据库。 

Step 7将结果返回给ActionForward对象,从Ac— 

tionForward对象中取得一个视图的路径。 

Step 8异常处理,在执行doinput()方法时,若出 

现上传错误,Action对象会将错误信息保存到Action— 

Error对象中,错误对象再调用自身的saveErrors()方 

法将错误保存到Request对象的属性中,Action对象 

调用ActionMapping对象的getlnput()方法从动作映 

射中获取input参数,并以input为参数生成一个Ac— 

tionForward对象返回,将错误信息重定向到视图。 

2数据导出到Excel的功能分析和实 

现过程 

针对某一批要导出的数据首先要根据查询条件 

维普资讯

2007年第11期 杨勇虎等:Struts+Hibernate下实现Excel文件的导入导出 

} 

137 

查询出来,然后再导人到Excel文件中去。借助于 

Struts组件和hibernate实现数据查询,各组件间协作 

机制和流程为: . 

Step 1 ActionServlet接收来自客户端的H,I]rI)文 

件上传请求(通常为 .do请求),针对此请求调用配 

} 

Step3然后进入业务逻辑层,进入BO层,最后 

进入数据DAO层,抒写SQL语句,调用hibernate.ses- 

sion中的createQuery(sq1)方法,将每条查询结果保 

置文件struts—config.xml中的ActionMapping类得到 

Action对象。 

<action path=”/processQCourseScore”type=”stat.ac- 

tion.QCourseScoreAction” 

nsl ̄e=”QCourseScoreFormQuery”parameter=”method” 

input=”/jsp/stat/qCourseScore.jsp”scope=”request”validate 

”true”> 

<forward name=”query”path=”/PreLCourseScoreAc- 

tion.do”/> 

<fowrard nsine=”return”path=”/jsp/stat/begin.jsp”/> 

</action> 

Step 2 Action调用ActionMapping映射表中的方 

法得到FormBean对象,FormBean对象负责接收一些 

查询的条件。将FormBean中的查询条件传递给对象 

Action中的的doQuery()方法,该方法是LookupDis- 

patchAction类中分发的一个业务方法。核心代码为: 

public class QCourseScoreAction extends UfsLookupDis- 

patchAction{ 

public SeoreBusiCtrl ScoreBusiCtrl=new ScoreBusiCtrl(); 

public CourseScoreBusilnfo couScoBusilnfo; 

protected Map getKeyMethodMap(){ 

Map map=new HashMap(); 

map.put(”StatCouSco.Query”,”doQuery”); 

map.put(”StatCouSco.Return”,”doReturn”); 

erturn map; 

} 

public ActionForward doQuery( 

ActionMapping mapping, 

ActionFormform, 

HttpServletRequest request, 

HttpServletResponse response)throws Exception{ 

List result=new ArrayList(); 

couScoBusilnfo:new CourseScoreBusilnfo(); 

couScoBusilnfo=couScoBusilnfo.getCourseScoreBusilnfo 

((DynaActionForm)form); 

tr)r{ 

request.setAttifbute(”couScoList”,result); 

result=ScoreBusiCtr1.getCourseScore(couScoBusilnfo); 

erquest.setAttribute(”couScoList”,reslut); 

} 

catch(BasedException e){ 

ActionErrors error=new ActionErorrs(); 

elTor.add(”StatError”,new ActionError(”error.stater- 

orr”)); 

saveErrors(request,error); 

return(new ActionForward(mapping.getInput())); 

} 

erturn mapping.findForward(”query”); 

存到一个类的对象中(此类是自定义的用来存储查 

询结果的类,其属性名要与查询结果的列名相同), 

再循环逐条加入到一个List对象中,最后返回到Ac- 

tion中,然后给request对象设置Attribute。 

Step 4将结果返回给ActionForward对象,从Ac- 

tionForward对象中取得一个 .do的请求。针对此 

请求调用配置文件struts—config.xml中的Action- 

Mapping类得到Action对象,此Action可以做分页处 

理。然后再返回ActionForward对象,从ActionFor- 

ward对象中取得一个视图的路径。 

Step 5在视图中可以加入export控件,Actions- 

ervlet再接收来自客户端的导出请求 .do,针对此请 

求调用配置文件struts—config.xml中的ActionMap- 

ping类得到Acti6n对象,此对象可以进行输入表头的 

处理。然后再返回ActionForward对象,从ActionFor- 

ward对象中取得一个Web视图的路径。在视图中获 

得request对象的查询结果属性。然后与Excel交互, 

实现导人。 

Step 6异常处理方法与导人类同。 

3结束语 

Web中Excel文件的导人导出,在JSP中也有很 

多的实现过程,也有一些学者已经封装了这种应用的 

类,一方面常规的方法需要重复编写大量套路式的代 

码,另一方面别人封装好的方法使用起来不是很方 

便,也不通用。根据自己的需求,使用目前比较流行 

Struts+Hibernate的框架技术实现,一方面它本身封 

装了开发包,可以直接使用包中的方法,另一方面也 

可以自己封装一些相关的功能,譬如:分页处理以及 

表头格式等。而且,框架技术对异常处理机制的支持 

是常规方法无法比拟的,它将上传过程中的错误集中 

控制并返回不同的错误信息,为具体设计相关的方法 

带来了更大的实惠和很好的应用效果。 

参考文献: 

[1]戚艳军,等.基于Struts框架实现Web应用文件上传[J].西 

安建筑科技大学学报(自然科学版),axe5(2);270-273. 

[2] 施兴健,徐良贤.Hibemate在Struts中的研究和应用 

[J].计算机工程,2004,30(z1):165-167,190. 

[3]孙卫琴.基于MVC的Java Web设计与开发[M].北京: 

电子工业出版社,2004. 

[4]夏听,等.深入浅出Hibernate[M].北京:电子工业出版 

社.2005. 

[5] 马正华,周重益,潘操.基于Sturts架构的Web应用研究 

与实现[J].工矿自动化,2005(6):12-14. 


本文标签: 方法 对象 文件 实现 查询