岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Java >> XML >> XMLBeans >> Java正文
什么情况下需要使用XML创建 EMAIL 模板
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-7-22 23:16:17

  发送邮件是web应用系统的一个基本功能。一般来说,邮件都有特定的类型,比如说密码提醒,欢迎信息,订单确认或者收信确认。尽管不同应用邮件的内容各不相同,但是发送邮件的过程基本上是一样的。 构建消息,发送给邮件服务器,发送。
  当使用java开发的时候,我们常常使用JavaMail API 来连接邮件服务器发送邮件。但是这种方式过于笨重(主要由邮件的灵活性造成的),所以当你需要多次使用这种方式发送邮件的时候,最好写一个wrapper.根据使用的方式不同,wrapper可以是发送某一特定的邮件,比如说密码提醒,或者作为一种通用的模式,接受主题,接收人,邮件内容作为参数。
  一旦使用wrapper发送邮件,你需要一个自主构建消息的系统。让我们使用密码提醒作为例子。基本上所有的邮件都包含主题,内容和接收人。当我们发送密码提醒邮件的时候,用户地址和密码是从某个记录登陆信息的知识库里提取的。主题和内容需要和数据库提取的数据合并,并且被保存在某个地方。系统设计最大的问题就是在什么地方保存这种类型的字符串。在很多情形下,字串被保存在属性文件里,这种方式分离了数据和源代码,并且使本地化更加容易。我在很多web应用系统中使用了这种存储机制,但很不幸的是,这种方式有很多缺陷。
  以下是利用属性文件存储邮件字串不合适的原因:
  •属性文件使用一种非常简单的数据结构-名称和值组合。当你需要很多值对应一个名称的时候这种结构就不合适了。比如,一个邮件有4个接收人,3个抄送人,使用属性文件很难解决这个问题。
  •属性文件的格式非常严格。名称和值必须在同一行上,所以当你编辑文件的时候长字符串是很难处理的。比如,把一个邮件的所有内容放进属性文件是一件多么痛苦的事情。如果你希望值的内容包括换行,你必须使用
  另一种选择是使用XML作为邮件模板,这也是本篇文章所要讨论的内容。XML为你构建模板提供了极大的灵活性,并且它不会有属性文件所有的格式限制,因此这种方式很容易处理长字符串。XML主要弱势就是它处理起来比属性文件复杂。使用属性文件的时候,装载文件和装载后访问文件非常容易。而装载XML文件和使用java提供的多个XML处理库之一处理XML文件就需要更多的工作了。
  这篇文章和所附的代码提供了一个通用的模板使你能够使用XML文件创建模板并且发送邮件,希望由此能够减轻这个过程的痛苦。在这个模板里,我将使用Jakarta 项目里的Commons Digester 包来处理XML,使用JavaMail API发送邮件。
  
  邮件模板
  让我们来看看邮件模板的格式。模板是XML文件,它包含一个根元素和一系列根的子元素。根元素是。必要的子元素是, , 和 。可选的子元素是 , , 和 。如果你使用过邮件系统,那么你可以推导出这些元素实际包含的内容。可选的元素有多个实例,所以你可以为每种类型的接收者指定多个地址。我待会会在描述消息处理的时候来解释运行机制。以下是一个模板文件的例子。
  
  rafe@rafe.us
  someone@example.com
  someoneelse@example.com
  rafe@rafe.us
  This is the subject
  This is the body of an email message.
  
  可定制的模板
  属性文件的一个有用的特性是你可以使用MessageFormat 类用动态传入的值替代属性文件里的被指定参数。比如说,如果你需要在属性文件里指定errors,其中一个errors是file not found, 你可以这样写:
  file.not.found.error=Error, could not find file {0}.
  然后,在运行时刻,你这样使用MessageFormat:
  
  ResourceBundle bundle = ResourceBundle.getBundle(
  "MyProperties", currentLocale);
  Object[] arguments  = { "some_file.txt" };
  String newString   = MessageFormat.format(
  bundle.getString("file.not.found.error"), arguments);
  
  最后,newString 将包含Error, could not find file some_file.txt.我在这个系统里加入了类似的灵活性。 可以格式化所有的字符串,所以你可以在邮件模版的subject 和body元素里内嵌在属性文件使用的同样的令牌。
  在某种情形下,你希望在发送邮件的时候插入个人化的信息。比如,你希望在邮件内容里或者订单的内容里包含收件人的姓。本系统使用MessageFormat 来处理邮件模版的内容和主题,从而解决这个问题。处理内容和主题的时候只使用一个参数数组。这样主题里可以包含令牌{0}, {2}, {3}, 内容可以包含令牌{0}, {1}, {4} 。我之所以采用这种方式是因为在很多情形下主题和内容使用相同的参数,同时这种方式也简化了传递给EmailSender所需要的参数。
  
  处理模版
  创建完模版,下一步所要做的就是处理它。我们知道,现在有很多的XML处理包可供选择。Commons Digester是Jakarta的公共项目,最初是为了在Struts项目中快速方便的解析Struts的的配置文件而产生的。它提供了从XML文件里的元素到使用类似于XPath 语法的数据结构的映射。 好处在于为了从 XML文件里得到某个元素你不必用SAX一个节点一个节点的解析,也不必使用DOM处理树状数据结构。
  下面这个方法从XML文件里读取数据,然后把数据拷贝到EmailTemplate对象中。
  
  public static EmailTemplate getEmailTemplate(InputStream aStream)
  {
  Digester digester = new Digester();
  digester.setValidating(false);
  
  digester.addObjectCreate("email", EmailTemplate.class);
  
  digester.addBeanPropertySetter("email/subject", "subject");
  digester.addBeanPropertySetter("email/body", "body");
  digester.addBeanPropertySetter("email/from", "from");
  digester.addCallMethod("email/to", "addTo", 0);
  digester.addCallMethod("email/cc", "addCc", 0);
  digester.addCallMethod("email/bcc", "addBcc", 0);
  
  try
  {
  return (EmailTemplate)digester.parse(aStream);
  }
  catch (IOException e)
  {
  logger.error("Error: ", e);
  return null;
  }
  catch (SAXException e)
  {
  logger.error("Error: ", e);
  return null;
  }
  }
  
  让我们来逐行研究这段代码。C

[1] [2] 下一页


  • 上一个Java:
  • 下一个Java:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    传世私服 传奇世界私服 天龙八部私服 bet365 传世私服 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365