2007-04-19

初识Lucene

关键字: lucene
前言         目前处于工作交接阶段,比较清闲,花了几天时间看了Lucene,了解一下这个老总一直说要用之来解决项目中的问题的东东。Lucene的原理相对简单,有几篇文章很好地进行了介绍,见参考资料,这里只是按自己的理解整理一下。Lucene In Action对具体的细节有比较深入的介绍,遗憾的是该书是针对1.x版本的,新版本有很多变化,不过不影响对其原理的理解。          要想从海量数据中快速地查找需要的信息,比如用户想 ...
2007-04-13

试用JBoss Rules

关键字: rules 规则引擎
前言 这两天研究了一下JBoss Rules,最大的感觉是JBoss Rules的文档写得不错,而且Eclipse IDE插件的功能也挺不错,相比JBoss JBPM好多了。 个人觉得规则引擎就是把一堆if/else逻辑从业务代码转移到配置文件中,这样如果业务规则发生变化就不用更改代码,而且如果描述这种规则的语言足够清晰明白,更改业务规则的任务就可以由业务人员来完成了,Domain Specific Language就是来干这事的。 JBoss Rules的内部机制,这里就不再详细介绍了,已经有先行者对JBoss Rules的参考手册进行了整理,参见www.blogjava.net/gu ...
基本概念  OGNL全称是Object-Graph Navigation Language,是一个用来获取和设置JAVA对象的属性的表达式语言。通过使用表达式语法导航对象图,而不是直接调用对象的获取和设置方法可以提供许多应用。比如在XML文件或者脚本文件中嵌入OGNL表达式语法,在JSP页面展现层使用OGNL表达式语法。类似的应用有Velocity,Freemark,Webwork。 如何使用 最简单的使用是直接使用ognl.Ognl类来评估一个OGNL表达式。 Ognl类提供一些静态方法用来解析和解释OGNL表达式,最简单的示例是不使用上下文从一个对象中获取某个表达式的值,示 ...
概述 这篇文章是英文教程的中文翻译,有些认为暂时使用不到的特性有省略,英文文档参见http://www.opensymphony.com/quartz/wikidocs/TutorialLesson1.html。 如何使用 使用QUARTZ调试程序之前,必须使用SchedlerFactory实例化Scheduler。一旦实例化Scheduler后可以启动或者停止,需要注意的是一旦Scheduler关闭,必须重新实例化后才能够重启。任务只有在Scheduler启动后才会执行。 下面的代码片断实例化并启动Scheduler,然后执行一个任务。 java 代码 ...
概述  以前在公司用Confluence记录一些整理的文档,现在移交到JAVA EYE,下面的文档还是基于DWR1.0版本的。 DWR是一个AJAX开源库,允许浏览器端调用服务器端的JAVA函数,就好像这些函数是在浏览器端。DWR包含两个主要的部分: 一个JAVA SERVLET运行在服务器端,处理请求并发送响应给客户。 JavaScript运行在浏览器端,发送请求并动态更新网页。 DWR通过基于JAVA类动态的生成javascript脚本来实现,这些代码在后台做一些AJAX操作,实际上是服务器在执行代码,DWR来回执行数据序列化和反序列化。调用 ...
Spring对事务管理提供完整的支持,包括:         提供一致的编程模型。         支持声明式事务管理。         支持简单的API来编程事务管理,而不用和类似JTA一样复杂的事务管理API打交道。         和Spring的抽象数据源较好地整合。 核心概念  &nbs ...
概述         Spring 2.0引入了一个简单而强大的机制,使用基于模式和@AspectJ注记样式实现自定义方面。Spring当前仅支持方法执行连接点而不支持字段拦截。Spring AOP框架的目标并不是实现完整的AOP实现,主要目的是帮助IOC容器解决一些企业应用的常见问题。Spring AOP框架通常需要和Spring IOC容器一起使用,方面使用通常的Bean定义语法。如果需要一个全面的AOP解决方案,AspectJ是更好的选择。       & ...
概述         org.springframework.beans和org.springframework.context包提供Spring框架的IOC容器的基本功能,BeanFactory接口提供一个高级的配置机制用来管理对象,ApplicationContext接口是BeanFactory接口的子接口,添加一些额外的功能,比如AOP特性,资源处理,事件派发和应用层特定的上下文(比如WebApplicationContext)。         ...
对象操作 实体状态         自由状态……实体对象在内存中自由存在,与数据库中的记录没有任何关联,处理自由状态的实例可以通过Session的save方法转换成持久状态。         持久状态……实体对象处于由Hibernate框架所管理的状态,持久状态的对象其变更将由Hibernate固化到数据库中,持久对象对应数据库中的一条记录。     & ...
        问题描述:使用Struts2.0.6+Sitemesh2.2.1+Freemark2.3.8的过程中,装饰Action请求的结果页面不会有问题,但是如果装饰直接访问的JSP页面会出现如下错误: java 代码  javax.servlet.ServletException: Error applying decorator: null         ...
文件上传 基本原理         上传文件是由FileUploadInterceptor实现的,基本原理是这样的,FileUploadInterceptor会从上传的数据中解析出上传的文件名称,文件类型和文件内容,调用Action相应的方法进行设置。         假定上传表单中File控件的名称是upload,则Action必须实现如下三个设值方法: setUploadFile……保存上传的文件内容 setU ...
概述         Struts 2.0提供一个Sitemesh插件,允许在Sitemesh模板中使用Struts标记。         要使用Sitemesh需要包含Freemark,Sitemesh和Sitemesh插件库文件。 配置过滤器 如果需要使用Freemark模板文件作为装饰器文件,需要在web.xml文件中添加如下配置: xml 代码 <filter>   &nb ...
Token拦截器 问题描述         提交表单时,可能出现这样的情况,如果上次提交成功,按浏览器的返回按钮,再提交一次会出现同一份数据提交两次的情况。如果这份表单不幸两次写入数据库,可能会赞成问题。         Struts提供两个拦截器用来阻止这种用户无意的行为可能导致的重复提交问题。 实现过程 1.在提交的表单中,添加<s:token/>标记。 2.配置TokenInterceptor或TokenSessionIn ...
概述         Struts2.0提供一些UI标记,封装了错误显示,提示等逻辑(用起来还不错),这些UI标记是基于模板技术实现的,缺省是基于Freemark模板技术,如果有能力可以实现自己的模板引擎,很少有这种需求。       该模板引擎会将标记与对应的模板文件联系起来,然后解析为HTML片断返回。这些模板文件会封装相应的逻辑。       框架缺省提供基于xhtml,xhmtl-css,ajax等几套模板,一套 ...
概述         Struts 2.0目前支持基本验证,客户端验证,Ajax验证,因为Ajax验证需要DWR和Dojo的支持,Dojo的性能一向不是很好,而且使用相当复杂,因此个人倾向于仅使用基本验证功能,下面介绍如何使用基本验证。 注册验证器         如果需要添加自定义的验证器实现,必须进行注册,最简单的注册方法是创建一个validators.xml,保存在WEB-INF/classes目录下,如果仅使用系统提供的验证器,这一步可以省略 ...
全局资源文件 可以在struts.properties中配置全局资源文件,示例如下: java 代码 struts.custom.i18n.resources = application   查找顺序 struts按照如下顺序查找资源文件         1.ActionClass.properties          2.BaseClass.proper ...
概念         注记类型是一个注记的名称,有缺省值和一些相关信息。注记是使用一个注记类型将一些信息和方法,类或者变量关联起来。 注记类别         有三种类别的注记: 1.标识注记没有成员,注记名称包含需要的信息。 2.单值注记只有一个value成员。 3.多值注记有多个成员对。 标准注记类型         1.Java.lang.Over ...
范型   具有参数化类型的类的继承关系是基于类而不是参数的类型的,比如List[Integer]是一个 Collection[Integer],但是不是一个List[Object]。  为了保证向后兼容性,可以将一个参数化类型转化成一个非参数化的原始类型,但是这会造成类型安全漏洞。范型仅提供编译时类型安全,如果你的代码使用Java 5.0编译器编译而没有得到任何unchecked警告,那么你的代码也是运行时类型安全的,但是如果你的代码有unchecked警告而又需要和遗留代码一起使用原始类型操作集合,那么需要一些额 ...
前言 JUnit框架通过几个接口就实现了一个灵活的测试框架,借研究Spring测试帮助类之机,重温一下。 主要接口  Test         描述测试的接口,核心业务方法run(TestResult result)方法用来运行测试,并收集测试结果。 TestCase         一个TestCase可以用来定义多个测试,框架支持两种方式运行一个测试,静态方式下,可以通过重写runTest方法,定义需要激活的测试方法, ...
所有针对实例变量的调用,都是通过get方法实现的,而这些get方法有可能就是程序的扩展点。 除info级别日志外,其他级别日志都会调用isXXXEnabled方法,应该是可以避免日志的一些性能损失。 提供了非常完善的错误检测以及日志记录,有些方法的功能代码只有一句,错误检测及日志代码却有N句。  每个方法都是高内聚的,方法名称直达其意。 代码注释极为详细,对设计意图,如何使用,应该注意事项都描述得非常清楚。    国外很多开源代码的风格都极为类似,真不知道 ...
2007-03-09

解析Spring提供的测试帮助类

关键字: Spring
前言        Spring提供了几个单元测试的帮助类,能极大地提高编写测试用例的效率,下面剖析一下这几个类的功能。 ConditionalTestCase         扩展TestCase类,重写了runBare方法,在执行每个测试方法前调用isDisabledInThisEnvironment判断是否需要继续执行此测试方法。子类可以重写isDisabledInThisEnvironment方法确定是否需要禁止某些测试方法。 AbstractSpr ...
2007-03-07

Spring的几个过滤器

关键字: Spring
编码过滤器 org.springframework.web.filter.CharacterEncodingFilter的主要功能是设置每个请求的编码,因为当前的浏览器实现通常不会设置请示的编码,即使在HTML页面中指定编码。 此过滤器有两个关键属性,如果forceEncoding属性为true,过滤器会使用encoding的属性值重设每个请求的编码。 Open Session In View 过滤器 参考calvin.blog.javascud.org/post/46.htm org.springframework.orm.hibernate3.support.OpenSessio ...
2006-12-21

[翻译] FreeMarker快速上手

关键字: freemarker
创建Configuration实例 首先必须创建一个freemarker.template.Configuration 实例并调整其设置。Configuration 实例保存freemarker的设置,同时处理预解析的模板的创建和缓存。 通常应用程序的生命周期中只会创建一个Configuration实例。 ...
概述         我们公司是没有正规的测试人员的,对一个模块而言,功能是否完成都是由开发人员手工测试。项目后期经常发生这样的情况,开发人员更改一个BUG,自已测试表示通过,但是发到客户那却发现,BUG是改好了,以前正常工作的功能却不能工作了。对一个模块来讲,更改一个部分的代码,可能会造成连锁反应,如果要保证不会造成其他功能不受影响,必须进行全面的测试,这在项目后期,频繁更改BUG时,肯定是不现实的。 鉴于这种状况,考虑将Selenium引入到项目中。      &nb ...
2005-05-31

初识AOP

问题的出现         OOP通过封装,继承和多态能够将现实世界的真实实体及其相关行为进行抽象,形成一个从上到下的对象结构层次,从而达到一定的封装,重用的目的。        但是当处理扩展到一些与对象无关的公共行为的时候,OOP就有点无能为力。比如说日志功能(如清单1),可能会散布在整个对象层次结构中,这样造成的问题是:        冗余:很多相同的代码散布在整个系统的 ...
2005-05-30

依赖注入

关键字: IOC
依赖注入 动机  依赖注入主要是为了解决使用者对服务的具体实现的依赖,解除使用者对服务的具体实现的依赖.  基本思想 依赖注入通过一个单独的装配器来获取服务的具体实现,并将获取的实例配置给使用者.这样解除了使用者和服务的具体实现之间的依赖关系,使用者和服务之间通过接口的契约进行关联.一旦定义好接口,两者之间就是透明的. 实现方式          构造子注入:使用者类必须声明一个构造函数,其中包含所有需要注入的元素.PicoContainer容器推荐采用这种方式. & ...