框架介绍
Spring
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
SpringMVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
Mybatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
SSM整合
SSM框架是Spring MVC ,Spring和Mybatis框架的整合,是标准的MVC模式,将整个系统划分为View层,Controller层,Service层,DAO层四层,使用Spring MVC负责请求的转发和视图管理,Spring实现业务对象管理,Mybatis作为数据对象的持久化引擎。
框架细节:
新建Maven项目

修改打包方式
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xiaoxiao</groupId> <artifactId>ssm_01</artifactId> <version>1.0-SNAPSHOT</version> <!--打包方式修改为war--> <packaging>war</packaging> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> </project>
新建web目录
webapp/WEB-INF/web.xml

web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> </web-app>
整合Spring
pom.xml添加依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>5.2.17.RELEASE</spring.version>
</properties>
<dependencies>
<!--Spring框架-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!--加载spring容器--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--配置注解扫描--> <context:component-scan base-package="com.xiaoxiao"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> </beans>
整合MyBatis
加入依赖
<!-- 整合MyBatis -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--mybatis和spring整合包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration>
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=12345678
applicationContext.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置注解扫描-->
<context:component-scan base-package="com.xiaoxiao">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--加载外部的properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="driverClass" value="${jdbc.driver}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--================== 配置和MyBatis的整合=============== -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定mybatis全局配置文件的位置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="dataSource" ref="pooledDataSource"/>
<property name="mapperLocations" value="classpath:com/xiaoxiao/mapper/*.xml"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor"/>
</array>
</property>
</bean>
<!-- 配置扫描器,将mybatis接口的实现加入到ioc容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有dao接口的实现,加入到ioc容器中 -->
<property name="basePackage" value="com.xiaoxiao.mapper"/>
</bean>
</beans>
整合log4j
log4j.properties
#定义LOG输出级别
log4j.rootLogger=INFO,Console,File
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活的指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c]-%m%n
#mybatis显示SQL语句日志配置
#log4j.logger.org.mybatis=DEBUG
log4j.logger.com.baidu.shiro.dao=DEBUG
#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File=org.apache.log4j.RollingFileAppender
#指定输出目录
log4j.appender.File.File=logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize=10MB
#输出所有日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold=ALL
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm|\:ss}][%c]%m%n
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
</configuration>
数据库表sql
# 创建数据库 create database ssm; # 切换数据库 use ssm; # 创建user表 CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar(255) , `password` varchar(255) , `realname` varchar(255), `gender` varchar(255) , `birthday` date , `avatar` varchar(1024) , PRIMARY KEY (`id`) ) ;
逆向生成代码
MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器。它将为所有版本的MyBatis以及版本2.2.0之后的iBATIS版本生成代码。它将内省数据库表(或许多表),并将生成可用于访问表的工件。这减少了设置对象和配置文件以与数据库表交互的初始麻烦。MBG寻求对简单CRUD(创建,检索,更新,删除)的大部分数据库操作产生重大影响。您仍然需要为连接查询或存储过程手动编写SQL和对象代码。
pom.xml添加插件
<build>
<plugins>
<!--MyBatis逆向生成代码插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<!-- 添加一个mysql的依赖,防止等会找不到driverClass -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<!-- mybatisGenerator 的配置 -->
<configuration>
<!-- generator 工具配置文件的位置 -->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<!-- 是否覆盖 -->
<!-- 此处要特别注意,如果不加这个设置会导致每次运行都会在原目录再次创建-->
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="MySQLTables" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- 生成的Java文件的编码 -->
<property name="javaFileEncoding" value="UTF-8" />
<!-- 生成的mapper文件不是直接覆盖而是追加,导致mapper文件格式错误,添加这个插件,会让mapper直接覆盖 -->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
<!-- 公共设置 -->
<commentGenerator>
<!-- 是否取消自动生成时的注释 -->
<property name="suppressAllComments" value="true"/>
<!-- 是否取消在注释中加上时间 -->
<property name="suppressDate" value="true"/>
</commentGenerator>
<!-- 链接数据库的配置 MySQL8之前的驱动com.mysql.jdbc.Driver,新的驱动com.mysql.cj.jdbc.Driver,并且要加时区-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8&tinyInt1isBit=false&allowMultiQueries=true"
userId="root" password="12345678">
<!--防止生成其他库同名表-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- 关于生成实体类的设置 -->
<!-- targetPackage 生成代码的目标目录 -->
<!-- targetProject 目录所属位置 -->
<javaModelGenerator targetPackage="com.xiaoxiao.bean" targetProject="src/main/java">
<!-- 在targetPackge的基础上根据schema再生成一层package 默认flase -->
<property name="enableSubPackages" value="true"/>
<!-- 是否在get方法中 对String类型的字段做空的判断 -->
<property name="trimStrings" value="true"/>
<!-- 是否生成一个包含所有字段的构造器 -->
<property name="constructorBased" value="false"/>
<!-- 是否创建一个不可变类-->
<property name="immutable" value="false"/>
</javaModelGenerator>
<!--关于生成映射文件的设置-->
<sqlMapGenerator targetPackage="com.xiaoxiao.mapper" targetProject="src/main/resources">
<!--同上-->
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--关于生成dao层的设置-->
<javaClientGenerator type="mapper" targetPackage="com.xiaoxiao.mapper" targetProject="src/main/java">
<!--同上-->
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--需要生成的代码对应的表名 tableName 代表你的数据库表,domainObjectName 映射后的对象名称-->
<table tableName="user" domainObjectName="User"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="true"
selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
生成代码
双击插件,生成代码
测试代码
-
增
-
删
-
改
-
ID查
-
查所有
-
模糊查
-
分页查
package com.xiaoxiao.mapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xiaoxiao.bean.User;
import com.xiaoxiao.bean.UserExample;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Date;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class UserMapperTest {
@Autowired
UserMapper userMapper;
/**
* 增加数据
*/
@Test
public void testInsert() {
User user = new User();
// user.setId(1);
user.setUsername("zhangsan");
user.setPassword("123456");
user.setRealname("张三");
user.setBirthday(new Date());
user.setGender("男");
userMapper.insert(user);
}
/**
* 修改
*/
@Test
public void testUpdate() {
User user = new User();
user.setId(1);
user.setUsername("lisi");
user.setPassword("123456");
user.setRealname("李四");
user.setBirthday(new Date());
user.setGender("男");
userMapper.updateByPrimaryKey(user);
}
@Test
public void testFindById() {
User user = userMapper.selectByPrimaryKey(1);
System.out.println(user);
}
/**
* 删除数据
*/
@Test
public void testDelete() {
userMapper.deleteByPrimaryKey(1);
}
/**
* 查询所有数据
*/
@Test
public void testFindAll() {
List<User> users = userMapper.selectByExample(null);
for (User user : users) {
System.out.println(user);
}
}
/**
* 根据条件查询
*/
@Test
public void testFindByCondition() {
UserExample example = new UserExample();
example.createCriteria().andUsernameLike("%zhang%").andGenderEqualTo("男");
List<User> users = userMapper.selectByExample(example);
for (User user : users) {
System.out.println(user);
}
}
/**
* 分页查询
*/
@Test
public void testByPage() {
UserExample example = new UserExample();
example.createCriteria().andUsernameEqualTo("zhangsan");
PageHelper.startPage(1, 2);
List<User> users = userMapper.selectByExample(example);
for (User user : users) {
System.out.println(user);
}
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(users);
System.out.println(page.getPages());
System.out.println(page.getSize());
System.out.println(page.getTotal());
}
}
整合SpringMVC
pom.xml
<!--整合SpringMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Servlet、JSP、JSTL-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.13</version>
</dependency>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!--加载spring容器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--SpringMVC的前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--Post乱码处理器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
springmvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置注解扫描-->
<context:component-scan base-package="com.iflytek.controller"/>
<!-- 配置类型转换器 -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.xiaoxiao.converter.DateConverter"/>
</set>
</property>
</bean>
<!--注解驱动,可以自动配置对象转换成JSON-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!--放行静态资源-->
<mvc:default-servlet-handler/>
<!--配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="5000000"/>
</bean>
</beans>
DateConverter.java
package com.xiaoxiao.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日期转换器
*
* Converter<S, T> Source: 代表转换前类型,Target:代表转换后的类型
*/
public class DateConverter implements Converter<String, Date> {
/**
* 2021-10-08 String -> Date
* @param dateStr
* @return
*/
@Override
public Date convert(String dateStr) {
//将日期字符串转换成日期对象 返回
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
UserService.java
package com.xiaoxiao.service;
import com.xiaoxiao.bean.User;
import java.util.List;
public interface UserService {
public void insert(User user);
public void deleteById(int id);
public void update(User user);
public User findById(int id);
public List<User> findAll();
}
UserServiceImpl.java
package com.xiaoxiao.service.impl;
import com.xiaoxiao.bean.User;
import com.xiaoxiao.mapper.UserMapper;
import com.xiaoxiao.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public void insert(User user) {
userMapper.insert(user);
}
@Override
public void deleteById(int id) {
userMapper.deleteByPrimaryKey(id);
}
@Override
public void update(User user) {
userMapper.updateByPrimaryKey(user);
}
@Override
public User findById(int id) {
return userMapper.selectByPrimaryKey(id);
}
@Override
public List<User> findAll() {
return userMapper.selectByExample(null);
}
}
UserController.java
package com.xiaoxiao.controller;
import cn.hutool.core.io.file.FileNameUtil;
import com.xiaoxiao.bean.User;
import com.xiaoxiao.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@PostMapping("/add")
public String addUser(User user, MultipartFile file) throws IOException {
String dir = "D:\\ws_1902\\ssm_01\\src\\main\\webapp\\upload\\";
String fileName = UUID.randomUUID() + "." + FileNameUtil.extName(file.getOriginalFilename());
file.transferTo(new File(dir + fileName));
user.setAvatar("/upload/" + fileName);
userService.insert(user);
return "redirect:/user/findAll";
}
@RequestMapping("/deleteById")
public String deleteById(int id) throws IOException {
userService.deleteById(id);
return "redirect:/user/findAll";
}
@GetMapping("/findById")
public String findById(int id, Model model) throws IOException {
User user = userService.findById(id);
model.addAttribute("user", user);
return "/user.jsp";
}
@GetMapping("/updatePage")
public String updatePage(int id, Model model) throws IOException {
User user = userService.findById(id);
model.addAttribute("user", user);
return "/update.jsp";
}
@PostMapping("/update")
public String updateUser(User user, MultipartFile file) throws IOException {
String dir = "D:\\ws_1902\\ssm_01\\src\\main\\webapp\\upload\\";
String fileName = UUID.randomUUID() + "." + FileNameUtil.extName(file.getOriginalFilename());
file.transferTo(new File(dir + fileName));
user.setAvatar("/upload/" + fileName);
userService.update(user);
return "redirect:/user/findAll";
}
@GetMapping("/findAll")
public String findAll(Model model) {
List<User> users = userService.findAll();
model.addAttribute("users", users);
return "/main.jsp";
}
}
main.jsp
<%--
Created by IntelliJ IDEA.
User: xiao
Date: 2021/10/9
Time: 16:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
crossorigin="anonymous"></script>
</head>
<body>
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">
用户列表
<button type="button" class="btn btn-success" οnclick="window.location.href='/add.jsp'">新增用户</button>
</div>
<table class="table table-striped">
<thead>
<tr>
<td>ID</td>
<td>用户名</td>
<td>真实名</td>
<td>性别</td>
<td>头像</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<c:forEach items="${users}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.realname}</td>
<td>${user.gender}</td>
<td><img src="${user.avatar}" width="40px" height="40px"/></td>
<td>
<button type="button" class="btn btn-default" οnclick="window.location.href='/user/findById?id=${user.id}'">详情</button>
<button type="button" class="btn btn-success" οnclick="window.location.href='/user/updatePage?id=${user.id}'">修改</button>
<button type="button" class="btn btn-danger" οnclick="window.location.href='/user/deleteById?id=${user.id}'">删除</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<li><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
</body>
</html>
add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<meta charset="utf-8">
<title>新增用户</title>
</head>
<body>
<h3>新增用户</h3>
<form action="/user/add" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" placeholder="请输入用户名"/><br/>
密码:<input type="password" name="password" placeholder="请输入密码"/><br/>
真实名:<input type="text" name="realname" placeholder="请输入真实名"/><br/>
性别:
男<input type="radio" checked="checked" value="男" name="gender">
女<input type="radio" value="女" name="gender">
<br/>
出生日期:<input type="date" name="birthday" placeholder="请选择出生日期"/><br/>
头像:<input type="file" name="file" placeholder="请选择头像图片"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
user.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h3>用户信息</h3>
用户ID:${user.id}<br/>
用户名:${user.username}<br/>
密码:${user.password}<br/>
真实名:${user.realname}<br/>
性别:${user.gender}<br/>
出生日期:<fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"/><br/>
头像:<img src="${user.avatar}" width="60px"/><br/>
</body>
</html>
update.jsp
<%--
Created by IntelliJ IDEA.
User: xiao
Date: 2021/10/9
Time: 16:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h3>修改用户</h3>
<form action="/user/update" method="post" enctype="multipart/form-data">
用户ID:<input readonly="true" type="text" name="id" value="${user.id}"/><br/>
用户名:<input type="text" name="username" value="${user.username}" placeholder="请输入用户名"/><br/>
密码:<input type="password" name="password" value="${user.password}" placeholder="请输入密码"/><br/>
真实名:<input type="text" name="realname" value="${user.realname}" placeholder="请输入真实名"/><br/>
性别:
男<input type="radio" checked="checked" value="男" name="gender">
女<input type="radio" value="女" name="gender">
<br/>
出生日期:<input type="date" name="birthday" value="${user.birthday}" placeholder="请选择出生日期"/><br/>
头像:<input type="file" name="file" value="${user.avatar}" placeholder="请选择头像图片"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
加入Tomcat7插件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xiaoxiao</groupId>
<artifactId>ssm10</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式修改为war-->
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>5.2.17.RELEASE</spring.version>
</properties>
<dependencies>
<!--Spring框架-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<!-- 整合MyBatis -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--mybatis和spring整合包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!--整合SpringMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Servlet、JSP、JSTL-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.13</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--MyBatis逆向生成代码插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<!-- 添加一个mysql的依赖,防止等会找不到driverClass -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<!-- mybatisGenerator 的配置 -->
<configuration>
<!-- generator 工具配置文件的位置 -->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<!-- 是否覆盖 -->
<!-- 此处要特别注意,如果不加这个设置会导致每次运行都会在原目录再次创建-->
<overwrite>true</overwrite>
</configuration>
</plugin>
<!-- tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
2370

被折叠的 条评论
为什么被折叠?



