从零开始搭建一个JavaSSM作业管理系统(二)

╰+哭是因爲堅強的太久メ 2022-11-30 12:48 241阅读 0赞

从零开始搭建 一个JavaSSM作业管理系统系列

从零开始搭建一个JavaSSM作业管理系统(一)
从零开始搭建一个JavaSSM作业管理系统(二)
从零开始搭建一个JavaSSM作业管理系统(三)
从零开始搭建一个JavaSSM作业管理系统(四)

项目下载地址

说明!!!

1.本系列的文章仅展示搭建SSM作业管理系统的大致流程,文章中不会提供该项目的完整代码,如果需要完整代码可以在提供的链接中自行下载

2.本系列只展示作业管理系统一小部分功能实现(登录功能、管理员界面的学生信息管理功能),大部分功能都是信息的增删改查基本操作,重复度较多,大体步骤也都相同,故不做过多展示,请大家见谅

3.博主本人也算是spring框架的初学者,写此系列的目的旨在分享个人在学习SSM过程中的一些经验,如果大家在博客中发现代码或一些解释有误,还望多多指正

从零开始搭建一个JavaSSM作业管理系统(二)

    • 从零开始搭建 一个JavaSSM作业管理系统系列
    • 前言
    • 摘要
    • 一、Maven配置
    • 二、dao层配置
    • 三、service层配置
    • 四、web层配置
    • 五、配置验证
      • (1) Clazz实体类dao层验证
        • 编写dao层相关的代码
        • 配置验证
      • (2) Clazz实体类service层验证
        • 编写service层相关的代码
        • 配置验证
      • (3) Clazz实体类web层验证
        • 编写web层相关的代码
        • 配置验证
    • 六、补充
    • 七、总结

前言

在之前我们已经完成了项目的设计,下面我们将对完成整个项目的框架搭建,配置Maven,并逐层完成SSM的各项配置

摘要

本文主要介绍搭建Java-SSM作业管理系统的第二个阶段

  1. 框架搭建
  2. 配置验证

一、Maven配置

来到pom.xml文件

下面我们需要在文件里面的dependencies下面添加所需要的依赖
注意:junit版本一定要大于4.12,否则无法进行UT测试

  1. <dependency>
  2. <groupId>junit</groupId>
  3. <artifactId>junit</artifactId>
  4. <version>4.12</version>
  5. <scope>test</scope>
  6. </dependency>

配置好之后的pom文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>bjtu.edu</groupId>
  5. <artifactId>HMS-mvc</artifactId>
  6. <version>1.0-SNAPSHOT</version>
  7. <packaging>war</packaging>
  8. <name>HMS-mvc Maven Webapp</name>
  9. <!-- FIXME change it to the project's website -->
  10. <url>http://www.example.com</url>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>1.7</maven.compiler.source>
  14. <maven.compiler.target>1.7</maven.compiler.target>
  15. <!--定义版本号 ${spring.version}-->
  16. <spring.version>5.2.7.RELEASE</spring.version>
  17. <org.mybatis.version>3.5.5</org.mybatis.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>junit</groupId>
  22. <artifactId>junit</artifactId>
  23. <version>4.12</version>
  24. <scope>test</scope>
  25. </dependency>
  26. <!-- Spring -->
  27. <!-- 1)包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心 -->
  28. <dependency>
  29. <groupId>org.springframework</groupId>
  30. <artifactId>spring-core</artifactId>
  31. <version>${spring.version}</version>
  32. </dependency>
  33. <!-- 2)这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。 -->
  34. <dependency>
  35. <groupId>org.springframework</groupId>
  36. <artifactId>spring-beans</artifactId>
  37. <version>${spring.version}</version>
  38. </dependency>
  39. <!-- 3)这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。 -->
  40. <dependency>
  41. <groupId>org.springframework</groupId>
  42. <artifactId>spring-context</artifactId>
  43. <version>${spring.version}</version>
  44. </dependency>
  45. <!-- 4) 这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类。 -->
  46. <dependency>
  47. <groupId>org.springframework</groupId>
  48. <artifactId>spring-jdbc</artifactId>
  49. <version>${spring.version}</version>
  50. </dependency>
  51. <!-- 5) 为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程式事务管理。 -->
  52. <dependency>
  53. <groupId>org.springframework</groupId>
  54. <artifactId>spring-tx</artifactId>
  55. <version>${spring.version}</version>
  56. </dependency>
  57. <!-- 6)Spring web 包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。 -->
  58. <dependency>
  59. <groupId>org.springframework</groupId>
  60. <artifactId>spring-web</artifactId>
  61. <version>${spring.version}</version>
  62. </dependency>
  63. <!-- 7)包含SpringMVC框架相关的所有类。 -->
  64. <dependency>
  65. <groupId>org.springframework</groupId>
  66. <artifactId>spring-webmvc</artifactId>
  67. <version>${spring.version}</version>
  68. </dependency>
  69. <!-- 8)Spring test 对JUNIT等测试框架的简单封装 -->
  70. <dependency>
  71. <groupId>org.springframework</groupId>
  72. <artifactId>spring-test</artifactId>
  73. <version>${spring.version}</version>
  74. <scope>test</scope>
  75. </dependency>
  76. <!-- Servlet web -->
  77. <dependency>
  78. <groupId>javax.servlet</groupId>
  79. <artifactId>javax.servlet-api</artifactId>
  80. <version>4.0.1</version>
  81. </dependency>
  82. <!-- json解析 -->
  83. <dependency>
  84. <groupId>com.fasterxml.jackson.core</groupId>
  85. <artifactId>jackson-databind</artifactId>
  86. <version>2.11.1</version>
  87. </dependency>
  88. <!-- Map工具类 对标准java Collection的扩展 spring-core.jar需commons-collections.jar -->
  89. <dependency>
  90. <groupId>commons-collections</groupId>
  91. <artifactId>commons-collections</artifactId>
  92. <version>3.2.2</version>
  93. </dependency>
  94. <!-- mybatis -->
  95. <dependency>
  96. <groupId>org.mybatis</groupId>
  97. <artifactId>mybatis</artifactId>
  98. <version>${org.mybatis.version}</version>
  99. </dependency>
  100. <!--mybatis-spring-->
  101. <dependency>
  102. <groupId>org.mybatis</groupId>
  103. <artifactId>mybatis-spring</artifactId>
  104. <version>2.0.5</version>
  105. </dependency>
  106. <!--数据库-->
  107. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  108. <dependency>
  109. <groupId>mysql</groupId>
  110. <artifactId>mysql-connector-java</artifactId>
  111. <version>8.0.21</version>
  112. </dependency>
  113. <!--连接池-->
  114. <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
  115. <dependency>
  116. <groupId>com.mchange</groupId>
  117. <artifactId>c3p0</artifactId>
  118. <version>0.9.5.5</version>
  119. </dependency>
  120. <!-- 图片处理 -->
  121. <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
  122. <dependency>
  123. <groupId>net.coobird</groupId>
  124. <artifactId>thumbnailator</artifactId>
  125. <version>0.4.11</version>
  126. </dependency>
  127. <dependency>
  128. <groupId>commons-fileupload</groupId>
  129. <artifactId>commons-fileupload</artifactId>
  130. <version>1.4</version>
  131. </dependency>
  132. </dependencies>
  133. <build>
  134. <finalName>HMS-mvc</finalName>
  135. <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
  136. <plugins>
  137. <plugin>
  138. <artifactId>maven-clean-plugin</artifactId>
  139. <version>3.1.0</version>
  140. </plugin>
  141. <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
  142. <plugin>
  143. <artifactId>maven-resources-plugin</artifactId>
  144. <version>3.0.2</version>
  145. </plugin>
  146. <plugin>
  147. <artifactId>maven-compiler-plugin</artifactId>
  148. <version>3.8.0</version>
  149. </plugin>
  150. <plugin>
  151. <artifactId>maven-surefire-plugin</artifactId>
  152. <version>2.22.1</version>
  153. <configuration>
  154. <skipTests>true</skipTests>
  155. </configuration>
  156. </plugin>
  157. <plugin>
  158. <artifactId>maven-war-plugin</artifactId>
  159. <version>3.2.2</version>
  160. </plugin>
  161. <plugin>
  162. <artifactId>maven-install-plugin</artifactId>
  163. <version>2.5.2</version>
  164. </plugin>
  165. <plugin>
  166. <artifactId>maven-deploy-plugin</artifactId>
  167. <version>2.8.2</version>
  168. </plugin>
  169. </plugins>
  170. </pluginManagement>
  171. </build>
  172. </project>

如果要添加最新版本的依赖或更新依赖版本,需要上maven官网去查找
Maven官网

二、dao层配置

下面我们开始dao层的配置

首先在src/main/resources目录下建立两个package

spring-主要写跟spring相关的配置(dao层、service层、web层)
mapper-主要写mybatis的配置,与dao层映射
建立两个package
建好之后,我们再在src/main/resources目录下建立一个资源配置文件-jdbc.properties,该文件主要写数据库相关的配置
建立一个资源配置文件
代码如下:

jdbc.driver 为数据库驱动名称,因为我的数据库是mysql8版本,需要加cj,如果为mysql5版本,可以把cj去掉
jdbc.url就是连接数据库的链接
jdbc.usernamejdbc,password为用户名和密码

  1. jdbc.driver=com.mysql.cj.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
  3. jdbc.username=WnplV/ietfQ=
  4. jdbc.password=bcVXuWjPZaIfJAfVsP+M2w==

在编写完jdbc,properties文件后,我们修改src/main/webapp/WEB-INF目录下的web.xml文件,修改如下

(这里我们添加了spring文件的扫描操作)

  1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true">
  2. <display-name>Archetype Created Web Application</display-name>
  3. <welcome-file-list>
  4. <welcome-file>index.jsp</welcome-file>
  5. </welcome-file-list>
  6. <servlet>
  7. <servlet-name>spring-dispatcher</servlet-name>
  8. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  9. <init-param>
  10. <param-name>contextConfigLocation</param-name>
  11. <param-value>classpath:spring/spring-*.xml</param-value>
  12. </init-param>
  13. </servlet>
  14. <servlet-mapping>
  15. <servlet-name>spring-dispatcher</servlet-name>
  16. <!--默认匹配所有的请求-->
  17. <url-pattern>/</url-pattern>
  18. </servlet-mapping>
  19. </web-app>

在完成以上两个配置之后,我们在src/main/resources/spring目录下面建立三个文件

  • spring-dao.xml(springMVC的dao层相关配置)
  • spring-service.xml(springMVC的service层相关配置)
  • spring-web.xml(springMVC的web层相关配置)

建立步骤如下:
建立步骤
下面我们编写spring-dao的代码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  3. <!-- 配置整合mybatis过程 -->
  4. <!-- 1.配置数据库相关参数properties的属性:${url} -->
  5. <context:property-placeholer location="classpath:jdbc.properties"/>
  6. <!-- 2.数据库连接池 -->
  7. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  8. <!-- 配置连接池属性 -->
  9. <property name="driverClass" value="${jdbc.driver}" />
  10. <property name="jdbcUrl" value="${jdbc.url}" />
  11. <property name="user" value="${jdbc.username}" />
  12. <property name="password" value="${jdbc.password}" />
  13. <!-- c3p0连接池的私有属性 -->
  14. <property name="maxPoolSize" value="30" />
  15. <property name="minPoolSize" value="10" />
  16. <property name="initialPoolSize" value="10"/>
  17. <!-- 关闭连接后不自动commit -->
  18. <property name="autoCommitOnClose" value="false" />
  19. <!-- 获取连接超时时间 -->
  20. <property name="checkoutTimeout" value="10000" />
  21. <!-- 当获取连接失败重试次数 -->
  22. <property name="acquireRetryAttempts" value="2" />
  23. </bean>
  24. <!-- 3.配置SqlSessionFactory对象 -->
  25. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  26. <!-- 注入数据库连接池 -->
  27. <property name="dataSource" ref="dataSource" />
  28. <!-- 配置MyBatis全局配置文件:mybatis-config.xml -->
  29. <property name="configLocation" value="classpath:mybatis-config.xml" />
  30. <!-- 扫描entity包 使用别名 -->
  31. <property name="typeAliasesPackage" value="com.bjtu.edu.entity" />
  32. <!-- 扫描sql配置文件:mapper需要的xml文件 -->
  33. <property name="mapperLocations" value="classpath:mapper/*.xml" />
  34. </bean>
  35. <!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
  36. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  37. <!-- 注入sqlSessionFactory -->
  38. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
  39. <!-- 给出需要扫描Dao接口包 -->
  40. <property name="basePackage" value="com.bjtu.edu.dao" />
  41. </bean>
  42. </beans>

上述代码中,数据库连接池方面我选择的是c3p0,关于数据库连接池有很多种,比如阿里云的数据库连接池,等等,这个可以自由选择,而且大体配置方法基本相同

扫描dao接口包的代码片段需要改成自己项目种dao接口包存放的位置(位置从java包的位置开始算起)

  1. <!-- 给出需要扫描Dao接口包 -->
  2. <property name="basePackage" value="com.bjtu.edu.dao" />

下面我们再在src/main/resources目录下建立一个mybatis-config.xml文件,该文件主要对mybatis进行相关的配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4. <!-- 配置全局属性 -->
  5. <settings>
  6. <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
  7. <setting name="useGeneratedKeys" value="true" />
  8. <!-- 使用列标签替换列别名 默认:true -->
  9. <!--列标签(数据库中的字段名)-->
  10. <!--列别名(查询语句查询字段时给字段自定义的名称)-->
  11. <setting name="useColumnLabel" value="true" />
  12. <!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
  13. <setting name="mapUnderscoreToCamelCase" value="true" />
  14. </settings>
  15. </configuration>

三、service层配置

修改spring-service.xml文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  3. <!-- 扫描service包下所有使用注解的类型 -->
  4. <context:component-scan base-package="com.bjtu.edu.service" />
  5. <!-- 配置事务管理器 -->
  6. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  7. <!-- 注入数据库连接池 -->
  8. <property name="dataSource" ref="dataSource" />
  9. </bean>
  10. <!-- 配置基于注解的声明式事务 -->
  11. <tx:annotation-driven transaction-manager="transactionManager" />
  12. </beans>

与dao层类似,扫描service包的地方同样需要改成自己项目里的service包的位置

  1. <!-- 扫描service包下所有使用注解的类型 -->
  2. <context:component-scan base-package="com.bjtu.edu.service" />

四、web层配置

修改spring-web.xml文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
  3. <!-- 配置SpringMVC -->
  4. <!-- 1.开启SpringMVC注解模式 -->
  5. <mvc:annotation-driven />
  6. <!-- 2.静态资源默认servlet配置 (1)加入对静态资源的处理:js,gif,png (2)允许使用"/"做整体映射 -->
  7. <mvc:resources mapping="/resources/**" location="/resources/" />
  8. <mvc:default-servlet-handler />
  9. <!-- 3.定义视图解析器 -->
  10. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  11. <property name="prefix" value="/WEB-INF/html/"/>
  12. <property name="suffix" value=".html"/>
  13. </bean>
  14. <!--文件上传解析器-->
  15. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  16. <property name="defaultEncoding" value="utf-8"/>
  17. <!--1024 * 1024 * 20 = 20M-->
  18. <property name="maxUploadSize" value="20971520"/>
  19. <property name="maxInMemorySize" value="20971520"/>
  20. </bean>
  21. <!-- 4.扫描web相关的bean -->
  22. <context:component-scan base-package="com.bjtu.edu.web" />
  23. </beans>

这里同样要修改web包的扫描部分

  1. <!-- 4.扫描web相关的bean -->
  2. <context:component-scan base-package="com.bjtu.edu.web" />

五、配置验证

在完成相关配置后,下面我们将对每一层进行验证

注意:在进行配置的验证之前,我们需要在之前已经设计好的数据库里面的每个表都添加一些数据,方便后续信息的读取

下面我们挑选一个实体类完成三个层级的验证(dao、service、web)
这里我们选择最简单的clazz实体类来进行三个层级的验证

(1) Clazz实体类dao层验证

编写dao层相关的代码

在dao层的目录下建立接口类-ClazzDao
建立接口类-ClazzDao

clazz实体类的dao层接口需要编写四个方法,四个方法的功能如下:

  • 查询所有班级列表
  • 通过clazzId查询指定班级
  • 批量新增班级
  • 通过clazzId删除指定班级

代码如下:

ClazzDao.java

  1. public interface ClazzDao {
  2. //查询所有班级列表
  3. List<Clazz> queryClazz();
  4. //通过clazzId查询指定班级
  5. Clazz queryClazzById(long clazzId);
  6. //新增班级
  7. int addClazz(Clazz clazz);
  8. //更新班级
  9. int modifyClazz(Clazz aClazz);
  10. //通过clazzId删除指定班级
  11. int deleteClazz(long clazzId);
  12. }

在编写完ClazzDao接口后,我们来编写mybatis映射的xml文件,在resources/mapper目录下新建一个ClazzDao.xml,名字一定要与dao层的接口名字相同

代码如下:

ClazzDao.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.bjtu.edu.dao.ClazzDao">
  4. <select id="queryClazz" resultType="com.bjtu.edu.entity.Clazz">
  5. SELECT clazz_id, clazz_number, clazz_desc, create_time, last_edit_time
  6. FROM clazz
  7. </select>
  8. <select id="queryClazzById" resultType="com.bjtu.edu.entity.Clazz">
  9. SELECT clazz_id, clazz_number, clazz_desc, create_time, last_edit_time
  10. FROM clazz
  11. WHERE clazz_id = #{clazzId}
  12. </select>
  13. <insert id="addClazz" useGeneratedKeys="true" keyColumn="clazz_id" keyProperty="clazzId">
  14. INSERT INTO
  15. clazz(clazz_id, clazz_number, clazz_desc, create_time)
  16. VALUES
  17. (#{clazzId},
  18. #{clazzNumber},
  19. #{clazzDesc},
  20. #{createTime})
  21. </insert>
  22. <update id="modifyClazz" parameterType="com.bjtu.edu.entity.Clazz" keyProperty="clazz_id" useGeneratedKeys="true">
  23. UPDATE clazz
  24. <set>
  25. <if test="clazzNumber != null">clazz_number=#{clazzNumber},</if>
  26. <if test="clazzDesc != null">clazz_desc=#{clazzDesc},</if>
  27. <if test="lastEditTime != null">last_edit_time=#{lastEditTime},</if>
  28. </set>
  29. WHERE clazz_id = #{clazzId}
  30. </update>
  31. <delete id="deleteClazz">
  32. DELETE FROM
  33. clazz
  34. WHERE
  35. clazz_id = #{clazzId}
  36. </delete>
  37. </mapper>

配置验证

在编写完Clazz相关的dao层代码后,我们来对dao层进行验证,在src/test/java目录下建立两个package-dao、service,一个用于dao层UT测试,一个用于service层UT测试
在src/test/java目录下建立两个package
建好两个package后,在test/java目录下新建一个测试基类,名为BaseTest

代码如下:

BaseTest.java

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. //告诉Junit spring配置文件的位置
  3. @ContextConfiguration
  4. ({
  5. "classpath:spring/spring-dao.xml",
  6. "classpath:spring/spring-service.xml"
  7. })
  8. public class BaseTest {
  9. }

在完成UT测试的相关配置后,下面我们正式开始UT测试,在刚才新建好的dao下面新建一个测试类,名为ClazzDaoTest,该类继承自BaseTest类(以后所有的测试类都继承该类)

代码如下:

ClazzDaoTest.java

  1. @FixMethodOrder(MethodSorters.NAME_ASCENDING)
  2. public class ClazzDaoTest extends BaseTest {
  3. @Autowired
  4. private ClazzDao clazzDao;
  5. @Test
  6. public void testAQueryClass(){
  7. List<Clazz> clazzList = clazzDao.queryClazz();
  8. assertEquals(2, clazzList.size());
  9. System.out.println(clazzList.size());
  10. }
  11. @Test
  12. public void testBQueryClassById(){
  13. Clazz clazz = clazzDao.queryClazzById(1701L);
  14. System.out.println(clazz.getClazzDesc());
  15. }
  16. @Test
  17. public void testCAddClazz(){
  18. Clazz clazz = new Clazz();
  19. clazz.setClazzId(1801L);
  20. clazz.setClazzNumber(40);
  21. clazz.setClazzDesc("软件学院1801班");
  22. clazz.setCreateTime(new Date());
  23. int effectedNum = clazzDao.addClazz(clazz);
  24. assertEquals(1,effectedNum);
  25. System.out.println(effectedNum);
  26. }
  27. @Test
  28. public void testDModifyClass(){
  29. Clazz clazz = new Clazz();
  30. clazz.setClazzId(1801L);
  31. clazz.setClazzNumber(80);
  32. clazz.setClazzDesc("计算机学院1801班");
  33. clazz.setLastEditTime(new Date());
  34. int effectedNum = clazzDao.modifyClazz(clazz);
  35. assertEquals(1,effectedNum);
  36. System.out.println(effectedNum);
  37. }
  38. @Test
  39. public void testEDeleteClass(){
  40. clazzDao.deleteClazz(1801L);
  41. clazzDao.deleteClazz(1802L);
  42. }
  43. }

这是数据库里面clazz表的数据
数据库里面clazz表的数据

下面我们开始进行UT测试
开始进行UT测试
可以看到,UT测试成功

以上的UT测试设计成一个闭环测试,即按顺序依次执行查找、插入、更新、删除操作,最后数据库里面的信息不会有任何变化

部分代码说明

设置测试方法执行顺序为按字母升序执行

  1. @FixMethodOrder(MethodSorters.NAME_ASCENDING)

这是我的测试方法定义,执行时,testA先执行,然后是testB等等,这种执行顺序正好可以实现闭环测试

  1. testAQueryClass()
  2. testBQueryClassById()
  3. testCAddClass()
  4. testDUpdateClass()

(2) Clazz实体类service层验证

编写service层相关的代码

下面我们来进行service层的验证,在src/main/service下面建立一个package-Impl,主要用来存放service接口的实现类,然后分别建立ClazzService的接口类和实现类

建立好之后的目录结构如下:
建立好之后的目录结构
在实现ClazzService类方法之前,我们需要在eums包(存放枚举类)、exception包(存放异常类)和dto包(存放构造类)下面建立Clazz实体类对应的枚举类、异常类、构造类
枚举类、异常类、构造类
代码如下:

ClazzStateEnum

  1. public enum ClazzStateEnum {
  2. //状态枚举
  3. SUCCESS(1, "创建成功"),
  4. INNER_ERROR(-1001, "操作失败"),
  5. EMPTY(-1002, "班级信息为空");
  6. private int state;
  7. private String stateInfo;
  8. public int getState() {
  9. return state;
  10. }
  11. public String getStateInfo() {
  12. return stateInfo;
  13. }
  14. private ClazzStateEnum(int state, String stateInfo){
  15. this.state = state;
  16. this.stateInfo = stateInfo;
  17. }
  18. //依据传入的state返回相应的enum值
  19. public static ClazzStateEnum stateOf(int state){
  20. for (ClazzStateEnum stateEnum : values()){
  21. if (stateEnum.getState() == state){
  22. return stateEnum;
  23. }
  24. }
  25. return null;
  26. }
  27. }

ClazzOperationException

  1. public class ClazzOperationException extends RuntimeException{
  2. private static final long serialVersionUID = 1110885646012316735L;
  3. public ClazzOperationException(String msg){ super(msg);}
  4. }

ClazzExecution

  1. public class ClazzExecution {
  2. // 结果状态
  3. private int state;
  4. // 状态标识
  5. private String stateInfo;
  6. // 操作的clazz(增删改班级的时候用)
  7. private Clazz clazz;
  8. // 获取的clazz列表(查询商品班级的时候用)
  9. private List<Clazz> clazzList;
  10. public ClazzExecution() {
  11. }
  12. // 失败的构造器
  13. public ClazzExecution(ClazzStateEnum clazzStateEnum) {
  14. this.state = clazzStateEnum.getState();
  15. this.stateInfo = clazzStateEnum.getStateInfo();
  16. }
  17. // 成功的构造器
  18. public ClazzExecution(ClazzStateEnum clazzStateEnum, Clazz clazz) {
  19. this.state = clazzStateEnum.getState();
  20. this.stateInfo = clazzStateEnum.getStateInfo();
  21. this.clazz = clazz;
  22. }
  23. // 成功的构造器
  24. public ClazzExecution(ClazzStateEnum clazzStateEnum, List<Clazz> clazzList) {
  25. this.state = clazzStateEnum.getState();
  26. this.stateInfo = clazzStateEnum.getStateInfo();
  27. this.clazzList = clazzList;
  28. }
  29. public int getState() {
  30. return state;
  31. }
  32. public void setState(int state) {
  33. this.state = state;
  34. }
  35. public String getStateInfo() {
  36. return stateInfo;
  37. }
  38. public void setStateInfo(String stateInfo) {
  39. this.stateInfo = stateInfo;
  40. }
  41. public Clazz getClazz() {
  42. return clazz;
  43. }
  44. public void setClazz(Clazz clazz) {
  45. this.clazz = clazz;
  46. }
  47. public List<Clazz> getClazzList() {
  48. return clazzList;
  49. }
  50. public void setClazzList(List<Clazz> clazzList) {
  51. this.clazzList = clazzList;
  52. }
  53. }

在创建完成后,下面我们来实现ClazzService类方法,代码如下:

ClazzService接口类

  1. public interface ClazzService {
  2. //查询全部班级信息
  3. List<Clazz> getClazzList();
  4. //通过班级Id查询唯一的班级信息
  5. Clazz getClazzById(long clazzId);
  6. //新增班级信息
  7. ClazzExecution addClazz(Clazz clazz);
  8. //修改班级信息
  9. ClazzExecution modifyClazz(Clazz clazz);
  10. //删除指定班级
  11. ClazzExecution deleteClazz(long clazzId);
  12. }

ClazzService实现类

  1. @Service
  2. public class ClazzServiceImpl implements ClazzService {
  3. @Autowired
  4. private ClazzDao clazzDao;
  5. //查询班级列表
  6. @Override
  7. public List<Clazz> getClazzList() {
  8. return clazzDao.queryClazz();
  9. }
  10. //通过班级Id查询唯一的班级信息
  11. @Override
  12. public Clazz getClazzById(long clazzId) {
  13. return clazzDao.queryClazzById(clazzId);
  14. }
  15. //新增班级信息
  16. @Override
  17. public ClazzExecution addClazz(Clazz clazz){
  18. //判断传入的班级信息是否为空
  19. if (clazz != null) {
  20. try {
  21. //设置创建时间
  22. clazz.setCreateTime(new Date());
  23. //添加班级信息
  24. int effectedNum = clazzDao.addClazz(clazz);
  25. //判断是否添加成功
  26. if (effectedNum <= 0) {
  27. throw new ClazzOperationException("班级创建失败");
  28. } else {
  29. return new ClazzExecution(ClazzStateEnum.SUCCESS);
  30. }
  31. } catch (Exception e) {
  32. throw new ClazzOperationException("addClazz error: " + e.getMessage());
  33. }
  34. }else {
  35. return new ClazzExecution(ClazzStateEnum.EMPTY_LIST);
  36. }
  37. }
  38. //修改班级信息
  39. @Override
  40. public ClazzExecution modifyClazz(Clazz clazz){
  41. // 空值判断
  42. if (clazz != null && clazz.getClazzId() != null) {
  43. // 给clazz设置上默认属性
  44. clazz.setLastEditTime(new Date());
  45. try {
  46. // 更新商品信息
  47. int effectedNum = clazzDao.modifyClazz(clazz);
  48. if (effectedNum <= 0) {
  49. throw new ClazzOperationException("更新班级信息失败");
  50. }
  51. return new ClazzExecution(ClazzStateEnum.SUCCESS, clazz);
  52. } catch (Exception e) {
  53. throw new ClazzOperationException("更新班级信息失败:" + e.toString());
  54. }
  55. } else {
  56. return new ClazzExecution(ClazzStateEnum.EMPTY);
  57. }
  58. }
  59. //删除指定班级
  60. @Override
  61. public ClazzExecution deleteClazz(long clazzId){
  62. // 删除该clazz
  63. try {
  64. int effectedNum = clazzDao.deleteClazz(clazzId);
  65. if (effectedNum <= 0) {
  66. throw new ClazzOperationException("班级信息删除失败");
  67. } else {
  68. return new ClazzExecution(ClazzStateEnum.SUCCESS);
  69. }
  70. } catch (Exception e) {
  71. throw new ClazzOperationException("deleteClazz error:" + e.getMessage());
  72. }
  73. }
  74. }

配置验证

实现了ClazzService类后,下面我们来进行ClazzService的UT测试,在src/test/java/service目录下建一个新的测试类-ClazzServiceTest,该类同样继承自之前的BaseTest,测试方法基本与dao层测试相同
ClazzServiceTest
代码如下:

ClazzServiceTest

  1. @FixMethodOrder(MethodSorters.NAME_ASCENDING)
  2. public class ClazzServiceTest extends BaseTest {
  3. @Autowired
  4. private ClazzService clazzService;
  5. @Test
  6. public void testAQueryClazz(){
  7. List<Clazz> classList = clazzService.getClazzList();
  8. assertEquals(2,classList.size());
  9. System.out.println(classList.size());
  10. }
  11. @Test
  12. public void testBQueryClazzById(){
  13. Clazz clazz = clazzService.getClazzById(1701L);
  14. assertEquals("软件学院1701班",clazz.getClazzDesc());
  15. System.out.println(clazz.getClazzDesc());
  16. }
  17. @Test
  18. public void testCAddClazz(){
  19. Clazz clazz = new Clazz();
  20. clazz.setClazzId(1801L);
  21. clazz.setClazzNumber(40);
  22. clazz.setClazzDesc("软件学院1801班");
  23. clazz.setCreateTime(new Date());
  24. ClazzExecution clazzExecution = clazzService.addClazz(clazz);
  25. assertEquals(ClazzStateEnum.SUCCESS.getState(),clazzExecution.getState());
  26. System.out.println(clazzExecution.getStateInfo());
  27. }
  28. @Test
  29. public void testDUpdateClazz(){
  30. Clazz clazz = new Clazz();
  31. clazz.setClazzId(1801L);
  32. clazz.setClazzNumber(80);
  33. clazz.setClazzDesc("计算机学院1801班");
  34. ClazzExecution clazzExecution = clazzService.modifyClazz(clazz);
  35. assertEquals(ClazzStateEnum.SUCCESS.getState(),clazzExecution.getState());
  36. System.out.println(clazzExecution.getStateInfo());
  37. }
  38. @Test
  39. public void testEDeleteClazz(){
  40. ClazzExecution clazzExecution1 = clazzService.deleteClazz(1801L);
  41. assertEquals(ClazzStateEnum.SUCCESS.getState(),clazzExecution1.getState());
  42. System.out.println(clazzExecution1.getStateInfo());
  43. ClazzExecution clazzExecution2 = clazzService.deleteClazz(1802L);
  44. assertEquals(ClazzStateEnum.SUCCESS.getState(),clazzExecution2.getState());
  45. System.out.println(clazzExecution2.getStateInfo());
  46. }
  47. }

从代码中可以看出,依然是一个闭环测试,而且测试流程基本与dao层相同

下面我们开始进行UT测试
ClazzServiceUT测试
可以看到,UT测试成功

(3) Clazz实体类web层验证

编写web层相关的代码

下面我们开始web层的验证,首先在src/main/java/web下面新建四个package-home、teacher、student、admin

home-主要存放与登录注册相关操作的类
teacher-主要存放与教师操作界面相关的类
student-主要存放与学生操作界面相关的类
admin-主要存放与管理员操作界面相关的类

目录结构如下:
web层目录结构
建好四个包之后,我们来明确一个问题,该系统哪个地方要用到与clazz即班级相关操作(增删改查)?

主要有两个地方-管理员操作界面、学生操作界面

  1. 管理员对大部分信息都有增删改查的功能,自然包括clazz实体类
  2. 学生可以查看自己的班级信息,但不能对班级信息进行增删改操作

由于学生操作界面的相关操作涉及到student表的处理,相对麻烦一些,所以这里我们只实现管理员操作界面有关clazz实体类的相关操作的代码

管理员可对clazz实体类(班级)进行的操作如下:

  1. 查询所有班级信息
  2. 添加班级信息
  3. 修改指定班级信息
  4. 删除指定班级

在明确好相关功能后,下面我们编写web层代码

在src/main/java/web/admin下面新建一个类-ClazzManagementController,该类主要负责班级信息的相关操作,就是管理员可以对clazz实体类可进行的操作

代码如下:

ClazzManagementController

  1. @Controller
  2. @RequestMapping("/admin")
  3. public class ClazzManagementController {
  4. @Autowired
  5. private ClazzService clazzService;
  6. //返回班级信息列表
  7. @RequestMapping(value = "/listClazz",method = RequestMethod.GET)
  8. @ResponseBody
  9. private Map<String,Object> listClazz(){
  10. Map<String,Object> modelMap = new HashMap<>();
  11. List<Clazz> clazzList;
  12. try {
  13. clazzList = clazzService.getClazzList();
  14. modelMap.put("clazzList",clazzList);
  15. modelMap.put("success", true);
  16. }catch (Exception e){
  17. e.printStackTrace();
  18. modelMap.put("success",false);
  19. modelMap.put("errMsg",e.toString());
  20. }
  21. return modelMap;
  22. }
  23. //批量添加班级信息
  24. @RequestMapping(value = "/addClazz", method = RequestMethod.POST)
  25. @ResponseBody
  26. private Map<String,Object> addClazz(HttpServletRequest request){
  27. Map<String, Object> modelMap = new HashMap<>();
  28. String clazzStr = HttpServletRequestUtil.getString(request,"clazzStr");
  29. if (clazzStr == null){
  30. modelMap.put("success",false);
  31. modelMap.put("errMsg","请输入班级信息");
  32. return modelMap;
  33. }
  34. ObjectMapper mapper = new ObjectMapper();
  35. Clazz clazz;
  36. try {
  37. clazz = mapper.readValue(clazzStr, Clazz.class);
  38. } catch (JsonProcessingException e) {
  39. e.printStackTrace();
  40. modelMap.put("success",false);
  41. modelMap.put("errMsg",e.getMessage());
  42. return modelMap;
  43. }
  44. ClazzExecution clazzExecution = clazzService.addClazz(clazz);
  45. if (clazzExecution.getState() == ClazzStateEnum.SUCCESS.getState()){
  46. modelMap.put("success",true);
  47. }else{
  48. modelMap.put("success",false);
  49. modelMap.put("errMsg",clazzExecution.getStateInfo());
  50. }
  51. return modelMap;
  52. }
  53. //修改班级信息
  54. @RequestMapping(value = "/modifyClazz", method = RequestMethod.POST)
  55. @ResponseBody
  56. private Map<String,Object> modifyClazz(HttpServletRequest request){
  57. Map<String,Object> modelMap = new HashMap<String, Object>();
  58. //1.接受并转化相应的参数,包括班级信息
  59. //获取前端传过来的班级信息,并将它转换成实体类;
  60. String clazzStr = HttpServletRequestUtil.getString(request,"clazzStr");
  61. ObjectMapper mapper = new ObjectMapper();
  62. Clazz clazz = null;
  63. try {
  64. clazz = mapper.readValue(clazzStr,Clazz.class);
  65. } catch (JsonProcessingException e) {
  66. e.printStackTrace();
  67. modelMap.put("success",false);
  68. modelMap.put("errMsg",e.getMessage());
  69. return modelMap;
  70. }
  71. //2.修改班级
  72. if(clazz != null && clazz.getClazzId() != null){
  73. ClazzExecution clazzExecution;
  74. clazzExecution = clazzService.modifyClazz(clazz);
  75. if (clazzExecution.getState() == ClazzStateEnum.SUCCESS.getState()){
  76. modelMap.put("success",true);
  77. }else{
  78. modelMap.put("success",false);
  79. modelMap.put("errMsg",clazzExecution.getStateInfo());
  80. }
  81. return modelMap;
  82. }else {
  83. modelMap.put("success",false);
  84. modelMap.put("errMsg","请输入班级Id");
  85. return modelMap;
  86. }
  87. //3.返回结果
  88. }
  89. //删除指定班级信息
  90. @RequestMapping(value = "/deleteClazz", method = RequestMethod.POST)
  91. @ResponseBody
  92. private Map<String, Object> deleteClazz(Long clazzId, HttpServletRequest request) {
  93. Map<String, Object> modelMap = new HashMap<String, Object>();
  94. if (clazzId != null && clazzId > 0) {
  95. try {
  96. ClazzExecution clazzExecution = clazzService.deleteClazz(clazzId);
  97. if (clazzExecution.getState() == ClazzStateEnum.SUCCESS.getState()) {
  98. modelMap.put("success", true);
  99. } else {
  100. modelMap.put("success", false);
  101. modelMap.put("errMsg", clazzExecution.getStateInfo());
  102. }
  103. } catch (ClazzOperationException e) {
  104. modelMap.put("success", false);
  105. modelMap.put("errMsg", e.toString());
  106. return modelMap;
  107. }
  108. } else {
  109. modelMap.put("success", false);
  110. modelMap.put("errMsg", "未选择要删除的班级");
  111. }
  112. return modelMap;
  113. }
  114. }

此外我还在util包(主要存放各种工具类)下面创建一个HttpServletRequestUtil类,主要用来处理各种类型的HttpServletRequest参数
存放工具类
具体代码如下:

HttpServletRequestUtil

  1. public class HttpServletRequestUtil {
  2. public static int getInt(HttpServletRequest request, String key){
  3. try {
  4. return Integer.decode(request.getParameter(key));
  5. }catch (Exception e){
  6. return -1;
  7. }
  8. }
  9. public static long getLong(HttpServletRequest request, String key){
  10. try {
  11. return Long.valueOf(request.getParameter(key));
  12. }catch (Exception e){
  13. return -1;
  14. }
  15. }
  16. public static Double getDouble(HttpServletRequest request, String key){
  17. try {
  18. return Double.valueOf(request.getParameter(key));
  19. }catch (Exception e){
  20. return -1d;
  21. }
  22. }
  23. public static Boolean getBoolean(HttpServletRequest request, String key){
  24. try {
  25. return Boolean.valueOf(request.getParameter(key));
  26. }catch (Exception e){
  27. return false;
  28. }
  29. }
  30. public static String getString(HttpServletRequest request, String key){
  31. try {
  32. String result = request.getParameter(key);
  33. if (result != null){
  34. result = result.trim();
  35. }
  36. if ("".equals(result)){
  37. result = null;
  38. }
  39. return result;
  40. }catch (Exception e){
  41. return null;
  42. }
  43. }
  44. }

配置验证

在编写好所有代码后,下面我们来对Clazz实体类的Web层进行验证

运行之前配置好的tomcat
运行之前配置好的tomcat
由于关于Clazz实体类的增删改操作涉及到 前端传值,这里我们只验证一下获取Clazz列表信息

在http://localhost:8080/后面输入路由名字
在这里插入图片描述
可以看到数据库里面所有的Clazz信息被读取到了,并以json格式返回,这说明我们web层的配置是成功的

(关于ClazzManagementController里面的其他方法我们会在后续进行验证)

六、补充

浏览器上Json的美化插件

首先来对比一下效果
效果对比1
效果对比2
可以看到,在我们前端调试时,将返回的json字段清晰的展示出来十分重要

关于json美化插件网上有很多,这里我使用的是FeHelper

FeHelper下载地址

七、总结

至此,我们完成了关于该系统的所有相关配置,并对配置进行了验证,下一步我们将编写所有实体相对应的枚举类、异常类和构造类代码

(枚举类存放在enums包下面,异常类存放在exception包下面,构造类存放在dto包下面)

下一篇:从零开始搭建一个JavaSSM作业管理系统(三)

发表评论

表情:
评论列表 (有 0 条评论,241人围观)

还没有评论,来说两句吧...

相关阅读