SSM 框架 (简单登陆注册)

发布时间 2024-01-05 08:35:47作者: 学Java的`Bei

1. 介绍

  1)SSM框架是Spring、Spring MVC、和Mybatis框架的整合,是标准的MVC模式。

     标准的SSM框架有四层,分别是mapper层(dao层),service层,controller层和View层。

     使用Spring实现业务对象管理,使用Spring MVC负责请求的转发和视图管理,Mybatis作为数据对象的持久化引擎。

 

2. 项目创建

  1)创建数据库  建表:user 字段:id(自增)/username/password/age/phone

    

 

  2)新建项目

    

 

    

             这是最终的。

  3)导入依赖(pom.xml)

 1 <dependency>
 2             <groupId>org.mybatis</groupId>
 3             <artifactId>mybatis</artifactId>
 4             <version>3.5.3</version>
 5         </dependency>
 6         <!--mysql环境-->
 7         <dependency>
 8             <groupId>mysql</groupId>
 9             <artifactId>mysql-connector-java</artifactId>
10             <version>8.0.31</version>
11         </dependency>
12         <!--spring整合jdbc-->
13         <dependency>
14             <groupId>org.springframework</groupId>
15             <artifactId>spring-jdbc</artifactId>
16             <version>5.1.9.RELEASE</version>
17         </dependency>
18         <!--spring整合mybatis-->
19         <dependency>
20             <groupId>org.mybatis</groupId>
21             <artifactId>mybatis-spring</artifactId>
22             <version>2.0.3</version>
23         </dependency>
24         <!--druid连接池-->
25         <dependency>
26             <groupId>com.alibaba</groupId>
27             <artifactId>druid</artifactId>
28             <version>1.1.16</version>
29         </dependency>
30         <!--分页插件坐标-->
31         <dependency>
32             <groupId>com.github.pagehelper</groupId>
33             <artifactId>pagehelper</artifactId>
34             <version>5.1.2</version>
35         </dependency>
36 
37         <!--springmvc环境-->
38         <!--springmvc环境-->
39         <!--springmvc环境-->
40         <dependency>
41             <groupId>org.springframework</groupId>
42             <artifactId>spring-webmvc</artifactId>
43             <version>5.1.9.RELEASE</version>
44         </dependency>
45         <!--jackson相关坐标3个-->
46         <dependency>
47             <groupId>com.fasterxml.jackson.core</groupId>
48             <artifactId>jackson-databind</artifactId>
49             <version>2.9.0</version>
50         </dependency>
51 
52         <!--servlet环境-->
53         <dependency>
54             <groupId>javax.servlet</groupId>
55             <artifactId>javax.servlet-api</artifactId>
56             <version>3.1.0</version>
57             <scope>provided</scope>
58         </dependency>
59 
60         <dependency>
61             <groupId>commons-fileupload</groupId>
62             <artifactId>commons-fileupload</artifactId>
63             <version>1.4</version>
64         </dependency>
65 
66         <!--其他组件-->
67         <!--其他组件-->
68         <!--其他组件-->
69         <!--junit单元测试-->
70         <dependency>
71             <groupId>junit</groupId>
72             <artifactId>junit</artifactId>
73             <version>4.12</version>
74         </dependency>
75         <!--spring整合junit-->
76         <dependency>
77             <groupId>org.springframework</groupId>
78             <artifactId>spring-test</artifactId>
79             <version>5.1.9.RELEASE</version>
80         </dependency>
81 
82         <dependency>
83             <groupId>org.projectlombok</groupId>
84             <artifactId>lombok</artifactId>
85             <version>1.18.24</version>
86         </dependency>
87 
88         <dependency>
89             <groupId>com.alibaba</groupId>
90             <artifactId>fastjson</artifactId>
91             <version>1.2.4</version>
92         </dependency>

    注:黄色高亮表示有漏洞,但不影响。

  4)配置xml文件 

    ① 配置web.xml文件(webapp-->WEB-INF-->web.xml)

    

 1     <context-param>
 2         <param-name>contextConfigLocation</param-name>
 3         <param-value>classpath*:applicationContext.xml</param-value>
 4     </context-param>
 5 
 6     <!--启动服务器时,通过监听器加载spring运行环境-->
 7     <listener>
 8         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 9     </listener>
10 
11     <!--  乱码解析器-->
12     <filter>
13         <filter-name>CharacterEncodingFilter</filter-name>
14         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
15         <init-param>
16             <param-name>encoding</param-name>
17             <param-value>UTF-8</param-value>
18         </init-param>
19     </filter>
20     <filter-mapping>
21         <filter-name>CharacterEncodingFilter</filter-name>
22         <url-pattern>/*</url-pattern>
23     </filter-mapping>
24     <!--  前端控制器-->
25     <servlet>
26         <servlet-name>DispatcherServlet</servlet-name>
27         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
28         <init-param>
29             <param-name>contextConfigLocation</param-name>
30             <param-value>classpath*:spring-mvc.xml</param-value>
31         </init-param>
32     </servlet>
33 
34     <servlet-mapping>
35         <servlet-name>DispatcherServlet</servlet-name>
36         <url-pattern>/</url-pattern>
37     </servlet-mapping>

  ② 配置spring-mvc.xml文件;db.properties(数据库);applicationContext.xml 在 resources  下新建

    

    • spring-mvc.xml (1,2行都是顶格,格式很重要)
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:context="http://www.springframework.org/schema/context"
 4        xmlns:mvc="http://www.springframework.org/schema/mvc"
 5        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 7         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
 8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 9 
10 
11 
12     <context:component-scan base-package="com.bei.controller"/>
13 
14     <mvc:annotation-driven >
15         <!-- 消息转换器 -->
16         <mvc:message-converters register-defaults="true">
17             <bean class="org.springframework.http.converter.StringHttpMessageConverter">
18                 <property name="supportedMediaTypes" value="text/plain;charset=UTF-8"/>
19             </bean>
20         </mvc:message-converters>
21     </mvc:annotation-driven>
22 
23     <!--    视图解析器-->
24     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
25         <property name="prefix" value="/WEB-INF/page/"/>
26         <property name="suffix" value=".jsp"/>
27     </bean>
28     <!--    多媒体解析器-->
29     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
30         <property name="defaultEncoding" value="UTF-8"/>
31         <property name="maxUploadSize" value="500000"/>
32     </bean>
33 
34     <mvc:interceptors>
35         <mvc:interceptor>
36             <mvc:mapping path="/**"/>
37             <mvc:exclude-mapping path="/register"/>
38             <mvc:exclude-mapping path="/login"/>
39             <bean class="com.bei.interceptor.UserInterceptor"/>
40         </mvc:interceptor>
41     </mvc:interceptors>
42 
43 </beans
    • db.properties(数据库) 注意数据库名与mysql密码
1 driver=com.mysql.cj.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/mysql1225?useUnicode=true&characterEncoding=utf-8
3 name=root
4 password=ll163.cn
    • applicationContext.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:context="http://www.springframework.org/schema/context"
 4        xmlns:tx="http://www.springframework.org/schema/tx"
 5        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 7         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 8         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
 9 
10 
11     <!--加载properties文件-->
12     <context:property-placeholder location="classpath:db.properties"/>
13 
14 
15     <!--数据源-->
16     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
17         <property name="driverClassName" value="${driver}"/>
18         <property name="url" value="${url}"/>
19         <property name="username" value="${name}"/>
20         <property name="password" value="${password}"/>
21     </bean>
22 
23     <!--开启bean注解扫描-->
24     <context:component-scan base-package="com.bei">
25         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
26     </context:component-scan>
27 
28     <!--事务管理器-->
29     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
30         <property name="dataSource" ref="dataSource"/>
31     </bean>
32 
33     <!--开启注解式事务-->
34     <tx:annotation-driven transaction-manager="txManager"/>
35 
36 
37 
38     <!--整合mybatis到spring中-->
39     <bean class="org.mybatis.spring.SqlSessionFactoryBean">
40         <property name="dataSource" ref="dataSource"/>
41         <property name="typeAliasesPackage" value="com.bei.model"/>
42         <property name="mapperLocations" value="classpath:mapper/*.xml"/>
43         <!--分页插件-->
44         <property name="plugins">
45             <array>
46                 <bean class="com.github.pagehelper.PageInterceptor">
47                     <property name="properties">
48                         <props>
49                             <prop key="helperDialect">mysql</prop>
50                             <prop key="reasonable">true</prop>
51                         </props>
52                     </property>
53                 </bean>
54             </array>
55         </property>
56     </bean>
57 
58     <!--映射扫描-->
59     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
60         <property name="basePackage" value="com.bei.mapper"/>
61     </bean>
62 
63 </beans>

  5)项目包

    ① 新建 utils 工具类 直接用

      

      • MD5UTil--MD5加密
 1 public class MD5Utils {
 2     public static String encrypt(String password){
 3         MessageDigest md = null;
 4         String s = null;
 5         try {
 6             md = MessageDigest.getInstance("MD5");
 7             md.update(password.getBytes());
 8             s = new BigInteger(1, md.digest()).toString(16);
 9         } catch (NoSuchAlgorithmException e) {
10             e.printStackTrace();
11         }
12         return s;
13     }
14 }    
      • RegularUtil--正则表达式
 1 public class RegularUtil {
 2 
 3     public static boolean validateUsername(String regular, String value) {
 4         // 定义匹配只包含英文字母和数字的正则表达式模式
 5         String pattern = regular;
 6 
 7         // 使用 Pattern 和 Matcher 进行匹配
 8         Pattern regex = Pattern.compile(pattern);
 9         Matcher matcher = regex.matcher(value);
10 
11         return matcher.matches();
12     }
13 }

    ② 新建 pojo层 (实体类)

    User 类:

 1 @Data
 2 @AllArgsConstructor
 3 @NoArgsConstructor
 4 public class User {
 5     private Integer id;
 6     private String username;
 7     private String password;
 8     private Integer age;
 9     private String phone;
10 }

    ③ 新建mapper层 --> IUserMapper接口

1 public interface IUserMapper {
2 
3     // 查询用户名 --> 判重
4     User selectUser(String username);
5 
6     // 用户注册
7     int register(User user);
8 }

    ④ 在 resources 下 建 mapper --> UserMapper.xml文件(1,2行顶格注意格式),为UserMapper写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="com.bei.mapper.IUserMapper">
 6 
 7     <sql id="user_fields">
 8         id, username, password, age, phone
 9     </sql>
10 
11     <!--  查询用户名  -->
12     <select id="selectUser" resultType="com.bei.pojo.User">
13         select <include refid="user_fields"/> from user where username = #{username}
14     </select>
15 
16     <sql id="user_register">
17         username, password, age, phone
18     </sql>
19     <!--  用户注册  -->
20     <insert id="register">
21         insert into user (<include refid="user_register"/>) values (#{username}, #{password}, #{age}, #{phone})
22     </insert>
23 </mapper>

    ⑤ 新建 service 层 --> IUserService接口、impl包 --> UserServiceImpl类

    

1 public interface IUserService {
2 
3     // 用户注册
4     Result sign(User user);
5 
6     // 用户登录
7     Result login(String username, String password);
8 }
 1 @Service
 2 public class UserServiceImpl implements IUserService {
 3 
 4     @Autowired
 5     private IUserMapper iUserMapper;
 6 
 7     // 用户注册
 8     @Override
 9     public Result sign(User user) {
10         // 1. 先判断传递的参数是否合法----(正则表达式)
11         // 2. 判断用户名是否已被注册
12         // 3. 加密password并写入数据库
13         // 4. 返回成功或失败
14 
15         // 创建新的用户名
16         boolean createUserName = RegularUtil.validateUsername("^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$", user.getUsername());
17         // 判断是否合法
18         if (createUserName == false){
19             return Result.error("用户名格式错误:英文+数字,亲!");
20         }
21         // 查询是否已存在/已被注册
22         User findExist = iUserMapper.selectUser(user.getUsername());
23         if (findExist != null){
24             return Result.error("用户名已存在!");
25         }
26         // 新建密码
27         boolean creatPassword = RegularUtil.validateUsername("^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\\-={}\\[\\]|:;<>,.?/~]).{8,}$", user.getPassword());
28         // 判断是否合法
29         if (creatPassword == false){
30             return Result.error("密码格式错误:英文大写+小写+数组+符号,且不少于八位,亲!");
31         }
32         // 加密
33         String encryption = MD5Utils.encrypt(user.getPassword());
34         user.setPassword(encryption);
35 
36         //判断手机号
37         if (user.getPhone().length() != 11){
38             return Result.error("手机号错误!");
39         }
40         iUserMapper.register(user);
41         return Result.ok("注册成功!");
42     }
43 
44 
45 
46     // 登录
47     @Override
48     public Result login(String username, String password) {
49         // 1. 判断用户名是否合法
50         // 2. 判断用户名是否已注册
51         // 3. 判断密码格式是否合法
52         // 4. 再加密密码,用两个密文做对比
53         // 5. 返回登录成功
54 
55         // 判断用户名是否合法
56         boolean loginUserName = RegularUtil.validateUsername("^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$", username);
57         // 判断
58         if (loginUserName == false) {
59             return Result.error("用户名书写错误:英文+数字哦,亲!");
60         }
61         // 输入用户名
62         // 查询用户名是否已注册
63         User selectedUser = iUserMapper.selectUser(username);
64         // 判有无
65         if (selectedUser == null) {
66             return Result.error("用户名不存在!");
67         }
68         // 输入密码
69         boolean havePassword = RegularUtil.validateUsername("^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\\-={}\\[\\]|:;<>,.?/~]).{8,}$", password);
70         // 判断是否符合格式要求
71         if (havePassword == false){
72             return Result.error("密码输入格式错误:英文大小写+数字+符号,八位哦,亲!");
73         }
74         // 看看密码
75         System.out.println("看看密码:" + havePassword);
76         // 加密
77         String encryptPassword = MD5Utils.encrypt(password);
78         // 看看已加密的密码
79         System.out.println("看看已加密的密码:" + encryptPassword);
80         // 跟数据库密码对比一下
81         System.out.println("数据库加密密码:" + selectedUser.getPassword());
82         // 加密的密码与数据库密码判断
83         if (! selectedUser.getPassword().equals(encryptPassword) ){
84             return Result.error("密码错误,请确认密码!");
85         }
86 
87         return Result.ok("登录成功!", selectedUser);
88     }
89 }

    ⑥ 新建 controller 层 --> UserController类

    

 

 1 @Controller
 2 public class UserController {
 3 
 4 @Autowired
 5 private IUserService iUserService;
 6     // 开发流程
 7     // 1. pojo
 8     // 2. service
 9     // 3. impl
10     // 4. mapper
11     // 5. controller
12     // 6. run
13 
14     // 注册
15     @PostMapping(value = "/sign")
16     @ResponseBody
17     public Result sign(@RequestBody User user) {
18         return iUserService.sign(user);
19     }
20 
21     // 登录
22     @PostMapping(value = "/login")
23     @ResponseBody
24     public Result login(String username, String password) {
25     return iUserService.login(username, password);
26     }
27 }

  6)配置tomcat

  

    

  7)run-运行 --> 跳转网页

  8)Postman 连接

    

  9)查看数据库 id-username-password(加密)-age-phone

    

      成功!

 

   本次简易登录注册用了正则表达式,MD5加密。