分类‘编程代码’

基于注解整合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方式是dean edwards提出的,你可以访问其个人主页以获取这方面的最新信息。后来还有一些编码打包方式也是eval开头,但是特征字符串p,a,c,k,e,r(d)改变了,我们姑且称为是这种打包方式的一个变种吧,其实解码很简单,我们回顾一下JavaScript脚本中eval含义及用法。 查看更多...

使用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的。通过这个方法单独实现一个大批量插入的接口也不是什么难事了,这里不再赘述。