当前位置: 首页 > news >正文

公司老项目springmvc jsp 自定义多数据源 转到springboot 整理

真实完整步骤,踩坑整理 有同样的坑,欢迎补充整理

网上的案例老是少了很多配置,本案例涉及到 spring-mvc,自定义多数据源,统一前缀,事务,mybatis,jsp访问异常,静态文件。

项目还是老的目录结构

springboot的目的就是为了简化开发,使用配置的方式,因此 我们最终的目标 就是删除springmvc项目中 web.xml  springmvc相关配置  mybatis配置等;

1.添加springboot相关的pom依赖 
redis、日志等等按需添加,老的spring的相关都删除

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version>
</parent><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>
</dependency><build><finalName>JoeProject</finalName><outputDirectory>${basedir}/target/site</outputDirectory><resources><resource><directory>src/main/java</directory><includes><include>**/*.*</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes><filtering>false</filtering></resource><resource><directory>src/main/webapp</directory><includes><include>**/*.*</include></includes><filtering>false</filtering></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>


2.添加启动类

@SpringBootApplication
public class JoeApplication extends SpringBootServletInitializer {// 入口public static void main(String[] args) {SpringApplication.run(JoeApplication.class, args);}// Java EE应用服务器配置,// 如果要使用tomcat来加载jsp的话就必须继承SpringBootServletInitializer类并且重写其中configure方法@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(JoeApplication.class);}}


3.添加 application.yml
3.1包括端口,全局参数以及全局路径,环境分支,上传
3.2本案例 数据源暂时不用配置(因为老的使用了多数据源 并且需要自定义解析数据库的密文,因此下面将使用编程式(较传统)配置多数据源),也可以使用苞米豆的 多数据源配置,然后注解Ds()

server:port: 8082servlet:encoding:charset: utf-8context-path: /Joe# 全局变量参数,可以用在jsp中 <script src="<%=application.getInitParameter("Joe") %>/static/ss.js></script>context-parameters:Joe: /Joespring:profiles:active: branchservlet:multipart:max-file-size: 500MBmax-request-size: 500MB


      
4.重点!! web.xml的处理
4.1 老的web.xml都可以删除,但是里面一些主要的,包括全局参数 、欢迎页、异常处理、以及springmvc的配置文件(拦截器、事务、数据源与mybatis配置)都需要代码来处理
4.2 老项目全是*.do idea可以全局替换(注意要全词匹配 .do,然后大概看下防止错误) Eidt-find-replace in files
4.2.1 静态文件get请求处理
4.3 对spring-mvc.xml进行配置
4.3.1 路径拦截处理
<!-- 老版本
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/marketing/*"/>
        <bean class="com.Joe.until.LoginInterceptor" ></bean>
    </mvc:interceptor>
</mvc:interceptors> -->

修改后:
WebmvcConfig.java
@Configuration
// 踩坑 extends WebMvcConfigurationSupport导致我的页面访问请求都被当作一个Controller层请求而被处理了。导致页面的 js css都加载不出来

@Configuration
// public class WebmvcConfig extends WebMvcConfigurationSupport {
public class WebmvcConfig implements WebMvcConfigurer {// 首页添加@Overrideprotected void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("views/loadLogin");}// 踩坑,不能使用application.yml的配置方式@Beanpublic InternalResourceViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/");viewResolver.setSuffix(".jsp");return viewResolver;}@Overrideprotected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/test/*").excludePathPatterns("/", "/login", "/css/**", "/js/**", "/views/**");super.addInterceptors(registry);}
}


LoginInterceptor.java

public class LoginInterceptor extends BaseInterceptor implements HandlerInterceptor {// 验证@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {try {Cookie userSysno = CookiesUntil.getCookieByName(request, "userSysno");Cookie sid = CookiesUntil.getCookieByName(request, "sid");boolean re;if (userSysno != null && sid != null) {re = this.checkLogin(request, response, sid, userSysno);} else {RedisUtil.ClearKey(userSysno.getValue() + "permissions");re = false;}if (!re) {RedisUtil.ClearKey(userSysno.getValue() + "permissions");request.getRequestDispatcher("/login/loginOut").forward(request, response);return false;} else {return true;}} catch (Exception ex) {System.out.println("preHandle:" + ex.getMessage());request.getRequestDispatcher("/login/loginOut").forward(request, response);return false;}}
}

5.重点!!spring-mybatis配置修改 多数据源处理 
老项目采用的AbstractRoutingDataSource、自定义SqlSessionFactoryBean、ThreadLocal<String> contextHolder切换数据源。
四个类搞定自定义多数据源

DynamicDataSource.java

public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return CustomerContextHolder.getCustomerType();}}

DatasourceConfig.java 多数元配置

@Configuration
public class DatasourceConfig {@Value("${jdbc.url: sqlserver://allin.w.allin}")public String jdbcUrl;@Value("${jdbc17.url: sqlserver://allin.r.Joe}")public String jdbc17Url;@Value("${jdbcallinDatatool.url: sqlserver://allin.w.allindatatool}")public String jdbcallinDatatoolUrl;@Value("${jdbc17Joeallin.url: sqlserver://allin.w.Joeallin}")@Primary@Bean(name = "dataSource1")public DataSource dataSource1() {DruidDataSource ds = new DruidDataSource();try {ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");// 自定义解析 配置文件中的url,可以使用setpassword setnameds.setUrl(AllineDecoderClient.getInstance().getConnectionString(jdbcUrl));} catch (Exception e) {e.printStackTrace();}return ds;}@Bean(name = "dataSource2")public DataSource dataSource2() {DruidDataSource ds = new DruidDataSource();ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");ds.setUrl(AllineDecoderClient.getInstance().getConnectionString(jdbc17Url));return ds;}@Bean(name = "dataSource3")public DataSource dataSource3() {DruidDataSource ds = new DruidDataSource();ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");ds.setUrl(AllineDecoderClient.getInstance().getConnectionString(jdbcallinDatatoolUrl));return ds;}@Bean(name = "dataSource4")public DataSource dataSource4() {DruidDataSource ds = new DruidDataSource();ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");ds.setUrl(AllineDecoderClient.getInstance().getConnectionString(jdbc17JoeallinUrl));return ds;}@Bean(name = "dynamicDataSource")public DataSource dynamicDataSource() {DynamicDataSource dynamicDataSource = new DynamicDataSource();Map<Object, Object> dataSourceMap = new HashMap<>();dataSourceMap.put("dataSource1", dataSource1());dataSourceMap.put("dataSource2", dataSource2());dataSourceMap.put("dataSource3", dataSource3());dataSourceMap.put("dataSource4", dataSource4());dynamicDataSource.setTargetDataSources(dataSourceMap);// 设置默认数据源dynamicDataSource.setDefaultTargetDataSource(dataSource1());return dynamicDataSource;}}

CustomerContextHolder.java


public class CustomerContextHolder {public static final String DATA_SOURCE_A = "dataSource1";public static final String DATA_SOURCE_B = "dataSource2";public static final String DATA_SOURCE_C = "dataSource3";public static final String DATA_SOURCE_D = "dataSource4";private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();public static void setCustomerType(String customerType) {contextHolder.set(customerType);}public static String getCustomerType() {return contextHolder.get();}public static void clearCustomerType() {contextHolder.remove();}
}

DataSourceConfigDynamic.java  

@Configuration
@MapperScan(basePackages = "com.Joe.allin.dao", sqlSessionFactoryRef = "sqlSessionFactory") // 踩坑 未配置sqlSessionFactoryRef
public class DataSourceConfigDynamic {@Primary@Bean("sqlSessionFactory")SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource)throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dynamicDataSource);// 踩坑 未配置setMapperLocationsbean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/Joe/allin/mapping/*.xml"));return bean.getObject();}}

-- 使用多数据源 在service调用dao层数据源前使用,然后清楚,默认数据源A不用写

CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);
xxService.test();
CustomerContextHolder.clearCustomerType();

6.全局事务采用注解方式
7.全局异常处理 度娘一大堆
8.可能还会出现循环依赖、乱码、版本依赖冲突等。根据自己的问题自行处理
9.关于war jar的问题,我还是使用的war包,启动 直接application的方式就可以,依赖里内嵌了tomcat

相关文章:

公司老项目springmvc jsp 自定义多数据源 转到springboot 整理

真实完整步骤&#xff0c;踩坑整理 有同样的坑&#xff0c;欢迎补充整理 网上的案例老是少了很多配置&#xff0c;本案例涉及到 spring-mvc&#xff0c;自定义多数据源&#xff0c;统一前缀&#xff0c;事务&#xff0c;mybatis&#xff0c;jsp访问异常&#xff0c;静态文件。…...

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】

一、网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去用。 这样的架构&#xff0c;会存在着诸多…...

探讨jdk源码中的二分查找算法返回值巧妙之处

文章目录 1.什么是二分查找算法1.1 简介1.2 实现思路 2.二分查找的示例3.jdk 中的 Arrays.binarySearch()4.jdk 中核心二分查找方法解析4.1 为什么 low 是插入点4.2 为什么要进行取反&#xff1a;-&#xff08;low 1&#xff09;4.3 为什么不直接返回 插入点 low 的相反数&…...

深度学习实战:基于TensorFlow与OpenCV的手语识别系统

文章目录 写在前面基于TensorFlow与OpenCV的手语识别系统安装环境一、导入工具库二、导入数据集三、数据预处理四、训练模型基于CNN基于LeNet5基于ResNet50 五、模型预测基于OpenCV 写在后面 写在前面 本期内容&#xff1a;基于TensorFlow与OpenCV的手语识别系统 实验环境&…...

学习整理nginx常用屏蔽规则,让网站更安全

学习整理nginx常用屏蔽规则&#xff0c;让网站更安全 注意一、防止文件被下载二、屏蔽非常见蜘蛛&#xff08;爬虫&#xff09;三、禁止某个目录执行脚本四、屏蔽某个IP或IP段 注意 在开始之前&#xff0c;希望您已经熟悉的Nginx常用命令&#xff08;如停止&#xff0c;重启等…...

四十一、【进阶】索引使用SQL提示

1、SQL提示使用情景 在使用MySQL时&#xff0c;当一个字段参在于多个索引中时&#xff0c;默认情况下&#xff0c;MySQL会自动选择一个索引&#xff0c;但我们可以指定索引吗&#xff1f;可以忽略某一种索引吗&#xff1f; 答案是可以的。 前提&#xff1a;profession字段已经…...

AI智能分析网关高空抛物算法如何实时检测高楼外立面剥落?

高楼外立面剥落是一种十分危险的行为&#xff0c;会造成严重的人身伤害和财产损失。TSINGSEE青犀智能分析网关利用高楼外立面剥落的信息&#xff0c;结合高空抛物算法来进行处理就可很好解决此问题。 1. 数据收集 首先&#xff0c;需要收集关于高楼外立面剥落的数据。这可以通…...

微信小程序 - 页面继承(非完美解决方案)

微信小程序 - 面页继承&#xff08;非完美解决方案&#xff09; 废话思路首页 indexindex.jsindex.jsonindex.wxml 父页面 page-basepage-base.jspage-base.wxml 子页面 page-apage-a.jspage-a.wxml 子页面 page-bpage-b.jspage-b.wxml 其它app.jsapp.jsonapp.wxss 参考资料 废…...

智能配件管理系统有什么用?企业如何实现管理数字化转型?

在当今高度信息化的时代&#xff0c;企业运营的各个环节都离不开准确及时的数据支持。特别是在制造业中&#xff0c;生产数据的记录和管理对于提高生产效率、降低成本、优化资源配置等方面具有至关重要的作用。然而&#xff0c;许多企业仍在采用纸质流转卡来记录生产数据&#…...

@SuppressWarnings注解使用说明

在Java编程中&#xff0c;我们常常会遇到一些警告&#xff08;warnings&#xff09;&#xff0c;这些警告通常是对某些潜在问题的提示&#xff0c;虽然这些问题可能不会立即影响程序的运行&#xff0c;但可能会在将来引发问题。为了消除这些警告&#xff0c;我们可以使用Suppre…...

算法从入门到入土cpp版

1. 排序 1. 快速排序 # include<iostream> using namespace std;const int N 100010;int q[N];void quick_sort(int q[], int l, int r) {if(l>r) return;int il-1,jr1,tempq[l];while(i<j){do i;while(q[i]<temp);do j--;while(q[j]>temp);if(i<j)swa…...

没有PDF密码,如何解密文件?

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。想要解密&#xff0c;我们需要输入正确的密码&#xff0c;但是有时候我们可能会出现忘记密码的情况&#xff0c;或者网上下载P…...

Sqlyog 无法连接 8 版本的mysql caching_sha2_password could not be loaded

Sqlyog 无法连接 8 版本的mysql caching_sha2_password could not be loaded 1.问题背景 近期系统对Mysql 版本进行了升级&#xff0c;由原来的 5.7升至 8版本&#xff0c;在现场使用Sqlyog 作为数据库连接软件时&#xff0c;发现连接失败。 2.问题现象 使用Sqlyog配置完连…...

学习笔记三十三:准入控制

ResourceQuota准入控制器 ResourceQuota准入控制器限制cpu、内存、pod、deployment数量限制存储空间大小 LimitRanger准入控制器在limit名称空间创建pod&#xff0c;不指定资源&#xff0c;看看是否会被limitrange规则自动附加其资源限制创建pod&#xff0c;指定cpu请求是100m&…...

Unix/Linux C语言 获取控制台窗口尺寸

在Unix/Linux控制台编程&#xff0c;为了能输出好看一些&#xff0c;需要知道窗口宽度&#xff0c;当然使用支持很宽的窗口的终端也是个办法&#xff0c;但是实在没有很宽的终端怎么办呢&#xff0c;还是要从程序上想办法的。 判断控制台窗口宽度需要两个函数&#xff1a; isa…...

界面控件DevExpress WinForms Gauge组件 - 实现更高级别数据可视化

DevExpress WinForms控件包含了超过150个随时可用的仪表盘预设&#xff0c;包括圆形&#xff0c;数字&#xff0c;线性和状态指示器等&#xff0c;来帮助用户实现更高级的数据可视化。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业…...

vivo 自研蓝河操作系统 BlueOS 发布:支持大模型、BlueXlink 协议实现万物互联

大家好&#xff0c;我是 Lorin , 2023 年 11 月 1 日&#xff0c;在今天的 2023 年 vivo 开发者大会上&#xff0c;vivo 自主研发的蓝河操作系统&#xff08;BlueOS&#xff09;正式亮相。这款操作系统被宣传为一款面向未来的智能操作系统&#xff0c;具备出色的支持能力&#…...

opencv复习(很乱)

2-高斯与中值滤波_哔哩哔哩_bilibili 1、均值滤波 2、高斯滤波 3、中值滤波 4、腐蚀操作 卷积核不都是255就腐蚀掉 5、膨胀操作 6、开运算 先腐蚀再膨胀 7、闭运算 先膨胀再腐蚀 8、礼帽 原始数据-开运算结果 9、黑帽 闭运算结果-原始数据 10、Sobel算子 左-右&#x…...

于璠访谈录 | AI 框架应该和而不同?

点击以下链接收听本期 “大咖访谈” 播客&#xff0c;与大咖面对面&#xff1a; 大咖访谈链接&#xff1a;于璠 | AI 框架应该和而不同&#xff1f; 刘天栋&#xff1a;访谈主持&#xff0c;开源雨林社区顾问、开源社联合创始人、ASF member 于璠&#xff1a;访谈嘉宾&#xf…...

基于Springboot+MYSQL+Maven实现的宠物医院管理系统(源码+数据库+运行指导文档+项目运行指导视频)

一、项目简介 本项目是一套基于springboot框架实现的宠物医院管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...