基于注解整合Spring4、Jersey2与Groovy(非零配置)
众所周知,Servlet3.0作为J2EE 6规范一部分,随J2EE6一起发布,并且Tomcat7已经完全支持,其中就我个人而言,最为关注的就是异步与注解支持,但这么久以来,实际项目中一直不曾使用,近来业余有空,就尝试了一下Servlet 3.0的注解,但这不是重点,关于Servlet 3.0注解@WebServlet的使用,网上一搜一大把,这里不再赘述。
本文的重点是大部分基于注解来整合Spring4、Jersey2与Groovy实现Restful风格接口,为什么说是大部分呢?因为实践中发现个小小的问题,Jersey2.0开始,同样采用新规范,支持Spring加载但目前只支持XML配置形式,毕竟这两个东西不是同一公司出品,完全融合还需要一定的时间去折腾,这里就不自己造轮子了,毕竟写几行XML配置也不是那么的麻烦,当然,如果你有洁癖、如果你愿意基于Spring官方方案实现Restful或者自己实现Jersey2与Spring4的桥接,依然可以保持零配置,这里就不再啰嗦,简单分享下配置示例。 查看更多...
Android View动画进行中事件无效解决方法
Android View动画运行时,在运动的View上绑定的事件将不能被触发,因为诸如点击事件等,触发点是绑定在View控件初始化时所在位置的点击,当动画移动后点击坐标就发生了改变,通过查询一些资料,了解到,Android 3.0以下,动画存在问题,它只移动了View绘制显示的地方,却没有移动View的物理位置,具体底层实现大家可以看源代码了解,我不大清楚底层,这里就不多说了,下面说说简单的解决方法。
只需继承父级布局,覆盖onTouchEvent(或者其他需要捕获的事件)。这里我以FrameLayout为例,因为要捕获点击事件,实现onTouchEvent,然后通过获取当前点击坐标计算出当前点击范围内包含的View控件,找到第一个就直接触发该View的事件,然后break,示例代码如下: 查看更多...
简单处理,让AvalonJS支持cmd
AvalonJS是国内前端大神开发维护的一个迷你MVVM框架,它不像AngularJS大而全,但实现了常见业务逻辑中能用到的功能,这里就不再赘述,欲知详情,可前往官网了解
官网地址:http://avalonjs.github.io/
AvalonJS自带加载器,当然,如果是大的项目,我们可能在引入AvalonJS之前就在使用诸如RequireJS(AMD)、SeaJS(CMD)之类的加载器,而AvalonJS自带的加载器也是基于AMD的,对于我们使用SeaJS的来说,想引入AvalonJS看来只能是在源码上下功夫了。
分析发现,官方提供了关闭加载器的方式,同时也提供了不带加载器的版本,所以如果使用RequireJS作为项目加载器的话,直接关闭自带加载器或者下载无加载器版本(avalon.shim.js)即可,关闭方式如下 查看更多...
IE8及以下浏览器js中日期字符串格式化问题解决
最近一个小项目上涉及日期字符串格式化的问题,由于之前大部分工作中使用现有js框架自带的组件库,并没有注意此类兼容性问题,直到最近才发现,原来在IE8及以下IE版本中,JavaScript的Date函数是不支持new Date("2013-12-31")、new Date("2013-12-31 00:00:00")或者new Date("2013-12-31T00:00:00Z")这样的构造方式的。
网上关于字符串格式化的函数一般都雷同,如下
function dateFormat(dateString,format) { if(!dateString)return ""; var time = new Date(dateString); var o = { "M+": time.getMonth() + 1, //月份 "d+": time.getDate(), //日 "h+": time.getHours(), //小时 "m+": time.getMinutes(), //分 "s+": time.getSeconds(), //秒 "q+": Math.floor((time.getMonth() + 3) / 3), //季度 "S": time.getMilliseconds() //毫秒 }; if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (time.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(format)) format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return format; }
Grails one to many情况下子对象排序
Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。
近期因团队需要使用Grails做开发,临时学习、熟悉一下Grails,以便快速投入开发,熟悉过程中发现,在Grails的 one-to-many 关系中,自动为你添加java.util.set,因此many端的数据顺序是不一定的,看了官方说是可以用SortedSet,也可以用List,List这里我没测试成功(可能是新接触,配置得不对),SortedSet的方式测试可用,这里记录一下。
假设有文章domain Post,评论domain Comment,Post配置hasMany=[comments:Comment],Comment配置belongTo=[post:Post],如下:
Post
package test class Post { String title String content Date time=new Date() SortedSet comments static hasMany = [comments:Comment] static constraints = { } }
Raphael实现数据可视化优缺点
说起Raphael,可是老早就听说了,不过前些年和EXTJS合并后好像不怎么更新了,好在组件没什么bug,更新或不更新都阻拦不了我们兼容IE9以下浏览器的脚步。废话完毕,下面先简单介绍下我们的主角——Raphael
Raphael 是一个用于在网页中绘制矢量图形的 Javascript 库。它使用 SVG W3C 推荐标准和 VML 作为创建图形的基础,你可以通过 JavaScript 操作 DOM 来轻松创建出各种复杂的柱状图、饼图、曲线图等各种图表,还可以绘制任意形状的图形,可以进行图表或图像的裁剪和旋转等复杂操作。正因Raphael对VML的强力支持,使得在IE9以下版本,目前支持的浏览器包括: Firefox 3.0+,Safari 3.0+,Chrome 5.0+,Opera 9.5+ 以及 Internet Explorer 6.0+,实际测试中,甚至IE5都能够实现我们想要的图形、动画效果。
下面展示下Raphael的简介操作,假设页面有一div容器,id为chart,我们可以这样写:
var paper=new Raphael(document.getElementById("chart"),1000,500); 查看更多...
Java结合Groovy让程序支持动态算法
最近项目在做一个度量平台,项目目标是整合大量数据,结合各种度量指标的算法,以图表等形式展现数据优劣趋势等。
至于前台的实现技术、架构等内容不在我们讨论范围内,直接忽略,后台系统架构则采用纯Java的后台,结合多线程、Quartz定时器等技术实现采集、计算,但只是实现了预定义指标、算法的计算(使用系统预定义算法,即程序固定写死的算法)。说这么多,大家应该发现了,问题就在这,大多比较强大的度量系统,肯定有一套自己独有的算法规则,可以使用定义好的规则自定义算法,而我们的系统则是一成不变的固定算法,即便说可以添加,也是改Java代码实现,带来的工作量可是不小,而且系统会越来越庞大,很难维护。
废话不说,下面就大概聊一下这里要出厂的主角——Groovy,Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。看样子是很诱人,而且还可以直接使用而不必编译(这里的不用编译实质上是有点争议的,因为虽然Groovy脚本可以及时生效,但在其作为对象使用时还是使用Groovy本身提供的类库生成了JVM所认识的字节码,只不过我们看不到这个编译后的文件而已,当然,为了运行效率的提高,你依然可以将其编译成class文件,但前提是你写好的*.groovy文件放在编译目录,而且一旦编译,就不能实现我们的动态算法功能了,这里我们要讨论的就是动态算法的融入,故不再赘述)。 查看更多...
EhCache参数及磁盘持久化加载
EhCache是不错的Java开源缓存模块,Cache的配置很灵活,官方提供的Cache配置方式有好几种。你可以通过声明配置、在xml中配置、在程序里配置或者调用构造方法时传入不同的参数。
你可以将Cache的配置从代码中剥离出来,也可以在使用运行时配置,所谓的运行时配置无非也就是在代码中配置。以下是运行时配置的好处:
1、在同一个地方配置所有的Cache,这样很容易管理Cache的内存和磁盘消耗。
2、发布时可更改Cache配置。
3、可再安装阶段就检查出配置错误信息,而避免了运行时错误。
如下是基本的ehcache.xml
<ehcache> <diskstore path="java.io.tmpdir"></diskstore> <defaultcache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"></defaultcache> </ehcache>
你可以配置defaultCache,可用于所有cache,也可以针对每个cache配置不同的xml 查看更多...
关于JS加密解密那点事
最近和ucd部分的前端开发有合作,可曾想他们发过来组件什么的都是加密处理过的,事实上组件又不完善,很多小的bug都要给他们定位,很是头疼,果断解密看看。
很多朋友以为JS的加密是不可逆的,其实常见的eval加密也谈不上是加密,只能算是一种编码(Encode)或者也可以成为是一种打包(packer),类似于base64这样的编码,都是可以以一定方式还原的,当然也就是“解密”了。
仔细观察加密JS,你会发现,大部分文件里面都有function(p,a,c,k,e,r)或者是function(p,a,c,k,e,d),据说这样的pack方式是
使用Spring的getHibernateTemplate()进行批处理(JDBC兼容方案)
一直很抵触hibernate,原因不多说,总知是能不用就不用。最近项目有大量数据导入的需求,一直出现连续导入10w左右就内存溢出之类的情况,开启事物,分页flush session还是挺慢,换对象为SQL,拼装语句块直接执行效果也不理想。看到网上说的使用传统批处理速度要高10倍左右,于是试了试,还算可以。
由于项目其他地方有采用hibernate,甚至还用了iBATIS,不能随意更换框架或者改动接口。
网上很多采用sessionFactory.connection();获取Connection的文章,用过的朋友可能就知道,这个方法在Hibernate3.3.2版本中已被弃用。
替代方法:SessionFactoryUtils.getDataSource(sessionFactory).getConnection();
也可以直接使用:((SessionFactoryImplementor)sessionFactory).getConnectionProvider().getConnection();
获取到Connection后就好说了,做法完全是传统Jdbc的。通过这个方法单独实现一个大批量插入的接口也不是什么难事了,这里不再赘述。