首页 文章 精选 留言 我的

精选列表

搜索[应用与服务编排工作流],共10000篇文章
优秀的个人博客,低调大师

springmvc与mybatis的整合

整合的思路 springmvc+mybatis的系统架构: image.png 第一步:整合持久层(dao) mybatis和spring整和,使用mapper的扫描器自动扫描mapper接口在spring中进行注册 第二步:整合service 通过spring管理service接口 使用配置方式蒋service接口配置在spring配置文件中。 实现事务控制 第三步:整合springmvc 由于springmvc是spring的模块,不需要整合 参数绑定(自定义) <!--conversionService--> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <!--转换器--> <property name="converters"> <list> <!--自定义的类的实现的全路径--> <bean class="cn.persit.ssm.controller.converter.CustomDateConverter"/> </list> </property> </bean>

优秀的个人博客,低调大师

浅谈Gradle(二)与SourceSets

之前写过了一篇Gradle(一),那是根据别人写的文章总结写的,当时其实还是很多不懂,包括我现在对gradle的理解也其实还是似懂非懂,但是还是要写,每次写完之后包括再重新多看几次,都会有新的感悟。然后我想说的是关于Gradle的文章,其实网上写得好的并不是很多,就那一两篇写得比较好,然后其他都是千篇一律,还是比较建议就是看官方的文档,但是官方的文档其实有时候也读不懂他说的到底是个什么意思,所以我这里比较推荐两本书:《Android Gradle权威指南》和《Gradle of Android 中文版》 其实这两本书也并不是把所有的东西都讲得很清楚,但是读之后会至少有个概念。当然如果以前没接触脚本的话估计看一遍还是看不懂,包括我其实看了很多一样的内容,但是现在也还有很多不知道。 一.Gradle 相关的内容比较多,我就不一点一点开始讲,就贴个别人写好的文章出来,但我个人还是比较建议去看书https://www.cnblogs.com/ut2016-progam/p/5871430.html 1.gradle gradle是什么呢,我个人简单的理解就是他是一个构建工具,他有个特性是约定优于配置,他是基于Groovy的领域专用语言(DSL),其实这个DSL我也不懂具体是什么意思。 关于Groovy语言,其实我感觉和js还是比较相似的,是不是所有的脚本语言都一个尿性,建议还是要看一下,其他的都还好,主要需要注意一下它的那个闭包的概念,也就是Closure类型。 2.生命周期 比较重要的一点是gradle的构建过程是有生命周期这一概念的,分为三个阶段: (1)初始化阶段:创建 Project 对象,如果有多个build.gradle,也会创建多个project (2)配置阶段:在这个阶段,会执行所有的编译脚本,同时还会创建project的所有的task,为后一个阶段做准备 (3)执行阶段:在这个阶段,gradle 会根据传入的参数决定如何执行这些task,真正action的执行代码就在这里 其实可以先把每一个.gradle文件当成一个Project ,初始化阶段就是把.gradle变成Project对象,第二个阶段就是创建Project对象里面的任务,我个人理解就是走.gradle文件里面的代码(但是估计这个解释不是很对,我对第二个阶段不是很清楚),第三个阶段就是执行这些任务。 那么什么时候开始走这个生命周期呢,不知道,我没有找到有哪篇文章说这个的,但是从我打印的结果来看,我认为是只要执行某些任务都会走这3个生命周期,比如说Rebuild或者运行程序,都会执行生命周期,比如这段Rebuild时的打印内容 第一个部分就是执行的任务,其实在AS的工具栏点按钮,相当于在命令行输入要执行的命令,第二个部分是我在gradle文件里面写的一些打印的操作,我觉得这个就是配置阶段,因为你修改了Gradle文件中的内容,它需要重新进行配置吧,第三个部分前面有冒号的就是执行任务,也就是执行阶段。 所以对生命周期我是这样认为的,初始化阶段只要setting.gradle文件没变,它就只进行初始化一次,如果这个文件变了,就需要重新进行初始化。然后是配置阶段就是执行项目Gradle和模块gradle里面的代码,每次执行任务都会重新执行配置阶段吧。然后执行阶段就是打印中的最后一部分,很明显能看出,也是每次操作都会执行这个生命周期。 其实我在开发gradle的时候遇见了一个BUG,点击sync now之后,会先跑一遍日记,然后刷新再跑一遍,在第一遍打印的结尾会打印这个 要不是我手快都截不到图,可以看出这时候是配置阶段,而这时候还没生成variant,所以我当时获取variant出现了为空的BUG。我感觉这个阶段也是多渠道资源进行合并的阶段。 3.插件 在android中Gradle还有一个比较重要的概念就是插件。在根目录下的build.gradle文件,也就是整个工程的build.gradle文件 buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } 里面某块表示什么意思,网上也有很多说明,因为我不经常改动这个文件,所以这里我就别在不懂装懂了。 然后就是每个module的gradle文件,这个是比较常用的,一般都会这样写: apply plugin: 'com.android.application' android { ..... } 这个就是插件,gradle里面引用了com.android.application这个插件。这个是一个闭包,如果之前看过groovy就知道,可以看到Gradle里面基本所有的地方都用到闭包的写法。android这个关键字传入的闭包里面的defaultConfig啊buildTypes啊这些都是属于这个插件的内容,但也不一定,因为这个插件是是扩展了java插件,举个栗子,里面的sourceSets就是java插件的。所以要想知道里边具体是怎么配置的,可以搜索这个插件的内容。常用到的就大概这些 defaultConfig是基本的配置信息 buildTypes和productFlavors我在多渠道打包的文章有详细讲 sourceSets就是源集,等下会详细去讲一点其他的详细内容也不太想多说什么,因为一篇文章肯定是写不完所有配置里具体该详细怎么做的,我这里暂时先打算说SourceSets 二.SourceSets SourceSets被称作原集合,一般可以用它来指定资源的路径。 比如我这个地方,我想把两个文件夹中的代码和原文件夹中的进行合并,我可以这样写 sourceSets{ main{ java { srcDirs "src/mtone" srcDirs "src/mttwo" } } } 可以看到这个set,学过java的都知道这是集合,其实gradle里面很多地方可以用java代码去写 我们打印看看这个set是什么 sourceSets{ main{ java { srcDirs "src/mtone" srcDirs "src/mttwo" sourceSets.all{set -> println "${set.name}的文件是 ${set.java.srcDirs}" } } } } } 可以看到打印的结果 set的name其实就是基本和渠道差不多,然后java.srcDirs就是这个set的java文件的路径,这是一个我比较想说的点,前面我说了指定资源路径,java其实是其中一个,我们现在可以来看看大概有什么资源文件 所以你可以写一个文件夹,然后在文件夹写一些资源文件,当你某个渠道想要把这些资源文件加进去的时候,你可以这样写 渠道名{ main{ res{ srcDirs "你自己资源文件夹的路径" } } } 这样就可以在编译时把你自己的资源文件和原项目的进行合并,当然会有一定的合并规则,这个我不多说,你可以百度“资源合并规则”。还有一点是我觉得并不是在编译时才合并的,而是在配置的生命周期时执行sourceSets里面的操作,对所有的资源进行合并。 然后我再说一个场景 我这三个包都要进行合并的,但是出现了这样的一个问题,我想很多人都碰过这个问题,没错,就是重复类的问题,这时我这里的main也就是原本的目录下有个MyTestOne.java类,但是我的mtone目录下也有一个MyTestOne.java类,这时你就没法合并了,这时你编译的话会报一个错误,报重复类的错误。 想想就知道不可能有两个同名类共存,因为如果你调用的话系统怎么知道你是调用了哪个,所以我们的做法是必须在合并的时候去去掉其中一个MyTestOne.java。其实这里也是说我们可以在gradle中动态的去选着给项目指定使用哪个MyTestOne.java。 有人用过gradle的话肯定知道可以使用 exclude来排除,但是如果我们直接这样写的话 exclude 'com/example/kylin/fristtest/MyTestOne.java' 就会把两个MyTestOne.java都给排除,因为他们的包名是一样的,不信你可以试试。所以我们的做法就是要拿到他在合并之前是属于哪个文件夹的,这时候就需要用到set的java路径,因为这个是属于java的部分 sourceSets{ main{ java { srcDirs "src/mtone" srcDirs "src/mttwo" sourceSets.all{set -> println "${set.name}的文件是 ${set.java.srcDirs}" if(name == "main"){ Set myt = java.srcDirs; println myt } } } } } 我们直接这样打印看看 可以看出我的结果这里打印出了三个,这样我们就可以拿到自己想保留的路径下的MyTestOne.java,我们可以这样写 sourceSets{ main{ java { srcDirs "src/mtone" srcDirs "src/mttwo" sourceSets.all{set -> println "${set.name}的文件是 ${set.java.srcDirs}" if(name == "main"){ Set myt = java.srcDirs; println myt myt.each { if(it.name != "mtone"){ exclude 'com/example/kylin/fristtest/MyTestOne.java' } } } } } } } 拿到set之后可以遍历,然后用name获取具体的路径,这样子就可以排除指定路径下的MyTestOne.java。 但是这里不能获取到多渠道的路径,比如我这样写 我多加了ali和baidu的渠道,这里却获取不了,为什么? 因为这里看到外层 没错已经是指定到main的,如果我们想在ali的渠道下弄,我们需要再写个ali的闭包 我们这样写,把引入的资源放到ali中,可以看到结果 可以看出这里有个很奇怪的问题,没错,就是多渠道的文件,可以不用指定srcDirs,他会自动合并,但是自动合并情况下你用set是无法获取到其他渠道的文件,set只能获取在闭包内srcDirs定义的文件。我觉得这个原因是因为你是从上到下执行时打印的,这时候还没有合并,等你的gradle里面写的代码执行完之后,才开始进行合并操作,所以打印的时候还没开始进行合并。 那怎么办,我还想获取其它渠道的文件的话该怎么办,有两个办法,第一个就是在main中用srcDirs指定渠道的文件,我觉得AS默认合并的操作也是指定srcDirs,但是我没试过这种方法,不知道是否可行。 第二种方法就是用File,没错,我之前说过gradle中可以写java的代码,那我其实也可以使用java中的File类来操作文件。 比如说我想获取到src文件夹下的所有文件,我可以这样写,然后顺便打印看看 File file = file('src') File[] tempList = file.listFiles() println "所有文件夹" + tempList 可以看到确实能打印出来,然后你想怎么做,按照java操作File的方式去做就行了。 从这个打印还可以看到一个很有意思的地方,就是他和SourceSets内部打印的顺序是穿插的,我也不知道为什么会这样。 好了,我暂时就只说这么多,还想看详细的SourceSets的操作,可以去看官网的 API ,而如果你想做某些操作而API没有的话,你可以考虑一下用java能不能实现你想要的功能。 还有就是Gradle的内容太多了,而网上很多人讲得都比较浅,上面对SourceSets的操作是我自己在实践中去不断踩坑才总结出来的。所以我只能说Gradle太难了,闭包的思想,还有原理,不同的插件还有不同的操作,而且你在开发时报错的话,查找错误信息还要带点推理的思路去找出错误在哪,说不定你每次运行都会产生不同的错误。最主要是没有找到那种比较去完整理解的教程,所以写这个东西相关的还是挺难的,首先自己就不是很懂,然后还不知道要怎么去组织语言,我这也只能碰到什么写什么了。要是我把这个东西弄懂个七八十,我也不专门写文章,直接写书得了。我想说的是,如过我对SourceSets的操作能帮到你,那当然是好,如果帮不到你,我也没办法,它的内容还是比较多的,我现在肯定也没法全懂,这东西也没人教我,我去踩坑,能写的我都写了,有些坑我没踩过我也不懂怎么处理。 这篇是补上周的,写gradle组织语言有点难,所以上周没能出一篇

优秀的个人博客,低调大师

CentOS基本操作与知识

首先我要说明的问题是对于centOS系统,我们不应该抱着浅尝辄止的态度,有时候有些东西必须要深入,要记录下来。我写这篇文章就是为了把我在学习过程中了解到的东西记录下来,防止以后我有用的时候能够迅速的拾起来! 首先就是对于ls这个基本命令的认识,这是学习Linux命令都是放在第一位去了解的。但是在这之前,我们先来了解一下CentOS系统的目录结构。我以前学的时候就是吃了这个亏,搞不懂目录结构,东西乱放还不知道放在哪里了,安装什么东西全靠教程去搞,很迷糊;下面就来说说这个非常简单的目录结构: 这个图片中root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,#代表用户权限 #表示超级用户,$表示普通用户; 注意除了波浪号,我们发现还会有/的情况,这其实就是根目录。也就是说我们可以明白~和/是不一样的,明白了这一点,东西装在哪里就好说了,值得一提的是/root这个文件就是~代表的目录位置!也就是超级用户的家目录。 了解了这些,我们再来看一下对于LS的命令的一些使用: 我们用 -l 或者 -la 组合 列出详细信息; [root@localhost ~]# ls -l 总用量 4 -rw-------. 1 root root 1237 6月 10 05:24 anaconda-ks.cfg [root@localhost ~]# ls -la 总用量 24 dr-xr-x---. 2 root root 135 6月 11 21:13 . dr-xr-xr-x. 17 root root 224 6月 10 05:23 .. -rw-------. 1 root root 1237 6月 10 05:24 anaconda-ks.cfg -rw-------. 1 root root 0 6月 11 21:13 .bash_history -rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout -rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile -rw-r--r--. 1 root root 176 12月 29 2013 .bashrc -rw-r--r--. 1 root root 100 12月 29 2013 .cshrc -rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc [root@localhost ~]# 这里第一列 比如dr-xr-xr-x. 代表文件类型以及所有者,所属组以及其他者权限 第一位d代表文件类型 常见的有 - 文件 d目录 | 软件链接文件 后面9位 每3位一个组 分别是 所有者u 所属组g 以及 其他者o的权限 权限分三种 r读 w写 x执行 比如dr-xr-xr-x 这个目录 所有者 所属组 以及其他者 都有 读和执行权限; 比如 -rw------- 这个文件 所有者有读写权限 所属组以及其他者没有权限; 第二列 那个数字 是 硬链接次数 后面再说; 第三列 root 是 所有者; 第四列 root 是 所属组; 第五列 是文件大小;假如看不惯 可用 ls -lh [root@localhost ~]# ls -lh 总用量 4.0K -rw-------. 1 root root 1.3K 6月 10 05:24 anaconda-ks.cfg 第六列的日期是该文件最后一次修改时间; 最后一列 是文件名称; 查看目录属性 要加 -d [root@localhost ~]# ls -ld /etc/ drwxr-xr-x. 78 root root 8192 6月 13 15:50 /etc/ [root@localhost ~]# 查看文件的inode属性 类似 主键 唯一识别文件的Id 用 -i [root@localhost ~]# ls -li 总用量 4 33574979 -rw-------. 1 root root 1237 6月 10 05:24 anaconda-ks.cfg [root@localhost ~]# 33574979 就是inode属性 以上就是ls的几个操作,觉得有用的话可以一起交流

优秀的个人博客,低调大师

setTimeout 与 setTimeinterval的区别

这两天一直在ajax的东西,昨天做一个小例子的时候发现了setTimeout这个函数,以前只知道setTimeinterval,发现这两个函数是有一些差别的。在网上搜了一下,作为备忘就转贴一下了。 window对象有两个主要的定时方法,分别是setTimeout 和 setInteval 他们的语法基本上相同,但是完成的功能取有区别。 setTimeout方法是定时程序,也就是在什么时间以后干什么。干完了就拉倒。 setInterval方法则是表示间隔一定时间反复执行某操作。 如果用setTimeout实现setInerval的功能,就需要在执行的程序中再定时调用自己才行。如果要清除计数器需要 根据使用的方法不同,调用不同的清除方法: 例如:tttt=setTimeout('northsnow()',1000); clearTimeout(tttt); 或者: tttt=setInterval('northsnow()',1000); clearInteval_r(tttt); 举一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <div id= "liujincai" ></div> <input type= "button" name= "start" value= "start" type= "button" name= "stop" value= "stop" language= "javascript" > var intvalue=1; var timer2= null ; function startShow() { liujincai.innerHTML=liujincai.innerHTML + "&nbsp;" + (intvalue ++).toString(); timer2=window.setTimeout( "startShow()" ,2000); } function stop() { window.clearTimeout(timer2); } </script> 或者: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <div id= "liujincai" ></div> <input type= "button" name= "start" value= "start" onclick= 'timer2=window.setInterval("startShow()",2000);//startShow();' > <input type= "button" name= "stop" value= "stop" language= "javascript" > var intvalue=1; var timer2= null ; function startShow() { liujincai.innerHTML=liujincai.innerHTML + "&nbsp;" + (intvalue ++).toString(); } function stop() { window.clearInterval(timer2); } </script> 本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/1339907,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册