Beehive只是提供了三种访问企业资源的系统控件,现实情况下我们需要访问更多类型的企业资源,所以我们需要自己来开发符合自己需要的控件。在这篇文章里,作者将介绍如何基于控件架构开发访问JavaMail资源的控件,简化对JavaMail资源的访问。
从前面的文章中,我们已经学习了Beehive中提供的三种访问企业资源的控件:JDBC控件、EJB控件和JMS控件,而这也是Beehive中目前已经提供的全部系统控件。然而J2EE标准中提供的企业资源类型远不止这三种,开发者选择等待Beehive开发组提供更多的控件显然是不明智的,我们必须自己动手来解决控件的开发。
本文中就将给大家介绍如何基于控件架构提供的API来开发自己的控件,我们选择开发者经常需要访问的企业资源——JavaMail作为目标资源,按照控件的命名规则,我们暂且叫做JavaMail控件吧。
要完成一个控件的设计,通常需要完成如下的工作:
根据控件的使用情况,确定控件公共接口类中需要对外提供的接口方法,要确定这些接口方法可能会比较困难,因为有些时候控件设计者可能难于确定是否为控件使用者提供低级接口以便使用者能够深入的控制控件的行为。
控件实现类通常被设计成可扩展(实现org.apache.beehive.controls.api.bean.Extensible接口)的,这样方便使用者扩展该实现类。控件实现类中最主要的方法是invoke(Method m,Object[] args)方法,这个方法的参数 m 代表控件使用者调用的业务方法,而 args 数组则对应着控件使用者调用该业务方法时提供的调用参数,控件实现类需要根据使用者提供的注释和调用业务时提供的参数完成控件主体功能的实现。
下面的章节中,我们将详细地讲解如果依照上面的步骤来完成JavaMail控件的设计和开发。本文中所有例子的源代码可以在通过资源下载区中的连接完成下载。
JavaMail控件的开发目标是完成访问SMTP服务器发送邮件的封装,提供足够的注释满足开发者在发送邮件时需要设置的参数,同时提供邮件发送的实现方法使开发者在使用控件后无需编写访问SMTP服务器、设置邮件发送者/接收者等参数、发送邮件的代码,而只需要将精力集中到业务逻辑上。
在开发控件之前,我们需要确定向开发者提供哪些注释才能够满足他们定制控件的实际需求,因此我们首先要分析开发者使用这些控件时通常需要提供哪些参数。要访问SMTP服务器发送邮件,开发需要提供的参数分为两类:
1.目标SMTP服务器的参数
目标SMTP服务器的参数包括目标SMTP服务器的地址,访问SMTP服务器是否需要提供安全信息以及访问SMTP服务器所需要的用户名和密码,其中目标SMTP服务器的地址是必须的。我们需要提供的参数和相关要求如表1所示
表1 SMTP服务器参数表
参数名 | 参数类型 | 参数说明 | 是否必须提供 | 说明 |
---|---|---|---|---|
serverAddress | String | SMTP服务器的地址 | 是 | 比如SMTP服务的地址是mail.vivianj.org |
authorizationRequired | boolean | 使用SMTP服务器发送邮件时是否需要提供安全信息 | 否 | 如果需要提供安全信息,这个参数设为true,否则设为false |
principal | String | 访问SMTP邮件服务器时使用的用户名 | 否 | |
credentials | String | 访问SMTP邮件服务器时使用的密码 | 否 |
2.被发送邮件的参数
要发送一个邮件,我们需要提供的参数和相关要求如表2所示。
表2 邮件参数表
参数名 | 参数类型 | 参数说明 | 是否必须提供 | 例子 |
---|---|---|---|---|
from | String | 邮件发送者 | 是 | |
to | String | 邮件的接收者,可以使用xxx@xx.com,xxx1@xx.com,...的形式传递多个接收者 | 是 | 比如我们可以使用king@vivianj.org, guilaida@163.com 来设置邮件有两个接收者 |
cc | String | 邮件抄送的接收者,可以使用xxx@xx.com,xxx1@xx.com,...的形式传递多个抄送的接收者 | 否 | |
bcc | String | 邮件暗送的接收者,可以使用xxx@xx.com,xxx1@xx.com,...的形式传递多个暗送的接收者 | 否 | |
subject | String | 邮件的主题 | 否 | |
contentType | String | 被发送邮件的格式,默认使用text/plain,另外一种可选的类型是text/html,你还可以在这个参数中加入字符集的设置 | 否 | 比如我们可以使用”text/html;charset= GB2312”来设置被发送的邮件使用html格式,编码使用GB2312 |
attachment | String | 邮件附件 | 否 | |
Content | Object | 邮件内容 | 否 |
从以上两种参数常见的使用场景来看,由于同一个应用中SMTP服务器通常是比较固定的,所以SMTP服务器的参数也是比较固定的,而被发送邮件的参数则随着业务的变化而不断发生变化,充分考虑到这种不同点,我们需要为上面这两种种情况提供不同的注释以及注释的使用范围。
SMTP服务器参数的注释名为SMTPServer,它可以设计成一个类级别的注释,用于为控件的继承类提供注释。根据前面表1 的分析,SMTPServer必须提供四个参数:serverAddress、authorizationRequired、principal、credentials。
由于和JavaMail控件结合非常紧密,SMTPServer注释被设计成控件接口的内部类,清单1 的第26到66行显示了SMTP注释的全部代码,代码中为关键的内容提供了相应的提示信息。
被发送邮件的参数对应的注释名为Message。由于通常和业务方法密切相关,因此我们Message注释被定义成为控件继承类中的业务方法提供注释。
根据表2 的分析,Message对象必须提供8个参数,分别是:from,to,cc,bcc,subject,contentType,attachment,Content。其中Content(被发送邮件的参数中邮件内容)比较特殊,因为他会根据环境的不同而发生变化,所以我们将它看作Object类型的变量。在注释中定义Object这种类型没有必要,因此设计时我们不把Content当作的Message注释的属性,而是将它变成业务方法必须提供的参数。
Message注释被设计成JavaMail控件接口的内部类,Message注释的全部代码参见清单1 的第66~119行代码。
由于邮件发送的功能比较简单,因此我们的控件接口类并不需要过多的提供接口方法,唯一设计提供的接口方法名为getMailException,它的功能是控件使用者调用时返回邮件发送过程中产生的最后一个违例。清单1 中提供了控件接口类的全部源代码。
[1] [2] [3] [4] 下一页