2008年8月28日星期四

什么是J2EE和J2ME?它们是用来干什么的--了解!!

J2EE和JAVA有关系

一、准备篇

1 什么是J2EE?它和普通的Java有什么不同?
答:J2EE全称为Java2 Platform, Enterprise Edition。
“J2EE平台本质上是一个分布式的服务器应用程序设计环境——一个Java环境,它提供了:
·宿主应用的一个运行基础框架环境。
·一套用来创建应用的Java扩展API。”(引自《J2EE服务器端高级编程》)

2 J2EE好学吗?
答:J2EE是很多技术的集合体,并且还在成长中。
你会遇到很多专有名词:比如(X)HTML,Servlet/JSP,JDBC,JMS,JNDI,EJB,XML,Web Service……。
尤其是XML和Web Service正在快速成长。幸运的是,你不需要等到学会所有技术后再开始编程。
大体上J2EE可以分成3个主要应用:Servlet/JSP,EJB,XML/Web Service 和一些支撑技术例如JDBC和JNDI。
你可以一个一个的学。

3 J2EE有什么用?
答:用来建设大型的分布式企业级应用程序。或者用更时髦的名词说就是“电子商务”应用程序。
这些企业可能大到拥有中心数据库服务器,Web服务器集群和遍布全国的办公终端,也可能小到只不过想做一个网站。

4 学J2EE有前途吗?
答:在这一市场目前只有一种技术可以和J2EE竞争,那就是Microsoft的.NET。
相对来说.NET要“新”一些而J2EE要“老”一些。
但是.NET只能用于Windows平台(Microsoft声称要开发C#在Linux上的虚拟机但是尚未兑现该诺言),
考虑到Linux的发展势头,你可以相信.NET不会一统天下。

5 据说J2EE的性能不如.NET好,是真的吗?
答:在Sun公司提供的样例程序Pet Store上,Microsoft声称不如相同的.NET程序好。
而Sun公司反驳说这一程序不能真正体现J2EE的性能,并且指责Microsoft在数据库上做了优化。
作者没有学习过.NET因而不能妄下断言。
无论如何,大型分布式程序中的性能瓶颈通常首先来自于错误的设计。

6 听你说了这么多,我想学着玩玩。
答:除非你想靠它当饭吃或者作为技术储备,否则请不要浪费你的时间。
Flash要好玩得多。计算机游戏就更加好玩了。

7 学习J2EE该怎么开始?
答:首先,下载一个J2EE服务器。其次,去java.sun.com下载J2EE的API。第三,找一本好的参考书。最后,找一个顺手的IDE。
J2EE服务器。你可以用Sun的J2EE SDK(免费),或者Weblogic(性能最好,但是太大,而且作者不推荐盗版行为),或者JBoss(免费,就是文档太少),或者JRun(开发版免费,作者用这个)。参考书作者感觉Wrox的《J2EE服务器端高级编程》不错,但是太老(作者手头的是2001年中文版)。你还需要去下载一些最新的技术资料(当然肯定是英文的)。
IDE如果你的机器配置够好(内存至少512M以上,256M或以下请勿考虑),可以用IBM的WSAD,不然就继续用Eclipse或者其他。
你也可以经常去水木清华的Java版逛逛,但是在发贴前先看看精华区里有没有你要的答案。

8 我下了一个J2EE服务器但是不会配置。
答:请认真阅读随机指导文档,不同的服务器的配置都不一样,作者爱莫能助。

9 我发现你没有提到Tomcat。
答:Tomcat只是一个Web服务器,更准确地说主要只是一个Web Container。
如果你想要学习EJB的话,Tomcat无法满足你的需要。

二、 Servlet/JSP篇

10 什么是Servlet?
答:一个Servlet是一个Java类。它处理Http(s)请求并作出响应,包括返回一个HTML页面或转交给其他URL处理。
Servlet必须运行在一个Web Container例如Tomcat中。
Servlet必须是javax.servlet.http.HttpServlet的子类,
你可以继承doGet()或者doPost()方法,两者分别对应于Http(s)中的Get请求和Post请求。

11 我怎么获得Http请求里的参数?
答:HttpRequest的getParameter()方法。例如:String paramValue = request.getParameter(\"paramName\");

12 我怎么返回结果?
答:你可以利用相关API打开一个输出流,并向流中直接写入一个HTML页面。
但是作者完全不赞成这样做。一方面这样做会很罗嗦。
另一方面从Model-View-Controller模式(在《J2EE核心模式》中被归为Front Controller模式)的观点来看,
你应当提供一些HTML或者JSP作为视图(view),而Servlet则根据请求参数决定转到哪一个视图。
你可以利用response.sendRedirect(...)方法或request.getDispatcher(...).forward()方法来实现。

13 sendRedirect()和forward()有什么不同?
答:sendRedirect()是向浏览器发送一个redirect通知,浏览器重定向到新的URL。
而forward是在服务器端直接转到新的URL,对于浏览器是透明的。
前者浏览器的地址栏显示的是新的URL,后者浏览器的地址栏显示的是Servlet的URL。
因而当目标URL会自动刷新时,两者会造成一些差别。

14 我写了一个Servlet程序,怎么运行它?
答:开发J2EE程序有一个部署(deploy)的概念,实际上是开发——部署——运行的三部曲。
大多数服务器支持Hot deploy。你只需要在相应的Application目录(具体路径依赖于服务器)下面
建立一个符合WAR或EAR格式(参见16,17)的目录,启动服务器,就可以通过浏览器访问了。
特别的,你的Servlet的class文件应当放在/WEB-INF/classes目录中。
注意J2EE SDK不支持Hot deploy,你需要通过它的deploy tool来部署。
Tomcat只支持WAR格式。

15 EAR和WAR有什么不同?
答:EAR是一个完整的J2EE应用程序,包括Web部分和EJB部分。
WAR只是其中的Web部分。

16 EAR格式是怎样的?
答:一个EAR可以包含任意多个WAR或EJB JAR,并且包含一个META-INF的目录。
在/META-INF中包含了一个application.xml,其中描述了这个EAR包含哪些模块,以及安全性配置。
细节请看参考书。

17 WAR格式是怎样的?
答:一个WAR包含一个WEB-INF的目录,这个目录下包含classes目录,lib目录和web.xml。
/WEB-INF/classes存放按package组织的class文件,/WEB-INF/lib目录存放jar文件,
web.xml描述了很多东西,请读参考书。

18 我的普通HTML文件应当放在哪里?
答:放在除了/WEB-INF以外的其他地方。

19 我访问不到servlet,甚至连HTML文件都访问不到!
答:第一你没启动服务器。第二你敲错了端口。第三你没有正确配置context-path。
第四你的服务器不支持auto reload或者你关闭了这一选项,你得重启服务器。
第五确认你没有把HTML放在/WEB-INF目录下,那是访问不到的。

20 我能访问HTML但是访问不到servlet。
答:请检查你的web.xml文件。确保你正确定义了元素。
前者标识了一个servlet,后者将一个相对于context-path的URL映射到一个servlet。
在Tomcat中你可以通过/context-path/servlet/package/servletname的形式访问servlet,
但是这只是Tomcat的便捷访问方式,并不是正式规范。
细节请看参考书。

21 什么是JSP?它和Servlet有什么区别?
答:你可以将JSP当做一个可扩充的HTML来对待。
虽然在本质上JSP文件会被服务器自动翻译为相应的Servlet来执行。
可以说Servlet是面向Java程序员而JSP是面向HTML程序员的,除此之外两者功能完全等价。

22 我的JSP显示的汉字是乱码。
答:在你的JSP开头加上一行 <%@ page contentType=\"text/html; charset=gb2312\"%>
如果你已经声明了page我想你知道该怎么修改。

23 JSP文件存放在哪里?
答:除了/WEB-INF下的任何地方。

24 在JSP里面怎么引用Java Bean。
答:首先,确认你要引用的类在/WEB-INF/classes下或在/WEB-INF/lib的某个jar内。
其次,在JSP里加一行
具体解释请看参考书。

25 我想在servlet间传递数据。
答:利用session。在Servlet/JSP中,你可以在4个地方保存数据。
1) page,本页面。
2) session,用来存放客户相关的信息,比如购物车,对应接口为javax.servlet.http.HttpSession。
session机制实际上是cookie和URL Rewrite的抽象,服务器会自动使用cookie或URL Rewrite来实现。
3) request,可以在forward()时传递信息,对应接口为javax.servlet.http.HttpRequest。
4) application,或称context,存放全局信息,对应接口为javax.servlet.ServletContext。

26 怎么调用cookie?
答:作者建议使用session,你总是会遇到某些禁用cookie的用户。这时session会自动使用URL重写来实现。

27 怎么在JSP里面实现文件下载?
答:实际上这是一个HTML的问题。答案是一个超链接

28 怎么实现文件上传?
答:客户端是HTML问题,在form中设置method为post,enctype为multi-part/form-data,加一个
而在接收的servlet中只是一个I/O问题。

29 我想让页面自动刷新,比如聊天室。
答:这是一个HTML问题,在部分中加一条
这是所谓的Clinet-push,客户端刷新技术。

30 我想让用户登录以后才能访问页面。
答:使用声明式安全措施。
你只需要在web.xml中定义安全角色(Role),并定义受保护的URL集合只能由特定Role访问。
大多数服务器支持基于数据库的用户映射,你只要在相应数据库中建立两张表并配置服务器就可以了。
注意J2EE SDK不支持基于数据库的用户映射。
细节请看参考书和服务器文档。

31 我想要能注册用户。
答:参看30。在接受注册请求的Servlet中执行写入数据库操作即可。

32 怎么在JSP中访问数据库?
答:标准做法是使用DAO模式,定义一个Java bean来访问数据库并在JSP中使用。
然而,当你的数据库模式很简单时,你可以使用JSTL中的标签来快速访问。

33 什么是JSTL?
答:JSTL是Jsp Standard Tag Library的缩写。这是一组通用标签并将成为JSP 2.0的一部分。
其中包含赋值,分支,循环,查询数据库,更新数据库
等。目前你需要像添加自定义标签库一样来添加JSTL,但是可以预计JSP 2.0会将JSTL作为组成部分。
标签库可以在http://jakarta.apache.org下载。注意JSTL需要在支持JSP1.2或更高版本的容器下运行。
帮助文件可以阅读sun的JSTL正式规范。

=======================================================
j2me入门--什么是J2ME及J2ME基础知识


Java发展历史
相信熟悉Java 演进历史的人或多或少都听说过,Java 技术一开始并非就叫做 Java ,而是叫做OAK ,而且最早的时候就是为了嵌入式系统而设计的一项产品。后来因为网际网路的发达,而OAK 的诸多特性刚好又适合用在网路上(例如可移植性、编译后程序码很小),因为商标已被注册的关系,因此 OAK 被改名成Java ,从此因缘际会地成了网路上的闪亮巨星,并随著时间越来越成熟,也慢慢地产生了许多非原本预期中的相关运用。虽然 Java 已经被用到许多企业级软体上,可是其实骨子里面还是非常适合用在嵌入式系统之中。

虽然从Java 1.0 发表之后,Java 就被广泛地使用在桌上型应用程序以及Applet 的开发上,但是,从Java 1.1 开始,Java又回到了它一开始的老路--也就是嵌入式系统方面的应用,在当时Sun Microsystems 发表了Embedded Java 与Personal Java(也有人简称为PJava)这两项规格。其中Embedded Java 是为了资源十分有限,而且没有显示设备的嵌入式装置而设计; Personal Java 则是为了在能够与网际网路连线、并拥有显示系统(例如彩色LCD)的消费性电子装置而设计。接著Java 的版本演进到Java 2 ,这时为了再明显区分各种Java 的应用,所以分割出了J2EE 、J2SE、以及 J2ME 三种版本。这三种版本的各种特性我们已经在前面已经详细地描述,在此不再赘述。不过请大家记住,由於 Java 2将Java 的应用区分成三大块,使得 Java 程序语言的发展不会再像Java 1.1时如树枝状般扩散出去,这么一来有助於大家对 Java 各种应用的澄清,而不会造成今后越发展下去越不可收拾的混乱局面。额外向大家一提的是,后来Personal Java 发展到1.2 版的时候,也采用了一些Java 2 平台上与安全性有关的设计。

J2ME
J2ME 在设计其规格的时候,遵循著「对於各种不同的装置而造出一个单一的开发系统是没有意义的事」这个基本原则。於是 J2ME 先将所有的嵌入式装置大体上区分为两种 :一种是运算功能有限、电力供应也有限的嵌入式装置(比方说PDA 、手机);另外一种则是运算能力相对较佳、并请在电力供应上相对比较充足的嵌入式装置 (比方说冷气机、电冰箱、电视机上盒 (set-top box))。因为这两种型态的嵌入式装置,所以Java 引入了一个叫做Configuration 的概念,然后把上述运算功能有限、电力有限的嵌入式装置定义在Connected Limited Device Configuration(CLDC)规格之中;而另外一种装置则规范为 Connected Device Configuration(CDC)规格。也就是说, J2ME 先把所有的嵌入式装置利用Configuration 的概念区隔成两种抽象的型态。

其实在这里大家可以把Configuration 当作是J2ME 对於两种类型嵌入式装置的规格,而这些规格之中定义了这些装置至少要符合的运算能力、供电能力、记忆体大小等规范,同时也定了一组在这些装置上执行的 Java程序所能使用的类别函式库、这些规范之中所定义的类别函式库为 Java标准核心类别函式库的子集合以及与该型态装置特性相符的扩充类别函式库。比方就CLDC 的规范来说,可以支援的核心类别函式库为java.lang.*、java.io.*、java.util.*,而支援的扩充类别函式库为java.microedition.io.*。区分出两种主要的Configuration 之后,J2ME 接著在定义出Profile的概念。Profile 是架构在Configuration 之上的规格。之所以有Profile的概念,是为了要更明确地区分出各种嵌入式装置上Java 程序该如何开发以及它们应该具有哪些功能。因此Profile 之中定义了与特定嵌入式装置非常相关的扩充类别函式库,而 Java 程序在各种嵌入式装置上的使用者介面该如何呈现就是定义在Profile 里头。Profile 之中所定义的扩充类别函式库是根据底层Configuration 内所定义的核心类别函式库所建立。

虽然J2ME标准繁多,但只要把握住标准划分的原因就很容易掌握。在这个技术飞速发展的领域,我们不能把眼光局限于标准的字面含义,而要灵活掌握,把握其精神。比如,CLDC和CDC的定义中具体的最小内存需求仅仅是\"最小的\",随着硬件能力的飞速发展,很有可能一些界限会变得模糊。PDA本来应该属于CLDC的范围,但是Compaq的iPaq上却实现了CDC。以后的下一代PDA有64M内存并不意外,在其上实现CDC也是完全可能的。但是,从功能的角度,应该还是CLDC以及PDA Profile更适合于PDA的条件。到那时,具体的实现就要看厂商和开发者的选择了。还需要注意的是,由于Profile是建于Configuration之上,作为对Configuration的扩展,因此Profile必须Configuration的支持。有的文章在讲到MIDP的内存需求时,说MIDP需要最少256K,这是指MIDP本身。而有的文章说MIDP需要最少768K,那时因为把作为基础的CLDC所需要的512K算进去了。

CLDC
CLDC是针对少于512KB内存footprint的设备的配置。CLDC采用的是KVM,它是高度优化的JVM方式,他针对的是16比特或32比特的微处理器,160到512 KB内存为基础的低端,网络连接,电池驱动的设备。典型的内存要求是128KB做有来存储KVM和相关的库。更多关于KVM的信息可以从Sun公司的KVM白页中得到。

就网络化而言,CLDC针对的是有限的和间歇性的无线连接设备,所有在J2ME CLDC之上运行的应用软件都应能在其他任何高端的Java VM上运行。当然,这需要CLDC库的支持。CLDC配置关注于I/O,网络化,安全问题,国际化问题和核心Java库等相关的领域。

与事件处理,用户和应用程序的互动,应用程序生存期管理等内容相关的领域是由Profile来处理的。使用界面定义(对于特定的设备,如传呼机,移动电话和PDA)也在Profile层的范围之内,它建立在顶端之上,并使用J2ME配置。Mobile Information Device Profile (MIDP)是一个J2ME profile,它定义了使用CLDC配置设备的用户界面相关的规范。


CLDC从J2SE获得绝大多数的类,但一些针对小内存footprint设备的新类并不是从J2SE APIs获得的。关于类从J2SE 做继承和新CLDC类的具体信息,可参考CLDC规范1.0a版本的6.2和6.3中的内容。Java语言规范中的一些例外是没有浮点支持,没有类实例的完成化支持和有限的错误处理能力。

在这里提到CLDC HotSpot应用也是具有相关性的,它相当于使用CLDC配置的设备的KVM中Java VM的替换。根据Sun公司,CLDC HotSpot执行VM是一个高性能的JVM(32位,采用CLDC v1.0规范)。他在相同的内存footprint上运行时提供比KVM高出一个数量级的更佳的性能。



CDC:完全的Java平台
CDC是应用在具有较大内存,特别是2MB以上的设备上的,CDC针对有限和间歇的无线连接设备,CDC与CVM和Foundation profile共同定义了完全的J2ME环境。

CVM是为用户和嵌入设备设计的完全功能性JVM,它支持所有的Java 2 v1.3 VM安全防护,JNI, JVMDI, RMI,弱引用功能和库。本质上说,CVM具有所有一个驻留桌面系统的JVM所具有的功能。

CDC由J2SE中最小的Java数据包组成。Foundation profile由用户设备所需要的保持类库和APIs所组成。因此,如果你工作在一个以CDC为基础的J2ME环境下,你就需要更新你代码以使APIs更新换代。

CDC是CLDC的一个扩展集,所以在两种配置之间存在着向上的兼容性。CDC和Foundation profile也提供了对使用PersonalJava实时规范开发的应用程序的完全兼容。

J2ME的平台无关性主要指的是设备的宿主操作系统平台。由于Java平台建筑于虚拟机之上,只要不同的操作系统上的虚拟机满足同样的规范和标准,对于虚拟机以上的层次是平台无关的。这使得针对某一Configuration或者Profile的应用可以运行于所有实现了这一Configuration或者Profile的操作系统平台。举例来说,目前已经有网站开始收集基于MIDP的程序--MIDlet,提供下载和收费,各种支持MIDP的设备都可以使用,这包括数量巨大的智能手机和几乎所有的PDA(Palm OS和Pocket PC)。

2008年8月25日星期一

关于php中mail()使用的问题

来源:http://www.phpchina.com/12834/viewspace_21272.html


1.一个发送E-MAIL的脚本也许是你能够在Web 站点上找到的最普通的脚本之一了,虽然它很简单,一个邮件脚本有时会令程序员非常沮丧.PHP中有一个叫做mail()的函数,它只需要知道接收方的地址 和信件主体就可以发送邮件,但是要让mail()按你的意思运行你还需要解决一些棘手的问题.

要使mail()能够运行,你必须有一个SMTP服务器以便PHP能够连接上去.不管这个服务器对邮件程序多么重要,大多数人对它如何运转没有一星半点的概念.在本教程中,我们将揭示SMTP的秘密并解决一些使用PHP发送邮件的常见问题.而本文中的另一些主题将包括循环遍历一个地址列表的方法以及同时以文本和HTML格式向接收者发送一个邮件的方法.

SMTP是简单邮件传输协议(Simple Mail Transfer Protocol)的缩写,而一个SMTP服务器是一台运行这种协议并发出邮件的计算机.运行这种协议实际上指的是运行诸如Sendmail和Qmail的程序--如果你使用的是一台非Windows计算机的话.在Windows平台上,作为Windows NT Service Pack一部分或是内建于Windows 2000内部的SMTP服务程序就是典型的这种程序.

我并不是说SMTP软件包就只有那些,但是它们是最普通的.如果你的Web站点使用了互联网服务提供者的主机软件包(Internet Service Provider\'s virtual hosting package)的一部分,那么SMTP服务程序就应该已经在这台计算机上安装了.如果你是一台位于ISP或是室内的计算机的系统管理员,那么你很有可能已经在这台计算机上安装了某种SMTP软件,用来处理从Web服务器发送邮件的过程.

但 是,如果你是一个个人用户并只有一个开发用的Web服务程序运行在你的个人电脑上,你可能没有在自己的机器上运行SMTP软件.下面是一个非常简单但是准 确的拇指定律:如果你是一个Windows用户而从没有看见SMTP服务器这样的字眼,那么你就没有运行这个程序.如果你确实没有,那么你有两种选择:安 装,配置,和维护一个SMTP服务程序(如果你不知道那是怎么一回事的话就不推荐你使用这种方法)或是使用一个现存的SMTP服务器.
2.

\"如果一个服务器现在没有运行的话,我又怎么使用它呢?\"你可能要问.如果你的计算机是通过拨号连接(或是DSL或电缆)连到互联网的话,你可以使 用你ISP的外发邮件服务器.例如,如果你开发用的 计算机是一个Windows98的系统并使用56kbps modem通过EarthLink连接到互联网,那么你就可以使用mail.earthlink.net作为你的SMTP服务器.不论你对你的外发邮件服 务器使用什么样的邮件客户端(Eudora, Outlook, Netscape Mail等等),它们都将和你的PHP代码使用你的SMTP服务器的过程一样.技巧就是使PHP知道一点点事实.

在php.ini管理配置文件里,有几个条目需要被设置以便mail()函数能够正常运行.在改变它们以前,搞清楚它们都是做什么用的.你可以使用phpinfo()函数通过创建一个文件来显示系统当前的配置情况,这个文件包括:



保存这个文件,将它放置到你的Web服务程序的文件根目录,然后通过你的浏览器访问它.你应该可以看到一个被优美的格式化了的信息,显示你的配置情况.你要查看的条目如下:

SMTP
sendmail_from
sendmail_path
如果你没有使用windows,那么sendmail_path指令就是你唯一要担心的东西.如果你正在使用Windows,你就需要看看最后两个指令.

如果你使用的是Linux或是一个Unix变种,sendmail_path看起来应该象这样:

sendmail_path = /usr/sbin/sendmail

或者如果你使用Qmail:

sendmail_path = /var/qmail/bin/sendmail

在这条指令里,你还可以设置配置参数来指明队列缓冲选项或是显示的设置Return-Path头,如下所示:

sendmail_path = /usr/sbin/sendmail -t -fyou@yourdomain.com

作 为一个非Windows用户,这就是你要做的一切了.如果你使用的是Windows,你有更多的事情要做.你还需要看一看SMTP和 sendmail_from的值.不要被sendmail_from指令名字中的sendmail弄迷糊了.虽然你没有在Windows上使用名叫 Sendmail的程序,但那只是指令的名字.不要被它吓到了.

在你的phpinfo()显示的结果里,看看SMTP和sendmail_from的缺省值--它们要么是空白,要么包含了胡乱的值.你应该把它们改成有意义的值.

如果你决心在这台电脑上运行一个SMTP服务程序,你在php.ini文件中的条目就应该如下:

SMTP = localhost

但是,如果你要使用你ISP(在这个例子中是EarthLink)的外发邮件服务器,那么php.ini中的邮件看起来应该如下:

SMTP = mail.earthlink.net

你也可以使用IP地址而不是域名,因为计算机不区分这两种条目.

第二条配置指令是sendmail_from,它应该被设置成From头中的电子邮件地址.它可以在脚本里被修改但是通常作为缺省值使用.下面就是这个配置指令的示例youraddress@yourdomain.com指的是你自己的邮件地址.

sendmail_from = youraddress@yourdomain.com

在做了这些配置上的改动以后,重启Web服务程序然后使用phpinfo()函数来验证这些修改.在这些工作完成以后,你就可以用PHP来发送电子邮件了.

3.

mail()函数是非常简单的:只有五个参数,而其中的两个是可选的.这些参数是:

* 接收方地址
* 主题
* 信件内容
* 其它文件信息头(可选)
* SMTP服务程序的其它配置选项(可选)


附加的头参数控制了诸如CC, BCC, Reply-To之类的邮件功能,或者其它遵循SMTP协议的功能.在这个例子中,我只使用From 和 Reply-To信息头.

如果你想给我发邮件但你使用的是一个非Windows系统, 程序代码就应该如下:

$to = \"julie@thickbook.com\";
$subject = \"ZDNet Developer article\";
$msg = \"I completely understand SMTP servers now!\";
$headers = \"From: me@mycompany.com Reply-To: someoneelse@mycompany.com\";
$config = \"-fwebmaster@mycompany.com\";
mail(\"$to\", \"$subject\", \"$msg\", \"$headers\", \"$config\");
echo \"finished!\";
?>

如果你使用的是一个基于Windows的SMTP服务,那么你有可能不需要使用第五个参数,而且在附加的头信息参数中(也就是第四个参数),你需要将它们分开写--使用而不是 .所以,同样的一个邮件通过基于Windows的SMTP服务发送的代码如下:

$to = \"julie@thickbook.com\";
$subject = \"ZDNet Developer article\";
$msg = \"I completely understand SMTP servers now!\";
$headers = \"From: me@mycompany.com Reply-To: someoneelse@mycompany.com\";
mail(\"$to\", \"$subject\", \"$msg\", \"$headers\");
echo \"finished!\";
?>

脚本中的echo语句使你的Web浏览器在脚本运行完成的时候向你显示一条信息.如果不写echo语句,你就会得到一个\"空文件\"的对话框,因为没有任何输出能够发送到浏览器端.

只要能够连接到指定的SMTP服务器mail()函数就会返回真值.但是这并不意味着邮件成功的到达了接收方那里.mail()函数不会等待或报告SMTP服务器发来的成功/错误代码.

mail() 函数有可能返回假值,然后给你警告\"无法连接,在第x行\"或是\"未知的错误,在第x行.\"如果这两条信息中的任何一条出现了,你就应该检查php.ini 中的SMTP值.引起这些消息有两种可能:SMTP服务器瘫痪了,或者PHP无法连接到它.无论是这两种情况中的哪一种,你的邮件都无法被发送出去.

这个脚本对这些参数使用硬编码的值.使用一个简单的HTML表单,你就可以在这些参数中插入一些值并拥有一个良好的反馈表单.

一旦你知道了如何给一个人发送邮件,你可能按奈不住要把同一个邮件发送给许多接收者--就象新闻信件一样.所有这些牵涉到一个漂亮轻巧的循环来遍历一个接收者的列表并将邮件发送给他们.mail函数的形式还是相同的:

mail([接收方], [主题], [邮件主体], [头信息]);

你只需要简单的用列表中的下一个名字来替换[接收方].假设你已经有了一个电子邮件地址的数组:

$addresses = array(\"me@mycompany.com\", \"you@yourcompany.com\", \"someone@otherplace.com\");

你所需要做的就是循环遍历这个数组,取得新地址而后发送这个邮件.

如果你在数据库中拥有一个电子邮件地址的列表,同样的原则也是适用的:循环遍历它们.

你已经懂得要领了.显然,同样的概念对你特定的数据库类型和表结构来说也是适用的,虽然代码会需要做一些改动.

人 们在循环遍历一个地址列表的时候似乎都忽视了一点:如果你有多于50个地址要处理,你的脚本在完成以前很可能超时,因为PHP对每一个脚本的运行有一个缺 省为30秒的时间限制.你可以修改这个时间限制但是这样做的时候要小心.要把这种修改限定在特定的脚本上,比方说遍历一个地址列表发送邮件的脚本.否则, 你可能亲手将服务器的线程超载,然后你的计算机将崩溃,从此万劫不复.

要在脚本中设置时间限制,你可以使用set_time_limit()函数.你可以设定时间限制,比如说60秒(set_time_limit(60)),或者你还可以让它一直运行直道它完成(set_time_limit(0)).

将这段代码加到你的脚本里,你的邮件地址遍历循环会很愉快的继续工作,直到邮件被发送给了列表中所有的地址.

4.

发送HTML格式的电子邮件也是一种看起来难,做起来容易的事情.一但你学会了如何做这件事,你可能会因为自己曾经认为它很难而踢自己一脚.

我们需要对我们已经编写的邮件脚本做两个修改:

你的邮件应该是HTML格式的.
你必须添加content-type头信息.

这 就是所有要做的事情.拥有一个能阅读HTML格式电子邮件客户端程序的接收方将看见他们的邮件以大的,粗体格式显示的信件.如果你发送的HTML格式邮件 包括image置标,你一定要记住在src属性中使用完整的URL,例如: .

你还应该记住不是每一个人都能阅读HTML格式的电子邮件而且那些无法阅读这种格式的人只能看见HTML代码本身.这是另人讨厌的,所以最好三思而行.

结论
你 可以用PHP以任何途径,方法或是可以想象到的任何形式来发送邮件.这个教程只是提供了基本的知识:配置你的服务器并发送简单的邮件.你还可以将附件和你 用mail()函数产生的电子邮件一道发送,修改一大堆不同的头信息,还有做任何电子邮件客户端程序和邮件列表发送程序能够做的事情.

查看端口占用情况


开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选\"查看\"-\"选择列\"

经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,如何知道谁占有了我们需要的端口,很多人都比较头疼,下面就介绍一种非常简单的方法,希望对大家有用

假如我们需要确定谁占用了我们的9050端口

1、Windows平台
在windows命令行窗口下执行:

C:\\>netstat -aon|findstr \"9050\"

TCP 127.0.0.1:9050 0.0.0.0:0 LISTENING 2016


看到了吗,端口被进程号为2016的进程占用,继续执行下面命令:

C:\\>tasklist|findstr \"2016\"

tor.exe 2016 Console 0 16,064 K

很清楚吧,tor占用了你的端口。

2008年8月14日星期四

心中的奥运

奥运就像是一场中国人的集体恋爱.在多年的等待和魂牵梦萦后,终于迎来了17个难以忘怀的日夜.

使用PHP程序开发高效的WEB网络系统

这里的大型项目,简单的指分布式项目,就是说,你的程序需要被部署在N台服务器上了。在这个层级上,PHP比起j2ee的确缺乏很多支持。我曾和 shadow在735上详细讨论过PHP要在大型系统上应用需要解决的一些问题,当然这些问题不光是PHP这个语言的问题,也包括了周边开发的问题:

1 PHP的页面代码共享,PHP的源代码被载入内存一次以后,就在其中保留 - 这个用APC和Zend的优化器可以搞定。

2 PHP页面之间的数据对象共享,a.php和b.php之间可以共享一个数据对象,比如数组,这个现在可以用序列化来作,但是会有文件io,这块可以用共享内存或者memcached来处理。

3 PHP的数据库连接池,因为在多前端的情况下,PHP控制不住对数据库的连接,所以需要在数据库前边去作一个连接池,类似于sqlrelay的东西。另外数据缓存也是很重要的,大压力开发有一个tip,就是能不动数据库就不要动数据库。

4 PHP的前端cache系统。一个透明的可控制的cache机制,确保网站的页面以最少次数查询数据库。这个有很多实现,但是没有找到特别好的。

5 一个PHP应用,成功的解决调这几个问题以后,应付稍微大一点的压力是没有什么问题的。

在这个级别上,重要的是,把PHP java C++ python之类融合起来,使其成为一个高效系统。我们可以用memcached来做分布式内存管理,可以用Lucene 来作全文检索,用ejb 容器来放一些业务逻辑组件,PHP则作为前端和系统的胶水,快速而灵活的把这些粘合起来。

2008年8月12日星期二

李小鹏,痛苦的坚守.大鹏加油!

哼哼国足

上联:试问中国男足有多愁
下联:恰似一群太监上青楼
横批:无人会射?

国足欢迎你
《国足欢迎你》
我家球门常打开;要进几个随你
交锋过后就有了底;你会爱上这里
不管远近都是客人;请不用客气
进的少了别在意;下次补给你
我家住着谢亚龙;书写每段传奇
不懂足球也不要紧;仕途才是第一
陌生熟悉都是客人;请不用拘礼
谢主席他很热情;场场都陪你
国足欢迎你;为你敞开球门
再不济的实力;也能找信心
国足欢迎你;在主场上分享平局
哪怕你(世界)排名垫底
我家球门常打开;开怀容纳天地
一个两个不算稀奇;再多也输得起
天大地大都是朋友;请不用客气
场上梦游是惯例;场下才牛B
国足欢迎你;用红牌感动你
你们捞足积分;我们来出局
国足欢迎你;遇上了您就随便赢
有我们就会有奇迹

小偷程序

什么是小偷程序?顾名思义,小偷就是偷东西的,而程序就是计算机用的。合起来也很好理解:偷别人资料的程序。多半指网站的数据。
  偷数据的,几乎什么语言都可以。没有什么语言是肯定不能的。不过,某些语言显得比较容易,某些就显得比较繁琐。PERL就是一种用来偷数据的方便语言,得益于其简洁的语法。
  偷了数据,其实里面多半是HTML语句,包含了各种数据。我们也知道:HTML没XML那么好分析。针对某个页面的分析,程序还可以作出来。只是字符串处理相关的各种函数应用。但若被偷的东西结构变了,就要改变我们的程序,以适应新的结构。这个是要注意的。
  下面我们对各种语言的小偷程序进行说明:
  一.获得网站数据的各种语言代码
  1.Perl
  #!/usr/bin/perl
  # 通过IE浏览器中的[查看]->[源文件]可看HTML文件内容。
  # perl中可以不通过浏览器直接取得HTML文件内容,用的
  # 就是perl模块libWWW
  use strict;
  use LWP::UserAgent;
  use threads::shared;
  my $URL = \"http://osdev.beguest.com\";
  my $ua = new LWP::UserAgent;
  $ua->agent(\'Mozilla/3.0\');
  my ($address,$params) = split(/\\?/,$URL);
  my $req = new HTTP::Request (\'GET\',$address);
  $req->content_type(\'applicationn/x-www-form-urlencoded\');
  $req->content();
  my $res = $ua->request($req);
  my $content = $res->as_string();
  # 此时$content里面是网页内容
  print $content;
  $URL里就是要偷数据的地址。例子中的是本人的小站。偷自己的东西,没犯法吧?
  当然,这个会把网页内容打印到控制台。所以很多数据或者需要保存的时候,应该用重定向符号输出到文件。如:
  perl yourfile.pl >a.html
  这样,输出的结果就保存在文件a.html中了。至于分析的语句,PERL可以使用方便而简洁的正则,限制于不同程序的不同分析,这里就不写分析语句了。
  2.Active Server Pages - VBScript
  ASP版本的小偷程序,也不见得有什么太大的难度。不过应用了XMLHTTP组件的功能而已,事实上,我也很惊讶ASP写这个程序的简短之处:
  <%
  URL = \"http://osdev.beguest.com/osdev3.htm\"
  Set objXMLHTTP = CreateObject(\"Microsoft.XMLHTTP\")
  objXMLHTTP.Open \"GET\",URL,False
  objXMLHTTP.Send
  Response.Write Server.HTMLEncode(objXMLHTTP.responseText)
  Set objXMLHTTP = Nothing
  %>
  简单不?呵呵....
  3.Active Server Pages - JScript
  从原理来说,这个和VBScript差不多。从语句来说,这个跟VBScript也差不多-毕竟,它们都用同一个组件:
  
  4.Java
  Java用来干这个,实在有点大才小用的感觉:
  import java.io.*;
  import java.net.*;
  public class getURLContent
  {
  public static void main(String args[]) throws MalformedURLException,IOException
  {
   URL url = new URL(\"http://osdev.beguest.com/osdev3.htm\");
   BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
   while(reader.ready()){
   System.out.println(reader.readLine());
   }
  }
  }

2008年8月10日星期日

PHP视频教程搜集

PHP视频教程搜集


PHP视频教程(一)

第一章 了解PHP

第二章 Windows下的PHP环境设置

第三章 PHP语法结构

PHP函数库

第四章 了解MySQL

第五章 MySQL语言结构

第六章 MySQL数据类型

第七章 MySQL函数

第八章 MySQL数据操纵语言DML

第九章 MySQL数据定义语言DDL

第十章 MySQL用户实用命令

第十一章 MySQL 事务与锁定

第十二章 MySQL 全文检索

第十三章 MySQL 查询缓存

第十四章 MySQL数据库管理

第十五章 计数器

第十六章 PHP实现文件上载

第十七章 时钟

第十八章 日历

第十九章 地址簿(上)

地址簿(下)

第二十章 图像处理

第二十一章 表单处理

第二十二章 发邮件

第二十三章 数据库操作

第二十四章 Oracle数据库连接(1)

Oracle数据库连接(2)

Oracle数据库连接(3)

Oracle数据库连接(4)

第二十五章 聊天室a

第二十六章 搜索引擎Google技术核心揭密(上)
搜索引擎Google技术核心揭密(下)

第二十七章 留言本 (1)

留言本 (2)

留言本 (3)

第二十八章 留言本Oracle版 (1)

留言本Oracle版 (2)

第二十九章 在线投票系统 (1)

在线投票系统 (2)

第三十章 论坛 (1)

论坛 (2)

第三十一章 网上购物系统 (1)

网上购物系统 (2)

网上购物系统 (3)

第三十二章 新闻系统 (1)

新闻系统 (2)

第二十四章 PHP与面向对象程序设计OOP (1)

PHP与面向对象程序设计OOP (2)


PHP视频教程(二)


PHP视频教程(中原大学) 1

PHP视频教程(中原大学) 2

PHP视频教程(中原大学) 3

PHP视频教程(中原大学) 4

PHP视频教程(中原大学) 5

2008年8月7日星期四

jQuery-1.2.6新特性及主要改变

性能提升我就不说了, 这可以查看

1、整合了Dimensions Plugin插件

2、消除.attr()方法的15个明显错误并优化了该方法

3、.toggle()方法中现在可以地增加了不止两个方法如:

$(\"div\").toggle(function(){
$(this).removeClass(\"three\").addClass(\"one\");
}, function(){
$(this).removeClass(\"one\").addClass(\"two\");
}, function(){
$(this).removeClass(\"two\").addClass(\"three\");
});
4、可以对toggle()和one()方法进行解除绑定
function test(){ $(this).addClass(\"test\"); }
$(\"div\").one(\"click\", test);
$(\"div\").unbind(\"click\", test);

$(\"div\").toggle(test, test);
$(\"div\").unbind(\"click\", test);

5、index()现在可用于检索一个jQuery对像在集合中的索引
var test = $(\"div.test\");
$(\"div\").index( test ) == 3

6、makeArray()可以把任何对像转换为数组
jQuery.makeArray( document.getElementsByTagName(\"div\") )
// => [ div, div, div ]

jQuery.makeArray( true )
// => [ true ]

jQuery.makeArray()
// => []
7、beforeSend 的使用可以在ajax调用之前处理一些代码来决定是否进行ajax调用
$.ajax({
beforeSend: function(){
return $(\"#input\").val() == \"\";
},
url: \"test.php\"
});


8、公开速度对像,可以通过更改jQuery.fx.speeds对像来对覆盖默认值,也可以新添自已的速度常数。

jQuery.fx.speeds.slow = 1000;
$(\"#test\").slideDown(\"slow\");

2008年8月5日星期二

$()_jquery

$(document).ready() 这个不用说了,地球人都知道。就是预定DOM加载完后(不需要等待图片加载完成),触发的函数调用

工厂函数$()
功能:自动循环遍历DOM
格式:
1.标签名:例如$(’p')
2.ID:例如$(’#aa’)
3.类:例如$(’.abb’)

实例:
$(’#aa>li’)选择ID为aa下面的所有li
$(’#bb li:not(.cc)’) 选择ID为bb下类不为CC的所有li

1. $(document).ready(function(){
2. $('tr:odd').addClass('odd');//表格的奇数行
3. $('tr:even').addClass('even\');//表格的偶数行
4. $('td:contains("abc")').addClass('abc');//表格内容中含有abc的表格
5. });

选择:
$(’td:contains(”abc”)’).next() 取得最接近的下一个同辈元素
$(’td:contains(”abc”)’).siblings()取得该单元格的所有同辈元素
$(’td:contains(”abc”)’).parent().find(’td:gt(0)’)取得包含abc的单元格的父元素,再找到该元素中包含的所有编号大于0的单元格
$(’td:contains(”abc”)’).parent().find.(’td’).not(’:cpmtains(”abc”)’)

连缀

1. $('td:contains("abc")')//取得所有包含abc的单元格
2. .parent() //取得它的父元素
3. .find('td:eq(1)') //在父元素中查找第2个单元格
4. .addClass('ccc') //为该单元格添加ccc类
5. .end() //恢复到父元素
6. .find('td:eq(2)') //在父元素中查找第3个单元格
7. .addClass('ccc') //为该单元格添加ccc类

直接访问DOM元素

1. var myTag=$('#my-element').get(0).tagName;//可简写成$('#my-element')[0].tagName

一支口香糖

搬到体育新城住,完全是因为家里命令式的要求,对我来说,除了每天骑自行车上班有30分钟的车程外,除了从此一个人身处异地开始单枪匹马奋斗外,除了下班回家偶尔还要拖着铁砣般重的身体亲自烧菜做饭以填补饥肠辘辘外,也并不是什么坏事,自己喜欢独处一处,尤其是压力膨胀的时候,当然也就是这个时候.

《华为的冬天》与马云的冬天

雪莱说:“冬天已经来了,春天还会远吗?”任正非说:“现在是春天吧,但冬天已经不远了,我们在春天与夏天要念着冬天的问题.”
前者是浪漫主义的诗篇,而后者是企业家的盛世危言.
马云和任正非,在我的头脑里,是我比较喜欢的两个人物,一个是狼性文化的代表,一个是亚洲的电子商务的领航人物.
任正非是一个非常低调的人,甚少在公众面前露脸,但他肯定是一个危机意识至为深重的人:“十年来我天天思考的都是失败,对成功视而不见,也没有什么荣誉感、自豪感,而是危机感.”“失败这一天是一定会到来,大家要准备迎接,这是我从不动摇的看法,这是历史规律.”
相反,马云是一个非常高调的人,他比谁都懂得如何挑动别人的神经.但是,马云对于危机来临的敏感,相信并非来自于对任正非的模仿,也不是哗众取宠.
卓越的企业家,自然会比一般人有更为敏锐的市场触角,能够预先感知经济风向的变化.然而,更能体现其卓越的,是其居安思危、未雨绸缪的忧患意识.

2008年8月4日星期一

人情与关系

按三国的说法,“人际之遇,如若战争,虽不见伤亡,但其伤在内,隐而不见;其亡在势,利害无比”。这里所说的“内”及“势”则指人际之间的各种各样的纷争,可以说是一场无形的战争。