• 【SpringMVC】RESTful风格CRUD实现


    目录

    一、REST简介

    1.1 什么是REST?

    1.2 REST风格的优点

    1.3 请求方式

     

    二、构建项目

    ⭐思路分析

    2.1 环境准备

    2.1.1 导入相关pom依赖

    2.1.2 jdbc.properties:配置文件

    2.1.3 配置代码生成器 generatorConfig.xml

    2.1.4 spring与mybatis整合的配置文件 spring-mybatis.xml  

    2.1.5 spring-context.xml 上下文配置文件  

    2.1.6 spring-mvc-xml: 配置Spring框架的一些关键组件和功能

    2.1.7 配置 web.xml

    2.2 逆向生产代码

    2.2.1 分页功能 

    2.2.2 项目结构

     

    三、增删改查实现

    3.1 后端编写

    3.2 前端编写

    3.3 运行测试


    一、REST简介

    1.1 什么是REST?

            REST(Representational State Transfer),意思:表述性状态转换,它是一种软件架构风格(描述了一个架构样式的网络系统,比如web应用)。

    当我们想表示一个网络资源的时候,可以使用两种方式:

    传统风格资源描述形式:        

    • http://localhost80/user/getById?id=1 查询id为1的用户信息
    • http://localhost80/user/saveUser 保存用户信息

    REST风格描述形式:

    • http://localhost80/user/1 查询id为1的用户
    • http://localhost80/user 查询所有用户

    1.2 REST风格的优点

    • 传统方式

            一般是一个请求url对应一种操作,这样做不仅麻烦,也不安全,因为会程序的人读取了你的请求url地址,就大概知道该url实现的是一个什么样的操作。

    • REST风格:

            隐藏资源的访问行为,无法通过地址得知对资源是何种操作;查看REST风格的描述,你会发现请求地址变的简单了;REST提供了对应的架构方式,按照这种架构设计项目可以降低开发的复杂性,提高系统的可伸缩性。

    1.3 请求方式

            请求的方式比较多,但是比较常用的就4种,分别是GET,POST,PUT,DELETE。按照不同的请求方式代表不同的操作类型:

    1. 发送GET请求是用来做查询
    2. 发送POST请求是用来做新增
    3. 发送PUT请求是用来做修改
    4. 发送DELETE请求是用来做删除

    按照REST风格访问资源时使用行为动作区分对资源进行操作的示例:

    • http://localhost80/users 查询全部用户信息 GET(查询)
    • http://localhost80/users/1 查询指定用户信息 GET(查询)
    • http://localhost80/users 添加用户信息 POST(新增/保存)
    • http://localhost80/users 修改用户信息 PUT(修改/更新)
    • http://localhost80/users/1 删除用户信息 DELETE(删除)


    注意:

    • 上述行为只是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范。
    • REST中规定GET/POST/PUT/DELETE针对的是查询/新增/修改/删除,但是我们如果非要用GET请求做删除,这点在程序上运行是可以实现的。


    清楚了什么是REST风格后,我们后期会经常提到一个概念叫RESTful,那什么又是RESTful呢?

            根据REST风格对资源进行访问称为RESTful。后期我们在进行开发的过程中,大多是都是遵从REST风格来访问我们的后台服务,所以可以说以后都是基于RESTful来进行开发的。

    二、构建项目

    ⭐思路分析

    1. 搭建环境,导入项目所需的pom.xml依赖。
    2. 逆向生层对应的类(model、mapper.xml、mapper.java)
    3. 编写业务逻辑层
    4. 编写web层(控制器)
    5. 前端页面

    2.1 环境准备

    2.1.1 导入相关pom依赖

    1. "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    3. 4.0.0
    4. org.example
    5. ycxw_zyssm
    6. war
    7. 1.0-SNAPSHOT
    8. ycxw_zyssm Maven Webapp
    9. http://maven.apache.org
    10. UTF-8
    11. 1.8
    12. 1.8
    13. 3.7.0
    14. 5.0.2.RELEASE
    15. 3.4.5
    16. 5.1.44
    17. 5.1.2
    18. 1.3.1
    19. 2.1.1
    20. 2.4.3
    21. 2.9.1
    22. 3.2.0
    23. 1.7.13
    24. 4.12
    25. 4.0.0
    26. 1.18.2
    27. 1.1.0
    28. 2.10.0
    29. 2.9.0
    30. 1.7.1.RELEASE
    31. 2.9.3
    32. 1.2
    33. 1.1.2
    34. 8.0.47
    35. 1.3.3
    36. 5.0.2.Final
    37. 1.3.2
    38. org.springframework
    39. spring-core
    40. ${spring.version}
    41. org.springframework
    42. spring-beans
    43. ${spring.version}
    44. org.springframework
    45. spring-context
    46. ${spring.version}
    47. org.springframework
    48. spring-orm
    49. ${spring.version}
    50. org.springframework
    51. spring-tx
    52. ${spring.version}
    53. org.springframework
    54. spring-aspects
    55. ${spring.version}
    56. org.springframework
    57. spring-web
    58. ${spring.version}
    59. org.springframework
    60. spring-test
    61. ${spring.version}
    62. org.mybatis
    63. mybatis
    64. ${mybatis.version}
    65. mysql
    66. mysql-connector-java
    67. ${mysql.version}
    68. com.github.pagehelper
    69. pagehelper
    70. ${pagehelper.version}
    71. org.mybatis
    72. mybatis-spring
    73. ${mybatis.spring.version}
    74. org.springframework
    75. spring-context-support
    76. ${spring.version}
    77. org.mybatis.caches
    78. mybatis-ehcache
    79. ${mybatis.ehcache.version}
    80. net.sf.ehcache
    81. ehcache
    82. ${ehcache.version}
    83. redis.clients
    84. jedis
    85. ${redis.version}
    86. org.springframework.data
    87. spring-data-redis
    88. ${redis.spring.version}
    89. com.fasterxml.jackson.core
    90. jackson-databind
    91. ${jackson.version}
    92. com.fasterxml.jackson.core
    93. jackson-core
    94. ${jackson.version}
    95. com.fasterxml.jackson.core
    96. jackson-annotations
    97. ${jackson.version}
    98. org.apache.commons
    99. commons-dbcp2
    100. ${commons.dbcp2.version}
    101. commons-pool2
    102. org.apache.commons
    103. org.apache.commons
    104. commons-pool2
    105. ${commons.pool2.version}
    106. org.springframework
    107. spring-webmvc
    108. ${spring.version}
    109. org.slf4j
    110. slf4j-api
    111. ${slf4j.version}
    112. org.slf4j
    113. jcl-over-slf4j
    114. ${slf4j.version}
    115. runtime
    116. org.apache.logging.log4j
    117. log4j-api
    118. ${log4j2.version}
    119. org.apache.logging.log4j
    120. log4j-core
    121. ${log4j2.version}
    122. org.apache.logging.log4j
    123. log4j-slf4j-impl
    124. ${log4j2.version}
    125. org.apache.logging.log4j
    126. log4j-web
    127. ${log4j2.version}
    128. runtime
    129. com.lmax
    130. disruptor
    131. ${log4j2.disruptor.version}
    132. junit
    133. junit
    134. ${junit.version}
    135. test
    136. javax.servlet
    137. javax.servlet-api
    138. ${servlet.version}
    139. provided
    140. org.projectlombok
    141. lombok
    142. ${lombok.version}
    143. provided
    144. jstl
    145. jstl
    146. ${jstl.version}
    147. taglibs
    148. standard
    149. ${standard.version}
    150. org.apache.tomcat
    151. tomcat-jsp-api
    152. ${tomcat-jsp-api.version}
    153. commons-fileupload
    154. commons-fileupload
    155. ${commons-fileupload.version}
    156. org.hibernate
    157. hibernate-validator
    158. ${hibernate-validator.version}
    159. org.apache.shiro
    160. shiro-core
    161. ${shiro.version}
    162. org.apache.shiro
    163. shiro-web
    164. ${shiro.version}
    165. org.apache.shiro
    166. shiro-spring
    167. ${shiro.version}
    168. ycxw_zyssm
    169. src/main/java
    170. **/*.xml
    171. src/main/resources
    172. jdbc.properties
    173. *.xml
    174. org.apache.maven.plugins
    175. maven-compiler-plugin
    176. ${maven.compiler.plugin.version}
    177. ${maven.compiler.source}
    178. ${maven.compiler.target}
    179. ${project.build.sourceEncoding}
    180. org.mybatis.generator
    181. mybatis-generator-maven-plugin
    182. 1.3.2
    183. mysql
    184. mysql-connector-java
    185. ${mysql.version}
    186. true

    2.1.2 jdbc.properties:配置文件

    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
    3. jdbc.username=root
    4. jdbc.password=123456

    2.1.3 配置代码生成器 generatorConfig.xml

    1. "1.0" encoding="UTF-8" ?>
    2. "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    4. "jdbc.properties"/>
    5. "D:\\Tools\\MavenHouse\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    6. "infoGuardian">
    7. "suppressAllComments" value="true"/>
    8. "suppressDate" value="true"/>
    9. "${jdbc.driver}"
    10. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}">
    11. "forceBigDecimals" value="false"/>
    12. "com.ycxw.model"
    13. targetProject="src/main/java">
    14. "enableSubPackages" value="false"/>
    15. "constructorBased" value="true"/>
    16. "trimStrings" value="false"/>
    17. "immutable" value="false"/>
    18. "com.ycxw.mapper"
    19. targetProject="src/main/java">
    20. "enableSubPackages" value="false"/>
    21. "com.ycxw.mapper"
    22. targetProject="src/main/java" type="XMLMAPPER">
    23. "enableSubPackages" value="false"/>
    24. "" tableName="t_oa_user" domainObjectName="User"
    25. enableCountByExample="false" enableDeleteByExample="false"
    26. enableSelectByExample="false" enableUpdateByExample="false">

    2.1.4 spring与mybatis整合的配置文件 spring-mybatis.xml  

    1. "1.0" encoding="UTF-8"?>
    2. "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. package="com.ycxw"/>
    8. "classpath:jdbc.properties"/>
    9. "dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    10. destroy-method="close">
    11. "driverClassName" value="${jdbc.driver}"/>
    12. "url" value="${jdbc.url}"/>
    13. "username" value="${jdbc.username}"/>
    14. "password" value="${jdbc.password}"/>
    15. "initialSize" value="10"/>
    16. "maxTotal" value="100"/>
    17. "maxIdle" value="50"/>
    18. "minIdle" value="10"/>
    19. "maxWaitMillis" value="-1"/>
    20. "sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    21. "dataSource" ref="dataSource"/>
    22. "mapperLocations" value="classpath*:com/ycxw/**/mapper/*.xml"/>
    23. "typeAliasesPackage" value="com/ycxw/**/model"/>
    24. "plugins">
    25. "com.github.pagehelper.PageInterceptor">
    26. "properties">
    27. helperDialect=mysql
    28. "/>
    29. " value="sqlSessionFactory"/>
    30. " class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    31. " ref="dataSource" />
    32. " />

    2.1.5 spring-context.xml 上下文配置文件  

    1. "1.0" encoding="UTF-8"?>
    2. "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="spring-mybatis.xml">import>

    2.1.6 spring-mvc-xml: 配置Spring框架的一些关键组件和功能

    1. "1.0" encoding="UTF-8"?>
    2. "http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:context="http://www.springframework.org/schema/context"
    4. xmlns:mvc="http://www.springframework.org/schema/mvc"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns="http://www.springframework.org/schema/beans"
    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
    9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    10. package="com.ycxw"/>
    11. "org.springframework.web.servlet.view.InternalResourceViewResolver">
    12. "viewClass"
    13. value="org.springframework.web.servlet.view.JstlView">
    14. "prefix" value="/WEB-INF/jsp/"/>
    15. "suffix" value=".jsp"/>

    2.1.7 配置 web.xml

    1. "1.0" encoding="UTF-8"?>
    2. "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. Archetype Created Web Application
    7. contextConfigLocation
    8. classpath:spring-context.xml
    9. org.springframework.web.context.ContextLoaderListener
    10. encodingFilter
    11. org.springframework.web.filter.CharacterEncodingFilter
    12. true
    13. encoding
    14. UTF-8
    15. encodingFilter
    16. /*
    17. SpringMVC
    18. org.springframework.web.servlet.DispatcherServlet
    19. contextConfigLocation
    20. classpath:spring-mvc.xml
    21. 1
    22. true
    23. SpringMVC
    24. /

    2.2 逆向生产代码

    在这之前先展示一下本次用到的数据表:

    2.2.1 分页功能 

    本次需要使用分页功能,所以需要添加分页工具类:

    1. PageBean,java:

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

    2. PageTag.java

    1. package com.ycxw.tag;
    2. import com.ycxw.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();
  • }
  • }
  • 3. ycxw.tld

    1. "1.0" encoding="UTF-8" ?>
    2. "http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns="http://java.sun.com/xml/ns/j2ee"
    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. ycxw 1.1 core library
    7. ycxw core
    8. 1.1
    9. <short-name>ycxwshort-name>
    10. http://jsp.veryedu.cn
    11. page
    12. com.ycxw.tag.PageTag
    13. JSP
    14. pageBean
    15. true
    16. true

    2.2.2 项目结构

    最终的项目结构如下:

    三、增删改查实现

    3.1 后端编写

    1. 在UserMapper.xml新建一条查询sql

    2. 编写UserMapper接口方法

    List listPager(User user);

    3. 编写业务逻辑层接口

    1. package com.ycxw.biz;
    2. import com.ycxw.model.User;
    3. import com.ycxw.utils.PageBean;
    4. import java.util.List;
    5. public interface UserBiz {
    6. int deleteByPrimaryKey(Long id);
    7. int insert(User record);
    8. int insertSelective(User record);
    9. User selectByPrimaryKey(Long id);
    10. int updateByPrimaryKeySelective(User record);
    11. int updateByPrimaryKey(User record);
    12. List listPager(User user, PageBean page);
    13. }

    4. 实现接口

    1. package com.ycxw.biz.impl;
    2. import com.ycxw.biz.UserBiz;
    3. import com.ycxw.mapper.UserMapper;
    4. import com.ycxw.model.User;
    5. import com.ycxw.utils.PageBean;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. import java.util.List;
    9. /**
    10. * @author 云村小威
    11. * @site blog.csdn.net/Justw320
    12. * @create 2023-09-08 11:44
    13. */
    14. @Service
    15. public class UserBizImpl implements UserBiz {
    16. @Autowired
    17. private UserMapper userMapper;
    18. @Override
    19. public int deleteByPrimaryKey(Long id) {
    20. return userMapper.deleteByPrimaryKey(id);
    21. }
    22. @Override
    23. public int insert(User record) {
    24. return userMapper.insert(record);
    25. }
    26. @Override
    27. public int insertSelective(User record) {
    28. return userMapper.insertSelective(record);
    29. }
    30. @Override
    31. public User selectByPrimaryKey(Long id) {
    32. return userMapper.selectByPrimaryKey(id);
    33. }
    34. @Override
    35. public int updateByPrimaryKeySelective(User record) {
    36. return userMapper.updateByPrimaryKeySelective(record);
    37. }
    38. @Override
    39. public int updateByPrimaryKey(User record) {
    40. return userMapper.updateByPrimaryKey(record);
    41. }
    42. @Override
    43. public List listPager(User user, PageBean page) {
    44. return userMapper.listPager(user);
    45. }
    46. }

    5. 编写切面,如果需要分页则需进行代码,在spring-mvc-xml文件中已经配置了aop代理,如果注释掉将不会进行分页。

    1. package com.ycxw.aspect;
    2. import com.github.pagehelper.PageHelper;
    3. import com.github.pagehelper.PageInfo;
    4. import com.ycxw.utils.PageBean;
    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. /**
    11. * @author 云村小威
    12. * @site blog.csdn.net/Justw320
    13. * @create 2023-09-08 1:30
    14. */
    15. @Aspect //代表当前为切面类
    16. @Component //代表当前类交给spring进行管理
    17. public class PageAspect {
    18. @Around("execution(* *..*Biz.*Pager(..))")
    19. public Object invoke(ProceedingJoinPoint args) throws Throwable {
    20. PageBean pageBean = null;
    21. //获取目标方法的所有参数
    22. Object[] args1 = args.getArgs();
    23. for (Object param:args1) {
    24. if (param instanceof PageBean){
    25. pageBean = (PageBean) param;
    26. break;
    27. }
    28. }
    29. if(pageBean!=null && pageBean.isPagination())
    30. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    31. //执行目标方法
    32. Object proceed = args.proceed();
    33. if(pageBean!=null && pageBean.isPagination()){
    34. PageInfo info = new PageInfo((List) proceed);
    35. pageBean.setTotal((int) info.getTotal());
    36. }
    37. return proceed;
    38. }
    39. }

    6. 编写web层控制器

    1. package com.ycxw.web;
    2. import com.ycxw.biz.UserBiz;
    3. import com.ycxw.model.User;
    4. import com.ycxw.utils.PageBean;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Controller;
    7. import org.springframework.web.bind.annotation.GetMapping;
    8. import org.springframework.web.bind.annotation.PathVariable;
    9. import org.springframework.web.bind.annotation.RequestMapping;
    10. import org.springframework.web.servlet.ModelAndView;
    11. import javax.servlet.http.HttpServletRequest;
    12. import java.util.List;
    13. /**
    14. * @author 云村小威
    15. * @site blog.csdn.net/Justw320
    16. * @create 2023-09-08 11:56
    17. */
    18. @Controller
    19. @RequestMapping("/users")
    20. public class UserController {
    21. @Autowired
    22. private UserBiz userBiz;
    23. /*新增方法*/
    24. @RequestMapping("/add")
    25. public String save(User user, HttpServletRequest request) {
    26. userBiz.insertSelective(user);
    27. return "redirect:list";
    28. }
    29. /*删除方法*/
    30. @RequestMapping("/del/{id}")
    31. public String del(@PathVariable("id") Long id, HttpServletRequest request) {
    32. userBiz.deleteByPrimaryKey(id);
    33. return "redirect:/users/list";
    34. }
    35. /*修改方法*/
    36. @RequestMapping("/edit")
    37. public String edit(User user, HttpServletRequest request) {
    38. userBiz.updateByPrimaryKeySelective(user);
    39. return "redirect:list";
    40. }
    41. /*查询方法*/
    42. @GetMapping("/list")
    43. public ModelAndView list(User user, HttpServletRequest request) {
    44. PageBean pageBean = new PageBean();
    45. pageBean.setRequest(request);
    46. List users = userBiz.listPager(user, pageBean);
    47. ModelAndView modelAndView = new ModelAndView();
    48. modelAndView.addObject("users", users);
    49. modelAndView.addObject("pageBean", pageBean);
    50. modelAndView.setViewName("user/list");
    51. return modelAndView;
    52. }
    53. /*数据回显*/
    54. @RequestMapping("/preSave")
    55. public String preSave(User user, HttpServletRequest request) {
    56. if (user != null && user.getId() != null && user.getId() != 0) {
    57. User u = userBiz.selectByPrimaryKey(user.getId());
    58. request.setAttribute("u", u);
    59. }
    60. return "user/edit";
    61. }
    62. }

    3.2 前端编写

    目录结构:

    1. list.jsp :这里简单的用了bootstrap框架搭建的页面,并且是网络资源路径,联网即可用。

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    3. <%@ taglib prefix="z" uri="http://jsp.veryedu.cn" %>
    4. "Content-Type" content="text/html; charset=UTF-8">
    5. href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
    6. rel="stylesheet">
    7. src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js">
    8. "${pageContext.request.contextPath }">
    9. 博客列表
    10. "form-inline"
    11. action="/users/list" method="post">
    12. "form-group mb-2">
    13. "text" class="form-control-plaintext" name="name"
    14. placeholder="请输入用户名称">
    15. <%--"pagination" value="false" type="hidden">--%>
    16. "table table-striped">
    17. var="u" items="${users }">
    18. "col">用户ID"col">用户名"col">账号"col">密码"col">权限
      ${u.id }${u.name }${u.loginname }${u.pwd }${u.rid }
    19. "${pageBean }">

     

    2. edit.jsp : 新增、修改公共界面

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. 用户编辑、新增公共页面
    3. "${pageContext.request.contextPath }/${empty u ? 'users/add' : 'users/edit'}" method="post">
    4. 用户id:"text" name="id" value="${u.id }">
    5. 用户名:"text" name="name" value="${u.name }">
    6. 账号:"text" name="loginname" value="${u.loginname }">
    7. 密码:"text" name="pwd" value="${u.pwd }">
    8. 权限:"text" name="rid" value="${u.rid }">
    9. "submit">

    3.3 运行测试

    1. 所有数据测试: 

     

    2. 查询测试

    3. 新增测试

     

    4. 修改测试

    5. 删除测试

     

  • 相关阅读:
    http库requests
    python机器人编程——差速机器人小车的控制,控制模型、轨迹跟踪,轨迹规划、自动泊车(上)
    2022-08-24 AndroidR 实现长按按键打开一个app或者打开app的某个界面
    词嵌入(Word2Vec)
    计算机专业毕业设计项目推荐14-文档编辑平台(SpringBoot+Vue+Mysql)
    Redis键值存储数据库(高性能缓存库)
    区块链的使用场景和优势
    23.2、Android -- OkHttp3 基础学习 自定义设置
    build和compile
    音视频技术开发周刊 | 316
  • 原文地址:https://blog.csdn.net/Justw320/article/details/132740754