一、整合思路

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框架的整合与使用——实现简单的转账系统相关推荐

  1. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  2. java三个框架该先学哪个_Java常用框架有哪些?先学哪一个比较有优势?

    对于学Java的人来说,学习和了解框架是必修的,但是Java的框架比较多,并不需要全部都学,只要学几个常用的框架,在工作的时候就差不多够用了.今天巨牛汇外包小助手就来给大家介绍一下Java常用的框架有 ...

  3. 【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. RPC框架性能优化思路和具体实现

    目录 RPC框架性能优化思路 动态代理对比 序列化框架对比 线程模型 路由层性能 RPC是什么? 应用场景 RPC 优点 写RPC框架需要具备哪些知识? RPC原理(摘自:什么情况下使用 RPC ? ...

  5. java基础巩固-宇宙第一AiYWM:为了维持生计,手写RPC~Version07(RPC原理、序列化框架们、网络协议框架们 、RPC 能帮助我们做什么呢、RPC异常排查:ctrl+F搜超时)整起

    上次Version06说到了咱们手写迷你版RPC的大体流程, 对咱们的迷你版RPC的大体流程再做几点补充: 为什么要封装网络协议,别人说封装好咱们就要封装?Java有这个特性那咱就要用?好像是这样.看 ...

  6. 学习java三个技巧要知道!

    java一直是IT行业发展前景非常不错的一门编程语言,学起来是相对有点困难的,尤其是零基础学员,要想学好java技术,一定要知道这三个技巧,来看看下面的详细介绍就知道了. 学习java三个技巧要知道! ...

  7. JAVA线程池管理及分布式HADOOP调度框架搭建

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  8. Spring - Java/J2EE Application Framework 应用框架 第 12 章 Web框架

    第 12 章 Web框架 12.1. Web框架介绍 Spring的web框架是围绕分发器(DispatcherServlet)设计的,DispatcherServlet将请求分发到不同的处理器,框架 ...

  9. Java四种线程创建的思路

    一.哪四种 传统的是继承thread类和实现runnable接口,java5以后又有实现callable接口和java的线程池获得. callable相比于runnable,多了返回值,抛出了异常. ...

  10. java连接linux服务器执行shell命令(框架分析+推荐)

    java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...

最新文章

  1. Control Compliance Suite,听说过吗?
  2. 2019前端必会黑科技之PWA
  3. iframe中的历史记录问题汇总及解决方案[转]
  4. [javaSE] 看博客学习java并发编程
  5. 开源已经 20 年,改变世界的承诺有兑现吗?
  6. 二分图 洛谷P2055 [ZJOI2009]假期的宿舍
  7. java web 开发分层
  8. 百度云无限速下载工具:JDownloader 2 for Mac
  9. Servlet运行原理
  10. 8个成语接龙首尾相连_成语接龙该怎么接?每组开头有一个成语,要接龙,每一个词的末尾都是下一个词的开头,从 来日方长 到 取之不尽,中间要填8个...
  11. B - The Suspects(并查集)详解
  12. 初中python编程初步教学设计_初中Python程序设计顺序结构教学设计方案.docx
  13. [异常]kvm虚拟机卡顿连接不稳定
  14. 众昂矿业:萤石的简介及其应用
  15. hevc中随机访问时非IRAP图像存在三种限制
  16. go tool 的基本应用
  17. DH2F200N6S-ASEMI快恢复模块200A 600V
  18. 4-Arm PEG-DSPE 四臂-聚乙二醇-磷脂 可用于修饰小分子材料
  19. 优酷土豆合而不同 土豆逐渐边缘化显尴尬
  20. win764位不能改计算机名,win7 64位旗舰版系统无法修改MAC的原因和解决

热门文章

  1. SolidWorks导入3DSource零件库的模型方法介绍
  2. Oracle ERP 仓库(inventory) 词汇
  3. 16Aspx.com源码2013年10月到2013年12月详细
  4. Multi-Task 多任务学习, 那些你不知道的事
  5. 电商自营藏猫腻 苏宁国美京东的套路谁最深?
  6. opencv IplImage和Mat的 区别和转换
  7. 事业单位计算机岗位考公基吗,【事业单位】江苏统考考什么?公基、言语……题量分布!...
  8. winRAR去广告版
  9. java drag_[Java教程]一步一步理解拖拽Drag(四)
  10. 【Paper】DeepConvLSTM:Deep Convolutional and LSTM RNN for Multimodal Wearable Activity Recognition