<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Edward&#039;s Blog &#187; 后端语言</title>
	<atom:link href="http://edwardpku.com/blog/category/backend/feed/" rel="self" type="application/rss+xml" />
	<link>http://edwardpku.com/blog</link>
	<description></description>
	<lastBuildDate>Mon, 16 Aug 2010 08:37:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>GlassFish Family</title>
		<link>http://edwardpku.com/blog/2009/04/glassfish-family/</link>
		<comments>http://edwardpku.com/blog/2009/04/glassfish-family/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 06:30:11 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=486</guid>
		<description><![CDATA[现在最新的发行版是:GFv2.1 

]]></description>
			<content:encoded><![CDATA[<p>现在最新的发行版是:GFv2.1 </p>
<p><a href="http://edwardpku.com/wp/wp-content/uploads/2009/04/gfv2family.jpg"><img title="GFv2Family" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="172" alt="GFv2Family" src="http://edwardpku.com/wp/wp-content/uploads/2009/04/gfv2family-thumb.jpg" width="548" border="0" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2009/04/glassfish-family/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>再提多态</title>
		<link>http://edwardpku.com/blog/2009/03/%e5%86%8d%e6%8f%90%e5%a4%9a%e6%80%81/</link>
		<comments>http://edwardpku.com/blog/2009/03/%e5%86%8d%e6%8f%90%e5%a4%9a%e6%80%81/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 07:04:23 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Web前端]]></category>
		<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=480</guid>
		<description><![CDATA[记得进入Sun的面试的时候Leon就问了我Java如何实现多态。当时的答案是通过重载和继承，后者也就是动态绑定。今天看到PHP与MySQL5程序设计里面的关于PHP不支持方法重载的时候，再次引起我对“多态”这个概念的探究。首先，多态是面向对象方面的一个重要特性，它本不应该依赖于特定的编程语言。WIKI 中对Polymorphism的定义如下：
In simple terms, polymorphism is the ability of one type, A, to appear as and be used like another type, B. In strongly typed languages, this usually means that type A somehow derives from type B, or type A implements an interface that represents type B.
Operator Overloading the numerical operators +, -, /, * [...]]]></description>
			<content:encoded><![CDATA[<p>记得进入Sun的面试的时候Leon就问了我Java如何实现多态。当时的答案是通过重载和继承，后者也就是动态绑定。今天看到PHP与MySQL5程序设计里面的关于PHP不支持方法重载的时候，再次引起我对“多态”这个概念的探究。首先，多态是面向对象方面的一个重要特性，它本不应该依赖于特定的编程语言。WIKI 中对Polymorphism的定义如下：<br />
In simple terms, polymorphism is the ability of one type, A, to appear as and be used like another type, B. In strongly typed languages, this usually means that type A somehow derives from type B, or type A implements an interface that represents type B.<br />
Operator Overloading the numerical operators +, -, /, * allow polymorphic treatment of the various numerical types integer, unsigned integer, float, decimal, etc; each of which have different ranges, bit patterns, and representations. Another common example is the use of the &#8220;+&#8221; operator which allows similar or polymorphic treatment of numbers (addition), strings (concatenation), and lists (attachment). This is a lesser used feature of polymorphism.<br />
The primary usage of polymorphism in industry (object-oriented programming theory) is the ability of objects belonging to different types to respond to method, field, or property calls of the same name, each one according to an appropriate type-specific behavior. The programmer (and the program) does not have to know the exact type of the object in advance, and so the exact behavior is determined at run time (this is called late binding or dynamic binding).<br />
从中我们可以看到，其实重载(override)并不是polymorphism，只是利于国人理解的一种解释。网上好多类似的讨论，一时也把我搞糊涂了，我特意去查了一下Thinking in Java，证实了以上的说法。总结一下就是继承是多态的基础，多态使得不同对象对同一条指令做出各自不同的响应。所以我当初的答案是不准确的，但是动态多态和静态多态的概念在C＋＋教学中普遍使用，使得在在中文中多态又多了一层含义。</p>
<p>而PHP不支持方法重载的很大原因也在于PHP是弱类型语言，类型本身就可以自动变更，方法重载也就省了。</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2009/03/%e5%86%8d%e6%8f%90%e5%a4%9a%e6%80%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用NetBeans Profiler优化</title>
		<link>http://edwardpku.com/blog/2008/12/%e4%bd%bf%e7%94%a8netbeans-profiler%e4%bc%98%e5%8c%96/</link>
		<comments>http://edwardpku.com/blog/2008/12/%e4%bd%bf%e7%94%a8netbeans-profiler%e4%bc%98%e5%8c%96/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 09:36:33 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=452</guid>
		<description><![CDATA[啥也不说了！看视频：

  


]]></description>
			<content:encoded><![CDATA[<p>啥也不说了！看视频：</p>
<div id="videoPlayer"></div>
<p> <script type="text/javascript" src="http://www.netbeans.tv/js/swfobject.js"></script> <script type="text/javascript">
<!--
var so = new SWFObject("http://www.netbeans.tv/images/playerWidget.swf" , "pv", "410", "331", "8", "#666666");
so.addParam("quality", "high");
so.addParam("allowScriptAccess", "sameDomain");
so.addParam("allowFullScreen", "true");
so.addVariable("autoPlay", "false");
so.addVariable("urlFileIdList", "6433");
so.addVariable("show_title", "true");
so.addVariable("PLAY_CALLBACK","emphasize");
so.addVariable("resizeLimitMax","true");
so.addVariable("lang", "en");
so.addVariable("flash_play","true");
so.addVariable("author_name","NetBeans.tv");
so.addVariable("configUrl","http://sun.ora.ma/config.sun.ora.ma.xml");
so.write("videoPlayer");
// -->
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/12/%e4%bd%bf%e7%94%a8netbeans-profiler%e4%bc%98%e5%8c%96/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>NetBeans6.5 下载地址</title>
		<link>http://edwardpku.com/blog/2008/11/netbeans65-%e4%b8%8b%e8%bd%bd%e5%9c%b0%e5%9d%80/</link>
		<comments>http://edwardpku.com/blog/2008/11/netbeans65-%e4%b8%8b%e8%bd%bd%e5%9c%b0%e5%9d%80/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 07:42:43 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Web前端]]></category>
		<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=440</guid>
		<description><![CDATA[
NetBeans IDE 6.5 完全支持所有 Java 平台（Java SE、Java EE、Java ME 和 JavaFX），此外还是 PHP、Ajax 和 JavaScript、Groovy 和 Grails、Ruby 和 Ruby on Rails 以及 C/C++ 软件开发的理想工具。6.5 发行版增强了对 Web 框架 (Hibernate, Spring, JSF, JPA)、GlassFish v3 应用服务器以及数据库的支持。此外，它还包括新增的在 IDE 范围内快速搜索的快捷键、更加友好的用户界面以及自动在保存时编译功能。

NetBeans 6.5 国内本地下载：
http://zh-cn.netbeans.org/download/6.5/ml/
查看 NetBeans 6.5 发行信息：
http://zh-cn.netbeans.org/community/releases/65/index.html
JDK 1.6 Update 10 本地下载：
http://developers.sun.com.cn/download/java_se.html

]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.netbeans.org/images/v6/nb-logo-frontpage.gif" alt="" /></p>
<p>NetBeans IDE 6.5 完全支持所有 Java 平台（Java SE、Java EE、Java ME 和 JavaFX），此外还是 PHP、Ajax 和 JavaScript、Groovy 和 Grails、Ruby 和 Ruby on Rails 以及 C/C++ 软件开发的理想工具。6.5 发行版增强了对 Web 框架 (Hibernate, Spring, JSF, JPA)、GlassFish v3 应用服务器以及数据库的支持。此外，它还包括新增的在 IDE 范围内快速搜索的快捷键、更加友好的用户界面以及自动在保存时编译功能。</p>
<ul>
<li>NetBeans 6.5 国内本地下载：<br />
<a href="http://zh-cn.netbeans.org/download/6.5/ml/">http://zh-cn.netbeans.org/download/6.5/ml/</a></li>
<li>查看 NetBeans 6.5 发行信息：<br />
<a href="http://zh-cn.netbeans.org/community/releases/65/index.html">http://zh-cn.netbeans.org/community/releases/65/index.html</a></li>
<li>JDK 1.6 Update 10 本地下载：<br />
<a href="http://developers.sun.com.cn/download/java_se.html">http://developers.sun.com.cn/download/java_se.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/11/netbeans65-%e4%b8%8b%e8%bd%bd%e5%9c%b0%e5%9d%80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>寻找子串算法（Java）</title>
		<link>http://edwardpku.com/blog/2008/08/%e5%af%bb%e6%89%be%e5%ad%90%e4%b8%b2%e7%ae%97%e6%b3%95%ef%bc%88java%ef%bc%89/</link>
		<comments>http://edwardpku.com/blog/2008/08/%e5%af%bb%e6%89%be%e5%ad%90%e4%b8%b2%e7%ae%97%e6%b3%95%ef%bc%88java%ef%bc%89/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 11:24:38 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=300</guid>
		<description><![CDATA[这个算法用在DocWeb中的method的查找过程中。在ClassDoc中分别有API&#160;&#160; name()和method()。前一个是返回这个ClassDoc类型的名字的，也就是Java源码中某个类的名字的，例如AnnotationDesc，而后一个返回的是一个数组，数组中存储的这个Class的所有方法，但是其中存储的是它的全路径例如，com.sun.javadoc.AnnotationDesc.annotationType()。这时候，我就面对这样一个问题，我需要取出后面的字符串，在我这个例子中是annotationType().
算法如下：
static private int getNo(String str,String subStr)    {     int end=str.length()-subStr.length();     if(end&#62;=0)     {     for(int k=0;k&#60;=end;k++){     for(int l=0;str.charAt(k+l)==subStr.charAt(l);l++){     if(l==subStr.length()-1) return(k+l+1);     }     } [...]]]></description>
			<content:encoded><![CDATA[<p>这个算法用在DocWeb中的method的查找过程中。在ClassDoc中分别有API&#160;&#160; name()和method()。前一个是返回这个ClassDoc类型的名字的，也就是Java源码中某个类的名字的，例如AnnotationDesc，而后一个返回的是一个数组，数组中存储的这个Class的所有方法，但是其中存储的是它的全路径例如，com.sun.javadoc.AnnotationDesc.annotationType()。这时候，我就面对这样一个问题，我需要取出后面的字符串，在我这个例子中是annotationType().</p>
<p>算法如下：</p>
<p>static private int getNo(String str,String subStr)   <br /> {    <br /> int end=str.length()-subStr.length();    <br /> if(end&gt;=0)    <br /> {    <br /> for(int k=0;k&lt;=end;k++){    <br /> for(int l=0;str.charAt(k+l)==subStr.charAt(l);l++){    <br /> if(l==subStr.length()-1) return(k+l+1);    <br /> }    <br /> }    <br /> }    <br /> return(-1);    <br /> }</p>
</p>
<p>这里返回的整数就是下一个要输出字符串的位置。</p>
<p>&#160;</p>
<p>主函数如下：</p>
<p>public static void main(String[] args) {   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; String a=&quot;sdlfkabcdf&quot;;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; String b=&quot;abc&quot;;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int no=getNo(a,b);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(no&gt;0){    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(a.substring(no));    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }else{    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;an erro accured&quot;);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }    <br />}</p>
</p>
<p>输出结果：</p>
<p>df</p>
<p>这个算法的时间复杂度是O(n2),算法的效率一般，但是工作起来还可以，下次可以参考KMP算法作出改进。</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/08/%e5%af%bb%e6%89%be%e5%ad%90%e4%b8%b2%e7%ae%97%e6%b3%95%ef%bc%88java%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is SOAP</title>
		<link>http://edwardpku.com/blog/2008/07/what-is-soap/</link>
		<comments>http://edwardpku.com/blog/2008/07/what-is-soap/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 01:00:38 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=282</guid>
		<description><![CDATA[SOAP stands for Simple object access protocol.It is used for exchanging XML based message over networks.It normally uses HTTP, and it forms the foundation of web services protocol stack providing a basic message frame.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/SOAP">SOAP</a> stands for Simple object access protocol.It is used for exchanging XML based message over networks.It normally uses HTTP, and it forms the foundation of web services protocol stack providing a basic message frame.</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/07/what-is-soap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tim Bray抨击SOAP和Java</title>
		<link>http://edwardpku.com/blog/2008/07/tim-bray-slams-soap-and-javaform-javaworld/</link>
		<comments>http://edwardpku.com/blog/2008/07/tim-bray-slams-soap-and-javaform-javaworld/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 13:41:16 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=281</guid>
		<description><![CDATA[这是一篇来自在JW的By Paul Krill的文章，稳重Bary（Sun工程师）认为SOAP是失败的。

正文如下：
旧金山（07/24/2008）来自sun公司的工程师Tim Bary说Web Services中的SOAP堆栈是失败的，他认为REST机制可以作为SOAP的替代品。
sun的web技术方面的主管Bray在O‘Reilly的开源公约中的访谈中认为“这些年来，SOAP 堆栈是一个令人印象深刻的失败，REST 完成了SOAP 想要做到的，更加的可视化，优雅，便宜，同时是可以担负的起的，但是唯一的缺点就是到目前为止缺乏现有的工具支持。”
REST 可以被用来做集成和使用。例如PHP页面前端必须要和Java制造系统相适应。
将会有一些工具可以帮助开发者使用REST，这些工具将会来自像sun，微软和oracle这样的公司。这些工具将会使得创建和测试REST服务更加的方便。
SOAP和一系列WS-＊定义了安全，通信和其他的特定功能。其中一些包括Ruby on Rails的创始人Heinemeir Hansson，同时命名为“WS Death star”，模仿了“Star Wars”中地方的大本营的名字。
定义了SOA和Web Services的ZapThink的分析师坚决和Bary持相反意见。
ZapThink的资深分析师说，&#8221;Tim Bary是一个REST支持者，他必然会抨击SOAP以促进REST，SOAP现在活的很好，但是现在SOAP没有采取广泛的活动，如果你能找到相关的证据，请让我知道！&#8221;
ZapThink的合伙人Jason Bloomberg说，“具有讽刺意味的是，缺乏REST工具的认识，实际省JackBe，Corizon和其他工具都支持REST”
Bray也引用了一个迫切的对REST测试（面向协议和架构）工具的需求来表明他的观点。
在周五OSCON的一个主要报告中，Brat将会讨论关于“语言拐点”，在这个演讲中各种编程语言例如Perl，Pathon和Ruby正在积蓄势力意在和Java和.Net平台竞争。
“直到两年前，如果你一个写Java或是.Net程序的程序员，现在你有很多其他的选择，这真是一个拐点。”
Bray说“Java平台现在推荐一些脚本语言例如Ruby和Pathon，Sun的JVM已经能够兼容这些脚本语言了，Java已经不是哪些新潮小孩的选择了”
他还说“但是，Java还是在我们身边无处不在，Java不会离去，这是世界上最流行的编程语言。”
最后，他强调：“不管我是否喜欢，将来将会是多语言并存的时代”
]]></description>
			<content:encoded><![CDATA[<p class="byline">这是一篇来自在JW的By Paul Krill的文章，稳重Bary（Sun工程师）认为SOAP是失败的。</p>
<p><!-- CONTENT GOES HERE--></p>
<p class="first">正文如下：</p>
<p class="first">旧金山（07/24/2008）来自sun公司的工程师Tim Bary说Web Services中的SOAP堆栈是失败的，他认为REST机制可以作为SOAP的替代品。</p>
<p>sun的web技术方面的主管Bray在O‘Reilly的开源公约中的访谈中认为“这些年来，SOAP 堆栈是一个令人印象深刻的失败，REST 完成了SOAP 想要做到的，更加的可视化，优雅，便宜，同时是可以担负的起的，但是唯一的缺点就是到目前为止缺乏现有的工具支持。”</p>
<p>REST 可以被用来做集成和使用。例如PHP页面前端必须要和Java制造系统相适应。</p>
<p>将会有一些工具可以帮助开发者使用REST，这些工具将会来自像sun，微软和oracle这样的公司。这些工具将会使得创建和测试REST服务更加的方便。</p>
<p>SOAP和一系列WS-＊定义了安全，通信和其他的特定功能。其中一些包括Ruby on Rails的创始人Heinemeir Hansson，同时命名为“WS Death star”，模仿了“Star Wars”中地方的大本营的名字。</p>
<p>定义了SOA和Web Services的ZapThink的分析师坚决和Bary持相反意见。</p>
<p>ZapThink的资深分析师说，&#8221;Tim Bary是一个REST支持者，他必然会抨击SOAP以促进REST，SOAP现在活的很好，但是现在SOAP没有采取广泛的活动，如果你能找到相关的证据，请让我知道！&#8221;</p>
<p>ZapThink的合伙人Jason Bloomberg说，“具有讽刺意味的是，缺乏REST工具的认识，实际省JackBe，Corizon和其他工具都支持REST”</p>
<p>Bray也引用了一个迫切的对REST测试（面向协议和架构）工具的需求来表明他的观点。</p>
<p>在周五OSCON的一个主要报告中，Brat将会讨论关于“语言拐点”，在这个演讲中各种编程语言例如Perl，Pathon和Ruby正在积蓄势力意在和Java和.Net平台竞争。</p>
<p>“直到两年前，如果你一个写Java或是.Net程序的程序员，现在你有很多其他的选择，这真是一个拐点。”</p>
<p>Bray说“Java平台现在推荐一些脚本语言例如Ruby和Pathon，Sun的JVM已经能够兼容这些脚本语言了，Java已经不是哪些新潮小孩的选择了”</p>
<p>他还说“但是，Java还是在我们身边无处不在，Java不会离去，这是世界上最流行的编程语言。”</p>
<p>最后，他强调：“不管我是否喜欢，将来将会是多语言并存的时代”</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/07/tim-bray-slams-soap-and-javaform-javaworld/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to set your html head</title>
		<link>http://edwardpku.com/blog/2008/07/how-to-set-your-html-head/</link>
		<comments>http://edwardpku.com/blog/2008/07/how-to-set-your-html-head/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 07:40:45 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=276</guid>
		<description><![CDATA[在你每一个页面的顶端，你需要文档声明。是的，必须。
如果不指定文档类型，你的HTML不是合法的HTML，并且大部分浏览器会用“怪癖模式（quirks mode）”来处理页面，这意味着浏览器认为你自己也不知道究竟做什么，并且按浏览器自己的方式来处理你的代码。你可以是一个HTML大师，在地球上打遍 天下无敌手，或者你的HTML可以无瑕疵，CSS可以很完美，但如果没有文档声明，或者错误的文档声明，你的网页与一个短视的，独眼的长臂猿婴儿十分艰难 地堆砌起来的没两样。
XHTML 1.0 Strict（严格）的文档声明是这样的：
&#60;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Strict//EN&#8221; &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&#8220;&#62;
下面的是XHTML 1.1的文档声明，作为XHTML的最新版本，看起来更完美，但还是有一些问题，随后我们会稍微讲解……
&#60;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.1//EN&#8221; &#8220;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&#8220;&#62;
如果你不愿放弃HTML 4或者你还有Netscape 4死忠用户，你可以使用XHTML 1.0 Transitional（过渡型）：
&#60;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8220;&#62;
你使用这的唯一理由是你还要兼容老版本的，少用的浏览器。过渡型XHTML 1.0允许HTML 4的表现元素，其也可能在如Netscape 4的浏览器中表现更好。但使用这些元素将对你网页的效率和可用性有害。
最后，如果你是使用框架的怪人之一，可以使用像下面一样的XHTML 1.0 Frameset（框架）文档类型声明：
&#60;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Frameset//EN&#8221; &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd&#8220;&#62;
注意DOCTYPE标签必须大写和前置一个英文半角感叹号!。它是唯一一个打破规则的标签，它不需要关闭。
语言声明
即使HTTP头或者在html起始标签内设置了xml:lang属性，你也必须为文档指定一个主要语言。尽管处理一个合法的XHTML文档这不 是必须的，但也是一个易用性的考虑。值是缩写的，比如en（English，英语），fr（French，法语），de（German，德语）或者mg （Malagasy，这是什么语？译者也不知道，呵呵。——译者注）。
声明一个主要用英语内容的文档，例子是这样的：
&#60;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221; xml:lang=&#8221;en&#8221;&#62;
在声明主要语言之后，假如还需要使用其他语言，你还可以在内联中使用xml:lang属性（比如&#60;span xml:lang=&#8221;de&#8221;&#62;HTML Hund&#60;/span&#62;）。
内容类型
HTML文档的媒体类型和字体集也许要指定，可以使用HTTP头来完成，比如：
Content-Type: text/html; charset=UTF-8
HTTP头部的第一部分（如text/html)是文件MIME类型，让浏览器知道文件的媒体类型因此可以知道怎么处理。所有的文件都有MIME类型。JPEG图像是image/jpeg，CSS文件是text/csss和HTML一般使用text/html。
HTTP头部的第二部分（如UTF-8部分）是字符集。
也许设置HTTP头的最简易方法是在HTML中使用“HTTP同义（HTTP-equivalent）”的头标签，像这样：
&#60;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=UTF-8&#8243; /&#62;
些微复杂当更好的方法是使用服务器端脚本语言来发送头。用PHP的话，你可以这样做：
&#60;? [...]]]></description>
			<content:encoded><![CDATA[<p><strong>在你每一个页面的顶端，你需要文档声明。是的，必须。</strong></p>
<p>如果不指定文档类型，你的HTML不是合法的HTML，并且大部分浏览器会用“怪癖模式（quirks mode）”来处理页面，这意味着浏览器认为你自己也不知道究竟做什么，并且按浏览器自己的方式来处理你的代码。你可以是一个HTML大师，在地球上打遍 天下无敌手，或者你的HTML可以无瑕疵，CSS可以很完美，但如果没有文档声明，或者错误的文档声明，你的网页与一个短视的，独眼的长臂猿婴儿十分艰难 地堆砌起来的没两样。</p>
<p>XHTML 1.0 Strict（严格）的文档声明是这样的：</p>
<p class="code">&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Strict//EN&#8221; &#8220;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd</a>&#8220;&gt;</p>
<p>下面的是XHTML 1.1的文档声明，作为XHTML的最新版本，看起来更完美，但还是有一些问题，随后我们会稍微讲解……</p>
<p class="code">&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.1//EN&#8221; &#8220;<a href="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd</a>&#8220;&gt;</p>
<p>如果你不愿放弃HTML 4或者你还有Netscape 4死忠用户，你可以使用XHTML 1.0 Transitional（过渡型）：</p>
<p class="code">&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#8220;&gt;</p>
<p>你使用这的唯一理由是你还要兼容老版本的，少用的浏览器。过渡型XHTML 1.0允许HTML 4的表现元素，其也可能在如Netscape 4的浏览器中表现更好。但使用这些元素将对你网页的效率和可用性有害。</p>
<p>最后，如果你是使用框架的怪人之一，可以使用像下面一样的XHTML 1.0 Frameset（框架）文档类型声明：</p>
<p class="code">&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Frameset//EN&#8221; &#8220;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd</a>&#8220;&gt;</p>
<p>注意DOCTYPE标签必须大写和前置一个英文半角感叹号!。它是唯一一个打破规则的标签，它不需要关闭。</p>
<p><strong>语言声明</strong></p>
<p>即使HTTP头或者在html起始标签内设置了xml:lang属性，你也必须为文档指定一个主要语言。尽管处理一个合法的XHTML文档这不 是必须的，但也是一个易用性的考虑。值是缩写的，比如en（English，英语），fr（French，法语），de（German，德语）或者mg （Malagasy，这是什么语？译者也不知道，呵呵。——译者注）。</p>
<p>声明一个主要用英语内容的文档，例子是这样的：</p>
<p class="code">&lt;html xmlns=&#8221;<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>&#8221; xml:lang=&#8221;en&#8221;&gt;</p>
<p>在声明主要语言之后，假如还需要使用其他语言，你还可以在内联中使用xml:lang属性（比如&lt;span xml:lang=&#8221;de&#8221;&gt;HTML Hund&lt;/span&gt;）。</p>
<p><strong>内容类型</strong></p>
<p>HTML文档的媒体类型和字体集也许要指定，可以使用HTTP头来完成，比如：</p>
<p class="code">Content-Type: text/html; charset=UTF-8</p>
<p>HTTP头部的第一部分（如text/html)是文件MIME类型，让浏览器知道文件的媒体类型因此可以知道怎么处理。所有的文件都有MIME类型。JPEG图像是image/jpeg，CSS文件是text/csss和HTML一般使用text/html。</p>
<p>HTTP头部的第二部分（如UTF-8部分）是字符集。<br />
也许设置HTTP头的最简易方法是在HTML中使用“HTTP同义（HTTP-equivalent）”的头标签，像这样：</p>
<p class="code">&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=UTF-8&#8243; /&gt;</p>
<p>些微复杂当更好的方法是使用服务器端脚本语言来发送头。用PHP的话，你可以这样做：</p>
<p class="code">&lt;? header(&#8221;Content-Type: text/html; charset= UTF-8&#8243;); ?&gt;</p>
<p>如果你不愿意（或不能）使用服务器端脚本语言，你也许可以直接给服务器设置一个“.htaccess”文件。大部分服务器（Apache兼容） 可以在根目录使用一个“.htaccess”的小文本文件，写入下面的内容，你就可以把所有的“html”后缀文件都与MIME类型和字符集关联：</p>
<p class="code">AddType text/html;charset=UTF-8 html</p>
<p>字符集包括大部分西方基于拉丁文语言的“ISO-8859-1”，日语的“SHIFT_JIS”，中文的“GB18030”和UTF-8，一个 Unicode Transformation Format版本，提供大范围的多种语言的单个字符。基本上，你应该使用一个你知道的，能为你用户清楚认知的字符集。除非你使用基于拉丁语的语言（包括英 语）（ISO-8859-1被普遍接受的），你应该使用UTF-8因为它可以显示大多数语言的大多数字符，使用它也是安全的，因为它可以在大部的计算机上 使用。</p>
<p><strong>注意</strong></p>
<p>XHTML应该当作application/xhtml+xml的MIME类型来使用，再清楚不过，这是XML程序。不幸的是，大部分浏览器没 有对这没有第一线索。所以，一般认为使用text/html的MIME类型是不错的。根据W3C的建议和网页标准工程的未来亮点，调味的XHTML 1.0也许可以作text/html使用，但XHTML 1.1不应该，这就是这个网站以XHTML 1.0 Strict（严格）作为例子，假定text/html的MIME类型。但是你仍然可以（或许不应该）为它们设置正确的MIME类型给浏览器，轻微的调用 一下服务器端即可。</p>
<p>这个网站使用PHP为XHTML 1.1设置application/xhtml+xml的MIME类型给那些能够理解和处理这个类型的浏览器（如Mozilla），为XHTML 1.0 Strict设置text/html给其他浏览器（如IE）。为每一个页面的顶部加入如下代码：</p>
<p class="code">&lt;? if(stristr($_SERVER["HTTP_ACCEPT"],&#8221;application/xhtml+xml&#8221;)){ header(&#8221;Content-Type: application/xhtml+xml; charset=UTF-8&#8243;); echo(&#8217;&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.1//EN&#8221; &#8220;<a href="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd%22%3E%27">http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&#8221;&gt;&#8217;</a>); } else { header(&#8221;Content-Type: text/html; charset=UTF-8&#8243;); echo (&#8217;&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Strict//EN&#8221; &#8220;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd%22%3E%27">http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&#8221;&gt;&#8217;</a>); } ?&gt;</p>
<p>这些检查核实浏览器是否接受application/xhtml+xml的MIME类型，如果接受，就发送这个MIME类型并把XHTML 1.1文类类型写到HTML中。如果这个MIME类型不被接受，就发送text/html的MIME类型并把XHTML 1.0 Strict（严格）的文档类型写入HTML。</p>
<p>除了你知道你正在做着正确的事情和为自己准备将来的路的平和想法外，最直接的益处就是，使用这个方法，Mozilla浏览器把你的文件当作 XML程序对待并且如果你的XHTML还没有抓痒，就是说不合式的，Mozilla就不会工作。然后你就可以排错了，而不需要用校验器来运行你的文档了。</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/07/how-to-set-your-html-head/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A concept of Glassfish</title>
		<link>http://edwardpku.com/blog/2008/07/a-concept-of-glassfish/</link>
		<comments>http://edwardpku.com/blog/2008/07/a-concept-of-glassfish/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 07:11:01 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=274</guid>
		<description><![CDATA[GlassFish has a concept of a domain. More precisely, it is the  administrative domain. At first, it may be perceived a little difficult to understand, especially given that in Java EE paradigm, one is used to servers rather than domains. This is especially true with developers.
This post tries to explain what a GlassFish Domain [...]]]></description>
			<content:encoded><![CDATA[<p>GlassFish has a concept of a domain. More precisely, it is the <em> administrative</em> domain. At first, it may be perceived a little difficult to understand, especially given that in Java EE paradigm, one is used to <strong>servers</strong> rather than <strong>domains</strong>. This is especially true with developers.<br />
This post tries to explain what a GlassFish Domain (domain, henceforth) is, how to use it effectively if you want to quickly deploy your applications to GlassFish and the reasons to call it a domain.<br />
A domain (statically) is an administrative name space. It&#8217;s a boundary, all GlassFish entities within which are controlled by an administrator or more precisely administrative three tuple (Let&#8217;s call it <strong>Admin 3T</strong>). This three tuple is called &#8220;<strong>admin user, admin password, certificate database password</strong> (or master password). If you are a developer, you don&#8217;t really care about the master password and it defaults to &#8220;<strong>changeit</strong>&#8220;. This is the password with which your keystore (cacerts.jks) is locked and most of the times, you don&#8217;t care about this.</p>
<p><a href="http://blogs.sun.com/roller/resources/bloggerkedar/as-domains.jpg">This is how your domains look like. </a></p>
<p><a href="http://blogs.sun.com/roller/resources/bloggerkedar/as-domains.jpg"> <img src="http://blogs.sun.com/roller/resources/bloggerkedar/as-domains.jpg" border="4" alt="" width="100" height="80" align="middle" /> </a></p>
<p>A domain (dynamically) is a Java EE Engine. Thus it is your server, once you have <em>started</em> it. In other words, at run time, a <strong>domain = server</strong>. Thus, a running domain can host user Java EE applications and can be effectively used as the target for your deployments. For developers, this is what they care about. It is for developers that this gap has been bridged and they can forget about the domain. The defaults are so carefully chosen that you&#8217;d never need to know about the fact that you are managing and deploying to a domain!</p>
<p>So, what is that that domain provides on top of behaving like a server? Here is a list of things:</p>
<ul>
<li>Domain provides you with a built-in administration capability.</li>
<li>Domain has multiple system applications predeployed which facilitate the management. Thus the entire admin console</li>
<li> <a href="http://blogs.sun.com/roller/resources/bloggerkedar/admin-gui-large.gif"> <img src="http://blogs.sun.com/roller/resources/bloggerkedar/admin-gui-small.gif" border="4" alt="" width="124" height="87" /></a>is available as a system web application. All you need to do it connect to &#8220;http://localhost:admin-port(4848)&#8221;.</li>
<li>Domain has another system application predeployed to take care of all the asadmin commands. Note that (almost) all the asadmin commands invoke the running domain in</li>
<li>Domain has an EJB Timer Service already configured to work with. A timer database is also created.</li>
<li>Domain has a JDBC Connection Pool configured for the EJB timer database.</li>
<li>Domain has two keyfiles created by default so that one has authentication realms for the security conscious people. All you need to do is create the security mappings in your applications.</li>
<li>Domain has a default web.xml that decides the default behavior of all deployed web applications.</li>
<li>Domain has a JMX Connector&#8217;s Server end so that you can easily connect to the admin infrastructure, using JConsole and browse the MBeans. As you know MBeans are to Administration what EJB&#8217;s are to Enterprise Computing.</li>
</ul>
<p>All this is enabled by a simple set of steps:</p>
<ol>
<li>Either you download GlassFish and invoke <strong>ant -f setup.xml</strong> that creates the so-called fully configured, ready-to-go <strong>default domain</strong>, OR</li>
<li>Explode the GlassFish image and do [glassfish]/bin/asadmin create-domain &#8211;adminport 4848 mydomain</li>
</ol>
<p>All this is great. But how does a developer exploit it?</p>
<p>Simple. Your answer is NetBeans. Just download &#8220;The&#8221; IDE and do the following:</p>
<ul>
<li>Go to the Runtime tab and right click for &#8220;Adding a target server&#8221;.   <img src="http://blogs.sun.com/roller/resources/bloggerkedar/javaee-platform-selection.JPG" alt="" /><br />
See how NetBeans itentifies your default domain, domain1. The port is also identified. This is the administration port. Next, you could provide the user name and password for administration. That&#8217;s it. This domain is now <strong> deployment ready </strong>.</li>
<li> You need to create a web application. Just create it using the intuitive menus in the IDE.   <img src="http://blogs.sun.com/roller/resources/bloggerkedar/create-web-app.JPG" alt="" /></li>
<li> The IDE is so well integrated with the GlassFish domain/server is that it just allows you to start the GlassFish server in debug mode and debug your application. This is really seamless!</li>
<li> <img src="http://blogs.sun.com/roller/resources/bloggerkedar/start-in-debug-mode.JPG" alt="" /></li>
<li> Here is your application deployed and being tested!   <img src="http://blogs.sun.com/roller/resources/bloggerkedar/application-debugged-jsp-output.JPG" alt="" /></li>
</ul>
<p>This is how I develop and test my applications. I am a developer. Hope fellow developers find this as easy as I do.</p>
<p>If you are a CLI fan, there are a bunch of intuitive <a href="http://docs.sun.com/source/819-0082/hman1m/asadmin.1m.html">asadmin commands </a> that configure the domain/server.<br />
If you are an ANT fan, there are ANT tasks like <a href="http://docs.sun.com/source/819-0079/dgdeploy.html#wp76793">sun-appserv-deploy </a>that help you continue to write your build.xml files.<br />
We are planning to integrate asadmin into a scripting language of your choice. You&#8217;d have to wait till Mustang releases, though.<br />
I know this sounds easy. But it sounds so because it is so.</p>
<p>Finally, the $1M Question: Why do you call it a domain? Well, the reason lies in more sophisticated Sun Software like <a href="http://www.sun.com/software/products/appsrvr_se/index.xml"> Application Server Standard Edition (SE) </a>. When you enter into the real enterprise arena, it is no more a server. It is a bunch of servers (which are also known as app server instances, each of which is a Java EE Engine) that are woven into clusters to impart the coveted high availability. Still, the &#8220;Administrative&#8221; domain remains the same. You don&#8217;t have to learn a new concept when you go from one edition of the product to an advanced one. A set of simple rules emerges:</p>
<ul>
<li>A Domain is comprised of a set of Instances. A Domain is &#8220;bigger&#8221; than an Instance.</li>
<li>Domain has a &#8220;dual nature&#8221;. For a simple case, Domain equals Instance (I tend to relate to the dual nature of electron &#8212; &#8220;is it a wave, is it a particle&#8221; here <img class="smiley" title=":)" src="http://blogs.sun.com/images/smileys/smile.gif" alt=":)" /> ).</li>
</ul>
<p>Thus, it is the best of both the worlds: For developers, a domain is a server. For system administrators, a domain is something that they manage so that an uninterrupted service is provided!</p>
<p>Makes sense to me. How about you? Please let me know &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/07/a-concept-of-glassfish/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Study Report(5.22)</title>
		<link>http://edwardpku.com/blog/2008/05/study-report522/</link>
		<comments>http://edwardpku.com/blog/2008/05/study-report522/#comments</comments>
		<pubDate>Thu, 22 May 2008 11:16:26 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=167</guid>
		<description><![CDATA[营销课（5.22）
相关注意点

要掌握次级资料（DEPST）
访谈，问卷（封闭式问卷方式）
IPLC（生命周期） 

3个结果:

5年预估的财务报告
4P&#160;&#160; (Promotion,Place,Product,Price)
Promotion (提出来)

创新的三个层次：

满足需求
挖掘需求
创造需求 

模拟项目：ET and ABC（买方） 

&#160;
Solaris:
Jamon&#160; 运行分析工具 
作业：Dtrace的用法和某个场景下的使用。
JDBC 4.0特性
&#160;
JDBC resource
public abstract class ClientBaseDataSource implements Serializable, Referenceable
public class ClientConnectionPoolDataSource40 extends ClientConnectionPoolDataSource
public class ClientConnectionPoolDataSource extends ClientDataSource&#160; implements ConnectionPoolDataSource
public class ClientDataSource40 extends ClientDataSource
public class ClientDataSource extends ClientBaseDataSource implements DataSource
public class ClientDriver implements java.sql.Driver
public class ClientXADataSource40 extends ClientXADataSource
]]></description>
			<content:encoded><![CDATA[<p>营销课（5.22）</p>
<p>相关注意点</p>
<ol>
<li>要掌握次级资料（DEPST）
<li>访谈，问卷（封闭式问卷方式）
<li>IPLC（生命周期） </li>
</ol>
<p>3个结果:</p>
<ol>
<li>5年预估的财务报告
<li>4P&nbsp;&nbsp; (Promotion,Place,Product,Price)
<li>Promotion (提出来)</li>
</ol>
<p>创新的三个层次：</p>
<ol>
<li>满足需求
<li>挖掘需求
<li>创造需求 </li>
</ol>
<p>模拟项目：ET and ABC（买方） </p>
<p><span id="more-167"></span></p>
<p>&nbsp;</p>
<p>Solaris:</p>
<p><a href="http://www.jamon.org/" target="_blank">Jamon</a>&nbsp; 运行分析工具 </p>
<p>作业：Dtrace的用法和某个场景下的使用。</p>
<p><a href="http://www.qqread.com/java/2006/11/w280282_4.html" target="_blank">JDBC 4.0特性</a></p>
<p>&nbsp;</p>
<p>JDBC resource</p>
<p>public abstract class ClientBaseDataSource implements Serializable, Referenceable</p>
<p>public class ClientConnectionPoolDataSource40 extends ClientConnectionPoolDataSource
<p>public class ClientConnectionPoolDataSource extends ClientDataSource&nbsp; implements ConnectionPoolDataSource
<p>public class ClientDataSource40 extends ClientDataSource
<p>public class ClientDataSource extends ClientBaseDataSource implements DataSource
<p>public class ClientDriver implements java.sql.Driver
<p>public class ClientXADataSource40 extends ClientXADataSource</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/study-report522/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java高级特性（4）作业</title>
		<link>http://edwardpku.com/blog/2008/05/java%e9%ab%98%e7%ba%a7%e7%89%b9%e6%80%a7%ef%bc%884%ef%bc%89/</link>
		<comments>http://edwardpku.com/blog/2008/05/java%e9%ab%98%e7%ba%a7%e7%89%b9%e6%80%a7%ef%bc%884%ef%bc%89/#comments</comments>
		<pubDate>Tue, 20 May 2008 12:55:24 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=166</guid>
		<description><![CDATA[题目：
试编写一个基于消息队列的股票交易价格显示程序。该程序中的一个线程模拟从卫星通信、微波通信或股票信息发射台等不同途径获取最新的股票交易价格信息，并将价格数据写入一个消息队列中；程序中的另一个线程负责从消息队列中取出价格数据，并以图形方式展示给终端用户。   （提示：设计本程序的关键是处理好消息队列的同步问题；还可考虑使用输入?输出流或JDBC 实现消息队列的持久性。）
什么是消息队列：
消息队列是线程间通讯的手段：
import java.util.*
public class MsgQueue{
&#160;&#160; private Vector&#160; queue = null;
&#160;&#160; public MsgQueue(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; queue&#160; = new&#160;&#160; Vector();
&#160;&#160; }
&#160;&#160; public synchronized void send(Object o)
&#160;&#160; {
&#160;&#160;&#160;&#160;&#160; queue.addElement(o);
&#160;&#160; }
&#160;&#160; public synchronized Object recv()
&#160; {
&#160;&#160;&#160;&#160; if(queue.size()==0)
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return null;
&#160;&#160;&#160;&#160; Object o = queue.firstElement();
&#160;&#160;&#160;&#160; queue.removeElementAt(0);//or queue[0] = null can also work
&#160;&#160;&#160;&#160; return o;
&#160; }
}
&#160;
同时可以使用java.util.concurrent来实现连接池、消息队列
&#160;
多线程：
实现方式：
 extend Thread
implements Runnable
构造是Thread(适合Run方法小的情况下)
线程加锁:synchronized
线程之间的通信：wait() 和notifyAll()
&#160;
Web服务器(Web Container&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>题目：</p>
<p>试编写一个基于消息队列的股票交易价格显示程序。该程序中的一个线程模拟从卫星通信、微波通信或股票信息发射台等不同途径获取最新的股票交易价格信息，并将价格数据写入一个消息队列中；程序中的另一个线程负责从消息队列中取出价格数据，并以图形方式展示给终端用户。   <br />（提示：设计本程序的关键是处理好消息队列的同步问题；还可考虑使用输入?输出流或JDBC 实现消息队列的持久性。）</p>
<p>什么是消息队列：</p>
<p>消息队列是线程间通讯的手段：</p>
<p>import java.util.*</p>
<p>public class MsgQueue{</p>
<p>&#160;&#160; private Vector&#160; queue = null;</p>
<p>&#160;&#160; public MsgQueue(){</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; queue&#160; = new&#160;&#160; Vector();</p>
<p>&#160;&#160; }</p>
<p>&#160;&#160; public synchronized void send(Object o)</p>
<p>&#160;&#160; {</p>
<p>&#160;&#160;&#160;&#160;&#160; queue.addElement(o);</p>
<p>&#160;&#160; }</p>
<p>&#160;&#160; public synchronized Object recv()</p>
<p>&#160; {</p>
<p>&#160;&#160;&#160;&#160; if(queue.size()==0)</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return null;</p>
<p>&#160;&#160;&#160;&#160; Object o = queue.firstElement();</p>
<p>&#160;&#160;&#160;&#160; queue.removeElementAt(0);//or queue[0] = null can also work</p>
<p>&#160;&#160;&#160;&#160; return o;</p>
<p>&#160; }</p>
<p>}</p>
<p>&#160;</p>
<p><a href="http://www.javajia.com/article/39-Java/2688.html" target="_blank">同时可以使用java.util.concurrent来实现连接池、消息队列</a></p>
<p>&#160;</p>
<p>多线程：</p>
<p>实现方式：</p>
<p> extend Thread</p>
<p>implements Runnable</p>
<p>构造是Thread(适合Run方法小的情况下)</p>
<p>线程加锁:synchronized</p>
<p>线程之间的通信：wait() 和notifyAll()</p>
<p>&#160;</p>
<p>Web服务器(Web Container&#160; such as Tomcat and Apache)的作用：产生一个连接池，为每一个连接分类一个线程，这样做能够省去每个请求创建Thread对象的开销。</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/java%e9%ab%98%e7%ba%a7%e7%89%b9%e6%80%a7%ef%bc%884%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSP、Servlet、Tomcat、JDK、J2EE版本比较</title>
		<link>http://edwardpku.com/blog/2008/05/jsp%e3%80%81servlet%e3%80%81tomcat%e3%80%81jdk%e3%80%81j2ee%e7%89%88%e6%9c%ac%e6%af%94%e8%be%83/</link>
		<comments>http://edwardpku.com/blog/2008/05/jsp%e3%80%81servlet%e3%80%81tomcat%e3%80%81jdk%e3%80%81j2ee%e7%89%88%e6%9c%ac%e6%af%94%e8%be%83/#comments</comments>
		<pubDate>Mon, 29 Nov 1999 16:00:00 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://edwardpku.com/blog/2008/05/jsp%e3%80%81servlet%e3%80%81tomcat%e3%80%81jdk%e3%80%81j2ee%e7%89%88%e6%9c%ac%e6%af%94%e8%be%83/</guid>
		<description><![CDATA[一 JSP2.0与JSP1.2比较
JSP 2.0是对JSP 1.2的升级，新增功能：
1. Expression Language
2. 新增Simple Tag和Tag File
3.web.xml新增&#60;jsp:config&#62;元素
特别说明web.xml.
web.xml新增&#60;jsp:config&#62;元素
&#60;jsp-config&#62; 元素主要用来设定JSP相关配置，&#60;jsp-config&#62; 包括&#60;taglib&#62;和&#60;jsp-property-group&#62;
子元素。
(1)其中&#60;taglib&#62;以前的Jsp1.2中就有的,taglib主要作用是作为页面taglib标签中的uri和tld文件的一个映射关系
(2)其中&#60;jsp-property-group&#62;是JSP2.0种新增的元素。
&#60;jsp-property-group&#62; 主要包括8个子元素，它们分别是：
&#60;jsp-property-group&#62;
&#60;description&#62;
设定的说明
&#60;/description&#62;
&#60;display-name&#62;设定名称&#60;/display-name&#62;
&#60;url-pattern&#62;设定值所影响的范围&#60;/url-pattern&#62;
&#60;el-ignored&#62;若为true则不支持EL语法&#60;／el-ignored&#62;
&#60;page-encoding&#62;ISO-8859-1&#60;/page-encoding&#62;
&#60;scripting-invalid&#62; 若为true则不支持&#60;% scripting%&#62; 语法&#60;/scripting-invalid&#62;
&#60;include-prelude&#62;设置JSP网页的抬头,扩展名为.jspf &#60;/include-prelude&#62;
&#60;include-coda&#62;设置JSP网页的结尾,扩展名为.jspf&#60;/include-coda&#62;
&#60;/jsp-property-group&#62;
例如: 其中抬头程序:
prelude.jspf
&#60;br&#62;
&#60;center&#62;
文本内容
&#60;/center&#62;
&#60;hr&#62;
结尾程序:
coda.jspf
&#60;br&#62;
&#60;center&#62;
文本内容
&#60;/center&#62;
&#60;hr&#62;
二、Servlet个版本比较
servlet 2.3 新增功能:
2000年10月份出来
Servlet API 2.3中最重大的改变是增加了filters
servlet 2.4 新增功能:
2003年11月份出来
1、web.xml DTD改用了XML Schema;
Servlet 2.3之前的版本使用DTD作为部署描述文件的定义，其web.xml的格式为如下所示：
&#60;?xml version=&#8221;1.0&#8243; encoding=&#8221;IS0-8859-1&#8243;?&#62;
&#60;!DOCTYPE web-app
PUBLIC &#8220;-//sunMicrosystems,Inc.//DTD WebApplication 2.3f//EN&#8221;
&#8220;http://java.sun.com/j2ee/dtds/web-app_2.3.dtd&#8220;&#62;
&#60;web-app&#62;
&#8230;&#8230;.
&#60;/web-app&#62;
Servlet 2.4版首次使用XML Schema定义作为部署描述文件，这样Web容器更容易校验web.xml语法。同时XML Schema提供了更好的扩充性，其web.xml中的格式如下所示：
&#60;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&#62;
&#60;web-app version=&#8221;2.4&#8243; xmlns=&#8221;http://java.sun.com/xml/ns/j2ee&#8221;
xmlns:workflow=&#8221;http://www.workflow.com&#8221;
xmins:xsi=&#8221;http://www.w3.org/2001/XMLSchema-instance&#8221;
xsi:schemaLocation=&#8221;http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&#8220;&#62;
&#8230;&#8230;&#8230;
&#60;/web-app&#62;
注意: 改为Schema后主要加强了两项功能:
(1) 元素不依照顺序设定
(2) 更强大的验证机制
主要体现在:
a.检查元素的值是否为合法的值
b.检查元素的值是否为合法的文字字符或者数字字符
c.检查Servlet,Filter,EJB-ref等等元素的名称是否唯一
2.新增Filter四种设定：REQUEST、FORWARD、INCLUDE和ERROR。
3.新增Request Listener、Event和Request Attribute Listener、Enent。
4.取消SingleThreadModel接口。当Servlet实现SingleThreadModel接口时，它能确保同时间内，只能有一个thread执行此Servlet。
5.&#60;welcome-file-list&#62;可以为Servlet。
6.ServletRequest接口新增一些方法。
public String getLocalName()
public String getLocalAddr()
public int getLocalPort()
public int getRemotePort()
Servlet 2.5的新特征
2005年9月发布Servlet 2.5
Servlet2.5一些变化的介绍：
1） [...]]]></description>
			<content:encoded><![CDATA[<p>一 JSP2.0与JSP1.2比较<br />
JSP 2.0是对JSP 1.2的升级，新增功能：<br />
1. Expression Language</p>
<p>2. 新增Simple Tag和Tag File</p>
<p>3.web.xml新增&lt;jsp:config&gt;元素</p>
<p>特别说明web.xml.<br />
web.xml新增&lt;jsp:config&gt;元素</p>
<p>&lt;jsp-config&gt; 元素主要用来设定JSP相关配置，&lt;jsp-config&gt; 包括&lt;taglib&gt;和&lt;jsp-property-group&gt;<br />
子元素。</p>
<p>(1)其中&lt;taglib&gt;以前的Jsp1.2中就有的,taglib主要作用是作为页面taglib标签中的uri和tld文件的一个映射关系</p>
<p>(2)其中&lt;jsp-property-group&gt;是JSP2.0种新增的元素。<br />
&lt;jsp-property-group&gt; 主要包括8个子元素，它们分别是：</p>
<p>&lt;jsp-property-group&gt;</p>
<p>&lt;description&gt;<br />
设定的说明<br />
&lt;/description&gt;</p>
<p>&lt;display-name&gt;设定名称&lt;/display-name&gt;</p>
<p>&lt;url-pattern&gt;设定值所影响的范围&lt;/url-pattern&gt;</p>
<p>&lt;el-ignored&gt;若为true则不支持EL语法&lt;／el-ignored&gt;</p>
<p>&lt;page-encoding&gt;ISO-8859-1&lt;/page-encoding&gt;</p>
<p>&lt;scripting-invalid&gt; 若为true则不支持&lt;% scripting%&gt; 语法&lt;/scripting-invalid&gt;</p>
<p>&lt;include-prelude&gt;设置JSP网页的抬头,扩展名为.jspf &lt;/include-prelude&gt;</p>
<p>&lt;include-coda&gt;设置JSP网页的结尾,扩展名为.jspf&lt;/include-coda&gt;</p>
<p>&lt;/jsp-property-group&gt;</p>
<p>例如: 其中抬头程序:<br />
prelude.jspf<br />
&lt;br&gt;<br />
&lt;center&gt;<br />
文本内容<br />
&lt;/center&gt;<br />
&lt;hr&gt;</p>
<p>结尾程序:<br />
coda.jspf<br />
&lt;br&gt;<br />
&lt;center&gt;<br />
文本内容<br />
&lt;/center&gt;<br />
&lt;hr&gt;</p>
<p>二、Servlet个版本比较<br />
servlet 2.3 新增功能:<br />
2000年10月份出来<br />
Servlet API 2.3中最重大的改变是增加了filters</p>
<p>servlet 2.4 新增功能:<br />
2003年11月份出来<br />
1、web.xml DTD改用了XML Schema;</p>
<p>Servlet 2.3之前的版本使用DTD作为部署描述文件的定义，其web.xml的格式为如下所示：</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;IS0-8859-1&#8243;?&gt;<br />
&lt;!DOCTYPE web-app<br />
PUBLIC &#8220;-//sunMicrosystems,Inc.//DTD WebApplication 2.3f//EN&#8221;<br />
&#8220;<a href="http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">http://java.sun.com/j2ee/dtds/web-app_2.3.dtd</a>&#8220;&gt;<br />
&lt;web-app&gt;<br />
&#8230;&#8230;.<br />
&lt;/web-app&gt;</p>
<p>Servlet 2.4版首次使用XML Schema定义作为部署描述文件，这样Web容器更容易校验web.xml语法。同时XML Schema提供了更好的扩充性，其web.xml中的格式如下所示：</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;web-app version=&#8221;2.4&#8243; xmlns=&#8221;<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>&#8221;<br />
xmlns:workflow=&#8221;<a href="http://www.workflow.com">http://www.workflow.com</a>&#8221;<br />
xmins:xsi=&#8221;<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>&#8221;<br />
xsi:schemaLocation=&#8221;<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a><br />
<a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>&#8220;&gt;<br />
&#8230;&#8230;&#8230;<br />
&lt;/web-app&gt;</p>
<p>注意: 改为Schema后主要加强了两项功能:<br />
(1) 元素不依照顺序设定<br />
(2) 更强大的验证机制<br />
主要体现在:<br />
a.检查元素的值是否为合法的值<br />
b.检查元素的值是否为合法的文字字符或者数字字符<br />
c.检查Servlet,Filter,EJB-ref等等元素的名称是否唯一<br />
2.新增Filter四种设定：REQUEST、FORWARD、INCLUDE和ERROR。<br />
3.新增Request Listener、Event和Request Attribute Listener、Enent。<br />
4.取消SingleThreadModel接口。当Servlet实现SingleThreadModel接口时，它能确保同时间内，只能有一个thread执行此Servlet。<br />
5.&lt;welcome-file-list&gt;可以为Servlet。<br />
6.ServletRequest接口新增一些方法。<br />
public String getLocalName()<br />
public String getLocalAddr()<br />
public int getLocalPort()<br />
public int getRemotePort()</p>
<p>Servlet 2.5的新特征<br />
2005年9月发布Servlet 2.5<br />
Servlet2.5一些变化的介绍：<br />
1） 基于最新的J2SE 5.0开发的。<br />
2） 支持annotations 。<br />
3） web.xml中的几处配置更加方便。<br />
4） 去除了少数的限制。<br />
5） 优化了一些实例</p>
<p>servlet的各个版本对监听器的变化有：<br />
(1)servlet2.2和jsp1.1<br />
新增Listener:HttpSessionBindingListener<br />
新增Event: HttpSessionBindingEvent<br />
(2)servlet2.3和jsp1.2<br />
新增Listener:ServletContextListener,ServletContextAttributeListener<br />
,HttpSessionListener,HttpSessionActivationListener,HttpSessionAttributeListener<br />
新增Event: ServletContextEvent,ServletContextAttributeEvent,HttpSessionEvent<br />
(3)servlet2.4和jsp2.0<br />
新增Listener:ServletRequestListener,ServletRequestAttribureListener<br />
新增Event: ServletRequestEvent,ServletRequestAttributeEvent<br />
三、J2EE规范版本比较<br />
1.J2EE的发展</p>
<p>1997年Servlet技术的产生以及紧接着JSP的产生，为Java对抗PHP，ASP等等服务器端语言带来了筹码。1998年，Sun发布了EJB1.0标准，至此J2EE平台的三个核心技术都已经出现。于是，1999年，Sun正式发布了J2EE的第一个版本。并与1999年底发布了J2EE1.2，在2001年发布了J2EE1.3，2003年发布了J2EE1.4。</p>
<p>2.J2EE1.3<br />
J2EE1.3的架构，其中主要包含了Applet容器，Application Client容器，Web容器和EJB容器，并且包含了Web Component，EJB Component，Application Client Component，以JMS，JAAS，JAXP，JDBC，JAF，JavaMail，JTA等等技术做为基础。</p>
<p>1.3中引入了几个值得注意的功能：Java消息服务（定义了JMS的一组API），J2EE连接器技术（定义了扩展J2EE服务到非J2EE应用程序的标准），XML解析器的一组Java API，Servlet2.3，JSP1.2也都进行了性能扩展与优化，全新的CMP组件模型和MDB（消息Bean）。</p>
<p>3.J2EE1.4</p>
<p>J2EE1.4大体上的框架和J2EE1.3是一致的，1.4增加了对Web服务的支持，主要是Web Service，JAX-RPC，SAAJ，JAXR，还对EJB的消息传递机制进行了完善（EJB2.1）,部署与管理工具的增强（JMX），以及新版本的Servlet2.4和JSP2.0使得Web应用更加容易。</p>
<p>四、Tomcat版本比较<br />
Tomcat 3.x<br />
servlet2.2和jsp1.1标准<br />
Tomcat 4.x<br />
Servlet 2.3 和 JSP 1.2 版本<br />
Tomcat 5.x<br />
Servlet 2.4或2.5 和 JSP 2.0 版本</p>
<p>五、JDK版本比较<br />
已发行的版本:<br />
版本号 名称 中文名 发布日期<br />
JDK 1.1.4 Sparkler 宝石 1997-09-12<br />
JDK 1.1.5 Pumpkin 南瓜 1997-12-13<br />
JDK 1.1.6 Abigail 阿比盖尔&#8211;女子名 1998-04-24<br />
JDK 1.1.7 Brutus 布鲁图&#8211;古罗马政治家和将军 1998-09-28<br />
JDK 1.1.8 Chelsea 切尔西&#8211;城市名 1999-04-08<br />
J2SE 1.2 Playground 运动场 1998-12-04<br />
J2SE 1.2.1 none 无 1999-03-30<br />
J2SE 1.2.2 Cricket 蟋蟀 1999-07-08<br />
J2SE 1.3 Kestrel 美洲红隼 2000-05-08<br />
J2SE 1.3.1 Ladybird 瓢虫 2001-05-17<br />
J2SE 1.4.0 Merlin 灰背隼 2002-02-13<br />
J2SE 1.4.1 grasshopper 蚱蜢 2002-09-16<br />
J2SE 1.4.2 Mantis 螳螂 2003-06-26<br />
将发行的版本:<br />
J2SE 5.0 (1.5.0) Tiger 老虎 已发布了Beta版本<br />
J2SE 5.1 (1.5.1) Dragonfly 蜻蜓 未发布<br />
J2SE 6.0 (1.6.0) Mustang 野马 未发布</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/jsp%e3%80%81servlet%e3%80%81tomcat%e3%80%81jdk%e3%80%81j2ee%e7%89%88%e6%9c%ac%e6%af%94%e8%be%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSP、Servlet、Tomcat、JDK、J2EE版本比较</title>
		<link>http://edwardpku.com/blog/2008/05/jsp%e3%80%81servlet%e3%80%81tomcat%e3%80%81jdk%e3%80%81j2ee%e7%89%88%e6%9c%ac%e6%af%94%e8%be%83-2/</link>
		<comments>http://edwardpku.com/blog/2008/05/jsp%e3%80%81servlet%e3%80%81tomcat%e3%80%81jdk%e3%80%81j2ee%e7%89%88%e6%9c%ac%e6%af%94%e8%be%83-2/#comments</comments>
		<pubDate>Mon, 29 Nov 1999 16:00:00 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://edwardpku.com/blog/2008/05/jsp%e3%80%81servlet%e3%80%81tomcat%e3%80%81jdk%e3%80%81j2ee%e7%89%88%e6%9c%ac%e6%af%94%e8%be%83-2/</guid>
		<description><![CDATA[一 JSP2.0与JSP1.2比较
JSP 2.0是对JSP 1.2的升级，新增功能：
1. Expression Language
2. 新增Simple Tag和Tag File
3.web.xml新增&#60;jsp:config&#62;元素
特别说明web.xml.
web.xml新增&#60;jsp:config&#62;元素
&#60;jsp-config&#62; 元素主要用来设定JSP相关配置，&#60;jsp-config&#62; 包括&#60;taglib&#62;和&#60;jsp-property-group&#62;
子元素。
(1)其中&#60;taglib&#62;以前的Jsp1.2中就有的,taglib主要作用是作为页面taglib标签中的uri和tld文件的一个映射关系
(2)其中&#60;jsp-property-group&#62;是JSP2.0种新增的元素。
&#60;jsp-property-group&#62; 主要包括8个子元素，它们分别是：
&#60;jsp-property-group&#62;
&#60;description&#62;
设定的说明
&#60;/description&#62;
&#60;display-name&#62;设定名称&#60;/display-name&#62;
&#60;url-pattern&#62;设定值所影响的范围&#60;/url-pattern&#62;
&#60;el-ignored&#62;若为true则不支持EL语法&#60;／el-ignored&#62;
&#60;page-encoding&#62;ISO-8859-1&#60;/page-encoding&#62;
&#60;scripting-invalid&#62; 若为true则不支持&#60;% scripting%&#62; 语法&#60;/scripting-invalid&#62;
&#60;include-prelude&#62;设置JSP网页的抬头,扩展名为.jspf &#60;/include-prelude&#62;
&#60;include-coda&#62;设置JSP网页的结尾,扩展名为.jspf&#60;/include-coda&#62;
&#60;/jsp-property-group&#62;
例如: 其中抬头程序:
prelude.jspf
&#60;br&#62;
&#60;center&#62;
文本内容
&#60;/center&#62;
&#60;hr&#62;
结尾程序:
coda.jspf
&#60;br&#62;
&#60;center&#62;
文本内容
&#60;/center&#62;
&#60;hr&#62;
二、Servlet个版本比较
servlet 2.3 新增功能:
2000年10月份出来
Servlet API 2.3中最重大的改变是增加了filters
servlet 2.4 新增功能:
2003年11月份出来
1、web.xml DTD改用了XML Schema;
Servlet 2.3之前的版本使用DTD作为部署描述文件的定义，其web.xml的格式为如下所示：
&#60;?xml version=&#8221;1.0&#8243; encoding=&#8221;IS0-8859-1&#8243;?&#62;
&#60;!DOCTYPE web-app
PUBLIC &#8220;-//sunMicrosystems,Inc.//DTD WebApplication 2.3f//EN&#8221;
&#8220;http://java.sun.com/j2ee/dtds/web-app_2.3.dtd&#8220;&#62;
&#60;web-app&#62;
&#8230;&#8230;.
&#60;/web-app&#62;
Servlet 2.4版首次使用XML Schema定义作为部署描述文件，这样Web容器更容易校验web.xml语法。同时XML Schema提供了更好的扩充性，其web.xml中的格式如下所示：
&#60;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&#62;
&#60;web-app version=&#8221;2.4&#8243; xmlns=&#8221;http://java.sun.com/xml/ns/j2ee&#8221;
xmlns:workflow=&#8221;http://www.workflow.com&#8221;
xmins:xsi=&#8221;http://www.w3.org/2001/XMLSchema-instance&#8221;
xsi:schemaLocation=&#8221;http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&#8220;&#62;
&#8230;&#8230;&#8230;
&#60;/web-app&#62;
注意: 改为Schema后主要加强了两项功能:
(1) 元素不依照顺序设定
(2) 更强大的验证机制
主要体现在:
a.检查元素的值是否为合法的值
b.检查元素的值是否为合法的文字字符或者数字字符
c.检查Servlet,Filter,EJB-ref等等元素的名称是否唯一
2.新增Filter四种设定：REQUEST、FORWARD、INCLUDE和ERROR。
3.新增Request Listener、Event和Request Attribute Listener、Enent。
4.取消SingleThreadModel接口。当Servlet实现SingleThreadModel接口时，它能确保同时间内，只能有一个thread执行此Servlet。
5.&#60;welcome-file-list&#62;可以为Servlet。
6.ServletRequest接口新增一些方法。
public String getLocalName()
public String getLocalAddr()
public int getLocalPort()
public int getRemotePort()
Servlet 2.5的新特征
2005年9月发布Servlet 2.5
Servlet2.5一些变化的介绍：
1） [...]]]></description>
			<content:encoded><![CDATA[<p>一 JSP2.0与JSP1.2比较<br />
JSP 2.0是对JSP 1.2的升级，新增功能：<br />
1. Expression Language</p>
<p>2. 新增Simple Tag和Tag File</p>
<p>3.web.xml新增&lt;jsp:config&gt;元素</p>
<p>特别说明web.xml.<br />
web.xml新增&lt;jsp:config&gt;元素</p>
<p>&lt;jsp-config&gt; 元素主要用来设定JSP相关配置，&lt;jsp-config&gt; 包括&lt;taglib&gt;和&lt;jsp-property-group&gt;<br />
子元素。</p>
<p>(1)其中&lt;taglib&gt;以前的Jsp1.2中就有的,taglib主要作用是作为页面taglib标签中的uri和tld文件的一个映射关系</p>
<p>(2)其中&lt;jsp-property-group&gt;是JSP2.0种新增的元素。<br />
&lt;jsp-property-group&gt; 主要包括8个子元素，它们分别是：</p>
<p>&lt;jsp-property-group&gt;</p>
<p>&lt;description&gt;<br />
设定的说明<br />
&lt;/description&gt;</p>
<p>&lt;display-name&gt;设定名称&lt;/display-name&gt;</p>
<p>&lt;url-pattern&gt;设定值所影响的范围&lt;/url-pattern&gt;</p>
<p>&lt;el-ignored&gt;若为true则不支持EL语法&lt;／el-ignored&gt;</p>
<p>&lt;page-encoding&gt;ISO-8859-1&lt;/page-encoding&gt;</p>
<p>&lt;scripting-invalid&gt; 若为true则不支持&lt;% scripting%&gt; 语法&lt;/scripting-invalid&gt;</p>
<p>&lt;include-prelude&gt;设置JSP网页的抬头,扩展名为.jspf &lt;/include-prelude&gt;</p>
<p>&lt;include-coda&gt;设置JSP网页的结尾,扩展名为.jspf&lt;/include-coda&gt;</p>
<p>&lt;/jsp-property-group&gt;</p>
<p>例如: 其中抬头程序:<br />
prelude.jspf<br />
&lt;br&gt;<br />
&lt;center&gt;<br />
文本内容<br />
&lt;/center&gt;<br />
&lt;hr&gt;</p>
<p>结尾程序:<br />
coda.jspf<br />
&lt;br&gt;<br />
&lt;center&gt;<br />
文本内容<br />
&lt;/center&gt;<br />
&lt;hr&gt;</p>
<p>二、Servlet个版本比较<br />
servlet 2.3 新增功能:<br />
2000年10月份出来<br />
Servlet API 2.3中最重大的改变是增加了filters</p>
<p>servlet 2.4 新增功能:<br />
2003年11月份出来<br />
1、web.xml DTD改用了XML Schema;</p>
<p>Servlet 2.3之前的版本使用DTD作为部署描述文件的定义，其web.xml的格式为如下所示：</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;IS0-8859-1&#8243;?&gt;<br />
&lt;!DOCTYPE web-app<br />
PUBLIC &#8220;-//sunMicrosystems,Inc.//DTD WebApplication 2.3f//EN&#8221;<br />
&#8220;<a href="http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">http://java.sun.com/j2ee/dtds/web-app_2.3.dtd</a>&#8220;&gt;<br />
&lt;web-app&gt;<br />
&#8230;&#8230;.<br />
&lt;/web-app&gt;</p>
<p>Servlet 2.4版首次使用XML Schema定义作为部署描述文件，这样Web容器更容易校验web.xml语法。同时XML Schema提供了更好的扩充性，其web.xml中的格式如下所示：</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;web-app version=&#8221;2.4&#8243; xmlns=&#8221;<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>&#8221;<br />
xmlns:workflow=&#8221;<a href="http://www.workflow.com">http://www.workflow.com</a>&#8221;<br />
xmins:xsi=&#8221;<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>&#8221;<br />
xsi:schemaLocation=&#8221;<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a><br />
<a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>&#8220;&gt;<br />
&#8230;&#8230;&#8230;<br />
&lt;/web-app&gt;</p>
<p>注意: 改为Schema后主要加强了两项功能:<br />
(1) 元素不依照顺序设定<br />
(2) 更强大的验证机制<br />
主要体现在:<br />
a.检查元素的值是否为合法的值<br />
b.检查元素的值是否为合法的文字字符或者数字字符<br />
c.检查Servlet,Filter,EJB-ref等等元素的名称是否唯一<br />
2.新增Filter四种设定：REQUEST、FORWARD、INCLUDE和ERROR。<br />
3.新增Request Listener、Event和Request Attribute Listener、Enent。<br />
4.取消SingleThreadModel接口。当Servlet实现SingleThreadModel接口时，它能确保同时间内，只能有一个thread执行此Servlet。<br />
5.&lt;welcome-file-list&gt;可以为Servlet。<br />
6.ServletRequest接口新增一些方法。<br />
public String getLocalName()<br />
public String getLocalAddr()<br />
public int getLocalPort()<br />
public int getRemotePort()</p>
<p>Servlet 2.5的新特征<br />
2005年9月发布Servlet 2.5<br />
Servlet2.5一些变化的介绍：<br />
1） 基于最新的J2SE 5.0开发的。<br />
2） 支持annotations 。<br />
3） web.xml中的几处配置更加方便。<br />
4） 去除了少数的限制。<br />
5） 优化了一些实例</p>
<p>servlet的各个版本对监听器的变化有：<br />
(1)servlet2.2和jsp1.1<br />
新增Listener:HttpSessionBindingListener<br />
新增Event: HttpSessionBindingEvent<br />
(2)servlet2.3和jsp1.2<br />
新增Listener:ServletContextListener,ServletContextAttributeListener<br />
,HttpSessionListener,HttpSessionActivationListener,HttpSessionAttributeListener<br />
新增Event: ServletContextEvent,ServletContextAttributeEvent,HttpSessionEvent<br />
(3)servlet2.4和jsp2.0<br />
新增Listener:ServletRequestListener,ServletRequestAttribureListener<br />
新增Event: ServletRequestEvent,ServletRequestAttributeEvent<br />
三、J2EE规范版本比较<br />
1.J2EE的发展</p>
<p>1997年Servlet技术的产生以及紧接着JSP的产生，为Java对抗PHP，ASP等等服务器端语言带来了筹码。1998年，Sun发布了EJB1.0标准，至此J2EE平台的三个核心技术都已经出现。于是，1999年，Sun正式发布了J2EE的第一个版本。并与1999年底发布了J2EE1.2，在2001年发布了J2EE1.3，2003年发布了J2EE1.4。</p>
<p>2.J2EE1.3<br />
J2EE1.3的架构，其中主要包含了Applet容器，Application Client容器，Web容器和EJB容器，并且包含了Web Component，EJB Component，Application Client Component，以JMS，JAAS，JAXP，JDBC，JAF，JavaMail，JTA等等技术做为基础。</p>
<p>1.3中引入了几个值得注意的功能：Java消息服务（定义了JMS的一组API），J2EE连接器技术（定义了扩展J2EE服务到非J2EE应用程序的标准），XML解析器的一组Java API，Servlet2.3，JSP1.2也都进行了性能扩展与优化，全新的CMP组件模型和MDB（消息Bean）。</p>
<p>3.J2EE1.4</p>
<p>J2EE1.4大体上的框架和J2EE1.3是一致的，1.4增加了对Web服务的支持，主要是Web Service，JAX-RPC，SAAJ，JAXR，还对EJB的消息传递机制进行了完善（EJB2.1）,部署与管理工具的增强（JMX），以及新版本的Servlet2.4和JSP2.0使得Web应用更加容易。</p>
<p>四、Tomcat版本比较<br />
Tomcat 3.x<br />
servlet2.2和jsp1.1标准<br />
Tomcat 4.x<br />
Servlet 2.3 和 JSP 1.2 版本<br />
Tomcat 5.x<br />
Servlet 2.4或2.5 和 JSP 2.0 版本</p>
<p>五、JDK版本比较<br />
已发行的版本:<br />
版本号 名称 中文名 发布日期<br />
JDK 1.1.4 Sparkler 宝石 1997-09-12<br />
JDK 1.1.5 Pumpkin 南瓜 1997-12-13<br />
JDK 1.1.6 Abigail 阿比盖尔&#8211;女子名 1998-04-24<br />
JDK 1.1.7 Brutus 布鲁图&#8211;古罗马政治家和将军 1998-09-28<br />
JDK 1.1.8 Chelsea 切尔西&#8211;城市名 1999-04-08<br />
J2SE 1.2 Playground 运动场 1998-12-04<br />
J2SE 1.2.1 none 无 1999-03-30<br />
J2SE 1.2.2 Cricket 蟋蟀 1999-07-08<br />
J2SE 1.3 Kestrel 美洲红隼 2000-05-08<br />
J2SE 1.3.1 Ladybird 瓢虫 2001-05-17<br />
J2SE 1.4.0 Merlin 灰背隼 2002-02-13<br />
J2SE 1.4.1 grasshopper 蚱蜢 2002-09-16<br />
J2SE 1.4.2 Mantis 螳螂 2003-06-26<br />
将发行的版本:<br />
J2SE 5.0 (1.5.0) Tiger 老虎 已发布了Beta版本<br />
J2SE 5.1 (1.5.1) Dragonfly 蜻蜓 未发布<br />
J2SE 6.0 (1.6.0) Mustang 野马 未发布</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/jsp%e3%80%81servlet%e3%80%81tomcat%e3%80%81jdk%e3%80%81j2ee%e7%89%88%e6%9c%ac%e6%af%94%e8%be%83-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>J2EE项目中的数据持久层设计</title>
		<link>http://edwardpku.com/blog/2008/05/j2ee%e9%a1%b9%e7%9b%ae%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e6%8c%81%e4%b9%85%e5%b1%82%e8%ae%be%e8%ae%a1/</link>
		<comments>http://edwardpku.com/blog/2008/05/j2ee%e9%a1%b9%e7%9b%ae%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e6%8c%81%e4%b9%85%e5%b1%82%e8%ae%be%e8%ae%a1/#comments</comments>
		<pubDate>Mon, 29 Nov 1999 16:00:00 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://edwardpku.com/blog/2008/05/j2ee%e9%a1%b9%e7%9b%ae%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e6%8c%81%e4%b9%85%e5%b1%82%e8%ae%be%e8%ae%a1/</guid>
		<description><![CDATA[数据持久层的设计目标是为整个项目提供一个高层、统一、安全和并发的数据持久机制。完成对各种数据进行持久化的编程工作，并为系统业务逻辑层提供服务。数据持久层提供了数据访问方法，能够使其它程序员避免手工编写程序访问数据持久层(Persistene layer)，使其专注于业务逻辑的开发，并且能够在不同项目中重用映射框架，大大简化了数据增、删、改、查等功能的开发过程，同时又不丧失多层结构的天然优势，继承延续J2EE特有的可伸缩性和可扩展性。
1 数据持久层及ORM映射框架
笔者从事的项目中的数据持久层，是基于J2EE体系结构，并采用了Hibernate作为持久映射框架。
Hibernate是一种新的ORM映射工具，是JDBC的轻量级的对象封装。Hibernate可以用在JDBC可以使用的任何场合，例如Java应用程序的数据库访问代码，DAO接口的实现类，甚至可以是BMP里面的访问数据库的代码。Hibernate不仅提供了从Java类到数据表之间的映射，也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库，使用Hibernate，可以大大减少操作数据库的工作量。
Hibernate是一个和JDBC密切关联的、独立的对象持久层框架，可以搭配各种App Server、Web Server、EJB Container共同使用，Hibernate的兼容性仅同JDBC驱动、底层数据库产品间有一定的关系，但是和使用它的Java程序、App Server没有任何关系，也不存在兼容性问题。而且事实表明Hibernate可以和多种Web服务器或者应用服务器良好集成，如今已经支持几乎所有的流行的数据库服务器（达16种）。
在较为常用的数据持久方案中，Hibernate无疑是最优秀的，下面是对各种持久方案的比较。
¨ 流行的数据持久层架构：
Business Layer &#60;-&#62; Session Bean &#60;-&#62; Entity Bean &#60;-&#62; DB
¨ 为了解决性能障碍的替代架构：
Business Layer &#60;-&#62; DAO &#60;-&#62; JDBC &#60;-&#62; DB
¨ 使用Hibernate来提高上面架构的开发效率的架构：
Business Layer &#60;-&#62; DAO &#60;-&#62; Hibernate &#60;-&#62; DB
我们就上面3个架构来作如下分析。
(1)内存消耗：采用JDBC的架构无疑是最省内存的，Hibernate的架构次之，EB的架构最差。
(2)运行效率：如果JDBC的代码写的非常优化，那么JDBC架构运行效率最高，但是实际项目中，这一点几乎做不到，这需要程序员非常精通JDBC，运用Batch语句，调整PreapredStatement的Batch Size和Fetch Size等参数，以及在必要的情况下采用结果集cache等等。而一般情况下程序员是做不到这一点的。因此Hibernate架构表现出最快的运行效率。EB的架构效率会差的很远。
(3)开发效率：在有Eclipse、JBuilder等开发工具的支持下，对于简单的项目，EB架构开发效率最高，JDBC次之，Hibernate最差。但是在大的项目，特别是持久层关系映射很复杂的情况下，Hibernate效率高的惊人，JDBC次之，而EB架构很可能会失败。
2 数据持久层设计
复杂性是应用开发过程中最令人头疼的一个问题。每当在一个应用中增加一个功能时，它的复杂性通常呈几何级的增长。这种复杂性往往导致程序的开发无法再继续下去。这也是现在为什么许多应用只有Beta版本而没有正式版的原因。
专家将应用开发过程产生的复杂性分为两类，即非本质的（accidental）和本质的（essential）。本质的复杂性是对于解决目标问题所必然产生的复杂性，非本质的复杂性是由于选择了不适当的开发工具和设计工具而产生的复杂性。对于一个功能确定的程序来讲，本质的复杂性是确定的，而非本质的复杂性则是没有限制的。因此，一个应用的开发要想较顺利地取得成功，就需要尽可能地减少非本质的复杂性。
设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式，也会使新系统开发者更加容易理解其设计思路。
衡量一个系统优秀与否的关键因素，除了能够满足用户需求外还有如下方面：首先是灵活性。灵活性意指这种结构或模式不依赖于任何实际应用，应该与操作系统、应用程序无关。提供独立的结构，可以提供最大的重用。其次是可扩展性。随着业务的扩展，新的业务不断增加，业务逻辑自然增加，系统必然会进行修改或添加相应功能模块。再次是可配置性。最后是安全性。
数据持久层的设计采纳了多种设计模式，最大限度的降低了系统内部各模块、子系统间的耦合性，使得系统相对易于扩展，并且能够在进行改变时，保证持久层的业务逻辑层相对稳定，基本不需要因持久层的调整改变而进行逻辑层的变动。
笔者在项目中采用了如下设计模式。
2.1 整体架构——MVC模式（模型-视图-控制器）
¨ 模型（Model）：模型包含完成任务所需要的所有的行为和数据。在数据持久层中，模型即为值对象以及数据访问对象。
¨ 视图（View）：数据持久层中，视图就是持久层同其它层进行数据交换的值对象（Transfer Object）和视图助手对象。
¨ 控制器（Controller）：持久层所需的控制相对简单，因此集成到了控制代理中。
持久层整体采用MVC模式，使得整个数据持久层的实现部分与项目的业务逻辑部分隔离开来，能够实现对接口作大的修改而不需要对相应的模型进行修改。另外，持久层某子系统发生变化时，不会影响到其它子系统。有利于提高系统的稳定性、可维护性。
2.2 值对象模式（Value Object Pattern）
值对象用来封装业务对象。相应的方法调用是设置（getter）和检索（setter）值对象。它是任意的可串行化的Java对象，当客户端Bean请求业务数据时，该Bean可以构造值对象，用属性值来填充，并按照值把它传递给客户端。
在笔者开发项目的数据持久层体系结构中，值对象主要应用在子系统间传递、交换数据（Transfer Object）和映射数据表两个方面（Persistent Object）。
在各子系统间进行数据传递和数据交换时，使用值对象模式能够最大化地降低系统间数据传递的开销。在这种策略下传递的是对象而不再是一个个的有意义的数据，使得系统在进行扩充、修改时，各子系统间数据传递部分不会受到影响，因为各子系统仅需要关心是否有值对象被传递，而并不去关心传递的到底是什么数据。
在映射数据库表时，值对象类及其子类所构成的树形结构被用来映射一个数据库表，该继承树通过XML配置文件对应数据库中的单个表，这使得最底层的关系型的数据库表结构能够面向对象模型所隐藏，另外，由于面向对象设计方法中类的可继承性，采用继承树对应一个表的策略使得该映射策略极易扩展，并且能够将一个复杂的数据表转化成若干简单的值对象来表示，提高了系统的可维护性和可修改性。
2.3 数据访问对象（DAO）
根据数据源不同，数据访问也不同。根据存储的类型(关系数据库、面向对象数据库等)和供应商不同，持久性存储(比如数据库)的访问差别也很大。当业务组件或表示组件需要访问某数据源时，它们可以使用合适的API来获得连接性，以及操作该数据源。但是在这些组件中包含连接性和数据访问代码会引入这些组件及数据源实现之间的紧密耦合。组件中这类代码依赖性使应用程序
]]></description>
			<content:encoded><![CDATA[<p>数据持久层的设计目标是为整个项目提供一个高层、统一、安全和并发的数据持久机制。完成对各种数据进行持久化的编程工作，并为系统业务逻辑层提供服务。数据持久层提供了数据访问方法，能够使其它程序员避免手工编写程序访问数据持久层(Persistene layer)，使其专注于业务逻辑的开发，并且能够在不同项目中重用映射框架，大大简化了数据增、删、改、查等功能的开发过程，同时又不丧失多层结构的天然优势，继承延续J2EE特有的可伸缩性和可扩展性。</p>
<p>1 数据持久层及ORM映射框架</p>
<p>笔者从事的项目中的数据持久层，是基于J2EE体系结构，并采用了Hibernate作为持久映射框架。</p>
<p>Hibernate是一种新的ORM映射工具，是JDBC的轻量级的对象封装。Hibernate可以用在JDBC可以使用的任何场合，例如Java应用程序的数据库访问代码，DAO接口的实现类，甚至可以是BMP里面的访问数据库的代码。Hibernate不仅提供了从Java类到数据表之间的映射，也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库，使用Hibernate，可以大大减少操作数据库的工作量。</p>
<p>Hibernate是一个和JDBC密切关联的、独立的对象持久层框架，可以搭配各种App Server、Web Server、EJB Container共同使用，Hibernate的兼容性仅同JDBC驱动、底层数据库产品间有一定的关系，但是和使用它的Java程序、App Server没有任何关系，也不存在兼容性问题。而且事实表明Hibernate可以和多种Web服务器或者应用服务器良好集成，如今已经支持几乎所有的流行的数据库服务器（达16种）。</p>
<p>在较为常用的数据持久方案中，Hibernate无疑是最优秀的，下面是对各种持久方案的比较。</p>
<p>¨ 流行的数据持久层架构：</p>
<p>Business Layer &lt;-&gt; Session Bean &lt;-&gt; Entity Bean &lt;-&gt; DB</p>
<p>¨ 为了解决性能障碍的替代架构：</p>
<p>Business Layer &lt;-&gt; DAO &lt;-&gt; JDBC &lt;-&gt; DB</p>
<p>¨ 使用Hibernate来提高上面架构的开发效率的架构：</p>
<p>Business Layer &lt;-&gt; DAO &lt;-&gt; Hibernate &lt;-&gt; DB</p>
<p>我们就上面3个架构来作如下分析。</p>
<p>(1)内存消耗：采用JDBC的架构无疑是最省内存的，Hibernate的架构次之，EB的架构最差。</p>
<p>(2)运行效率：如果JDBC的代码写的非常优化，那么JDBC架构运行效率最高，但是实际项目中，这一点几乎做不到，这需要程序员非常精通JDBC，运用Batch语句，调整PreapredStatement的Batch Size和Fetch Size等参数，以及在必要的情况下采用结果集cache等等。而一般情况下程序员是做不到这一点的。因此Hibernate架构表现出最快的运行效率。EB的架构效率会差的很远。</p>
<p>(3)开发效率：在有Eclipse、JBuilder等开发工具的支持下，对于简单的项目，EB架构开发效率最高，JDBC次之，Hibernate最差。但是在大的项目，特别是持久层关系映射很复杂的情况下，Hibernate效率高的惊人，JDBC次之，而EB架构很可能会失败。</p>
<p>2 数据持久层设计</p>
<p>复杂性是应用开发过程中最令人头疼的一个问题。每当在一个应用中增加一个功能时，它的复杂性通常呈几何级的增长。这种复杂性往往导致程序的开发无法再继续下去。这也是现在为什么许多应用只有Beta版本而没有正式版的原因。</p>
<p>专家将应用开发过程产生的复杂性分为两类，即非本质的（accidental）和本质的（essential）。本质的复杂性是对于解决目标问题所必然产生的复杂性，非本质的复杂性是由于选择了不适当的开发工具和设计工具而产生的复杂性。对于一个功能确定的程序来讲，本质的复杂性是确定的，而非本质的复杂性则是没有限制的。因此，一个应用的开发要想较顺利地取得成功，就需要尽可能地减少非本质的复杂性。</p>
<p>设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式，也会使新系统开发者更加容易理解其设计思路。</p>
<p>衡量一个系统优秀与否的关键因素，除了能够满足用户需求外还有如下方面：首先是灵活性。灵活性意指这种结构或模式不依赖于任何实际应用，应该与操作系统、应用程序无关。提供独立的结构，可以提供最大的重用。其次是可扩展性。随着业务的扩展，新的业务不断增加，业务逻辑自然增加，系统必然会进行修改或添加相应功能模块。再次是可配置性。最后是安全性。</p>
<p>数据持久层的设计采纳了多种设计模式，最大限度的降低了系统内部各模块、子系统间的耦合性，使得系统相对易于扩展，并且能够在进行改变时，保证持久层的业务逻辑层相对稳定，基本不需要因持久层的调整改变而进行逻辑层的变动。</p>
<p>笔者在项目中采用了如下设计模式。</p>
<p>2.1 整体架构——MVC模式（模型-视图-控制器）</p>
<p>¨ 模型（Model）：模型包含完成任务所需要的所有的行为和数据。在数据持久层中，模型即为值对象以及数据访问对象。</p>
<p>¨ 视图（View）：数据持久层中，视图就是持久层同其它层进行数据交换的值对象（Transfer Object）和视图助手对象。</p>
<p>¨ 控制器（Controller）：持久层所需的控制相对简单，因此集成到了控制代理中。</p>
<p>持久层整体采用MVC模式，使得整个数据持久层的实现部分与项目的业务逻辑部分隔离开来，能够实现对接口作大的修改而不需要对相应的模型进行修改。另外，持久层某子系统发生变化时，不会影响到其它子系统。有利于提高系统的稳定性、可维护性。</p>
<p>2.2 值对象模式（Value Object Pattern）</p>
<p>值对象用来封装业务对象。相应的方法调用是设置（getter）和检索（setter）值对象。它是任意的可串行化的Java对象，当客户端Bean请求业务数据时，该Bean可以构造值对象，用属性值来填充，并按照值把它传递给客户端。</p>
<p>在笔者开发项目的数据持久层体系结构中，值对象主要应用在子系统间传递、交换数据（Transfer Object）和映射数据表两个方面（Persistent Object）。</p>
<p>在各子系统间进行数据传递和数据交换时，使用值对象模式能够最大化地降低系统间数据传递的开销。在这种策略下传递的是对象而不再是一个个的有意义的数据，使得系统在进行扩充、修改时，各子系统间数据传递部分不会受到影响，因为各子系统仅需要关心是否有值对象被传递，而并不去关心传递的到底是什么数据。</p>
<p>在映射数据库表时，值对象类及其子类所构成的树形结构被用来映射一个数据库表，该继承树通过XML配置文件对应数据库中的单个表，这使得最底层的关系型的数据库表结构能够面向对象模型所隐藏，另外，由于面向对象设计方法中类的可继承性，采用继承树对应一个表的策略使得该映射策略极易扩展，并且能够将一个复杂的数据表转化成若干简单的值对象来表示，提高了系统的可维护性和可修改性。</p>
<p>2.3 数据访问对象（DAO）</p>
<p>根据数据源不同，数据访问也不同。根据存储的类型(关系数据库、面向对象数据库等)和供应商不同，持久性存储(比如数据库)的访问差别也很大。当业务组件或表示组件需要访问某数据源时，它们可以使用合适的API来获得连接性，以及操作该数据源。但是在这些组件中包含连接性和数据访问代码会引入这些组件及数据源实现之间的紧密耦合。组件中这类代码依赖性使应用程序</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/j2ee%e9%a1%b9%e7%9b%ae%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e6%8c%81%e4%b9%85%e5%b1%82%e8%ae%be%e8%ae%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>J2EE</title>
		<link>http://edwardpku.com/blog/2008/05/j2ee/</link>
		<comments>http://edwardpku.com/blog/2008/05/j2ee/#comments</comments>
		<pubDate>Mon, 29 Nov 1999 16:00:00 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://edwardpku.com/blog/2008/05/j2ee/</guid>
		<description><![CDATA[J2EE学习者越来越多，J2EE本身技术不断在发展，涌现出各种概念，本文章试图从一种容易理解的角度对这些概念向初学者进行解释，以便掌握学习J2EE学习方向。
 首先我们需要知道Java和J2EE是两个不同概念，Java不只是指一种语言，已经代表与微软不同的另外一个巨大阵营，所以Java有时是指一种软件系统的流派，当然目前主要是.NET和Java两大主流体系。
 J2EE可以说指Java在数据库信息系统上实现，数据库信息系统从早期的dBase、到Delphi/VB等C/S结构，发展到B/S（Browser浏览器/Server服务器）结构，而J2EE主要是指B/S结构的实现。
 J2EE又是一种框架和标准，框架类似API、库的概念，但是要超出它们。如果需要详细了解框架，可先从设计模式开始学习。
 J2EE是一个虚的大的概念，J2EE标准主要有三种子技术标准：WEB技术、EJB技术和JMS，谈到J2EE应该说最终要落实到这三个子概念上。
 这三种技术的每个技术在应用时都涉及两个部分：容器部分和应用部分，Web容器也是指Jsp/Servlet容器，你如果要开发一个Web应用，无论是编译或运行，都必须要有Jsp/Servlet库或API支持（除了JDK/J2SE以外）。
 Web技术中除了Jsp/Servlet技术外，还需要JavaBeans或Java Class实现一些功能或者包装携带数据，所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。
 谈到JavaBeans技术，就涉及到组件构件技术（component），这是Java的核心基础部分，很多软件设计概念（设计模式）都是通过JavaBeans实现的。
 JavaBeans不属于J2EE概念范畴中，如果一个JavaBeans对象被Web技术（也就是Jsp/Servlet）调用，那么JavaBeans就运行在J2EE的Web容器中；如果它被EJB调用，它就运行在EJB容器中。
 EJB（企业JavaBeans）是普通JavaBeans的一种提升和规范，因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制，这样能保证企业系统平滑发展，而不是发展到一种规模重新更换一套软件系统。
 至此，JavaBeans组件发展到EJB后，并不是说以前的那种JavaBeans形式就消失了，这就自然形成了两种JavaBeans技术：EJB 和POJO，POJO完全不同于EJB概念，指的是普通JavaBeans，而且这个JavaBeans不依附某种框架，或者干脆可以说：这个 JavaBeans是你为这个应用程序单独开发创建的。
 J2EE应用系统开发工具有很多：如 JBuilder、Eclipse等，这些IDE首先是Java开发工具，也就是说，它们首要基本功能是可以开发出JavaBeans或Java class，但是如果要开发出J2EE系统，就要落实到要么是Web技术或EJB技术，那么就有可能要一些专门模块功能(如eclipse需要 lomboz插件)，最重要的是，因为J2EE系统区分为容器和应用两个部分，所以，在任何开发工具中开发J2EE都需要指定J2EE容器。
 J2EE容器分为WEB容器和EJB容器，Tomcat/Resin 是Web容器；JBoss是EJB容器+Web容器等，其中Web容器直接使用 Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行，而你开发的Web+EJB应用则只可以在JBoss服务器上运行，商业产品 Websphere/Weblogic等和JBoss属于同一种性质。
 J2EE容器也称为J2EE服务器，大部分时它们概念是一致的。
 如果你的J2EE应用系统的数据库连接是通过JNDI获得，也就是说是从容器中获得，那么你的J2EE应用系统基本与数据库无关，如果你在你的J2EE 应用系统耦合了数据库JDBC驱动的配置，那么你的J2EE应用系统就有数据库概念色彩，作为一个成熟需要推广的J2EE应用系统，不推荐和具体数据库耦合，当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。
 衡量J2EE应用系统设计开发水平高低的标准就是：解耦性；你的应用系统各个功能是否能够彻底脱离？是否不相互依赖，也只有这样，才能体现可维护性、可拓展性的软件设计目标。
 为了达到这个目的，诞生各种框架概念，J2EE框架标准将一个系统划分为WEB和EJB主要部分，当然我们有时不是以这个具体技术区分，而是从设计上抽象为表现层、服务层和持久层，这三个层次从一个高度将J2EE分离开来，实现解耦目的。
 因此，我们实际编程中，也要将自己的功能向这三个层次上靠，做到大方向清楚，泾渭分明，但是没有技术上约束限制要做到这点是很不容易的，因此我们还是必须借助J2EE具体技术来实现，这时，你可以使用EJB规范实现服务层和持久层，Web技术实现表现层；
 EJB为什么能将服务层从Jsp/Servlet手中分离出来，因为它对JavaBeans编码有强制的约束，现在有一种对JavaBeans弱约束，使用Ioc模式实现的（当然EJB 3.0也采取这种方式），在Ioc模式诞生前，一般都是通过工厂模式来对JavaBeans约束，形成一个服务层，这也是是Jive这样开源论坛设计原理之一。
 由此，将服务层从表现层中分离出来目前有两种可选架构选择：管理普通JavaBeans（POJO）框架(如Spring、 JdonFramework)以及管理EJB的EJB框架，因为EJB不只是框架，还是标准，而标准可以扩展发展，所以，这两种区别将来是可能模糊，被纳入同一个标准了。
 但是，个人认为：标准制定是为某个目的服务的，总要牺牲一些换取另外一些，所以，这两种架构会长时间并存。
 前面谈了服务层框架，使用服务层框架可以将JavaBeans从Jsp/Servlet中分离出来，而使用表现层框架则可以将Jsp中剩余的 JavaBeans完全分离，这部分JavaBeans主要负责显示相关，一般是通过标签库（taglib）实现，不同框架有不同自己的标签库， Struts是应用比较广泛的一种表现层框架。
 这样，表现层和服务层的分离是通过两种框架达到目的，剩余的就是持久层框架了，通过持久层的框架将数据库存储从服务层中分离出来是其目的，持久层框架有两种方向：直接自己编写JDBC等SQL语句（如iBatis）；使用O/R Mapping技术实现的Hibernate和JDO技术；当然还有EJB中的实体Bean技术。
 持久层框架目前呈现百花齐放，各有优缺点的现状，所以正如表现层框架一样，目前没有一个框架被指定为标准框架，当然，表现层框架现在又出来了一个JSF，它代表的页面组件概念是一个新的发展方向，但是复杂的实现让人有些忘而却步。
 在所有这些J2EE技术中，虽然SUN公司发挥了很大的作用，不过总体来说：网络上有这样一个评价：SUN的理论天下无敌；SUN的产品用起来撞墙；对于初学者，特别是那些试图通过或已经通过SUN认证的初学者，赶快摆脱SUN的阴影，立即开溜，使用开源领域的产品来实现自己的应用系统。
 最后，你的J2EE应用系统如果采取上面提到的表现层、服务层和持久层的框架实现，基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。
 还要注意的是: 开发出一个高质量的J2EE系统还需要正确的业务需求理解，那么域建模提供了一种比较切实可行的正确理解业务需求的方法，相关详细知识可从UML角度结合理解。
 当然，如果你想设计自己的行业框架，那么第一步从设计模式开始吧，因为设计模式提供你一个实现JavaBeans或类之间解耦参考实现方法，当你学会了系统基本单元JavaBean
或类之间解耦时，那么系统模块之间的解耦你就可能掌握，进而你就可以实现行业框架的提炼了，这又是另外一个发展方向了。
 以上理念可以总结为一句话：
J2EE开发三件宝: Domain Model（域建模）、patterns（模式）和framework（框架）。
]]></description>
			<content:encoded><![CDATA[<li>J2EE学习者越来越多，J2EE本身技术不断在发展，涌现出各种概念，本文章试图从一种容易理解的角度对这些概念向初学者进行解释，以便掌握学习J2EE学习方向。</li>
<li> 首先我们需要知道Java和J2EE是两个不同概念，Java不只是指一种语言，已经代表与微软不同的另外一个巨大阵营，所以Java有时是指一种软件系统的流派，当然目前主要是.NET和Java两大主流体系。</li>
<li> J2EE可以说指Java在数据库信息系统上实现，数据库信息系统从早期的dBase、到Delphi/VB等C/S结构，发展到B/S（Browser浏览器/Server服务器）结构，而J2EE主要是指B/S结构的实现。</li>
<li> J2EE又是一种框架和标准，框架类似API、库的概念，但是要超出它们。如果需要详细了解框架，可先从设计模式开始学习。</li>
<li> J2EE是一个虚的大的概念，J2EE标准主要有三种子技术标准：WEB技术、EJB技术和JMS，谈到J2EE应该说最终要落实到这三个子概念上。</li>
<li> 这三种技术的每个技术在应用时都涉及两个部分：容器部分和应用部分，Web容器也是指Jsp/Servlet容器，你如果要开发一个Web应用，无论是编译或运行，都必须要有Jsp/Servlet库或API支持（除了JDK/J2SE以外）。</li>
<li> Web技术中除了Jsp/Servlet技术外，还需要JavaBeans或Java Class实现一些功能或者包装携带数据，所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。</li>
<li> 谈到JavaBeans技术，就涉及到组件构件技术（component），这是Java的核心基础部分，很多软件设计概念（设计模式）都是通过JavaBeans实现的。</li>
<li> JavaBeans不属于J2EE概念范畴中，如果一个JavaBeans对象被Web技术（也就是Jsp/Servlet）调用，那么JavaBeans就运行在J2EE的Web容器中；如果它被EJB调用，它就运行在EJB容器中。</li>
<li> EJB（企业JavaBeans）是普通JavaBeans的一种提升和规范，因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制，这样能保证企业系统平滑发展，而不是发展到一种规模重新更换一套软件系统。</li>
<li> 至此，JavaBeans组件发展到EJB后，并不是说以前的那种JavaBeans形式就消失了，这就自然形成了两种JavaBeans技术：EJB 和POJO，POJO完全不同于EJB概念，指的是普通JavaBeans，而且这个JavaBeans不依附某种框架，或者干脆可以说：这个 JavaBeans是你为这个应用程序单独开发创建的。</li>
<li> J2EE应用系统开发工具有很多：如 JBuilder、Eclipse等，这些IDE首先是Java开发工具，也就是说，它们首要基本功能是可以开发出JavaBeans或Java class，但是如果要开发出J2EE系统，就要落实到要么是Web技术或EJB技术，那么就有可能要一些专门模块功能(如eclipse需要 lomboz插件)，最重要的是，因为J2EE系统区分为容器和应用两个部分，所以，在任何开发工具中开发J2EE都需要指定J2EE容器。</li>
<li> J2EE容器分为WEB容器和EJB容器，Tomcat/Resin 是Web容器；JBoss是EJB容器+Web容器等，其中Web容器直接使用 Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行，而你开发的Web+EJB应用则只可以在JBoss服务器上运行，商业产品 Websphere/Weblogic等和JBoss属于同一种性质。</li>
<li> J2EE容器也称为J2EE服务器，大部分时它们概念是一致的。</li>
<li> 如果你的J2EE应用系统的数据库连接是通过JNDI获得，也就是说是从容器中获得，那么你的J2EE应用系统基本与数据库无关，如果你在你的J2EE 应用系统耦合了数据库JDBC驱动的配置，那么你的J2EE应用系统就有数据库概念色彩，作为一个成熟需要推广的J2EE应用系统，不推荐和具体数据库耦合，当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。</li>
<li> 衡量J2EE应用系统设计开发水平高低的标准就是：解耦性；你的应用系统各个功能是否能够彻底脱离？是否不相互依赖，也只有这样，才能体现可维护性、可拓展性的软件设计目标。</li>
<li> 为了达到这个目的，诞生各种框架概念，J2EE框架标准将一个系统划分为WEB和EJB主要部分，当然我们有时不是以这个具体技术区分，而是从设计上抽象为表现层、服务层和持久层，这三个层次从一个高度将J2EE分离开来，实现解耦目的。</li>
<li> 因此，我们实际编程中，也要将自己的功能向这三个层次上靠，做到大方向清楚，泾渭分明，但是没有技术上约束限制要做到这点是很不容易的，因此我们还是必须借助J2EE具体技术来实现，这时，你可以使用EJB规范实现服务层和持久层，Web技术实现表现层；</li>
<li> EJB为什么能将服务层从Jsp/Servlet手中分离出来，因为它对JavaBeans编码有强制的约束，现在有一种对JavaBeans弱约束，使用Ioc模式实现的（当然EJB 3.0也采取这种方式），在Ioc模式诞生前，一般都是通过工厂模式来对JavaBeans约束，形成一个服务层，这也是是Jive这样开源论坛设计原理之一。</li>
<li> 由此，将服务层从表现层中分离出来目前有两种可选架构选择：管理普通JavaBeans（POJO）框架(如Spring、 JdonFramework)以及管理EJB的EJB框架，因为EJB不只是框架，还是标准，而标准可以扩展发展，所以，这两种区别将来是可能模糊，被纳入同一个标准了。</li>
<li> 但是，个人认为：标准制定是为某个目的服务的，总要牺牲一些换取另外一些，所以，这两种架构会长时间并存。</li>
<li> 前面谈了服务层框架，使用服务层框架可以将JavaBeans从Jsp/Servlet中分离出来，而使用表现层框架则可以将Jsp中剩余的 JavaBeans完全分离，这部分JavaBeans主要负责显示相关，一般是通过标签库（taglib）实现，不同框架有不同自己的标签库， Struts是应用比较广泛的一种表现层框架。</li>
<li> 这样，表现层和服务层的分离是通过两种框架达到目的，剩余的就是持久层框架了，通过持久层的框架将数据库存储从服务层中分离出来是其目的，持久层框架有两种方向：直接自己编写JDBC等SQL语句（如iBatis）；使用O/R Mapping技术实现的Hibernate和JDO技术；当然还有EJB中的实体Bean技术。</li>
<li> 持久层框架目前呈现百花齐放，各有优缺点的现状，所以正如表现层框架一样，目前没有一个框架被指定为标准框架，当然，表现层框架现在又出来了一个JSF，它代表的页面组件概念是一个新的发展方向，但是复杂的实现让人有些忘而却步。</li>
<li> 在所有这些J2EE技术中，虽然SUN公司发挥了很大的作用，不过总体来说：网络上有这样一个评价：SUN的理论天下无敌；SUN的产品用起来撞墙；对于初学者，特别是那些试图通过或已经通过SUN认证的初学者，赶快摆脱SUN的阴影，立即开溜，使用开源领域的产品来实现自己的应用系统。</li>
<li> 最后，你的J2EE应用系统如果采取上面提到的表现层、服务层和持久层的框架实现，基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。</li>
<li> 还要注意的是: 开发出一个高质量的J2EE系统还需要正确的业务需求理解，那么域建模提供了一种比较切实可行的正确理解业务需求的方法，相关详细知识可从UML角度结合理解。</li>
<li> 当然，如果你想设计自己的行业框架，那么第一步从设计模式开始吧，因为设计模式提供你一个实现JavaBeans或类之间解耦参考实现方法，当你学会了系统基本单元JavaBean<br />
或类之间解耦时，那么系统模块之间的解耦你就可能掌握，进而你就可以实现行业框架的提炼了，这又是另外一个发展方向了。</li>
<li> 以上理念可以总结为一句话：</li>
<li>J2EE开发三件宝: Domain Model（域建模）、patterns（模式）和framework（框架）。</li>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/j2ee/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我的第一个JDBC程序</title>
		<link>http://edwardpku.com/blog/2008/05/%e6%88%91%e7%9a%84%e7%ac%ac%e4%b8%80%e4%b8%aajdbc%e7%a8%8b%e5%ba%8f/</link>
		<comments>http://edwardpku.com/blog/2008/05/%e6%88%91%e7%9a%84%e7%ac%ac%e4%b8%80%e4%b8%aajdbc%e7%a8%8b%e5%ba%8f/#comments</comments>
		<pubDate>Mon, 05 May 2008 02:58:59 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=53</guid>
		<description><![CDATA[try { 
            Class.forName(&#8221;com.mysql.jdbc.Driver&#8221;);
            String connectionUrl1 = &#8220;jdbc:mysql://localhost/test?&#8221; +
                                   &#8220;user=root&#38;password=admin&#8221;;
            Connection con = DriverManager.getConnection(connectionUrl1);
            System.out.println(&#8221;I have connect database&#8221;);
            Statement sm=con.createStatement();
             sm.executeUpdate(&#8221;delete from `test`.`test` where id=1&#8243;);
             sm.executeUpdate(&#8221;insert into `test`.`test` values(1,&#8217;Visual J++ Bible&#8217;,38)&#8221;);
            /*sm.executeUpdate(&#8221;insert into test&#8221;+&#8221;values(3,&#8217;java language&#8217;,40)&#8221;);*/
            sm.close();
            con.close();
        } catch (SQLException e) {
            System.out.println(&#8221;SQL Exception: &#8220;+ e.toString());
        } catch (ClassNotFoundException cE) {
            System.out.println(&#8221;Class Not Found Exception: &#8220;+ [...]]]></description>
			<content:encoded><![CDATA[<p>try { <br />
            Class.forName(&#8221;com.mysql.jdbc.Driver&#8221;);<br />
            String connectionUrl1 = &#8220;jdbc:mysql://localhost/test?&#8221; +<br />
                                   &#8220;user=root&amp;password=admin&#8221;;<br />
            Connection con = DriverManager.getConnection(connectionUrl1);<br />
            System.out.println(&#8221;I have connect database&#8221;);<br />
            Statement sm=con.createStatement();<br />
             sm.executeUpdate(&#8221;delete from `test`.`test` where id=1&#8243;);<br />
             sm.executeUpdate(&#8221;insert into `test`.`test` values(1,&#8217;Visual J++ Bible&#8217;,38)&#8221;);<br />
            /*sm.executeUpdate(&#8221;insert into test&#8221;+&#8221;values(3,&#8217;java language&#8217;,40)&#8221;);*/<br />
            sm.close();<br />
            con.close();<br />
        } catch (SQLException e) {<br />
            System.out.println(&#8221;SQL Exception: &#8220;+ e.toString());<br />
        } catch (ClassNotFoundException cE) {<br />
            System.out.println(&#8221;Class Not Found Exception: &#8220;+ cE.toString());<br />
        }</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/%e6%88%91%e7%9a%84%e7%ac%ac%e4%b8%80%e4%b8%aajdbc%e7%a8%8b%e5%ba%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>学习JDBC的使用和MySQL的使用（1）</title>
		<link>http://edwardpku.com/blog/2008/05/%e5%ad%a6%e4%b9%a0jdbc%e7%9a%84%e4%bd%bf%e7%94%a8%e5%92%8cmysql%e7%9a%84%e4%bd%bf%e7%94%a8%ef%bc%881%ef%bc%89/</link>
		<comments>http://edwardpku.com/blog/2008/05/%e5%ad%a6%e4%b9%a0jdbc%e7%9a%84%e4%bd%bf%e7%94%a8%e5%92%8cmysql%e7%9a%84%e4%bd%bf%e7%94%a8%ef%bc%881%ef%bc%89/#comments</comments>
		<pubDate>Sun, 04 May 2008 07:57:12 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=36</guid>
		<description><![CDATA[利用JDBC对MySQL中数据进行操作
Suppose that I have MySQL running remotely on IP:192.168.1.101 with default port (3306) and I want to connect to Northwind database with username is ‘root’ and password is ‘123456’. The connection string will be
String connectionUrl = "jdbc:mysql://192.168.1.101:3306/Northwind?" +             "user=root&#38;password=123456";
Retrieve data from a database
To [...]]]></description>
			<content:encoded><![CDATA[<p>利用JDBC对MySQL中数据进行操作</p>
<p>Suppose that I have MySQL running remotely on IP:192.168.1.101 with default port (3306) and I want to connect to Northwind database with username is ‘root’ and password is ‘123456’. The connection string will be</p>
<pre>String connectionUrl = "jdbc:mysql://192.168.1.101:3306/Northwind?" +             "user=root&amp;password=123456";</pre>
<h5>Retrieve data from a database</h5>
<p>To get some data, I need to execute query on the MySQL and get the result back to me. First, I create stmt (Statement object) and execute query in SQL language. Then I store the result on ResultSet object and iterative show the result on the output window.</p>
<pre>            Statement stmt = null;             ResultSet rs = null;             //SQL query command             String SQL = "SELECT * FROM Products";             stmt = con.createStatement();             rs = stmt.executeQuery(SQL);             while (rs.next()) {                 System.out.println(rs.getString("ProductName") + " : " + rs.getString("UnitPrice"));             }</pre>
<p><strong>Code Explanation:</strong></p>
<p>- Statement objects allow you to execute basic SQL queries and retrieve the results through the ResultSet class.</p>
<p>- In while-loop, iterative in the ResultSet object to show result in console (ProductName and UnitPrice columns in Products table) on output window.</p>
<p>The example result will be similar to below.</p>
<p><em><strong>Note:</strong> I have imported only 4 records from Products table in Northwind database.</em></p>
<p><img title="Select query result" src="http://www.linglom.com/images/howto/netbeans/mysql/part2/1.png" alt="Select query result" width="297" height="172" /></p>
<h5>Update data on database</h5>
<p>To insert, update and delete records on SQL Server, you can use the code from retrieve data from database and simply change SQL command and also modify some code a little bit. On update, I must use executeUpdate(”SQL”) method on statement object instead executeQuery(“SQL”) and the return value will be rows affected instead of a record set.</p>
<p><strong>Example</strong></p>
<p><strong>INSERT command</strong></p>
<pre>            // SQL insert command             String strSQL = "INSERT INTO Products (ProductName,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder," +                             "ReOrderLevel,Discontinued) VALUES ('MyProduct','10 Kg.',1234.0000,100,50,30,0)";             int rowsEffected = stmt.executeUpdate(strSQL);             System.out.println(rowsEffected + " rows effected");</pre>
<p><strong>UPDATE command</strong></p>
<pre>            // SQL update command             String strSQL = "UPDATE Products SET UnitPrice = 900, UnitsInStock = 55, UnitsOnOrder = 5 WHERE ProductName = 'MyProduct'";             int rowsEffected = stmt.executeUpdate(strSQL);             System.out.println(rowsEffected + " rows effected");</pre>
<p><strong>DELETE command</strong></p>
<pre>            // SQL delete command             String strSQL = "DELETE FROM Products WHERE ProductName = 'MyProduct'");             int rowsEffected = stmt.executeUpdate(strSQL);             System.out.println(rowsEffected + " rows effected");</pre>
<h5>Summary</h5>
<p>You can download source code example <a href="http://www.linglom.com/downloads/testMySQL.java">testMySQL.java</a> (Right-click on the link and select Save target As…).</p>
<p>But you have to change connection string to match your environment. The example code will connect to Northwind database and try to retrieve records, insert a new record, update the record and delete the record from Products table. The result is below.</p>
<p><img title="Example query result from MySQL" src="http://www.linglom.com/images/howto/netbeans/mysql/part2/2.png" alt="Example query result from MySQL" width="550" height="249" /></p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/%e5%ad%a6%e4%b9%a0jdbc%e7%9a%84%e4%bd%bf%e7%94%a8%e5%92%8cmysql%e7%9a%84%e4%bd%bf%e7%94%a8%ef%bc%881%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>实现JDBC功能的3种方式</title>
		<link>http://edwardpku.com/blog/2008/05/%e5%ae%9e%e7%8e%b0jdbc%e5%8a%9f%e8%83%bd%e7%9a%843%e7%a7%8d%e6%96%b9%e5%bc%8f/</link>
		<comments>http://edwardpku.com/blog/2008/05/%e5%ae%9e%e7%8e%b0jdbc%e5%8a%9f%e8%83%bd%e7%9a%843%e7%a7%8d%e6%96%b9%e5%bc%8f/#comments</comments>
		<pubDate>Sun, 04 May 2008 05:55:04 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=32</guid>
		<description><![CDATA[直接和数据库进行通信（高效但是复杂）
通过驱动（便利，主流）
通过ODBC与数据源进行通信（遗留系统）
]]></description>
			<content:encoded><![CDATA[<p>直接和数据库进行通信（高效但是复杂）</p>
<p>通过驱动（便利，主流）</p>
<p>通过ODBC与数据源进行通信（遗留系统）</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/%e5%ae%9e%e7%8e%b0jdbc%e5%8a%9f%e8%83%bd%e7%9a%843%e7%a7%8d%e6%96%b9%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java之多线程（2）</title>
		<link>http://edwardpku.com/blog/2008/05/java%e4%b9%8b%e5%a4%9a%e7%ba%bf%e7%a8%8b%ef%bc%882%ef%bc%89/</link>
		<comments>http://edwardpku.com/blog/2008/05/java%e4%b9%8b%e5%a4%9a%e7%ba%bf%e7%a8%8b%ef%bc%882%ef%bc%89/#comments</comments>
		<pubDate>Sun, 04 May 2008 03:36:04 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=30</guid>
		<description><![CDATA[下次课星期六下午2点 3202
进程的调度状态

执行状态
就绪状态
阻塞状态

线程状态

新建状态
可运行状态
正运行状态
结束状态

Java中，显示正在运行的不一定真的在运行。只是虚拟机将运行的命令给了操作系统而已。
相同优先级的两个线程的调度是否能够时间片轮转取决于操作系统。
基于优先级的线程调度时，优先级高的可能会抢占优先级低的程序。
到底如何实现线程的轮换？？
 
线程组！
任何线程都隶属于某个线程组，系统有预设线程组main
守护线程：与普通的线程相比唯一的区别是JVM不将守护线程视为应用程序的核心部分。
 
资源共享与线程同步
如果没有很好的机制，不能保证其安全性。则，我们要实现线程的安全性o
使用Synchronized
其他协调进程的手段：

sleep(); 睡眠状态时，不释放任何锁，可以使用interrupted对睡眠的进程进行打断
Join();  没有搞懂
wait(), notify(); notifyAll();

]]></description>
			<content:encoded><![CDATA[<p>下次课星期六下午2点 3202</p>
<p>进程的调度状态</p>
<ol>
<li>执行状态</li>
<li>就绪状态</li>
<li>阻塞状态</li>
</ol>
<p>线程状态</p>
<ol>
<li>新建状态</li>
<li>可运行状态</li>
<li>正运行状态</li>
<li>结束状态</li>
</ol>
<p>Java中，显示正在运行的不一定真的在运行。只是虚拟机将运行的命令给了操作系统而已。</p>
<p>相同优先级的两个线程的调度是否能够时间片轮转取决于操作系统。</p>
<p>基于优先级的线程调度时，优先级高的可能会抢占优先级低的程序。</p>
<p>到底如何实现线程的轮换？？</p>
<p> </p>
<p>线程组！</p>
<p>任何线程都隶属于某个线程组，系统有预设线程组main</p>
<p>守护线程：与普通的线程相比唯一的区别是JVM不将守护线程视为应用程序的核心部分。</p>
<p> </p>
<p>资源共享与线程同步</p>
<p>如果没有很好的机制，不能保证其安全性。则，我们要实现线程的安全性o</p>
<p>使用Synchronized</p>
<p>其他协调进程的手段：</p>
<ol>
<li>sleep(); 睡眠状态时，不释放任何锁，可以使用interrupted对睡眠的进程进行打断</li>
<li>Join();  没有搞懂</li>
<li>wait(), notify(); notifyAll();</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/java%e4%b9%8b%e5%a4%9a%e7%ba%bf%e7%a8%8b%ef%bc%882%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java之多线程（1）</title>
		<link>http://edwardpku.com/blog/2008/05/java%e4%b9%8b%e5%a4%9a%e7%ba%bf%e7%a8%8b%ef%bc%881%ef%bc%89/</link>
		<comments>http://edwardpku.com/blog/2008/05/java%e4%b9%8b%e5%a4%9a%e7%ba%bf%e7%a8%8b%ef%bc%881%ef%bc%89/#comments</comments>
		<pubDate>Sat, 03 May 2008 15:51:16 +0000</pubDate>
		<dc:creator>Edward</dc:creator>
				<category><![CDATA[后端语言]]></category>

		<guid isPermaLink="false">http://ed.4message.net/?p=29</guid>
		<description><![CDATA[线程是操作调用的基本单位
进程是资源分配的基本单位，拥有独立的地址空间
春游中，以班为单位申请春游资源，每个同学春游回来之后需要给校长做Report，一次仅一个同学和校长做Report。一个班里的同学可以在黑板上写东西做交流。不同班的同学则不行。
 
为什么多线程？？
问题空间需要并发的需求  问题：并发，并行，同步，异步，同步之间的区别？多核就是多个ALU（算数运算单元）
同步 摘一个并扔一个，接一个。双方动作协调  （狗熊掰棒子）  在课程中借用了同步的概念，多个线程共享同步代码段，这个过程称为同步，实际意义是不同的
异步 发者和接者的关系是独立的，狗熊掰了一堆棒子，放在空地上，然后另外一个可以单个或多个一起拿回去。
并发 并发是并行的一种模拟，一般用时间片轮换的方法
并行 两个程序一起进行，在多个CPU的时候能够实现，但是单CPU的时候是不能实现的，只能模拟。利用并发
并行和并发是操作系统层面，和进程线程关系不大。
Everything is object
要创建一个线程就要写一个类实现java.lang.Runnable或继承类java.lang.Thread
线程的不确定执行造成多线程程序很难调试
问题：两个枪手互射，如何设计算法使得更公平。
]]></description>
			<content:encoded><![CDATA[<p>线程是操作调用的基本单位</p>
<p>进程是资源分配的基本单位，拥有独立的地址空间</p>
<p>春游中，以班为单位申请春游资源，每个同学春游回来之后需要给校长做Report，一次仅一个同学和校长做Report。一个班里的同学可以在黑板上写东西做交流。不同班的同学则不行。</p>
<p> </p>
<p>为什么多线程？？</p>
<p>问题空间需要并发的需求  问题：并发，并行，同步，异步，同步之间的区别？多核就是多个ALU（算数运算单元）</p>
<p>同步 摘一个并扔一个，接一个。双方动作协调  （狗熊掰棒子）  在课程中借用了同步的概念，多个线程共享同步代码段，这个过程称为同步，实际意义是不同的</p>
<p>异步 发者和接者的关系是独立的，狗熊掰了一堆棒子，放在空地上，然后另外一个可以单个或多个一起拿回去。</p>
<p>并发 并发是并行的一种模拟，一般用时间片轮换的方法</p>
<p>并行 两个程序一起进行，在多个CPU的时候能够实现，但是单CPU的时候是不能实现的，只能模拟。利用并发</p>
<p>并行和并发是操作系统层面，和进程线程关系不大。</p>
<p>Everything is object</p>
<p>要创建一个线程就要写一个类实现java.lang.Runnable或继承类java.lang.Thread</p>
<p>线程的不确定执行造成多线程程序很难调试</p>
<p>问题：两个枪手互射，如何设计算法使得更公平。</p>
]]></content:encoded>
			<wfw:commentRss>http://edwardpku.com/blog/2008/05/java%e4%b9%8b%e5%a4%9a%e7%ba%bf%e7%a8%8b%ef%bc%881%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
