Spring+SprinMVC+MyBatis配置方式简易模板
Spring+SprinMVC+MyBatis配置方式简易模板代码Demo GitHub访问 ssm-tpl-cfg
一、SQL数据准备
创建数据库test,执行下方SQL创建表ssm-tpl-cfg
/*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Version : 80030Source Host : 127.0.0.1:3306Source Schema : testTarget Server Type : MySQLTarget Server Version : 80030File Encoding : 65001Date: 17/10/2022 00:52:07
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for ssm-tpl-cfg
-- ----------------------------
DROP TABLE IF EXISTS `ssm-tpl-cfg`;
CREATE TABLE `ssm-tpl-cfg` (`id` bigint NOT NULL COMMENT '主键编号',`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '测试名称',PRIMARY KEY (`id`)
) COMMENT '初始SSM表结构数据' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- ----------------------------
-- Records of ssm-tpl-cfg
-- ----------------------------
BEGIN;
INSERT INTO `ssm-tpl-cfg` (`id`, `name`) VALUES (2210162246100000, '王飞飞');
INSERT INTO `ssm-tpl-cfg` (`id`, `name`) VALUES (2210162257100000, '练卓神');
COMMIT;SET FOREIGN_KEY_CHECKS = 1;
二、代码实现
2.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.tpl.ssm.cfg</groupId><artifactId>ssm-tpl-cfg</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><properties><spring_version>5.1.18.RELEASE</spring_version><jackson_version>2.9.7</jackson_version></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-messaging</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring_version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring_version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.4.2</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId><version>3.4.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.16</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.2</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.15.2</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.15.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.7</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.36</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.7.0</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version></dependency><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><dependency><groupId>commons-pool</groupId><artifactId>commons-pool</artifactId><version>1.6</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.7</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.7</version></dependency><dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>2.0.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>
</project>
2.2 web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><!-- 加载Spring的配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/applicationContext.xml</param-value></context-param><!-- 配置Spring监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 配置SpringMvc前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 配置编码过滤器 --><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>characterEncodingFilter</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>
2.3 resources/config/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 加载数据库属性文件 --><context:property-placeholder location="classpath:config/db.properties"/><!-- 配置数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><!-- 四大连接参数 --><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><!-- 连接池配置信息 --><property name="initialSize" value="${jdbc.initialSize}"/><property name="minIdle" value="${jdbc.minIdle}"/><property name="maxActive" value="${jdbc.maxActive}"/><property name="maxWait" value="${jdbc.maxWait}"/><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000"/><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><!-- Druid用来测试连接是否可用的SQL语句,默认值每种数据库都不相同--><property name="validationQuery" value="SELECT 'x'" /><!-- 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除. --><property name="testWhileIdle" value="true" /><!-- 指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 --><property name="testOnBorrow" value="false" /><!-- 指明是否在归还到池中前进行检验 --><property name="testOnReturn" value="false" /><!-- 配置监控统计拦截的filters --><property name="filters" value="wall,stat" /></bean><!-- 配置sessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 注入数据源 --><property name="dataSource" ref="dataSource"/><!-- mapper文件位置 --><property name="mapperLocations" value="classpath:mapper/*DAO.xml"/><!-- mybatis核心配置文件位置 --><property name="configLocation" value="classpath:config/mybatis-config.xml"/></bean><!-- 配置扫描mapper生成代理对象 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.tpl.ssm.cfg.dao"/><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/></bean><!-- 扫描service --><context:component-scan base-package="com.tpl.ssm.cfg.service"/><!-- 配置事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 开启注解事务 --><tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
2.4 springmvc配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 开启springMVC注解驱动 --><mvc:annotation-driven/><context:component-scan base-package="com.tpl.ssm.cfg.controller"/><!-- 配置SpringMVC视图解析器 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/pages/"/><property name="suffix" value=".jsp"/></bean><!-- 释放静态资源文件 --><mvc:resources mapping="/js/" location="/js/**"/><mvc:resources mapping="/css/" location="/css/**"/><mvc:resources mapping="/images/" location="/images/**"/><!-- 配置文件上传解析器 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="20971520"/><property name="defaultEncoding" value="UTF-8"/></bean>
</beans>
2.5 mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置信息 --><settings><!-- 映射下划线到驼峰命名 --><setting name="mapUnderscoreToCamelCase" value="true"/><!-- 配置开启二级缓存 --><setting name="cacheEnabled" value="true"/><!-- 开启控制台打印SQL --><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!-- 别名 --><typeAliases><package name="com.tpl.ssm.cfg.entity"/></typeAliases>
</configuration>
2.6 数据库连接信息
# 连接数据库的url地址
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
# 加载的类的驱动
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
# 数据库用户名
jdbc.username=root
jdbc.password=root# 初始化连接大小
jdbc.initialSize=10
# 连接池最大使用连接数量
jdbc.maxActive=500
# 连接池最小空闲
jdbc.minIdle=10
# 获取连接最大等待时间
jdbc.maxWait=60000
2.7 Entity
package com.tpl.ssm.cfg.entity;import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonIgnore;import java.util.LinkedHashMap;
import java.util.Map;/*** 测试实体*/
public class TestEntity {/*** 主键编号*/private Long id;/*** 测试名称*/private String name;/*** 扩展字段*/@JsonIgnore@TableField(exist = false)private Map<String, Object> ext = new LinkedHashMap<>(5);public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Map<String, Object> getExt() {return ext;}public void setExt(Map<String, Object> ext) {this.ext = ext;}
}
2.8 Controller
package com.tpl.ssm.cfg.controller;import com.tpl.ssm.cfg.entity.TestEntity;
import com.tpl.ssm.cfg.service.TestService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.List;/*** 1. Spring5.1.x -> jackson2.9.x* 2.The origin server did not find a current representation for the target resource* 原因是WEB-INF只能转发进去, 重定向是进不去的*/
@Controller
@RequestMapping("/test")
public class TestController {private final TestService testService;public TestController(TestService testService) {this.testService = testService;}@GetMapping("/")public String listTests(TestEntity test, Model model) {List<TestEntity> tests = testService.listTests(test);model.addAttribute("tests", tests);return "test";}@PostMapping("/save")public String saveTest(TestEntity test) {testService.saveTest(test);return "redirect:/test/";}@PostMapping("/modify")public String modifyTest(TestEntity test) {testService.modifyTest(test);return "redirect:/test/";}@RequestMapping("/remove")public String removeTest(TestEntity test) {testService.removeTest(test);return "redirect:/test/";}}
2.9 Service
package com.tpl.ssm.cfg.service;import com.tpl.ssm.cfg.entity.TestEntity;import java.util.List;public interface TestService {/*** 测试集** @param cond 查询条件* @return 测试集*/public List<TestEntity> listTests(TestEntity cond);/*** 单一测试实体** @param cond 查询条件* @return 测试实体*/public TestEntity singleTest(TestEntity cond);/*** 新增测试记录** @param cond 查询条件* @return 受影响的条数*/public boolean saveTest(TestEntity cond);/*** @param cond 查询条件* @return 受影响的条数*/public boolean modifyTest(TestEntity cond);/*** 删除一条测试记录** @param cond 查询条件* @return 受影响的条数*/public boolean removeTest(TestEntity cond);/*** 删除多条测试记录** @param testIds 测试实体主键集* @return 受影响的条数*/public boolean removeTests(List<Long> testIds);}
package com.tpl.ssm.cfg.service.impl;import com.tpl.ssm.cfg.dao.TestDAO;
import com.tpl.ssm.cfg.entity.TestEntity;
import com.tpl.ssm.cfg.service.TestService;
import com.tpl.ssm.cfg.util.MajorKeyUtil;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class TestServiceImpl implements TestService {private final TestDAO testDAO;public TestServiceImpl(TestDAO testDAO) {this.testDAO = testDAO;}@Overridepublic List<TestEntity> listTests(TestEntity cond) {return testDAO.listTests(cond);}@Overridepublic TestEntity singleTest(TestEntity cond) {return testDAO.singleTest(cond);}@Overridepublic boolean saveTest(TestEntity cond) {cond.setId(MajorKeyUtil.idSeq());return testDAO.insertTest(cond) > 0;}@Overridepublic boolean modifyTest(TestEntity cond) {return testDAO.updateTest(cond) > 0;}@Overridepublic boolean removeTest(TestEntity cond) {return testDAO.deleteTest(cond) > 0;}@Overridepublic boolean removeTests(List<Long> testIds) {return testDAO.deleteTests(testIds) > 0;}
}
2.10 DAO
package com.tpl.ssm.cfg.dao;import com.tpl.ssm.cfg.entity.TestEntity;import java.util.List;/*** 测试DAO* <p>* 1.查询测试记录列表 - listTests* 2.查询单个测试记录 - singleTest* 3.新增测试记录 - insertTest* 4.修改测试记录 - updateTest* 5.删除测试记录 - deleteTest* 6.根据主键集删除测试记录 - deleteTests*/
public interface TestDAO {/*** 测试集** @param cond 查询条件* @return 测试集*/public List<TestEntity> listTests(TestEntity cond);/*** 单一测试实体** @param cond 查询条件* @return 测试实体*/public TestEntity singleTest(TestEntity cond);/*** 新增测试记录** @param cond 查询条件* @return 受影响的条数*/public int insertTest(TestEntity cond);/*** @param cond 查询条件* @return 受影响的条数*/public int updateTest(TestEntity cond);/*** 删除一条测试记录** @param cond 查询条件* @return 受影响的条数*/public int deleteTest(TestEntity cond);/*** 删除多条测试记录** @param testIds 测试实体主键集* @return 受影响的条数*/public int deleteTests(List<Long> testIds);}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tpl.ssm.cfg.dao.TestDAO"><!-- 基础查询 sql 片段 --><sql id="baseSelect">SELECT id, name</sql><!-- 基础查询 where 片段 --><sql id="baseWhere"><if test="id != null">AND id = #{id}</if><if test="name != null and name != ''">AND name like CONCAT('%', #{name})</if></sql><!-- 查询测试记录列表 --><select id="listTests" parameterType="com.tpl.ssm.cfg.entity.TestEntity" resultType="com.tpl.ssm.cfg.entity.TestEntity"><include refid="baseSelect"/>FROM `ssm-tpl-cfg`WHERE1 = 1<include refid="baseWhere"/></select><!-- 查询单个测试记录 --><select id="singleTest" parameterType="com.tpl.ssm.cfg.entity.TestEntity" resultType="com.tpl.ssm.cfg.entity.TestEntity"><include refid="baseSelect"/>FROM `ssm-tpl-cfg`WHERE1 = 1<include refid="baseWhere"/>limit 1</select><!-- 新增测试记录 --><insert id="insertTest" parameterType="com.tpl.ssm.cfg.entity.TestEntity">INSERT INTO `ssm-tpl-cfg`(id, name)VALUES (#{id}, #{name})</insert><!-- 修改测试记录 --><update id="updateTest" parameterType="com.tpl.ssm.cfg.entity.TestEntity">UPDATE `ssm-tpl-cfg`SET<if test="name != null and name != ''">name = #{name}</if>WHERE id = #{id}</update><!-- 删除测试记录 --><delete id="deleteTest" parameterType="com.tpl.ssm.cfg.entity.TestEntity">DELETEFROM `ssm-tpl-cfg`WHERE 1 = 1<include refid="baseWhere"/></delete><!-- 根据主键集删除测试记录 --><delete id="deleteTests" parameterType="long">DELETEFROM `ssm-tpl-cfg`WHERE id in<foreach collection="item" open="(" separator="," close=")">#{item}</foreach></delete>
</mapper>
2.11 MajorKeyUtil
package com.tpl.ssm.cfg.util;import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;/*** 主键生成器* <p>* https://blog.csdn.net/weixin_42871989/article/details/100133736* 本类用于获取mysql全局自增主键,格式为* 时间戳(yyMMddHHmm) + 5 位自增,自增范围根据配置获取(也可以加上秒yyMMddHHmmss)*/
public class MajorKeyUtil {private static final DateFormat df = new SimpleDateFormat("yyMMddHHmm");//主键时间戳private static final int MAX_SEQ = 0; // 计数位最大值private static final int RESET_SEQ = 99999; //计数位重置初始值(可以自行设置)private static final AtomicInteger seq = new AtomicInteger(RESET_SEQ); //计数器/*** 生成全局自增主键,字符串类型** @return 生成的主键*/public static String getSeq() {seq.compareAndSet(MAX_SEQ, RESET_SEQ); //判断是否进行重置return df.format(new Date()) + String.format("%05d", seq.incrementAndGet());}/*** 生成全局自增主键,long类型** @return 生成的主键*/public static Long idSeq() {String str = getSeq();return Long.parseLong(str);}}
2.12 webapps/pages/test.jsp
<%--Created by IntelliJ IDEA.User: wangfeihuDate: 2022/10/16Time: 18:35To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>CRUD TEST</title>
</head>
<body>
<table><c:forEach items="${tests}" var="test"><tr><td>${test.id}</td><td>${test.name}</td><td><button onclick="let modifyForms = document.getElementsByName('modifyForm'); modifyForms.forEach(item => item.style.display = 'none'); document.getElementById('form${test.id}').style.display = 'inline'">修改</button><button onclick="location.href='${pageContext.request.contextPath}/test/remove?id=${test.id}'">删除</button></td><td><form id="form${test.id}" name="modifyForm" action="${pageContext.request.contextPath}/test/modify" method="post" style="display: none"><input hidden name="id" value="${test.id}"><input name="name" value="${test.name}"><button type="submit">确认修改</button></form></td></tr></c:forEach>
</table><form action="${pageContext.request.contextPath}/test/save" method="post"><label><input name="name" id="name" placeholder="请输入测试名称~"></label><button type="submit">提交</button>
</form>
</body>
</html>
2.13 配置项目访问路径
三、访问测试
访问 http://127.0.0.1:8080/ssm_tpl_cfg/test/
一个简易基于配置的增删改查就实现了
相关文章:

Spring+SprinMVC+MyBatis配置方式简易模板
SpringSprinMVCMyBatis配置方式简易模板代码Demo GitHub访问 ssm-tpl-cfg 一、SQL数据准备 创建数据库test,执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Versio…...

Windows ssh登录eNSP交换机
目录 1. Cloud IO配置1.1 创建UDP端口1.2 创建本地连接1.3 端口映射设置 2. 交换机配置2.1 配置vlanif2.2 配置vty2.3 配置ssh用户2.4 配置aaa2.5 使用Xshell工具登录2.6 用户和密码2.7 登录成功 3. 使用cmd 登录报错提示3.1 手动指定加密算法,提示密码长度无效3.2 …...

SwiftUI 纯手工打造 100% 可定制的导航栏
功能需求 何曾几时,我们是否也厌倦了 SwiftUI 界面中刻板守旧的导航栏外观,而想要自己动手充分展示灵动炸裂的创造力呢? 如上图所示:我们在 SwiftUI 中通过纯手工打造了一款 100 在本篇博文中,您将学到以下内容 功能需求1. 导航栏基本结构2. 如何感知当前发生用户拖拽行为…...

npm install 太慢?解决方法
在使用npm进行包管理时,有时会遇到安装速度缓慢的问题。这可能是由于网络原因或npm官方镜像服务器的繁忙导致的。下面介绍几种常见的解决方法: 使用淘宝镜像 淘宝镜像是一个提供npm包镜像的国内源,其速度较快且稳定。您可以通过以下命令将npm…...

DevOps系列文章之 GitLab CI/CD
CICD是什么? 由于目前公司使用的gitlab,大部分项目使用的CICD是gitlab的CICD,少部分用的是jenkins,使用了gitlab-ci一段时间后感觉还不错,因此总结一下 介绍gitlab的CICD之前,可以先了解CICD是什么 我们的开发模式…...

【CompletableFuture任务编排】游戏服务器线程模型及其线程之间的交互(以排行榜线程和玩家线程的交互为例子)
需求: 1.我们希望玩家的业务在玩家线程执行,无需回调,因此是多线程处理。 2.匹配线程负责匹配逻辑,是单独一个线程。 3.排行榜线程负责玩家的上榜等。 4.从排行榜线程获取到排行榜列表后,需要给玩家发奖修改玩家数…...

什么是浏览器指纹?详解浏览器指纹识别技术,教你防止浏览器指纹识别
在数字时代,我们的在线活动几乎总是留下痕迹。其中,浏览器指纹就像我们的数字身份证,让网站能够识别和追踪用户。对于跨境电商行业来说,了解这种追踪技术尤其重要,因为它可能影响账号的管理和安全。本文将详细介绍浏览…...

canvas绘制六芒星
查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…...

全网最详细!!Python 爬虫快速入门
1. 背景 最近在工作中有需要使用到爬虫的地方,需要根据 Gitlab Python 实现一套定时爬取数据的工具,所以借此机会,针对 Python 爬虫方面的知识进行了学习,也算 Python 爬虫入门了。 需要了解的知识点: Python 基础语…...

gitgud.io+Sapphire注册账号教程
gitgud.io是一个仓库,地址 https://gitgud.io/,点进去之后会看到注册页面。 意思是需要通过注册这个Sapphire账户来登录。点击右边的Sapphire,就跳转到Sapphire的登陆页面,点击创建新账号,就进入注册页面。࿰…...

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径
作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中,graph[i] 是一个列…...

python基础小知识:引用和赋值的区别
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 1.引用 python中,赋值操作会产生相同对象的多个引用, 如果在原位置修改这个可变对象时,可能会影响程序其他位置对这个对象的…...

欧科云链与《警察技术》联合发布技术专题.pdf
欧科云链受《警察技术》邀请,于第201期期刊正式刊登“区块链生态安全与虚拟货币犯罪治理”技术专题。欧科云链作为该技术专题主要作者,直接参与本次期刊2篇文章撰写,同时为多篇文章提供欧科云链的最新数据和研究成果。 《警察技术》期刊创办于…...

【QT+QGIS跨平台编译】之一:【sqlite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
文章目录 一、sqlite3介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、sqlite3介绍 SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的&…...

websocket实现聊天室(vue2 + node)
通过websocket实现简单的聊天室功能 需求分析如图: 搭建的项目结构如图: 前端步骤: vue create socket_demo (创建项目)views下面建立Home , Login组件路由里面配置路径Home组件内部开启websocket连接 前端相关组件代码: Login…...

RabbitMQ-消息延迟
一、死信交换机 1、描述 一个队列接收到的消息有过期时间,消息过期之后,如果配置有死信队列,消息就会进去死信队列。 2、图解 3、过程 当生产者将消息发送到exchange1,然后交换机将消息路由到队列queue1,但是队列que…...

【Oracle】如何给物化视图分区
文章目录 【Oracle】如何给物化视图分区给物化视图进行分区的例 【声明】文章仅供学习交流,观点代表个人,与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 收集Oracle数据库内存相关的信息 【Oracle】ORA-32017和ORA-00384错误处理 【Oracle】设置…...

10个常考的前端手写题,你全都会吗?
前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 今天来分享一下10个常见的JavaScript手写功能。 目录 1.实现new 2.call、apply、…...

vue组件间通信
Vue组件之间通信方式有哪些 一、父子组件通讯 1、props,emit 父组件可以通过props给子组件传递变量。子组件可以通过emit派发自定义事件,使父组件可以获得事件函数传递过来的形参。 2、$parent、$children、ref 父组件可以通过 c h i l d r e n 获取…...

编程框架概述:MVC, MVP, MVVM, Flux/Redux, 和 Clean Architecture
前言 在软件开发中,选择合适的编程框架和架构模式对于构建可维护和可扩展的应用程序至关重要。初学者在面对多种架构选项时可能会感到困惑。本文将详细介绍五种流行的编程框架:MVC、MVP、MVVM、Flux/Redux和Clean Architecture。 MVC(Model-V…...

多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测
多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计…...

np.argsort排序问题(关于位次)-含GitHub上在numpy项目下提问的回复-总结可行方案
np.argsort 与获取位相关问题 位次: 数组中的数据在其排序之后的另一个数组中的位置 [1,0,2,3] 中 0的位次是1 1的位次是2 2的位次是3 3的位次是4 这里先直接给出结论,np.argsort()返回的索引排序与实际位次在确实在某些情况下会出现一致,但后来numpy的开…...

Element中的el-input-number+SpringBoot+mysql
1、编写模板 <el-form ref"form" label-width"100px"><el-form-item label"商品id:"><el-input v-model"id" disabled></el-input></el-form-item><el-form-item label"商品名称&a…...

Jupyter Notebook五分钟基础速通
1 作用 常用于数据分析 2 安装 2.1 Anaconda 通过直接安装Anaconda,会自动安装Jupyter Notebook 2.2 命令行安装 ① 3.x版本 pip3 install --upgrade pip pip3 install jupyter ② 2.x版本 pip install --upgrade pip pip install jupyter 3 启动 cmd窗口下…...

基于SpringBoot的SSM整合案例
项目目录: 数据库表以及表结构 user表结构 user_info表结构 引入依赖 父模块依赖: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.12.RELEASE</version>…...
[SS]语义分割_转置卷积
转置卷积(Transposed Convolution) 抽丝剥茧,带你理解转置卷积(反卷积) 目录 一、概念 1、定义 2、运算步骤 二、常见参数 一、概念 1、定义 转置卷积(Transposed Convolution)…...

面板小程序命令行工具介绍
Ray 体系提供配套的工程化解决方案。 由于多端构建的一些客观原因,在构建流程的设计上,必须将工程套件安装在项目内。 项目内的依赖至少包含以下内容: {"dependencies": {"ray-js/ray": "latest"},"de…...

DBA技术栈MongoDB: 数据增改删除
该博文主要介绍mongoDB对文档数据的增加、更新、删除操作。 1.插入数据 以下案例演示了插入单个文档、多个文档、指定_id、指定多个索引以及插入大量文档的情况。在实际使用中,根据需求选择适合的插入方式。 案例1:插入单个文档 db.visitor.insert({…...

Xcode查看APP文件目录
一、连接真机到MAC电脑上 二、打开Devices 点击window -> Devices and Simulatores 三、选中设备、选择app 四、选择下载内容 五、查看文件内容 得到的文件 右键显示包内容,获得APP内数据 六、分发证书无法下载 使用分发的证书无法下载文件内容…...

【视频媒体】深入了解直播视频流
深入了解直播视频流🎥 YouTube、TikTok live和Twitch上的直播视频是如何工作的? 直播视频流与常规流媒体不同,因为视频内容通过互联网近乎实时发送,通常只有几秒钟的延迟。 下图解释了实现这一目标背后所发生的事情。 步骤1&…...