<?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; Java</title>
	<atom:link href="http://edwardpku.com/blog/category/backend/java/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>再提多态</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>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>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>
	</channel>
</rss>
