热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SSM框架的整合与使用——实现简单的转账系统

一、整合思路SSM框架即SpringMVC+Spring+MyBati框架集,是一种轻量级的Web开源框架。它们各自在JAVA三层架构中负责的模块如下图所示:其中,Sp
一、整合思路

  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 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
 3   <display-name>SSMdisplay-name>
 4   <welcome-file-list>
 5     <welcome-file>index.htmlwelcome-file>
 6     <welcome-file>index.htmwelcome-file>
 7     <welcome-file>index.jspwelcome-file>
 8     <welcome-file>default.htmlwelcome-file>
 9     <welcome-file>default.htmwelcome-file>
10     <welcome-file>default.jspwelcome-file>
11   welcome-file-list>
12   
13   <servlet>
14       <servlet-name>SpringMVCservlet-name>
15       <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
16       <load-on-startup>1load-on-startup>
17   servlet>
18   
19   <servlet-mapping>
20       <servlet-name>SpringMVCservlet-name>
21       <url-pattern>/url-pattern>
22   servlet-mapping>
23   
24   <listener>
25       <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
26   listener>
27   
28   <context-param>
29       <param-name>contextConfigLocationparam-name>
30       <param-value>classpath:applicationContext.xmlparam-value>
31   context-param>
32   
33   <filter>
34       <filter-name>characterEncodingFilterfilter-name>
35       <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
36       <init-param>
37           <param-name>encodingparam-name>
38           <param-value>UTF-8param-value>
39       init-param>
40   filter>
41   <filter-mapping>
42       <filter-name>characterEncodingFilterfilter-name>
43       <url-pattern>/*url-pattern>
44   filter-mapping>
45 web-app>

  在WEB-INF中创建SpringMVC配置文件SpringMVC-servlet.xml(也可以将配置文件放到其他位置,但需要在web.xml中指明配置文件的路径)和jsp文件夹,jsp文件夹用来存放jsp页面。

 1 xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 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/beans
 7         http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/context
 9         http://www.springframework.org/schema/context/spring-context.xsd">
10     
11     <context:component-scan base-package="controller" />
12     
13     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
14         <property name="prefix" value="/WEB-INF/jsp/"/>
15         <property name="suffix" value=".jsp"/>
16     bean>
17 beans>

  在src目录下创建Spring的配置文件applicationContext.xml(文件路径在web.xml中指定),配置Spring并加载MyBatis。

 1 xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 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/beans
 7         https://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/context
 9         http://www.springframework.org/schema/context/spring-context.xsd
10         http://www.springframework.org/schema/tx
11         http://www.springframework.org/schema/tx/spring-tx.xsd">
12     
13     <context:component-scan base-package="service"/>
14     
15     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
16             <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
17             <property name="url" value="jdbc:mysql://localhost:3306/user?serverTimezOne=Asia/Shanghai"/>
18             <property name="username" value="root"/>
19             <property name="password" value="root"/>
20     bean>
21     
22     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
23         <property name="dataSource" ref="dataSource"/>
24         <property name="configLocation" value="classpath:dao/mybatis-config.xml"/>
25     bean>
26     
27     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
28         <property name="basePackage" value="dao"/>
29         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
30     bean>
31     
32     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
33         <property name="dataSource" ref="dataSource"/>
34     bean>
35     
36     <tx:annotation-driven transaction-manager="txManager"/>
37 beans>

   在dao包里创建MyBatis的配置文件mybatis-config.xml(文件路径在Spring配置文件中指定),指明MyBatis映射文件的路径。

1 xml version="1.0" encoding="UTF-8"?>
2 DOCTYPE configuration
3     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4     "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6     <mappers>
7         <mapper resource="dao/UserMapper.xml"/>
8     mappers>
9 configuration>

  在dao包中创建MyBatis的映射文件UserMapper.xml,用来后面实现转账系统时使用。

  到了这里,SSM框架环境就已经搭建完成了,可以开始编写代码来实现转账系统了。整合后总的目录结构如下所示:

 三、转账系统实现

  我们要实现的转账系统很简单,该系统具体的操作流程就是“注册——登录——转账”,用户注册后,默认有100元的余额,然后就可以登陆系统,给指定的用户转账。虽然系统简单,但包含了SSM框架中最基础的部分。

1、实现持久层

  经过分析,我们要实现这样的转账系统,首先需要一个记录用户信息的表,因此我们在数据库中,创建一个user库和一个user表,表定义如下:

1 CREATE TABLE `user`  (
2   `id` int(11) NOT NULL AUTO_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 BTREE
7 ) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

  并插入几条初始数据。

  在pojo包中,创建一个跟user表字段对应的类User.java,便于我们传递数据。

 1 package pojo;
 2 
 3 public class User {
 4     
 5     private int id;
 6     
 7     private String username;
 8 
 9     private String password;
10     
11     private int sum;
12 
13     public int getId() {
14         return id;
15     }
16     
17     public void setId(int id) {
18         this.id = id;
19     }
20     
21     public String getUsername() {
22         return username;
23     }
24 
25     public void setUsername(String username) {
26         this.username = username;
27     }
28 
29     public String getPassword() {
30         return password;
31     }
32 
33     public void setPassword(String password) {
34         this.password = password;
35     }
36     
37     public int getSum() {
38         return sum;
39     }
40 
41     public void setSum(int sum) {
42         this.sum = sum;
43     }
44 
45     @Override
46     public String 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 DOCTYPE mapper
 3     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="dao.UserDao">
 6     <select id="selectUserByNameAndPass" resultType="pojo.User" parameterType="pojo.User">
 7         select * from user where username = #{username} and password = #{password}
 8     select>
 9     <select id="selectUserByName" resultType="pojo.User" parameterType="pojo.User">
10         select * from user where username = #{username}
11     select>
12     <insert id="addUser" parameterType="pojo.User">
13         insert into user (username,password) values (#{username},#{password})
14     insert>
15     <update id="updateSumByName" parameterType="pojo.User">
16         update user set sum = #{sum} where username = #{username}
17     update>
18 mapper>

  在dao包中创建UserDao.java接口,编写MyBatis映射接口。

 1 package dao;
 2 
 3 import org.apache.ibatis.annotations.Mapper;
 4 
 5 import pojo.User;
 6 
 7 @Mapper
 8 public interface UserDao {
 9 
10     public User selectUserByNameAndPass(User user);
11     
12     public int addUser(User user);
13     
14     public User selectUserByName(User user);
15     
16     public int updateSumByName(User user);
17 }

  到这里持久层就编写完成了,此时的目录结构如下:

2、实现业务层

  经过分析,该系统需要实现的业务有三个,分别是“登录”、“注册”和“转账”。我们可以在service包下创建UserService.java类,用三个方法来实现这些业务。代码如下:

 1 package service;
 2 
 3 import javax.servlet.http.HttpSession;
 4 
 5 import org.springframework.beans.factory.annotation.Autowired;
 6 import org.springframework.stereotype.Service;
 7 import org.springframework.transaction.annotation.Transactional;
 8 
 9 import dao.UserDao;
10 import pojo.User;
11 
12 @Service
13 public class UserService {
14     
15     @Autowired
16     private UserDao userDao;
17     
18     @Autowired
19     private HttpSession httpSession;
20     
21     public boolean login(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 boolean register(User user) {
34         //检查用户名是否重复
35         if (userDao.selectUserByName(user) != null) {
36             return false;
37         }
38         userDao.addUser(user);
39         return true;
40     }
41     
42     @Transactional
43     public boolean transfer(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 = new User();
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 package controller;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Controller;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 
 7 import pojo.User;
 8 import service.UserService;
 9 
10 @Controller
11 public class UserController {
12     
13     @Autowired
14     private UserService userService;
15     
16     @RequestMapping("/login")
17     public String login(User user) {
18         if(!userService.login(user)) {
19             return "LoginError";
20         }
21         return "Transfer";
22     }
23     
24     @RequestMapping("/register")
25     public String register(User user) {
26         if(userService.register(user)) {
27             return "RegisterSuccess";
28         }
29         return "RegisterError";
30     }
31     
32     @RequestMapping("/transfer")
33     public String transfer(User user) {
34         if (userService.transfer(user)) {
35             return "TransferSuccess";
36         }
37         return "TransferError";
38     }
39 }

4、实现视图层

  根据控制层中的定义,我们总共需要编写七个jsp页面,分别如下:

  登录注册页面login.jsp:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 DOCTYPE html>
 4 <html>
 5 <head>
 6 <meta charset="UTF-8">
 7 <title>登录title>
 8 head>
 9 <body>
10     <form action="${pageContext.request.contextPath}/login" method="post">
11         <table>
12             <tr>
13                 <td align="right">用户名:td>
14                 <td><input type="text" name="username"/>td>
15             tr>
16             <tr>
17                 <td align="right">密码:td>
18                 <td><input type="password" name="password"/>td>
19             tr>
20             <tr>
21                 <td align="center" colspan="2"><input type="submit" value="登录"/><input type="submit" value="注册" formaction="${pageContext.request.contextPath}/register"/>td>
22             tr>
23         table>
24     form>
25 body>
26 html>

  登录失败页面LoginError.jsp:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 DOCTYPE html>
 4 <html>
 5 <head>
 6 <meta charset="UTF-8">
 7 <title>登录失败title>
 8 head>
 9 <body>
10     用户名或密码错误!
11 body>
12 html>

  登录成功后的转账页面Transfer.jsp:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 DOCTYPE html>
 4 <html>
 5 <head>
 6 <meta charset="UTF-8">
 7 <title>转账title>
 8 head>
 9 <body>
10     <form action="${pageContext.request.contextPath}/transfer" method="post">
11         <table>
12             <tr>
13                 <td align="center" colspan="2">欢迎你!${user.username}td>
14             tr>
15             <tr>
16                 <td align="right">用户名:td>
17                 <td><input type="text" name="username"/>td>
18             tr>
19             <tr>
20                 <td align="right">金额:td>
21                 <td><input type="text" name="sum"/>td>
22             tr>
23             <tr>
24                 <td/>
25                 <td align="right"><input type="submit" value="转账"/>td>
26             tr>
27         table>
28     form>
29 body>
30 html>

  注册失败页面RegisterError.jsp:

 1 xml version="1.0" encoding="UTF-8" ?>
 2 DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5 <%@ page language="java" contentType="text/html; charset=UTF-8"
 6     pageEncoding="UTF-8"%>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 8 <title>注册失败title>
 9 head>
10 <body>
11     注册失败!
12 body>
13 html>

  注册成功页面RegisterSuccess.jsp:

 1 xml version="1.0" encoding="UTF-8" ?>
 2 DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 7 <title>注册成功title>
 8 head>
 9 <body>
10     注册成功!
11 body>
12 html>

  转账失败页面TransferError.jsp:

 1 xml version="1.0" encoding="UTF-8" ?>
 2 DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5 <%@ page language="java" contentType="text/html; charset=UTF-8"
 6     pageEncoding="UTF-8"%>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 8 <title>转账失败title>
 9 head>
10 <body>
11     转账失败!
12 body>
13 html>

  转账成功页面TransferSuccess.jsp:

 1 xml version="1.0" encoding="UTF-8" ?>
 2 DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5 <%@ page language="java" contentType="text/html; charset=UTF-8"
 6     pageEncoding="UTF-8"%>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 8 <title>转账成功title>
 9 head>
10 <body>
11     转账成功!
12 body>
13 html>

  到这里,该转账系统基本实现,最终的目录结构如下:

  运行截图:

  可见admin账户成功向ysy账户转账50元。


推荐阅读
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 烤鸭|本文_Spring之Bean的生命周期详解
    烤鸭|本文_Spring之Bean的生命周期详解 ... [详细]
  • 本文详细介绍了如何正确配置Java环境变量PATH,以确保JDK安装完成后能够正常运行。文章不仅涵盖了基本的环境变量设置步骤,还提供了针对不同操作系统下的具体操作指南。 ... [详细]
  • 本文详细探讨了如何通过分析单个或多个线程在瓶颈情况下的表现,来了解处理器资源的消耗。无论是单进程还是多进程环境,监控关键指标如线程数量、占用时间及调度优先级等,有助于揭示潜在的性能问题。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文详细介绍了 Android 开发中 layout_gravity 属性的使用方法及其在不同布局下的效果,旨在帮助开发者更好地理解和利用这一属性来精确控制视图的布局。 ... [详细]
  • 本文将详细介绍通过CAS(Central Authentication Service)实现单点登录的原理和步骤。CAS由耶鲁大学开发,旨在为多应用系统提供统一的身份认证服务。文中不仅涵盖了CAS的基本架构,还提供了具体的配置实例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Win10 UWP 开发技巧:利用 XamlTreeDump 获取 XAML 元素树
    本文介绍如何在 Win10 UWP 开发中使用 XamlTreeDump 库来获取和转换 XAML 元素树为 JSON 字符串,这对于 UI 单元测试非常有用。 ... [详细]
  • 本文详细介绍了Java的安装、配置、运行流程以及有效的学习方法,旨在帮助初学者快速上手Java编程。 ... [详细]
  • 本文将详细介绍如何安装和使用 CactiEZ 的中文版本,帮助那些对英文界面不太熟悉的用户轻松掌握这一强大的网络监控工具。 ... [详细]
  • Android Studio 中 Gradle 使用的常见问题与解决方案
    本文探讨了在使用 Android Studio 进行开发时,遇到的与 Gradle 相关的问题,包括每次打开项目都需要下载 Gradle 和 Gradle 插件依赖包下载失败或卡顿等问题,并提供了详细的解决方法。 ... [详细]
author-avatar
ecrbw_9870105634
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有