一.技术架构
- JAVA作为开发语言,版本为JDK17;
- Tomcat作为服务器容器,版本为10.1.7;
- 使用Spring6+SpringMvc快速搭建项目架构,配置返回实体为json对象,并对返回结果通义定义,并实现前后端分离;
- MD5做密码校验;
- MySql8用于存储项目数据;
- JDBC用于实现数据的CURD
- Druid用于提供数据源的连接池
- Jackson用于转换JSON
- Lombok用于处理实体类
- Filter用于用户登录校验和跨域处理,日志过滤器并配套slg4j对请求做记录和优化;
- 单元测试对每个接口进行测试,确保接口正常运行,减少bug问题。
二 .业务概述
1.功能描述
本系统是一个简易的课程管理系统,主要有用户添加、注册以及实现对用户课程的操作,包括以下几个方面:实现用户对课程的查询、添加、修改、删除
2.接口描述
1.用户相关
- 注册
- 登录
- 检查用户名是否已存在
2.课程相关
- 查询
- 添加
- 修改
- 删除
三.项目介绍
1.项目配置
1.1 依赖配置
包括spring、springMvc、springJdbc、Druid、Spring-test、sl4j、loombok、JackSon等
<dependencies>
<!-- Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.2</version>
</dependency>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.0.2</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<!--spring jdbc Spring 持久化层支持jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>6.0.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.15</version>
</dependency>
<!--spring对junit的支持相关依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>6.0.2</version>
</dependency>
<!--junit5测试-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.3</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.3</version>
</dependency>
<!--log4j2的依赖-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.19.0</version>
</dependency>
<!-- lombok配置-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<!-- jackson配置-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2</version>
</dependency>
</dependencies>
1.2 springMvc配置
我们采用全注解方式配置(单元测试有个注意点)
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
private Logger logger = LoggerFactory.getLogger(WebInit.class);
@Override
protected Class<?>[] getRootConfigClasses() {
logger.info("加载spring配置类");
return new Class[]{
SpringConfig.class};
}
// 指定springmvc配置类
@Override
protected Class<?>[] getServletConfigClasses() {
logger.info("加载springmvc配置类");
return new Class[]{SpringMvcConfig.class};
}
// 配置前端控制器映射
@Override
protected String[] getServletMappings() {
logger.info("配置前端控制器映射");
return new String[]{"/"};
}
//这里配置过滤器,springMVC其实有过滤器注解了,所以就没必要了
// @Override
// protected Filter[] getServletFilters() {
// return new Filter[]{new CorsFilter()};
// }
@Override
protected Filter[] getServletFilters() {
logger.info("加载过滤器");
return new Filter[]{ characterEncodingFilter()};
}
/**
* Spring MVC使用的是ISO-8859-1编码,这可能导致在处理非英文字符时出现问题。
* 为了解决这个问题,你需要确保在Spring MVC中正确配置请求和响应的编码格式。
* @return
*/
public CharacterEncodingFilter characterEncodingFilter() {
logger.info("添加字符编码过滤器");
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
}
@Configuration
//扫描组件
@ComponentScan("com.seven.schedule")
//开启MVC注解驱动
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
private Logger logger = LoggerFactory.getLogger(SpringMvcConfig.class);
@Autowired
private LoggerInterceptor loggerInterceptor;
// //配置文件上传解析器
// @Bean
// public CommonsMultipartResolver multipartResolver(){
// return new CommonsMultipartResolver();
// }
//配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
logger.info("添加拦截器");
registry.addInterceptor(loggerInterceptor)
.addPathPatterns("/**");
}
//配置日志拦截器
@Bean
public LoggerInterceptor loggerInterceptor() {
logger.info("添加日志拦截器");
return new LoggerInterceptor();
}
@Override
public void addCorsMappings(CorsRegistry registry) {
logger.info("添加跨域映射");
registry.addMapping("/**")
.allowedOrigins("*")
.allowedHeaders("Content-Type", "Authorization")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
@Configuration //表明它是一个配置
@ComponentScan("com.seven.schedule") //扫描
@EnableTransactionManagement //开启事务
public class SpringConfig {
@Bean
public DataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/schedule");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
//根据全注解配置类的测试
@SpringJUnitConfig(classes = SpringConfig.class)
@WebAppConfiguration //测试web环境,如果不加,默认为非web环境,这个属性会默认为非web环境,因为我们配置了SpringMvcConfig的环境,所以需要加上这个属性
public class SpringConfigTest {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
public void testJunit5() {
System.out.println("测试Junit5Test:"+jdbcTemplate);
}
}
1.3 日志配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<loggers>
<!--
level指定日志级别,从低到高的优先级:
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
trace:追踪,是最低的日志级别,相当于追踪程序的执行
debug:调试,一般在开发中,都将其设置为最低的日志级别
info:信息,输出重要的信息,使用较多
warn:警告,输出警告的信息
error:错误,输出错误信息
fatal:严重错误
-->
<root level="DEBUG">
<appender-ref ref="spring6log"/>
<appender-ref ref="RollingFile"/>
<appender-ref ref="log"/>
</root>
</loggers>
<appenders>
<!--输出日志信息到控制台-->
<console name="spring6log" target="SYSTEM_OUT">
<!--控制日志输出的格式-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
<File name="log" fileName="d:/springmvc_log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 这个会打印出所有的信息,
每次大小超过size,
则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,
作为存档-->
<RollingFile name="RollingFile" fileName="d:/springmvc_log/app.log"
filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="50MB"/>
<!-- DefaultRolloverStrategy属性如不设置,
则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</appenders>
</configuration>
2.架构
四.项目总结
本课程管理后台系统,也就提供了简单的7个接口,主要实现了用户登录、注册、用户名是否存在,课程的增删改查功能,运用了Spring6+SpringMVC架构,使用SpringJDBC+SQL8数据操作,并统一返回会json数据格式,增加了单元测试强化了代码稳定性,也使用了日志系统,便于排查问题,并且使用了第三方依赖loombok简化代码编写等等一系列操作来巩固一些基础知识。