首页
留言板
友链
关于
Search
1
内测“合金弹头”嘿嘿
878 阅读
2
Nginx搭建一个简易的图床
814 阅读
3
Kettle循环遍历结果集作为参数传入转换
790 阅读
4
Apache Dubbo初步认识
426 阅读
5
Maven打包插件与idea
409 阅读
知识库
好奇猫
日常说
笔记本
登录
/
注册
Search
标签搜索
maven
Spring
vue
Java
Java代码
前端
idea
帆软
MySQL
git
CSS
游戏
Bootstrap
生活
网上冲浪
邮件配置
说说
Nginx
Excel
数据库调优
龙流
累计撰写
61
篇文章
累计收到
18
条评论
首页
栏目
知识库
好奇猫
日常说
笔记本
页面
留言板
友链
关于
搜索到
39
篇与
笔记本
的结果
2021-09-14
FTP文件同步监控 CSV数据分析拆分多个
概述{dotted startColor="#ff6c6c" endColor="#1989fa"/}{x}通过properties配置两个FTP服务器,可以同步某个文件夹内容{x}实现FileAlterationListener监控文件夹文件新增/改变{x}通过后缀筛选文件类型{x}apache.commons包获取FTP连接客户端{x}net.sourceforge.javacsv包操作scv文件pom文件1、首先建议养成先配置日志的习惯 <!-- 日志工具包 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.10.0</version> </dependency> <!--日志核心包--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.10.0</version> </dependency> <!--slf4j的log4j实现类--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.9.1</version> </dependency> <!--程序运行的时候检测用了哪种日志实现类--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>2.9.1</version> </dependency> 2、使用到的工具包 <!--功能强大,操作文件,FTP连接--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.3</version> </dependency> <!--快速读取和生成CSV文件--> <dependency> <groupId>net.sourceforge.javacsv</groupId> <artifactId>javacsv</artifactId> <version>2.0</version> </dependency>public class ITransferImpl implements ITransfer { @Override public void transferInner(String fromAccount, String outAccount, BigDecimal amount) { //使用java的JDBC //1、注册驱动 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Connection connection = null; //Statement statement = null; try { //2、获取连接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root"); //3、执行SQL对象 // statement = connection.createStatement(); } catch (SQLException e) { e.printStackTrace(); } //4、查询转出账户余额是否大于转出金额 BigDecimal amount1 = null; String fromAccountSQL = "SELECT amount from ACCOUNT where accountid = ?"; try { PreparedStatement preparedStatement = connection.prepareStatement(fromAccountSQL); preparedStatement.setString(1,fromAccount); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()){ amount1 = resultSet.getBigDecimal("amount"); if (amount.compareTo(amount1) == 1){ System.out.println("账户金额不足!"); return; } } //5、开启事务 connection.setAutoCommit(false); //6、更新转出账户余额 BigDecimal updateFromAccount = amount1.subtract(amount); String updateFromAccountSQL = "UPDATE ACCOUNT set amount = ? WHERE ACCOUNTID = ?"; PreparedStatement pps = connection.prepareStatement(updateFromAccountSQL); pps.setBigDecimal(1,updateFromAccount); pps.setString(2,fromAccount); pps.executeUpdate(); //7、更新转入账户余额 //7.1先查询转入账户余额 PreparedStatement ppsOut = connection.prepareStatement(fromAccountSQL); ppsOut.setString(1,outAccount); ResultSet resultSet1 = ppsOut.executeQuery(); BigDecimal amount2 = null; while (resultSet1.next()){ amount2 = resultSet1.getBigDecimal("amount"); } //7.2余额与转入额相加 BigDecimal updateOutAccount = amount2.add(amount); PreparedStatement ppsOutAccount = connection.prepareStatement(updateFromAccountSQL); //ppsOutAccount.setBigDecimal(1,updateOutAccount); ppsOutAccount.setString(2,outAccount); ppsOutAccount.executeUpdate(); //8、提交事务 connection.commit(); //9、关闭连接 connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
2021年09月14日
361 阅读
1 评论
0 点赞
2021-08-18
“葵花宝典”——持续更新
{collapse}{collapse-item label="两种动态代理的区别?" }回答要点:1、动态代理的作用2、动态代理的特点3、动态代理的分类4、两种动态代理的使用要求1、不改变原代码的情况下,增强方法2、动态代理的特点,字节码随用随创建,随用随加载3、4、基于接口的动态代理(JDK动态代理):由JDK官方提供要求:被代理类最少实现一个接口涉及类:Proxy创建代理对象的方法:newProxyInstance方法中的参数:ClassLoader:类加载器。 负责加载代理对象的字节码。 和被代理对象使用相同的类加载器。固定写法。 Class[]:字节码数组。 负责让生成的代理对象具有和被代理对象相同的方法。写什么要看被代理对象是一个接口还是一个实现类。 如果是一个接口: new Class[]{接口字节码} 如果是一个实现类:XXX.getClass().getInterfaces();固定写法 InvocationHandler:一个接口,需要我们提供该接口的实现。 作用是用于对方法增强。 增强的代码,谁用谁写。写的是一个接口的实现类。 通常是一个匿名内部类,但是不绝对。 基于子类的动态代理(CGlib动态代理):由cglib第三方提供要求:需要导入cglib的坐标。被代理类不能是最终类。(不能被final修饰)涉及类:Enhancer创建代理对象的方法:create方法中的参数:Class:字节码对象。 用于加载代理对象字节码的。 写的是被代理对象的字节码。是固定写法Callback:如何代理。提供增强代码的。它是个接口,需要自己写实现。 该接口没有方法,需要用它的子接口MethodInterceptor 应用场景1、基于aop思想的方法增强。2、自定义连接池中,实现Connection的close方法还回池中操作3、解决tomcat8.5以下全站中文乱码,get和post两种提交方式的。在get方式需要对以下三个方法增强,用于解决乱码: String value = getParameter(String name); String[] value = getParameterValues(String name); Map<String,String> map = getParameterMap();{/collapse-item}{collapse-item label="IOC和DI的关系" }1、技术介绍2、应用场景IOC(控制反转)全称为: Inverse of Control。从字面上理解就是控制反转了,将在自身对象中的一个内置对象的控制反转,反转后不再由自己本身的对象进行控制这个内置对象的创建,而是由第三方系统去控制这个内置对象的创建。简单来说就是把本来在类内部控制的对象,反转到类外部进行创建后注入,不再由类本身进行控制,这就是IOC的本质。DI(依赖注入)全称为Dependency Injection,意思是自身对象中的内置对象是通过注入的方式进行创建。IOC和DI的关系ioc就是容器,di就是注入这一行为,那么di 确实就是ioc的具体功能的实现。而ioc则是di 发挥的平台和空间。所以说,ioc和 di即是相辅相成的搭档。最重要的是,他们都是为了实现解耦而服务的。DI是如何实现的?依赖注入可以通过setter方法注入(设值注入)、构造器注入和接口注入三种方式来实现,Spring支持setter注入和构造器注入,通常使用构造器注入来注入必须的依赖关系,对于可选的依赖关系,则setter注入是更好的选择,setter注入需要类提供无参构造器或者无参的静态工厂方法来创建对象。应用场景例如:在生产实际中,一个类中会调用其他类的方法,一般情况(原始情况)下直接new创建类对象,但这种方法是需要开发人员自行维护二者的依赖关系,也就是说当依赖关系发生改变时需要修改代码并重新构建整个系统,这对公司业务而言是有损失的(重启需暂停服务,对用户而言难以接受)。这个时候就出现了IOC这一技术,如果通过一个容器来管理这些对象以及对象的依赖关系,则只需要在类A中定义好用于关联接口B的方法(接口B通过构造器或setter方法注入),将类A和接口B的实现类C放入容器中,通过对容器的配置来实现二者的关联。{/collapse-item}{collapse-item label="怎么对IOC容器的配置,管理IOC容器中的对象bean"}通过 Spring 提供的 IOC容器可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度程序耦合。一是通过xml配置文件的方式配置bean(使用标签)二是通过注解的方式配置bean(常用注解@Controller、@Service、@Repository、@Component)@Autowired注解,可以实现自动装配@Autowired private BookService bookservice;//等同于bookservice = ioc.getbean(BookService.class)依赖注入原理: (1)先按类型找: 找到一个就赋值; 没找到就报错; (2)找到多个按照属性名作为id名继续匹配–>找到就装配,找不到还是报错Tips:1)加@Qualifier表示用指定的变量名作为id名去找组件而非属性名了;2)默认通过@Autowired注解实现自动装配是一定要找到的,所有情况下找不到就会报错;3)@Autowired注解的required属性指定某个属性允许找不到还不报错@Autowired(required = false) private BookService bookservice;4)如果对一个数组或集合类型标注自动装配,则自动匹配类型兼容的所有bean组件5)@autowired和@resource都能实现自动装配,区别:@autowired–只能在spring框架里用@resource–j2ee的标准,扩展性更强Spring之IOC容器创建bean对象的XML配置总结{/collapse-item}{collapse-item label="Git使用重点" }Git版本控制,版本管理git本地仓库 删除文件git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop恢复。git reset --hard HASH #返回到某个节点,不保留修改。git reset --soft HASH #返回到某个节点。保留修改原文地址:http://www.pizida.com/git-rm.html{/collapse-item}{collapse-item label="EL与JSTL" }学习EL与JSTL不然首先要创建JSP,在JSP中:1、JSP指令 格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> - page:contentType -> 等同于response.setContentType() import -> 导包 errorPage -> 当前页面发生异常后跳转到指定页面 isErrorPage -> 标识当前页面是否是错误页面,默认为false。设置为true时,可以使用内置对象exception - include:设置包含某页面 - taglib:导入资源2、JSP内置对象 在JSP页面中不需要创建,直接使用的对象;一共有9个 - pageContext 当前页面共享数据,还可以获取其他八个内置对象 - request 一次请求访问的多个资源(转发) - session 一次会话的多个请求间 - application 所有用户间共享数据 - response 响应对象 - page 当前页面(Servlet)的对象 - out 输出对象,数据输出到页面上 - config Servlet的配置对象 - exception 异常对象3、EL - EL运算符:empty应用于判断字符串、集合、数组对象是否为null并且长度是否为0 ${empty list} - 获取值 **el表达式只能从域对象中获取值** 语法:${域名称.键名} 从指定域中获取指定键的值 - 对象属性的获取,其实将对象的getter和setter方法去掉前面的get和set, 然后大写字母变小写获得的值就是就可以用EL表达式${对象.属性}即可获得属性值 {gird column="2" gap="15"}{gird-item}{/gird-item}{gird-item}{/gird-item}{/gird}4、JSTL - JSP标准标签库; 用于简化和替换JSP页面上的java代码 - 首先需要导入jstl相关jar包 - 引入标签库:taglib指令 <%@ taglib uri="" %> - 常用JSTL标签 1、if :相当于java中的if 2、choose :相当于java中的witch 3、foreach :相当于java中的for循环{/collapse-item}{collapse-item label="IPV6使用案例" }通过IPV6直接访问NAS设备知乎教程亲测有效测试网络是否支持IPV6,访问IPV6测试网址检测是否能正常访问:test-ipv6.com从外网使用IPv6 ping一下自己:https://ipw.cn/ipv6ping/{/collapse-item}{/collapse}
2021年08月18日
138 阅读
0 评论
0 点赞
2021-07-09
vue子组件向父级(组件)传递数据
组件通信 子组件向父组件通信 案例:点击组件按钮,改变父级数据的值 父级数值为:{{num}} 引入子组件 总结:子组件与父组件去通信(传递数据),本质是子组件的方法绑定父组件的方法,通过方法传递参数到父组件的方法,方法返回的对象然后再传递给子组件 //定义组件 const operation = { template:` + - `, props:["num"], methods:{ //组件方法,去调用父方法实现数据通信 incrNum(){ return this.$emit("plus"); }, decrNum(){ return this.$emit("reduce"); } } }; var app = new Vue({ el:"#app", data:{ num:0 }, //注册组件时:组件的定义要在上面,否则会报错:找不到组件 components:{ operation:operation }, methods:{ numPlus(){ this.num++; }, numReduce(){ this.num--; } } }); <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>组件通信</title> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> </head> <body> <div id="app"> <h2>子组件向父组件通信</h2> <b>案例:</b>点击组件按钮,改变父级数据的值 <h2>父级数值为:{{num}}</h2> <hr> <b>引入子组件</b> <!--在实例中引入方法--> <operation @plus="numPlus" @reduce="numReduce" :num="num"></operation> <hr> <p>总结:子组件与父组件去通信(传递数据),本质是子组件的方法绑定父组件的方法,通过方法传递参数到父组件的方法,方法返回的对象然后再传递给子组件</p> <hr> </div> <script type="text/javascript"> //定义组件 const operation = { template:` <div> <!--vue模板中不允许同时出现两个根元素--> <button @click="incrNum">+</button> <button @click="decrNum">-</button> </div> `, props:["num"], methods:{ //组件方法,去调用父方法实现数据通信 incrNum(){ return this.$emit("plus"); }, decrNum(){ return this.$emit("reduce"); } } }; var app = new Vue({ el:"#app", data:{ num:0 }, //注册组件时:组件的定义要在上面,否则会报错:找不到组件 components:{ operation:operation }, methods:{ numPlus(){ this.num++; }, numReduce(){ this.num--; } } }); </script> </body> </html>
2021年07月09日
232 阅读
0 评论
0 点赞
2021-06-24
给站点添加邮件通知功能
我使用的是LoveKKCommentModify美化版参考链接看到这个插件原作者已经不在维护了,用的这个是又有人维护过的,修复了审核通知;增加了美化的使用过程中还是很陌生,原文安装方法不是很详细,下面是我的详细使用方法{dotted startColor="#ff6c6c" endColor="#1989fa"/}{card-list}{card-list-item} 下载插件安装包LoveKKCommentModify-main.zip下载地址 将下载的压缩包上传到网站插件usr/plugins目录下并解压,注意目录名称更改为LoveKKCommentModify OK,这是去后台插件管理,启用插件->启用后点击设置进行配置即可食用{/card-list-item}{card-list-item} 该插件配置方法有三种:SMTP邮件发送设置、Send Cloud邮件发送设置、阿里云推送邮件发送设置 SMPT、阿里云邮件推送两种方式我都试了下,都配置成功了SMPT方式这里以QQ邮箱为例:发信接口选择SMPT发信人名称最好设置下不要太长,否则有可能会报错:指定的发信人别名格式错误发件邮箱地址、邮件回复地址都填写自己的QQ邮箱SMTP邮件发送设置是重点,配置不好就发不出去消息{gird column="3" gap="15"}{gird-item}{/gird-item}{gird-item}{/gird-item}{gird-item}{/gird-item}{/gird}- SMPT地址:smtp.qq.com - SMPT端口:587 - SMPT登录用户:一般为邮箱地址 - SMPT登录密码:点击邮箱设置->账户->找到账户安全,开启IMAP/SMTP服务获得的一串代码就是登录密码 - 服务器需要验证选中 - SMPT加密模式:TLS加密(应该也可以选择465端口+SSL加密方式,不过我没试) OK,保存设置,弹出已保存设置就成功了!阿里云邮件推送方式参考的是这个作者写的,步骤很详细.{/card-list-item}{/card-list}
2021年06月24日
403 阅读
0 评论
0 点赞
2021-06-24
此内容被密码保护
加密文章,请前往内页查看详情
2021年06月24日
7 阅读
0 评论
0 点赞
2021-04-28
Bootstrap
Bootstrap:概念: 一个前端开发的框架,Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。 Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷。 * 好处: 1. 定义了很多的css样式和js插件。我们开发人员直接可以使用这些样式和插件得到丰富的页面效果。 2. **响应式布局** * 同一套页面可以兼容不同分辨率的设备。 快速入门 1. 下载Bootstrap及文档手册(www.bootcss.com) 2. 在项目中将这三个(css、fonts、js)文件夹复制 3. 创建html页面,引入必要的资源文件栅格系统:概念:将一行平均分成12个格子,可以指定元素占几个格子 通过给不同的元素设置规定好的样式,即可识别在不同的设备中元素占多少格 * 定义元素。指定该元素在不同的设备上,所占的格子数目。样式:col-设备代号-格子数目 * 设备代号: 1. xs:超小屏幕 手机 (<768px):col-xs-12 2. sm:小屏幕 平板 (≥768px) 3. md:中等屏幕 桌面显示器 (≥992px) 4. lg:大屏幕 大桌面显示器 (≥1200px) * 注意: 1. 一行中如果格子数目超过12,则超出部分自动换行。 2. 栅格类属性可以向上兼容。栅格类适用于与屏幕宽度大于或等于分界点大小的设备。 3. 如果真实设备宽度小于了设置栅格类属性的设备代码的最小值,会一个元素沾满一整行。栅格实例:使用lg标记元素:在大屏幕中与小屏幕显示的区别<body> <!--定义容器,使用container或container-fluid属性标记--> <div class="container-fluid"> <!--定义行,使用row属性标记--> <div class="row"> <!--定义元素--> <!-- col-lg-1:介绍一下最后的-1的作用,栅格系统中一行默认12个格子, -1就是在这个标记下就可以允许一行容下12个-1的格子。 尾号相加超过12的就会再占一行 --> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> <div class="col-lg-1">lg-1占一格</div> </div> </div> </body>效果图屏幕缩小后class可以同时使用多种屏幕的属性格式标记,它会自己判断当前屏幕下属于那个属性<body> <!--定义容器,使用container或container-fluid属性标记--> <div class="container-fluid"> <!--定义行,使用row属性标记--> <div class="row"> <!--定义元素--> <!-- col-lg-1:介绍一下最后的-1的作用,栅格系统中一行默认12个格子, -1就是在这个标记下就可以允许一行容下12个-1的格子。 尾号相加超过12的就会再占一行 col-sm-2:在992px-1200px屏幕之间,每个div在每行占2个栅格 整体效果是:在1200px大屏幕中,每个div在每行占1个栅格; 当屏幕缩小到992px-1200px中等屏幕之间时,每个div会变成在每行占2个栅格 当屏幕小于992px小屏幕是,不会向下兼容,每个div占一行 --> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> <div class="col-lg-1 col-sm-2">lg-1占一格</div> </div> </div> </body>效果图Bootstrap的全局样式,理解后见名知意不同的标签,如果它们定义的Bootstrap的class样式是一样的,则它们的外形是一样的<a class="btn btn-default" href="#" role="button">Link</a> <button class="btn btn-default" type="submit">Button</button> <input class="btn btn-default" type="button" value="Input"> <input class="btn btn-default" type="submit" value="Submit">效果图都是如下的:可以点击的按钮btn-default:按钮的默认风格;背景为白色 btn-primary:(首选项)Primary btn-success:(成功)Success btn-warning:(警告)Warning btn-link:(链接)Link
2021年04月28日
83 阅读
0 评论
0 点赞
2021-04-27
帆软JS方法获取报表块中的数据集
最终效果根据报表中的数据情况,去实现动态的标记,当表格中有实际值大于目标值时,需要进行提醒就是需要红点闪烁上篇中的动态背景图就是用来标记作用{callout color="#f0ad4e"}帆软设置动态背景{/callout}实现查询SQL的结果集,目标列直接放置在C3单元格设置为向下扩展,实际列直接放置在D3单元格设置为向下扩展在report3报表块上设置一个初始化函数,编写我们需要实现的JS方法关键点: 点击参数下的+号,添加两个参数a,b把表格中C3和D3值传递进来。传递格式a=report3~C3b=report3~D3this.options.form.getWidgetByName("report4").setVisible(false); //默认隐藏红点闪烁背景 var form = this.options.form; var count = 0;//计数 //便利结果集,进行判断 for(var i = 0; i < a.length; i++){ if(a[i] < b[i]){ count++; } } //当有一个实际值大于目标值的时候,就开始闪烁 if(count>0){ form.getWidgetByName("report4").setVisible(true); }
2021年04月27日
318 阅读
0 评论
0 点赞
2021-04-26
帆软设置动态背景
帆软:企业级Web报表开发工具多屏幕的数据呈现,提高前端开发效率的利器开发需要接触到帆软这个工具,感觉确实很强大,对于报表页面功能开发效率很高!但是使用过程中,设计器内默认只能给组件添加静态的背景,但我需要的是动态的一个背景。然后它也可以支持自定义js,那就试下js设置个背景,结果是可以的!实际操作如下:1、帆软支持JQuery语法,可以在报表块上添加一个初始化事件2、直接在浏览器中F12,Ctrl+Shift+C查找你需要的选择的div块,查看div块的代码3、使用jquery语法,使用合适的选择器选择该div块给它设置background即可//使用子选择器 setTimeout(function() { $(".ui-state-enabled .fr-quick-border-layout div[widgetname='REPORT4_C_C_C_C_C_C']").css({'background': 'url(/webroot/help/picture/background/warning.gif)no-repeat','background-size':'100% 100%'}); }, 1000);
2021年04月26日
183 阅读
0 评论
1 点赞
2021-04-25
maven设置动态模板
Maven设置pom文件坐标时,自动写入模板坐标1、点击File/Settings,打开设置。搜索live --> 点击live Templates2、点击 + 号创建一个新的分组,输入名字cumtom点击OK3、完成上诉步骤后,选中新建的分组cumtom 再点击 + 号,设置模板eg:在Template text中设置如下代码<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8888</port> </configuration> </plugin>4、点击Define设置在什么文件下使用该模板[这里可以选中XML];设置完成点击ok,之后即可在pom文件中直接输入tomcat7就能快速写出设置号的模板
2021年04月25日
131 阅读
0 评论
1 点赞
1
...
3
4