基于Struts框架的电子银行系统
一、背景
随着信息技术特别是网络技术的不断发展,网上电子银行,一种通过网络提供金融服务的新事物,正顺应时代潮流快速发展。网上电子银行提供的服务包括传统银行业务和因特网信息技术应用带来的新兴业务,它不是传统银行产品简单的向网上的转移,其服务方式和内涵也发生了一定的变化。在这种背景下,介绍基于Struts框架的个人网上电子银行系统。
本系统基于Window平台,使用Eclipse for javaee + Mysql + Tomcat开发
二、相关技术介绍
2.1 MVC模式
随着应用系统的逐渐增大,系统的业务逻辑复杂度以几何级数方式增加。在这种情况下如果依然把所有的处理逻辑放在JSP页面中,那将是一场噩梦,无论我们进行什么样的改变,都必须打开那些杂乱的JSP脚本进行修改。
MVC将应用中的各组件按功能进行分类,不同的组件使用不同的技术,相同的组件被严格限制在其所在层内,各层之间以松耦合的方式组织在一起,从而提供了良好的封装。MVC的英文全称是Model-View-Controller,中文意思是:“模型-视图-控制器”。MVC模式起源于Small Talk语言,它是Xerox PARC在20世纪80年代为编程语言SmallTalk-80发明的一种软件设计模式。MVC模式的结构由以下三个部分组成:模型(Model),视图(View),控制器(Controller)。
MVC模式的结构如下图所示:
不管是视图的改变,还是模型的改变,或者控制器的改变都会引起其他两个部分的改变。按照模型层,视图层,控制层进行分解,从而使得整个系统责任明确,接口清晰,加快了设计开发过程。
2.1.1 模型层
这里的模型是指业务逻辑的处理和数据的存储。它分为两类模型:业务逻辑模型和数据模型。模型接受视图请求的数据,并返回最终的处理结果。这里之所以把模型层单独抽取出来,是为了应对业务规则的变化,也是判断开发人员是否优秀的设计依据。MVC模式并没有提供模型的设计方法,而只告诉开发人员应该如何组织管理这些模型,以便于模型重构和提高重用性。
数据模型是指对数据的持久化,它实现了对视图和模型之间交互的支持。实现时它把“做什么(业务处理)”和“怎么做(业务实体)”分离,这样可以实现业务逻辑的重用。对一个开发者来说,就可以专注于业务模型的设计。
2.1.2 视图层
视图层主要用来展现用户所需要的数据,它是用户和系统进行交互的界面。这部分工作可以由美工人员进行开发和维护,一般可以采用HTML,CSS,XML,Servlet,Applet等技术。
一般来说,视图只接受来自模型的数据并显示给用户,然后将用户界面的输入数据和请求传递给控制和模型。MVC设计模式对于视图的处理仅限于视图上数据的采集和处理及用户的请求,而不包括在视图上的业务流程的处理,业务流程的处理和状态的改变则交给模型层来处理。
视图部分大致处理流程是:首先,页面模板定义页面的布局;页面配置文件定义视图标签的具体内容;然后,由页面布局策略类初始化并加载页面;每个用户部件根据它自己的配置进行初始化加载校验器并设置参数,以及事件的委托;用户提交后,通过了表示层的校验,用户部件把数据自动提交给业务实体即模型。
2.1.3 控制器
控制器就是一个分发器,选择什么样的模型,选择什么样视图,就可以完成什么样的用户请求。控制层就像一个中转站,它从用户那里接受请求,并根据用户的请求,将模型与视图匹配在一起,共同完成用户的请求。
在实现上,为了能够控制和协调每个用户跨越多个请求的处理,控制机制应该以集中的方式进行管理。用户在提交一个表单或者单击一个链接后,控制层接受请求但它本身并不处理业务信息,它根据用户的请求类型,把用户的信息传递给相对应的模型,告诉模型做什么,等模型处理完毕后,再把模型处理后的数据选择符合要求的视图返回给用户。这样一来,一个模型可能对应多个视图,一个视图也可能对应多个模型。
通过将模型,视图与控制器的分离,使得一个模型可以对应多个视图,一个视图也可以对应多个模型。如果用户通过某个视图的控制器改变了模型的数据,所有其他依赖于这些数据的视图都应反映出这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。
用户通过视图层发出请求,接着控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后,模型用业务逻辑来处理用户的请求并返回数据;最后,控制器将处理后的数据传递给视图层,并通过视图层展现给用户。
MVC的功能示意图如下所示:
2.2 Struts
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 Struts1和Web Work的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以Web Work为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为Web Work的更新产品。
Struts2相对于Struts1来说有很大的改变。Struts2的Action类实现一个Action接口的同时还可以去实现其他接口。Struts2中提供了一个Action Support基类去实现常用的接口,但Action接口不是必需的,只要POJO对象中有execute方法都可以作为Struts2的Action对象。但是对于Struts1来讲,则必须要求Action类继承一个抽象基类。Struts2和Struts1还有如下一些区别:
-
Struts2中用户每次请求都对应一个新的Action实例,但是Struts1的Action是一个单例模式并且必须是线程安全的
-
Struts2中Action对象的属性可以用来接受用户提交的参数,但是Struts1中用Action Form对象捕获表单数据,并且Action Form必须继承某个固定的基类
-
Struts2的Action不依赖容器,所以测试Struts2的Action非常容易。如果有需要,在Struts2的Action中也是可以获取Http Servlet Request和Http Servlet Response的。但是Struts1的Action依赖于Servlet
-
Struts1支持JSTL,Struts2也可以使用JSTL,但是还支持一个更强大和灵活的表达式语言OGNL
-
Struts1使用Action Form的validate方法进行数据校验。Struts2除了使用validate方法校验之外,还可以使用配置文件进行校验
Struts的体系结构如下图所示:
三、开发工具介绍
3.1 Eclipse for Java EE
Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,通过安装不同的插件Eclipse可以支持不同的计算机语言,比如C++和Python等开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。
Eclipse 最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM提供了最初的Eclipse代码基础,包括Platform、JDT 和PDE。Eclipse项目IBM发起,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat及Sybase等。Eclipse是一个开放源码项目,它其实是Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。随后还有包括Oracle在内的许多大公司也纷纷加入了该项目,Eclipse的目标是成为可进行任何语言开发的IDE集成者,使用者只需下载各种语言的插件即可。
3.2 MySQL
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
3.3 Tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。
四、项目总体规划
基于Struts的电子银行系统的总体设计目标是为网上电子银行的开户客户提供存款,取款,修改用户账户信息等服务,银行管理人员登录系统后可以执行查询账户信息,冻结账户,撤销冻结等操作。为了满足上面提出的功能要求,基于Struts的电子银行系统需要达到以下目标:
-
客户开设新账户
-
客户登录系统后可以进行存款,取款,转账等业务操作
-
客户登录系统后可以修改账户信息,注销账户等操作。其中注销账户为逻辑删除,并非物理删除
-
银行管理人员登录系统后可以查询账户信息,冻结账户,撤销冻结。其中账户冻结后智能进行查询和存款,不能进行其他修改性操作,也不能注销账户
-
对操作的成功或失败要给出信息提示
五、系统需求分析
5.1 客户注册及登录功能分析
每个使用网上电子银行的客户首先必须开通账户,并使用开设账户时的账户名称和设定的密码登录系统。客户登录以后可以对账户中的信息进行修改。其功能如下所示:
5.2 账户交易业务功能分析
客户登录新系统后可以进行存款,取款,转账等业务交易操作,其功能定义如下图所示:
5.3 银行管理员管理功能分析
银行管理员通过后台登录系统后,能够查询每个客户的账户信息,并根据实际情况对账户进行冻结和撤销冻结操作。其功能定义如下图所示:
六、数据库设计
本系统数据库中各个数据表的字段定义和说明如下:
UserInfo表(用户信息表) ,存放客户的基本注册信息
Trade(交易信息表) ,存放交易信息
七、系统流程及模块划分
根据上面的需求分析,可以将系统分为以下几个模块。
-
客户登录模块 :负责验证系统客户的登录信息
-
业务交易模块 :负责管理客户在电子银行中的整个交易过程
-
管理员管理模块 :负责系统中所有客户账户的冻结和解冻操作,并能够查询任何客户的信息
整个系统的执行流程如下图所示:
八、系统详细设计与实现
项目整体结构
com.bank.dao
com.bank.dao定义了交易对象和用户对象的接口
```java package com.bank.dao; import java.sql.SQLException; import com.bank.domain.UserInfo;
public interface UserDao { int Login(UserInfo user) throws SQLException; void registService(UserInfo user) throws SQLException; UserInfo selectUser(String userNo) throws SQLException; void updateUserInfo(UserInfo user, String userNo) throws SQLException; void deleteUserInfo(String userNo) throws SQLException; void withdrawUser(String userNo); } ```
```java package com.bank.dao; import java.sql.SQLException; import java.util.List; import com.bank.domain.TradeInfo;
public interface TradeDAO {
void saveMoney(TradeInfo tradeInfo) throws SQLException;
void fetchMoney(TradeInfo tradeInfo) throws SQLException;
Integer selectBalance(String UserNO) throws SQLException;
List selectTradeInfo(String userNO) throws SQLException;
int findUserflag(String userNO) throws SQLException;
boolean confirmTransfer(TradeInfo tradeInfo1,TradeInfo tradeInfo) throws SQLException;
}
```
com.bank.dao.impl
com.bank.dao.impl定义了数据库操作的常用方法,包括增,删,查,改,登录,登出
java
public int Login(UserInfo user) throws SQLException {
int flag=1;
MD5 md5=new MD5();
if(user!=null){
UserFacade userFacade=new UserFacadeImpl();
String account=user.getUserNO();
UserInfo userInfo=userFacade.selectUser(account);
if(userInfo!=null){
if(userInfo.getUserflag()==2){
flag=2;
return flag;
}
}
String userNO=user.getUserNO();
String password=user.getPassword();
try{
conn=DBConnection.getDBC();
st=conn.createStatement();
String sql="select userNO from userInfo where userNO='"+userNO
+"'and password='"+password+"'";
ResultSet rs=st.executeQuery(sql);
if(rs.next()){
flag=0;
rs.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
st.close();
conn.close();
}
}else{
System.out.println("正在进行登录业务");
}
return flag;
}
com.bank.domain
com.bank.domain定义了交易对象和用户对象的相关属性
```java package com.bank.domain;
public class UserInfo { private String userName; private int userAge; private String idCard; private String password; private int id; private String userSex; private String tel; private String address; private String city; private String userNO; private int balance=0; private int userflag=0; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getUserAge() { return userAge; } public void setUserAge(int userAge) { this.userAge = userAge; } public String getIdCard() { return idCard; } ```
com.bank.service
com.bank.service定义了交易方式的接口
```java package com.bank.service;
import java.sql.SQLException; import com.bank.domain.UserInfo; public interface UserFacade { int login(UserInfo user) throws SQLException; void registService(UserInfo user)throws SQLException; UserInfo selectUser(String userNO)throws SQLException; void updateUserInfo(UserInfo user, String userNO)throws SQLException; void deleteUserInfo(String userNO) throws SQLException; void withdrawUser(String userNO); } ```
com.bank.service.impl
com.bank.service.impl定义了交易方式的方法
```java package com.bank.service.impl;
import java.sql.SQLException; import com.bank.domain.UserInfo; import com.bank.dao.UserDao; import com.bank.dao.impl.UserDAOImpl; import com.bank.service.UserFacade;
public class UserFacadeImpl implements UserFacade{ private UserDao userDAO; public UserFacadeImpl(){ userDAO=new UserDAOImpl(); } @Override public int login(UserInfo user) throws SQLException {
return userDAO.Login(user);
}
@Override
public void registService(UserInfo user) throws SQLException {
// TODO Auto-generated method stub
userDAO.registService(user);
}
@Override
public UserInfo selectUser(String userNO) throws SQLException {
// TODO Auto-generated method stub
return userDAO.selectUser(userNO);
}
@Override
public void updateUserInfo(UserInfo user, String userNO) throws SQLException {
// TODO Auto-generated method stub
userDAO.updateUserInfo(user, userNO);
}
```
com.bank.util
com.bank.util定义了数据库连接的方法以及密码加密(MD5)的方法
```java package com.bank.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;
public class DBConnection { private static String url="jdbc:mysql://localhost:3306/bankmanagesystem"; public static Connection getDBC()throws SQLException, Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection(url,"root", "123456"); return conn; } } ```
com.bank.web.action
com.bank.web.action定义了页面的跳转
```java package com.bank.web.action;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.bank.domain.UserInfo; import com.bank.service.UserFacade; import com.bank.service.impl.UserFacadeImpl;
public class LoginAction { private String userNO; private String password; private UserFacade userFacade;
public LoginAction(){
userFacade=new UserFacadeImpl();
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password=password;
}
public String getUsrNO(){
return userNO;
}
public void setUserNO(String userNO){
this.userNO=userNO;
}
public String login(){
int flag;
UserInfo user=new UserInfo();
user.setUserNO(getUsrNO());
user.setPassword(getPassword());
try {
flag=userFacade.login(user);
```
com.bank.web.action.interceptor
com.bank.web.action.interceptor定义了拦截方法
```java package com.bank.web.action.interceptor;
import java.util.Map; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.bank.domain.UserInfo; import com.opensymphony.xwork2.ActionInvocation; public class SessionInterceptor extends AbstractInterceptor { private static final Object LOGIN_KEY="user"; private static final String LOGIN_PAGE="loginPage"; @Override public String intercept(ActionInvocation actionInvocation) throws Exception { // TODO Auto-generated method stub Map session=actionInvocation.getInvocationContext().getSession(); UserInfo userInfo=(UserInfo)session.get(LOGIN_KEY); if(userInfo!=null){ return actionInvocation.invoke(); } else{ return LOGIN_PAGE; } } } ```
Struts.xml
```xml
<interceptors> <interceptor name="SessionInterceptor" /> </interceptors> <global-results> <result name="loginPage">/login.jsp</result> <result name="abilityError">/abilityError.jsp</result> <result name="Error">/Error.jsp</result> </global-results> <action name="login" method="login"> <result name="loginSuccess">/trade.jsp</result> <result name="loginError">/loginError.jsp</result> <result name="haveWithdraw">/haveWithdraw.jsp</result> </action> <action name="regist" method="regist"> <result name="registSuccess">/registSuccess.jsp</result> </action> <action name="saveMoney" method="saveMoney"> <result name="saveSuccess" type="chain">selectBalance</result> <interceptor-ref name="defaultStack"/> <interceptor-ref name="SessionInterceptor"/>
```
web.xml
```xml
九、页面展示
主页面
登录页面
注册页面
存款页面
取款页面
个人信息页面
十、感想
在系统开发过程中,首先要考虑的用户的需求。需求分析是介于系统分析和软件设计阶段之间的桥梁。一方面,需求分析以系统规格说明和项目规划作为分析活动的基本出发点,并从软件角度对它们进行检查与调整;另一方面,需求规格说明又是软件设计、实现、测试直至维护的主要基础。良好的分析活动有助于避免或尽早剔除早期错误,从而提高软件生产率,降低开发成本,改进软件质量。
参考文献
- Struts框架在实现管理信息系统中的应用(国防科学技术大学·贝琦)
- 基于MVC模式的Struts框架的研究与应用(吉林大学·张春华)
- 基于Struts+Hibernate的人力资源管理系统(吉林大学·金勇杰)
- MVC2 Struts框架与Hibernate在大型财务系统中的应用(西北工业大学·任广进)
- 基于Struts与Hibernate的框架模型在银行信贷管理系统的应用研究(西南交通大学·黄金雪)
- 基于Struts框架的银行贷款信息管理系统的设计与实现(电子科技大学·梁斌)
- 基于Struts和Hibernate的J2EE Web应用的研究与实现(华东师范大学·张国梁)
- 基于Struts框架的银行贷款信息管理系统的设计与实现(电子科技大学·梁斌)
- 基于SSH架构的银行统一监控平台设计与实现(复旦大学·徐涛)
- 基于Struts和Hibernate框架的网络办公系统的设计与实现(山东大学·任文娟)
- 基于J2EE架构的网上银行的设计与开发(中国地质大学(北京)·钟彦)
- 基于SOA与Tuxedo技术的网上银行系统设计与实现(电子科技大学·于群)
- 基于Struts与Hibernate的框架模型在银行信贷管理系统的应用研究(西南交通大学·黄金雪)
- 面向中小企业的信息管理系统的设计与实现(北京邮电大学·贾士强)
- 基于Struts框架的应用系统的研究与开发(吉林大学·王斐)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设小屋 ,原文地址:https://bishedaima.com/yuanma/35499.html