
J2EE
文章平均质量分 73
quzishen
一个程序员,长期满足于代码世界,享受手指敲击键盘带来的愉悦感,混迹于支付宝、网易、淘宝,目前从事于无线领域研究。
本人没有使用该博客开通任何微博,本人唯一新浪微博:http://weibo.com/quzishen
其他同名微博皆为盗用信息,请勿相信其任何与本人有关信息
展开
-
[spring security那点事儿]编写自己的过滤器
<br />通常而言,使用spring security来进行身份验证的同时,还需要进行一些附加操作,注入校验码检查,session中安全信息的检查,用户最后登录流水记录等。不排除这些在ss执行完成后进入某个页面,在其渲染类中可以实现,但是这样的方式从设计角度而言,是拆分了登录的整个独立过程,是属于单纯的实现功能而实现功能。<br />所以这里我们就需要封装底层spring security过滤器,以实现自己需求的过滤器。<br /> <br />先说第一个常用需求:用户登录的时候检查校验码,并且记录用户的原创 2010-09-17 18:57:00 · 6282 阅读 · 0 评论 -
[spring security那点事儿]开发适用于自己系统的安全管理模块
<br />spring security2之后namespace方式使得在配置上大大降低了门槛,一个简单的基础<http auto-config='true'/>就可以搞定一个demo,如果你的系统接受那个单调而古板的ss默认的登录页面和英文的错误提示,那对于你而言,ss只是一个几句话的配置而已。<br />但是实际应用中,我们并不会有那么简单的场景,不管是从用户体验页面交互还是从系统架构,都几乎不太可能使用那个可怜巴巴的默认登陆页面。<br />一个 auto-config='true',ss默认加载了原创 2010-09-06 16:09:00 · 7767 阅读 · 2 评论 -
[Lucene那点事儿]建立索引的一点想法
<br />Lucene建立索引的时候,需要使用到分词器-Analyzer,分词器的作用就是将当前的文本按照分词规则进行分词,然后建立索引,检索结果的精确度很大程度上来自于索引的建立是否合理而准确。<br />lucene提供了一些内置的分词器: * SimpleAnalyzer 这个分词是一段一段话进行分 * StandardAnalyzer 标准分词拿来分中文和ChineseAnalyzer一样的效果 * PerFieldAnalyzerWrapper 这个很有意思,可以封装很多分词方式,还可原创 2010-10-09 10:00:00 · 3647 阅读 · 1 评论 -
freemarker调用java静态方法以及枚举
<br />Freemarker渲染视图采用的是一个 模型+数据 = 页面 的方式,这也是模板渲染引擎的通用模式,对于freemarker渲染页面的时候一些特殊的数据格式转换、随机数获取等需求,如果很难通过freemarker本身的标签完成,可以通过调用java静态方法来完成。前提是这个方法必须是静态。允许传递参数。<br />实现这个需求,使用的便是freemarker的BeansWrapper这个类,他借用TemplateHashModel可以从web容器中获取指定类名的bean并通过传统的如spri原创 2010-11-30 09:40:00 · 19316 阅读 · 1 评论 -
JXL生成的excel文件+JAVA文件下载功能
<br />一个需求,用户点击下载按钮,将指定的excel的报表模板使用数据库数据渲染,然后下载到用户本地;<br />通常而言,对于一个文件的下载,可以有以下几种方式:<br />window.location.href=文件名称URL全路径;<br />window.open(文件名称URL全路径);<br />这种方式不友好的地方在于服务器的目录结构直接暴露出去,而且在IE下很有可能会报错权限问题等,甚至firefox中会触发那个年代久远而依然没有解决的bug。所以这里不推荐。<br /> <br /原创 2010-11-30 11:26:00 · 8118 阅读 · 1 评论 -
随笔
<br />博客很久没更新了,主要是因为最近长假里,写了代码不想总结,怕总结的不好以后再回顾的时候总是不知所以然。今晚突然很想写点什么。<br />昨天去谈了一个项目,做一个客户端和服务器端一整套的交互系统,有点难度,承诺了回来分析功能点并给出报价,昨天还在市区,找了一家KFC打开visio就开始做分析,吵杂的很,也不能全心投入,总是有些讨厌吵闹。<br />简单分析了一下,大概有40多个功能点,还是部分的。至于报价,今天中午休息的时候跟朋友抽空说了一下,顶了一个数字,说实话我有点不太想做这个项目,并非没有原创 2010-10-11 18:42:00 · 805 阅读 · 0 评论 -
使用ANT发布项目
<br />通常在eclipse中开发的web工程,测试的时候都会直接采用右键点击工程名称 -> run as -> on server -> 选择tomcat./jboss -> 启动运行 的方式,在开发阶段,这样的方式不但方便,而且基本上很多的问题都是eclipse帮我们完成了。<br />但是如果项目发布上线了,这个时候该怎样将项目发布上线呢?<br />很简单,就是将生成的class文件,资源文件,模板文件,图片,js,样式等等系统所需的文件,拷贝到tomcat下,新建一个目录比如photograp原创 2010-12-07 13:11:00 · 3636 阅读 · 0 评论 -
[Ibatis] Ibatis批量操作(增/删/改)
<br />Ibatis批量操作,代码模板如下:<br />/* (non-Javadoc) * @see com.normandy.position.dao.NorTradeDAO#batchUpdateOrderList(java.util.List) */ public void batchUpdateOrderList(final List<NorTradeDO> list) { if(null == list || 0 == list.size()){ throw n原创 2010-11-05 10:09:00 · 1366 阅读 · 0 评论 -
[lucene]索引建立
<br />Lucene索引建立的过程,类似于将数据进行关键字提取,设置标签,在后续工作中,可以通过这个标签进行内容过滤获取期望数据的操作。<br />lucene建立索引过程很简单,归结起来,就是:<br />获取数据 -> 设置建立索引规则 -> 建立索引 -> 写入磁盘/内存<br />建立索引涉及几个类:<br />1、 IndexWriter<br />执行索引写操作,并且控制索引建立过程的各种参数。包括参数:<br />1)索引存放位置<br />索引存放位置有两种:磁盘 和 内存<br />所原创 2010-12-30 14:32:00 · 3777 阅读 · 0 评论 -
[lucene]初探bobo-browse
<br />Bobo-browse是一个基于lucene的分面搜索插件,可以完成对搜索结果的分面统计,比如“男装(221) 女装(332)”等。<br />这里做首次尝试,只谈使用,不谈原理。用熟了才有可能去研究仔细。<br />lucene3 + bobo-browse2.5<br />建索引,更新索引跟它没关系,仅关注搜索。索引建立好后,开始进行分面搜索。<br />bobo-spring.xml <br /><?xml version="1.0" encoding="UTF-8"?><bean原创 2011-01-07 16:15:00 · 3483 阅读 · 2 评论 -
Json 一种轻量级的数据通信格式
<br />Json是一种基于js的轻量级数据交换格式,独立于特定的语言,其中对于信息的保存使用特殊的符合来实现不同的数据结构。可以构建两种基本数据结构:<br /> <br />1、对象<br />对象的概念类似于面向对象语言中的逻辑,采用 key/value的方式保存数据,同时使用{}包含来表示对象;如:<br /> <br />{name:'quzishen',company:'netease',department:{d1:'hangzhou',d2:'tech',d3:'dir'}}<br />原创 2010-11-16 11:15:00 · 6067 阅读 · 0 评论 -
[jms那点事儿] JMS 消息传送模式、消息签收以及spring jmsTemplate配置
<br />Activemq支持两种消息传送模式:PERSISTENT (持久消息)和 NON_PERSISTENT(非持久消息) <br />从字面意思就可以了解,这是两种正好相反的模式。<br />1、PERSISTENT 持久消息<br />是activemq默认的传送方式,此方式下的消息在配合activemq.xml中配置的消息存储方式,会被存储在特定的地方,直到有消费者将消息消费或者消息过期进入DLQ队列,消息生命周期才会结束。<br />此模式下可以保证消息只会被成功传送一次和成功使用一次,消息原创 2011-01-12 14:27:00 · 17769 阅读 · 3 评论 -
[jms那点事儿] JMS ( java message service )入门 + activemq消息持久化
JMS 即 java message service 是为java提供了一种创建、发送、接收消息的通用方法。可以将复杂的系统进行业务分离,变成灵活的高度解耦合的布局。同时对我们的日常业务需求开发,提供了非常灵活的业务解决方案。比如缴费还款送积分,送积分的业务逻辑不能影响到缴费还款的业务逻辑,所以最好的,就是缴费/还款逻辑执行完成之后,通过一种方式告诉积分系统,给用户发送积分,发送积分的结果不要影响到复杂的缴费还款的过程。这种情况下,采用jms进行异步处理,便是一个很好的选择。要使用消息的方式来进行系统交互,原创 2011-01-11 12:42:00 · 14295 阅读 · 18 评论 -
[jms那点事儿]Activemq集群部署
<br />集群部署,貌似activemq并不理想,分享一个链接吧暂时<br />http://wenku.baidu.com/view/6989622de2bd960590c67760.html<br />暂时没时间去太深入研究<br /> <br />之前看到一个同学写的博客讲到activemq他们目前平均吞吐量由4000/秒,4K的消息,这个量下,我感觉一般的应用足够了,只要做足了单点部署的备份工作。原创 2011-01-14 11:53:00 · 3093 阅读 · 2 评论 -
[Drools]JAVA规则引擎 -- Drools
Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。 1、Drools语法开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要穿进去参数,其次要获取到接口的实现执行完毕后的结果,而drools也是一样的,我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。在drools中,这个传递数据进去的对原创 2011-01-25 14:33:00 · 213929 阅读 · 49 评论 -
[Drools]JAVA规则引擎2 -- Drools实例
上一篇文章 http://blog.youkuaiyun.com/quzishen/archive/2011/01/25/6163012.aspx 描述了一些常用的drools的语法标签和一个模拟实例即发送积分的场景,这一片优化了一下代码,在此贴一下,希望有这方面使用经验的朋友多多交流沟通,指正不足。通常而言,习惯上我们将规则放到文件系统中,比如以drl结尾的规则文件,现在我们要扩充一下,使其放到数据库中,以供多台服务器同时使用,同时依然保留文件系统的支持。先看下一个接口:/** * 规则接口 * @autho原创 2011-01-26 14:17:00 · 21463 阅读 · 15 评论 -
dwr+spring security在方法权限判断失败后的一个问题
<br />简单记录一下,debug了N久代码,还是尚未彻底搞明白这个问题,只是懵懵懂懂,servlet的代码进不去了,ss的代码倒是没发现什么情况,反而在cglib的代码中,看到不少非主流的情况。<br /> <br />现象: dwr异步请求过程中,调用了一个具有权限控制的代码,调用这个代码需要特定的角色才可以,通过判断,当前的用户并不具有这个权限,所以不允许被调用,按照ss的习惯,应该是抛出一个Access 拒绝的异常,然后通过匹配403的相关配置定位到错误页面或者在本页面显示错误信息。但是现在的情况原创 2010-09-08 18:29:00 · 2409 阅读 · 0 评论 -
[spring security 那点事儿]配置方式
这段时间一直开发的B2C的网购平台已经完成了将近一半的功能,突然觉得自己之前对于权限管理方面的hold决定将给后面带来不小的工作量,所以决定现在就加入权限判断的功能。很容易联想到spring security来做这个事情,先看看一个官方文档的翻译版本:http://www.family168.com/tutorial/springsecurity/html/springsecurity.html写的有些简略,但是足以能step by step的执行下去。这里总结一下今天通过命名空间方式的配置过程吧。既然要做原创 2010-09-02 18:27:00 · 10298 阅读 · 1 评论 -
[CKEditor那点事儿]使用java开发ckeditor的浏览服务器文件功能
<br />接上篇文章,本章节讲述使用java语言的ckeditor服务器文件浏览功能。<br />// 虽然两篇文章的代码都带有文件类型参数,但是此处不进行判断非法格式,仅以图片类型为主介绍控件功能的开发过程。<br />上篇文章中,在CKEDITOR的图片选择页面,我们增加了一个浏览按钮<br /> <br /> <br /> <br />我们希望点击浏览服务器可以去服务器直接选择已经通过其他方式上传的图片,依旧很痛苦的是,我们没有那么多的银子去购买图片服务器,所以在应用中开辟了特定的区域来存放图片,并原创 2010-08-24 16:06:00 · 7609 阅读 · 12 评论 -
[spring]事务传播级别隔离级别以及高并发下的应用经验
事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题。事务最重要的两个特性,是事务的传播级别和数据隔离级别。传播级别定义的是事务的控制范围,事务隔离级别定义的是事务在数据库读写方面的控制范围。以下是事务的7种传播级别:1) PROPAGATION_REQUIRED ,默认的spring事务传播级别,使用该级别的特点是,如果上下文中已经存在事务,那么就加入到事务中执行,如果当前上下文中不存在事务,则新建事务执行。所以这个级别通常能满足处理大多数的业原创 2010-07-26 15:03:00 · 4034 阅读 · 0 评论 -
[心得]高并发访问量下采用SOA架构异步交互的解决方案 - 纪念一个项目
<br />mark 编辑中ing……原创 2010-07-27 23:41:00 · 1599 阅读 · 3 评论 -
[框架那点事儿-快速开发季]编写自己的数据持久层(3)
再上一篇文章[框架那点事儿-快速开发季]编写自己的数据持久层(2)主要讲了针对于查询API的实现,其中包括三个API:// 查询单个对象public Object queryForObject//查询对象列表public List queryForObjectList//查询对象列表,根据指定字段排序public List queryForObjectListOrderRow在日常开发过程中,我们需要的查询可能不止这简单的三种,查询DO对象是一种方面的方式,另外的,对于其中部分属性的查询,上面的API虽然能原创 2010-07-29 12:30:00 · 1366 阅读 · 0 评论 -
[框架那点事儿-快速开发季]编写自己的数据持久层(2)
在上一篇的[框架那点事儿-快速开发季]编写自己的数据持久层(1)主要讲述了利用反射原理隔离具体数据库表和字段,抽象通用而简洁的数据库持久层API的思路。其中重点讲解了insert新增方法的实现过程,其中部分代码在后续的开发过程中,将会部分重构,以提高复用性。这一篇,我们来讲述查询API的封装,重点讲述两个API :/** * 查询单一对象 * * 要求:遵循spring风格的getter和setter方法 * 属性的名称和数据库的名称要对应,大小写不区分 *原创 2010-07-27 21:42:00 · 2124 阅读 · 3 评论 -
[框架那点事儿-快速开发季]编写自己的数据持久层(4)分页查询
上一章节讲述的查询,都是不带分页的查询,但是在实际应用中,有相当一部分的需求是针对于分页查询的,比如页面的分页功能等。所以,作为底层的API,势必不能缺失针对于分页的查询接口封装。这一章节,我们提供以下几个分页查询,分别针对于:对象查询、部分字段查询两大类。/** * 分页查询对象 * * 根据指定参数分页查询对象列表 * 用法示例: * ---------------------------------------------------------- * /原创 2010-07-29 13:37:00 · 1655 阅读 · 1 评论 -
[框架那点事儿-快速开发季]编写自己的数据持久层(5)更新/批量更新/批量插入
在前面几篇文章中,我们进行了针对于单值插入,查询(多种)的API的封装,在日常开发过程中,更新是最重要的操作之一,所以在接下来的文章中,将重点针对于更新操作进行封装。目标是封装出简便易用的API,提高开发效率。本章节增加三个针对于对象的更新操作API: 1、单个对象的更新2、批量插入3、批量更新其中单个对象的更新,我们依赖于组装update的sql来使用jdbcTemplate的update方法完成。对于批量更新,我们使用batchUpdate来完成,我们要做的工作,主要是提取其中针对于setValue的重原创 2010-07-29 22:13:00 · 3118 阅读 · 5 评论 -
[框架那点事儿-快速开发季]编写自己的数据持久层(7)总结篇 代码
AbstractBaseDAO.javapackage com.normandy.position.common;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.s原创 2010-08-03 21:16:00 · 2031 阅读 · 3 评论 -
[小插曲]spring+freemarker中文乱码了,囧
<br />spring + freemarker 中文乱码了,其实是配置的时候粗心忘了配置viewResolver的编码,只配置了freeMarkerConfigurer的default-coding。<br /> <br />配置一下即可:<br /> <br /> <bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <pro原创 2010-08-03 15:43:00 · 1639 阅读 · 0 评论 -
[框架那点事儿-快速开发季]编写自己的数据持久层(7)总结篇
在前面的六篇文章中,针对日常开发常用到的DB的操作对spring框架的jdbcTemplate进行了一定的封装,从增删查改四个方面,针对于全字段、部分字段、单一、批量几个方面展开来一一封装,提供了30多个API,基本能够覆盖日常开发所需的DB操作,降低一定的工作成本,提高工作效率。在这个封装的过程中,遇到了不少在进行这个专题工作前没有思考到的问题,也伴随着不断的代码新增、重构优化,将能考虑到的问题解决,首先先总结一下,自己都遇到哪些方面的问题:1、数据库中获取数据如何交给DO类?同样的,在避免代码中出现sq原创 2010-08-02 21:10:00 · 6634 阅读 · 139 评论 -
[Memcache] 初探Memcache
Memcache (http://memcached.org/)memcache 是一种分布式缓存服务器,和通常使用的非分布式的ecache不同,memcache需要独立的服务器支撑,客户端通过配置IP地址和端口号(默认11211)与之连接并使用API进行数据的缓存操作。所以自然的memcache分成两个角色:服务器端和客户端。服务器端是独立的memcache服务器,可以去官方网站下载相应的windows或者linux的包,安装的自己的机器上,目前貌似官网不再提供现成的exe文件,而是提供了一个re原创 2010-08-04 15:51:00 · 5769 阅读 · 0 评论 -
[lucene第二季]利用缓存辅助精确更新索引
在上一篇的lucene的入门篇中,我们编写了一个帮助系统,从数据库中将具体的信息获取出来并使用CJKAnalyzer分词后建立索引,提供针对于关键字的搜索服务,其中我们采用定时器的方式每隔10分钟更新一次索引,更新的方式为先删除所有的索引,然后重新建立索引。这样的做法效率低下,直接限制了应用场景的小数据量化,一旦数据量较大,则删除索引和建立索引所带来的系统性能的耗费与搜索本身的开销相比得不偿失。现在我们将改进一下这个刷新机制,同时采用一些其他手段来提高搜索的效率。我们希望每次的索引的更新,只更新那些修改过的原创 2010-08-10 14:32:00 · 3027 阅读 · 4 评论 -
[拦截器]关于拦截方法调用其他内部方法无法被拦截问题的解决
<br />拦截器的实现原理很简单,就是动态代理,实现AOP机制。当外部调用被拦截bean的拦截方法时,可以选择在拦截之前或者之后等条件执行拦截方法之外的逻辑,比如特殊权限验证,参数修正等操作。但是如果现在一个需求是,当外部调用拦截bean的时候,不但要执行拦截当前方法,如果当前方法内部同时调用了其他内部方法,也要被拦截。按照目前的拦截器实现逻辑,是无法拦截当前方法内部调用的方法的,这样说有点抽象,看一个代码:<br />public class BeanA{public void method1(){原创 2010-08-11 12:38:00 · 16354 阅读 · 2 评论 -
[lucene第三季]Lucene那点事儿-总结篇
<br />前面两篇文章,简单尝试了lucene的一些应用,还是再回头想想我们的需求吧,我们希望能够开发一个淘宝一样的针对商品的搜索服务,提供多种条件的组合搜索,并且对于性能提出了一定的要求。同时我们希望这个小型的搜索引擎具有一定的通用性,也就是在可以预见的将来,我们可能用它进行店铺等信息的搜索,所以在我们的搜索代码中,不能织入特定的业务逻辑代码,而应该进行一定的抽象,抽离出一个通用的模型。<br />我们的需求很简单:<br />1、单值搜索<br />2、单值分页搜索<br />3、组合条件搜索<br原创 2010-08-13 13:33:00 · 2081 阅读 · 0 评论 -
[lucene那点事儿]想说爱你很容易
<br />内容提要:<br />---------------------目录开始--------------------<br />1、索引精确刷新问题<br />2、利用缓存提高索引批量更新拦截器的性能<br />3、针对不同的数据来源建立不同的索引并分域存放<br />4、引入xml配置文件的方式实现索引建立的动态配置<br />5、单值搜索、组合条件搜索等多种搜索功能的实现<br />6、其他以及单元测试<br /> ------------------------目录完-------------原创 2010-08-16 21:35:00 · 1978 阅读 · 1 评论 -
[lucene那点事儿]继承RangeFilter编写数字型过滤器
Lucene提供了多种针对于区间的查询的实现方式,诸如RangeQuery和RangeFilter等,通常而言,RangeQuery是最容易联想的方式,使用起来很非常的简单,但是,使用它却很容易出现TooManyClause exception,我在另一篇文章http://blog.youkuaiyun.com/quzishen/archive/2010/08/17/5818068.aspx 已经讲述了出现这个问题的原因。而且,这种方式很容易造成内存溢出,使系统的运行受到严重影响。所以推荐的,是使用RangeFilte原创 2010-08-18 12:56:00 · 4661 阅读 · 4 评论 -
[CKEditor那点事儿]使用java开发ckeditor的文件上传功能
关于CKEditor的使用,网络上有无数的文章,这里不再赘述。而关于java支持的文件上传功能,网络上同样有千千万万的文章,但是遍历十几二十篇就会发现,千篇一律的抄袭,各种爬虫程序带来的互联网信息垃圾给我们的信息获取带来很大的障碍。那些使用java开发CKEditor上传和文件浏览功能,千篇一律的使用的是Servlet的方式,传统的JSP下的模式,不管现在框架已经发展到何种境界,都是一样的照搬,抄袭,让人很无奈,其实这是一个很简单的功能,就是获取请求,上传文件,返回结果而已。通常我们的项目会使用spring原创 2010-08-24 11:40:00 · 23228 阅读 · 26 评论 -
[装饰者模式]经典的星巴克咖啡问题解决方案
<br />在星巴克咖啡中,随意的点取咖啡种类以及配料的场景,如果使用传统的逻辑控制,产出的将会是一片非常不优雅的代码,而几乎每个例子中都会使用这样的一个场景,来引出装饰者模式的介绍。<br />装饰者模式通常有着如下的特点:<br />1、装饰对象和被装饰对象通常有着相同的接口,实现相同的操作;<br />2、装饰者对象中要含有被装饰对象的实例;<br />3、装饰者只是增加了附加功能,而不会去更改被装饰对象的实现逻辑;<br />从上述的描述中,我们可以抽象一下几个领域模型:<br />1、共同的接口,原创 2011-03-04 16:16:00 · 3988 阅读 · 0 评论