# Java SSM共享充电宝后台管理系统
**Repository Path**: Daesun/JavaSSMcdbproject
## Basic Information
- **Project Name**: Java SSM共享充电宝后台管理系统
- **Description**: JavaSSM共享充电宝后台管理系统,Spring+SpringMVC+Mybatis
- **Primary Language**: Unknown
- **License**: AGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 5
- **Created**: 2024-03-20
- **Last Updated**: 2024-03-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SSM框架整合
## 1、前言
在写原生servlet+jsp的时候刚开始学习mybtis,刚好写完代码之后也学完了三个框架spring,springmvc,mybits
所以在原生servlet+jsp的基础上,我就用SSM框架整合后再写一个项目
## 2、开发技术
前端:bootstrp
后端:SSM框架:spring+springmvc+mybtis
## 3、配置环境
### 1、引入依赖包
使用maven引入相关依赖
```xml
junit
junit
4.11
test
org.springframework
spring-webmvc
5.2.7.RELEASE
org.springframework
spring-jdbc
5.2.7.RELEASE
org.mybatis
mybatis
3.5.5
org.mybatis
mybatis-spring
2.0.3
mysql
mysql-connector-java
8.0.21
com.mchange
c3p0
0.9.5.5
jstl
jstl
1.2
javax.servlet
javax.servlet-api
4.0.1
javax.servlet.jsp
javax.servlet.jsp-api
2.3.1
org.projectlombok
lombok
1.18.12
```
### 2、Web.xml配置
```xml
contextConfigLocation
classpath:spring.xml
org.springframework.web.context.ContextLoaderListener
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
springmvc
/
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
forceRequestEncoding
true
forceResponseEncoding
true
CharacterEncodingFilter
/*
default
*.css
*.js
*.jpg
```
### 3、Mybatis配置
```xml
```
### 4、spring-mvc配置
```xml
```
### 5、spring配置
```xml
```
## 4、登录功能实现
### 4.1Controller层
由于使用了框架之后,开发变得更简洁了,
首先创建一个LoginController的类,然后用注解@Controller让这个类被spring接管
@requestmapping控制前端跳转
其次用一个UserForm的封装类来接收前端数据,前端数据会被封装成一个对象传到后端

这里我用了**@Data**注解,他是插件lombok的一个功能,可以快速通过注解构造实体类

对于Controller层我又构建了一个dto实体类,用来接收通过后端查询到的User和一个code码,然后Controller通过判断由Service层传来的UserDto中的code码来判断是否登录成功,然后跳转到不同的页面

```java
public String login ( Model model, UserForm user, HttpSession session ) {
UserDto userDto = loginService.login(user);
Integer code = userDto.getCode();
User user1 = userDto.getUser();
if (code == 1) {
session.setAttribute("user", user1);
return "index";
}else if (code == -1) {
model.addAttribute("error", "用户名或者密码错误");
return "login";
}
model.addAttribute("error","用户名不存在");
return "login";
}
```
> ### 逻辑
登录成功(密码匹配成功)->code=1
登录失败(密码匹配错误)->code=-1
数据库查找失败(用户名不存在)->code=0
因为引入了SpringMVC的原因,每个方法只需要返回需要跳转的视图(View)名字即可,SpringMVC会自动匹配前缀和后缀
**model.addAttribute()**类似于**request.setAttribute()**
总体来说,SpringMVC就是利用**Model and View** (模型和视图)
### 4.2Service层
Service层主要对从数据库获取到的用户和前端传过来的用户做密码匹配,然后匹配成功则向UserDto中将code码设置为1
如果匹配不成功则将code码设置为-1
如果查找失败,不存在此用户则将code码设置为0
```java
public UserDto login ( UserForm user ) {
User loginuser = loginMapper.login(user.getUsername());
if (loginuser != null) {
if (loginuser.getUserPassword().equals(user.getPassword())) {
UserDto userDto = new UserDto();
userDto.setUser(loginuser);
userDto.setCode(1);
return userDto;
}else {
UserDto userDto = new UserDto();
userDto.setUser(null);
userDto.setCode(-1);
return userDto;
}
}else {
UserDto userDto1 = new UserDto();
userDto1.setCode(0);
return userDto1;
}
}
```
### 4.3Mapper层
用了mabtis框架后,只需要创建一个xml文件后让他的命名空间指向相对应的接口就可以了
并定义他的返回类型
```xml
```
## 5、注销功能实现
```java
@RequestMapping("/loginout")
public String loginout(HttpSession session){
session.removeAttribute("user");
return "error";
}
```
在AccountController层在定义一个方法进行注销操作
## 6、用户列表展示
### 5.1Controller层
```java
@RequestMapping("userlist")
public String getuserlist( Model model ){
List userList = userService.getuserlist();
model.addAttribute("list",userList);
return "userlist";
}
```
通过访问/user/userlist来进入这个请求,然后从数据库提取出的用户列表展示到前端
通过model添加list
### 5.2Service层
```java
public List getuserlist ( ) {
List userList = userMapper.getuserlist();
return userList;
}
```
Service层没什么业务逻辑时只需要返回调用mapper层从数据库查出来的数据即可
### 5.3Mapper层
```java
```
## 7、查询用户功能
### 7.1Controller层
```java
@RequestMapping("search")
public String SearchUser ( String key, String value,Model model) {
List userList = userService.search(key,value);
model.addAttribute("list",userList);
return "userlist";
}
```
### 7.2Service层
```java
public List search ( String key, String value ) {
if (key.equals("")) return this.userMapper.getuserlist();
List list = null;
switch (key) {
case "Id":
list = userMapper.searchById(value);
break;
case "UserName":
list = userMapper.searchByUserName(value);
break;
case "Eamil":
list = userMapper.searchByEmail(value);
break;
}
return list;
}
```
### 7.3Mapper层
```xml
```
## 8、添加用户功能
### 8.1Controller层
因为后面的代码基本都差不多,我就不做多的解释了直接贴代码了
```java
@RequestMapping("adduser")
public String addUser( AddUserForm userForm){
try {
userService.adduser(userForm);
} catch (Exception e) {
e.printStackTrace();
}
return "redirect:/user/userlist";
}
```
### 8.2Service层
```java
public void adduser ( AddUserForm userForm ) {
try {
userMapper.adduser(userForm);
} catch (Exception e) {
e.printStackTrace();
}
}
```
### 8.3Mapper层
```xml
insert into User(UserName,PassWord,Email) values (#{Username},#{Password},#{Email})
```
## 9、修改用户功能
### 9.1Controller层
```java
@RequestMapping("updateuser")
public String updateUser ( User user ) {
try {
userService.updateuser(user);
} catch (Exception e) {
e.printStackTrace();
}
return "redirect:/user/userlist";
}
```
这里需要用重定向重新请求getlist方法来获取用户列表进行页面刷新
### 9.2Service层
```java
public void updateuser ( User user ) {
try {
userMapper.updateuser(user);
} catch (Exception e) {
e.printStackTrace();
}
}
```
### 9.3Mapper层
```xml
update User set UserName = #{UserName},PassWord = #{PassWord},Email = #{Email} where id = #{Id}
```
## 10、修改密码功能
### 10.1Controller层
```java
@RequestMapping("/updatepwd")
public String update( Model model, String rnewpassword, HttpSession session ){
User user = (User) session.getAttribute("user");
int flag = updatePwdService.update(user.getUserName(),rnewpassword);
if(flag==1){
model.addAttribute("message","密码修改成功");
return "pwdmodify";
}else {
model.addAttribute("message","密码修改失败");
return "pwdmodify";
}
}
```
### 10.2Service层
```java
public Integer update ( String username, String pwd ) {
int flag = updatePwdMapper.update(username,pwd);
if(flag ==1 ){
return 1;
}else {
return 0;
}
}
```
### 10.3Mapper层
```xml
update User set PassWord = #{arg0} where UserName = #{arg1}
```

编写完代码后出现500错误
百度找错后得到解决方法:
Mybtis传入两个或以上基本类型的参数时,如String类型,int类型,不能用变量名表示
- **当你的参数类型为实体类型时,可以使用 #{实体属性名} 。**
- **当你的参数类型为基本类型时,如(Integer,String ,Boolean 等),使用 #{arg0},#{arg1}……**
- **当你的方法拥有多种参数时,parameterType属性也可以不写(其实基本上都可以不写)**
所以这里Mybtis会报错找不到参数pwd
```java
update User set PassWord = #{pwd} where UserName = #{username}
```
我们这里的#{pwd}和#{username}应该改为#{arg0}和#{arg1}


## 11、租借人查询
### 11.1Controller层
```java
@RequestMapping("/list")
public String list ( Model model ) {
List list = rentPeopleService.list();
model.addAttribute("list", list);
return "rentpeople";
}
```
### 11.2Service层
```java
public List list ( ) {
return rentPeopleMapper.list();
}
```
### 11.3Mapper层
```xml
```
# 心得体会
至此共享充电宝后台管理系统就开发完成啦
这次大作业一共写了两个,一个是用原生的Servlet+jsp写的,一个是用SSM框架整合后写的
在用Servlet写的时候正在学习Mybtis,然后学的spring,再然后学的springmvc
我是在B站上找的教程学的
差不多用servlet写的写完了,三个框架也学完了,学习三个框架差不多耗时30多个小时
然后就立马起手开始写框架整合的系统了
用了SSM框架后真的便捷了很多
用spring容器管理再也不用new对象了,通过@atuowired直接就可以取出来用
用mybtis也只需要写一个sql语句就行了,非常方便
springmvc就只要管理好视图跳转就行,而且有实体类的话,前端传入的参数会自动封装成对象
在写这篇心得体会的时候,我正在学习springboot+vue,发现他比SSM更加便捷,因为使用SSM框架的时候你需要配置很多配置文件,简直就是**配置地狱**,springboot完美的解决了这个问题,我们可以简单的配置一下,然后其他的都使用它默认的配置参数
写两个版本的时候也都遇见了很多的问题,通过查询相关材料也都解决了,总之一行一行代码纯手工敲出来最后完成的时候真的成就感非常十足,也非常开心
两个版本代码量应该有几千行,加上这个差不多将近1万字的开发文档,项目从4月23日开始启动,到今天6月1日完成
总耗时将近1个半月,每天都会敲一些代码,然后因为刚开始学习SSM,我记得有一个报错,我花了一个下午最后才解决的
通过这次大作业,我发现其实还有很多东西需要去学,而且我也知道现在只有少部分公司在使用SSM,很多大公司都是用微服务,springcloud,mybtis plus很多很多,都还有很多未知的领域要去学习,SSM只是一个起步,希望以后的自己越来越努力!