程序员便利贴
分类: Java | 评论

Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点。使开发者能更深入的 了解其内部实现机制。 Struts开放源码框架的创建是为了使开发者在构建基于Java Servlet和JavaServer Pages(JSP)技术的Web应用时更加容易。Struts框架为开放者提供了一 个统一的标准框架,通过使用Struts作为基础,开发者能够更专注于应用程序的商业逻辑。Struts框 架本身是使用Java Servlet和JavaServer Pages技术的一种Model-View-Controller(MVC)实现. 具体来讲,Struts的优点有: 1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现. 2. 有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率。另外,就目前国 内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。 3. 页面导航.页面导航将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的 维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。 4. 提供Exception处理机制 . 5. 数据库链接池管理 6. 支持I18N 缺点: 一、 转到展示层时,需要配置forward,每一次转到展示层,相信大多数都是直接转到jsp,而涉及到转向,需要配置forward,如果有十个展示层的 jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之 后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器,如果业务变更复杂频繁的系统,这样的操作简单不可想象。现在就是这样, 几十上百个人同时在线使用我们的系统,大家可以想象一下,我的烦恼有多大。 二、 Struts 的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了 线程安全的问题。 三、 测试不方便. Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难 实现。不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试。 四、 类型的转换. Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons- Beanutils进行类型转化。但它的转化都是在Class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。 五、 对Servlet的依赖性过强. Struts处理Action时必需要依赖ServletRequest 和ServletResponse,所有它摆脱不了Servlet容器。 六、 前端表达式语言方面.Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达 式语言在Collection和索引属性方面处理显得很弱。 七、 对Action执行的控制困难. Struts创建一个Action,如果想控制它的执行顺序将会非常困难。甚至你要重 [...]

分类: Java | 1 条评论

本文介绍Spring AOP使用心得,以及在Spring的xml配置文件中加入新的schema。 毕竟是第一次使用Spring AOP,按照Reference中的介绍,准备使用Annotation来完成对AOP的配置。来看一下我做的步骤: 一、需要使用Spring2.0的jar包,现在已经发布正式版的2.0了,可以从http://www.springframework.org/上下载到最新的2.0版本。加入到项目的classpath中去。 二、需要在配置文件中启用新的spring2.0的schema或者是dtd。 1、在Spring的xml配置文件中加入新的schema: 2、“如果使用Java 5的话,推荐使用Spring提供的@AspectJ切面支持,通过这种方式声明Spring AOP中使用的切面。 “@AspectJ”使用了Java 5的注解,可以将切面声明为普通的Java类。”——Spring reference 3、为了使用Spring AOP的Annotation,在配置文件中加入。 4、编写切面类: public class ArticleRemoteAccountsService { /** *//** * 在发帖成功之后,给用户银币账户冲值 * * @param arg * @throws AccountsException * @throws InstantiationException * @throws IllegalAccessException */ @After(“execution(* com.company.ArticleManager.saveArticle(..))” + ” && args(arg)”) public void exSilByPost(Article arg) throws AccountsException, InstantiationException, IllegalAccessException { if (arg.getLastUpdateTime() [...]

分类: Java | 1 条评论

人们经常会在一台以上的主机上配置一种Web应用程序。例如,在生产中,一个网站可能只有一个实例。除了此实例外,开发人员可以在用于开发的机器上配置其他的(开发)实例。也可以在公司(机构)内部的本地开发服务器上维护其他应用程序装置,这将让您受益匪浅。该实例的目的是使Web设计者可以获得有质量保证的材料,并为需要为应用程序提供文件资料的人提供准入。 大家都知道,即使是最简单的场景,也需要安装、配置和维护三个实例。而对于位于不同地理位置的团队来说,要从事这样的项目便更加困难。对于任何不是特别简单的Web应用程序项目,都需要多名开发人员来安装项目装置和本地设置以及运行单元测试的装置等。 很多组织都将自己开发的产品作为Web应用程序。我们可以在很多产品中发现这种情况,例如电子商务系统、内容管理系统(CMS),以及博客发布平台等。这类产品可在多个服务器中进行部署。对于成功的多用途Web应用程序来说,他们的开发人员必须要保证他们的应用程序便于安装,并且能够与其他 Web应用程序完美集成。经过上述讨论之后,我们应该明了,作为本文主题的应用程序配置是通用Web应用程序项目开发人员所需要解决的重要问题之一。 诸如CVS或Subversion之类的版本控制系统是开发组织使用的一种标准工具。这种工具代表了一些组织的中心源代码版本库,它们被用于保持源代码的有序。用户可以跟踪应用程序源代码的变化,显示不同版本的区别,并可以确定项目分支。而且,它们使得在应用程序部署中进行部分更新成为可能。 很明显,版本控制系统软件是跟踪源代码所必需的,它对于解决应用程序配置问题有非常大的帮助。在本文中,我们将不会把重点放在版本控制系统上,因为这方面已经有很多相关的材料了。在此,我们将关注版本控制问题中的一个小话题:如何使Web应用程序的配置更加便捷(尤其是使用Spring MVC框架编写的Web应用程序)。 问题是:我们在此讨论的是一种什么样的配置?任何Web应用程序都需要一些资源,这些资源通常都是其所运行的服务器所特有的,例如数据库URL、发送电子邮件的SMTP服务器,以及包含专用软件文件的文件夹等。这样的设置应该集中,从而使应用程序配置更加简单。 但是,这只是这个问题最简单的一种版本。有时候,在应用程序开发中需要更加复杂的配置。这意味着,必须将各次部署中的不同Bean连接起来,而这会使问题更加复杂。 这些应用程序配置问题的解决方案有诸多优势,包括:简化应用程序的安装和配置过程,使源代码版本控制更加简便,减少源代码版本库中的冲突现象。下面,我们将通过示例详细讨论这个话题。 问题 我们首先来演示一下上文所提到的最简单的版本。在这一场景中,我们希望在应用程序部署中改变的是简单的配置参数,例如链接、密码等。如果您曾经使用Spring MVC框架开发过Web应用程序,那么您应该知道这里将用到的两个配置文件: ◆/WEB-INF/applicationContext.XML,它让您可以配置Bean,或者显示应用程序上下文。通过这个文件,您可以定义自己的业务逻辑Bean、资源以及其他可以与Web端口相关联的所有Bean。 ◆/WEB- INF/[Servlet-name]-servlet.xml,它被用于配置Web层、视图解析器、控制器、校验器以及其他所有MVC框架中必需的 Bean。[servlet-name]指的是在web.xml部署描述符中定义的Spring dispatcher servlet的名称。 那么问题在哪儿呢?问题就出在applicationContext.xml中将包括一些特定于主机的Bean定义。其中,最明显的一个示例就是包含了JDBC连接信息的bean,但是任何一种稍微复杂些的应用程序都有十几个类似的Bean。看一下下面的示例: org.postgresql.Driver jdbc:postgresql://localhost/test postgres 这个解决方案的问题在于对applicationContext.xml文件的维护。对于初学者来说,设想一下,项目放在源代码版本控制系统中,例如CVS。下面,假设您希望在网站中添加新的功能,那么就需要在应用程序上下文定义中添加额外的Bean定义。问题是如何在生产服务器上体现这些改变。 通常情况下,应用程序的本地实例不会与活动站点使用同样的数据库,因此applicationContext.xml文件将包括让您能够访问本地数据库的设置。当您想提交在源代码版本库中的改变时,就需要注意这些特定于主机属性的同步性。版本库中的文件最终可能使用本地设置中的配置。如果想在生产服务器上更新配置,就必须手动同步这些属性的值。这是非常枯燥的任务,而且还非常容易出错。 对于应用程序的每个实例来说,这个问题更加重要。假如有三位开发人员正在使用代码段基址,而且他们使用的是本地的数据库。当您提交更改的时候,他们每个人在本地服务器上更新源代码的时候都必须非常谨慎。他们会手动同步这些更改,然后提交他们的工作。这样一来,版本控制系统对于这些配置文件来说已经毫无用处。如果曾经使用过Spring MVC框架,那么您应该知道applicationContext.xml是应用程序中的关键组件,因为是它将所有的东西粘合在一起。所以,我们需要一种机制来帮助使应用程序中各项保持有序,这点非常重要。 正如前面所提到的,这是您可能遇到的较简单的配置问题。更难的问题出现在当需要在不同服务器中进行不同的Bean连接的时候。这类问题常会出现在日常软件开发任务中。例如,假如您的产品有一个客户身份验证模块,可以对来自关系数据库或LDAP服务器中的用户进行身份验证。自然,这一身份验证模块可以使用抽象了特定版本库的Bean进行配置。如果您想改变不同应用程序部署中验证用户的方式,就需要在applicationContext.xml文件中进行不同的Bean连接。这种配置问题常见于在部署中有可配置特性的所有应用程序。 解决方案 同步Bean属性 这个问题的一种可行的解决方案是将所有特定于主机的参数都放到普通的Java属性文件中,使用Spring的PropertyPlaceHolderConfigurer类,将这些参数写入Bean属性中。 使用这一解决方案,我们可以生成如下的属性文件(/Web-INF/JDBC.properties): jdbc.driver=org.postgresql.Driver jdbcjdbc.url=jdbc:postgresql://localhost/test jdbc.user=postgres jdbc.password= 我们的Bean配置如下: /WEB-INF/jdbc.properties ${jdbc.driver} ${jdbc.url} ${jdbc.user} ${jdbc.password} 如上所述,我们定义了一个PropertyPlaceholderConfigurer类的实例,并将其位置属性设置为我们的属性文件。该类被实现为Bean工厂的后处理器,并将使用定义在文件中的属性来代替所有的占位符(${…}value)。 利用这种技术,我们可以从applicationContext.XML中移除所有特定于主机的配置属性。通过这种方式,我们可以自由地为该文件添加新的Bean,而不必担心特定于主机属性的同步性。这样可以简化生产部署和维护。 同步性连接 上面的技术解决了第一个问题,可是如果您计划修改不同应用程序部署之间的Bean连接,这一技术便不很适合。针对这一问题的一个解决方案便是额外创建一个名为applicationContext-[hostname].xml 的XML定义文件。其中[hostname]是部署应用程序的主机的名称。例如,在本地的机器上,这个文件通常名为 applicationContext-localhost.xml,而在部署时,它可能更名为applicationContext- somehost.com.xml。 可以猜测,这一文件必须包括特定于某一主机的所有配置Bean。在本文中,我们将假设dataSource bean定义将位于这类文件中,而不是通用的applicationContext.xml定义。当然,这种机制与前者并非冲突,但是为了更加简单明了,我们将只关注这种方法。 既然我们已经有了特定的配置,下面我们就来讨论一下如何将其整合到整个Spring MVC框架配置概念中。要达到这一目的,可以有许多方法,我们将详细地一一说明。但首先,我们应该注意到,由于有些Bean可能位于独立的配置文件中,因此在 applicationContext.xml中,所有对它们的局部引用都必须更换成全局名称。 例如,如下引用: [...]

分类: Java | 评论

Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在Spring中怎样配置Quartz。 首先我们来写一个被调度的类: package com.kay.quartz; public class QuartzJob { public void work() { System.out.println(“Quartz的任务调度!!!”); } } Spring的Quartz配置文件: work 10,15,20,25,30,35,40,45,50,55 * * * * ? 测试程序: package com.kay.quartz; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainTest { /** * @param args */ public static void main(String[] args) { System.out.println(“Test start.”); ApplicationContext context = new ClassPathXmlApplicationContext(“quartz-config.xml”); //如果配置文件中将startQuertz bean的lazy-init设置为false 则不用实例化 [...]

分类: Java | 1 条评论
单独使用Compass需要的jar包

如果你的网站架构采用的是spring+hibernate。用现在比较流行的开源搜索引擎框架compass可以快速的给你的网站添加强大的搜索功能。从几十万条数据中,只需几毫秒的时间就可以搜索出你想要的数据。 Compass介绍 Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架.Compass包括: * 搜索引擎抽象层(使用Lucene搜索引荐), * OSEM (Object/Search Engine Mapping) 支持, * 事务管理, * 类似于Google的简单关键字查询语言, * 可扩展与模块化的框架, * 简单的API. 官方网站:谷歌 1 序言 这些天一直在学点新的东西,想给毕业设计添加点含量,长时间的SSH项目也想尝试下新的东西和完善以前的技术,搜索毋容置疑是很重要的。作为javaer,作为apache的顶级开源项目lucene应该有所耳闻吧,刚学完lucene,知道了基本使用,学的程度应该到可以使用的地步,但不的不说lucene官方给的文档例子不是很给力的,还好互联网上资料比较丰富!在搜索lucene的过程中,知道了基于lucene的compass和lucene-nutch。lucene可以对给定内容加上索引搜索,但比如搜索本地数据库和web网页,你需要把数据给拿出来索引再搜索,所以你就想可不可以直接搜索数据库,以数据库内容作为索引,并且伴随着数据库的CRUD,索引也会更新,compass出现了,compass作为站内搜索那是相当的方便的,并且官方提供了spring和hibernate的支持,更是方便了。Lucene-nutch是基于lucene搜索web页面的,如果有必要我在分享下lucene、lecene-nutch的学习经验,快速入门,其他的可以交给文档和谷歌了。 不得不提下,compass09年貌似就不更新了,网上说只支持lucene3.0以下版本,蛮好的项目不知道为什么不更新了,试了下3.0以后的分词器是不能使用了,我中文使用JE-Analyzer.jar。我使用的环境: Spring3.1.0+Hibernate3.6.6+Compass2.2.0。 2 Compass介绍 Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架.Compass包括: * 搜索引擎抽象层(使用Lucene搜索引荐), * OSEM (Object/Search Engine Mapping) 支持, * 事务管理, * 类似于Google的简单关键字查询语言, * 可扩展与模块化的框架, * 简单的API. 官方网站:谷歌 3 单独使用Compass Compass可以不继承到hibernate和spring中的,这个是从网上摘录的,直接上代码: @Searchable public class [...]

分类: Java | 评论

spring 基本上只有两个功能,一个是IOC(即注入),一个是AOP(面向切面编程,是动态代理的一种实现,技术实现上用到了AspectJ这个框架)。这里主要说一下JAVA程序员在使用spring的IOC时常犯的一个错误。下面的例子是SSH环境,spring会在action中注入service,在service中注入一个dao。 public class XXXAction{ private XxxService xxxService; public XXXService getXxxService(){ return xxxService; } public void setXxxService(XxxService xxxService){ this.xxxService = xxxService; } } 这样写一般是没有问题的,但是分析一下会发现,对xxxService的get方法是多余的,并且有可能引起错误。Action 中注入service就是spring整了一个service对象让action调用。把service注入action 的时候一般调用service对应的set方法,也可能是构造,还有别的。这里的 service对应的get方法完全没有用。如果我们使用Struts2的JSON插件,当Action中的对象由struts转换成JSON字符串返回客户端的时候,如果遇到了service的get方法,就会出现错误,但是不报错。原因应该是欲将service 也转换成JSON字符串中的一个属性而引发的错误。

分类: 异常库 | 评论

org.springframework.beans.factory.BeanCreationException异常产生的原因和解决方案。 2012-1-5 1:33:42 org.apache.catalina.core.ApplicationContext log 信息: Initializing Spring root WebApplicationContext 2012-1-5 1:33:54 org.apache.catalina.core.StandardContext listenerStart 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactory’ defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable to instantiate default tuplizer 该异常产生的原因: 是因为在将spring框架和hibernate框架进行整合的时候,包冲突所引起的,这个bug在myeclipse6.0的时候就开始产生了,产生冲突的两个.jar文件是:asm.jar和asm-2.2.3.jar的冲突造成的。 [...]

分类: Java | 1 条评论

先说下我现在使用的版本:Spring3.0 annotation写的 今天写项目遇到了一个问题:想通过jstl自定义函数来实现页面上面的一部分内容。通过Spring注入后发现报如下错误: @Resource annotation is not supported on static fields 上网搜寻发现,Spring注解注入不支持静态变量注入,遂想办法解决。 首先看到的方法是有一个 … 这样的方法,通过编写一个方法init(),然后通过xml配置 init-method=”init” ,在init方法中从取值赋成静态的,但是我不想写xml,毕竟项目里主要用的都是annotation方式,于是发现如下两个注解: @PostConstruct 和 @PreDestroy 一个是在初始化之后调用,一个是在摧毁之前调用。这样就可以使用的。 我在junit下做了测试,就不发项目代码了,代码如下: @Resource private HibernateTemplate hibernateTemplate; private static TalentsDaoImplTest td; @PostConstruct public void init() { td = this; td.hibernateTemplate = this.hibernateTemplate; } @Test public void testStatic() { Talents talents = td.hibernateTemplate.get(Talents.class, 1L); System.out.println(talents.getAge()); } 发这篇只是发现,可能是这个问题出现的或者是使用的人比较少,但是这个解决方案真的不太好找,我就总结下来,希望可以给大家提供帮助。 [...]

分类: Java | 评论
SSI(Struts,Spring,Ibatis)整合

MVC对于我们来说,已经不陌生了,它起源于20世纪80年代针对smalltalk语言的一种软件设计模式,现在已被广泛应用。近年来,随着java的盛行,MVC的低耦合性、高重用性、可维护性、软件工程的可管理性等诸多优点使其在java平台中很受欢迎,其间,也诞生了许多优秀的MVC框架,如专注于控制层的Struts、WebWork, Struts2, JSF等框架,专注于业务逻辑方面的Spring框架、专注于持久层的Hibernate、iBatis、Castor、JORM等框架。由于最近用了一次SSI框架,因此本文主要是对Strtus2、Spring、iBatis三个开源的MVC框架进行一个小结。 Struts2主要来源于webwork框架,与Struts1相比,在数据传递方面,Struts2提供了更加强大OGNL标签功能,使其能够通过在action中定义变量来直接与jsp页面中的数据进行相互传值,省去了Struts1中的formbean;而在跳转控制方面,Struts2简化了配置文件的信息量,使页面和action之间的交换更加的简洁和直观,便于开发人员的管理。 Spring功能非常的强大,比如它的控制反转/依赖注入机制,省去了我们自己书写工厂模式的工作,实现类对我们将要用到控制类、业务逻辑类、数据访问类、以及JNDI或者JDBC数据源的托管;Spring对AOP支持使我们在用户权限控制、事务处理方面节省了很多工作量; iBatis则是一种轻量级的OR Mapping框架,与Hibernate相比,iBatis提供了半自动化对象关系 映射的实现,开发人员需要编写具体的sql语句,为系统设计提供了更大的自由空间,为sql语句优化提供了便利。 下面这张图就是我们所用到的这三种框架的结合体,下面对其作以简单介绍。 在控制层,利用Strtus2标签功能,在Action中直接与jsp页面上的数据进行交互。在调用业务逻辑层应用时,Struts2提供了对Sping的支持。开发人员需要完成对struts.xml的配置工作和对各个Action类的编写。 在业务逻辑层,利用Spring框架的依赖注入实现对业务逻辑类和DAO类的实例托管;在事务处理方面,利用Spring提供的面向切面的事务处理功能,使对数据的事务控制脱离于数据访问接口实现;在对象关系映射方面,利用Spring对数据库连接池的托管和对iBatis框架的支持。开发人员需要完成对数据源的配置、对不同模块所对应的application*.xml文件的配置,以及对业务逻辑接口的定义和业务逻辑实现的编写。 在持久层,利用iBatis提供的半自动化对象关系映射的实现,开发人员需要编写具体的sql语句,为系统设计提供了更大的自由空间。另外,开发人员需要完成对SqlMapConfig.xml和*SqlMap.xml的配置,以及对DAO接口的定义和DAO接口的实现。 在各层之间进行交换的过程中,利用数据传输类进行数据的传递和交互。其中,数据传输类与数据库表一一对应。 SSI框架能够降低我们代码的耦合度,增强了代码的健壮性和可重用性,加快了开发速度,但是也有一些不足之处,比如由于三种框架的配置文件较多,也给我们带来了一些不便,特别是对于较小的应用来说更是如此。 一:首先引入struts2 spring ibatis 各自的jar包 在此就不一一罗列了。 二:添加配置文件 我们首先从web.xml文件说起 web.xml加载过程: 1 启动WEB项目的时候,容器(如:Tomcat)会读他的配置文件web.xml读两个节点 和 2 紧接着,容器创建一个ServletContext(上下文) 这个WEB项目所有部分都将共享这个上下文 3 容器将转化为键值对并交给ServletContext 4 容器创建 中的类的实例,即创建监听 5 在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得: ServletContext = ServletContextEvent.getServletContext(); context-param的值 = ServletContext.getInitParameter(“context-param的键”); web.xml节点加载顺序 节点的加载顺序与它们在web.xml文件中的先后顺序无关。即不会因为filter写在listener的前面而会先加载filter最终得出的结论是:listener->filter->servlet 同时还存在着这样一种配置节点:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文 的信息,那么context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param [...]

分类: Java | 评论

1,整合Struts2 a)导入struts的jar包 struts2-core-2.1.6.jar xwork-2.1.2.jar ognl-2.6.11.jar freemarker-2.3.13.jar commons-logging-1.1.jar commons-fileupload-1.2.1.jar b)将struts.xml文件拷贝到src目录下 c)在web.xml里配置struts的核心过滤器 struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* 2,整合Spring a)导入Spring的jar包 spring.jar commons-logging.jar b)将applicationContext.xml文件拷贝到WEB-INF目录下 c)在web.xml里配置spring的监听器 org.springframework.web.context.ContextLoaderListener d)添加spring与struts2整合的插件 struts2-spring-plugin-2.1.6.jar 3,编写代码测试 登录页面login.jsp USERNAME: PASSWORD: LoginDao业务接口 package com.itmyhome.actioin; interface LoginDao { public boolean login(String username,String password); } LoginDaoImpl业务接口实现 package com.itmyhome.actioin; public class LoginDaoImpl implements LoginDao { public boolean login(String username, String password) { [...]

分类: Java | 评论

ActiveMQ 是Apache出品, 是最流行​​和最强大的开源消息总线。 同时完全支持 JMS 1.1和J2EE 1.4规范。 ActiveMQ 特性 支持多种编程语言和协议编写客户端。 在JMS客户端和消息代理完全支持企业集成模式 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)。 对Spring的支持, ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性。 测试通过常见的J2EE服务器。如:Geronimo, JBoss 4, GlassFish, WebLogic。 支持多种传送协议:in-VM, TCP, SSL, NIO, UDP, JGroups,JXTA。 支持通过JDBC和journal提供高速的消息持久化。 从设计上保证了高性能的集群,客户端-服务器,点对点。 支持Ajax 支持与Axis的整合 可以很容易得调用内嵌JMS provider,进行测试。 通过网络搜索及个人理解,整理出ActiveMQ与Spring整合的文章。 相关jar包 activemq-core-5.5.1.jar geronimo-j2ee-management_1.1_spec-1.0.1.jar geronimo-jms_1.1_spec-1.1.1.jar geronimo-jta_1.0.1B_spec-1.0.1.jar kahadb-5.5.1.jar xbean-spring-3.7.jar commons-beanutils.jar commons-codec.jar commons-collections.jar commons-fileupload.jar commons-httpclient.jar commons-io.jar commons-lang.jar commons-logging.jar commons-validator.jar dom4j-1.6.1.jar javaee.jar jsf-api.jar jsf-impl.jar jstl.jar [...]

分类: Java | 评论

【引言】 使用Java Mail API来发送邮件也很容易实现,但是最近公司一个同事封装的邮件API实在让我无法接受,于是便打算改用Spring Mail API来发送邮件,顺便记录下这篇文章。 【Spring Mail API】 Spring Mail API都在org.springframework.mail及其子包org.springframework.mail.javamail中封装,且只提供了邮件发送的封装。 SimpleMailMessage: 对邮件的一个简单封装,只能用于表示一个纯文本的邮件,也不能包含附件等。 JavaMailSenderImpl: 邮件发送器,主要提供了邮件发送接口、透明创建Java Mail的MimeMessage、及邮件发送的配置(如:host/port/username/password…)。 MimeMailMessage、MimeMessageHelper:对MimeMessage进行了封装。Spring还提供了一个回调接口MimeMessagePreparator, 用于准备JavaMail的MIME信件。 1.发送简单的文本邮件 package net.xftzr.mail; import java.util.Properties; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSenderImpl; /** * 本类测试简单邮件 直接用邮件发送 * * @author Administrator * */ public class SingleMailSend { public static void main(String args[]) { JavaMailSenderImpl senderImpl = new JavaMailSenderImpl(); // 设定mail [...]