Struts2(共10篇)
Struts2 篇1
0、引言
Hibernate是一个非常优秀的ORM框架,通过使用Hibernate框架,允许开发人员使用面向对象的方式进行数据库访问,从而避免了是原始的JDBC进行数据库访问。在这种方式下,企业应用的面向对象分析、面向对象设计和面向对象编程一脉相承,让系统分析、设计更加简洁【4】。
Hibernate作为JAVA EE持久化的解决方案,使用传统的POJO作为系统的持久化类,具有低侵入式设计,不会造成代码污染。系统的持久化类无需继承任何Hibernate基类,或者实现任何Hibernate接口,提供了极好的代码复用。
Struts2是JAVA EE应用的MVC层解决方案,主要提供系统的控制器支持,当然也为系统的页面表现提供了一些标签支持。
可见,Struts2主要用于实现用户交互功能,而Hibernate则主要用于实现系统的持久化。因此,Struts2通常不会直接访问Hibernate API,即使Struts2并不直接与Hibernate整合。但我们可以通过一个中间层,让系统向上整合Struts2框架,向下整合Hibernate框架,并通过JAVA EE的DAO模式,将Hibernate和Struts2框架以松耦合的方式整合在一起。
1、Hibernate概述
对于JAVA EE应用而言,不可避免地设计数据库访问,而目前主流数据库都是关系数据库,JAVA EE应用的编程语言是纯粹的面向对象语言。Hibernate允许程序员开发者采用面向对象的方式来操作关系数据库。因为有了Hibernate的支持,使得JAVA EE应用开发过程的OOA(面相对象分析)、OOD(面向对象设计)和OOP(面向对象编程)三个过程一脉相承,成为一个整体【2】。
虽然Hibernate这个框架问世的时间不长,但已经成为目前最流行的持久化层解决方案,Hibernate更具有面向对象的特征,较之传统的Entity EJB的持久层解决方案Hibernate则采用低侵入式的设计,即完全采用普通的Java对象(POJO),而不必继承Hibernate的某个超类或实现Hibernate的某个接口。Hibernate是面向对象的程序设计语言和关系数据库之间的桥梁,Hibernate允许程序开发者采用面向对象的方式来操作关系数据库。
Hibernate是一个面向JAVA环境的对象/关系数据库映射工具,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。
Hibernate的目标是释放开发者通常的数据持久化相关的编程任务的95%。对于以数据为中心的程序而言,往往在数据库中使用存储过程实现商业逻辑,Hibernate可能不是最好的解决方案,但对于那些基于JAVA的中间件应用,设计采用面向对象的业务模型和商业逻辑,Hibernate是最有用的。不管怎样,Hibertnate能消除那些针对特定数据库厂商的SQL代码,并且把结果集从表格式的形式转换成值对象的形式。
Hibernate不仅管理JAVA类到数据库表的映射,还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。
Hibernate能在众多的ORM框架中脱颖而出,因为Hibernate与其他ORM框架对比具有如下优势:
◆开源和免费的License,方便需要时研究源代码,改写源代码,进行功能定制。
◆轻量级封装,避免引入过多复杂的问题,调试容易,减轻程序员负担。
◆具有可扩展性,API开放。功能不够用时,自己编码进行扩展。
◆开发者踊跃,产品有稳定的发展保障。
2、Struts2简介
Struts2是一个为开发基于模型 (Model) -视图 (View) -控制器 (Controller) (MVC) 模式的应用架构的开源框架,是利用Java Servlet和JSP构建Web应用的一项非常有用的技术。Struts2使用了WebWork的,由于Struts2能充分满足应用开发的需求,简单易用,敏捷迅速,因而吸引了众多的开发人员的关注。首先事件是指从客户端页面(浏览器)由用户操作触发的事件,Struts2使用Action来接受浏览器表单提交的事件,这里使用了Command模式,每个继承Action的子类都必须实现一个方法execute () 。Struts2重要的表单对象ActionForm是一种对象,它代表了一种应用,这个对象中至少包含几个字段,这些字段是Jsp页面表单中的input字段,因为一个表单对应一个事件,所以,当我们需要将事件粒度细化到表单中这些字段时,也就是说,一个字段对应一个事件时,单纯使用Struts2就不太可能,当然通过结合JavaScript也是可以转弯实现的。Struts2是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。Struts2把Servlet、JSP、自定义标签和信息资源 (message resources) 整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts2是一个非常不错的应用框架。
3、自定义整合方案
从上面的介绍中,我们可以看出,Hibernate是一个持久层解决方案,它使用O/R Mapping来简化持久层编程,允许开发者使用面向对象方式进行数据库操作。Struts2则是一种MVC层的解决方案,它致力于与用户交互层次。严格来讲,Struts和Hibernate是不能直接整合,因为必须在Hibernnate和Struts2中间插入其他解决方案。对于严格的JAVA EE分成理论而言,底层持久化API不应该暴露给MVC层框架。
Struts2无法和Hibernate直接交互,因此,如果需要将Hibernate和Struts2整合,必然有如图1所示的架构方案。
Hibernante的数据库访问是建立在JDBC技术基础之上的。这就是说:虽然使用Hibernate技术无需显示使用JDBC编程,但Hibernate框架本身还必须借助于JDBC技术。【5】
Hibernante对传统JDBC进行包装,对外提供了一种面向对象的编程方式,但Hibenrnate底层仍然采用JDBC进行数据库访问,只是Hibernante底层的JDBC操作对用户是完全透明的。
图中包含了一个虚线框;中间层组件,这个组建包含了非常复杂的内容,大部分业务操作都是由该组件负责实现的,即使图中的中间层组件,也并不是直接访问Hibernate持久层API,为了提供更好的解耦,我们可以见中间层组件分为两个层:
业务逻辑层:改成的组件专注于业务逻辑的实现,避免与任何的持久化技术耦合。
DAO层:该层里包含大量的DAO组件,每个DAO组件专注于底层持久化实现,一个具体的DAO组件职能与特定的持久化技术耦合。
在这种策略下,中间层组件按功能分成了两层,业务逻辑层组件专注于实现业务逻辑功能,但不关心底层的持久化访问,无需理会业务逻辑功能,这种策略将不通功能封装在不同组件中,提供了更好的复用和解耦。
为了让上面的架构有较好的解耦,必须将上面的业务逻辑组件和DAO组件的接口,而不是依赖与DAO组件的实现类。
4、整合方案的实现策略:
为了实现上面的设计架构,这种策略应该为每个DAO组件、业务逻辑组件都提供一个接口,从而将应用中的各组件形成接口依赖,而不是类依赖。具体的说,就是让系统的Action依赖于业务逻辑组件接口,而业务逻辑组件则依赖于DAO接口。一旦采用面向接口的编程方式,则工厂模式也是必不可少的,Action不再关心业务逻辑组件的实现,而是通过业务逻辑组件工厂来获得业务逻辑组件,而业务逻辑组件也不再关心DAO组件的实现,而是通过DAO组件工厂来获得DAO组件。在这种整合策略下,中间层组件有如图所示的顺序图:
从图中看出,通过这种策略,控制器Action不再直接依赖于业务逻辑组件实现类,而是依赖于业务逻辑组件接口;而业务逻辑组件不再依赖与DAO组件实现类,而是依赖于DAO组件接口,从而提供良好的解耦。
我们完全可以将系统中的DAO组件和业务逻辑组件配置在一个配置文件中,并在DAO工厂和业务逻辑组件工厂统一起来,使用一个工厂类来管理系统中DAO组件和业务逻辑组件。这的确是一个好思路,而且很容易实现,对于控制器而言,它是根据XML文件的组件ID来取得系统组件,至于该组件是业务逻辑组件还是DAO组件,根本不是Action说需要关心的。
因此,上面整合结构中的业务逻辑组件工厂和DAO组件工厂完全可以合并成一个工厂,因为所有的业务逻辑组件和DAO组件都通过一个配置文件进行管理,所以所有的DAO组件和业务逻辑组件都通过一个工厂类进行管理,在这种模式下,可以让系统创建业务逻辑组件时就完成该业务逻辑组件所需的DAO组件的初始化。
为了让系统业务逻辑组件知道所依赖的DAO组件,可以有如下形式的配置文件:
通过上面配置文件,即可让系统在创建persoService组件,personDao和sonDao组件注入persoService组件中,从而避免了persoService组件主动通过DAO工厂获取DAO组件,从而提供更好的解耦。
5、总结
文章介绍了Hibernate和Struts2的概念和机制,并提出了Struts2整合Hibernate的新方案,该方案并不直接在Struts2的Action中访问Hibernate API,而是使用业务逻辑工厂、DAO组件工厂来管理系统的业务逻辑组件,将Hibernate的持久化访问都封装在DAO组件里,从而提供较好的解耦。
参考文献
[1].《Java Web服务应用开发祥解》.飞思科技产品研发中心电子工业出版社2002年4月
[2].《Hibernate ORM最佳实践 (配光盘) 》作者:陶勇李晓军清华出版社2007年9月
[3].《Spring应用开发完全手册 (附盘) 》作者:明日科技人民邮电出版社2007年
[4].王庆生闫宝华《Hibernate和struts的整合架构中数据持久化技术的应用研究》太原理工大学学报2008年5月
[5].《Struts2权威指南--基于WebWork核心的MVC开发》李刚电子工业出版社, 2007年9月
Struts2 篇2
标识、可以、如果没写,说明该包为默认空间 2.Action 的实现通集成常用那种方法? 一种是直接实现自己的Action 另一种是实现Action的接口 继承ActionSupport 3.不属于Struts2的动作类的常量返回值的是(C)
A.success
B.input
C.never
D.login 4.以下不属于Struts2动作执行的结果类型是(A)a.action b.redirect c.redirectAction d.dispatcher 5.在struts.xml中。假如在一个package中没有配置namespace,那么在其中配置一个Action名字叫做login,它的result是这样配置的
配置的
A A.在根路径后输入/login B.在根路径后输入/user/login C.在根路径后输入/login/user D.在根路径后输入/abc/login 6.正规开发中,在使用struts2时定义Action使用哪种方式。B A.直接定义Action类。B.从ActionSupport继承。C.从Action继承。D.实现Action接口。
7.不同的线程在调用Action时创建几个Action实例。C A.1个 B.2个
C.每个线程创建1个。D.可以自定义配置。
8.struts提供了Action接口定义了5个标准字符串常量,不包括的有(C)A SUCCESS
B NONE C REG D LOGIN
9.列举出action执行结果类型,并说明用途。
默认结果类型是dispatcher chain:Action链式处理的结果类型,也就是将结果转发到这个action中。
dispatcher:用于整合JSP的结果类型
redirect:实际上dispatcher和redirect的区别就是在于转发和重定向的区别。
redirect-action:重定向action 10.struts2中result-type的chain和redirectAction的区别 chain,它是一个琏式的,是从一个Action转发另外一个Aciton redirectAction,是从新请求一个Action 11.action的class里面写的是什么? Action相应类的详细路径
12.action的extends里面调用的是什么?
从另外一个包继承、相当于拥有即承包的所有配置
13.如果不写action的后面mothod,默认的调用的方法是什么,如果写的话,写的时候有什么需要注意的?
不写会默认调用最上面的方法
14.输出值的strtus标签是什么?
s:property
15.循环的struts标签是什么?
s:iterator
15.判断的strtuts标签是什么?
s:if
16.显示文本的strtuts标签是什么?
17.请简述前台提交后是如何到达后台action的。
通过form表单action找到struts配置文件相应action的类 再去找相应action类里的方法
Struts2习题2
一、填空题
1.Struts2框架由___________和___________框架发展而来。(Struts&WebWork)2.Struts2以___________为核心,采用___________的机制来处理用户的请求。(WebWork,拦截器)
3.Struts2中的控制器类是一个普通的___________。Class或填过滤器类
二、选择题
1.不属于Action接口中定义的字符串常量的是___________。B A.SUCCESS B.FAILURE
C.ERROR D.INPUT 2.在控制器类中一般需要添加相应属性的___________和___________。AC A.setter方法 B.as方法 C.getter方法 D.is方法 3.控制器需要在___________配置文件中进行配置。B A.web.xml B.struts.xml C.struts2.xml D.webwork.xml 4.不属于Struts 2表单标签库的是___________。D A.
三、简答题
1、简述什么是MVC?
MVC即模型-视图-控制器.MVC是一种设计模式,它强制把应用程序的输入处理和输出分开.视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并能接受用户的输入,但是它并不进行任何实际的业务处理。模型是应用程序的主体部分。模型表示业务数据和业务逻辑。控制器接受用户的输入并调用模型和视图去完成用户的需求
2、简述servlet的生命周期。
Struts2 篇3
关键词:Struts2;Ajax;架构
中图分类号:TP311.52 文献标识码:A 文章编号:1007-9599 (2012) 09-0000-02
一、概述
2010年2月,中国汽车零部件规模以上企业数量上升至10788家[1],汽车配件因其车型、零部件种类多,在汽配行业中手工管理己经不能适应市场经济的发展。实时、互动、全面、客观的网络营销特性能为企业带来更多的销售机会,大大拓展交易的灵活性。因此,通过网络进行交易将是以后进行汽车配件的销售一个重要的发展趋势。要快速开发出功能强大、可扩展性强的网上商城系统必定要使用基于MVC设计模式的框架技术,而Strut2以其简化的开发流程、灵活的执行控制和全程可测试等特点,正是此中的佼佼者。本文阐述了采用Struts2的系统实现,同时运用AJAX技术增强用户的体验。
二、Struts 2
Struts 2是以WebWork为核心设计,吸收Struts1的优秀部分,建立起来的优秀的MVC框架。Struts 2与Struts 1在体系结构上有着巨大的差别,Struts2采用一种与Struts1完全不同的非常松耦合的设计,让框架中的Action不再与Serlet API耦合,增强了单元的可维护与测试性。同时Struts2的开发者设计了强大的标签库,这些标签即提供了对表现层数据处理的功能,还提供了包括国际化、AJAX、上传下载等Web操作的常用功能。Struts2可用来创建企业级Web应用的可扩展框架,其综合Struts1和WebWork的优点,简化了复杂问题,可应用于整个软件周期的构建、发布和维护[2]。
Struts2框架中,用户的请求大多是使用拦截器来处理,请求首先通过在Web应用的部署描述符里注册的Servlet Filter控制器截获,其后根据请求资源的类型分派到相应的模块Action中,或者进行直接读取操作。若为Action的请求,则通过一系列配置好的Interceptor执行通用功能,如验证、设置参数、上传文件等。然后,到达相应的action类调用相应的execute方法产生不同的result,再通过在struts.xml中的配置信息把这些result分别转换成不同的Web响应。
三、AJAX
AJAX(异步JavaScript和XML)是指一种异步交互方式的网页开发技术,让用户使用B/S(浏览器/服务器)架构上的Web系统时可以体验到C/S(客户机/服务器模式)架构上操作的连续性。Ajax并不是一项新的技术,它只是几种早己出现的技术的综合使用,是一种新的互联网应用设计思想和实现方式。Ajax主要由如下一些技术要点组成[3]:
1.页面描述语言:HTML,XHTML和XML;
2.页面文档展示模式语言:Cascading Style Sheet(CSS);
3.页面交互和动态展示:W3 C Document Object Model(DOM);
4.客户端语言:JavaScript;
5.异步数据传输和交互:XMLHttpRequest;
6.数据转换:XML,XSLT,HTML,JSON;
7.传输协议:HTTP,HTTPS;
8.服务器端语言:JSP,JSF,PHP,ASP等。
使用JavaScript作为黏合剂将以上技术结合起来,让它们在Web应用系统的不同层次发生作用,从而实现用户与系统良好的交互效果。
四、设计与实现
(一)架构和总体流程设计
本系统采用经典的MVC三层结构,即数据持久层(Data Persistence)、业务逻辑层(business)、视图表现层(View)。这样的优势在于对一个组件的更改不会影响另外两个组件;表示层和数据层相互独立,使系统具有良好的可扩展性;实现组件的充分复用和良好的分工合作。本系统的建设目标是构建一个技术先进、安全稳定、可扩展性强的网络销售系统。系统总体流程如图1所示。
(二)具体实现
(1)数据持久层的实现
在数據持久层,实体类是一个普通的JavaBean,包含若干属性及其相应的Getter和Setter方法,每个业务实体类与数据库中的一张数据表相对应(也可以考虑到需求增加或减少一些与表字段相对应的属性)。同时都实现java.io.Serializable接口,以便进行序列化。因为对数据库的操作共分为增删改查四种,所以系统在构建DAO操作层时只需要关注相应方法的编写,同时注意这些方法的通用性。系统构建一个DAO的基类,对以上四种操作进行封装,建立基础操作方法,声明save()方法用来保存数据记录,也可以更新记录,声明delete()方法用于数据距离的删除,声明load()方法用于根据对象的ID和对象类型获取实体对象信息。之后建立的具体DAO对象都继承自这个基类,自动获取基础操作方法,实现对汽车配件信息数据库的操作。
(2)业务逻辑层的实现
在业务逻辑层,系统构建一个包含业务对象基本属性和方法的基础业务类,汽车配件商城的每一个新建的业务对象都继承这个基础业务类。利用基本的面向对象开发思想,系统既实现了业务代码的复用,也规范了商城的业务流程,也方便扩展和管理。系统对业务逻辑处理分为两类:一个是简单对象处理,例如每个对象自身的增加、删除和修改操作;另一个是复杂逻辑处理,这类操作主要是针对关系交错复杂、业务逻辑繁多的对象,将某一类操作抽离,形成一个专门的处理对象,保证程序较好的解耦性。系统利用Struts2与Servlet API良好的解耦性,首先开发上层通用的Action基类或接口,再针对不同的业务逻辑开发相应的Action实现类,继承基类或实现接口,把调用数据持久层的增删改查操作(或相应的业务逻辑代码)的方法放置在一个Action类中,完成相关业务操作。
(3)视图表现层的实现
表现层的主要功能就是把经过业务逻辑层处理过的数据重新组合,并以特定视图样式展现给用户,也可以将来自视图的数据组合封装,传给业务逻辑层进行处理。为了使页面组件化,实现模块的重用,系统使用了模板语言Freemarker实现视图展现部分。Freemarker是一种Java模板语言,可以在Servlet容器外使用。
DWR是一个Java Ajax框架,允许开发人员在客户端通过Javascript代码调用服务器端的Java方法。首先将dwr.jar和common-logging.jar都复制到WEB-INF/lib下,修改web.xml文件保证将请求转发给DWR的核心Servlet,同时在web.xml同目录下创建dwr.xml,用来定义Java类和Javascript之间的对应关系。然后导入DWR的Javascript文件,包括engine.js和util.js,之后就可以在页面实现无刷新效果了。本系统中的很多页面效果,比如查找的自动补全效果,就是DWR的贡献。
最后通过对Struts2配置文件struts.xml的编辑,来配置Action中method属性与result元素的对应关系,主要采用通配符的方式,使页面更为丰富,系统更加灵活。
五、结束语
通过对网上汽车配件商城系统的设计开发可以发现,Struts2使用拦截器来捕获请求参数并完成解析,同时融合了控制反转和面向方面编程的思想,实现了可插拔式的编程方式,解决了Struts1与Servlet API的紧耦合性,方便日后对代码复用和维护。结合AJAX技术的应用,提高了响应速度、增强了客户体验。随着Struts2技术的普及,相信Struts2会在更多的Web领域里体现它强大的功能。
参考文献:
[1]2010-2015年中国汽车零部件行业投资分析及前景预测报告.2010,8
[2]Apache software foundation.Struts2[EB/OL].[2008-1028].http://struts.apache.org/2.0.x/index.html.
[3]ZEPEDA J S,CHAPA S V.From desktop applications towards ajax Web applications[C].Electrical and Electropics Engineering,2007.ICEEE 2007.4th International Conference on 5-7 Sept,2007:193-196
[4]王彬,張计龙.Struts2框架的改进与实现[J].大连海事大学学报,2010,36(2):75-77,80
Struts2 篇4
相对于Struts1框架而言, Struts2框架是一个全新的框架, 尽管两个框架在名字上相似, 但Struts2框架和Struts1框架在体系上的差别非常大。实际上, Struts2并非一个全新的框架, 因为Struts2和另外一个MVC框架Web Work非常相似, Struts2是基于WebWork核心的。Struts2更像是一个Web Work的升级版本, 从Web Work到Struts2到是一次平滑的过渡。
1 Web Work框架
Web Work框架来自另一个优秀的开源组织opensymphony。Web Work是建立在名叫Xwork的项目基础之上的。
Xwork简洁、灵活且功能强大, 它是一个标准的Command模式实现, 并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截器 (interceptor) , 运行时表单属性验证, 类型转换, 强大的表达式语言 (OGNL, the Object Graph Notation Language) , Io C (Inversion of Control反转控制) 容器等。
Webwork2建立在Xwork之上, 处理HTTP的响应和请求。Webwork2使用Servlet Dispatcher将HTTP请求变成Action (业务层Action类) 、session (会话) 及application (应用程序) 范围的映射, request请求参数映射为Webwork2支持的多视图表示, 视图部分可以使用JSP、Velocity、Free Marker、Jasper Repots、XML等[1]。
2 Struts1框架
Struts1的视图部分由JSP实现。Struts1提供了丰富的标签库, 通过这些标签库可以减少脚本的使用。Struts1提供了与Ties框架的整合, 通过Ties框架提供的模板机制, 可以提高网页的可重用性和可扩展性。但Struts1所支持的表现技术仍非常单一。Action Form Bean作为数据传输对象 (DTO) , 用于在视图和控制器之间传递数据。Action FormBean通常被划分到视图层。
Struts1的控制器由两部分组成:系统核心控制器和业务逻辑控制器。系统核心控制器为Action Servlet, 它继承Http Servlet类, 负责接收所有的HTTP请求, 然后根据用户请求决定是否需要调用业务逻辑控制器。如果需要调用业务逻辑控制器, 则将请求转发给Action处理, 否则直接转向请求的JSP页面。业务逻辑控制器是用户自定义的Action类, 需要继承系统的Action类, 负责调用模型方法, 充当用户请求和业务逻辑处理之间的适配器[2]。
Struts1的程序运行流程如图1所示。
3 Struts2框架
Struts2使用了Web Work设计核心, 而不是Struts1设计核心。Struts2框架与Web Work框架相比, 在很多方面仅仅是改变了其在Web Work下的名称。图2为Struts2体系概图。
从处理流程上看, Struts2 (Web Work) 与Struts1类似, 它们的核心都由控制器组成。Struts2的控制器也由两部分组成:核心控制器Servlet Dispatcher和业务逻辑控制器Action。
Struts2的处理流程如下:
浏览器发出请求。
核心控制器Filter Dispatccher根据请求决定调用合适的Action。
拦截器链自动对请求应用通用功能, 如workflow、validation、或文件上传等功能。
回调Action的execute方法, 该方法获取用户的请求参数, 并调用业务逻辑。
Action的execute方法根据执行结果返回result值, 在struts.xml配置文件中, 指定result值和视图资源之间的映射关系。Struts2支持的视图资源除了JSP以外, 还有Velocity、Free Marker等。
3.1 核心控制器Servlet Dispatcher
核心控制器是一个Filter, 由框架提供。当用户的请求到达时, 它会过滤所有的用户请求, 如果用户请求以Action结尾, 该请求将被转入Struts2框架处理。Struts2框架根据请求*.action的“*”部分决定调用哪个Action。Action和其实现类之间的对应关系都定义在struts.xml文件中。Struts2框架提供了一系列拦截器, 这些拦截器负责将Http Servlet Request请求中的请求参数解析出来, 传入到Action中, 并回调Action的execute方法来处理用户请求。
Interceptor (拦截器) 将Action共用的行为独立出来, 在Action执行前后运行。这其实就是AOP (Aspect Oriented Programming, 面向方面编程) 。Interceptor将很多功能从用户的Action中独立出来, 减少了Action的大量代码, 独立出来的行为具有很好的重用性。Struts2的许多功能都是由Interceptor实现, 可以在配置文件中组装Action用到的Interceptor, 它会按照指定的顺序, 在Action执行前后运行。这就将需求功能从不相关类中分离出来;同时, 能够使得很多类共享一个行为, 一旦行为发生变化, 不必修改很多类, 只要修改这个行为就可以。这种处理方式是典型的AOP处理方式。
3.2 业务逻辑控制器Action
业务逻辑控制器Action, 由用户自定义。与Struts1的Action不同, Struts2的Action完全与Servlet API分离, 因而该Action更容易测试。Struts2中的Action不再像Struts1中的Action那样需要继承Action父类, 它可以无需实现任何接口, 一个POJO就可以充当Struts2的Action。下面是一个以POJO作为Action的例子:
从以上代码可以看出, 这个Action与POJO的区别就是多了一个无参数的execute方法。在Action的execute方法中, 不需要任何参数, 这样设计的一个明显好处是, 不需要把整个Web应用部署到Web容器中, 即可对所写的Action类进行测试, 这给开发人员带来了极大方便。由于它不依赖于servlet请求, 更增强了它的可移植、可重用性[2]。
Struts2中Action的属性可以实现和Struts1中Action Form的属性相当的功能, 可实现表单数据的封装, 但它们实现的方式是不同的。在Struts2中, 是利用框架提供的Interceptor来解析用户请求, 并将请求值赋给Action的对应属性。
为了让用户开发的Action处理类更规范, Struts2提供了一个Action接口, 这个接口定义了Struts2的Action处理类应实现的规范。另外, Struts2还提供了Action类的实现类Action Suport。该类提供了许多默认方法, 包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等, 用户的Action类继承该类后, 将大大简化Action的开发。
Struts2提供了一个Action Context类, 通过该类可以访问Servlet API。利用Action Context来访问Servlet API, 不能直接获取Servlet API实例, 为了在Action中直接访问Servlet, Struts2还提供了一系列接口:Servlet Context Aware、Servlet Request Aware、Servlet Response Aware, Action类实现这些接口, 可获得Servlet API实例。
3.3 Struts2视图层
Struts2的视图部分通过大量的标签提供支持。Struts2标签库是Struts2的重要组成部分, Struts2标签库提供了非常丰富的功能, 这些标签库不仅提供了表现层的数据处理, 而且提供了流程控制功能、国际化、Ajax支持等功能。
与Struts1标签相比, Struts2标签使用OGNL表达式作基础。因此, 对集合、对象的访问非常便利。Struts2标签库将所有标签都统一到一个标签库下, 简化了用户对标签库的使用。
Struts2标签库整合了Dojo的支持, 因此, 可以生成更多页面表示效果。Struts2提供了许多额外的标签, 包括如日期时间选择器, 树形结构等。除此之外, 借助于底层的DWR支持, Struts2标签库提供了Ajax支持, 可以通过使用Struts2标签库来非常轻松地完成各种Ajax效果。
Struts2提供了主题、模板支持, 极大简化了视图页面的编写, 而且它们有很好的可扩展性, 如果现有的主题、模板不能满足项目需求, 完全可以开发自定义的主题、模板、可以实现更好的代码复用;Struts2还允许在页面中使用自定义组件, 这完全能满足项目中页面显示复杂多变的需求[3]。
同Web Work一样, Struts2对多种表现层技术:JSP、Velocity和Free Marker等都有很好的支持, 从而给开发者更多的选择, 提供了更好的兼容性。
4 结语
Struts2核心控制器使用拦截器机制, 具有更高的灵活性和可复用性;Struts2业务逻辑控制器Action可自定义, 可不直接与任何的Servlet耦合, 增加了代码的可复用性且更易于测试;Struts2视图层提供了丰富的标签库, 而且还支持除JSP以外的其它表现层技术。此外, Struts2还提供了非常灵活的扩展方式:插件。理论上, Struts2可通过插件与任何框架整合, 这极大地提高了Struts2的可扩展性。Struts2是一个有前途的框架。
参考文献
[1]唐善成.Webwork原理初探[J].电脑知识与技术, 2005 (6) :83.
[2]孙卫琴.精通Struts:基于MVC的Java Web设计与开发[M].北京:电子工业出版社, 2006:15.
Struts2 篇5
1、struts2工作流程
Struts 2框架本身大致可以分为3个部分:
核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。
核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。
业务控制器Action和业务逻辑组件是需要用户来自己实现的。
用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。
Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。基本简要流程如下: 1、客户端初始化一个指向Servlet容器的请求;
2、这个请求经过一系列的过滤器(Filter)
(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
9、响应的返回是通过我们在web.xml中配置的过滤器
10、如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,则将会去清理sreadlocals。
2、说下Struts的设计模式
MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生 成动态的网页,返回给客户。
3、拦截器和过滤器的区别
1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
4、struts1于struts2的比较
1、Action 类: Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
2、线程模式: Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
3、Servlet 依赖: Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和
HttpServletResponse 被传递给execute方法。
Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和
HttpServletResponse的必要性。
4、可测性:
测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
5、捕获输入:
Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。
Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过
web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种
ModelDriven 特性简化了taglib对POJO输入对象的引用。
6、表达式语言:
Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言-- “Object Graph Notation Language ”(OGNL).7、绑定值到页面(view): Struts 1使用标准JSP机制把对象绑定到页面中来访问。
Struts 2 使用
“ValueStack ”技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
8、类型转换:
Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。
9、校验:
Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
10、Action执行的控制:
Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
为什么要使用Struts2 Struts2 是一个相当强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架。它基于当年的Webwork和XWork框架,继承其优点,同时做了相当的改进。
1.Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程。
2使用OGNL进行参数传递。
OGNL提供了在Struts2里访问各种作用域中的数据的简单方式,你可以方便的获取Request,Attribute,Application,Session,Parameters中的数据。大大简化了开发人员在获取这些数据时的代码量。3强大的拦截器
Struts2 的拦截器是一个Action级别的AOP,Struts2中的许多特性都是通过拦截器来实现的,例如异常处理,文件上传,验证等。拦截器是可配置与重用的,可以将一些通用的功能如:登录验证,权限验证等置于拦截器中以完成一些Java Web项目中比较通用的功能。在我实现的的一Web项目中,就是使用Struts2的拦截器来完成了系统中的权限验证功能。4易于测试
Struts2的Action都是简单的POJO,这样可以方便的对Struts2的Action编写测试用例,大大方便了5Java Web项目的测试。
易于扩展的插件机制在Struts2添加扩展是一件愉快而轻松的事情,只需要将所需要的Jar包放到WEB-INF/lib文件夹中,在struts.xml中作一些简单的设置就可以实现扩展。6模块化管理
Struts2已经把模块化作为了体系架构中的基本思想,可以通过三种方法来将应用程序模块化:将配置信息拆分成多个文件把自包含的应用模块创建为插件创建新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到多个应用中去。
7全局结果与声明式异常
为应用程序添加全局的Result,和在配置文件中对异常进行处理,这样当处理过程中出现指定异常时,可以跳转到特定页面。
他的如此之多的优点,是很多人比较的青睐,与spring ,Hibernate进行结合,组成了现在比较流行的ssh框架,当然每个公司都要自己的框架,也是ssh变异的产品。
struts2有哪些优点?
1)在软件设计上Struts2的应用可以不依赖于Servlet API和struts API。Struts2的这种设计属于无侵入式设计; 2)拦截器,实现如参数拦截注入等功能;
3)类型转换器,可以把特殊的请求参数转换成需要的类型; 4)多种表现层技术,如:JSP、freeMarker、Velocity等; 5)Struts2的输入校验可以对指定某个方法进行校验;
6)提供了全局范围、包范围和Action范围的国际化资源文件管理实现
struts2是如何启动的?
struts2框架是通过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器; StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。
struts2框架的核心控制器是什么?它有什么作用?
1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。2)作用:
负责拦截由
可以通过常量“struts.action.extension”修改action的后缀,如:
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
struts2配置文件的加载顺序?
struts.xml ——> struts.properties 常量可以在struts.xml或struts.properties中配置,如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.struts.xml文件的作用:通知Struts2框架加载对应的Action资源
struts2常量的修改方式?
常量可以在struts.xml或struts.properties中配置,两种配置方式如下: 1)在struts.xml文件中配置常量
struts.action.extension=do struts2如何访问HttpServletRequest、HttpSession、ServletContext三个域对象?
方案一:
HttpServletRequest request =ServletActionContext.getRequest();HttpServletResponse response =ServletActionContext.getResponse();HttpSession session= request.getSession();ServletContext servletContext=ServletActionContext.getServletContext();
方案二:
类 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware 注意:框架自动传入对应的域对象
struts2是如何管理action的?这种管理方式有什么好处?
struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。
主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
struts2中的默认包struts-default有什么作用?
1)struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从请求中
把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。2)struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。Struts2每次都会自动加载 struts-default.xml文件。
3)通常每个包都应该继承struts-default包。
struts2如何对指定的方法进行验证?
1)validate()方法会校验action中所有与execute方法签名相同的方法; 2)要校验指定的方法通过重写validateXxx()方法实现,validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写; 3)当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport),如果系统 的fieldErrors包含失败信息,struts2会将请求转发到名为input的result;
4)在input视图中可以通过
struts2默认能解决get和post提交方式的乱码问题吗?
不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。
请你写出struts2中至少5个的默认拦截器?
fileUpload 提供文件上传功能
i18n 记录用户选择的locale cookies 使用配置的name,value来是指cookies checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。
chain 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。
alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变
值栈ValueStack的原理与生命周期?
1)ValueStack贯穿整个 Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一样。当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。请求来的时候,action、ValueStack的生命开始,请求结束,action、ValueStack的生命结束;
2)action是多例的,和Servlet不一样,Servelt是单例的;
3)每个action的都有一个对应的值栈,值栈存放的数据类型是该action的实例,以及该action中的实例变量,Action对象默认保存在栈顶; 4)ValueStack本质上就是一个ArrayList;
5)关于ContextMap,Struts 会把下面这些映射压入 ContextMap 中: parameters : 该 Map 中包含当前请求的请求参数
request : 该 Map 中包含当前 request 对象中的所有属性 session :该 Map 中包含当前 session 对象中的所有属性
application :该 Map 中包含当前 application 对象中的所有属性 attr:该 Map 按如下顺序来检索某个属性: request, session, application 6)使用OGNL访问值栈的内容时,不需要#号,而访问request、session、application、attr时,需要加#号;
7)注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:
ActionContext、ServletContext、pageContext的区别?
1)ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用; 2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用;
3)pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时,pageContext销毁,生命周期是JSP四个域对象中最小的。
result的type属性中有哪几种结果类型?
一共10种:
dispatcher struts默认的结果类型,把控制权转发给应用程序里的某个资源不能把控制权转发给一个外部资源,若需要把控制权重定向到一个外部资源, 应该使用 redirect结果类型
redirect 把响应重定向到另一个资源(包括一个外部资源)redirectAction 把响应重定向到另一个 Action freemarker、velocity、chain、httpheader、xslt、plainText、stream
拦截器的生命周期与工作过程?
1)每个拦截器都是实现了Interceptor接口的 Java 类;
2)init(): 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次.可以在该方法中对相关资源进行必要的初始化;
3)intercept(ActionInvocation invocation): 每拦截一个动作请求, 该方法就会被调用一次; 4)destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次;
5)struts2中有内置了18个拦截器。
struts2如何完成文件的上传?
1、JSP页面:
1)JSP页面的上传文件的组件:
name=“xxx”的值必须一样;
2)必须把表单的enctype属性设置为:multipart/form-data; 3)表单的方法必须为post,因为post提交的数据在消息体中,而无大小限制。
2、对应的action:
1)在 Action 中新添加 3 个和文件上传相关的属性;
2)如果是上传单个文件, uploadImage属性的类型就是 java.io.File, 它代表被上传的文件, 第二个和第三个属性的类型是 String, 它们分别代表上传文 件的文件名和文件类型,定义方式是分别是:
Struts2 篇6
随着Web领域的不断发展,MVC (Mode-View-Controller)成为一种公认的优秀设计模式,该模式分为模型层、视图层、控制层,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。Struts2是建立在Struts和WebWork基础上,并且集成了Struts和WebWork的优点,它是使用了MVC设计模式的框架,能够具有更好的可扩展性、强大的功能,同时它也是目前最流行的MVC框架之一[1]。FreeMarker和Velocity是应用在Struts2中非常流行的模板语言。主要研究FreeMarker和Velocity模板语言在Struts2中的应用,工作原理,分析比较两种模板语言的特点,方便开发人员在开发过程中,选择最合适的模板语言开发项目工程,提高工作效率,从而节省了开发所需要的时间。
2 FreeMarker模板语言
FreeMarker是一个用Java编写的模板引擎,能够将数据与页面模板分离,根据指定的模板输出多种规格的文本,如HTML、XML、RTF等。FreeMarker实际上是被设计用来生成HTML页面,尤其是通过实现了基于MVC (Mode-View-Controller)模式的Java Servlet应用程序。使用MVC模式的动态页面的设计思想,可以将前端设计师从程序员中分离出来。网页设计人员专注于改写视图页面的显示内容,而不受到程序开发人员编写底层代码的干扰,这是因为将业务逻辑和视图页面设计被分离出来了。这种设计思想可以让同一个人在同一个项目当中拥有程序员和页面设计师的角色,由于逻辑和视图分离使代码变得简洁,更加方便程序员去维护。
FreeMarker的工作原理是模板+数据模型=输出[2],以此将数据模型中的数据合并到模板并将其输出,如图1所示。虽然FreeMarker也具有一些编程能力,但是它不是一种很全面的编程语言。当程序需要显示数据库的数据信息时,FreeMarker是通过模板生成文本页面把数据库中的数据信息显示出来。
FreeMarker不是Web开发的应用程序框架。它是一个适用于Web应用程序框架中的组件,但是FreeMarker引擎本身并不知道HTTP协议或Java Servlet的存在。它仅仅来生成文本内容。即使是这样,它也非常适用于非Web应用程序的开发环境。值得注意的是,我们使用FreeMarker作为视图层的组件,是为了给例如Struts这样的Model 2应用框架提供现成的解决方案。FreeMarker本身是免费的,它基于BSD规则的许可协议。它也是OSI认证的开源软件[2]。
FreeMarker是Struts2默认的模板技术,较Velocity模板引擎,FreeMarker支持JSP标签,内嵌XML、DOM解析功更强大,使用起来更加方便快捷。此外,Free Marker的指令具有对数据的分值控制、循环输出等功能,对处理Hash和Sequence对象时具有更好的灵活性。Free Marker生成的纯文本的静态文件,有利于减轻服务器的负担[3]。如果用户使用FreeMarker生成纯文本的HTML、XML等文档,服务器需要更少的硬件资源,服务器能够对用户的请求做出快速的响应,不同于JSP页面,当JSP页面发布于服务器上时,用户请求需要不断地与服务器进行交互,从而使服务器占用了大量的资源。与JSP相比较,使用FreeMarker能够提高服务器的响应速度,缩短反应时间,降低对硬件资源的占用率。
3 Velocity模板语言
Velocity模板语言简称VTL,是一个基于Java的模版引擎[4]。在同一个应用程序中,Web设计师可以使用Velocity模板语言预先设计好模板Java开发人员编写程序代码设置上下文,将页面中的数据放入到上下文中,通过使用Velocity引擎将数据和上下文结合起来,实现动态页面的效果。Java代码和视图设计的有效分离[5],可以使Java开发人员专注于Java代码的底层编写,页面设计师专注于页面设计的效果,不需要考虑更多的代码编程,有利于后期应用程序的管理与维护。Velocity可用来从模板产生Web页面,SQL,PostScript以及其他输出,简化了Web开发。它也可用于一个独立的程序以产生源代码和报告,或者作为其他系统的一个集成组件。Velocity还支持模板的国际化编码转换。Velocity也是Apache软件组织提供的一项开源项目,可以免费下载。
Struts2对Velocity提供了很好的支持,只需要经过简单的配置,就可以在程序中使用Velocity,不需要Velocity的API。
4 比较分析
FreeMarker和Velocity都是目前非常流行的两种模板语言,两种语言的语法也很相似,适用对象也基本相同,它们最大的相似点都是通过分离页面视图和程序逻辑,从而实现MVC架构。
FreeMarker比Velocity多了一个格式化的功能,而且FreeMarker还支持JSP标签,内嵌XML DOM解析,功能上要比Velocity强[1]。使用Velocity,需要寻找各种工作环境或者特定工具来一次次地解决典型的模板创作任务,最后会浪费很多时间。工作环境经常意味着把Java对象在Velocity模板中直接使用,这违反了简单、无编程HTML设计的理念。如果将表示任务移到控制器代码中的话,这也违反了MVC框架设计理念。使用FreeMarker,可以以out-of-the-box的方式实现Velocity所能做的。
当访问一个未定义的变量,可以通过配置FreeMarker来停止render模板显示错误信息,或者跳过错误部分,FreeMarker会记录问题(日志),在写错指令名时,FreeMarker也会抛出异常。而Velocity会输出源代码。
Velocity语法上相对FreeMarker要简单一些,不需要什么特定的标签,它只使用简单的$varName来输出变量,灵活度要较FreeMarker高一些。Velocity不支持其他标签库(即在Velocity中不能引用其他标签,如不能使用Struts的标签
5 结语
FreeMarker和Velocity都是优秀的模板语言,分离了页面逻辑和业务逻辑,通过与Struts2的组合使用可以进行高效的工作。Struts2框架采用FreeMarker作为其默认的模板技术,同时对Velocity的支持性也是非常良好,是选择FreeMarker还是选择Velocity,程序开发人员可以根据实际项目中的需求,去选择对自己更加方便、快捷、高效的模板语言。
摘要:Struts2是一个基于MVC架构的框架,有许多视图表示形式。为了使Java Web的页面视图更好地与业务逻辑分离开来,引入了基于Java的FreeMarker和Velocity模板语言,这两种模板语言凭借着自身的优势在众多模板语言中广泛应用,使用FreeMarker和Velocity模板引擎技术,不仅提高了程序员的开发效率,还使得应用程序在较长的时间内具有良好的维护性。
关键词:FreeMarker语言,Velocity语言,模板引擎,Struts 2框架,Java Web应用
参考文献
[1]范立峰,林果园.Java Web程序设计教程[M].北京:人民邮电出版社,2010.
[2]南磊,译.FreeMarker手册.
[3]耿晓君,等.Struts2下基于FreeMarker的XML数据输出与ExtJS的解析实现[J].江苏广播电视大学学报,2009,(05):59-62.
[4]陈涛,白栩翔.Velocity模板引擎技术在Java Web中的应用[J].农业网络信息,2011,(05):38—40.
Struts2 篇7
1 Struts2框架
Struts 2 We b框架作为目前广泛使用的We b应用软件框架, 它通过提供核心控制器实现了Sun的Model2架构, 这个控制器可以用来管理业务逻辑层、JSP页面和其他表现设备之间的流程, 此外Struts2还通过使用拦截器来实现在业务逻辑实现的前后执行各种校验和权验控制工作以及使用Result来实现返回表现层的工作。如图1所示。
从图1中可以得出, Struts的体系结构包括核心控制器, 拦截器, 业务逻辑 (Action) 和业务逻辑返回给客户端的表现页面三部分。
在这里我们主要讨论一下拦截器。拦截器体系是Struts2的重要组成部分, 拦截器可以动态的拦截发给业务逻辑 (Action) 的请求, 通过拦截器机制, 我们可以在业务逻辑执行的前后插入某些代码。通过这种方式, 就可以把多个业务逻辑中需要重复指定的代码提取出来, 放在拦截器里定义, 从而提供更好的代码重用性。
2 安全模型
从以上的Structs2框架分析可得, 客户端请求的所有页面首先都会到控制器会聚再由控制器转发到各个业务逻辑 (业务逻辑再去访问用户所要的资源) , 而在控制器与业务逻辑之间可以添加一定量的拦截器来实现对访问资源对象的访问控制。如图2所示。
图2中安全参考监督器模块是用来进行资源安全访问控制的核心模块, 任何用户对任何资源对象的访问都由此模块来进行许可监督, 只有得到安全参考监督器许可用户才可以访问相应的资源对象。
而对于用户而言其本身也是一种资源, 所以在某一使用者在使用系统资源之前, 其必须以一个特定的用户身份进行登录。为了保证用户登录的合法性, 在此引入了身份验证过程。用户只在合法登录才能进一步的去使用系统中所提供的资源。
3 安全模型的实现
3.1 资源对象的描述及管理
We b软件系统中的资源主要包括网页、文件夹以及各种文件, 为了对这们资源对象实施访问控制就必须对资源对象本身进行描述。在本模型中采用一种称为对象目录的结构来存储系统中的资源对象。对象目录采用面向对象的存储方法, 每一个对象实例包括某一具体对象的各种属性, 如资源编号、资源名、资源所属人以及资源所属组等。如表1所示。
在表1中对于每一项资源对象并没有记录某一用户对其的访问权限, 这是因为对于不同的资源对象权限的多少以及所牵连的用户数量都是不同的, 这样就很难将资源对象的权限记录在每一个对象实例中。为了解决这一问题, 模型引入了资源对象的访问控制列表 (ROACL:Re s ource Obje ct Acce s s Control Lis t) , 每一个资源对象对应于一个资源访问控制列表 (使用资源编号建立关联) 。每一访问控制列表又包含任干访问控制项 (ACE) , 每个访问控制项用来标识用户或用户组对资源对象的访问权限 (如图3所示) 。一般情况下, 访问控制项有四种类型, 分别代表如下含义:拒绝对该资源对象的访问;允许对该资源对象的读取;允许对该资源对象的写入;允许执行该资源对象。访问控制列表首先列出拒绝访问的访问控制项, 然后才是允许的访问控制项, 并且采用默认拒绝模式。
上述的资源对象属性以及其访问控制列表在实现时分别可采用二维的关系表来进行实现, 分别称为资源对象表和访问控制表。在资源对象表中每一个记录代表某一具体资源;而每一访问控制表表示某一资源对象的访问控制列表;从而形成了资源对象表中一项记录对应于某一特定的访问控制表。
用户作为一种特殊的资源, 它是使用者在使用系统的前提。使用者只有获取了合法用户身份才能在进一步的使用系统资源。用户作为一种资源对象其基本属性信息同样保存在系统中, 以便身份验证时使用。用户的基本属性有用户名、密码和用户说明等。由于系统的用户一般都比较多, 为了访问控制能够高效实现, 在设计时可以对用户按某种关系分为几个组, 实现访问控制时除了按用户来也可以按组别来。
3.2 安全参考监督器的实现
安全参考监督器是实现资源安全访问的核心模块, 这一模块根据资源的访问控制列表来保证用户访问的安全性。
当用户通过身份验证后就成为了系统的一个合法用户, 而对于合法用户所言并不意谓着其可以使用系统中的所有资源, 对每一资源的访问都要使用安全参考监督器进行访问控制。访问控制的实现通过对照资源访问控制列表来进行。
3.3 审计功能的实现
审计作为安全系统的一部分, 它记录用户访问某一资源这一现实。对于审计功能系统管理员可以进行相应的设置, 一般可以分为三类:成功访问审计、失败访问审计及全审计。审计功能实现较为简单, 在数据库中建立一张逻辑表来存储审计数据, 表中的每一行记录记录一次访问活动。记录中包含的属性主要有用户、用户所属组、资源对象、时间和成功访问或失败访问等。
4 结论
通过引入安全模型可以对Web资源提供强有力的保护, 从而保证Inte rne t上的资源可以安全地为合法提供服务。对于上述模型通过在校园网Web站点上的实际应用, 在服务器服务效率方面无明显下降, 所以此模型可以在一般的Web应用中进行实现以提高资源安全性。
参考文献
[1]李刚编著.Struts权威指南[M].电子工业出版社, 2007.
[2]邓亚平编著.计算机网络安全[M].人民邮电出版社, 2004.
Struts2 篇8
关键词:设计模式,框架,图书管理
1. 引言
随着人类社会的发展, 人类对知识的需求也不断地增长。在这种形势下, 书籍就渐渐地成为人们获取并增长知识的主要途径, 而图书馆就自然而然地在人们的生活中占据了一定的位置, 如何科学地管理图书馆不但关系到读者求知的方便程度, 也关系到图书馆的发展, 同时现在很多图书馆的系统都是基于C/S模式, 并且同城各图书馆之间的互联也很少, 大大增加了图书资源的浪费, 也给用户对图书的检索和使用增加难度。因此, 开发一套完善的基于Struts2 B/S模式图书管理系统就显得更为重要。
2. Struts2 web框架
Struts 2框架主要由三个部分组成:核心控制器、业务控制器和用户实现的业务逻辑组件。核心控制器FilterDispatcher负责拦截用户请求, 如以action结尾则转入Struts 2框架处理;然后会调用相应业务控制器 (用户实现的Action) 来处理用户请求;业务控制器Action只作为中间负责调度的调度器, 一般不对用户请求进行实际处理, 而是调用模型组件处理具体的业务逻辑;之后核心控制器根据Action的处理结果返回相应视图给用户显示最终处理结果。
Struts2与Struts1相比, 已有很多革命性的改进, 但它并不是新发布的新框架, 而是在非常成熟的WebWork框架基础上发展起来的。从某种程度上来讲, Struts2没有继承Struts1的血统, 而是继承WebWork的很多优点。所以说, WebWork衍生出了Struts2。因为Struts2是WebWork的升级, 因此其稳定性、性能等各方面都有很好的保证, 而且吸收了Struts1和WebWork两者的优势, 其技术水平可以说是绝无仅有的。Struts2是一个崭新的项目, 发展空间很大, 当前最新的技术、最新的理念都包含在其中, 因此使用了Struts2就相当于站在了Java Web开发的最前沿。本系统采用基于Struts2结构的Java Web技术开发, 给系统按时按质的完成提供了保证。
3. 图书管理系统分析
3.1 系统的需求分析
需求分析是系统开发最重要的阶段, 通过需求分析完成在问题和解决方案之间架设桥梁第一步。经过调研后得到图书管理系统的业务需求, 其中以系统管理员为主的用例有: (1) 系统参数管理; (2) 人员管理; (3) 权限管理; (4) 图书订购管理; (5) 馆藏信息查询; (6) 借阅信息查询等。以图书管理员为主的用例有: (1) 图书入馆; (2) 图书报损; (3) 读者管理; (4) 挂失恢复管理; (5) 借书管理; (6) 罚款管理; (7) 还书管理等。以读者为主的用例有: (1) 借阅查看续借; (2) 预约管理; (3) 目录检索和分类导航; (4) 读书指引和新书通报; (5) 图书订购推荐; (6) 用户历史信息查看; (7) 用户信息管理等。
将以上功能分为四大功能集合, 分别为:基本信息管理, 图书订购管理, 图书借阅及查询, 用户及权限管理。
(1) 基本信息管理功能集合:该集合包括系统参数设置、图书入馆、图书报损、读者管理、用户信息管理。
(2) 图书订购管理功能集合:包括图书订购推荐, 和图书订购管理。
(3) 图书借阅及查询功能集合:包括借书管理、还书管理、罚款管理、挂失恢复管理、借阅查看续借、预约管理、馆藏信息查询、借阅信息查询、目录检索和分类导航、读书指引和新书通报、用户历史信息查看等。
(4) 用户及权限管理:包括人员管理、权限管理。
4. 图书管理系统设计
4.1 系统开发的内容
根据系统需求分析可以得出系统开发内容主要包括四个模块:1) 用户及权限管理模块;2) 基本信息管理模块;3) 订购管理模块;4) 借阅查询管理模块。
4.2 系统的总体结构
图书管理系统采用模块化的设计。系统结构模型由物理基础结构、应用支撑平台、图书管理系统三个层次组成。其中物理基础结构是构成教学模拟系统的硬件和网络基础;应用支撑平台建立在物理基础结构之上, 它包括数据库服务器、Web服务器;图书管理系统部署在web服务器上, 可以通过浏览器浏览的方式直接向用户提供图书管理服务, 向读者提供查询、续借等服务。
图书管理系统为局域网运行环境。局域网与校园网互联互通, 再连接到Internet, 从而实现远程服务。
局域网的软件环境为Windows 2000 Server、Oracle9i;硬件为PC级服务器, 512M RAM, PIII800以上CPU, HD40G以上;终端用户PC机PIII 1G/256M/20G/15"带10M网卡。
4.3 数据库设计
系统采用B/S三层体系结构, 在该结构中第三层为数据库服务器, 它的功能是接收Web服务器对数据库的操纵请求。具体实现方法是, 用Oracle作为数据服务器, 以ODBC为数据接口提供数据服务, web服务器用来解释请求并在处理后返回相应的结果, 而浏览器可以下载服务器上应用程序的执行结果。
数据库主要包含表有:人员信息表, 读者信息表, 图书信息表, 借书表, 罚款表等。
4.4 系统模块设计
根据图书管理业务活动的分析, 系统主要设计了四个模块, 各模块及其包含小模块如图1所示。
5. 图书管理系统的实现
5.1 订购管理模块的实现
订购管理模块, 完成图书订购推荐管理, 分为前台管理和后台管理2个功能模块, 功能模块如图2所示。
5.2 图书借阅查询模块的实现
图书借阅查询模块, 完成图书借阅和读者查询管理, 分为前台管理和后台管理2个模块。功能模块如图3所示。
1) 图书借阅查询前台管理
通过浏览器, 读者可以方便的查看自己的借阅信息, 并完成续借操作, 查询图书信息, 并完成预约管理功能。模块提供以下功能:借阅信息查询、续借、馆藏信息查询、预约管理、检索和导航、指引和通报、用户历史信息查看。
2) 图书借阅查询后台管理
管理员通过后台操作, 对读者借阅、挂失、罚款等进行管理, 是保证图书管理正常运行所必须而十分重要的。图书借阅及查询后台管理分为借书管理、还书管理、挂失恢复管理、罚款管理几个部分。
6. 结语
本图书管理系统是为了提供图书管理效率而设计的信息管理系统。论文结合真实的图书管理与读者查询的需要, 考虑参加到整个流程中的不同角色, 全面体验图书管理的借书、续借、预约等过程, 论文的开发完成, 有助于提高图书管理的工作效率, 便于系统维护, 减少系统升级开销, 改善使用者的用户体验, 但还存在一些不足, 如:
系统的安全性, 数据加密存储和传输以提高系统安全性方面要进一步完善, 数据库方面, 通过数据库的优化以提高执行效率的方法还没有深入研究。
参考文献
[1]Nadir G著.陈晓燕, 丁炎炎译.实用J2EE应用程序体系结构.北京:清华大学出版社, 2003
[2]王珊, 萨师煊.数据库系统概论.北京:高等教育出版社, 2001
[3]丁里, 孙元.Java语言SQL接口JDBC编程技术.北京:清华大学出版社, 2001
[4]赵松涛编著.Oracle9i基础培训教程.北京:人民邮电出版社, 2003
[5]Joseph Schmuller, 李虎, 王美英, 等.UML基础、案例与应用教学 (第三版) [M].北京:人民邮电出版社
[6]黄贤英.UML建模过程及在需求分析中的应用.计算机工程, 200l, 27, (11) :184-186
Struts2 篇9
随着分布式系统的广泛应用, 本地数据文件传递到异地数据库的需求日益强烈。在某娱乐场所治安管理信息系统中, 要求各娱乐场所将其基本信息上报给区县级公安局的中心数据库, 区县级公安局根据上报的数据进行查询和统计分析, 制定决策, 实现对娱乐场所的动态监督管理[1]。
国内现有的数据上报系统中有些采用C/S结构[2], 需要安装应用系统特有的客户端软件, 系统的分发和升级也比较繁琐;如果采用B/S结构, 数据传输速率又会受到影响。为了解决上述问题, 本系统采用基于Struts2数据传输系统, 在B/S结构的基础上, 应用FTP传输协议, 使数据传输更加灵活、及时、可靠。
1 Struts2概述[3]
1.1 Struts2相关概念
1) MVC设计模式
MVC设计模式是Xerox PARC在20世纪80年代为编程语言Smalltalk发明的一种软件设计模式。该模式将一个应用分成三个基本部分:Model (模型) 、View (视图) 和Controller (控制器) , 这三个部分以最少的耦合协同工作, 从而提高应用的可扩展性及可维护性。
2) Struts1框架
Struts1是一种基于MVC经典设计模式的开放源代码的应用框架, 也是目前Web开发中比较成熟的一种框架。它通过把Servlet、JSP、JavaBean、自定义标签和信息资源整合到一个统一的框架中, 为Web开发提供具有高可配置性的MVC开发模式。
3) WebWork框架
WebWork来自opensymphony的开源组织, 建立在XWork之上, 使用ServletDispatcher作为该框架的核心控制器, 处理HTTP的响应和请求。WebWork的Action不再与Servlet API耦合, 使单元测试更加方便。
1.2 Struts2框架
Struts2以WebWork设计思想为核心, 吸收了Struts1的部分优点, 建立了一个兼容WebWork和Struts1的MVC框架。Struts2仍是以前端控制器框架为主体的框架, 用户的请求会通过控制器选择不同的Action类来执行具体的操作, 在Action类中所有的Servlet对象仍然可用。Struts2体系结构如图1所示。
从图1可知Struts2的大致处理流程:首先, 浏览器发出请求, FilterDispatcher来进行拦截, 当接受用户的请求时, 它会在struts.xml中查找对应的请求映射的Action;其次, WebWork的Interceptors自动对请求应用通用功能, 例如文件上传等;再次, 回调Action的execute方法, 该execute方法获取用户请求, 在Model组件中执行相应操作;最后, execute方法将处理的结果信息转到View组件中, 可以是HTML、图像, 也可以PDF文档, View组件根据结果以JSP、Velocity、FreeMarker页面的形式返回给浏览器。
2 基于Struts2的数据传输系统
2.1 系统需求
根据用户需求与有关规范, 本数据传输应满足如下要求:
1) 从数据库中读取各个娱乐场所端的从业人员基本信息、营业日志信息、修改日志信息、可疑情况信息以及保安通报信息, 并转换成统一的格式。
2) 与区县级系统的服务器进行通信, 按照规定的协议进行数据传输, 并确保数据传输的及时性和可靠性。
3) 将传输到服务器中心的数据再统一导入到服务器端的数据库中。
4) 为确保安全性, 系统应具有身份验证的功能, 以限制非法操作。
2.2 系统架构
根据系统需求, 我们提出了基于Struts2与FTP的数据传输系统结构如图2所示。Struts2框架的优点是基于B/S结构和MVC模式。B/S结构可避免C/S结构可维护性差, 内网外网通信困难等缺点, 保证数据传输的及时性, 有效的避免上报冲突。采用FTP可提高数据传输的效率, 保证数据的安全性, 克服B/S结构数据传输效率不高, 安全性差的缺点。MVC模式强制地将应用程序的输入、处理和输出分开, 使表示层和用户层分工明确, 从而使体系结构更加清晰, Struts2体系结构如图2所示。
从图2可以看出, 用户对数据进行提取, 即对娱乐场所的数据进行转换, 生成Excel临时文件, 然后在浏览器中选择刚生成的Excel临时文件, 上传给区县级公安局, 区县级公安局工作人员把临时文件下载到本地, 并导入到数据库中, 就完成了数据传输。
2.3 系统实现流程
在数据传输过程中, 为保证数据安全性, 需对其进行两次验证, 分别是初始身份验证和远程服务器连接验证。进行远程服务器连接时如果网络中断, 将自动返回上报页面重新上报。数据上报传输实现的具体流程描述如图3所示。
3 系统实现及关键技术
从图3可以看出, 数据传输的三个部分是:数据提取、数据文件传输 (包括导出数据文件的上传和下载) 、数据导入。
3.1 系统身份验证
娱乐场所的数据要上报到区县级公安局服务器端, 这些数据是严格保密的。在进行数据上报之前, 要进行系统身份验证, 即防止使用者跳过认证页面直接到达某个JSP页面。
传统的做法是在Servlet进行有效的校验, 但这种校验非常繁琐, 书写大量的校验代码才能完成小部分的表单域的校验。而且这种校验方式的校验开发效率低, 校验明显不够规范。为了解决上述问题, 本系统采用Struts2进行校验, 即在Web应用上增加Struts2支持。增加Struts2支持后, 只需要重写ActionSupport类中的validate方法即可。采用validate方法略为简化, 主要是因为Struts2内建的类型转换器会自动将请求的参数转换成所需的数据类型, 所以就减少了类型转换的代码。当系统执行validate方法进行数据校验时, 一旦发现校验失败, 就把校验失败提示通过addFiledError方法添加进系统的fieldError中。
但通常情况下, 我们只需要校验某个而不是全部的处理逻辑, 因此我们再提供一个validateXxx () 方法, 其中xxx即是Action对应的处理逻辑方法。这样就完成了校验过程。Struts2的输入校验流程如图4所示。
3.2 传输数据的提取
从业人员的基本信息是数据项最多的数据表, 包括日期、整型、字符串, 所以转换最为复杂。下面以从业人员基本信息数据的提取为例进行阐述。
以往的数据提取都将数据表转换为Access或文本文件作为临时文件, 而本系统采取Excel作为临时文件, 这样使用的好处在于Excel更符合数据库表的格式, 它与数据的字段是一一对应的关系, 所以根本无需解析数据库表的结构, 从而提高了导出效率。
为了进一步提高导出效率, 我们使用POI来操作数据库。POI是apache的子项目, 目标是处理ole2对象, 目前比较成熟的是HSSF接口, 处理Excel对象。它不像我们仅仅是用CSV生成的没有格式的可以由Excel转换的东西, 而是真正的Excel对象, 可以控制一些属性如sheet、cell等等[4]。
Excel转换数据的具体流程如下:
Step1 创建一个工作簿 (HSSFWorkbook) , 在工作簿里创建一个表格 (HSSFSheet) ;
Step2 连接娱乐场所数据库, 读出从业人员基本信息表相应的数据项;
Step3 在表格里创建表格行 (HSSFRow) , 在一行中创建单元格 (HSSFCell) ;
Step4 将读出的字段按顺序写到Excel表中所对应的单元格中, 并将从业人员基本信息表中的日期格式、整型格式进行转化, 并对可能造成的乱码进行中文化处理;
Step5 最后以文件流的形式生成Excel临时文件, 完成对从业人员基本信息表的提取。
3.3 数据文件传输的实现
数据文件传输包括两个部分即数据文件的上传和下载。由于数据文件上传比较复杂, 我们将详细阐述数据文件的上传。
应用Struts2进行数据上传的原理是表单元素设置multipart/form-data属性, Struts2不直接处理multipart/form-data的请求, 它需要调用其他请求解析器, 将HTTP请求中的表单域解析出来, 以二进制流的形式来获取文件的内容, 从而实现文件的上传。Struts2默认使用的是Jakarta的Common-FileUpload框架来上传文件。它在原有的上传框架上做了进一步封装, 简化了文件上传的代码实现, 取消了不同上传框架上的编程差异。
根据以上对数据上传原理的分析, 数据文件上传的具体实现流程如下:
(1) 创建带上传表单域的页面。该步骤的关键在于表单定义method方法为post, 表单元素设置为multipart/form-data, 这样才能进行上传, 核心代码如下:
(2) 创建上传的Action类, 这是Struts2上传的核心部分。该Action类通过File类型属性直接封装了上传文件的文件内容, 但这个File属性无法获取上传文件的文件名和文件类型, 所以Struts2直接将文件域中的上传文件名和文件类型的信息封装到uploadFileName和uploadContentType属性中。可以这样理解:如果表单中包含一个name属性为xxx的文件域, 则对应的Action需要使用三个属性来封装该文件域的信息, 它们分别是:类型为File的xxx属性封装了该文件域对应的文件内容;类型为String的xxxFileName属性封装了该文件域对应的文件的文件名;类型为String的xxxContentType属性封装了该文件域对应文件的文件类型[5]。
通过上面三个属性, 可以更简单地实现文件上传, 所以在execute方法中, 可以直接通过调用getXxx () 方法来获取上传文件的文件名、文件类型和文件内容。
虽然使用Struts2进行上传非常简单, 但传输效率和安全性不高, 为了解决上述问题, 我们结合FTP传输的特点, 将Struts2的上传Action类进行改进。即在execute方法中, 增加FTP服务器端控制连接, 控制连接成功后, 进行数据连接, 在此过程中要进行FTP的身份验证, 如果验证通过后, 将进行文件的读取, 原有Struts2的上传Action类调用的是IO流中的OutputStream进行输出, 我们将其改为调用sun.net.TelnetOutputStream类进行输出, 同时调用ftpClient.put () 方法和使用xxxFileName属性将文件输出到FTP的服务器端, 接下来建立文件上传流, 将上传的内容写入FTP的服务器端。
综上, 我们将改进的上传Action类的算法抽象如下:
(3) 为了使页面和Action类能够一一对应, 我们必须对struts.xml文件进行配置, 配置如下:
根据上面三个步骤, 我们就实现了数据文件的上传。Struts2进行文件下载与上传类似, 所不同的是获取FTP的下载目录, 进行下载。
3.4 数据导入
数据导入即将下载的数据文件中的数据存储到数据库中, 关键是将数据库原有的旧数据清除之后, 再导入新的数据, 这样才能保证源数据库和目标数据库一致的问题。为了解决这个问题, 我们对一般的导入算法进行改进, 就是在获取Excel表格内容之后, 导入之前, 增加一条判断语句, 判断数据库表的唯一字段是否与Excel表所对应的那一列有相同的值, 如果有将其删除, 删除成功后再进行导入, 如果没有就将其直接导入。以从业人员基本信息的导入为例, 导入算法概要如下:
4 结 语
本文在数据上报传输的各个环节上都作了开发工作:在数据提取方面, 采用POI操作Excel文件, 提高了转换效率;在数据文件传输方面, 对Struts2原有上传 (下载) 算法上作了改进, 将Struts2上传 (下载) 与FTP数据传输相结合, 增加了传输速率和安全性;在数据导入方面, 也将原有的导入算法作了改进, 采用先清除再导入的原则, 从而保证了源数据库与目标数据库的一致性。由于以上的改进, 本方案很好地应用在娱乐场所治安管理信息系统中, 为公安机关提供了及时、安全、可靠、一致的数据, 得到了客户的好评。
摘要:针对数据异地传输的效率和安全性问题, 综合应用FTP协议与Excel, 实现了基于Struts2数据传输系统, 并应用到实际项目中, 取得了一定的效果。详细介绍该系统的基本模型和实现流程。阐述Struts2的体系结构, 以及数据提取、数据文件传输、数据导入等关键技术的实现方法。
关键词:数据传输,FTP,Excel,Struts2
参考文献
[1]陈静.基于Web Services的数据上传系统的设计与实现[J].信息技术, 2005 (6) :17-23.
[2]邓其军, 牛晓太, 余小鹏.数据库远程数据上报策略及实现[J].微型计算机与应用, 2004 (6) :45-47.
[3]Donald Brown, Chad Michael Davis, Scott Stanlick.Struts2 in Action[M].America:Manning Publications, 2008:3-101.
[4]陈刚.Eclipse从入门到精通[M].2版.北京:清华大学出版社, 2007:294-304.
[5]李刚.Struts2权威指南——基于WebWork核心的MVC开发[M].北京:电子工业出版社, 2007:174-206.
[6]Wojciechowski J, Sakowicz B, Dura K.MVC model, struts frameworkand file upload issues in web applications based on J2EE platform[C].Modern Problems of Radio Engineering, Telecommunicationsand Computer Science.Proceedings of the International ConferenceTCSET, 2004:342-345.
Struts2 篇10
1 系统架构与环境
1.1 系统架构
系统采用了现在较为流行的JSP+Struts2+Hibernate方案进行设计, 将视图层与逻辑层进行分离, 在视图层通过Struts2与后台逻辑层发生交互通信。作为逻辑层的控制中心, Struts2负责对前台的操作进行后台的逻辑处理, 同时将服务器端处理好的操作进行返回到JSP页面, 其中Hibernate相当于数据库的控制器的角色, 对数据层进行访问和处理, 程序中Hibernate框架应用, 见图1。
1.2 系统环境
系统由前台和后台两个部分组成, 采用B/S的架构模式来设计系统, 用户可以直接通过Web浏览器对软件进行访问, 以获得有用的信息, 通过JSP技术和TCP/IP协议实现了各个功能模块之间的通信, 采用SQL2005数据库, 采用Hibernate技术对其控制, 完成软件与数据层之间的交互。系统基于Struts2架构对快递物联网系统进行了设计, 是快递公司信息化改革的重要组成部分, 采用MVC模式将视图层与逻辑层分离, 也为后续的二次开发打下了基础。
2 业务模块
2.1 用户管理模块
用户管理模块包括了前台用户的注册, 找回密码等及后台管理员对于注册用户或者会员的增加、删除、修改操作。用户的登录过程是系统将用户填写的用户名及密码与登录表单中的数据进行对比。在开发中, 它的内置对象Request是实现这一功能的关键, 类体中的方法get Parameter负责获得用户输入的身份验证值, 然后逻辑层对数据库中的数据执行查询操作, 在比对全部正确的情况下, 登录完成, 页面跳转。该功能是在用户点击登录后调用login_config.jsp来执行代码。
2.2 货物信息管理模块
货物信息管理模块的作用包括了实现了对货物的属性信息进行有效的操作, 它包括了发布、增加、删除、查询等不同的操作。对货物信息的操作主要是对货物的类型, 数量, 需要运达地点等信息进行操作。前台用户可以在登录后, 点击进入货物信息操作页面, 发布所要运输的货物信息, 让承运单位获知相关的信息。前台管理员发布的信息要经过后台管理员的审核才能发布, 由于情况变化需要对系统中发布的消息进行修改时, 前台用户可以对自己已经发布的消息修改后重新提交, 当前台感觉消息已经过时或者不需要的时候对所发布的消息需进行删除操作。
2.3 车辆信息管理模块
车辆信息管理模块的主要包括了实现了对车辆的属性信息进行有效的操作, 它包括了发布、增加、删除、查询等不同的操作。对车辆信息的操作主要是对车辆的类型、载重量、车牌等信息进行操作。用户可以在前台登录后, 发布所要运输车辆的相关信息, 让快递单位获知相关的信息。前台管理员发布的信息要经过后台管理员的审核才能发布, 由于情况的变化需要对系统中发布的消息进行修改时, 前台用户对于自己前面发布的消息有权进行重新编辑后提交。当前台用户对于那些已经过时或者不需要的消息有权进行删除处理。在完成发布车辆信息的同时, 用户也可以对车辆信息进行查询, 车辆信息发布过程图, 见图2。
3 结语
本文论述了快递物联网系统的开发背景、意义和发展现状, 介绍了系统开发过程中的具体实施方法, 详细的描述了如何基于B/S模式的跨平台开发。快递物联网系统在业务层面上基本满足了快递企业的运营需求, 其中的几个主要的子模块就是按照公司日常的业务流程进行分析设计的。快递企业的发展必将与计算机信息网发生紧密的关联, 快递物联网系统的完善不仅为快递企业的发展方向提供了智慧大数据的分析与支持, 同时也为此类劳动密集型企业的发展节约了大量的人力物力, 有效助力了企业的发展, 提高了企业的核心竞争力。
参考文献
[1]林权.基于J2EE的物流企业管理系统的设计与实现[D].成都:电子科技大学, 2013.
[2]张玉娜.基于电子商务的物流教学实验系统的设计与实现[D].济南:山东大学, 2013.
[3]陆宇晨.基于J2EE的重卡生产物流管理系统的研究与开发[D].上海:同济大学, 2007.
[4]张国辉.基于B/S的航运物流企业管理信息系统的设计与开发[D].武汉:华中科技大学, 2006.
[5]苏拉朋.基于J2EE的物流信息管理子系统的研究与实现[D].南宁:广西大学, 2012.
[6]任如坤.物流货运平台的设计与实现[D].济南:山东大学, 2010.
[7]王志峰.备件物流服务管理系统的设计与实现[D].上海:上海交通大学, 2010.