JAVA 三个框架结合运用思路_SSM框架的整合与使用——实现简单的转账系统
一、整合思路
SSM框架即SpringMVC + Spring + MyBati框架集,是一种轻量级的Web开源框架。它们各自在JAVA三层架构中负责的模块如下图所示:
其中,SpringMVC与Spring之间本就存在包含关系,所以它们之间并不需要整合,只需要在web.xml中配置使用即可。而SpringMVC并不和MyBatis直接交互,因此它们之间也不需要进行配置。只有Spring和MyBatis二者之间,我们需要用Spring来将MyBatis整合进来。
因此,我们只需要对web.xml和Spring的配置文件进行一些额外的配置即可。
下面,我们通过实现一个简单的转账系统,来展示SSM框架的整合和使用。
二、SSM框架整合
首先新建一个JavaWeb项目,导入SpringMVC、Spring、MyBatis三个框架的jar包和它们之间整合所需要的jar包。
在src目录下创建controller、dao、service、pojo四个包,分别用来存放控制层、持久层、业务层、普通java类的代码。
配置web.xml,使项目加载SpringMVC和Spring。
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 SSM
4
5 index.html
6 index.htm
7 index.jsp
8 default.html
9 default.htm
10 default.jsp
11
12
13
14 SpringMVC
15 org.springframework.web.servlet.DispatcherServlet
16 1
17
18
19
20 SpringMVC
21 /
22
23
24
25 org.springframework.web.context.ContextLoaderListener
26
27
28
29 contextConfigLocation
30 classpath:applicationContext.xml
31
32
33
34 characterEncodingFilter
35 org.springframework.web.filter.CharacterEncodingFilter
36
37 encoding
38 UTF-8
39
40
41
42 characterEncodingFilter
43 /*
44
45
在WEB-INF中创建SpringMVC配置文件SpringMVC-servlet.xml(也可以将配置文件放到其他位置,但需要在web.xml中指明配置文件的路径)和jsp文件夹,jsp文件夹用来存放jsp页面。
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="6 http://www.springframework.org/schema/beans7 http://www.springframework.org/schema/beans/spring-beans.xsd8 http://www.springframework.org/schema/context9 http://www.springframework.org/schema/context/spring-context.xsd">
10
11
12
13
14
15
16
17
在src目录下创建Spring的配置文件applicationContext.xml(文件路径在web.xml中指定),配置Spring并加载MyBatis。
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:tx="http://www.springframework.org/schema/tx"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans7 https://www.springframework.org/schema/beans/spring-beans.xsd8 http://www.springframework.org/schema/context9 http://www.springframework.org/schema/context/spring-context.xsd10 http://www.springframework.org/schema/tx11 http://www.springframework.org/schema/tx/spring-tx.xsd">
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
在dao包里创建MyBatis的配置文件mybatis-config.xml(文件路径在Spring配置文件中指定),指明MyBatis映射文件的路径。
1 <?xml version="1.0" encoding="UTF-8"?>
2 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5
6
7
8
9
在dao包中创建MyBatis的映射文件UserMapper.xml,用来后面实现转账系统时使用。
到了这里,SSM框架环境就已经搭建完成了,可以开始编写代码来实现转账系统了。整合后总的目录结构如下所示:
三、转账系统实现
我们要实现的转账系统很简单,该系统具体的操作流程就是“注册——登录——转账”,用户注册后,默认有100元的余额,然后就可以登陆系统,给指定的用户转账。虽然系统简单,但包含了SSM框架中最基础的部分。
1、实现持久层
经过分析,我们要实现这样的转账系统,首先需要一个记录用户信息的表,因此我们在数据库中,创建一个user库和一个user表,表定义如下:
1 CREATE TABLE `user` (2 `id` int(11) NOT NULLAUTO_INCREMENT,3 `username` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,4 `password` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,5 `sum` int(11) NOT NULL DEFAULT 100,6 PRIMARY KEY(`id`) USING BTREE7 ) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
并插入几条初始数据。
在pojo包中,创建一个跟user表字段对应的类User.java,便于我们传递数据。
1 packagepojo;2
3 public classUser {4
5 private intid;6
7 privateString username;8
9 privateString password;10
11 private intsum;12
13 public intgetId() {14 returnid;15 }16
17 public void setId(intid) {18 this.id =id;19 }20
21 publicString getUsername() {22 returnusername;23 }24
25 public voidsetUsername(String username) {26 this.username =username;27 }28
29 publicString getPassword() {30 returnpassword;31 }32
33 public voidsetPassword(String password) {34 this.password =password;35 }36
37 public intgetSum() {38 returnsum;39 }40
41 public void setSum(intsum) {42 this.sum =sum;43 }44
45 @Override46 publicString toString() {47 return "User [id=" + id + ", username=" + username + ", password=" + password + ", sum=" + sum + "]";48 }49
50 }
在前面创建的MyBatis映射文件UserMapper.xml中,写好需要的SQL语句。
1 <?xml version="1.0" encoding="UTF-8"?>
2 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6
7 select * from user where username = #{username} and password = #{password}8
9
10 select * from user where username = #{username}11
12
13 insert into user (username,password) values (#{username},#{password})14
15
16 update user set sum = #{sum} where username = #{username}17
18
在dao包中创建UserDao.java接口,编写MyBatis映射接口。
1 packagedao;2
3 importorg.apache.ibatis.annotations.Mapper;4
5 importpojo.User;6
7 @Mapper8 public interfaceUserDao {9
10 publicUser selectUserByNameAndPass(User user);11
12 public intaddUser(User user);13
14 publicUser selectUserByName(User user);15
16 public intupdateSumByName(User user);17 }
到这里持久层就编写完成了,此时的目录结构如下:
2、实现业务层
经过分析,该系统需要实现的业务有三个,分别是“登录”、“注册”和“转账”。我们可以在service包下创建UserService.java类,用三个方法来实现这些业务。代码如下:
1 packageservice;2
3 importjavax.servlet.http.HttpSession;4
5 importorg.springframework.beans.factory.annotation.Autowired;6 importorg.springframework.stereotype.Service;7 importorg.springframework.transaction.annotation.Transactional;8
9 importdao.UserDao;10 importpojo.User;11
12 @Service13 public classUserService {14
15 @Autowired16 privateUserDao userDao;17
18 @Autowired19 privateHttpSession httpSession;20
21 public booleanlogin(User user) {22 //验证账号密码
23 user =userDao.selectUserByNameAndPass(user);24 if (user == null) {25 return false;26 }27 //设置Session
28 httpSession.invalidate();29 httpSession.setAttribute("username", user.getUsername());30 return true;31 }32
33 public booleanregister(User user) {34 //检查用户名是否重复
35 if (userDao.selectUserByName(user) != null) {36 return false;37 }38 userDao.addUser(user);39 return true;40 }41
42 @Transactional43 public booleantransfer(User user_in) {44 //检查是否自己向自己转账
45 if (((String) httpSession.getAttribute("username")).equals(user_in.getUsername())) {46 return false;47 }48 //检查转账金额是否为正数
49 int transferSum =user_in.getSum();50 if (transferSum <= 0) {51 return false;52 }53 //检查转账目标用户是否存在
54 user_in =userDao.selectUserByName(user_in);55 if (user_in == null) {56 return false;57 }58 //检查用户是否有足够的余额进行转账
59 User user_out = newUser();60 user_out.setUsername((String) httpSession.getAttribute("username"));61 user_out =userDao.selectUserByName(user_out);62 int remainSum = user_out.getSum() -transferSum;63 if ( remainSum < 0) {64 return false;65 }66 //开始转账
67 user_out.setSum(remainSum);68 userDao.updateSumByName(user_out);69 user_in.setSum(user_in.getSum() +transferSum);70 userDao.updateSumByName(user_in);71 return true;72 }73 }
三、实现控制层
跟业务层一样,控制层也需要三个控制器来调用业务层。我们在controller包中创建UserController.java类,同样需要编写三个方法,代码如下:
1 packagecontroller;2
3 importorg.springframework.beans.factory.annotation.Autowired;4 importorg.springframework.stereotype.Controller;5 importorg.springframework.web.bind.annotation.RequestMapping;6
7 importpojo.User;8 importservice.UserService;9
10 @Controller11 public classUserController {12
13 @Autowired14 privateUserService userService;15
16 @RequestMapping("/login")17 publicString login(User user) {18 if(!userService.login(user)) {19 return "LoginError";20 }21 return "Transfer";22 }23
24 @RequestMapping("/register")25 publicString register(User user) {26 if(userService.register(user)) {27 return "RegisterSuccess";28 }29 return "RegisterError";30 }31
32 @RequestMapping("/transfer")33 publicString transfer(User user) {34 if(userService.transfer(user)) {35 return "TransferSuccess";36 }37 return "TransferError";38 }39 }
4、实现视图层
根据控制层中的定义,我们总共需要编写七个jsp页面,分别如下:
登录注册页面login.jsp:
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
登录
8
9
10
11
12
13 用户名:
14
15
16
17 密码:
18
19
20
21
22
23
24
25
26
登录失败页面LoginError.jsp:
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
登录失败
8
9
10 用户名或密码错误!11
12
登录成功后的转账页面Transfer.jsp:
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
转账
8
9
10
11
12
13 欢迎你!${user.username}
14
15
16 用户名:
17
18
19
20 金额:
21
22
23
24
25
26
27
28
29
30
注册失败页面RegisterError.jsp:
1 <?xml version="1.0" encoding="UTF-8"?>
2
3
4
5
6 pageEncoding="UTF-8"%>
7
8
注册失败
9
10
11 注册失败!12
13
JAVA 三个框架结合运用思路_SSM框架的整合与使用——实现简单的转账系统相关推荐
- Java并发包源码学习之AQS框架(三)LockSupport和interrupt
接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...
- java三个框架该先学哪个_Java常用框架有哪些?先学哪一个比较有优势?
对于学Java的人来说,学习和了解框架是必修的,但是Java的框架比较多,并不需要全部都学,只要学几个常用的框架,在工作的时候就差不多够用了.今天巨牛汇外包小助手就来给大家介绍一下Java常用的框架有 ...
- 【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- RPC框架性能优化思路和具体实现
目录 RPC框架性能优化思路 动态代理对比 序列化框架对比 线程模型 路由层性能 RPC是什么? 应用场景 RPC 优点 写RPC框架需要具备哪些知识? RPC原理(摘自:什么情况下使用 RPC ? ...
- java基础巩固-宇宙第一AiYWM:为了维持生计,手写RPC~Version07(RPC原理、序列化框架们、网络协议框架们 、RPC 能帮助我们做什么呢、RPC异常排查:ctrl+F搜超时)整起
上次Version06说到了咱们手写迷你版RPC的大体流程, 对咱们的迷你版RPC的大体流程再做几点补充: 为什么要封装网络协议,别人说封装好咱们就要封装?Java有这个特性那咱就要用?好像是这样.看 ...
- 学习java三个技巧要知道!
java一直是IT行业发展前景非常不错的一门编程语言,学起来是相对有点困难的,尤其是零基础学员,要想学好java技术,一定要知道这三个技巧,来看看下面的详细介绍就知道了. 学习java三个技巧要知道! ...
- JAVA线程池管理及分布式HADOOP调度框架搭建
平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...
- Spring - Java/J2EE Application Framework 应用框架 第 12 章 Web框架
第 12 章 Web框架 12.1. Web框架介绍 Spring的web框架是围绕分发器(DispatcherServlet)设计的,DispatcherServlet将请求分发到不同的处理器,框架 ...
- Java四种线程创建的思路
一.哪四种 传统的是继承thread类和实现runnable接口,java5以后又有实现callable接口和java的线程池获得. callable相比于runnable,多了返回值,抛出了异常. ...
- java连接linux服务器执行shell命令(框架分析+推荐)
java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...
最新文章
- Control Compliance Suite,听说过吗?
- 2019前端必会黑科技之PWA
- iframe中的历史记录问题汇总及解决方案[转]
- [javaSE] 看博客学习java并发编程
- 开源已经 20 年,改变世界的承诺有兑现吗?
- 二分图 洛谷P2055 [ZJOI2009]假期的宿舍
- java web 开发分层
- 百度云无限速下载工具:JDownloader 2 for Mac
- Servlet运行原理
- 8个成语接龙首尾相连_成语接龙该怎么接?每组开头有一个成语,要接龙,每一个词的末尾都是下一个词的开头,从 来日方长 到 取之不尽,中间要填8个...
- B - The Suspects(并查集)详解
- 初中python编程初步教学设计_初中Python程序设计顺序结构教学设计方案.docx
- [异常]kvm虚拟机卡顿连接不稳定
- 众昂矿业:萤石的简介及其应用
- hevc中随机访问时非IRAP图像存在三种限制
- go tool 的基本应用
- DH2F200N6S-ASEMI快恢复模块200A 600V
- 4-Arm PEG-DSPE 四臂-聚乙二醇-磷脂 可用于修饰小分子材料
- 优酷土豆合而不同 土豆逐渐边缘化显尴尬
- win764位不能改计算机名,win7 64位旗舰版系统无法修改MAC的原因和解决
热门文章
- SolidWorks导入3DSource零件库的模型方法介绍
- Oracle ERP 仓库(inventory) 词汇
- 16Aspx.com源码2013年10月到2013年12月详细
- Multi-Task 多任务学习, 那些你不知道的事
- 电商自营藏猫腻 苏宁国美京东的套路谁最深?
- opencv IplImage和Mat的 区别和转换
- 事业单位计算机岗位考公基吗,【事业单位】江苏统考考什么?公基、言语……题量分布!...
- winRAR去广告版
- java drag_[Java教程]一步一步理解拖拽Drag(四)
- 【Paper】DeepConvLSTM:Deep Convolutional and LSTM RNN for Multimodal Wearable Activity Recognition