SSM 框架 (简单登陆注册)
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加密。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)