• SpringMVC实战crud增删改查


    前言

    Spring MVC(Model-View-Controller)是一个基于Java的Web应用程序框架,用于构建Web应用程序。它是Spring框架的一部分,提供了一种组织和开发Web应用程序的方式,将应用程序分为模型、视图和控制器三个部分,以实现松散耦合和分层架构。

    以下是关于Spring MVC的一些重要概念和特点:

    1. 模型(Model):模型代表应用程序的业务逻辑和数据。通常,模型对象包含应用程序的数据,以及对这些数据的操作方法。在Spring MVC中,模型通常由POJO(Plain Old Java Object)表示。

    2. 视图(View):视图负责呈现模型数据给用户。视图通常是模板文件(例如JSP、Thymeleaf、FreeMarker等),可以将模型数据渲染成HTML,然后返回给客户端浏览器显示。

    3. 控制器(Controller):控制器是处理HTTP请求的组件。它接收客户端请求,决定如何处理请求,并将请求委托给适当的服务方法。Spring MVC的控制器通常是基于注解的Java类。

    4. 前端控制器(Front Controller):Spring MVC框架的核心部分是前端控制器(DispatcherServlet),它是一个Servlet,用于接收所有进入应用程序的HTTP请求,并将请求分派给适当的处理程序。

    5. 请求映射(Request Mapping):Spring MVC通过注解或配置文件来映射HTTP请求到特定的控制器方法。请求映射定义了哪个控制器方法将处理特定URL的请求。

    6. 视图解析器(View Resolver):视图解析器用于将控制器返回的逻辑视图名称解析为实际的视图。它可以将逻辑视图名称映射到具体的视图模板文件。

    7. 模型和视图之间的通信:控制器方法可以将模型数据存储在Model对象中,并将视图名称返回给前端控制器。前端控制器会将模型数据传递给适当的视图模板,以便渲染页面。

    8. 拦截器(Interceptors):拦截器允许您在请求进入控制器之前或之后执行自定义逻辑。它们可以用于实现日志记录、安全性检查、权限验证等功能。

    9. 表单处理:Spring MVC提供了强大的表单处理功能,可以轻松地处理表单提交、数据绑定、验证和错误处理。

    10. RESTful支持:Spring MVC支持构建RESTful Web服务,可以使用注解来定义REST端点,支持HTTP方法如GET、POST、PUT和DELETE。

    11. 国际化支持:Spring MVC支持多语言和国际化,使您能够轻松地本地化您的应用程序。

    12. 异常处理:Spring MVC提供了强大的异常处理机制,允许您定义全局异常处理器,以捕获和处理应用程序中的异常

    一.公共页面的跳转

    1.编写页面跳转控制类

    1. package com.YU.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 YU
    7. * @create 2023-09-07 14:41
    8. */
    9. @Controller
    10. public class PageController {
    11. @RequestMapping("/page/{page}")
    12. public String toPage(@PathVariable("page") String page){
    13. return page;
    14. }
    15. @RequestMapping("/page/{dir}{page}")
    16. public String toDirPage(
    17. @PathVariable("dir") String dir,
    18. @PathVariable("page") String page){
    19. return dir + "/" + page;
    20. }
    21. }

     二.后端实现crud

    1.利用mybatis插件生成实体模型和mapper接口和xml文件

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

    2.编写切面类和工具类

    2.1切面类:

    1. package com.YU.aspect;
    2. import com.YU.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. /**
    11. * @author YU
    12. * @create 2023-08-25 17:17
    13. */
    14. @Aspect //代表当前类为切面类
    15. @Component //代表当前类交给Spring进行管理
    16. public class PagerAspect {
    17. @Around("execution(* *..*biz.*Pager(..))")
    18. public Object invoke(ProceedingJoinPoint args) throws Throwable {
    19. PageBean pageBean = null;
    20. //获取目标方法的所有参数
    21. Object[] ars = args.getArgs();
    22. for (Object param : ars) {
    23. if(param instanceof PageBean){
    24. pageBean = (PageBean)param;
    25. break;
    26. }
    27. }
    28. if(pageBean != null && pageBean.isPagination())
    29. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    30. Object list = args.proceed();
    31. if(null != pageBean && pageBean.isPagination()){
    32. PageInfo pageInfo = new PageInfo((List) list);
    33. pageBean.setTotal((int) pageInfo.getTotal());
    34. }
    35. return list;
    36. }
    37. }

    2.2 工具类

    1. package com.YU.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. }

    3.编写biz层

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

    注: 

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

    4.配置mapper.xml

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

    5.编写相应的接口类(HBookMapper) 

        List selectBycon(HBook hBook);

     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 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
    9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    10. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    11. <context:component-scan base-package="com.YU"/>
    12. <mvc:annotation-driven />
    13. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    14. <property name="viewClass"
    15. value="org.springframework.web.servlet.view.JstlView">property>
    16. <property name="prefix" value="/WEB-INF/jsp/"/>
    17. <property name="suffix" value=".jsp"/>
    18. bean>
    19. <aop:aspectj-autoproxy/>
    20. beans>

    7.编写tag助手标签类

    1. package com.YU.tag;
    2. import java.io.IOException;
    3. import java.util.Map;
    4. import java.util.Map.Entry;
    5. import java.util.Set;
    6. import javax.servlet.jsp.JspException;
    7. import javax.servlet.jsp.JspWriter;
    8. import javax.servlet.jsp.tagext.BodyTagSupport;
    9. import com.YU.utils.PageBean;
    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();
  • }
  • }
  •  8.引入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>YU 1.1 core librarydescription>
    7. <display-name>YU coredisplay-name>
    8. <tlib-version>1.1tlib-version>
    9. <short-name>YUshort-name>
    10. <uri>http://jsp.veryedu.cnuri>
    11. <tag>
    12. <name>pagename>
    13. <tag-class>com.YU.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>

    9.编写controller类

    1. package com.YU.web;
    2. import com.YU.biz.HBookbiz;
    3. import com.YU.model.HBook;
    4. import com.YU.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 YU
    14. * @create 2023-09-07 16:07
    15. */
    16. @Controller
    17. @RequestMapping("book")
    18. public class HbookController {
    19. @Autowired
    20. private HBookbiz hBookbiz;
    21. //增加
    22. @RequestMapping("/add")
    23. public String add(HBook hBook){
    24. hBookbiz.insertSelective(hBook);
    25. return "redirect:/book/list";
    26. }
    27. //删除
    28. @RequestMapping("/del/{bid}")
    29. public String del(@PathVariable("bid")Integer bid){
    30. hBookbiz.deleteByPrimaryKey(bid);
    31. return "redirect:/book/list";
    32. }
    33. //修改
    34. @RequestMapping("/edit")
    35. public String edit(HBook hBook){
    36. hBookbiz.updateByPrimaryKeySelective(hBook);
    37. return "redirect:list";
    38. }
    39. //查询
    40. @RequestMapping("/list")
    41. public String list(HBook hBook, HttpServletRequest request){
    42. // hbook用来接收前台传递后台的参数
    43. PageBean pageBean = new PageBean();
    44. pageBean.setRequest(request);
    45. List hBooks = hBookbiz.listPager(hBook, pageBean);
    46. request.setAttribute("lst",hBooks);
    47. request.setAttribute("pageBean",pageBean);
    48. return "book/list";
    49. }
    50. //数据回显
    51. @RequestMapping("/preSave")
    52. public String preSave(HBook hBook, Model model){
    53. if(hBook !=null && hBook.getBid()!=null && hBook.getBid()!=0){
    54. HBook b = hBookbiz.selectByPrimaryKey(hBook.getBid());
    55. model.addAttribute("b",b);
    56. }
    57. return "book/edit";
    58. }
    59. }

    10.编写前端页面

    1.主页面(展示数据进行操作)

    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>
    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>博客列表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 }/book/list" method="get">
    36. <div class="form-group mb-2">
    37. <input type="text" class="form-control-plaintext" name="cname"
    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 }/book/preSave">新增a>
    43. form>
    44. <table class="table table-striped">
    45. <thead>
    46. <tr>
    47. <th scope="col">书籍IDth>
    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.bid }td>
    58. <td>${b.bname }td>
    59. <td>${b.price }td>
    60. <td>
    61. <a href="${pageContext.request.contextPath }/book/preSave?bid=${b.bid}">修改a>
    62. <a href="${pageContext.request.contextPath }/book/del/${b.bid}">删除a>
    63. td>
    64. tr>
    65. c:forEach>
    66. tbody>
    67. table>
    68. <z:page pageBean="${pageBean }">z:page>
    69. ${pageBean }
    70. body>
    71. html>

    2.增加修改界面(操作数据)

    1. <body>
    2. <form action="${pageContext.request.contextPath }/${empty b ? 'book/add' : 'book/edit'}" method="post">
    3. cid:<input type="text" name="bid" value="${b.bid }"><br>
    4. bname:<input type="text" name="bname" value="${b.bname }"><br>
    5. price:<input type="text" name="price" value="${b.price }"><br>
    6. <input type="submit">
    7. form>
    8. body>

    3.测试结果

    感谢各位大大的收看,各位的支持和三连是博主更新的动力,感谢谢谢谢!!!!

  • 相关阅读:
    Redis
    【Android 逆向】ART 函数抽取加壳 ③ ( 禁用 dex2oat 操作 HOOK 点介绍 | 集成 InLineHook )
    javax.net.ssl.SSLHandshakeException: No appropriate protocol
    IDEA
    PDF文件怎么合并在一起?这三种方法快利用起来
    【css面试题】 实现一个盒子的水平竖直居中对齐效果
    【OpenCV(3)】linux arm aarch 是 opencv 交叉编译与使用
    彻底搞懂Mybatis
    SpringEL:SpEL表达式文本转译
    FANUC机器人_KAREL编程入门(2)_通用IO信号的使用方法
  • 原文地址:https://blog.csdn.net/weixin_73320743/article/details/132738000