市场研究公司Gartner副总裁Carl Claunch提出了值得关注的将对数据中心产生重大影响的十项技术。这些技术
目前还不太成熟。但是,这些技术在未来18至36个月里将成熟起来并且将广泛应用。这十种影响数据中心的技术是:
1.统一通讯
到2010年,80%的统一通讯组件将作为更广泛的产品组合的一部分购买。统一通讯功能涉及到五个核心市场,每一个市场都在以自己的方式向融合的方向发展。这五个关键市场是:语音邮件、PBX(将向IP PBX发展)、电子邮件与日历、会议与协作、即时消息和在线状态显示。统一通讯还吸收了附带的市场的一些功能。
2.Web平台
把各种专用的协议转移到IP是主要的推动因素之一,同时,以前的模拟信号(如大楼内部安全摄像机的信号传输或者传感器通讯)正在转向数字编码。
3.IT操作流程自动化
实现IT管理流程自动化仍是IT官员降低IT操作成本和复杂性的一个关键目标。自动化应用将继续增长的势头。随着企业的成熟,自动化应用将提供更多的流程知识以满足这些挑战。
4.服务器结构
计算结构(computing fabric)是服务器设计的一个发展。在本十年末寻求一些厂商提供的基于计算结构的服务器。未来的基于计算结构的服务器将把内存、处理器和IO卡作为组件对待,按照特殊的需求组合和安排。这样做的结果是通过减少浪费的资源来提高使用率。
5.元数据管理
数据服务提供对数据的格式化、标准化、发布和访问。元数据管理涉及到实现元数据优化、提取和语义一致等功能的参考模型以支持再使用、一致性、完整性和共享性。大多数机构将通过分阶段的方式实现元数据管理,选择逐步建立的方法。例如,以客户为中心的企业可能使用使用客户数据整合解决方案解决客户管理问题或者执行具体的管理规定。
6.配置管理数据库
在广泛的影响力的推动下,配置管理数据库(CMDBs)将继续在企业IT运营基础设施中扮演重要的角色。目前,Dependency Mapping工具给长期的发现技术带来了新的技术方法。人们将继续开发这些工具以帮助IT运营的建立、维护、可视化和监视逻辑应用程序或者服务拓扑管理和跨系统的依赖性。
7.Mashups和混合应用程序
Mashups通过使用公共的API(应用程序编程接口)传输的信息把多个来源的内容混合在一起。例如,一个应用程序把一家房地产网站的信息与另一个网站的地图界面混合在一起以显示出售楼盘的位置。Mashing是一种展示层方法,把在消费者方面(浏览器)和来源方面(网络传输协议)方面利用Web技术的应用程序集成和混合起来。最终用户可以根据跟人需求或者内容创建机会性的应用程序。
8.超越整合的虚拟化
虚拟化技术能够改善IT资源的再利用和提高灵活性以适应不断变化的需求和工作量。同自动化技术以及服务级的、基于政策的积极管理一起使用,资源的效率将得到极大的改善,灵活性将成为根据需要自动调整的功能,服务将能够从整体上进行管理以保证高水平的弹性。
9.社交软件
除了公共网络之外,Web 2.0公司现在正在把重点放在使用企业中的有针对性的应用程序方面。一般来说,社交网络技术现在是成熟的,应用范围很广。社交软件很容易使用和开发。这种软件将对商务活动产生积极的影响。
10.绿色IT
IT管理员正在全力以赴提供电源和冷却方法以处理服务器机架消耗的数千瓦电源。对于电源使用和企业对环境的影响有许多管理规定。这可以解释为技术提供商将受到市场和客户需求的混合压力。技术厂商的反应是把电源和冷却管理放在更优先位置。
影响数据中心的10大颠覆性技术
HTML中的转义字符
HTML中<, >,&等有特殊含义,(前两个字符用于链接签,&用于转义),不能直接使用。使用这三个字符时,应使用它们的转义序列,如下所示:
& 或 & & 和
< 或 < < 小于号
> 或 > > 大于号
” ” 双引号
空格
© © 版权符
® ® 注册符
前者为字符转义序列,后者为数字转义序列。数字转为字符对应的ASCII码值。
需要说明的是:
a. 转义序列各字符间不能有空格;
b. 转义序列必须以”;”结束;
c. 单独的&不被认为是转义开始;
d.区分大小写。
另一个需要转义的字符是引号,它的转义序列为”" “或”"”
HTML使用的字符集是ISO &859 Larin-1字符集,该字符集中有许多标准键盘上无法输入的字符。对这些特殊字符只能使用转义序列。
XML转义字符
不合法的XML字符必须被替换为相应的实体。
如果在XML文档中使用类似”<” 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。所以不应该像下面那样书写代码:
if salary < 1000 then
为了避免出现这种情况,必须将字符”<” 转换成实体,像下面这样:
if salary < 1000 then
下面是五个在XML文档中预定义好的实体:
< < 小于号
> > 大于号
& & 和
‘ ‘ 单引号
” ” 双引号
实体必须以符号”&”开头,以符号”;”结尾。
注意: 只有”<” 字符和”&”字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。
什么是Adobe AIR?[转]

Adobe Integrated Runtime (AIR) 是一个跨操作系统的运行时,利用现有的Web开发技术(Flash,Flex,HTML,JavaScript,Ajax)来构建富Internet应用程序并部署为桌面应用程序。
AIR 支持现有的Web技术如Flash,Flex,HTML,JavaScript和AJAX,可以用你最熟练的技术来开发您所见过的最具用户体验的RIA程序,例如,一个AIR程序可以使用如下一种或多种组合技术构建:
Flash / Flex / ActionScript
HTML / JavaScript / CSS / Ajax
PDF 可嵌入任何应用程序中
作为结果,AIR 应用程序可以是:
基于Flash 或 Flex:应用程序根内容(理解为容器)为Flash/Flex (SWF)
基于Flash 或 Flex 的HTML 或 PDF。应用程序的根内容为基于Flash/Flex (SWF) 的HTML
基于HTML,应用程序根内容为HTML, JS, CSS
基于HTML的Flash/Flex或PDF,应用程序根内容为基于HTML 的Flash/Flex (SWF) 或 PDF
用户使用AIR 应用程序的方式和传统桌面程序是一样的,当运行时环境安装好后,AIR 程序就可以其他桌面程序一样运行了。
第三次电信重组大局初定 [转]
喧闹经年,中国第三次电信重组看来真的是要定下来了。“上周五(2月15日)重组方案确实得到通过了。”2月20日,一位长期跟踪电信重组事件的业内知情者对《华夏时报》记者证实了上述传言,不过该人士同时表示,“相关人事问题还没定下来”。根据知情人士的说法,现有的6家电信运营商将合并为3家,将形成新的中国移动、中国联通(网通)、中国电信三大全国性全业务运营商。业内分析者倾向认为,这其中中国联通与网通的整合将是最大的难点。
现有6家运营商将变身3家
新联通整合难度最大
只待人事安排
2月21日,《华夏时报》记者得到知情者透露的最新消息称,当天国务院相关部门本来要开会讨论电信业高管的人事问题,不过最终没有成行,而且由于人事变动的复杂性可能这几天也还定不下来。
在最近盛传的电信重组中,目前得到确认的消息是,重组方案已经在国务院常务会议上得到通过,并有望在两会召开前后宣布。而此次被通过的方案业内大部分观点认为是:中国移动合并铁通,合并后由中国移动主导;中国联通合并中国网通,合并后由联通主导;中国电信收购联通CDMA网络,卫通公司卫星业务并入一家国有航天产业集团,地面业务整合至中国电信,人员随着业务走。重组合并后形成中国移动、中国联通(网通)、中国电信三大全国性全业务运营商。
在人事安排上之前有消息称:信息产业部副部长奚国华到中国移动当一把手;中国网通总经理张春江去中国电信;中国电信总经理王晓初去信产部;中国移动通信公司总经理王建宙因今年到60岁而退休。
《华夏时报》记者随后电话采访了中国移动、中国联通、中国网通等几家主要电信运营商,这些相关部门的负责人回答相若,普遍表示还没有得到重组的相关消息。
“这次看来不会是空穴来风。”电信业内资深人士项立刚对《华夏时报》记者讲述了他对此次电信重组传闻的感想。
2月18日,瑞士信贷发布报告称,其刚刚协助TD-SCDMA联盟在欧洲举办了TD路演,在此次会上TD联盟秘书长杨骅证实,国务院正在召开常务会议讨论电信重组事宜。
而从中国电信内部透露出的消息称,中国电信集团移动办近期动作频繁,开始正式大力推行其“C计划”,内部已经着手对中国联通CDMA网络的运作进行人员招聘培训等相关工作,同时中国电信和联通内部最近有过很多次沟通,大致的方向已经确定。
新联通整合难度最大
针对日渐明晰的各大电信运营商重组组合单元之整合前景,业内述评不一。
“中国联通与中国网通的整合难度最大!”项立刚分析认为,中国移动合并铁通,可以使铁通保持独立运作,只要在资金上给予支持,因此整合难度不大,中国电信合并卫通中,由于两者实力悬殊,在电信的主导下,难度也不会太大。
他具体分析认为,中国联通与中国网通合并,是要实现全业务,两家现在一个主要是移动运营,一个主要是固网运营,合并后要完全独立运营的可能性很小。中国联通和中国网通合并,需要面临一次重大的人事调整和文化的融合,尤其是北方地区,中国网通各省运营商实力都是非常强大,两家合并,要产生出领导人,要配合好工作,要在收入、待遇上达到一致,这是一项巨大的工程,没有个两三年都未必能理顺,这些情况一定会对中国联通的发展产生负面效应。
北京邮电大学教授曾剑秋也认为,联通和网通将激烈地争夺新联通总公司和北方十省各级分公司的主导权,完全融合至少需要4-5年时间。
事实上在此之前的电信重组传闻版本中,中国联通一直是重组的焦点与难点。
众所周知,中国联通目前拥有两张网络,G(GSM)网与C(CDMA)网,当初让联通运营这两张网是为了补充联通的实力,没想到却让联通处于尴尬状态,最直观的表现是其G网与C网相争,即业内称之为“双网互搏”。
而此前的数次重组传闻,联通C网出售给中国电信的价格问题以及其未来的发展也是重组的不争难点,而这次重组方案被顺利认可,普遍认为是联通解决了C网价格以及自己未来重组中的地位问题。按目前所称的方案,中国联通G网与中国网通合并,由联通主导,成立“新联通”,中国网通的称号在奥运后将会“消失”。
“两个弱者合并起来有什么意思!还不知道将来会出现什么变化,当年吉通、小网通,以及北方电信合并起来的大网通,还不是一样没做好。”有网通内部人员接受《华夏时报》记者采访时同样表达了自己对这种重组方案的忧虑。
观察
重组只是起点
电信重组似乎大局已定,但是在红头文件下发之前,各种消息依然层出不穷。
此前分析人士普遍预计,中国电信行业的最终重组方案将在通常为期约10天的两会结束之后公布。2月21日有媒体称,该项重组计划可能在3月份举行的两会之前予以公布。同日,投资银行美林发布报告,预估重组时间表为:3月底前发放全业务牌照,在4-7月间则会公布各营运商母公司的架构变动及人事变动。
与此同时,也有消息人士表示,尽管种种征兆显示电信重组已经加速,但由于运营商规模巨大,本次调整又涉及到四大上市公司及领导调整,原传闻版本还存在变数,“主要是人事方案难以确定”。
“以政府主导的重组只是起点,而不是终点。”信息产业部一位多次参加重组方案论证的业内资深人士接受《华夏时报》记者采访时称,“所有的方案皆有其合理性,区别只是大家有不同的标准。”
“通过此次重组主要解决分业竞争问题,使大家都有全业务经营权。”该人士称,“中国移动一家独大不是长远的事情。”
“重组是‘外科手术’,之后还需要‘调理血脉’(非对称管制),虽然这见效慢,但还是要做。”他认为,现在评价此方案是否合理还为时过早,“一般合并过渡期为6个月,一年后评价手术是否成功”。
实施DbUtils [转载]
JDBC码是Java译码的一个部分,它给已写的编码带来了数量惊人的重复。另外,JDBC码几乎会经常性的带来一些低级错误。写出好的JDBC编码并不难,但是很痛苦。
DbUtils组件是一个精密而简单的组件,它并不做什么复杂的事而仅仅只是使很多的JDBC任务对开发者来说变得稍容易一点。尽管这时候很多持久框架和包都可以用来使数据持久变得更容易,然而JDBC仍然是大多数Java和Java2企业版(J2EE)开发者赖以生存的工具。因此,任何能让使用JDBC工作更容易的东西都是好消息。
DbUtils可以免费下载,它不依赖于任何其它的通用组件而只是依赖下面这些:
- Java Development Kit (JDK) 1.2 (or later)
- JDBC 2.0 (or later)
DbUtils文档并不是最好的,但是足以使你的工作正常进行。在下一节,你会看到DbUtils中最有用的类以及一些关于它们的用法的例子。你应该能够很容易地使用这些编码和例子,然后能够马上在你自己的项目中开始使用DbUtils。我将会集中精力于两个类(org.apache.commons.dbutils.DbUtils 和org.apache.commons.dbutils.QueryRunner)和一个接口(org.apache.commons.dbutils.ResultSethandler).在我给你们一些关于它们的用法的例子之前,让我们深入DbUtils里面来仔细看看它给我们提供了些什么。
DbUtils
DbUtils是一个为做一些诸如关闭连接、装载JDBC驱动程序之类的常规工作提供有用方法的类,它里面所有的方法都是静态的。
这个类里的重要方法有:
- close:DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭连接、声明和结果集(ResultSet)。
- CloseQuietly: CloseQuietly这一方法不仅能在连接、声明或者结果集(ResultSet)为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。如果你不想捕捉这些异常的话,这对你是非常有用的。在重载CloseQuietly方法时,特别有用的一个方法是closeQuietly(Connection conn,Statement stmt,ResultSet rs),这是因为在大多数情况下,连接、声明和结果集(ResultSet)是你要用的三样东西,而且在最后的块你必须关闭它们。使用这一方法,你最后的块就可以只需要调用这一方法即可。
- CommitAndCloseQuietly(Connection conn):这一方法用来提交连接,然后关闭连接,并且在关闭连接时不向上抛出在关闭时发生的一些SQL异常。
- LoadDriver(String driveClassName): 这一方法装载并注册JDBC驱动程序,如果成功就返回TRUE。使用这种方法,你不需要去捕捉这个异常ClassNotFoundException。使用loadDrive方法,编码就变得更容易理解,你也就得到了一个很好的Boolean返回值,这个返回值会告诉你驱动类是不是已经加载成功了。
ResultSetHandler
正如它的名字所提示的,这一接口执行处理一个jaca.sql.ResultSet,将数据转变并处理为任何一种形式,这样有益于其应用而且使用起来更容易。这一组件提供了ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, and ScalarHandler等执行程序。
ResultSetHandler接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。因此任何ResultSetHandler 的执行需要一个结果集(ResultSet)作为参数传入,然后才能处理这个结果集,再返回一个对象。因为返回类型是java.lang.Object,所以除了不能返回一个原始的Java类型之外,其它的返回类型并没有什么限制。如果你发现这七个执行程序中没有任何一个提供了你想要的服务,你可以自己写执行程序并使用它。
QreryRunner
这个类使执行SQL查询简单化了,它与ResultSetHandler串联在一起有效地履行着一些平常的任务,它能够大大减少你所要写的编码。QueryRunner类提供了两个构造器:其中一个是一个空构造器,另一个则拿一个 javax.sql.DataSource 来作为参数。因此,在你不用为一个方法提供一个数据库连接来作为参数的情况下,提供给构造器的数据源(DataSource) 被用来获得一个新的连接并将继续进行下去。
这一类中的重要方法包括以下这些:
- query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):这一方法执行一个选择查询,在这个查询中,对象阵列的值被用来作为查询的置换参数。这一方法内在地处理PreparedStatement 和ResultSet 的创建和关闭。ResultSetHandler对把从 ResultSet得来的数据转变成一个更容易的或是应用程序特定的格式来使用。
- query(String sql, Object[] params, ResultSetHandler rsh):这几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造器的数据源(DataSource) 或使用的setDAtaSource 方法中重新获得的。
- query(Connection conn, String sql, ResultSetHandler rsh):这执行一个不要参数的选择查询。
- update(Connection conn, String sql, Object[] params):这一方法被用来执行一个插入、更新或删除操作。对象阵列为声明保存着置换参数。
现在让我们来看一个例子,在这里你可以从一个数据库中获得一些数据。比如说,我正在使用MySQL 数据库.你还需要下载MYSQL JDBC驱动程序。我正在使用的MySQL数据库在本地主机,端口号为3306上运行。这个数据库地名字叫做test。你将要用到的Student表的结构如下:
Columns Type
——- —-
StudId int
Name varchar
在列表A中,你将会从Student表中得到一些信息,而且你可以按照你自己的额外需要修改这些信息。尽管你在使用JDBC,但要注意你几乎没写JDBC编码。(你可能要改变在例子中所规定的用户名和密码,这是以你的具体的数据库配置为基础的。)
这个编码遵从以下步骤:
1.加载JDBC驱动程序类,并用DriverManager来得到一个数据库连接。
2.例示 QueryRunner 类。
3.使用连接、SQL查询、参数和ResultSetHandler来作为输入的查询方法。你使用一个类org.apache.commons.dbutils.handlers.MapListHandler,一个类 MapListHandler来获得一个结果集(ResultSet)并返回一个jaca.util.Map的实例java.util.List。因此结果集(ResultSet) 的每一行都变成了一个java.util.Map,所有这些java.util.Map的实例绑在一起放在一个java.util.List 中。
4. 反复得到列表(List)的值就是通过在列表(List)中获得每一个Map的值。
5.用QueryRunner 来执行一个没有参数的方法。在这里你要用BeanListHandler ,它是一个非常有用的ResultSetHandler ,因为你可以把ResultSet 转变成一个指定的Bean的列表中。这时你可以指定一个Bean类到Bean StudentBean中,如同在列表B中所显示的那样。
6. 你通过反复从列表(List)中得到多个bean,然后就可从每一个StudentBean实例中获取值。
注释:在列表B中,StudentBean 类中的StudId 必须是int,这是因为表Student的StudId列的类型是int。坚持这个类型的匹配是我们需要遵从的唯一规则。
因为在这种情况下,StudentBean 类的属性和表Student 的字段是完好的对映着的,只要将StuentBean 类作为一个参数就是一个技巧。字段值用和字段名一样的名字插入到类的属性中。然而,如果你想要更多地控制bean的创建,则类BeanListHandler提供了第二个构造器:BeanListHandler(java.lang.Class type, RowProcessor convert). 接口Rowprocessor的执行把结果集(ResultSet)的各行转化成一个对象组。在 StudentBean这一案例中,RowProcessor中的BasicRowProcessor 的执行被利用上了,它能够执行这项任务。然而,你可以写一个新的执行并把它提供给BeanListHandler的构造器。
当然,执行这一编码的输出取决于你从表Student中获得哪些数据。对我来说,我得到了以下这些输出:
***Using MapListHandler***
Id >>1
Name >>One
Id >>2
Name >>Two
***Using BeanListHandler***
Id >>1
Name >>One
Id >>2
Name >>Two
Id >>3
Name >>Three
除了到目前为止你已经看了的类以外,另外一些你需要研究的类是:
- org.apache.commons.dbutils.QueryLoader:QueryLoader是一个从一个文件加载查询到一个Map的简单的类。然后,当需要的时候,你从 Map 中选择一些查询。在没有专门去接触代码的情况下,一个文件中的Having查询也可以改变得尽可能的简单。
- org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet:这个类对使用一个系统方法来解决NULL值问题是很有用的。用一个 SqINullCheckedResultSet 的实例来限制一个常规的结果集(ResultSet) ,然后详细地说明在遇NULL值的情况下应该做些什么。
- org.apache.commons.dbutils.wrappers.StringTrimmedResultSet:用类StringTrimmedResultSet 来约束一个结果集,这样一来,你就可以修整所有getString()和getObject()方法返回的字符串。
DbUtils 组件很好也很小巧,很值得在所有用到JDBC的项目中去使用。
| import java.util.*; import java.util.logging.*; import java.sql.*; import org.apache.commons.dbutils.*; import org.apache.commons.dbutils.handlers.*;public class TestDBUnits { public static void main(String[]args) throws Exception { TestDBUnits test = new TestDBUnits(); for(int i = 0 ; i < 1 ; i++) { test.testQuery1(); test.testQuery2(); test.testUpdate(); } } public void testQuery1(){ try { QueryRunner qr = new QueryRunner() ; ResultSetHandler rsh = new ArrayListHandler(); String strsql = “select * from test1″; ArrayList result = (ArrayList)qr.query(getConnection() ,strsql ,rsh); //System.out.print(”"); } catch(Exception ex) { ex.printStackTrace(System.out); } } public void testQuery2(){ try { QueryRunner qr = new QueryRunner() ; ResultSetHandler rsh = new MapListHandler(); String strsql = “select * from test1″; ArrayList result = (ArrayList)qr.query(getConnection() ,strsql ,rsh); for(int i = 0 ; i < result.size() ; i++) { Map map = (Map)result.get(i); //System.out.println(map); } //System.out.print(”"); } catch(Exception ex) { ex.printStackTrace(System.out); } } public void testUpdate(){ try { QueryRunner qr = new QueryRunner() ; ResultSetHandler rsh = new ArrayListHandler(); String strsql = “insert test1(page ,writable ,content)values(’ttt’,'ttt’,'faskldfjklasdjklfjasdklj’)”; qr.update(getConnection() ,strsql); //System.out.print(”"); } catch(Exception ex) { ex.printStackTrace(System.out); } } private Connection getConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException { String strDriver = “org.gjt.mm.mysql.Driver”; String strUrl = “jdbc:mysql://localhost:3306/test”; String strUser = “root”; String strPass = “”; Class.forName(strDriver).newInstance(); return DriverManager.getConnection(strUrl, strUser, strPass); } } |
roller4.0 安装小记,总结了I18N的安装要点(转载 自http://lokvin.javaeye.com)
roller4.0 安装小记
roller4.0 安装总体感觉很方便。有安装向导页面,自动建立数据库表。
但也有一点小问题,install-guide 上没有写得太详细,也可能我看得不够仔细,呵呵
。一个是没有说配置连接池配置文件,另一个是中文有点问题。
总结如下:
安装环境:
JDK 1.5.05
tomcat-5.5.17
mysql-5.0.27
apache-roller-4.0
安装使用的是 msyql 数据库,现建立数据库和用户
mysql> create database rollerdb default charset utf8 collate utf8_general_ci;
文档install-guide 上 create database rollerdb ; 建立的数据库默认是 lat1 字符
编码,中文会有问题所以使用 utf8 编码
给用户授权
mysql> grant all on rollerdb.* to scott@’%’ identified by ‘tiger’;
mysql> grant all on rollerdb.* to scott@localhost identified by ‘tiger’;
mysql> create database rollerdb default charset utf8 collate utf8_general_ci;
文档install-guide 上 create database rollerdb ; 建立的数据库默认是 lat1 字符
编码,中文会有问题所以使用 utf8 编码
给用户授权
mysql> grant all on rollerdb.* to scott@’%’ identified by ‘tiger’;
mysql> grant all on rollerdb.* to scott@localhost identified by ‘tiger’;
为了使用java mail 发送邮件,tomcat 的 common/lib 文件夹中放入 activation.jar,
javamail.jar
困了,先睡了回头再写…
各位新年快乐!
在 conf/server.xml 文件中的connector加入 URIEncoding=”UTF-8”, 为了I18N
例如:
<Connector port=”8080″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” redirectPort=”8443″ debug=”0″
acceptCount=”100″ connectionTimeout=”20000″
disableUploadTimeout=”true”
URIEncoding=”UTF-8″ />
将roller 发行包的 roller 文件夹copy 到tomcat 的 webapps 下。
关于JDBC 驱动 install-guiade 上说
For MySQL 4.1.x 使用 the J/Connector 3.0.X JDBC
For MySQL 5.X use the J/Connector 3.1.X JDBC drivers
拷贝到 tomcat/common/lib 下
建立一个 roller-custom.properties 文件内容如下:
installation.type=auto
database.configurationType=jdbc
database.jdbc.driverClass=com.mysql.jdbc.Driver
database.jdbc.connectionURL=jdbc:mysql://localhost:3306/rollerdb?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8
database.jdbc.username=scott
database.jdbc.password=tiger
mail.configurationType=properties
mail.hostname=smtp-server.example.com
mail.username=scott
mail.password=tiger
roller-custom.properties 放到 tomcat/common/classes 下
(这里有一个问题我不大明白,在roller-custom.properties
文件里指定了数据库连接,但是还需要制定一个数据库的连接池
给roller 才能正常工作,而且注意 database.jdbc.connectionURL=jdbc:mysql://localhost:3306/
rollerdb?autoReconnect=true&useUnicode
=true&characterEncoding=utf-8&mysqlEncoding=utf8
属性,如果按install-guide 的 database.jdbc.connectionURL=jdbc:mysql://localhost:3306/
rollerdb 中文是会乱码的)
在\tomcat-5.5.17\conf\Catalina\localhost放入一个 roller.xml
文件,内容如下:
Java代码
<Context path=”/roller”
docBase=”roller” debug=”0″>
<Resource name=”jdbc/rollerdb” auth=”Container”
type=”javax.sql.DataSource”
driverClassName=”com.mysql.jdbc.Driver”
url=”jdbc:mysql://localhost:3306/rollerdb?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8″
username=”root”
password=”mysql”
maxActive=”20″
maxIdle=”3″
removeAbandoned=”true”
maxWait=”3000″ />
<!– If you want e-mail features, un-comment the section below –>
<!–
<Resource name=”mail/Session” auth=”Container”
type=”javax.mail.Session”
mail.smtp.host=”mailhost.example.com” />
–>
</Context>
<Context path=”/roller”
docBase=”roller” debug=”0″>
<Resource name=”jdbc/rollerdb” auth=”Container”
type=”javax.sql.DataSource”
driverClassName=”com.mysql.jdbc.Driver”
url=”jdbc:mysql://localhost:3306/rollerdb?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8″
username=”root”
password=”mysql”
maxActive=”20″
maxIdle=”3″
removeAbandoned=”true”
maxWait=”3000″ />
<!– If you want e-mail features, un-comment the section below –>
<!–
<Resource name=”mail/Session” auth=”Container”
type=”javax.mail.Session”
mail.smtp.host=”mailhost.example.com” />
–>
</Context>
其实就是指定了一个 jdbc/rollerdb 的 jndi datasource,
如果没有的话,会发现每次见了用户,登陆时就登陆不了。提示
密码或用户错,但是用户确实在数据库表中了,我觉得
roller-custom.properties
和roller.xml 中的数据源配置都用到了,有点奇怪。
回头看看源码可能就知道是怎么回事了。
启动tomcat ,就可以正常安装roller 了
Spket Eclipse Plugin & IDE(Ext在Spket上的安装方法)www.extjs.com
很cool!
Spket Eclipse Plugin & IDE
The Spket IDE has by far the most superior code assist for Ext 2.0. It uses the Ext .jsb project file and embedded script doc to build code assist that includes options inherited from base classes and full documentation.
It doesn’t have much for editing other types of files though (e.g. CSS), so my preference is to install it as an Eclipse plugin in Aptana. To install the plugin in Aptana:
- Download and install Aptana Studio (includes Eclipse).
- Start Aptana and navigate the application menu to: Help → Software Updates → Find and Install… → Search for new features to install → New remote site…
- Name: “Spket”, Url: “http://www.spket.com/update/”
- Restart Aptana
- Watch this Spket IDE Tutorial to see how to easily add Ext code assist (you can point it at the latest /src/ext.jsb to keep code assist up to date with the latest Ext version). The steps are basically:
- Window → Preferences → Spket → JavaScript Profiles → New
- Enter “ExtJS” and click OK
- Select “ExtJS” and click “Add Library”, then choose “ExtJS” from the dropdown
- Select “ExtJS” and click “Add File”, then choose the “ext.jsb” file in your “./ext-2.x/source” directory
- Set the new ExtJS profile as the default by selecting it an clicking the “Default” button on the right-hand side of the “JavaScript Profiles” dialog.
- Restart Aptana
- Create a new JS file and type: Ext. and you should get the Ext Code completion options.
Since you will have installed it as a plugin in Aptana, chances are Aptana will still be your default JS editor. So to try Spket, you need to right click on a file and select Open with -> Spket JavaScript Editor.

spket 1.6.6 破解 (暴力)
没有注册的版本,用的不爽。
居然没有混淆,反编译了下,修改里面的一个Class文件,就ok了。
com.spket.ui_1.6.6.jar –》\com\spket\ui\internal\License.class
把这个解压到com.spket.ui_1.6.6.jar\com\spket\ui\internal
Roller 安装文档(翻译)
可惜网上中文的文档不多,官方e文的文档也不多,连API也没有提供,所以,我觉得,先把他的三个文档翻译下,一来方便我学习,二来,给同时给感兴趣的又不敢冒e文同志的一些方便(声明下,我像是也不怎么感冒e文,所以敢同身受)。
废话少说,先贴点出来,接下来连载啦。
目录
1 概述
1.1 版权和商标信息
1.2 反馈
1.3 文档说明
1.4 更改和补充
2 5分钟安装
3 准备滚动了吗?
3.1 Tomcat:Javamail 和 Activation(发邮件的java API )
3.2 Tomcat:URI编码国际化支持(I118N)
4 下载和解压Roller
4.1 安装目录说明
4.2 Roller博客打包(WAR包)
5 准备Roller所需数据库
5.1 创建Roller数据库
5.2 检验JDBC数据库驱动设置
5.3 MySQL和Oracle的注意事项
6 配置Roller
6.1 以MySQL为例子
7 部署Roller
7.1 把 roller-custom.properties 放到 classpath的路径下
7.2 通过控制台部署Roller
8 开始使用Roller
8.1 引导完成Roller的安装
8.2 注册一个用户及创建一个博客
9 配置技巧和小窍门
9.1 设置 Roller的Planet聚合器
9.2 修改security.xml里的关键字
9.3 使用服务器提供的数据库和邮件资源
9.4 手动创建及其升级表的操作
10 升级Roller
10.1 从Roller 2.x升级到Roller 4.0
10.2 备份Roller老版本
10.3 安装设置Roller新版本
11 roller.properties
1 概述
这份文档是讲如何安装 Apache Roller 博客软件的。将会告诉你首先该装什么,如何下载Roller,如何设置Roller,以及如何将Roller安装到现有的java应用服务器及其关联数据库上。同样也提供了更具有亲和的5分钟安装说明。
1.1 版权和商标信息
这份文档遵循Apache Software License的条款(嘻嘻,开源啦~)。
在这个文件里的所有的商标属于法定所有者(估计就是Roller的开发者或组织)。
1.2 反馈(联系方式)
如有对这个文档有任何意见或建议,请直接发送到: user@roller.apache.org。
1.3 文档说明
这份文档的初始版本是由Dave Johnson撰写的,当前版本是由Apache 组织下的Apache Roller 项目组维护。
这份文档的格式是基于OpenOffice.org项目下的OpenDS项目文档模板。
| 日期 | 变更描述 |
| 2007七月 | 重写了Roller4.0简单安装步骤 |
2 5分钟安装
如果你知道将要怎么做,你只需要快速的预览获取的Roller安装包以及恰当支持的平台(如,Tomcat和MySQL),或许你就可以通过本写简单的5分钟安装步骤完成安装。如果你没有信心完成,可以跳到第三部分。下面就开始介绍如何在5分钟内安装Roller:
第一步:下载Roller(Zip或GNU Tar)压缩包,解压到你本机的硬盘上。
第二步:创建一个放置Roller数据表的数据库。
例如,在MySQL上你或许会这么做:
2password: *****
3mysql> create database rollerdb;
4mysql> grant all on rollerdb.* to scott@‘%‘ identified by ‘tiger‘;
5mysql> grant all on rollerdb.* to scott@localhost identified by ‘tiger‘;
第三步: 创建一个roller-custom.properties配置文件,放在Servlet 容器的Classpath下,例如,Tomcat上就放在common/classes.如下配置你的数据库以及邮件服务器替换文件里的粗体部分。
校验你servlet容器下的JDBC和javamail的设置。确保你的数据库的JDBC驱动在你的Servlet容器的classpath路径下,例如Tomcat的驱动放置的路径为common/lib。如果你还需要发送邮件的话,还要把Javamail和Activation.jar(mail.jar和activation.jar)放到该路径下。
第五步:使用Servlet 容器管理控制台部署Roller目录到Servlet 容器上。Roller应用就会安装到webapp/roller目录下第六步:浏览打开Roller(或许是http://localhost:8080/roller)。如果Roller运行正常,那么就继续第八部分,开始使用Roller。如果Roller没法运行而且你无法形容为什么这样,那就试着采用正常安装步骤从以下第三部分开始。
3 准备滚了吗?
首先,我们来确认你用来安装和运行Roller要做的每一件事。
Roller是一个需要数据库驱动的java 网络应用。所以你要运行该应用,需要Java,Java Servlet 容器像Tomcat和 一个数据库像MySQL。特别明确下,安装和运行Roller所要具备的条件:
. Java开发工具集(JDK),需要Sun Java2 SE 1.5 JDK。在你的计算机上安装Roller就要配置Java SE 5。Roller 3.x是最后一个支持Java1.4.2的版本。
. 一个Java 应用服务,特别指出要支持Servlet2.4API的Servlet 容器。在下面,都称其为服务(server)。Roller社区往往就对Tomcat 5.5,Tomcat 6.0,Sun Web Server 7.0以及Glassfish2.0的使用中的问题作答。
.一个关联数据库 例如,MySQL或Apache Derby。Roller社区倾向于使用和回答问题关于MySQL and Apache Derby,但是Roller也可以使用其他数据库。Roller创建了针对DB2,Derby,HSQL-DB,Microsoft SQL Server,MySQL,Oracle 和PostgreSQL这些数据库的脚本。
如果你正在使用Tomcat的话,下面部分将验证Tomcat所需具备的事项,否则,你可以直接看第四部分:下载解压Roller。
3.1 Tomcat:JavaMail and Activation
Tomcat没有包含Roller所需电邮公告(发送)的java Mail 和 Activation 的jar包,所以,如果你要使用Roller的电邮公告的功能,你就需要下载那些jar包放到Tomcat的Classpath下。需要从Sun的站点下载(http://java.sun.com/products/javamail)然后放到Tomcat的common/lib 目录下。
3.2 Tomcat:URI 编码国际化(I118N)
Roller 支持国际化(I18N),但是Tomcat需要另外的一些设置。你必须确保Tomcat的URI编码是设置为UTF-8.因此你要修改Tomcat配置文件conf/server.xml在每一个连接元素加URIEncoding=”UTF-8″,就像下面这样:
<Connector port=”8080″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” redirectPort=”8443″ debug=”0″
acceptCount=”100″ connectionTimeout=”20000″
disableUploadTimeout=”true”
URIEncoding=”UTF-8″ />
确保Roller所要用到的连接加以修改。例如,你使用AJP连接或HTTPS 连接,同样也要加URIEncoding=”UTF-8″的属性。
4 下载解压Roller
2database.configurationType=jdbc
3database.jdbc.driverClass=com.mysql.jdbc.Driver
4database.jdbc.connectionURL=jdbc:mysql://localhost:3306/rollerdb
5database.jdbc.username=scott
6database.jdbc.password=tiger
7mail.configurationType=properties
8mail.hostname=smtp-server.example.com
9mail.username=scott
10mail.password=tiger
第四步:
从http://roller.apache.org下载Apache Roller 版本文件.如果你是Windows用户就下载.zip文件,用你所喜爱的解压工具解压这个文件。Unix用户就下载.tar.gz文件,使用GNU tar 来解压。
4.1 安装目录展示
一旦你解压这个文件,你将发现如下结构的目录
LICENCE.txt 和 NOTICE.txt包含了Apache Software Liscense以及其他一些同版本关联的法律条文。README.txt指出了这篇文档所在的doc目录。
4.2 Roller博客网络应用程序
Roller博客程序在webapp/roller目录下,采用了标准的Java EE WAR 的目录结构。一般来说,你不需要修改者里面的任何文件。你可以部署这个在目录表单里,或者部署一个文件,那就要打包成.war文件。
例如,这里是打包成WAR文件的方法:
2% jar cvf ../roller.war *
5 准备Roller所需的数据库
在你安装Roller之前,先要为Roller所需的数据库做一些准备工作。
你在一些地方存放Roller的数据表,有的人称之为数据表空间,但是我们情愿称其为数据库。
你需要创建一个数据库,或让数据库管理员来为你创建。然后你需要为你的数据库选择一个JDBC驱动来安装。
如果你正在将Roller安装到Glassfish并JavaDB/Derby数据库的话,你就可以跳过这一部分了;Derby不需要创建数据库,并且Glassfish也包含了Derby的JDBC驱动。
5.1 创建一个Roller所需的数据库
如果你有幸有自己的数据库管理员,就请他们安装一个数据库,当他们做完后,问他们要如下的信息,你之后会用到:
. 用来连接数据库的用户名和密码
. 连接数据库的 JDBC的地址(URL)
. JDBC的类名
如果你没有数据库管理员,那你就只能参照文档准备数据库。你需要创建一个Roller所需的数据库,并使用用户名和密码来保护。例如,你正在使用的数据库是MySQL,请如下操作:
2password: *****
3mysql> create database rollerdb;
4mysql> grant all on rollerdb.* to scott@‘%‘ identified by ‘tiger‘;
5mysql> grant all on rollerdb.* to scott@localhost identified by ‘tiger‘;
5.2 检查JDBC驱动设置
确保在服务器上安装的是正确的JDBC驱动。通常,基本上都是JDBC驱动的jar包,然后放在服务器的CLasspath的路径下。例如,在Tomcat5.5上是common/lib,在Tomcat6.0上是在lib,在Glassfish的domain的lib目录下。
5.3 MySQL和Oracle考虑事项
基于我们支持MySQL的经验,我们如下的建议:
. 对于MySQL,确保TCP/IP网络是可用的。
. 对于MySQL4.1.x 使用J/Connector3.0.xJDBC驱动替代更加新的3.1.x系列。
. 对于MySQL5.x 使用J/Connector3.1.xJDBC驱动替代更加新的3.1.x系列。
. 确保MySQL的 UTF-8支持可用。详情见如下的页面:
http://rollerweblogger.org/wiki/Wiki.jsp?page=SetupUTF8onMySQL
.对于Oracle的用户,请使用ojdbc14.jar的10g(10.1.0.2更高)驱动,即使是在对Oracle9服务器操作。
先贴到这里,明天继续。
6 设置Reller
可能让你设置Roller的文件只有一个:
roller-custom.properties
那是一个简单的Java属性配置文件,
一个重写了Roller内部默认设置(roller.properties)文件。用来设置你所看到的Roller内部配置文件,决定哪些属性你需要重写,可以在roller-custom.properties文件里设置那些属性。
你可以找到完整的Roller 内部配置文件(roller.properties)在第11部分,也建议你可以看一下,但是在这里我们举个简单的例子只要你知道如何配置数据库让Roller运行。
创建一个名为roller-custom.properties内容如下的的文本文件,但是从、需要替换斜体部分的文字用来设置你的数据库和邮件服务器。
是告诉Roller是自动安装模式。在这个模式下,提供非常详细的错误详情来帮助你调试数据库连接的问题。如果Roller发现数据库存在但是表不存在,则会运行数据库创建脚本,如果发现表存在,但是不是当前版本的Roller则会提供表的升级。一旦Roller安装成功,并且需要在线使用,则你应该设置installation.type=manual。
2database.configurationType=jdbc
3database.jdbc.driverClass=JDBC driver [class name]
4database.jdbc.connectionURL=JDBC connection URL
5database.jdbc.username=database username
6database.jdbc.password=database password
7mail.configurationType=properties
8mail.hostname=mail server hostname
installation.type=auto
6.1 MySQL例子
这里的roller-custom.properties示范了MySQL连接。显示了MySQL JDBC
驱动类名,MySQL连接URL,以及用来连接邮件服务器的用户名、密码
2
3database.jdbc.driverClass=com.mysql.jdbc.Driver
4
5database.jdbc.connectionURL=jdbc:mysql://localhost:3306/rollerdb
6
7database.jdbc.username=scott
8
9database.jdbc.password=tiger mail.configurationType=properties mail.hostname=smtp-
10server.example.com mail.username=scott
11
12mail.password=tiger
13
接下来,我们来部署Roller。
7 部署Roller
现在你已经有了Roller War和Roller配置文件roller-custom.properties,你可以准备部署Roller到服务器上了。首先,部署你的配置文件。
7.1 把roller-custom.properties放到Classpath下
Roller能够找到你的配置文件通过不同的方法,详情你可以看第11部分。
最简单的事,你要做的是把文件在你的应用服务器的classpath下,就是放到Classes的目录下。启动时,Roller将找到配置文件。这里对一些热门的服务器的路径地址。
在Tomcat5.5,拷贝到common/classes目录下。
在Tomcat6.0,拷贝到lib目录下。
在Glassfish,拷贝到你的domain的lib/classes目录下。
现在你可以准备部署Roller了。
7.2 通过管理控制台部署Roller
使用服务器管理控制台来部署Roller网络应用。
你可以部署一个目录,在这种情况下,配置你的安装路径webapp/Roller。或者你可以部署一个WAR文件,在这个情况下你得先创建一个WAR文件(第4.2部分有交代)。
我们来看看如何在Tomacat6.0和Glassfishv2.0部署的。
部署到Apache Tomcat 6.0上
你可以在Tomcat上部署
WAR文件或者是目录。下面这个截屏展示了基于目录的部署项。
一旦Roller被部署,你将看到其他应用的列表里列出。那个/roller是用来链接到Roller的,还有启动,停止,重载,卸载部署的选项。
如果Roller没法启动,请查看问题日志。能在Tomcat的log目录下找到。
Tomcat的日志文件在catalina.out,Roller的日志文件在roller.log下。
部署到Glassfish v2.0上
同样你也可以部署一个WAR文件或者一个目录到Glassfish
一旦Roller被不是上,你将看到Roller也被列在应用列表里。在映射连接到Roller上,有的按钮可用,有的则不展示,或置灰。
如果Roller没有启动,可以在日志里查看问题。你能在Glassfish的domain的logs目录下找到。Glassfish日志是server.log,Roller日志是在roller.log
在你完成了安装步骤后,现在你可以准备开始使用Roller了,所以我们将带你进入Roller,注册一个用户和创建一个博客。我们也会针对发生错误,就是什么问题。
8.1 浏览Roller,完成安装
浏览Roller,如果你使用的是Tomcat或Glassfish安装的,那么Roller也许在http://localhost:8080/roller。你或许会看到一个有错误信息的页面,一个提供创建数据库表的网页或一个提示你完成注册一个管理员用户及创建首页博客的网页。首先,我们来看看当发生错误的时候,就近出了什么问题。
如果是你数据库设置问题,Roller将会展示一个错误信息页面来帮助你诊断这个问题。或许是连错了的JDCB驱动类名,URL链接,用户名,密码。亦或许你的数据库没有启动起来。利用所提供的资料,以确定哪些是错的,修理,然后重新部署Roller
自动创建表
如果你的数据库没有问题,但是Roller没能找到数据表,那么Roller将会提供自动创建的页面。如果你
如果使用这个页面,Roller将会运行创建数据库表的脚本及可以看到创建结果。然后你可以进行下一步设置你的第一个用户帐户和博客。
8.2 注册一个用户,创建一个博客
如果Roller启动好了,但是没有找到博客的首页,那么下面将展示如何注册你第一个用户,创建你第一个博客,设置你的站点的首页。
你必须要决定什么作为你Roller站点的首页。如果你使用Roller
现在你已经完成安装,你应该关闭roller自动安装系统了。编辑roller-custom.properties文件,设置installation.type=manual。
然后重启你的服务器,Roller就接受了新的设置。
接下来做什么?
一旦你启用了Roller,Roller用户指南有关于更多运行Roller系统和博客的信息。通过Roller模板指南信息,来定制你的博客。如果你通过文档无法找到你需要的关于Roller使用的描述,那么你在邮件列表里提问:地址是:http://cwiki.apache.org/confluence/display/ROLLER/Roller+Mailing+Lists
使用java发送邮件的方法(网上看到的,总结下)
简单讲述下发送和接受邮件的协议:
SMTP
简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)由 RFC 821 定义。它定义了发送电子邮件的机制。在 JavaMail API 环境中,您基于 JavaMail 的程序将和您的公司或因特网服务供应商的(Internet Service Provider’s,ISP’s)SMTP 服务器通信。SMTP 服务器会中转消息给接收方 SMTP 服务器以便最终让用户经由 POP 或 IMAP 获得。这不是要求 SMTP 服务器成为开放的中继,尽管 SMTP 服务器支持身份验证,不过还是得确保它的配置正确。像配置服务器来中继消息或添加删除邮件账号这类任务的实现,JavaMail API 中并不支持。
| POP |
POP 代表邮局协议(Post Office Protocol)。目前用的是版本 3,也称 POP3,RFC 1939 定义了这个协议。POP 是一种机制,因特网上大多数人用它得到邮件。它规定每个用户一个邮箱的支持。这就是它所能做的,而这也造成了许多混淆。使用 POP 时,用户熟悉的许多性能并不是由 POP 协议支持的,如查看有几封新邮件消息这一性能。这些性能内建于如 Eudora 或 Microsoft Outlook 之类的程序中,它们能记住一些事,诸如最近一次收到的邮件,还能计算出有多少是新的。所以当使用 JavaMail API 时,如果您想要这类信息,您就必须自己算。
| IMAP |
IMAP 是更高级的用于接收消息的协议。在 RFC 2060 中被定义,IMAP 代表因特网消息访问协议(Internet Message Access Protocol),目前用的是版本 4,也称 IMAP4。在用到 IMAP 时,邮件服务器必需支持这个协议。不能仅仅把使用 POP 的程序用于 IMAP,并指望它支持 IMAP 所有性能。假设邮件服务器支持 IMAP,基于 JavaMail 的程序可以利用这种情况 — 用户在服务器上有多个文件夹(folder),并且这些文件夹可以被多个用户共享。
因为有这一更高级的性能,您也许会认为所有用户都会使用 IMAP。事实并不是这样。要求服务器接收新消息,在用户请求时发送到用户手中,还要在每个用户的多个文件夹中维护消息。这样虽然能将消息集中备份,但随着用户长期的邮件夹越来越大,到磁盘空间耗尽时,每个用户都会受到损失。使用 POP,就能卸载邮件服务器上保存的消息了。
| MIME |
MIME 代表多用途因特网邮件扩展标准(Multipurpose Internet Mail Extensions)。它不是邮件传输协议。但对传输内容的消息、附件及其它的内容定义了格式。这里有很多不同的有效文档:RFC 822、RFC 2045、RFC 2046 和 RFC 2047。作为一个 JavaMail API 的用户,您通常不必对这些格式操心。无论如何,一定存在这些格式而且程序会用到它。
| NNTP 及其它 |
因为 JavaMail API 将供应商和所有其它的东西分开了,您就能轻松添加额外的协议支持。Sun 保留了一张第三方供应商列表,他们利用了 Sun 不提供超出(out-of-the-box)支持范围的协议。您会找到 NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全多用途因特网邮件扩展)及其它支持。
接下来,主要讲下:SMTP的模型
SMTP提供了一种邮件传输的机制,当收件方和发件方都在一个网络上时,可以把邮件直传给对方;当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP首先由发件方提出申请,要求与接收方SMTP建立双向的通信渠道,收件方可以是最终收件人也可以是中间转发的服务器。收件方服务器确认可以建立连接后,双发就可以开始通信。下面是SMTP的模型示意图。
|
发件方SMTP向收件方发处MAIL命令,告知发件方的身份;如果收件方接受,就会回答OK。发件方再发出RCPT命令,告知收件人的身份,收件方SMTP确认是否接收或转发,如果同意就回答OK;接下来就可以进行数据传输了。通信过程中,发件方SMTP与收件方SMTP 采用对话式的交互方式,发件方提出要求,收件方进行确认,确认后才进行下一步的动作。整个过程由发件方控制,有时需要确认几回才可以。
|
为了保证回复命令的有效,SMTP要求发件方必须提供接收方的服务器及邮箱。邮件的命令和答复有严格的语法定义,并且回复具有相应的数字代码。所有的命令由ASCII码组成。命令代码是大小写无关的,如MAIL和 mail ﹑mAIL是等效的。
2. SMTP的基本命令
SMTP定义了14个命令,它们是:
HELO
MAIL FROM:
RCPT TO:
DATA
RSET
SEND FROM:
SOML FROM:
SAML FROM:
VRFY
EXPN
HELP [ ]
NOOP
QUIT
TURN
其中使得SMTP工作的基本的命令有7个,分别为:HELO﹑MAIL﹑RCPT﹑DATA﹑REST﹑NOOP和QUIT.下面分别介绍如下。
HELO–发件方问候收件方,后面是发件人的服务器地址或标识。收件方回答OK时标识自己的身份。问候和确认过程表明两台机器可以进行通信,同时状态参量被复位,缓冲区被清空。
MAIL–这个命令用来开始传送邮件,它的后面跟随发件方邮件地址(返回邮件地址)。它也用来当邮件无法送达时,发送失败通知。为保证邮件的成功发送,发件方的地址应是被对方或中间转发方同意接受的。这个命令会清空有关的缓冲区,为新的邮件做准备。
RCPT –这个命令告诉收件方收件人的邮箱。当有多个收件人时,需要多次使用该命令,每次只能指明一个人。如果接收方服务器不同意转发这个地址的邮件,它必须报550错误代码通知发件方。如果服务器同意转发,它要更改邮件发送路径,把最开始的目的地(该服务器)换成下一个服务器。
DATA–收件方把该命令之后的数据作为发送的数据。数据被加入数据缓冲区中,以单独一行是”.”的行结束数据。结束行对于接收方同时意味立即开始缓冲区内的数据传送,传送结束后清空缓冲区。如果传送接受,接收方回复OK。
REST–这个命令用来通知收件方复位,所有已存入缓冲区的收件人数据,发件人数据和待传送的数据都必须清除,接收放必须回答OK.
NOOP–这个命令不影响任何参数,只是要求接收放回答OK, 不会影响缓冲区的数据。
QUIT–SMTP要求接收放必须回答OK,然后中断传输;在收到这个命令并回答OK前,收件方不得中断连接,即使传输出现错误。发件方在发出这个命令并收到OK答复前,也不得中断连接。
下面是SMTP答复中用到的代码和含义:
500 Syntax error, command unrecognized
[This may include errors such as command line too long]
501 Syntax error in parameters or arguments
502 Command not implemented
503 Bad sequence of commands
504 Command parameter not implemented
211 System status, or system help reply
214 Help message
[Information on how to use the receiver or the meaning of a
particular non-standard command; this reply is useful only to the human user]
220 Service ready
221 Service closing transmission channel
421 Service not available, closing transmission channel
[This may be a reply to any command if the service knows it must shut down]
250 Requested mail action okay, completed
251 User not local; will forward to
450 Requested mail action not taken: mailbox unavailable
[E.g., mailbox busy]
550 Requested action not taken: mailbox unavailable
[E.g., mailbox not found, no access]
451 Requested action aborted: error in processing
551 User not local; please try
452 Requested action not taken: insufficient system storage
552 Requested mail action aborted: exceeded storage allocation
553 Requested action not taken: mailbox name not allowed
[E.g., mailbox syntax incorrect]
354 Start mail input; end with .
554 Transaction failed
最后,让我们看一个RFC821中给出的例子。这封信是Smith在主机Alpha.ARPA 发给主机Beta.ARPA上的
Jones,Green和 Brown.并且假定两台主机在同一个网络上。
S: MAIL FROM:
R: 250 OK
S: RCPT TO:
R: 250 OK
S: RCPT TO:
R: 550 No such user here
S: RCPT TO:
R: 250 OK
S: DATA
R: 354 Start mail input; end with .
S: Blah blah blah…
S: …etc. etc. etc.
S: .
R: 250 OK
邮件最后被对方接受。
◆ 电子邮件的工作原理
电子邮件与普通邮件有类似的地方,发信者注明收件人的姓名与地址(即邮件地址),发送方服务器把邮件传到收件方服务器,收件方服务器再把邮件发到收件人的邮箱中。如下图所示:
|
更进一步的解释涉及到以下几个概念:
MUA — Mail User Agent, 邮件用户代理,帮助用户读写邮件;
MTA — Mail Transport Agent, 邮件传输代理,负责把邮件由一个服务器传到另一个服务
器或邮件投递代理;
MDA — Mail Delivery Agent, 邮件投递代理,把邮件放到用户的邮箱里。
整个邮件传输过程如下:
目前使用的SMTP 协议是存储转发协议,意味着它允许邮件通过一系列的服务器发送到最终目的地。服务器在一个队列中存储到达的邮件,等待发送到下一个目的地。下一个目的地可以是本地用户,或者是另一个邮件服务器,如下图所示。
|
如果下游的服务器暂时不可用,MTA 就暂时在队列中保存信件,并在以后尝试发送。
◆ 电子邮件的信头结构及分析
1 .邮件的结构
在最高层,邮件的结构是非常简单的,用户从终端机上看到的邮件格式一般为:
1. From: user1@domain1.com
2. To: user2@domain2.com
3. Subject: Explaination of mail format
4. Date: Thu, 1 Apr 1999. 10:00:00 GMT
5. Hi, Jack
7. This mail is to explain you the mail format
8. - - - -
9. Thanks
10. Bob
其中, 1~~4 行称作信件信头(message header) 6~~10行描述信件要表达的内容,称为信体 (message body)。第5行是空行,根据RFC822的要求,信头和信体之间必须加入一空行。[i]信头通常包含字段From, To, Subject 和Date,有的邮件还包含cc,bcc等字段。
2. 邮件的信头
事实上,邮件在传输过程中,服务器要把它打包成一个数据对象,包括上面的信件和一个信封。邮件的投递是依靠信封上的地址或信封信头(envelop address 或envelop header),而不是上面讲的信件上的地址。
从表面上看,一封邮件是从发件人的机器直接传送到收件人的机器,但通常这并不正确,一封邮件发送和接受过程至少要经过四台计算机。参考下图所示。用户通常在自己的电脑前编写阅读邮件,我们把它叫做客户端 (client 1~~4 )。大部分组织里,都是用一台专门的机器处理邮件,称作邮件服务器 (SMTP1, SMTP2). 如果用户是从家里拨号上网,那末邮件服务器是ISP 提供的。
|
当某个用户在自己的电脑 Client1 前编写完一个邮件,然后把它发送到他的ISP 的邮件服务器SMTP1。此时她的机器已经完成了所有的工作,但邮件服务器SMTP1还必须想法把邮件发送到目的地。SMTP1 通过阅读信头或信封上的地址,找到收件认得邮件服务器SMTP2, 然后与该服务器建立连接,把邮件发到收件人的服务器上,等待收件人来取阅。
下面我们将通过一个例子说明整个邮件传送过程及邮件的信头变化。假设发件人的名字叫 Sender, email地址是 sender@domain1.com使用的电脑名字叫 client1, IP 地址是 [111.11.1.1] (假设的地址)。 收件人的名字叫 receipt, email 地址是 receipt@domain2.com, 使用的电脑的名字叫 client2,IP 地址是 [222.22.2.2] (假设的地址)。当邮件编辑完传送给其邮件服务器mail.domain1.com 时,邮件的信头格式为:
From: sender@domain1.com
Date: Tue, Mar 18 1998 15:36:24 GMT
X-mailer:Sendmail 8.9.0
Subject: Greetings
当邮件服务器 mail.domain1.com 把邮件传到接收方的服务器 mail.domain2.com 时,接受方服务器会在信头上记录下有关的计算机信息,邮件的信头变成:
Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:3 7:24 GMT
From: sender@domain1.com
Date: Tue, Mar 18 1998 15:36:24 GMT
Message-Id:
X-mailer:Sendmail 8.9.0
Subject: Greetings
当收件人服务器mail.domain2.com 把邮件接收并存初下来,等待收件人来阅读时,邮件的信头将会再加入一条记录:
Received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with ESMTP id LAA20869; Tue, Mar 18 1998 15:39:44 GMT
Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:37:24 GMT
From: sender@domain1.com
Date: Tue, Mar 18 1998 15:36:24 GMT
Message-Id:
X-mailer:Sendmail 8.9.0
Subject: Greetings
上面整个记录就将是收件人看到的完整的邮件信头。让我们逐行看一下信头中各行的含义:
Received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with ESMTP id LAA20869; Tue, Mar 18 1998 15:39:44 GMT
这封信是从一台自称为 mail.domain1.com 的机器上接收的;这台机器的IP 地址是[111.11.1.0],真实名字就是标称名字 mail.domain1.com; 接收方的机器名称是 mail.domain2.com, 运行的邮件服务器是 Sendmail, 版本(8.8.5/8.7.2) 。接收方机器给邮件的编号是ESMTP id LAA20869, 接收到的时间是 Tue, Mar 18 1998 15:39:44 GMT。
Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:37:24 GMT
这条记录表明信件是由机器client1.domain1.com ( IP 地址是 [111.11.1.1]) 在Tue, Mar 18 1998 15:37:24 GMT交给mail.domain1.com,并赋给编号id 004A21。
From,TO ,Date和Subject 都易于理解,分别指明发件人,收件人,信件编辑日期及信件主题。
Message-Id:
这是由发件方邮件服务器赋给这封邮件的编号。与其它编号不同,这个编号自始至终跟随邮件。
————————————
方法一:没有使用JavaMail API,而是根据SMTP协议的要求直接处理协议的细节发送邮件。
MailMessage.java
—————————————-
//这个类其实就是一个基本的JavaBean,用于完成一些基本信息的设置,也可以不要这个东西,直接在程序中写明就可以,不过这样条理较清楚一些,而且修改也方便一些.














