• SpringMVC之前端增删改查实现


    SpringMVC是一个基于MVC架构的框架,它可以帮助我们实现前后端的分离,同时也能很好地支持前端的增删改查操作。

    配置

    Cloudjun
    1. <?xml version="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>CloudJun 1.1 core library</description>
    7. <display-name>CloudJun core</display-name>
    8. <tlib-version>1.1</tlib-version>
    9. <short-name>CloudJun</short-name>
    10. <uri>http://jsp.veryedu.cn</uri>
    11. <tag>
    12. <name>page</name>
    13. <tag-class>com.CloudJun.tag.PageTag</tag-class>
    14. <body-content>JSP</body-content>
    15. <attribute>
    16. <name>pageBean</name>
    17. <required>true</required>
    18. <rtexprvalue>true</rtexprvalue>
    19. </attribute>
    20. </tag>
    21. </taglib>
    web.xml
    1. <?xml version="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 Application</display-name>
    7. <!-- Spring和web项目集成start -->
    8. <!-- spring上下文配置文件 -->
    9. <context-param>
    10. <param-name>contextConfigLocation</param-name>
    11. <param-value>classpath:spring-context.xml</param-value>
    12. </context-param>
    13. <!-- 读取Spring上下文的监听器 -->
    14. <listener>
    15. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    16. </listener>
    17. <!-- Spring和web项目集成end -->
    18. <!-- 中文乱码处理 -->
    19. <filter>
    20. <filter-name>encodingFilter</filter-name>
    21. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    22. <async-supported>true</async-supported>
    23. <init-param>
    24. <param-name>encoding</param-name>
    25. <param-value>UTF-8</param-value>
    26. </init-param>
    27. </filter>
    28. <filter-mapping>
    29. <filter-name>encodingFilter</filter-name>
    30. <url-pattern>/*</url-pattern>
    31. </filter-mapping>
    32. <!-- Spring MVC servlet -->
    33. <servlet>
    34. <servlet-name>SpringMVC</servlet-name>
    35. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    36. <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
    37. <init-param>
    38. <param-name>contextConfigLocation</param-name>
    39. <param-value>classpath:spring-mvc.xml</param-value>
    40. </init-param>
    41. <load-on-startup>1</load-on-startup>
    42. <!--web.xml 3.0的新特性,是否支持异步-->
    43. <async-supported>true</async-supported>
    44. </servlet>
    45. <servlet-mapping>
    46. <servlet-name>SpringMVC</servlet-name>
    47. <url-pattern>/</url-pattern>
    48. </servlet-mapping>
    49. </web-app>
    zhang.tld
    1. <?xml version="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 Application</display-name>
    7. <!-- Spring和web项目集成start -->
    8. <!-- spring上下文配置文件 -->
    9. <context-param>
    10. <param-name>contextConfigLocation</param-name>
    11. <param-value>classpath:spring-context.xml</param-value>
    12. </context-param>
    13. <!-- 读取Spring上下文的监听器 -->
    14. <listener>
    15. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    16. </listener>
    17. <!-- Spring和web项目集成end -->
    18. <!-- 中文乱码处理 -->
    19. <filter>
    20. <filter-name>encodingFilter</filter-name>
    21. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    22. <async-supported>true</async-supported>
    23. <init-param>
    24. <param-name>encoding</param-name>
    25. <param-value>UTF-8</param-value>
    26. </init-param>
    27. </filter>
    28. <filter-mapping>
    29. <filter-name>encodingFilter</filter-name>
    30. <url-pattern>/*</url-pattern>
    31. </filter-mapping>
    32. <!-- Spring MVC servlet -->
    33. <servlet>
    34. <servlet-name>SpringMVC</servlet-name>
    35. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    36. <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
    37. <init-param>
    38. <param-name>contextConfigLocation</param-name>
    39. <param-value>classpath:spring-mvc.xml</param-value>
    40. </init-param>
    41. <load-on-startup>1</load-on-startup>
    42. <!--web.xml 3.0的新特性,是否支持异步-->
    43. <async-supported>true</async-supported>
    44. </servlet>
    45. <servlet-mapping>
    46. <servlet-name>SpringMVC</servlet-name>
    47. <url-pattern>/</url-pattern>
    48. </servlet-mapping>
    49. </web-app>

    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="D:\\temp\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    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.CloudJun.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.CloudJun.mapper"
    25. targetProject="src/main/java">
    26. <property name="enableSubPackages" value="false"/>
    27. sqlMapGenerator>
    28. <javaClientGenerator targetPackage="com.CloudJun.mapper"
    29. targetProject="src/main/java" type="XMLMAPPER">
    30. <property name="enableSubPackages" value="false"/>
    31. javaClientGenerator>
    32. <table schema="" tableName="t_hotel" domainObjectName="Hotel"
    33. enableCountByExample="false" enableDeleteByExample="false"
    34. enableSelectByExample="false" enableUpdateByExample="false">
    35. table>
    36. context>
    37. generatorConfiguration>

    jdbc.properties

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

    log4j2.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!-- status : 指定log4j本身的打印日志的级别.ALL< Trace < DEBUG < INFO < WARN < ERROR
    3. < FATAL < OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s. -->
    4. <Configuration status="WARN" monitorInterval="30">
    5. <Properties>
    6. <!-- 配置日志文件输出目录 ${sys:user.home} -->
    7. <Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property>
    8. <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property>
    9. <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property>
    10. <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property>
    11. </Properties>
    12. <Appenders>
    13. <!--这个输出控制台的配置 -->
    14. <Console name="Console" target="SYSTEM_OUT">
    15. <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
    16. <ThresholdFilter level="trace" onMatch="ACCEPT"
    17. onMismatch="DENY" />
    18. <!-- 输出日志的格式 -->
    19. <!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称
    20. %m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M
    21. : 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 -->
    22. <PatternLayout pattern="${PATTERN}" />
    23. </Console>
    24. <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
    25. <!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
    26. <File name="log" fileName="logs/test.log" append="false">
    27. <PatternLayout
    28. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    29. </File>
    30. <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size, 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
    31. <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
    32. filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
    33. <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
    34. <ThresholdFilter level="info" onMatch="ACCEPT"
    35. onMismatch="DENY" />
    36. <PatternLayout
    37. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    38. <Policies>
    39. <!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. -->
    40. <!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 -->
    41. <!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log -->
    42. <TimeBasedTriggeringPolicy interval="1"
    43. modulate="true" />
    44. <!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. -->
    45. <!-- <SizeBasedTriggeringPolicy size="2 kB" /> -->
    46. </Policies>
    47. </RollingFile>
    48. <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
    49. filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
    50. <ThresholdFilter level="warn" onMatch="ACCEPT"
    51. onMismatch="DENY" />
    52. <PatternLayout
    53. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    54. <Policies>
    55. <TimeBasedTriggeringPolicy />
    56. <SizeBasedTriggeringPolicy size="2 kB" />
    57. </Policies>
    58. <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
    59. <DefaultRolloverStrategy max="20" />
    60. </RollingFile>
    61. <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
    62. filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
    63. <ThresholdFilter level="error" onMatch="ACCEPT"
    64. onMismatch="DENY" />
    65. <PatternLayout
    66. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    67. <Policies>
    68. <!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log -->
    69. <TimeBasedTriggeringPolicy interval="1"
    70. modulate="true" />
    71. <!-- <SizeBasedTriggeringPolicy size="10 MB" /> -->
    72. </Policies>
    73. </RollingFile>
    74. </Appenders>
    75. <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    76. <Loggers>
    77. <!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
    78. <logger name="org.springframework" level="INFO"></logger>
    79. <logger name="org.mybatis" level="INFO"></logger>
    80. <!-- 第三方日志系统 -->
    81. <logger name="org.springframework" level="ERROR" />
    82. <logger name="org.hibernate" level="ERROR" />
    83. <logger name="org.apache.struts2" level="ERROR" />
    84. <logger name="com.opensymphony.xwork2" level="ERROR" />
    85. <logger name="org.jboss" level="ERROR" />
    86. <!-- 配置日志的根节点 -->
    87. <root level="all">
    88. <appender-ref ref="Console" />
    89. <appender-ref ref="RollingFileInfo" />
    90. <appender-ref ref="RollingFileWarn" />
    91. <appender-ref ref="RollingFileError" />
    92. </root>
    93. </Loggers>
    94. </Configuration>

    spring-context.xml

    1. <?xml version="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. <?xml version="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. <!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
    12. <context:component-scan base-package="com.yuan"/>
    13. <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
    14. <mvc:annotation-driven />
    15. <!--3) 创建ViewResolver视图解析器 -->
    16. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    17. <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
    18. <property name="viewClass"
    19. value="org.springframework.web.servlet.view.JstlView"></property>
    20. <property name="prefix" value="/WEB-INF/jsp/"/>
    21. <property name="suffix" value=".jsp"/>
    22. </bean>
    23. <!--4) 单独处理图片、样式、js等资源 -->
    24. <!-- <mvc:resources location="/css/" mapping="/css/**"/>
    25. <mvc:resources location="/js/" mapping="/js/**"/>
    26. <mvc:resources location="WEB-INF/images/" mapping="/images/**"/>-->
    27. <!-- <mvc:resources location="/static/" mapping="/static/**"/>-->
    28. <aop:aspectj-autoproxy/>
    29. </beans>

    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.yuan"/>
    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/yuan/**/mapper/*.xml"/>
    25. <property name="typeAliasesPackage" value="com/yuan/**/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/yuan/**/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>

    StudentBizImpl

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

    PagerAspect

    1. package com.zhanghao.aspect;
    2. import com.github.pagehelper.PageHelper;
    3. import com.github.pagehelper.PageInfo;
    4. import com.zhanghao.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 zhanghao
    12. * @site
    13. * @company s集团
    14. * @create 2023-08-25 17:01
    15. */
    16. @Aspect
    17. @Component
    18. public class PagerAspect {
    19. @Around("execution(* *..*Biz.*Pager(..))")
    20. public Object invoke(ProceedingJoinPoint args) throws Throwable {
    21. PageBean pageBean = null;
    22. //获取目标中的所有方法
    23. Object[] args1 = args.getArgs();
    24. for (Object o : args1) {
    25. if (o instanceof PageBean) {
    26. pageBean = (PageBean) o;
    27. break;
    28. }
    29. }
    30. if (pageBean != null && pageBean.isPagination()) {
    31. PageHelper.startPage(pageBean.getPage(), pageBean.getRows());
    32. }
    33. Object proceed = args.proceed();
    34. if (pageBean != null && pageBean.isPagination()) {
    35. PageInfo pageInfo = new PageInfo((List) proceed);
    36. pageBean.setTotal((int) pageInfo.getTotal());
    37. }
    38. return proceed;
    39. }
    40. }

    PageTag

    1. package com.zhanghao.tag;
    2. import com.zhanghao.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<String, String[]> paramMap = pageBean.getMap();
    37. if(paramMap != null && paramMap.size() > 0) {
    38. Set<Entry<String, String[]>> entrySet = paramMap.entrySet();
    39. for (Entry<String, String[]> 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();
  • }
  • }
  • 实现功能

    StudentController

    1. package com.zhanghao.web;
    2. import com.zhanghao.Biz.StudentBiz;
    3. import com.zhanghao.model.Student;
    4. import com.zhanghao.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 zhanghao
    14. * @site
    15. * @company s集团
    16. * @create 2023-09-08 21:52
    17. */
    18. @Controller
    19. @RequestMapping("/student")
    20. public class StudentController {
    21. @Autowired
    22. private StudentBiz studentBiz;
    23. @RequestMapping("/list")
    24. public String list(Student student, HttpServletRequest request){
    25. PageBean pageBean = new PageBean();
    26. pageBean.setRequest(request);
    27. List<Student> students = studentBiz.selBySnamePager(student, pageBean);
    28. request.setAttribute("list",students);
    29. request.setAttribute("pageBean",pageBean);
    30. return "stu/list";
    31. }
    32. @RequestMapping("/add")
    33. public String add(Student student){
    34. studentBiz.insertSelective(student);
    35. return "redirect:list";
    36. }
    37. @RequestMapping("/del/{sid}")
    38. public String add(@PathVariable("sid") String sid){
    39. studentBiz.deleteByPrimaryKey(sid);
    40. return "redirect:/student/list";
    41. }
    42. @RequestMapping("/edit")
    43. public String edit(Student student){
    44. studentBiz.updateByPrimaryKeySelective(student);
    45. return "redirect:list";
    46. }
    47. @RequestMapping("/pareSave")
    48. public String pareSave(Student student, Model model){
    49. if(student!=null && student.getSid()!=null){
    50. Student s = studentBiz.selectByPrimaryKey(student.getSid());
    51. model.addAttribute("s",s);
    52. }
    53. return "stu/edit";
    54. }
    55. }

    JSP

    List.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html >
    4. <html>
    5. <head>
    6. <%@ include file="/common/header.jsp" %>
    7. </head>
    8. <body>
    9. <form class="form-inline"
    10. action="/student/list" method="post">
    11. <div class="form-group mb-2">
    12. <input type="text" class="form-control-plaintext" name="sname"
    13. placeholder="请输入学生名称">
    14. <!-- <input name="rows" value="20" type="hidden"> -->
    15. <!-- 不想分页 -->
    16. <%-- <input name="pagination" value="false" type="hidden">--%>
    17. </div>
    18. <button type="submit" class="btn btn-primary mb-2">查询</button>
    19. <a class="btn btn-primary mb-2" href="/student/pareSave">新增</a>
    20. </form>
    21. <table class="table table-striped ">
    22. <thead>
    23. <tr>
    24. <th scope="col">学生编号</th>
    25. <th scope="col">学生名称</th>
    26. <th scope="col">学生年龄</th>
    27. <th scope="col">学生性别</th>
    28. <th scope="col">操作</th>
    29. </tr>
    30. </thead>
    31. <tbody>
    32. <c:forEach var="s" items="${list }">
    33. <tr>
    34. <td>${s.sid }</td>
    35. <td>${s.sname }</td>
    36. <td>${s.sage }</td>
    37. <td>${s.ssex }</td>
    38. <td>
    39. <a href="/student/pareSave?sid=${s.sid}">修改</a>
    40. <a href="/student/del/${s.sid}">删除</a>
    41. </td>
    42. </tr>
    43. </c:forEach>
    44. </tbody>
    45. </table>
    46. <!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
    47. <z:page pageBean="${pageBean }"></z:page>
    48. ${pageBean}
    49. </body>
    50. </html>

    edit.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title></title>
    8. </head>
    9. <body>
    10. <form action="${pageContext.request.contextPath }/${empty s ? 'student/add' : 'student/edit'}" method="post">
    11. 学生编号:<input type="text" name="sid" value="${s.sid }"><br>
    12. 学生姓名:<input type="text" name="sname" value="${s.sname }"><br>
    13. 学生年龄:<input type="text" name="sage" value="${s.sage }"><br>
    14. 学生性别:<input type="text" name="ssex" value="${s.ssex }"><br>
    15. <input type="submit">
    16. </form>
    17. </body>
    18. </html>

    heard.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. <!DOCTYPE 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. <base href="${pageContext.request.contextPath }" />
    15. </head>

    前端增删改查实现一般需要完成以下几个步骤:

    1. 前端页面设计。前端页面应该清晰明了,使用户易于理解和使用。需要定义表格用于展示数据,包括表头和表内容,同时还需要添加各种操作按钮用于增加、修改和删除数据。

    2. 接口设计。接口是前后端之间的桥梁,要实现增删改查功能,需要定义对应的增删改查接口。接口应该具有明确的功能和参数,以便前端能够正确调用。

    3. 数据库设计。数据库是存储数据的重要组成部分。需要定义对应的数据表,包括数据列、数据类型和主键等,以便后台能够存储数据并进行操作。

    4. 前端逻辑实现。前端需要编写对应的JavaScript代码来实现增删改查功能。具体包括:对表格进行初始化、监听操作按钮点击事件、调用后台接口进行数据操作等。

    5. 后台接口实现。后台接口需要根据前端定义的接口进行实现。一般需要包括对应的增删改查方法,以便能够正确处理前端传递的参数和数据。

    6. 后台逻辑实现。后台需要根据前端传递的参数和数据,进行相应的处理,包括数据的存储和修改、数据的查询和删除等。同时,还需要对数据进行校验和验证,保证数据的正确性和安全性。

    综上所述,前端增删改查实现需要前后端配合完成,同时还需要遵循一定的规范和标准,才能够实现功能完善、性能优良的系统。

  • 相关阅读:
    Liunx-02建立liunx实验环境
    Spring 框架学习(六)---- Bean作用域
    09:STM32-------USART串口通信+串口数据包
    CPU卡MF下目录基本文件(DIR)的结构
    寄存器介绍
    开源OA协同办公系统,集成Flowable流程引擎 可拖拽创建个性表单
    利用ESP32实现蓝牙通信的方法
    MySQL的增删查改(CRUD)
    【网络协议】聊聊UDP协议
    教你实现多线程案例定时器
  • 原文地址:https://blog.csdn.net/djssubddbj/article/details/132769008