• 【SpringMVC】实现增删改查(附源码)


    目录

    引言

    一、前期准备

    1.1.搭建Maven环境

    1.2.导入pom.xml依赖

    1.3.导入配置文件

    ①jdbc.properties

    ②generatorConfig.xml

    ③log4j2.xml

    ④spring-mybatis.xml

    ⑤spring-context.xml

    ⑥spring-mvc.xml

    ⑦修改web.xml文件

    二、逆向生成增删改查

    2.1.导入相关util类

    ①StringUtils.java

    ②PageBean.java

    2.2.aspect切面层

    2.3.Mybatis generator逆向生成

    2.4.根据生成代码编写Biz层与实现类

    三、controller层代码编写

    四、前台代码与分页代码

    ①PageTag.java

    ②zking.tld

    ③list.jsp

    ④edit.jsp

    五、案例测试

    5.1.模糊查询

    5.2.新增

    5.3.修改

    5.4.删除

    5.5.分页


    引言

    在上一篇文章中我们讲解了Spring MVC的注解、参数传递、返回值和页面跳转的关键步骤,

    这篇文章,我来讲解一下利用前面所学知识,实现SpringMVC一个Maven项目的增删改查。

    一、前期准备

    1.1.搭建Maven环境

            右击项目名➡new➡module

             选择maven项目➡选择jdk版本➡选择webapp 

             输入项目名 

            选择好maven项目的文件位置➡点击添加按钮➡配置好参数  

    1.2.导入pom.xml依赖

    ①将标签内容进行替换即可。

    1. <properties>
    2. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    3. <maven.compiler.source>1.8maven.compiler.source>
    4. <maven.compiler.target>1.8maven.compiler.target>
    5. <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
    6. <spring.version>5.0.2.RELEASEspring.version>
    7. <mybatis.version>3.4.5mybatis.version>
    8. <mysql.version>5.1.44mysql.version>
    9. <pagehelper.version>5.1.2pagehelper.version>
    10. <mybatis.spring.version>1.3.1mybatis.spring.version>
    11. <commons.dbcp2.version>2.1.1commons.dbcp2.version>
    12. <commons.pool2.version>2.4.3commons.pool2.version>
    13. <log4j2.version>2.9.1log4j2.version>
    14. <log4j2.disruptor.version>3.2.0log4j2.disruptor.version>
    15. <slf4j.version>1.7.13slf4j.version>
    16. <junit.version>4.12junit.version>
    17. <servlet.version>4.0.0servlet.version>
    18. <lombok.version>1.18.2lombok.version>
    19. <mybatis.ehcache.version>1.1.0mybatis.ehcache.version>
    20. <ehcache.version>2.10.0ehcache.version>
    21. <redis.version>2.9.0redis.version>
    22. <redis.spring.version>1.7.1.RELEASEredis.spring.version>
    23. <jackson.version>2.9.3jackson.version>
    24. <jstl.version>1.2jstl.version>
    25. <standard.version>1.1.2standard.version>
    26. <tomcat-jsp-api.version>8.0.47tomcat-jsp-api.version>
    27. <commons-fileupload.version>1.3.3commons-fileupload.version>
    28. <hibernate-validator.version>5.0.2.Finalhibernate-validator.version>
    29. <shiro.version>1.3.2shiro.version>
    30. properties>
    31. //-------------------------------------------
    32. <dependencies>
    33. <dependency>
    34. <groupId>org.springframeworkgroupId>
    35. <artifactId>spring-coreartifactId>
    36. <version>${spring.version}version>
    37. dependency>
    38. <dependency>
    39. <groupId>org.springframeworkgroupId>
    40. <artifactId>spring-beansartifactId>
    41. <version>${spring.version}version>
    42. dependency>
    43. <dependency>
    44. <groupId>org.springframeworkgroupId>
    45. <artifactId>spring-contextartifactId>
    46. <version>${spring.version}version>
    47. dependency>
    48. <dependency>
    49. <groupId>org.springframeworkgroupId>
    50. <artifactId>spring-ormartifactId>
    51. <version>${spring.version}version>
    52. dependency>
    53. <dependency>
    54. <groupId>org.springframeworkgroupId>
    55. <artifactId>spring-txartifactId>
    56. <version>${spring.version}version>
    57. dependency>
    58. <dependency>
    59. <groupId>org.springframeworkgroupId>
    60. <artifactId>spring-aspectsartifactId>
    61. <version>${spring.version}version>
    62. dependency>
    63. <dependency>
    64. <groupId>org.springframeworkgroupId>
    65. <artifactId>spring-webartifactId>
    66. <version>${spring.version}version>
    67. dependency>
    68. <dependency>
    69. <groupId>org.springframeworkgroupId>
    70. <artifactId>spring-testartifactId>
    71. <version>${spring.version}version>
    72. dependency>
    73. <dependency>
    74. <groupId>org.mybatisgroupId>
    75. <artifactId>mybatisartifactId>
    76. <version>${mybatis.version}version>
    77. dependency>
    78. <dependency>
    79. <groupId>mysqlgroupId>
    80. <artifactId>mysql-connector-javaartifactId>
    81. <version>${mysql.version}version>
    82. dependency>
    83. <dependency>
    84. <groupId>com.github.pagehelpergroupId>
    85. <artifactId>pagehelperartifactId>
    86. <version>${pagehelper.version}version>
    87. dependency>
    88. <dependency>
    89. <groupId>org.mybatisgroupId>
    90. <artifactId>mybatis-springartifactId>
    91. <version>${mybatis.spring.version}version>
    92. dependency>
    93. <dependency>
    94. <groupId>org.springframeworkgroupId>
    95. <artifactId>spring-context-supportartifactId>
    96. <version>${spring.version}version>
    97. dependency>
    98. <dependency>
    99. <groupId>org.mybatis.cachesgroupId>
    100. <artifactId>mybatis-ehcacheartifactId>
    101. <version>${mybatis.ehcache.version}version>
    102. dependency>
    103. <dependency>
    104. <groupId>net.sf.ehcachegroupId>
    105. <artifactId>ehcacheartifactId>
    106. <version>${ehcache.version}version>
    107. dependency>
    108. <dependency>
    109. <groupId>redis.clientsgroupId>
    110. <artifactId>jedisartifactId>
    111. <version>${redis.version}version>
    112. dependency>
    113. <dependency>
    114. <groupId>org.springframework.datagroupId>
    115. <artifactId>spring-data-redisartifactId>
    116. <version>${redis.spring.version}version>
    117. dependency>
    118. <dependency>
    119. <groupId>com.fasterxml.jackson.coregroupId>
    120. <artifactId>jackson-databindartifactId>
    121. <version>${jackson.version}version>
    122. dependency>
    123. <dependency>
    124. <groupId>com.fasterxml.jackson.coregroupId>
    125. <artifactId>jackson-coreartifactId>
    126. <version>${jackson.version}version>
    127. dependency>
    128. <dependency>
    129. <groupId>com.fasterxml.jackson.coregroupId>
    130. <artifactId>jackson-annotationsartifactId>
    131. <version>${jackson.version}version>
    132. dependency>
    133. <dependency>
    134. <groupId>org.apache.commonsgroupId>
    135. <artifactId>commons-dbcp2artifactId>
    136. <version>${commons.dbcp2.version}version>
    137. <exclusions>
    138. <exclusion>
    139. <artifactId>commons-pool2artifactId>
    140. <groupId>org.apache.commonsgroupId>
    141. exclusion>
    142. exclusions>
    143. dependency>
    144. <dependency>
    145. <groupId>org.apache.commonsgroupId>
    146. <artifactId>commons-pool2artifactId>
    147. <version>${commons.pool2.version}version>
    148. dependency>
    149. <dependency>
    150. <groupId>org.springframeworkgroupId>
    151. <artifactId>spring-webmvcartifactId>
    152. <version>${spring.version}version>
    153. dependency>
    154. <dependency>
    155. <groupId>org.slf4jgroupId>
    156. <artifactId>slf4j-apiartifactId>
    157. <version>${slf4j.version}version>
    158. dependency>
    159. <dependency>
    160. <groupId>org.slf4jgroupId>
    161. <artifactId>jcl-over-slf4jartifactId>
    162. <version>${slf4j.version}version>
    163. <scope>runtimescope>
    164. dependency>
    165. <dependency>
    166. <groupId>org.apache.logging.log4jgroupId>
    167. <artifactId>log4j-apiartifactId>
    168. <version>${log4j2.version}version>
    169. dependency>
    170. <dependency>
    171. <groupId>org.apache.logging.log4jgroupId>
    172. <artifactId>log4j-coreartifactId>
    173. <version>${log4j2.version}version>
    174. dependency>
    175. <dependency>
    176. <groupId>org.apache.logging.log4jgroupId>
    177. <artifactId>log4j-slf4j-implartifactId>
    178. <version>${log4j2.version}version>
    179. dependency>
    180. <dependency>
    181. <groupId>org.apache.logging.log4jgroupId>
    182. <artifactId>log4j-webartifactId>
    183. <version>${log4j2.version}version>
    184. <scope>runtimescope>
    185. dependency>
    186. <dependency>
    187. <groupId>com.lmaxgroupId>
    188. <artifactId>disruptorartifactId>
    189. <version>${log4j2.disruptor.version}version>
    190. dependency>
    191. <dependency>
    192. <groupId>junitgroupId>
    193. <artifactId>junitartifactId>
    194. <version>${junit.version}version>
    195. <scope>testscope>
    196. dependency>
    197. <dependency>
    198. <groupId>javax.servletgroupId>
    199. <artifactId>javax.servlet-apiartifactId>
    200. <version>${servlet.version}version>
    201. <scope>providedscope>
    202. dependency>
    203. <dependency>
    204. <groupId>org.projectlombokgroupId>
    205. <artifactId>lombokartifactId>
    206. <version>${lombok.version}version>
    207. <scope>providedscope>
    208. dependency>
    209. <dependency>
    210. <groupId>jstlgroupId>
    211. <artifactId>jstlartifactId>
    212. <version>${jstl.version}version>
    213. dependency>
    214. <dependency>
    215. <groupId>taglibsgroupId>
    216. <artifactId>standardartifactId>
    217. <version>${standard.version}version>
    218. dependency>
    219. <dependency>
    220. <groupId>org.apache.tomcatgroupId>
    221. <artifactId>tomcat-jsp-apiartifactId>
    222. <version>${tomcat-jsp-api.version}version>
    223. dependency>
    224. <dependency>
    225. <groupId>commons-fileuploadgroupId>
    226. <artifactId>commons-fileuploadartifactId>
    227. <version>${commons-fileupload.version}version>
    228. dependency>
    229. <dependency>
    230. <groupId>org.hibernategroupId>
    231. <artifactId>hibernate-validatorartifactId>
    232. <version>${hibernate-validator.version}version>
    233. dependency>
    234. <dependency>
    235. <groupId>org.apache.shirogroupId>
    236. <artifactId>shiro-coreartifactId>
    237. <version>${shiro.version}version>
    238. dependency>
    239. <dependency>
    240. <groupId>org.apache.shirogroupId>
    241. <artifactId>shiro-webartifactId>
    242. <version>${shiro.version}version>
    243. dependency>
    244. <dependency>
    245. <groupId>org.apache.shirogroupId>
    246. <artifactId>shiro-springartifactId>
    247. <version>${shiro.version}version>
    248. dependency>
    249. dependencies>

    标签内将标签删除(解除版本锁定),加入

    可以确保mybatis-generator-maven-plugin在运行时能够正确地将所需的文件复制到目标文件夹中,避免出现缺少文件或配置错误的问题。

    1. <build>
    2. <finalName>xwzyssmfinalName>
    3. <resources>
    4. <resource>
    5. <directory>src/main/javadirectory>
    6. <includes>
    7. <include>**/*.xmlinclude>
    8. includes>
    9. resource>
    10. <resource>
    11. <directory>src/main/resourcesdirectory>
    12. <includes>
    13. <include>*.propertiesinclude>
    14. <include>*.xmlinclude>
    15. includes>
    16. resource>
    17. resources>
    18. <pluginManagement>
    19. <plugins>
    20. <plugin>
    21. <groupId>org.apache.maven.pluginsgroupId>
    22. <artifactId>maven-compiler-pluginartifactId>
    23. <version>${maven.compiler.plugin.version}version>
    24. <configuration>
    25. <source>${maven.compiler.source}source>
    26. <target>${maven.compiler.target}target>
    27. <encoding>${project.build.sourceEncoding}encoding>
    28. configuration>
    29. plugin>
    30. <plugin>
    31. <groupId>org.mybatis.generatorgroupId>
    32. <artifactId>mybatis-generator-maven-pluginartifactId>
    33. <version>1.3.2version>
    34. <dependencies>
    35. <dependency>
    36. <groupId>mysqlgroupId>
    37. <artifactId>mysql-connector-javaartifactId>
    38. <version>${mysql.version}version>
    39. dependency>
    40. dependencies>
    41. <configuration>
    42. <overwrite>trueoverwrite>
    43. configuration>
    44. plugin>
    45. <plugin>
    46. <artifactId>maven-clean-pluginartifactId>
    47. <version>3.1.0version>
    48. plugin>
    49. <plugin>
    50. <artifactId>maven-resources-pluginartifactId>
    51. <version>3.0.2version>
    52. plugin>
    53. <plugin>
    54. <artifactId>maven-compiler-pluginartifactId>
    55. <version>3.8.0version>
    56. plugin>
    57. <plugin>
    58. <artifactId>maven-surefire-pluginartifactId>
    59. <version>2.22.1version>
    60. plugin>
    61. <plugin>
    62. <artifactId>maven-war-pluginartifactId>
    63. <version>3.2.2version>
    64. plugin>
    65. <plugin>
    66. <artifactId>maven-install-pluginartifactId>
    67. <version>2.5.2version>
    68. plugin>
    69. <plugin>
    70. <artifactId>maven-deploy-pluginartifactId>
    71. <version>2.8.2version>
    72. plugin>
    73. plugins>
    74. pluginManagement>
    75. build>

    ③在pom.xml中,将junit的scope(依赖作用的范围)注释方便我们使用。 

    1.3.导入配置文件

    导入羡慕之前先将Maven的目录结构补齐

    ①jdbc.properties

    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://47.100.191.44:3308/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
    3. jdbc.username=123
    4. jdbc.password=123

    ②generatorConfig.xml

    将逆向生成的代码所在的包名进行更改即可。

    1. "1.0" encoding="UTF-8" ?>
    2. generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    4. <generatorConfiguration>
    5. <properties resource="jdbc.properties"/>
    6. <classPathEntry location="E:\\apache-maven-3.5.0-bin\\mvn_Repository\\mysql\\mysql-connector-java\\5.1.44"/>
    7. <context id="infoGuardian">
    8. <commentGenerator>
    9. <property name="suppressAllComments" value="true"/>
    10. <property name="suppressDate" value="true"/>
    11. commentGenerator>
    12. <jdbcConnection driverClass="${jdbc.driver}"
    13. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    14. <javaTypeResolver>
    15. <property name="forceBigDecimals" value="false"/>
    16. javaTypeResolver>
    17. <javaModelGenerator targetPackage="com.csdn.xw.model"
    18. targetProject="src/main/java">
    19. <property name="enableSubPackages" value="false"/>
    20. <property name="constructorBased" value="true"/>
    21. <property name="trimStrings" value="false"/>
    22. <property name="immutable" value="false"/>
    23. javaModelGenerator>
    24. <sqlMapGenerator targetPackage="com.csdn.xw.mapper"
    25. targetProject="src/main/java">
    26. <property name="enableSubPackages" value="false"/>
    27. sqlMapGenerator>
    28. <javaClientGenerator targetPackage="com.csdn.xw.mapper"
    29. targetProject="src/main/java" type="XMLMAPPER">
    30. <property name="enableSubPackages" value="false"/>
    31. javaClientGenerator>
    32. <table schema="" tableName="t_mysql_student" domainObjectName="Student"
    33. enableCountByExample="false" enableDeleteByExample="false"
    34. enableSelectByExample="false" enableUpdateByExample="false">
    35. table>
    36. context>
    37. generatorConfiguration>

    ③log4j2.xml

    1. "1.0" encoding="UTF-8"?>
    2. <Configuration status="WARN" monitorInterval="30">
    3. <Properties>
    4. <Property name="LOG_HOME">/root/workspace/lucenedemo/logsProperty>
    5. <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/errorproperty>
    6. <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warnproperty>
    7. <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%nproperty>
    8. Properties>
    9. <Appenders>
    10. <Console name="Console" target="SYSTEM_OUT">
    11. <ThresholdFilter level="trace" onMatch="ACCEPT"
    12. onMismatch="DENY" />
    13. <PatternLayout pattern="${PATTERN}" />
    14. Console>
    15. <File name="log" fileName="logs/test.log" append="false">
    16. <PatternLayout
    17. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    18. File>
    19. <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
    20. filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
    21. <ThresholdFilter level="info" onMatch="ACCEPT"
    22. onMismatch="DENY" />
    23. <PatternLayout
    24. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    25. <Policies>
    26. <TimeBasedTriggeringPolicy interval="1"
    27. modulate="true" />
    28. Policies>
    29. RollingFile>
    30. <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
    31. filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
    32. <ThresholdFilter level="warn" onMatch="ACCEPT"
    33. onMismatch="DENY" />
    34. <PatternLayout
    35. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    36. <Policies>
    37. <TimeBasedTriggeringPolicy />
    38. <SizeBasedTriggeringPolicy size="2 kB" />
    39. Policies>
    40. <DefaultRolloverStrategy max="20" />
    41. RollingFile>
    42. <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
    43. filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
    44. <ThresholdFilter level="error" onMatch="ACCEPT"
    45. onMismatch="DENY" />
    46. <PatternLayout
    47. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    48. <Policies>
    49. <TimeBasedTriggeringPolicy interval="1"
    50. modulate="true" />
    51. Policies>
    52. RollingFile>
    53. Appenders>
    54. <Loggers>
    55. <logger name="org.springframework" level="INFO">logger>
    56. <logger name="org.mybatis" level="INFO">logger>
    57. <logger name="org.springframework" level="ERROR" />
    58. <logger name="org.hibernate" level="ERROR" />
    59. <logger name="org.apache.struts2" level="ERROR" />
    60. <logger name="com.opensymphony.xwork2" level="ERROR" />
    61. <logger name="org.jboss" level="ERROR" />
    62. <root level="all">
    63. <appender-ref ref="Console" />
    64. <appender-ref ref="RollingFileInfo" />
    65. <appender-ref ref="RollingFileWarn" />
    66. <appender-ref ref="RollingFileError" />
    67. root>
    68. Loggers>
    69. Configuration>

    ④spring-mybatis.xml

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    7. <context:annotation-config/>
    8. <context:component-scan base-package="com.csdn.xw"/>
    9. <context:property-placeholder location="classpath:jdbc.properties"/>
    10. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    11. destroy-method="close">
    12. <property name="driverClassName" value="${jdbc.driver}"/>
    13. <property name="url" value="${jdbc.url}"/>
    14. <property name="username" value="${jdbc.username}"/>
    15. <property name="password" value="${jdbc.password}"/>
    16. <property name="initialSize" value="10"/>
    17. <property name="maxTotal" value="100"/>
    18. <property name="maxIdle" value="50"/>
    19. <property name="minIdle" value="10"/>
    20. <property name="maxWaitMillis" value="-1"/>
    21. bean>
    22. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    23. <property name="dataSource" ref="dataSource"/>
    24. <property name="mapperLocations" value="classpath*:com/csdn/xw/**/mapper/*.xml"/>
    25. <property name="typeAliasesPackage" value="com/csdn/xw/**/model"/>
    26. <property name="plugins">
    27. <array>
    28. <bean class="com.github.pagehelper.PageInterceptor">
    29. <property name="properties">
    30. <value>
    31. helperDialect=mysql
    32. value>
    33. property>
    34. bean>
    35. array>
    36. property>
    37. bean>
    38. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    39. <property name="basePackage" value="com/csdn/xw/**/mapper"/>
    40. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    41. bean>
    42. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    43. <property name="dataSource" ref="dataSource" />
    44. bean>
    45. <tx:annotation-driven transaction-manager="transactionManager" />
    46. <aop:aspectj-autoproxy/>
    47. beans>

    ⑤spring-context.xml

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <import resource="classpath:spring-mybatis.xml">import>
    6. beans>

    ⑥spring-mvc.xml

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:mvc="http://www.springframework.org/schema/mvc"
    6. xmlns:aop="http://www.springframework.org/schema/aop"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    9. <context:component-scan base-package="com.csdn.xw"/>
    10. <mvc:annotation-driven />
    11. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    12. <property name="viewClass"
    13. value="org.springframework.web.servlet.view.JstlView">property>
    14. <property name="prefix" value="/WEB-INF/jsp/"/>
    15. <property name="suffix" value=".jsp"/>
    16. bean>
    17. <aop:aspectj-autoproxy/>
    18. beans>

    ⑦修改web.xml文件

    该配置文件的作用是创建一个基于Spring MVC框架的Web应用程序,并配置了相关的上下文、监听器和Servlet,以支持Spring的依赖注入和MVC模式的开发。

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    5. version="3.1">
    6. <display-name>Archetype Created Web Applicationdisplay-name>
    7. <context-param>
    8. <param-name>contextConfigLocationparam-name>
    9. <param-value>classpath:spring-context.xmlparam-value>
    10. context-param>
    11. <listener>
    12. <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    13. listener>
    14. <filter>
    15. <filter-name>encodingFilterfilter-name>
    16. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    17. <async-supported>trueasync-supported>
    18. <init-param>
    19. <param-name>encodingparam-name>
    20. <param-value>UTF-8param-value>
    21. init-param>
    22. filter>
    23. <filter-mapping>
    24. <filter-name>encodingFilterfilter-name>
    25. <url-pattern>/*url-pattern>
    26. filter-mapping>
    27. <servlet>
    28. <servlet-name>SpringMVCservlet-name>
    29. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    30. <init-param>
    31. <param-name>contextConfigLocationparam-name>
    32. <param-value>classpath:spring-mvc.xmlparam-value>
    33. init-param>
    34. <load-on-startup>1load-on-startup>
    35. <async-supported>trueasync-supported>
    36. servlet>
    37. <servlet-mapping>
    38. <servlet-name>SpringMVCservlet-name>
    39. <url-pattern>/url-pattern>
    40. servlet-mapping>
    41. web-app>

    二、逆向生成增删改查

    2.1.导入相关util类

    ①StringUtils.java

    1. package com.csdn.xw.util;
    2. public class StringUtils {
    3. // 私有的构造方法,保护此类不能在外部实例化
    4. private StringUtils() {
    5. }
    6. /**
    7. * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
    8. *
    9. * @param s
    10. * @return
    11. */
    12. public static boolean isBlank(String s) {
    13. boolean b = false;
    14. if (null == s || s.trim().equals("")) {
    15. b = true;
    16. }
    17. return b;
    18. }
    19. /**
    20. * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
    21. *
    22. * @param s
    23. * @return
    24. */
    25. public static boolean isNotBlank(String s) {
    26. return !isBlank(s);
    27. }
    28. }

    ②PageBean.java

    1. package com.csdn.xw.util;
    2. import javax.servlet.http.HttpServletRequest;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. /**
    6. * @author Java方文山
    7. * @compay csdn_Java方文山
    8. * @create 2023-09-07-16:28
    9. */
    10. public class PageBean {
    11. private int page = 1;// 页码
    12. private int rows = 10;// 页大小
    13. private int total = 0;// 总记录数
    14. private boolean pagination = true;// 是否分页
    15. private String url; //保存上一次请求的URL
    16. private Map paramMap = new HashMap<>();// 保存上一次请求的参数
    17. /**
    18. * 初始化pagebean的,保存上一次请求的重要参数
    19. * @param req
    20. */
    21. public void setRequest(HttpServletRequest req) {
    22. // 1.1 需要保存上一次请求的URL
    23. this.setUrl(req.getRequestURL().toString());
    24. // 1.2 需要保存上一次请求的参数 bname、price
    25. this.setParamMap(req.getParameterMap());
    26. // 1.3 需要保存上一次请求的分页设置 pagination
    27. this.setPagination(req.getParameter("pagination"));
    28. // 1.4 需要保存上一次请求的展示条目数
    29. this.setRows(req.getParameter("rows"));
    30. // 1.5 初始化请求的页码 page
    31. this.setPage(req.getParameter("page"));
    32. }
    33. public void setPage(String page) {
    34. if(StringUtils.isNotBlank(page))
    35. this.setPage(Integer.valueOf(page));
    36. }
    37. public void setRows(String rows) {
    38. if(StringUtils.isNotBlank(rows))
    39. this.setRows(Integer.valueOf(rows));
    40. }
    41. public void setPagination(String pagination) {
    42. // 只有在前台jsp填写了pagination=false,才代表不分页
    43. if(StringUtils.isNotBlank(pagination))
    44. this.setPagination(!"false".equals(pagination));
    45. }
    46. public String getUrl() {
    47. return url;
    48. }
    49. public void setUrl(String url) {
    50. this.url = url;
    51. }
    52. public Map getParamMap() {
    53. return paramMap;
    54. }
    55. public void setParamMap(Map paramMap) {
    56. this.paramMap = paramMap;
    57. }
    58. public PageBean() {
    59. super();
    60. }
    61. public int getPage() {
    62. return page;
    63. }
    64. public void setPage(int page) {
    65. this.page = page;
    66. }
    67. public int getRows() {
    68. return rows;
    69. }
    70. public void setRows(int rows) {
    71. this.rows = rows;
    72. }
    73. public int getTotal() {
    74. return total;
    75. }
    76. public void setTotal(int total) {
    77. this.total = total;
    78. }
    79. public void setTotal(String total) {
    80. this.total = Integer.parseInt(total);
    81. }
    82. public boolean isPagination() {
    83. return pagination;
    84. }
    85. public void setPagination(boolean pagination) {
    86. this.pagination = pagination;
    87. }
    88. /**
    89. * 获得起始记录的下标
    90. *
    91. * @return
    92. */
    93. public int getStartIndex() {
    94. return (this.page - 1) * this.rows;
    95. }
    96. /**
    97. * 最大页
    98. * @return
    99. */
    100. public int maxPage() {
    101. // total % rows == 0 ? total / rows : total / rows +1
    102. return this.total % this.rows == 0 ? this.total / this.rows : this.total / this.rows + 1;
    103. }
    104. /**
    105. * 下一页
    106. * @return
    107. */
    108. public int nextPage() {
    109. // 如果当前页小于最大页,那就下一页为当前页+1;如果不小于,说明当前页就是最大页,那就无需+1
    110. return this.page < this.maxPage() ? this.page + 1 : this.page;
    111. }
    112. /**
    113. * 上一页
    114. * @return
    115. */
    116. public int previousPage() {
    117. return this.page > 1 ? this.page - 1 : this.page;
    118. }
    119. @Override
    120. public String toString() {
    121. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
    122. }
    123. }

    2.2.aspect切面

    创建一个名为aspect的包,编写一个PageAspect切面类专门来做分页。

    PageAspect

    1. package com.csdn.xw.aspect;
    2. import com.csdn.xw.util.PageBean;
    3. import com.github.pagehelper.PageHelper;
    4. import com.github.pagehelper.PageInfo;
    5. import org.aspectj.lang.ProceedingJoinPoint;
    6. import org.aspectj.lang.annotation.Around;
    7. import org.aspectj.lang.annotation.Aspect;
    8. import org.springframework.stereotype.Component;
    9. import java.util.List;
    10. @Aspect
    11. //代表当前类是切面类
    12. @Component
    13. //代表这个是交给Spring管理
    14. public class PageAspect {
    15. /**
    16. * *:返回值
    17. * *..:无限包
    18. * *Biz:以Biz结尾的接口名
    19. * .pager:以pager方法
    20. * 只要同时匹配上诉四个条件,就会被列为目标对象
    21. * 上诉配置要生效,代理注释一定要打开:
    22. * @param args
    23. * @return
    24. * @throws Throwable
    25. */
    26. @Around("execution(* *..*Biz.*Pager(..))")
    27. public Object invoke(ProceedingJoinPoint args) throws Throwable {
    28. Object[] params = args.getArgs();
    29. PageBean pageBean = null;
    30. for (Object param : params) {
    31. if(param instanceof PageBean){
    32. pageBean = (PageBean)param;
    33. break;
    34. }
    35. }
    36. if(pageBean != null && pageBean.isPagination())
    37. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    38. Object list = args.proceed(params);
    39. if(null != pageBean && pageBean.isPagination()){
    40. PageInfo pageInfo = new PageInfo((List) list);
    41. pageBean.setTotal(pageInfo.getTotal()+"");
    42. }
    43. return list;
    44. }
    45. }

     @Around("execution(* *..*Biz.*Pager(..))")`:这是一个注解,表示这个切面将会拦截所有使用了Biz.Pager()`方法的方法,所以我们需要分页的代码在其方法后面,加上Pager并在Biz多传递一个PageBean参数即可。

    2.3.Mybatis generator逆向生成

    在pom.xml或者generatorConfig.xml处

    右击➡Run Maven➡Plugins➡Mybatis-generator-maven-plugin➡单击mybatis-generator:generate

     会在根据你配置文件中提供的路径进行逆向生成代码。

    2.4.根据生成代码编写Biz层与实现类

    由于我们还需要一个模糊查询的方法,所以在StudentMapper.xml中添加一个方法

    1. <select id="selectBySnamePager" resultType="com.csdn.xw.model.Student" parameterType="com.csdn.xw.model.Student" >
    2. select
    3. <include refid="Base_Column_List" />
    4. from t_mysql_student
    5. <if test="sname != null">
    6. where sname like concat('%',#{sname},'%')
    7. if>
    8. select>

    并在StudentMapper.java添加一个相对应的方法和注解@Repository

    StudentBiz

    1. public interface StudentBiz {
    2. int deleteByPrimaryKey(String sid);
    3. int insert(Student record);
    4. int insertSelective(Student record);
    5. Student selectByPrimaryKey(String sid);
    6. int updateByPrimaryKeySelective(Student record);
    7. int updateByPrimaryKey(Student record);
    8. List selectBySnamePager(Student student,PageBean PageBean);
    9. }

    StudentBizImpl

    1. package com.csdn.xw.Biz.Impl;
    2. import com.csdn.xw.Biz.StudentBiz;
    3. import com.csdn.xw.mapper.StudentMapper;
    4. import com.csdn.xw.model.Student;
    5. import com.csdn.xw.util.PageBean;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. import java.util.List;
    9. /**
    10. * @author Java方文山
    11. * @compay csdn_Java方文山
    12. * @create 2023-09-07-16:22
    13. */
    14. @Service
    15. public class StudentBizImpl implements StudentBiz {
    16. @Autowired
    17. private StudentMapper studentMapper;
    18. @Override
    19. public int deleteByPrimaryKey(String sid) {
    20. return studentMapper.deleteByPrimaryKey(sid);
    21. }
    22. @Override
    23. public int insert(Student record) {
    24. return studentMapper.insert(record);
    25. }
    26. @Override
    27. public int insertSelective(Student record) {
    28. return studentMapper.insertSelective(record);
    29. }
    30. @Override
    31. public Student selectByPrimaryKey(String sid) {
    32. return studentMapper.selectByPrimaryKey(sid);
    33. }
    34. @Override
    35. public int updateByPrimaryKeySelective(Student record) {
    36. return studentMapper.updateByPrimaryKeySelective(record);
    37. }
    38. @Override
    39. public int updateByPrimaryKey(Student record) {
    40. return studentMapper.updateByPrimaryKey(record);
    41. }
    42. @Override
    43. public List selectBySnamePager(Student student, PageBean PageBean) {
    44. return studentMapper.selectBySnamePager(student);
    45. }
    46. }

    至此,我们的增删改查加模糊查询的分页所有方法就写完了。

    三、controller层代码编写

    首先建一个名为web的包,随后建立一个StudentController。

    StudentController

    1. @Controller
    2. @RequestMapping("/student")
    3. public class StudentController {
    4. @Autowired
    5. private StudentBiz stubiz;
    6. // 增
    7. @RequestMapping("/add")
    8. public String add(Student student){
    9. stubiz.insertSelective(student);
    10. return "redirect:list";
    11. }
    12. // 删
    13. @RequestMapping("/del")
    14. public String del(Student student){
    15. stubiz.deleteByPrimaryKey(student.getSid());
    16. return "redirect:list";
    17. }
    18. // 查
    19. @RequestMapping("/list")
    20. public String list(Student student, HttpServletRequest request){
    21. PageBean pageBean=new PageBean();
    22. pageBean.setRequest(request);
    23. List students = stubiz.selectBySnamePager(student, pageBean);
    24. request.setAttribute("slist",students);
    25. request.setAttribute("pageBean",pageBean);
    26. return "student/list";
    27. }
    28. // 改
    29. @RequestMapping("/edit")
    30. public String edit(Student student){
    31. stubiz.updateByPrimaryKeySelective(student);
    32. return "redirect:list";
    33. }
    34. // 模糊分页查询
    35. @RequestMapping("/PreSave")
    36. public String PreSave(Student student, HttpServletRequest request){
    37. if(student!=null && student.getSid()!=null){
    38. Student s = stubiz.selectByPrimaryKey(student.getSid());
    39. request.setAttribute("s",s);
    40. }
    41. return "student/edit";
    42. }
    43. }

    查询这用的是绝对路径,所以还要加上student。

    四、前台代码与分页代码

    这里我需要用到分页,所以将以前我所编写的自定义分页标签加入。

    首先建立一个名为tag的包,将PageTag.java导入

    ①PageTag.java

    1. package com.csdn.xw.tag;
    2. import com.csdn.xw.util.PageBean;
    3. import javax.servlet.jsp.JspException;
    4. import javax.servlet.jsp.JspWriter;
    5. import javax.servlet.jsp.tagext.BodyTagSupport;
    6. import java.io.IOException;
    7. import java.util.Map;
    8. import java.util.Map.Entry;
    9. import java.util.Set;
    10. public class PageTag extends BodyTagSupport{
    11. private PageBean pageBean;// 包含了所有分页相关的元素
    12. public PageBean getPageBean() {
    13. return pageBean;
    14. }
    15. public void setPageBean(PageBean pageBean) {
    16. this.pageBean = pageBean;
    17. }
    18. @Override
    19. public int doStartTag() throws JspException {
    20. // 没有标签体,要输出内容
    21. JspWriter out = pageContext.getOut();
    22. try {
    23. out.print(toHTML());
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. }
    27. return super.doStartTag();
    28. }
    29. private String toHTML() {
    30. StringBuffer sb = new StringBuffer();
    31. // 隐藏的form表单---这个就是上一次请求下次重新发的奥义所在
    32. // 上一次请求的URL
    33. sb.append("
      ");
    34. sb.append(" ");
    35. // 上一次请求的参数
    36. Map paramMap = pageBean.getParamMap();
    37. if(paramMap != null && paramMap.size() > 0) {
    38. Set> entrySet = paramMap.entrySet();
    39. for (Entry entry : entrySet) {
    40. // 参数名
    41. String key = entry.getKey();
    42. // 参数值
    43. for (String value : entry.getValue()) {
    44. // 上一次请求的参数,再一次组装成了新的Form表单
    45. // 注意:page参数每次都会提交,我们需要避免
    46. if(!"page".equals(key)) {
    47. sb.append(" ");
    48. }
    49. }
    50. }
    51. }
    52. sb.append("");
    53. // 分页条
    54. sb.append("
        ");
    55. sb.append("
    56. );
  • ");
  • sb.append("
  • );
  • ");// less than 小于号
  • // sb.append("
  • 1
  • ");
  • // sb.append("
  • 2
  • ");
  • sb.append("
  • "+pageBean.getPage()+"
  • ");
  • sb.append("
  • >
  • ");
  • sb.append("
  • 尾页
  • ");
  • sb.append("
  • 到第);
  • sb.append(" type='text' id='skipPage' name='' />
  • ");
  • sb.append("
  • );
  • ");
  • sb.append("
  • 共"+pageBean.getTotal()+"条
  • ");
  • sb.append("");
  • // 分页执行的JS代码
  • sb.append("");
  • return sb.toString();
  • }
  • }
  • 将tld文件导入WEB-INF下

    ②zking.tld

    1. "1.0" encoding="UTF-8" ?>
    2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    5. version="2.0">
    6. <description>zking 1.1 core librarydescription>
    7. <display-name>zking coredisplay-name>
    8. <tlib-version>1.1tlib-version>
    9. <short-name>zkingshort-name>
    10. <uri>http://jsp.veryedu.cnuri>
    11. <tag>
    12. <name>pagename>
    13. <tag-class>com.csdn.xw.tag.PageTagtag-class>
    14. <body-content>JSPbody-content>
    15. <attribute>
    16. <name>pageBeanname>
    17. <required>truerequired>
    18. <rtexprvalue>truertexprvalue>
    19. attribute>
    20. tag>
    21. taglib>

    ③list.jsp

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 索隆
    4. Date: 2023/9/8
    5. Time: 16:32
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
    10. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    11. <html>
    12. <head>
    13. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    14. <link
    15. href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
    16. rel="stylesheet">
    17. <script
    18. src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js">script>
    19. <title>学生管理首页title>
    20. <style type="text/css">
    21. .page-item input {
    22. padding: 0;
    23. width: 40px;
    24. height: 100%;
    25. text-align: center;
    26. margin: 0 6px;
    27. }
    28. .page-item input, .page-item b {
    29. line-height: 38px;
    30. float: left;
    31. font-weight: 400;
    32. }
    33. .page-item.go-input {
    34. margin: 0 10px;
    35. }
    36. style>
    37. head>
    38. <body>
    39. <form class="form-inline"
    40. action="${pageContext.request.contextPath }/student/list" method="post">
    41. <div class="form-group mb-2">
    42. <input type="text" class="form-control-plaintext" name="sname"
    43. placeholder="请输入学生名称">
    44. <%--<input name="pagination" value="false" type="hidden">--%>
    45. div>
    46. <button type="submit" class="btn btn-primary mb-2">查询button>
    47. <a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/student/PreSave">新增a>
    48. form>
    49. <table class="table table-striped ">
    50. <thead>
    51. <tr>
    52. <th scope="col">学生IDth>
    53. <th scope="col">学生名称th>
    54. <th scope="col">学生年龄th>
    55. <th scope="col">学生性别th>
    56. <th scope="col">操作th>
    57. tr>
    58. thead>
    59. <tbody>
    60. <c:forEach var="s" items="${slist }">
    61. <tr>
    62. <td>${s.sid }td>
    63. <td>${s.sname }td>
    64. <td>${s.sage }td>
    65. <td>${s.ssex }td>
    66. <td>
    67. <a href="${pageContext.request.contextPath }/student/PreSave?sid=${s.sid}">修改a>
    68. <a href="${pageContext.request.contextPath }/student/del?sid=${s.sid}">删除a>
    69. td>
    70. tr>
    71. c:forEach>
    72. tbody>
    73. table>
    74. <z:page pageBean="${pageBean }">z:page>
    75. ${pageBean }
    76. ${slist}
    77. body>
    78. html>

    ④edit.jsp

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 索隆
    4. Date: 2023/9/8
    5. Time: 16:49
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <html>
    10. <head>
    11. <title>编辑界面title>
    12. head>
    13. <body>
    14. <center>
    15. 编辑界面
    16. <form action="${pageContext.request.contextPath }/${empty s ? 'student/add' : 'student/edit'}" method="post">
    17. sid:<input type="text" name="sid" value="${s.sid }"><br>
    18. sname:<input type="text" name="sname" value="${s.sname }"><br>
    19. sage:<input type="text" name="sage" value="${s.sage }"><br>
    20. ssex:<input type="text" name="ssex" value="${s.ssex }"><br>
    21. <input type="submit">
    22. form>
    23. center>
    24. body>
    25. html>

    五、案例测试

    5.1.模糊查询

    5.2.新增

    5.3.修改

    5.4.删除

    5.5.分页

    到这里我的分享就结束了,欢迎到评论区探讨交流!!

    💖如果觉得有用的话还请点个赞吧 💖

  • 相关阅读:
    看门狗 WDG
    Spring JdbcTemplate.queryForMap()
    [附源码]java毕业设计新冠疫苗接种预约系统
    软考高级五大证书,哪个更值得考?
    数据结构 - 链表
    华为OD机试 - 最长的指定瑕疵度的元音子串 - 正则表达式(Java 2023 B卷 200分)
    终端安全能力验证环境搭建和渗透测试记录
    为什么需要协调能力?如何提高协调能力?
    WebGL笔记:绘制多个点,三角形,以及画各种不同的线条,面
    上周热点回顾(2.19-2.25)
  • 原文地址:https://blog.csdn.net/weixin_74318097/article/details/132737854