• 实战SpringMVC之CRUD


    目录

    一、前期准备

    1.1 编写页面跳转控制类

    二、实现CRUD

    2.1 相关依赖

    2.2 配置文件

    2.3 逆向生成

    2.4 后台代码完善

    2.4.1 编写切面类

    2.4.2 编写工具类

    2.4.3 编写biz层

    2.4.4 配置mapper.xml

    2.4.5 编写相应接口类(MusicMapper)

    2.4.6 处理controller层发送到biz的请求(配置spring-mvc.xml)

    2.4.7 编写tag助手标签类

    2.4.8 引入tld标签库

    2.4.9 编写controller类

    2.5 前台代码

    2.5.1 主页面编写

    2.5.2 修改界面编写

    三、展示效果

    四、实战SpringMVC增删改查的收获


    一、前期准备

    1.1 编写页面跳转控制类

    通过@PathVariable方式实现公共页面跳转。代码如下:

    1. package com.Kissship.web;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.PathVariable;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. /**
    6. * @author Kissship
    7. * @site www.Kissship.com
    8. * @company xxx公司
    9. * @create 2023-09-07-15:01
    10. *
    11. * 用来处理页面跳转
    12. */
    13. @Controller
    14. public class PageController {
    15. //新增 新增界面
    16. @RequestMapping("/page/{page}")
    17. public String toPage(@PathVariable("page") String page){
    18. return page;
    19. }
    20. @RequestMapping("/page/{dir}{page}")
    21. public String toDirPage(@PathVariable("dir") String dir,
    22. @PathVariable("page") String page){
    23. return dir + "/" + page;
    24. }
    25. }

    二、实现CRUD

    2.1 相关依赖

    pom.xml:

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>org.examplegroupId>
    7. <artifactId>kissshipssmartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <packaging>warpackaging>
    10. <name>kissshipssm Maven Webappname>
    11. <url>http://www.example.comurl>
    12. <properties>
    13. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    14. <maven.compiler.source>1.8maven.compiler.source>
    15. <maven.compiler.target>1.8maven.compiler.target>
    16. <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
    17. <spring.version>5.0.2.RELEASEspring.version>
    18. <mybatis.version>3.4.5mybatis.version>
    19. <mysql.version>5.1.44mysql.version>
    20. <pagehelper.version>5.1.2pagehelper.version>
    21. <mybatis.spring.version>1.3.1mybatis.spring.version>
    22. <commons.dbcp2.version>2.1.1commons.dbcp2.version>
    23. <commons.pool2.version>2.4.3commons.pool2.version>
    24. <log4j2.version>2.9.1log4j2.version>
    25. <log4j2.disruptor.version>3.2.0log4j2.disruptor.version>
    26. <slf4j.version>1.7.13slf4j.version>
    27. <junit.version>4.12junit.version>
    28. <servlet.version>4.0.0servlet.version>
    29. <lombok.version>1.18.2lombok.version>
    30. <mybatis.ehcache.version>1.1.0mybatis.ehcache.version>
    31. <ehcache.version>2.10.0ehcache.version>
    32. <redis.version>2.9.0redis.version>
    33. <redis.spring.version>1.7.1.RELEASEredis.spring.version>
    34. <jackson.version>2.9.3jackson.version>
    35. <jstl.version>1.2jstl.version>
    36. <standard.version>1.1.2standard.version>
    37. <tomcat-jsp-api.version>8.0.47tomcat-jsp-api.version>
    38. <commons-fileupload.version>1.3.3commons-fileupload.version>
    39. <hibernate-validator.version>5.0.2.Finalhibernate-validator.version>
    40. <shiro.version>1.3.2shiro.version>
    41. properties>
    42. <dependencies>
    43. <dependency>
    44. <groupId>org.springframeworkgroupId>
    45. <artifactId>spring-coreartifactId>
    46. <version>${spring.version}version>
    47. dependency>
    48. <dependency>
    49. <groupId>org.springframeworkgroupId>
    50. <artifactId>spring-beansartifactId>
    51. <version>${spring.version}version>
    52. dependency>
    53. <dependency>
    54. <groupId>org.springframeworkgroupId>
    55. <artifactId>spring-contextartifactId>
    56. <version>${spring.version}version>
    57. dependency>
    58. <dependency>
    59. <groupId>org.springframeworkgroupId>
    60. <artifactId>spring-ormartifactId>
    61. <version>${spring.version}version>
    62. dependency>
    63. <dependency>
    64. <groupId>org.springframeworkgroupId>
    65. <artifactId>spring-txartifactId>
    66. <version>${spring.version}version>
    67. dependency>
    68. <dependency>
    69. <groupId>org.springframeworkgroupId>
    70. <artifactId>spring-aspectsartifactId>
    71. <version>${spring.version}version>
    72. dependency>
    73. <dependency>
    74. <groupId>org.springframeworkgroupId>
    75. <artifactId>spring-webartifactId>
    76. <version>${spring.version}version>
    77. dependency>
    78. <dependency>
    79. <groupId>org.springframeworkgroupId>
    80. <artifactId>spring-testartifactId>
    81. <version>${spring.version}version>
    82. dependency>
    83. <dependency>
    84. <groupId>org.mybatisgroupId>
    85. <artifactId>mybatisartifactId>
    86. <version>${mybatis.version}version>
    87. dependency>
    88. <dependency>
    89. <groupId>mysqlgroupId>
    90. <artifactId>mysql-connector-javaartifactId>
    91. <version>${mysql.version}version>
    92. dependency>
    93. <dependency>
    94. <groupId>com.github.pagehelpergroupId>
    95. <artifactId>pagehelperartifactId>
    96. <version>${pagehelper.version}version>
    97. dependency>
    98. <dependency>
    99. <groupId>org.mybatisgroupId>
    100. <artifactId>mybatis-springartifactId>
    101. <version>${mybatis.spring.version}version>
    102. dependency>
    103. <dependency>
    104. <groupId>org.springframeworkgroupId>
    105. <artifactId>spring-context-supportartifactId>
    106. <version>${spring.version}version>
    107. dependency>
    108. <dependency>
    109. <groupId>org.mybatis.cachesgroupId>
    110. <artifactId>mybatis-ehcacheartifactId>
    111. <version>${mybatis.ehcache.version}version>
    112. dependency>
    113. <dependency>
    114. <groupId>net.sf.ehcachegroupId>
    115. <artifactId>ehcacheartifactId>
    116. <version>${ehcache.version}version>
    117. dependency>
    118. <dependency>
    119. <groupId>redis.clientsgroupId>
    120. <artifactId>jedisartifactId>
    121. <version>${redis.version}version>
    122. dependency>
    123. <dependency>
    124. <groupId>org.springframework.datagroupId>
    125. <artifactId>spring-data-redisartifactId>
    126. <version>${redis.spring.version}version>
    127. dependency>
    128. <dependency>
    129. <groupId>com.fasterxml.jackson.coregroupId>
    130. <artifactId>jackson-databindartifactId>
    131. <version>${jackson.version}version>
    132. dependency>
    133. <dependency>
    134. <groupId>com.fasterxml.jackson.coregroupId>
    135. <artifactId>jackson-coreartifactId>
    136. <version>${jackson.version}version>
    137. dependency>
    138. <dependency>
    139. <groupId>com.fasterxml.jackson.coregroupId>
    140. <artifactId>jackson-annotationsartifactId>
    141. <version>${jackson.version}version>
    142. dependency>
    143. <dependency>
    144. <groupId>org.apache.commonsgroupId>
    145. <artifactId>commons-dbcp2artifactId>
    146. <version>${commons.dbcp2.version}version>
    147. <exclusions>
    148. <exclusion>
    149. <artifactId>commons-pool2artifactId>
    150. <groupId>org.apache.commonsgroupId>
    151. exclusion>
    152. exclusions>
    153. dependency>
    154. <dependency>
    155. <groupId>org.apache.commonsgroupId>
    156. <artifactId>commons-pool2artifactId>
    157. <version>${commons.pool2.version}version>
    158. dependency>
    159. <dependency>
    160. <groupId>org.springframeworkgroupId>
    161. <artifactId>spring-webmvcartifactId>
    162. <version>${spring.version}version>
    163. dependency>
    164. <dependency>
    165. <groupId>org.slf4jgroupId>
    166. <artifactId>slf4j-apiartifactId>
    167. <version>${slf4j.version}version>
    168. dependency>
    169. <dependency>
    170. <groupId>org.slf4jgroupId>
    171. <artifactId>jcl-over-slf4jartifactId>
    172. <version>${slf4j.version}version>
    173. <scope>runtimescope>
    174. dependency>
    175. <dependency>
    176. <groupId>org.apache.logging.log4jgroupId>
    177. <artifactId>log4j-apiartifactId>
    178. <version>${log4j2.version}version>
    179. dependency>
    180. <dependency>
    181. <groupId>org.apache.logging.log4jgroupId>
    182. <artifactId>log4j-coreartifactId>
    183. <version>${log4j2.version}version>
    184. dependency>
    185. <dependency>
    186. <groupId>org.apache.logging.log4jgroupId>
    187. <artifactId>log4j-slf4j-implartifactId>
    188. <version>${log4j2.version}version>
    189. dependency>
    190. <dependency>
    191. <groupId>org.apache.logging.log4jgroupId>
    192. <artifactId>log4j-webartifactId>
    193. <version>${log4j2.version}version>
    194. <scope>runtimescope>
    195. dependency>
    196. <dependency>
    197. <groupId>com.lmaxgroupId>
    198. <artifactId>disruptorartifactId>
    199. <version>${log4j2.disruptor.version}version>
    200. dependency>
    201. <dependency>
    202. <groupId>junitgroupId>
    203. <artifactId>junitartifactId>
    204. <version>${junit.version}version>
    205. <scope>testscope>
    206. dependency>
    207. <dependency>
    208. <groupId>javax.servletgroupId>
    209. <artifactId>javax.servlet-apiartifactId>
    210. <version>${servlet.version}version>
    211. <scope>providedscope>
    212. dependency>
    213. <dependency>
    214. <groupId>org.projectlombokgroupId>
    215. <artifactId>lombokartifactId>
    216. <version>${lombok.version}version>
    217. <scope>providedscope>
    218. dependency>
    219. <dependency>
    220. <groupId>jstlgroupId>
    221. <artifactId>jstlartifactId>
    222. <version>${jstl.version}version>
    223. dependency>
    224. <dependency>
    225. <groupId>taglibsgroupId>
    226. <artifactId>standardartifactId>
    227. <version>${standard.version}version>
    228. dependency>
    229. <dependency>
    230. <groupId>org.apache.tomcatgroupId>
    231. <artifactId>tomcat-jsp-apiartifactId>
    232. <version>${tomcat-jsp-api.version}version>
    233. dependency>
    234. <dependency>
    235. <groupId>commons-fileuploadgroupId>
    236. <artifactId>commons-fileuploadartifactId>
    237. <version>${commons-fileupload.version}version>
    238. dependency>
    239. <dependency>
    240. <groupId>org.hibernategroupId>
    241. <artifactId>hibernate-validatorartifactId>
    242. <version>${hibernate-validator.version}version>
    243. dependency>
    244. <dependency>
    245. <groupId>org.apache.shirogroupId>
    246. <artifactId>shiro-coreartifactId>
    247. <version>${shiro.version}version>
    248. dependency>
    249. <dependency>
    250. <groupId>org.apache.shirogroupId>
    251. <artifactId>shiro-webartifactId>
    252. <version>${shiro.version}version>
    253. dependency>
    254. <dependency>
    255. <groupId>org.apache.shirogroupId>
    256. <artifactId>shiro-springartifactId>
    257. <version>${shiro.version}version>
    258. dependency>
    259. <dependency>
    260. <groupId>org.examplegroupId>
    261. <artifactId>Spring-mybatisartifactId>
    262. <version>1.0-SNAPSHOTversion>
    263. <scope>compilescope>
    264. dependency>
    265. dependencies>
    266. <build>
    267. <finalName>kissshipssmfinalName>
    268. <resources>
    269. <resource>
    270. <directory>src/main/javadirectory>
    271. <includes>
    272. <include>**/*.xmlinclude>
    273. includes>
    274. resource>
    275. <resource>
    276. <directory>src/main/resourcesdirectory>
    277. <includes>
    278. <include>*.propertiesinclude>
    279. <include>*.xmlinclude>
    280. includes>
    281. resource>
    282. resources>
    283. <plugins>
    284. <plugin>
    285. <groupId>org.apache.maven.pluginsgroupId>
    286. <artifactId>maven-compiler-pluginartifactId>
    287. <version>${maven.compiler.plugin.version}version>
    288. <configuration>
    289. <source>${maven.compiler.source}source>
    290. <target>${maven.compiler.target}target>
    291. <encoding>${project.build.sourceEncoding}encoding>
    292. configuration>
    293. plugin>
    294. <plugin>
    295. <groupId>org.mybatis.generatorgroupId>
    296. <artifactId>mybatis-generator-maven-pluginartifactId>
    297. <version>1.3.2version>
    298. <dependencies>
    299. <dependency>
    300. <groupId>mysqlgroupId>
    301. <artifactId>mysql-connector-javaartifactId>
    302. <version>${mysql.version}version>
    303. dependency>
    304. dependencies>
    305. <configuration>
    306. <overwrite>trueoverwrite>
    307. configuration>
    308. plugin>
    309. <plugin>
    310. <artifactId>maven-clean-pluginartifactId>
    311. <version>3.1.0version>
    312. plugin>
    313. <plugin>
    314. <artifactId>maven-resources-pluginartifactId>
    315. <version>3.0.2version>
    316. plugin>
    317. <plugin>
    318. <artifactId>maven-compiler-pluginartifactId>
    319. <version>3.8.0version>
    320. plugin>
    321. <plugin>
    322. <artifactId>maven-surefire-pluginartifactId>
    323. <version>2.22.1version>
    324. plugin>
    325. <plugin>
    326. <artifactId>maven-war-pluginartifactId>
    327. <version>3.2.2version>
    328. plugin>
    329. <plugin>
    330. <artifactId>maven-install-pluginartifactId>
    331. <version>2.5.2version>
    332. plugin>
    333. <plugin>
    334. <artifactId>maven-deploy-pluginartifactId>
    335. <version>2.8.2version>
    336. plugin>
    337. plugins>
    338. build>
    339. project>

    2.2 配置文件

    web.xml:

    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.3 逆向生成

    生成后的对应目标目录如下:

    在生成后的HBookMapper接口中,需要加上@Repository给Spring进行托管。

    2.4 后台代码完善

    2.4.1 编写切面类

    PagerAspect:

    1. package com.Kissship.aspect;
    2. import com.Kissship.utils.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. @Component
    12. public class PagerAspect {
    13. @Around("execution(* *..*Biz.*Pager(..))")
    14. public Object invoke(ProceedingJoinPoint args) throws Throwable {
    15. PageBean pageBean=null;
    16. Object[] ags = args.getArgs();
    17. for (Object param:ags){
    18. if (param instanceof PageBean){
    19. pageBean=(PageBean)param;
    20. break;
    21. }
    22. }
    23. if (pageBean!=null&& pageBean.isPagination()){
    24. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    25. }
    26. Object lst = args.proceed();
    27. if(pageBean!=null && pageBean.isPagination()){
    28. PageInfo pageInfo = new PageInfo((List) lst);
    29. pageBean.setTotal((int) pageInfo.getTotal());
    30. }
    31. return lst;
    32. }
    33. }

    2.4.2 编写工具类

    PageBean:

    1. package com.Kissship.utils;
    2. import javax.servlet.http.HttpServletRequest;
    3. import java.io.Serializable;
    4. import java.util.Map;
    5. /**
    6. * @author Kissship
    7. * @site www.Kissship.com
    8. * @company xxx公司
    9. * @create 2023-08-15-15:42
    10. */
    11. public class PageBean implements Serializable {
    12. private static final long serialVersionUID = 2422581023658455731L;
    13. //页码
    14. private int page=1;
    15. //每页显示记录数
    16. private int rows=10;
    17. //总记录数
    18. private int total=0;
    19. //是否分页
    20. private boolean isPagination=true;
    21. //上一次的请求路径
    22. private String url;
    23. //获取所有的请求参数
    24. private Map map;
    25. public PageBean() {
    26. super();
    27. }
    28. //设置请求参数
    29. public void setRequest(HttpServletRequest req) {
    30. String page=req.getParameter("page");
    31. String rows=req.getParameter("rows");
    32. String pagination=req.getParameter("pagination");
    33. this.setPage(page);
    34. this.setRows(rows);
    35. this.setPagination(pagination);
    36. this.url=req.getContextPath()+req.getServletPath();
    37. this.map=req.getParameterMap();
    38. }
    39. public String getUrl() {
    40. return url;
    41. }
    42. public void setUrl(String url) {
    43. this.url = url;
    44. }
    45. public Map getMap() {
    46. return map;
    47. }
    48. public void setMap(Map map) {
    49. this.map = map;
    50. }
    51. public int getPage() {
    52. return page;
    53. }
    54. public void setPage(int page) {
    55. this.page = page;
    56. }
    57. public void setPage(String page) {
    58. if(null!=page&&!"".equals(page.trim()))
    59. this.page = Integer.parseInt(page);
    60. }
    61. public int getRows() {
    62. return rows;
    63. }
    64. public void setRows(int rows) {
    65. this.rows = rows;
    66. }
    67. public void setRows(String rows) {
    68. if(null!=rows&&!"".equals(rows.trim()))
    69. this.rows = Integer.parseInt(rows);
    70. }
    71. public int getTotal() {
    72. return total;
    73. }
    74. public void setTotal(int total) {
    75. this.total = total;
    76. }
    77. public void setTotal(String total) {
    78. this.total = Integer.parseInt(total);
    79. }
    80. public boolean isPagination() {
    81. return isPagination;
    82. }
    83. public void setPagination(boolean isPagination) {
    84. this.isPagination = isPagination;
    85. }
    86. public void setPagination(String isPagination) {
    87. if(null!=isPagination&&!"".equals(isPagination.trim()))
    88. this.isPagination = Boolean.parseBoolean(isPagination);
    89. }
    90. /**
    91. * 获取分页起始标记位置
    92. * @return
    93. */
    94. public int getStartIndex() {
    95. //(当前页码-1)*显示记录数
    96. return (this.getPage()-1)*this.rows;
    97. }
    98. /**
    99. * 末页
    100. * @return
    101. */
    102. public int getMaxPage() {
    103. int totalpage=this.total/this.rows;
    104. if(this.total%this.rows!=0)
    105. totalpage++;
    106. return totalpage;
    107. }
    108. /**
    109. * 下一页
    110. * @return
    111. */
    112. public int getNextPage() {
    113. int nextPage=this.page+1;
    114. if(this.page>=this.getMaxPage())
    115. nextPage=this.getMaxPage();
    116. return nextPage;
    117. }
    118. /**
    119. * 上一页
    120. * @return
    121. */
    122. public int getPreivousPage() {
    123. int previousPage=this.page-1;
    124. if(previousPage<1)
    125. previousPage=1;
    126. return previousPage;
    127. }
    128. @Override
    129. public String toString() {
    130. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
    131. + "]";
    132. }
    133. }

    2.4.3 编写biz层

    1. package com.Kissship.biz;
    2. import com.Kissship.model.Music;
    3. import com.Kissship.utils.PageBean;
    4. import java.util.List;
    5. public interface MusicBiz {
    6. int deleteByPrimaryKey(Integer mid);
    7. int insert(Music record);
    8. int insertSelective(Music record);
    9. Music selectByPrimaryKey(Integer mid);
    10. int updateByPrimaryKeySelective(Music record);
    11. int updateByPrimaryKey(Music record);
    12. List listPager(Music music, PageBean pageBean);
    13. }

    注:

    这个方法为查询返回列表方法,包含分页,因为切面类对其进行切面,所以在命名时,必须以Pager结尾。

    2.4.4 配置mapper.xml

    1. <select id="selectBycon" resultType="com.Kissship.model.Music" parameterType="com.Kissship.model.Music" >
    2. select
    3. <include refid="Base_Column_List" />
    4. from jay_music
    5. <where>
    6. <if test="mname != null">
    7. and mname like concat('%',#{mname},'%')
    8. if>
    9. where>
    10. select>

    2.4.5 编写相应接口类(MusicMapper)

    在自动生成的代码下添加以下:

    List selectBycon(Music music);

    2.4.6 处理controller层发送到biz的请求(配置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:aop="http://www.springframework.org/schema/aop"
    6. xmlns:mvc="http://www.springframework.org/schema/mvc"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans
    8. http://www.springframework.org/schema/beans/spring-beans.xsd
    9. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
    10. http://www.springframework.org/schema/aop
    11. http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    12. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    13. <context:component-scan base-package="com.Kissship"/>
    14. <mvc:annotation-driven />
    15. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    16. <property name="viewClass"
    17. value="org.springframework.web.servlet.view.JstlView">property>
    18. <property name="prefix" value="/WEB-INF/jsp/"/>
    19. <property name="suffix" value=".jsp"/>
    20. bean>
    21. <mvc:resources location="/static/" mapping="/static/**"/>
    22. <aop:aspectj-autoproxy/>
    23. beans>

    2.4.7 编写tag助手标签类

    PageTag:

    1. package com.Kissship.tag;
    2. import com.Kissship.utils.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.getMap();
    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();
  • }
  • }
  • 2.4.8 引入tld标签库

    kissship.tld:

    1. "1.0" encoding="UTF-8" ?>
    2. "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. kissship 1.1 core library
    7. kissship core
    8. 1.1
    9. <short-name>kissshipshort-name>
    10. http://jsp.veryedu.cn
    11. page
    12. com.Kissship.tag.PageTag
    13. JSP
    14. pageBean
    15. true
    16. true

    2.4.9 编写controller类

    MusicController:

    1. package com.Kissship.web;
    2. import com.Kissship.biz.MusicBiz;
    3. import com.Kissship.model.Music;
    4. import com.Kissship.utils.PageBean;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Controller;
    7. import org.springframework.ui.Model;
    8. import org.springframework.web.bind.annotation.PathVariable;
    9. import org.springframework.web.bind.annotation.RequestMapping;
    10. import javax.servlet.http.HttpServletRequest;
    11. import java.util.List;
    12. /**
    13. * @author Kissship
    14. * @site www.Kissship.com
    15. * @company xxx公司
    16. * @create 2023-09-08-15:15
    17. */
    18. @Controller
    19. @RequestMapping("/mic")
    20. public class MusicController {
    21. @Autowired
    22. private MusicBiz musicBiz;
    23. // 增
    24. @RequestMapping("/add")
    25. public String add(Music music, HttpServletRequest Request) {
    26. int i = musicBiz.insertSelective(music);
    27. return "redirect:list";
    28. }
    29. // 删
    30. @RequestMapping("/del/{bid}")
    31. public String del(@PathVariable("bid")Integer bid) {
    32. musicBiz.deleteByPrimaryKey(bid);
    33. return "redirect:/mic/list";
    34. }
    35. // 改
    36. @RequestMapping("/edit")
    37. public String edit(Music music, HttpServletRequest Request) {
    38. musicBiz.updateByPrimaryKeySelective(music);
    39. return "redirect:list";
    40. }
    41. // 查
    42. @RequestMapping("/list")
    43. public String list(Music music, HttpServletRequest Request) {
    44. //music是用来接受前台传递后台的参数
    45. PageBean pageBean = new PageBean();
    46. pageBean.setRequest(Request);
    47. List music1 = musicBiz.listPager(music, pageBean);
    48. Request.setAttribute("lst", music1);
    49. Request.setAttribute("pageBean", pageBean);
    50. //WEB-INF/jsp/mic/list.jsp
    51. return "mic/list";
    52. }
    53. //数据回显
    54. @RequestMapping("/preSave")
    55. public String preSave(Music music, Model model) {
    56. if (music != null && music.getMid() != null && music.getMid() != 0) {
    57. Music m = musicBiz.selectByPrimaryKey(music.getMid());
    58. model.addAttribute("c",m);
    59. }
    60. return "mic/edit";
    61. }
    62. }

    到此我们的后台代码编写完成了,接下来就是前端代码的编写。 

    2.5 前台代码

    2.5.1 主页面编写

    作用:展示数据进行一系列操作。

    list.jsp:

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
    4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    5. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    6. <html>
    7. <head>
    8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    9. <link
    10. href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
    11. rel="stylesheet">
    12. <script
    13. src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js">script>
    14. <title>JayChou歌单列表title>
    15. <style type="text/css">
    16. .page-item input {
    17. padding: 0;
    18. width: 40px;
    19. height: 100%;
    20. text-align: center;
    21. margin: 0 6px;
    22. }
    23. .page-item input, .page-item b {
    24. line-height: 38px;
    25. float: left;
    26. font-weight: 400;
    27. }
    28. .page-item.go-input {
    29. margin: 0 10px;
    30. }
    31. style>
    32. head>
    33. <body>
    34. <form class="form-inline"
    35. action="${pageContext.request.contextPath }/mic/list" method="post">
    36. <div class="form-group mb-2">
    37. <input type="text" class="form-control-plaintext" name="mname"
    38. placeholder="请输入歌曲名称">
    39. <%-- <input name="pagination" value="false" type="hidden">--%>
    40. div>
    41. <button type="submit" class="btn btn-primary mb-2">查询button>
    42. <a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/mic/preSave">新增a>
    43. form>
    44. <table class="table table-striped">
    45. <thead>
    46. <tr>
    47. <th scope="col">歌曲编号th>
    48. <th scope="col">歌曲名称th>
    49. <th scope="col">歌曲专辑th>
    50. <th scope="col">歌曲歌词th>
    51. <th scope="col">歌曲图片th>
    52. tr>
    53. thead>
    54. <tbody>
    55. <c:forEach var="b" items="${lst }">
    56. <tr>
    57. <td>${b.mid }td>
    58. <td>${b.mname }td>
    59. <td>${b.mtype }td>
    60. <td>${b.minfo }td>
    61. <td>${b.mpic }td>
    62. <td>
    63. <a href="${pageContext.request.contextPath }/mic/preSave?mid=${b.mid}">修改a>
    64. <a href="${pageContext.request.contextPath }/mic/del/${b.mid}">删除a>
    65. td>
    66. tr>
    67. c:forEach>
    68. tbody>
    69. table>
    70. <z:page pageBean="${pageBean }">z:page>
    71. ${pageBean }
    72. body>
    73. html>

     2.5.2 修改界面编写

    作用:操作数据。

    edit.jsp:

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>编辑歌单界面title>
    5. head>
    6. <body>
    7. <form action="${pageContext.request.contextPath }/${empty c ? 'mic/add' : 'mic/edit'}" method="post">
    8. 歌曲编号:<input type="text" name="mid" value="${c.mid }"><br>
    9. 歌曲名称:<input type="text" name="mname" value="${c.mname }"><br>
    10. 歌曲专辑:<input type="text" name="mtype" value="${c.mtype }"><br>
    11. 歌曲歌词:<input type="text" name="minfo" value="${c.minfo }"><br>
    12. 歌曲图片:<input type="text" name="mpic" value="${c.mpic }"><br>
    13. <input type="submit">
    14. form>
    15. body>
    16. html>

    三、展示效果

    控制台效果:

     主页增删改查展示效果:

    四、实战SpringMVC增删改查的收获

    1. 熟悉SpringMVC框架:通过实践,可以更深入地理解SpringMVC框架的工作原理和核心概念,如控制器、视图解析器、数据绑定等。

    2. 掌握请求处理和数据交互:实践中的增删改查操作涉及到请求处理和数据库数据交互,可以加深对请求的处理方式和数据库操作的理解。

    3. 强化编程技能:实战中需要编写具体的代码实现增删改查功能,可以提高编程能力,尤其是对Java和SpringMVC的理解和熟练度。

    4. 学习最佳实践:通过实践,可以学习到SpringMVC增删改查的最佳实践,包括使用合适的设计模式、优化数据库查询性能、错误处理等方面的经验。

    5. 增加项目经验:实战增删改查可以让您在实际项目中积累经验,对项目的整体流程和开发周期有更深入的认识。

    6. 提升自信心:通过实际操作和实践,可以提高对SpringMVC增删改查功能的自信心,为日后更复杂的项目开发打下基础。

    请注意,SpringMVC是一个开源框架,通过参与实战项目可以更好地理解和应用它。同时,实践中也会遇到挑战和问题,但通过解决问题和学习,可以不断进步和成长。


    最后实战SpringMVC之CRUD就到这里,祝大家在敲代码的路上一路通畅!

    感谢大家的观看 !

  • 相关阅读:
    Python 树表查找_千树万树梨花开,忽如一夜春风来(二叉排序树、平衡二叉树)
    MySQL安装及应用合集(5):如何优雅地写MySQL
    ubuntu下查看realsense摄像头查看支持的分辨率和频率
    全真模拟题!PMP提分必练
    一文读懂Casper区块链上的NFT
    免实名域名是什么意思?
    【首阳首板之主升三域洗盘域】洞察洗盘突破典型形态,心中不慌
    内部类及Lambda表达式
    Linux用户管理
    江西广电会展集团总经理李悦一行莅临拓世科技集团调研参观,科技璀璨AIGC掀新潮
  • 原文地址:https://blog.csdn.net/weixin_74263417/article/details/132763882