﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-金家寶-文章分类-J2EE概念理论性文摘</title><link>http://www.blogjava.net/jiabao/category/20480.html</link><description>机会只会给垂青有准备的人，运气不是每个人都有的 ...</description><language>zh-cn</language><lastBuildDate>Tue, 20 Mar 2007 04:34:58 GMT</lastBuildDate><pubDate>Tue, 20 Mar 2007 04:34:58 GMT</pubDate><ttl>60</ttl><item><title>胖客户端&amp;&amp;瘦客户端&amp;&amp;哑终端</title><link>http://www.blogjava.net/jiabao/articles/104851.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Mon, 19 Mar 2007 17:38:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/104851.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/104851.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/104851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/104851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/104851.html</trackback:ping><description><![CDATA[
		<p>这个主要不是根据服务器和客户机的处理能力来分的，而是根据实际应用的分布来划分的。 <br />如果你要实现的功能大部分在服务器上完成，客户机上很少，则是胖服务器／瘦客户机。 <br />当然，既然大部分功能都在服务器上完成，服务器的处理能力就必须强，相应的，客户机的处理能力就没有必要那么强。 <br /><br />这也是现在的发展潮流，服务器来完成信息的存储和处理，客户机只是一个交互的工具。</p>
		<p>从网络的方面来说，如果服务器的功能较弱而工作站的功能较强，则称胖客户瘦服务，反之亦然。</p>
		<p>Fat client:<br />In a client/server architecture, a client that performs t<br />he bulk of the data processing operations. The data itself is stored on the server. See thin client for contrast. <br />Although the term usually refers to software, it can also apply to a network computer that has relatively strong processing abilities<br /><br />Thin client:<br />(thin klī´&amp;nt) In client/server applications, a client designed to be especially small so that the bulk of the data processing occurs on the server. <br />Although the term thin client usually refers to software, it is increasingly used for computers, such as network computers and Net PCs, that are designed to serve as the clients for client/server architectures. A thin client is a network computer without a hard disk drive, whereas a fat client includes a disk drive</p>
		<div style="font-size: 12px;">哑终端：就是一个屏幕，一个数据接受设备，从前置机上接受屏幕？直接对前置机的数据库进行操作。</div>
		<div style="font-size: 12px;">
				<h3>
						<font color="#990000">Dumb terminal（哑终端）</font>
				</h3>
				<p>一种不含内部微处理器的终端。典型的哑终端只能显示字符及数字和响应简单的控制码。 </p>
		</div>
		<div style="font-size: 12px;">===========================================================================</div>
		<div style="font-size: 12px;">
				<p>超级终端是一种应用程序，可通过调制解调器、虚拟数据线或以太网连接，连接到其他计算机、远程登录站点<br />超级终端是一个通用的串行交互软件，很多嵌入式应用的系统有与之交换的相应程序，通过这些程序，可以通过超级终端与嵌入式系统交互，使超级终端成为嵌入式系统的“显示器”。<br /><br />一、超级终端的原理<br /><br />超级终端的原理并不复杂，它是将用户输入随时发向串口（采用TCP协议时是发往网口，这里只说串口的情况），但并不显示输入。它显示的是从串口接收到的字符。所以，嵌入式系统的相应程序应该完成的任务便是：<br /><br />1、将自己的启动信息、过程信息主动发到运行有超级终端的主机；<br /><br />2、将接收到的字符返回到主机，同时发送需要显示的字符（如命令的响应等）到主机。</p>
		</div>
<img src ="http://www.blogjava.net/jiabao/aggbug/104851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-20 01:38 <a href="http://www.blogjava.net/jiabao/articles/104851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PO&amp;&amp;POJO</title><link>http://www.blogjava.net/jiabao/articles/104850.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Mon, 19 Mar 2007 17:29:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/104850.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/104850.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/104850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/104850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/104850.html</trackback:ping><description><![CDATA[
		<table style="table-layout: fixed;" border="0" cellpadding="0" cellspacing="0" width="90%">
				<tbody>
						<tr>
								<td class="oblog_t_4">
										<span class="style1">
										</span>
										<br />
								</td>
						</tr>
						<tr>
								<td>
										<table border="0" cellpadding="0" cellspacing="0" width="100%">
												<tbody>
														<tr>
																<td>
																		<div align="right">
																				<span class="oblog_text">0</span>
																		</div>
																</td>
														</tr>
												</tbody>
										</table>
										<span class="oblog_text">
												<br />
												<a>　 
</a>
												<p>
														<a>POJO = pure old java object or plain ordinary java object or what ever.</a>
												</p>
												<p>
														<a>PO = persisent object 持久对象</a>
												</p>
												<p>
														<a>就是说在一些Object/Relation Mapping工具中，能够做到维护数据库表记录的persisent object完全是一个符合Java 
Bean规范的纯Java对象，没有增加别的属性和方法。全都是这样子的：</a>
												</p>
												<pre class="code">
														<a>
																<font style="background-color: rgb(211, 211, 211);">public class User { <br />  private long id; <br />  private String name;<br />  public void setId(long id) {<br /> this.id = id;<br />}  <br />public void setName(String name) {<br />this.name=name;<br />} <br /> public long getId() {<br /> return id;<br />}  <br />public String getName() { <br />return name;<br />}<br />}</font>
																<br />
														</a>
												</pre>
												<hr />
												<p>
														<a>首先要区别持久对象和POJO。</a>
												</p>
												<p>
														<a>持久对象实际上必须对应数据库中的entity，所以和POJO有所区别。比如说POJO是由new创建，由GC回收。但是持久对象是insert数据库创建，由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。另外持久对象往往只能存在一个数据库Connection之中，Connnection关闭以后，持久对象就不存在了，而POJO只要不被GC回收，总是存在的。</a>
												</p>
												<p>
														<a>由于存在诸多差别，因此持久对象PO(Persistent 
Object)在代码上肯定和POJO不同，起码PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。而ORM追求的目标就是要PO在使用上尽量和POJO一致，对于程序员来说，他们可以把PO当做POJO来用，而感觉不到PO的存在。</a>
												</p>
												<p>
														<a>JDO的实现方法是这样的：</a>
												</p>
												<p>
														<a>1、编写POJO</a>
												</p>
												<p>
														<a>2、编译POJO</a>
												</p>
												<p>
														<a>3、使用JDO的一个专门工具，叫做Enhancer，一般是一个命令行程序，手工运行，或者在ant脚本里面运行，对POJO的class文件处理一下，把POJO替换成同名的PO。</a>
												</p>
												<p>
														<a>4、在运行期运行的实际上是PO，而不是POJO。</a>
												</p>
												<p>
														<a>该方法有点类似于JSP，JSP也是在编译期被转换成Servlet来运行的，在运行期实际上运行的是Servlet，而不是JSP。</a>
												</p>
												<p>
														<a>Hibernate的实现方法比较先进：</a>
												</p>
												<p>
														<a>1、编写POJO</a>
												</p>
												<p>
														<a>2、编译POJO</a>
												</p>
												<p>
														<a>3、直接运行，在运行期，由Hibernate的CGLIB动态把POJO转换为PO。</a>
												</p>
												<p>
														<a>由此可以看出Hibernate是在运行期把POJO的字节码转换为PO的，而JDO是在编译期转换的。一般认为JDO的方式效率会稍高，毕竟是编译期转换嘛。但是Hibernate的作者Gavin 
King说CGLIB的效率非常之高，运行期的PO的字节码生成速度非常之快，效率损失几乎可以忽略不计。</a>
												</p>
												<p>
														<a>实际上运行期生成PO的好处非常大，这样对于程序员来说，是无法接触到PO的，PO对他们来说完全透明。可以更加自由的以POJO的概念操纵PO。另外由于是运行期生成PO，所以可以支持增量编译，增量调试。而JDO则无法做到这一点。实际上已经有很多人在抱怨JDO的编译期Enhancer问题了，而据说JBossDO将采用运行期生成PO字节码，而不采用编译期生成PO字节码。</a>
												</p>
												<p>
														<a>另外一个相关的问题是，不同的JDO产品的Enhancer生成的PO字节码可能会有所不同，可能会影响在JDO产品之间的可移植性，这一点有点类似EJB的可移植性难题。</a>
												</p>
												<hr />
												<p>
														<a>由这个问题另外引出一个JDO的缺陷。</a>
												</p>
												<p>
														<a>由于JDO的PO状态管理方式，所以当你在程序里面get/set的时候，实际上不是从PO的实例中取values，而是从JDO </a>
														<a href="http://www.hibernate.org.cn/index.php?cmd=newdoc&amp;newdocname=State+Manager&amp;node=48&amp;refnode=84">
																<font color="#006699">State Manager</font>
														</a>
														<a>
																<strong class="missing">
																		<font color="#880000">?</font>
																</strong>中取出来，所以一旦PM关闭，PO就不能进行存取了。</a>
												</p>
												<p>
														<a>在JDO中，也可以通过一些办法使得PO可以在PM外面使用，比如说定义PO是transient的，但是该PO在PM关闭后就没有PO 
identity了。无法进行跨PM的状态管理。</a>
												</p>
												<p>
														<a>而Hibernate是从PO实例中取values的，所以即使Session关闭，也一样可以get/set，可以进行跨Session的状态管理。</a>
												</p>
												<p>
														<a>在分多层的应用中，由于持久层和业务层和web层都是分开的，此时Hibernate的PO完全可以当做一个POJO来用，也就是当做一个VO，在各层间自由传递，而不用去管Session是开还是关。如果你把这个POJO序列化的话，甚至可以用在分布式环境中。（不适合lazy 
loading的情况）</a>
												</p>
												<p>
														<a>但是JDO的PO在PM关闭后就不能再用了，所以必须在PM关闭前把PO拷贝一份VO，把VO传递给业务层和web层使用。在非分布式环境中，也可以使用ThreadLocal模式确保PM始终是打开状态，来避免每次必须进行PO到VO的拷贝操作。但是不管怎么说，这总是权宜之计，不如Hibernate的功能强。</a>
												</p>
												<br />
										</span>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jiabao/aggbug/104850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-20 01:29 <a href="http://www.blogjava.net/jiabao/articles/104850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA常见错误处理</title><link>http://www.blogjava.net/jiabao/articles/104842.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Mon, 19 Mar 2007 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/104842.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/104842.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/104842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/104842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/104842.html</trackback:ping><description><![CDATA[
		<div class="sysBr500 text" align="left">
				<div>
						<font color="#808080" size="2">异常<br />
 javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login （/Login是你的action名字）   <br />
 <br />
可能原因<br />
 action没有再struts-config.xml 中定义，或没有找到匹配的action，例如在JSP文件中使用 &lt;html:form action="Login.do".将表单提交给</font>
				</div>
				<div>
						<font color="#808080" size="2">Login.do处理，如果出现上述异常，请查看struts-config.xml中的定义部分，有时可能是打错了字符或者是某些不符合规则，可以使用struts</font>
				</div>
				<div>
						<font color="#808080" size="2">console工具来检查。<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 org.apache.jasper.JasperException: Cannot retrieve definition for form bean null<br />
 <br />
可能原因      <br />
       <br />
 这个异常是因为Struts根据struts-config.xml中的mapping没有找到action期望的form bean。大部分的情况可能是因为在form-bean中设置的</font>
				</div>
				<div>
						<font color="#808080" size="2">name属性和action中设置的name属性不匹配所致。换句话说，action和form都应该各自有一个name属性，并且要精确匹配，包括大小写。这个</font>
				</div>
				<div>
						<font color="#808080" size="2">错误当没有name属性和action关联时也会发生，如果没有在action中指定name属性，那么就没有name属性和action相关联。当然当action制作</font>
				</div>
				<div>
						<font color="#808080" size="2">某些控制时，譬如根据参数值跳转到相应的jsp页面，而不是处理表单数据，这是就不用name属性，这也是action的使用方法之一。<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 No action instance for path /xxxx could be created<br />
 <br />
可能原因<br />
 特别提示：因为有很多中情况会导致这个错误的发生，所以推荐大家调高你的web服务器的日志/调试级别，这样可以从更多的信息中看到潜在</font>
				</div>
				<div>
						<font color="#808080" size="2">的、在试图创建action类时发生的错误，这个action类你已经在struts-config.xml中设置了关联（即添加了&lt;action&gt;标签）。<br />
 <br />
在struts-config.xml中通过action标签的class属性指定的action类不能被找到有很多种原因，例如：</font>
				</div>
				<div>
						<font color="#808080" size="2">定位编译后的.class文件失败。Failure to place compiled .class file for the action in the classpath (在web开发中，class的的位置</font>
				</div>
				<div>
						<font color="#808080" size="2">在r WEB-INF/classes，所以你的action class必须要在这个目录下。例如你的action类位于WEB-INF/classes/action/Login.class,那么在</font>
				</div>
				<div>
						<font color="#808080" size="2">struts-config.xml中设置action的属性type时就是action.Login).<br />
拼写错误，这个也时有发生，并且不易找到，特别注意第一个字母的大小写和包的名称。 <br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN<br />
 <br />
可能原因<br />
 没有位form bean中的某个变量定义getter 方法<br />
 <br />
这个错误主要发生在表单提交的FormBean中，用struts标记&lt;html:text property=”username”&gt;时，在FormBean中必须有一个getUsername()</font>
				</div>
				<div>
						<font color="#808080" size="2">方法。注意字母“U”。<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm<br />
 <br />
可能原因<br />
 这个错误主要发生在在classpath中找不到相应的Java .class文件。如果这个错误发生在web应用程序的运行时，主要是因为指定的class文件</font>
				</div>
				<div>
						<font color="#808080" size="2">不在web server的classpath中（/WEB-INF/classes 和 /WEB-INF/lib）。</font>
				</div>
				<div>
						<font color="#808080" size="2">在上面的错误中，原因是找不到ActionForm类。<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: {1}<br />
 <br />
可能原因<br />
 Instantiating Struts-provided ActionForm class directly instead of instantiating a class derived off ActionForm. This might</font>
				</div>
				<div>
						<font color="#808080" size="2">occur implicitly if you specify that a form-bean is this Struts ActionForm class rather than specifying a child of this class</font>
				</div>
				<div>
						<font color="#808080" size="2">for the form-bean.<br />
 <br />
Not associating an ActionForm-descended class with an action can also lead to this error.<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection<br />
 <br />
可能原因<br />
 不是标识Struts actionServlet的&lt;servlet&gt;标记就是映射.do扩展名的&lt;sevlet-mapping&gt;标记或者两者都没有在web.xml中声明。<br />
 <br />
在struts-config.xml中的打字或者拼写错误也可导致这个异常的发生。例如缺少一个标记的关闭符号/&gt;。最好使用struts console工具检查一</font>
				</div>
				<div>
						<font color="#808080" size="2">下。<br />
 <br />
另外，load-on-startup必须在web.xml中声明，这要么是一个空标记，要么指定一个数值，这个数值用来表servlet运行的优先级，数值越大优</font>
				</div>
				<div>
						<font color="#808080" size="2">先级越低。<br />
 <br />
还有一个和使用load-on-startup有关的是使用Struts预编译JSP文件时也可能导致这个异常。<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223)<br />
 <br />
可能原因<br />
 在struts-config.xml中的forward元素缺少path属性。例如应该是如下形式：<br />
&lt;forward name="userhome" path="/user/userhome.jsp"/&gt;<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope<br />
 <br />
 <br />
  <br />
 <br />
Probable Causes<br />
 试图在Struts的form标记外使用form的子元素。这常常发生在你在&lt;/html:form&gt;后面使用Struts的html标记。</font>
				</div>
				<div>
						<font color="#808080" size="2">另外要注意可能你不经意使用的无主体的标记，如&lt;html:form … /&gt;，这样web 服务器解析时就当作一个无主体的标记，随后使用的所有</font>
				</div>
				<div>
						<font color="#808080" size="2">&lt;html&gt;标记都被认为是在这个标记之外的，如又使用了&lt;html:text property=”id”&gt;</font>
				</div>
				<div>
						<font color="#808080" size="2">还有就是在使用taglib引入HTML标记库时，你使用的prefix的值不是html。<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 javax.servlet.jsp.JspException: Missing message for key xx.xx.xx<br />
 <br />
Probable Causes<br />
 这个key的值对没有在资源文件ApplicationResources.properties中定义。如果你使用eclipse时经常碰到这样的情况，当项目重新编译时，</font>
				</div>
				<div>
						<font color="#808080" size="2">eclipse会自动将classes目录下的资源文件删除。<br />
 <br />
资源文件ApplicationResources.properties 不在classpath中应将资源文件放到 WEB-INF/classes 目录下，当然要在struts-config.xml中</font>
				</div>
				<div>
						<font color="#808080" size="2">定义)<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 Cannot find message resources under key org.apache.struts.action.MESSAGE<br />
 <br />
可能原因<br />
 很显然，这个错误是发生在使用资源文件时，而Struts没有找到资源文件。<br />
 <br />
Implicitly trying to use message resources that are not available (such as using empty html:options tag instead of specifying</font>
				</div>
				<div>
						<font color="#808080" size="2">the options in its body -- this assumes options are specified in ApplicationResources.properties file)<br />
 <br />
XML parser issues -- too many, too few, incorrect/incompatible versions<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 Strange and seemingly random characters in HTML and on screen, but not in original JSP or servlet.<br />
 <br />
可能原因<br />
 混和使用Struts的html:form标记和标准的HTML标记不正确。<br />
 <br />
使用的编码样式在本页中不支持。<br />
-----------------------------------------------------------------------------------------------------------------<br />
异常<br />
 "Document contained no data" in Netscape<br />
 <br />
No data rendered (completely empty) page in Microsoft Internet Explorer<br />
 <br />
可能原因<br />
 使用一个Action的派生类而没有实现perform()方法或execute()方法。在Struts1.0中实现的是perform()方法，在Struts1.1中实现的是</font>
				</div>
				<div>
						<font color="#808080" size="2">execute()方法，但Struts1.1向后兼容perform()方法。</font>
				</div>
				<div>
						<font color="#808080" size="2">但你使用Struts1.1创建一个Action的派生类，并且实现了execute()方法，而你在Struts1.0中运行的话，就会得到"Document contained no</font>
				</div>
				<div>
						<font color="#808080" size="2">data" error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.”的</font>
				</div>
				<div>
						<font color="#808080" size="2">错误信息。<br />
 <br />
---------------------------------------------------------------------------------------------------------------------------<br />
异常<br />
ServletException: BeanUtils.populate<br />
解决方案<br />
在用Struts上传文件时,遇到了javax.servlet.ServletException: BeanUtils.populate异常。<br />
我的ActionServlet并没有用到BeanUtils这些工具类。后来仔细检查代码发现是在jsp文件里的form忘了加enctype=&amp;quot;multipart/form-</font>
				</div>
				<div>
						<font color="#808080" size="2">data&amp;quot; 了。所以写程序遇到错误或异常应该从多方面考虑问题存在的可能性，想到系统提示信息以外的东西。<br />
----------------------------------------------------------------------------------------------------------------------------<br />
1. 定义Action后, 如果指定了name, 那么必须要定义一个与它同名的FormBean才能进行form映射.</font>
				</div>
				<div>
						<font color="#808080" size="2">2. 如果定义Action后, 提交页面时出现 "No input attribute for mapping path..." 错误, 则需要在其input属性中定义转向的页面.</font>
				</div>
				<div>
						<font color="#808080" size="2">3. 如果插入新的数据时出现 "Batch update row count wrong:..." 错误, 则说明XXX.hbm.xml中指定的key的类型为原始类型(int, long),</font>
				</div>
				<div>
						<font color="#808080" size="2">因为这种类型会自动分配值, 而这个值往往会让系统认为已经存在该记录, 正确的方法是使用java.lang.Integer或java.lang.Long对象.</font>
				</div>
				<div>
						<font color="#808080" size="2">4. 如果插入数据时出现 "argument type mismatch" 错误, 可能是你使用了Date等特殊对象, 因为struts不能自动从String型转换成Date型,</font>
				</div>
				<div>
						<font color="#808080" size="2">所以, 你需要在Action中手动把String型转换成Date型.</font>
				</div>
				<div>
						<font color="#808080" size="2">5. Hibernate中, Query的iterator()比list()方法快很多.</font>
				</div>
				<div>
						<font color="#808080" size="2">6. 如果出现 "equal symbol expected" 错误, 说明你的strtus标签中包含另一个标签或者变量, 例如:<br />
&lt;html:select property="test" onchange="&lt;%=test%&gt;"/&gt;<br />
或者<br />
&lt;html:hidden property="test" value="&lt;bean:write name="t" property="p"/&gt;"/&gt;<br />
这样的情况... <br />
---------------------------------------------------------------------------------------------------------------------------<br />
错误：</font>
				</div>
				<div>
						<font color="#808080" size="2">Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update</font>
				</div>
				<div>
						<font color="#808080" size="2">原因与解决：</font>
				</div>
				<div>
						<font color="#808080" size="2">    因为Hibernate Tools（或者Eclipse本身的Database Explorer）生成*.hbn.xml工具中包含有catalog="***"（*表示数据库名称）这样的</font>
				</div>
				<div>
						<font color="#808080" size="2">属性,将该属性删除就可以了<br />
---------------------------------------------------------------------------------------------------------------------------<br />
错误：</font>
				</div>
				<div>
						<font color="#808080" size="2">org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)</font>
				</div>
				<div>
						<font color="#808080" size="2">
								<br />
原因与解决：<br />
方法1 删除Set方的cascade<br />
方法2 解决关联关系后，再删除<br />
方法3 在many-to-one方增加cascade 但值不能是none<br />
最后一招：<br />
检查一下hashCode equals是否使用了id作为唯一标示的选项了；我用uuid.hex时是没有问题的；但是用了native，就不行了，怎么办？删除啊</font>
				</div>
				<div>
						<font color="#808080" size="2">！<br />
----------------------------------------------------------------------------------------------------------------------------<br />
问题：</font>
				</div>
				<div>
						<font color="#808080" size="2">今天用Tomcat 5.5.12，发现原来很好用的系统不能用了，反复测试发现页面中不能包含 taglib，否则会出现以下提示：</font>
				</div>
				<div>
						<font color="#808080" size="2">HTTP Status 500 -type Exception report</font>
				</div>
				<div>
						<font color="#808080" size="2">Message </font>
				</div>
				<div>
						<font color="#808080" size="2">description The server encountered an internal error () that prevented it from fulfilling this request.</font>
				</div>
				<div>
						<font color="#808080" size="2">exception</font>
				</div>
				<div>
						<font color="#808080" size="2">org.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD "META-INF/tlds/struts-bean.tld" from JAR file</font>
				</div>
				<div>
						<font color="#808080" size="2">"file:*****/WEB-INF/lib/struts.jar":</font>
				</div>
				<div>
						<font color="#808080" size="2">原因：</font>
				</div>
				<div>
						<font color="#808080" size="2">更新了工程用的lib文件夹下的jar，发布时也发布了servlet.jar和jsp-api.jar。</font>
				</div>
				<div>
						<font color="#808080" size="2">解决：</font>
				</div>
				<div>
						<font color="#808080" size="2">把jsp-api.jar删除就解决这个问题了。</font>
				</div>
				<div>
						<font color="#808080" size="2">-----------------------------------------------------------------------------------------------------------------------------<br />
错误： java.lang.NullPointerException<br />
原因： 发现 dao 实例、 manage 实例等需要注入的东西没有被注入（俗称空指针异常）</font>
				</div>
				<div>
						<font color="#808080" size="2">解决：这个时候，你应该查看日志文件；默认是应用服务器的 log 文件，比如 Tomcat 就是 [Tomcat 安装目录 ]/logs ；你会发现提示你：</font>
				</div>
				<div>
						<font color="#808080" size="2">可能是：</font>
				</div>
				<div>
						<font color="#808080" size="2">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sf' defined in ServletContext</font>
				</div>
				<div>
						<font color="#808080" size="2">resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is</font>
				</div>
				<div>
						<font color="#808080" size="2">org.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml</font>
				</div>
				<div>
						<font color="#808080" size="2">org.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml</font>
				</div>
				<div>
						<font color="#808080" size="2">……………………….</font>
				</div>
				<div>
						<font color="#808080" size="2">Caused by: java.io.FileNotFoundException: src\hibernate.cfg.xml</font>
				</div>
				<div>
						<font color="#808080" size="2">可能是：</font>
				</div>
				<div>
						<font color="#808080" size="2">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in</font>
				</div>
				<div>
						<font color="#808080" size="2">ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is</font>
				</div>
				<div>
						<font color="#808080" size="2">org.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found</font>
				</div>
				<div>
						<font color="#808080" size="2">org.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found</font>
				</div>
				<div>
						<font color="#808080" size="2">然后你就知道原因是因为配置文件的解析出了错误，这个通过 Web 页面是看不出来的。</font>
				</div>
				<div>
						<font color="#808080" size="2">更多的是持久化影射文件出的错误；导致了没有被解析；当然你需要的功能就无法使用了。<br />
----------------------------------------------------------------------------------------------------------------------------<br />
错误：</font>
				</div>
				<div>
						<font color="#808080" size="2">StandardWrapperValve[action]: Servlet.service() for servlet action threw exception<br />
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /settlementTypeManage</font>
				</div>
				<div>
						<font color="#808080" size="2">
								<br />
或者：</font>
				</div>
				<div>
						<font color="#808080" size="2">    type Status report</font>
				</div>
				<div>
						<font color="#808080" size="2">    message Servlet action is not available</font>
				</div>
				<div>
						<font color="#808080" size="2">    description The requested resource (Servlet action is not available) is not available.</font>
				</div>
				<div>
						<font color="#808080" size="2">
								<br />
原因： 同 上<br />
----------------------------------------------------------------------------------------------------------------------------<br />
 错误</font>
				</div>
				<div>
						<font color="#808080" size="2">StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception</font>
				</div>
				<div>
						<font color="#808080" size="2">java.lang.ClassNotFoundException: org.apache.struts.taglib.bean.CookieTei</font>
				</div>
				<div>
						<font color="#808080" size="2">界面错误具体描述：<br />
org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei</font>
				</div>
				<div>
						<font color="#808080" size="2"> </font>
				</div>
				<div>
						<font color="#808080" size="2">
								<br />
    原因与解决：</font>
				</div>
				<div>
						<font color="#808080" size="2">  &lt;方案一&gt;你的“html:”开头的标签没有放在一个&lt;html:form&gt;中</font>
				</div>
				<div>
						<font color="#808080" size="2">     &lt;方案二&gt;重新启动你的应用服务器，自动就没有这个问题了</font>
				</div>
				<div>
						<font color="#808080" size="2">-----------------------------------------------------------</font>
				</div>
				<div>
						<font color="#808080" size="2">
								<br />
						</font>
				</div>
		</div>
<img src ="http://www.blogjava.net/jiabao/aggbug/104842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-19 23:14 <a href="http://www.blogjava.net/jiabao/articles/104842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java企业系统架构选择考量</title><link>http://www.blogjava.net/jiabao/articles/104722.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Mon, 19 Mar 2007 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/104722.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/104722.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/104722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/104722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/104722.html</trackback:ping><description><![CDATA[
		<h3 align="center">
				<a href="http://www.jdon.com/aboutme.htm">板桥里人</a> http://www.jdon.com 2005/09/26</h3>
		<p>　　现在Java领域各种技术百花齐放，名目繁多，如何根据自己的需求选择这些框架呢？特别对于初学者，在学习选择方向上也非常迷茫，如何有针对性的根据自己项目特点进行学习就变的更加重要。</p>
		<p>　　下面我们从一个发展角度来对J2EE/Java EE的这些框架诞生进行一番考量，可能对我们的选择有很大帮助。</p>
		<p>　　首先我们需要明白一个<a href="http://www.jdon.com/idea/j2eebasic.htm" target="_blank">高质量的J2EE系统是什么样子</a>？高质量的J2EE/Java EE系统标准实际就是OO设计的标准，松耦合是OO设计的主要追求目标之一，那么无疑解耦性成为衡量J2EE/JEE质量的首要标准。实际选择中，还需要兼顾可伸缩性/性能/开发效率等方面综合考虑。</p>
		<p>　　J2EE/Java EE号称多层结构，为什么多层比两层好？因为多层结构解耦性好，带来维护拓展方便灵活。</p>
		<p>　　典型的J2EE/Java EE至少划分三个层次：表现层/业务逻辑组件层/持久层。</p>
		<p>　　如图，表现层英文是Presentation Layer，是实现显示功能的，这部分一般使用B/S结构来完成，当然你也可以使用专门远程客户端来实现;</p>
		<p>　　业务逻辑层因为是由大量组件(Components)组成的，也可称为组件层，组件从不同角度又可分为各种类型，然后又有不同的流派，目前占主要位置的是Model+Service，模型加服务，所以这一层又称为业务服务层Business Service；也有称为Model业务层；</p>
		<p>　　持久层是负责对象持久化也就是数据库操作的层次,英文Persistence Layer。 </p>
		<p align="center">
				<img height="406" src="http://www.jdon.com/jdonframework/images/architecture.jpg" width="500" />
		</p>
		<p>　　SUN伙伴们推出J2EE标准时，分别对这三个层次规定了标准实现，表现层使用Jsp/Servlet技术；业务组件层使用EJB的会话Bean；持久层使用实体Bean。同时，标准将业务层和持久层在物理上组成一个新的容器EJB容器，与表现层技术完全一样的容器，这样，J2EE技术被细化为Web和EJB，物理上有Web容器和Web应用程序；以及EJB容器和EJB应用程序。</p>
		<p>　　当然，J2EE/JEE的发展不止这些，这三个层次技术分别独立发展，高歌猛进，下面分别单独陈述，当你了解某种框架技术为什么诞生时，你可能就知道你该在什么情况下选择它们了，工具总是因目的而生！</p>
		<p align="center">
				<strong>表现层框架</strong>
		</p>
		<p>　　J2EE/Java EE虽是多层结构，但它不是一种强制性多层结构，也就是说，你也可能做成传统两层结构，有的初学者直接使用Jsp嵌入Java代码调用数据库这样结构实际不是多层结构，还是以前的两层结构。</p>
		<p>　　在Jsp中嵌入大量代码，一旦报空指针错误就很难找出问题，很多初学者下载JiveJdon 2.5后就经常碰到这个问题，因此大量有关空指针错误问题出现论坛里，为什么他们不能自己解决呢？ 那是因为无法定位错误在Jsp中的位置，Tomcat等服务器只告诉我们错误在index_jsp.java(Jsp的java文件)位置，搞得一些人经常会跑到Tomcat服务器内部翻找Jsp的Java文件，这一过程无比痛苦（为了减少初学者这种痛苦，本站暂停了JiveJdon2.5的下载）。</p>
		<p>　　J2EE/Java EE的发展就是降低这种痛苦，首先想到的方式是：在Jsp调试上下苦功，要求Tomcat等服务器提供详细的错误定位；可惜到Tomcat 5.5我们也没看到这种功能；实际上，根本解决之道就是将Jsp的调试变成java组件的调试。</p>
		<p>　　首先通过MVC模式规定Jsp只能等同于Html，不能包含Java代码，将Jsp和Java代码分离，可是这样分离之后，它们结合起来又麻烦了，所以，虽然你使用MVC模式，但是还是直接基于Jsp技术，带来的是开发效率的降低。</p>
		<p>　　Struts框架解决了这个问题，通过ActionForm可以将Jsp和JavaBeans方便快速地结合起来，但是有人又抱怨Struts的ActionForm限制太死，与Jsp虽能对应，只能一个ActionForm一个表单对应，而不能任意组件JavaBeans都可以和Jsp任意字段对应，这时就出来了组件型框架JSF/Tapestry。</p>
		<p>
				<a href="http://www.jdon.com/artichect/sjt.htm" target="_blank">　　表现层框架Struts/Tapestry/JSF架构比较</a>
		</p>
		<p align="center">
				<strong>业务逻辑层框架</strong>
		</p>
		<p>
				<strong>可伸缩性</strong>
		</p>
		<p>　　因为EJB标准的推出，业务组件层以前基本是EJB的天下，但是EJB功能实在太强大，它考虑了世界顶级大型系统需求，因此免不了显得很复杂，当初，基本上所有的大型企业高端都是选用J2EE，选用J2EE实际是选用EJB。EJB强调的高可伸缩性为大型企业日益发展提供最大的发展空间，不再因为企业快速发展导致整个企业系统结构都要发生根本变化,这是使用EJB的现实优势。</p>
		<p>　　这种企业系统的可伸缩性不是因为EJB存在才显得重要，而是我们企业架构选择需要考量的基本因素。换句话说，无论我们使用EJB与否，这个问题都需要考虑:一台服务器不够用怎么办？如果这台服务器死机会对企业运营带来什么影响？如果每个星期这台服务器停机维护升级会不会对企业带来打击？我的企业系统是不是需要可靠的、几乎不当机的7x24运行？当企业系统面对大量外部访问用户时，一台服务器是否够用？多台服务器联动的需求是否涉及软件技术更换？</p>
		<p>　　在这个现实因素考量后，如果觉得不是很重要，或者说将来一段时间内这些因素无所谓，那么可以不选用EJB了。</p>
		<p>　　为什么有不选用EJB的理由？因为它复杂，学习起来比较困难，EJB帮助我们考虑企业中可能碰到的大部分问题，实际上，有的我们不需要，这也就是为什么说EJB是一个重量级解决方案所在。</p>
		<p>　　与重量级相比的是轻量，业务组件层轻量级解决方案有Spring/HiveMidn/<a href="http://www.jdon.com/jdonframework/" target="_blank">Jdon Framework</a>等，轻量一词曾经因为EJB的出现而变得时髦，给人造成的感觉是：EJB花了老鼻子力气完成的那些功能，使用我轻量级解决方案可以轻而易举也能解决，举重若轻啊，其实这是一种误解。</p>
		<p>　　当曾经以轻量自居的Spring将事务机制纳入自己怀抱中时，它也开始低调轻量了，实际是不轻不重了；当然如果它把分布式计算和事务再次加入时，天平砝码也会沉下去的。</p>
		<p>　　初学者总是愿意使用简单的解决方案，学习使用方便，因此比较喜欢轻量级框架技术，这是正常的，但是在使用轻量级别框架之前必须明白：你的系统将来真的只需要一台服务器即可？你的项目完成期真的非常紧急？</p>
		<p>　　如果只需要一台巨强服务器，就不必选择EJB，EJB是因分布式多服务器而生，对于单台服务器，缺乏本地透明性，也就是说：你无法透过EJB直接和本地JVM或文件系统等打交道，透明性也是衡量一个框架的重要指标。</p>
		<p>　　当然，重量和轻量并不完全对立，EJB3就是为了简化J2EE的使用，使得EJB不只是擅长处理大型企业系统，中小型系统也使用很方便，这实际上也是EJB轻量化的一种努力。<a href="http://www.jdon.com/artichect/JavaEE.htm" target="_blank">什么是Java EE 5</a>？</p>
		<p>　　所以，对于架构选择来说，根本前提是需要明白你的系统现在或将来一段时间（注意需要考虑将来一段时间，不能只看眼前）是中小型系统还是大型系统？</p>
		<p>
				<strong>灵活性/定制性/透明性</strong>
		</p>
		<p>　　当然这个答案有时我们自己也可能很难给出，那么我们还需要从其他角度来考量EJB和非EJB之选，例如笔者曾经经历一个大型实时娱乐平台社区系统，从规模上说肯定是大型系统，设计目标10万人在线，从这个角度非选用EJB不可！</p>
		<p>　　但是，EJB因为还有事务机制，虽然应用程序可以选择失效EJB事务，但是EJB容器设计因为考虑了事务，所以在其内核上总是会显得臃肿，是一种累赘，这也是一种重量表示，不需要的东西存在肯定会影响效率，那么难道我不能根据我的需求，对EJB整体包括EJB容器进行可配置式的切割？也就是说，我上面这个案例只需要EJB的分布式计算功能，其他的功能我都拆除，只剩余我需要的功能能运行就可以了，轻装上阵。</p>
		<p>　　可惜，这种任意切割，应需而定的目标在EJB3标准还没有被重视，所幸的是，Ioc/AOP技术为这种目标实现提供了实现可能，但是，只有Ioc/AOP还是不够，特别是看Ioc的范围，如果你只把应用系统组件纳入Ioc管理时，自由解耦只属于应用系统，我上面案例的目标还是无法达到，当你把框架本身组件也纳入Ioc管理时，任意切割，应需而定的目标才真正实现。</p>
		<p>　　Spring和EJB3属于“只把应用系统组件纳入Ioc管理”，这从JBoss 4.0版本可以看出；那什么框架会把框架本身组件也纳入Ioc管理呢？Apache的<a href="http://jakarta.apache.org/hivemind/" target="_blank">Hivemind</a>和笔者开发的<a href="http://www.jdon.com/jdonframework/" target="_blank">Jdon框架</a>。</p>
		<p>　　什么样的组件可以被纳入Ioc管理呢？POJO组件，POJO这个概念其实当初是针对EJB缺点而推出，EJB要求应用系统的组件必须继承或依赖EJB容器，这样使得调试变的不方便，但是后来，POJO的概念已经不只最初这些概念，POJO代表那种与周围完全脱离关系、自由自在的Object了，如果应用系统的Model或者Service都是POJO，意味着你的应用系统不依赖任何其他系统，解耦性灵活性高。</p>
		<p>　　POJO是因为EJB而提出的，当EJB自己倾向POJO时，大家都在宣称自己是POJO时，POJO概念就没有立足点了，这也是Java领域哭笑不得的现象，但是我个人更倾向把非EJB的JavaBeans组件通称为POJO。</p>
		<p>　　<a href="http://jakarta.apache.org/hivemind/" target="_blank">Hivemind</a>的Ioc依赖注射部分功能和<a href="http://www.jdon.com/jdonframework/" target="_blank">Jdon框架</a>非常类似，当上百个POJO组件配置时，完全不必指定它们之间的依赖关系；你可以将自己应用程序的组件注册到Registry中，这样Hivemind将帮助你启动这些组件，正如你在Jdon框架中将你的组件写入mycontainer.xml中，Jdon框架也将自动启动你这些组件，并解决它们之间的互相调用，包括和框架本身组件互动。</p>
		<p>　　HiveMind和<a href="http://www.jdon.com/jdonframework/" target="_blank">Jdon框架</a>定义的POJO Service有如下特点：</p>
		<p>　　不象EJB那样缺乏本地透明化(location transparency)概念，这些POJO Service总是能定位到同样一个JVM；也不象基于XML的Web服务web services那样没有语言透明(language transparency)概念，这些POJO Service总是可以被一组Java接口来概括替代(通过调用Java interface来替代调用这些具体Service)；当然，更不会类似JMX或Jini，不能进行service的热装载（ hot-loading）。</p>
		<p>　　注意：当Ioc/AOP提供高度灵活的同时，已经有初学者开始抱怨Spring的过分灵活，那么比Spring在组件上更灵活的Jdon框架只能算是一种追求极端，它不一定构成你进行架构选择的主要依据！</p>
		<p>　　上面这些讨论只是表明在灵活性（解耦性/透明性）这条需求道路上深究下去的选择，你自己的应用系统需求会产生各种不同的要求，有些要求甚至是极致的，这种偏向程度就成为你架构选择的目标，如果你的这种极致要求在目前Java世界里还没有可选框架时，那么你就要动手自己做了，这也说明什么时候你开始自己做框架（如Jdon框架），虽然在大多数情况下我们是不必要自己发明轮子的。</p>
		<p>
				<strong>快速构建性</strong>
		</p>
		<p>　　前面是从灵活性和定制性这个角度讨论架构选择目标，但是在一般情况下，我们还是从上手难易、开发效率这个角度来进行架构选择，从这个角度来说，就是需要我们将选用的框架尽可能的多帮助我们实现一些功能，但这又是和使用难易是矛盾的，因此有个取舍问题，取舍有个准则：这个框架尽量能提供越多功能；尽量需要我们少写代码，甚至不写代码（使用XML配置），少动脑筋。</p>
		<p>　　关于XML配置这里也涉及难易问题，XML配置语法不能太复杂，有太多小开关Switch也增加学习成本。</p>
		<p>　　从这个角度看，EJB无论是EJB2或EJB3提供的功能是最齐全的，但是XML配置开关太多 ，Spring属于中等，组件XML配置不算简单，但是因为有不少Struts+Spring+Hibernate之类现成开源代码可供参考，因此学习起来难度也不大，Spring越来越象一个J2EE API（注意，JDK是J2SE API） ，Spring除不能提供分布式计算外，也因为过分灵活降低了一些开发效率，例如它的组件依赖关系一般需要逐步指定，auotwiring功能还没有深入骨髓成为核心功能。<a href="http://www.jdon.com/AOPdesign/iocimpls.htm" target="_blank">Ioc容器的革命性优点。</a></p>
		<p>　　Spring除了提供组件层功能以外，还有表现层支持Spring MVC；也有持久层实现的JDBC模板，这样，整个J2EE/Java EE系统各个层次Spring都提供了缺省实现，在这方面无疑提高了开发效率，但是Spring提供丰富API目的好像不是为了快速开发，而是为了建立一个完整的功能齐全的API功能库。正如它网页上开头文字所述：As the leading <strong>full-stack</strong> Java/J2EE application framework，注意full-stack（完整齐全）是它突出的名词。</p>
		<p>　　那么，还有另外一个空白，就是以开发效率为主要考虑，这类框架除了必须考虑足够灵活性和丰富功能以外，宗旨是为了在一般缺省情况下快速完成一个J2EE/Java EE系统，这非常类似MDA工具了，但是一个完全丧失灵活性和定制性的MDA工具也不是我们欢迎的。</p>
		<p>　　<a href="http://www.jdon.com/jdonframework/" target="_blank">Jdon框架</a>的发展目标是为了填补这个空白，相信也会越来越多框架向这个目标迈进，当然不可否认，Spring也可能调转枪头走入这个领域，EJB2/EJB3正依靠JBuilder等这样商业化开发工具向这个领域靠拢，这个发展方向实际是4GL RAD Tools。</p>
		<p>　　很多人在快速构建方面也很早进行了探索，涌现出各种工具：<a href="http://www.jdon.com/jive/article.jsp?forum=91&amp;thread=18992" target="_blank">如何构建一个快速业务构件平台？</a> 但是如何把快速构建和构件（组件）灵活性有机结合在一起？它是考验一个业务构件（业务组件）平台好坏的准则。有些构件平台虽然开发迅速，但是对于特殊情况，可供程序员定制透明操作部分不多，很死，典型的是两层结构以前的Delphi，开发很快速，但是无法象J2EE这样深入到系统各个层次进行定制/维护/拓展！</p>
		<p>
				<strong>业务组件框架对比</strong>
		</p>
		<table cellspacing="1" cellpadding="1" width="100%" border="0">
				<tbody>
						<tr>
								<td bgcolor="#cccccc">
										<table width="100%" border="0">
												<tbody>
														<tr>
																<td width="16%"> </td>
																<td width="28%">EJB2/EJB3</td>
																<td width="29%">Spring Framework 1.x </td>
																<td width="27%">
																		<a href="http://www.jdon.com/jdonframework/" target="_blank">Jdon Framework</a> 1.x </td>
														</tr>
														<tr bgcolor="#ffffff">
																<td align="middle" bgcolor="#999999">灵活性<br />(松耦合)</td>
																<td>EJB3比EJB2更具灵活性，EJB3支持应用系统POJO</td>
																<td>支持应用系统POJO，框架基础功能不能替换</td>
																<td>支持应用系统POJO，框架本身可分离配置，定制性更强</td>
														</tr>
														<tr bgcolor="#ffffff">
																<td align="middle" bgcolor="#999999">功能完整性</td>
																<td>全面，支持异步JMS 分布式事务</td>
																<td>较为全面。有自己的表现层和持久层模板,可支持异步</td>
																<td>基本完整，表现层借助Struts实现。有自己简单的持久层模板</td>
														</tr>
														<tr bgcolor="#ffffff">
																<td align="middle" bgcolor="#999999">领域范围</td>
																<td>支持业务逻辑Session</td>
																<td>不支持，需要开发者额外基于ThreadLocal编制代码，耗费精力和时间。</td>
																<td>
																		<a href="http://www.jdon.com/jdonframework/acl.htm" target="_blank">支持业务逻辑Session</a>
																</td>
														</tr>
														<tr bgcolor="#ffffff">
																<td align="middle" bgcolor="#999999">Ioc/AOP支持</td>
																<td>EJB3支持Ioc, JBoss等EJB3服务器支持AOP；基于业务组件的较粗粒度</td>
																<td>基于JavaBeans类的细粒度；一般小型应用过于灵活带来复杂。</td>
																<td>基于业务组件的较粗粒度</td>
														</tr>
														<tr bgcolor="#ffffff">
																<td align="middle" bgcolor="#999999">Ioc是否支持autowiring</td>
																<td>EJB3支持</td>
																<td>缺省不支持，可设置支持</td>
																<td>缺省支持</td>
														</tr>
														<tr bgcolor="#ffffff">
																<td align="middle" bgcolor="#999999">单台性能</td>
																<td>一般，批量查询等大数据量业务处理须小心，存在本地不透明缺陷。</td>
																<td>一般，框架本身组件无性能提升极致，应用程序可配置cache/Pool</td>
																<td>好，框架本身组件使用缓存提升性能，应用程序可配置cache/Pool，批量查询专门优化，适合实时性并发性要求较高应用</td>
														</tr>
														<tr bgcolor="#ffffff">
																<td align="middle" bgcolor="#999999">可伸缩性</td>
																<td>
																		<p>可支持多台服务器分布式计算。 </p>
																</td>
																<td>不支持，可依靠EJB实现</td>
																<td>不支持，可依靠EJB实现</td>
														</tr>
														<tr bgcolor="#ffffff">
																<td align="middle" bgcolor="#999999">开发效率</td>
																<td>学习曲线长,导致熟练掌握难。借助商业开发工具可加快熟练者的开发速度。</td>
																<td>较为复杂，可挑选只适合自己的功能实现。当组件很多时，需要照顾这些组件之间调用关系。</td>
																<td>简单快速，表现层编码很少。当组件个数很多时，无需照顾它们之间的调用关系</td>
														</tr>
														<tr bgcolor="#ffffff">
																<td align="middle" bgcolor="#999999">系统规模</td>
																<td>EJB2适合大型系统;EJB3适合中大型系统</td>
																<td>适合中小型系统</td>
																<td>适合小中型系统，建立一个简单的网站系统等，和EJB无缝结合，可借助EJB支持中大型系统</td>
														</tr>
														<tr bgcolor="#ffffff">
																<td align="middle" bgcolor="#999999">重量级别</td>
																<td>重量，正在减肥</td>
																<td>轻量偏重，有可能继续增肥</td>
																<td>最轻量，恪守简单快速原则</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p> </p>
		<p align="center">
				<strong>持久层框架</strong>
		</p>
		<p>　　持久层框架目前有EJB2/EJB3的实体Bean、Hibernate和各种JDO产品，当然还有直接写SQL语句的JDBC，如iBatis等。</p>
		<p>　　持久层框架质量好与坏区分就是是否是O/R Mapping，也就是对象和关系数据库映射，关系数据库需要实现定义好Schema结构；对象因为字段而变的也有一个自己的结构，如何将对象数据自动持久化到数据库中，首先我们得定义两者结构的对应，这实际是数据的元数据定义。</p>
		<p>　　因为Hiberante/Toplink/JDO这样O/R Mapping工具帮助你实现对象和数据库转换，克服了对象和数据库阻抗现象，<a href="http://www.jdon.com/jive/article.jsp?forum=16&amp;thread=22244" target="_blank">O/R Mapping总结</a> ，所以才使得我们更多的可以对象方式（从模型Model对象）来考虑Java EE/J2EE系统，可以完全放弃以前那种以数据库为中心的思维方式：<a href="http://www.jdon.com/artichect/dbover.htm" target="_blank">数据库时代的终结。</a></p>
		<p>　　所以，是否选用好的持久层框架，取决于你整个团队思维是否彻底OO了，是否需要真正OO，当然，对于一些小型项目，有时我们觉得直接使用JDBC模板反而更加轻松快捷一点，这也是Spring的JDBC模板/iBatis/Jdon的Jdbc模板存在的理由了。</p>
		<p>例如新增一个数据表，在Jdon框架只需要下面几行代码即可：</p>
		<table cellspacing="0" cellpadding="1" width="100%" bgcolor="#cccccc" border="0">
				<tbody>
						<tr>
								<td>String sql = "INSERT INTO testuser (userId , name) VALUES (?, ?)";<br />List queryParams = new ArrayList();<br />queryParams.add(userTest.getUserId());<br />queryParams.add(userTest.getName());<br />jdbcTemp.operate(queryParams,sql);</td>
						</tr>
				</tbody>
		</table>
		<p>　　这种方式和O/R Mapping兴师动众的多个XML配置和关系映射思考相比，对于习惯SQL语句的程序员反而更加迅速。</p>
		<p>　　从以上可以看出，灵活性/快速性/简单性/可伸缩性是我们进行架构选择的主要几个依据，架构选择实际就是在这几个策略之间做一个平衡。当然，还有一个非常重要的因素，因为它不属于某个层次的技术，性能/缓存是必须和上面因素综合考虑的因素。</p>
		<p>　　因为性能最初是我们使用计算机的基本原因，别忘记这个根本。</p>
		<p>相关文章</p>
		<p>
				<a href="http://www.jdon.com/mda/modeling.html" target="_blank">面向对象与领域建模 </a>
		</p>
		<p>
				<a href="http://www.jdon.com/artichect/businessproxy.htm" target="_blank">J2EE中几种业务代理模式的实现和比较</a>
		</p>
		<p>
				<a href="http://www.jdon.com/artichect/embeddable.htm" target="_blank">JBoss 5迎来Java的彻底的可配置时代</a>
		</p>
		<p>
				<a href="http://www.jdon.com/AOPdesign/Ioc.htm" target="_blank">Ioc模式(又称DI：Dependency Injection)</a>
		</p>
		<p>
				<a href="http://www.jdon.com/jive/thread.jsp?forum=91&amp;thread=23671" target="_blank">IOC模式的思考和疑问</a>
		</p>
		<p>
				<a href="http://www.jdon.com/jive/article.jsp?forum=16&amp;thread=24513" target="_blank">关于SPING与EJB的胡言乱语--重和轻永恒的话题</a>
		</p>
		<p>
				<a href="http://www.jdon.com/artichect/lightweight.html" target="_blank">Simplify the Best：详论轻量框架</a>
		</p>
		<p>
				<a href="http://www.jdon.com/jive/thread.jsp?forum=91&amp;thread=22795" target="_blank">欢迎讨论</a>
		</p>
		<p> </p>
		<!-- #EndEditable -->
<img src ="http://www.blogjava.net/jiabao/aggbug/104722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-19 13:28 <a href="http://www.blogjava.net/jiabao/articles/104722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转一网友的文章，关于JAVA学习资料查询及基础技术查找方式z</title><link>http://www.blogjava.net/jiabao/articles/104377.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Fri, 16 Mar 2007 15:13:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/104377.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/104377.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/104377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/104377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/104377.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 。																																																														 																								大家好，这个地方，我刚来不到						15						天，发现这里确实是个学习的好地方，不过到现在给我的感觉是，比较乱，比如，大家问的问题经常有重...&nbsp;&nbsp;<a href='http://www.blogjava.net/jiabao/articles/104377.html'>阅读全文</a><img src ="http://www.blogjava.net/jiabao/aggbug/104377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-16 23:13 <a href="http://www.blogjava.net/jiabao/articles/104377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是多层结构？（含中文译文）</title><link>http://www.blogjava.net/jiabao/articles/104373.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Fri, 16 Mar 2007 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/104373.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/104373.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/104373.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/104373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/104373.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="article_title" align="middle" height="30">
										<b>
										</b>
								</td>
						</tr>
						<tr>
								<td align="middle" width="100%" bgcolor="#888888" height="1">
								</td>
						</tr>
						<tr>
								<td width="100%" height="2">
								</td>
						</tr>
						<tr>
								<td width="100%" height="38">
										<p align="center">
												<b>
												</b> </p>
								</td>
						</tr>
						<tr>
								<td valign="top" width="100%">
										<p>What is Multitiered Application? <br />出自sun对宠物商店例子的综述文档?</p>
										<p>
												<font face="宋体">Partitioning a design into tiers allows designers to choose<br />the appropriate technology for a given situation. The Java<br />Pet Store demo, illustrates how its design is divided into<br />multiple tiers.</font>
												<br />使用分层的方式来进行设计，可以使设计者针对具体的情况使用合适<br />的技术。这个Java 宠物商店的例子展示了如何把一个设计分成多层结构。</p>
										<p>
												<font face="宋体">The Client tier is often the only part of the application the<br />user sees. The Java Pet Store demo Client tier consists of a<br />browser displaying web pages generated from JSP pages in the<br />Web tier. An administrator interface uses a spreadsheet client,<br />such as StarOffice software, to communicate with the Web Tier<br />XML messages. The Client tier communicates with other tiers<br />through defined interfaces.<br /></font>客户层通常是用户唯一可以看到的应用程序的部分。这个宠物商店例子<br />的客户层是一个浏览器，它负责显示Web层中JSP页产生的web页面。一个<br />管理员接口可以使用一个spreadsheet客户端（例如StarOffice软件）来<br />和Web层交换XML消息。客户层通过定义好的接口和其他层交互。</p>
										<p>
												<font face="宋体">The Web tier performs web-related processing, such as serving<br />HTML, instantiating web page templates, and formatting JSP pages<br />for display. Some objects within the Web tier act as proxies to<br />components in the Enterprise JavaBeans components tier.<br /></font>Web层负责Web相关的处理，比如提供HTML服务，产生web页面的模板的实作，<br />格式化JSP页面来显示。Web层中有一些物件可以作为EJB组件层中组件的<br />代理。</p>
										<p>
												<font face="宋体">The Enterprise JavaBeans components tier is responsible for any<br />processing involving Enterprise JavaBeans components. Enterprise<br />JavaBeans components contain the business logic of the Java Pet<br />Store demo, such as processing orders. EJB components also<br />represent the model objects of the Java Pet Store demo, including<br />Account and placed Orders.<br /></font>EJB组件层负责任何与EJB组件相关的处理。EJB组件中包含这个Java宠物商店<br />的商业逻辑，比如处理订单。EJB组件也含有这个Java宠物商店的物件模型，<br />包括账目和处理过的订单。</p>
										<p>
												<font face="宋体">Stand-alone clients and web applications in the Web tier can use<br />Enterprise JavaBeans components hosted by the Enterprise JavaBeans<br />components tier. The Java Pet Store demo demonstrates the proper<br />use of Enterprise JavaBeans components.<br /></font>单机版客户端和网络层中的web应用都可以使用EJB组件层中的EJB组件。这个<br />Java宠物商店的例子展示了如何恰当地使用EJB组件。</p>
										<p>
												<font face="宋体">The Enterprise Information System (EIS) tier provides a layer of<br />software that maps existing data and application resources into<br />the design of a J2EE application in an implementation-neutral way.<br />The EIS tier can also access applications of other organizations<br />or businesses, providing seamless business-to-business integration.<br /></font>企业信息系统（EIS）层提供了一层软件，以一种与实现无关的方式把已存在<br />的数据和应用资源一起映射到一个J2EE应用程序的设计之中。EIS层通过B2B的<br />无缝集成使得其它的组织或商业机构也可以对其进行使用。</p>
										<p> </p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jiabao/aggbug/104373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-16 22:57 <a href="http://www.blogjava.net/jiabao/articles/104373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PetStore 中EJB 的设计模式[长]</title><link>http://www.blogjava.net/jiabao/articles/102721.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 08 Mar 2007 18:17:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/102721.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/102721.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/102721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/102721.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/102721.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: PetStore 中EJB 的设计模式1/1目录..............................................................................................................................................1PetStore 中EJB 的设计模式.................&nbsp;&nbsp;<a href='http://www.blogjava.net/jiabao/articles/102721.html'>阅读全文</a><img src ="http://www.blogjava.net/jiabao/aggbug/102721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-09 02:17 <a href="http://www.blogjava.net/jiabao/articles/102721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解剖Petstore用户资料修改流程</title><link>http://www.blogjava.net/jiabao/articles/102719.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 08 Mar 2007 18:04:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/102719.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/102719.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/102719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/102719.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/102719.html</trackback:ping><description><![CDATA[
		<hr noshade="" />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td valign="top" width="86%">update_customer.screen<br /><br />查找screendefinitions_en_US.xml<br />由于petsotre的界面使用了一个模板taglib,这个模板将屏幕分成：<br />title 标题<br />banner 广告<br />sidebar 菜单边<br />body 正文<br />mylist 特殊显示<br />footer 页脚<br />这个思路可以借鉴到我们系统中。<br />从其中找到update_customer.screen的真正程序名是：<br /><br />也就是是edit_customer.jsp<br /><br />打开edit_customer.jsp 发现其form action又是自己定义的，<br />action="customer.do"<br />也就是说update_customer.screen页面是提交到customer.do程序的。<br /><br />再查询customer.do是什么？<br /><br />在mappings.xml中查询到：<br /><br />com.sun.j2ee.blueprints.petstore.controller.web.actions.CustomerHTMLAction<br /><br />customer.do实际是com.sun.j2ee.blueprints.petstore.controller.web.actions.CustomerHTMLAction这个servlet<br />那么打开com.sun.j2ee.blueprints.petstore.controller.web.actions.CustomerHTMLAction：<br /><br />这个servlet主要是处理update_customer.screen提交form中的参数，<br />ContactInfo info = extractContactInfo(request, "_a");<br />CreditCard creditCard = extractCreditCard(request);<br />ProfileInfo profileInfo = extractProfileInfo(request);<br />将这些从前台用户那里输入的新数据打包在一个叫CustomerEvent类中：<br />event = new CustomerEvent(CustomerEvent.UPDATE, info, profileInfo, creditCard);<br /><br />这个CustomerEvent很重要，是承接前台和后台EJB处理的中间枢纽。<br /><br />从mappings.xml可以查询到：<br /><br />com.sun.j2ee.blueprints.petstore.controller.events.CustomerEvent<br />com.sun.j2ee.blueprints.petstore.controller.ejb.actions.CustomerEJBAction<br /><br />CustomerEvent实际是激活 CustomerEJBAction.<br /><br />打开CustomerEJBAction，我们发现了updateCustomer(CustomerEvent ce)<br />这个方法将前台用户的新数据set到EJB中。<br />CustomerEJBAction也并不是直接和entity bean打交道，而是通过ShoppingClientFacadeLocalEJB<br />这是个Facade模式。<br /><br />下次我们讨论MainServlet<br />这个MainServlet实际上是petstore MVC的总controller,但是它和具体数据又没有关系，上面的customer.do实际是通过MainServlet激活的。</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jiabao/aggbug/102719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-09 02:04 <a href="http://www.blogjava.net/jiabao/articles/102719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.0和EJB3.0随谈</title><link>http://www.blogjava.net/jiabao/articles/102715.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 08 Mar 2007 17:46:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/102715.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/102715.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/102715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/102715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/102715.html</trackback:ping><description><![CDATA[
		<p>Spring自从2003年发布以来，一直是Java开源框架的奇迹之一。从2000年开始，伴随着B/S架构逐渐引入企业应用软件开发的领域，Java就逐渐成为企业应用开发的主流技术，一直到2003年，Struts＋EJB一直是Java技术架构的不二选择，然而这一切随着2003年Spring以without EJB的面目出现之后，一切都开始改变。</p>
		<p>大概从2003年下半年开始，Spring＋Hibernate就开始甚嚣尘上，似乎那时候的Spring和Hibernate尚且不足以动摇J2EE规范以EJB为核心的领袖地位。但是2004年5月份，吸收了Spring/Hibernate框架优点的EJB3 JCP委员会的成立，事实上宣判了Spring对EJB2的终结，EJB3则更像是Vendor们的一种自救行为。</p>
		<p>2004年到2006这三年时间以来，Spring取得了相当辉煌的成就，不但将EJB2赶进历史，而且牢牢确立了Spring作为Java企业应用开发的主流地位。而今，甚至对技术比较保守的金融电信行业，也开始言必称Spring，Spring已经成为Java框架的事实标准。</p>
		<p>在2004年5月份之后，Hibernate Team开始和Spring公然决裂，这个事情放在两年多以后的今天来看，原因是昭然若揭的，背靠JBoss的Hibernate Team已经成为EJB3规范的一部分，而JBoss希望力推的以EJB3为核心的Java架构来成为未来的企业应用主流标准，这种情况演变至今，变成了Springframework和JBoss Seam的两种不同技术架构的竞争关系。</p>
		<p>2004年5月份，EJB3规范的起步，对Spring未来其实有很大的威胁，但是EJB3规范历经两年时间的难产，终于在2006年5月正式发布之时，已经为时过晚了，抬眼望去，已尽是spring的天下。</p>
		<p>有意思的是，大致展望一下未来，Java的企业应用开发还能遵循Sun和JCP制订的Java EE规范的道路走下去吗？如果不是这样，那么未来道路是什么呢？</p>
		<p>观察一下Java社区几股大的势力，会发现一些有意思的现象：</p>
		<p>IBM和BEA是Java社区的领导者，从2004年开始，IBM和BEA开始大肆宣传SOA，将他们的目光从应用服务器领域挪到了松藕合企业服务领域，开展SOA商业战略。与此同时，EJB3专家委员会的领导者也悄然变成了JBoss和Oracle，是IBM和BEA无力争取吗？当然不是。IBM和BEA已经看到了应用服务器市场和底层框架平台即将被开源占领，商业价值萎缩，因而审时度势进行战略转型。一方面押宝SOA战略，大肆炒热和培育SOA市场，另一方面也积极占领开源市场，IBM放出来WebSphere社区版本－Apache Geronimo，BEA干脆和Spring的咨询公司interface21合作，提供spring框架在WebLogic上的商业技术支持，如今EJB3对于他们来说已经形同鸡肋，就抛给别人嚼吧。</p>
		<p>将EJB3当块宝的自然是应用服务器市场的跟随者JBoss和Oracle，一方面凭借ORM的先天优势，另一方面有出头机会也不能放过，EJB3委员会几乎成了JBoss和Oracle的天下。特别是JBoss，更加积极推出JBoss Seam框架，希望确立以JSF＋EJB3的架构树立Java开发的标准，用以取代Struts/Spring/Hibernate的流行组合，因而开启了EJB3和Spring 正面交锋的战争。</p>
		<p>Java Vendor中另外一股势力Sun公司这两年则一直自顾不暇，在应用服务器领域几乎退出市场，直到最近才搞出来一个Glassfish，在开发框架领域也一直毫无建树，推出的JSF至今还很不成熟，难担大任，也许Sun都去忙着开源Solaris和JVM源代码了。</p>
		<p>几个大的Vendor或战略转型，或自顾不暇，或忙于收购(Oracle)，Java开发领域的主战场被打扫一空，对决的双方换成了Spring和JBoss。对决的武器则是spring vs Seam。</p>
		<p>Spring代表了不遵循通用标准，自己制订游戏规则，不依赖容器的一方；JBoss代表了遵循通用标准，但是锁定容器的一方。这场对决从2004年5月就开始上演，未来很长时间也会继续下去。不过Spring已经站在优势很大的地位上了。</p>
		<p>大致对比一下两者：Spring vs EJB3，就会发现Spring从功能上面已经胜出很多了：</p>
		<p>1、IoC容器spring胜出</p>
		<p>Spring的IoC容器很强大，其bean管理功能超过了目前EJB3容器，配置方面Spring稍微复杂一些。不过对于全局性配置来说，XML要优于EJB3的annotation。</p>
		<p>2、AOP能力Spring胜出</p>
		<p>EJB3目前提供的AOP功能非常简单，本来已经无法和Spring相比，至于集成AspectJ的Spring2.0，就更加望尘莫及了。</p>
		<p>3、事务管理方面EJB3稍微领先</p>
		<p>Spring提供了很棒的本地事务模型，也可以集成JTA，但是不支持分布式事务，当然这种场景也非常罕见。</p>
		<p>4、Web框架spring胜出</p>
		<p>EJB3标准集成JSF，但是JSF并不成熟，和AJAX配合度也不好。Spring可以灵活集成各种Web框架和模板语言，自身也提供了相当强大的MVC框架，要是这还觉得不够，那么spring webflow，portlet support都拿出来。</p>
		<p>5、远程访问支持，大致持平</p>
		<p>EJB3继承了传统的EJB远程访问能力，Web Services支持也不错；不过Spring提供了更多更灵活的选择，Java RPC，HTTP Invoker，Hessian/Burlap，WebServices。</p>
		<p>6、框架集成能力，spring胜出</p>
		<p>这是spring的传统优势项目，只要看看spring modules项目，看看n多第三方spring支持，就会发现spring现在的群众基础多么好，集成工作流，spring modules已经提供了方便的模板类，集成规则引擎，Cache，CMS，脚本语言，异步任务，安全验证框架。。。。。。EJB3有点望尘莫及的味道</p>
		<p>7、JMS，JMX，JCA等，EJB3领先一步</p>
		<p>这些传统EJB优势项目往往应用的不太多，EJB3仍然是领先的。不过令人侧目的是，Spring最近几个版本在连续追赶EJB这些传统优势领域，到Spring2.0为止，其JMS，JMX，JCA支持已经相当不错了，可以说传统EJB能够做的，现在Spring也可以做得到。</p>
		<p>这几年除了Spring框架自身不断完善和延伸到传统应用领域，围绕在Spring周围的第三方框架也是越来越丰富，EJB3在annotation方面有些独到的优势，在一些传统领域，还领先spring，但是总体来说，EJB3为核心的J2EE5.0规范很难和Spring现在的2.0相匹敌，更何况Java的主力Vendor早已醉翁之意不在这里了，单凭JBoss的Seam，难以战胜spring。</p>
		<p>目前JBoss已经开始在国内进行商业上的推广，也希望以其EJB3技术来和Springframework相抗衡，JBoss目前用来说服客户使用EJB3的理由主要有两点：</p>
		<p>1、EJB3是一个标准，由多个厂商提供实现 <br />2、JBoss的EJB3由Red Hat公司及其合作伙伴提供技术支持，而springfrmework在国内还没有商业技术支持</p> <img src ="http://www.blogjava.net/jiabao/aggbug/102715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-09 01:46 <a href="http://www.blogjava.net/jiabao/articles/102715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目中Struts/Spring/Hibernate的基本流程</title><link>http://www.blogjava.net/jiabao/articles/102713.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 08 Mar 2007 17:38:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/102713.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/102713.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/102713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/102713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/102713.html</trackback:ping><description><![CDATA[
		<p>Struts+Spring+Hibernate  develepment process: 
</p>
		<p>1.Write your business class : DTO,FormBean,Action,Service Interface,Service Implementation.</p>
		<p>
				<br />2.Write JSP pages.</p>
		<p>
				<br />3.struts-config.xml Configuration : FormBean,Action,Forward pages.</p>
		<p>
				<br />4.applicationContext-service.xml Configuration: add your Service Interface and Service Implementation. </p>
		<p>
				<br />5.Add your service factory Get method to ServiceFactory.java</p>
		<p>
				<br />6.Build project and Generate the Description file(*.hbm.xml) of DTO.</p>
		<p>
				<br />7.applicationContext.xml Configuration: add *.hbm.xml file to applicationContext for O/R mapping. </p>
<img src ="http://www.blogjava.net/jiabao/aggbug/102713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-09 01:38 <a href="http://www.blogjava.net/jiabao/articles/102713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE的13种核心技术</title><link>http://www.blogjava.net/jiabao/articles/102710.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 08 Mar 2007 17:11:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/102710.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/102710.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/102710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/102710.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/102710.html</trackback:ping><description><![CDATA[
		<p>Java最初是在浏览器和客户端机器中粉墨登场的。当时，很多人质疑它是否适合做服务器端的开发。现在，随着对Java2平台企业版（J2EE）第三方支持的增多，Java被广泛接纳为开发企业级服务器端解决方案的首选平台之一。 <br /><br />J2EE平台由一整套服务（Services）、应用程序接口（APIs）和协议构成，它对开发基于Web的多层应用提供了功能支持。 <br /><br />在本文中我将解释支撑J2EE的13种核心技术：JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML, JMS, Java IDL, JTS, JTA, JavaMail 和 JAF，同时还将描述在何时、何处需要使用这些技术。当然，我还要介绍这些不同的技术之间是如何交互的。 <br /><br />此外，为了让您更好地感受J2EE的真实应用，我将在WebLogic应用服务器,来自BEA Systems公司的一种广为应用的产品环境下来介绍这些技术。不论对于WebLogic应用服务器和J2EE的新手，还是那些想了解J2EE能带来什么好处的项目管理者和系统分析员，相信本文一定很有参考价值。 <br /><br />宏观印象: 分布式结构和J2EE <br /><br />过去，二层化应用 -- 通常被称为client/server应用 -- 是大家谈论的最多的。在很多情况下，服务器提供的惟一服务就是数据库服务。在这种解决方案中，客户端程序负责数据访问、实现业务逻辑、用合适的样式显示结果、弹出预设的用户界面、接受用户输入等。client/server结构通常在第一次部署的时候比较容易，但难于升级或改进，而且经常基于某种专有的协议，通常是某种数据库协议。它使得重用业务逻辑和界面逻辑非常困难。更重要的是，在Web时代，二层化应用通常不能体现出很好的伸缩性，因而很难适应Internet的要求。 <br /><br />Sun设计J2EE的部分起因就是想解决二层化结构的缺陷。于是，J2EE定义了一套标准来简化N层企业级应用的开发。它定义了一套标准化的组件，并为这些组件提供了完整的服务。J2EE还自动为应用程序处理了很多实现细节，如安全、多线程等。 <br /><br />用J2EE开发N层应用包括将二层化结构中的不同层面切分成许多层。一个N层化应用A能够为以下的每种服务提供一个分开的层： <br /><br />显示：在一个典型的Web应用中，客户端机器上运行的浏览器负责实现用户界面。 <br /><br />动态生成显示: 尽管浏览器可以完成某些动态内容显示，但为了兼容不同的浏览器，这些动态生成工作应该放在Web服务器端进行，使用JSP、Servlets，或者XML（可扩展标记语言）和（可扩展样式表语言）。 <br /><br />业务逻辑：业务逻辑适合用Session EJBs（后面将介绍）来实现。 <br /><br />数据访问：数据访问适合用Entity EJBs（后面将介绍）和JDBC来实现。 <br /><br />后台系统集成: 同后台系统的集成可能需要用到许多不同的技术，至于何种最佳需要根据后台系统的特征而定。 <br /><br />您可能开始诧异：为什么有这么多的层？事实上，多层方式可以使企业级应用具有很强的伸缩性，它允许每层专注于特定的角色。例如，让Web服务器负责提供页面，应用服务器处理应用逻辑，而数据库服务器提供数据库服务。 <br /><br />由于J2EE建立在Java2平台标准版（J2SE）的基础上，所以具备了J2SE的所有优点和功能。包括“编写一次，到处可用”的可移植性、通过JDBC访问数据库、同原有企业资源进行交互的CORBA技术，以及一个经过验证的安全模型。在这些基础上，J2EE又增加了对EJB（企业级Java组件）、Java servlets、Java服务器页面（JSPs）和XML技术的支持。 <br /><br />分布式结构与WebLogic应用服务器 <br /><br />J2EE提供了一个框架--一套标准API--用于开发分布式结构的应用，这个框架的实际实现留给了第三方厂商。部分厂商只是专注于整个J2EE架构中的的特定组件，例如Apache的Tomcat提供了对JSP和servlets的支持，BEA系统公司则通过其WebLogic应用服务器产品为整个J2EE规范提供了一个较为完整的实现。 <br /><br />WebLogic服务器已使建立和部署伸缩性较好的分布式应用的过程大为简化。WebLogic和J2EE代你处理了大量常规的编程任务，包括提供事务服务、安全领域、可靠的消息、名字和目录服务、数据库访问和连接池、线程池、负载平衡和容错处理等。 <br /><br />通过以一种标准、易用的方式提供这些公共服务，象WebLogic服务器这样的产品造就了具有更好伸缩性和可维护性的应用系统，使其为大量的用户提供了增长的可用性。 <br /><br />J2EE技术 <br /><br />在接下来的部分里，我们将描述构成J2EE的各种技术，并且了解WebLogic服务器是如何在一个分布式应用中对它们进行支持的。最常用的J2EE技术应该是JDBC、JNDI、EJB、JSP和servlets，对这些我们将作更仔细的考察。 <br /><br />Java Database Connectivity (JDBC) <br /><br />JDBC API以一种统一的方式来对各种各样的数据库进行存取。和ODBC一样，JDBC为开发人员隐藏了不同数据库的不同特性。另外，由于JDBC建立在Java的基础上,因此还提供了数据库存取的平台独立性。 <br /><br />JDBC定义了4种不同的驱动程序，现分述如下： <br /><br />类型 1: JDBC-ODBC Bridge <br /><br />在JDBC出现的初期，JDBC-ODBC桥显然是非常有实用意义的，通过JDBC-ODBC桥，开发人员可以使用JDBC来存取ODBC数据源。不足的是，他需要在客户端安装ODBC驱动程序，换句话说，必须安装Microsoft Windows的某个版本。使用这一类型你需要牺牲JDBC的平台独立性。另外，ODBC驱动程序还需要具有客户端的控制权限。 <br /><br />类型 2: JDBC-native driver bridge <br /><br />JDBC本地驱动程序桥提供了一种JDBC接口，它建立在本地数据库驱动程序的顶层，而不需要使用ODBC。 JDBC驱动程序将对数据库的API从标准的JDBC调用转换为本地调用。使用此类型需要牺牲JDBC的平台独立性，还要求在客户端安装一些本地代码。 <br /><br />类型 3: JDBC-network bridge <br /><br />JDBC网络桥驱动程序不再需要客户端数据库驱动程序。它使用网络上的中间服务器来存取数据库。这种应用使得以下技术的实现有了可能，这些技术包括负载均衡、连接缓冲池和数据缓存等。由于第3种类型往往只需要相对更少的下载时间，具有平台独立性，而且不需要在客户端安装并取得控制权，所以很适合于Internet上的应用。 <br /><br />类型 4: Pure Java driver <br /><br />第4种类型通过使用一个纯Java数据库驱动程序来执行数据库的直接访问。此类型实际上在客户端实现了2层结构。要在N-层结构中应用，一个更好的做法是编写一个EJB，让它包含存取代码并提供一个对客户端具有数据库独立性的服务。 <br /><br />WebLogic服务器为一些通常的数据库提供了JDBC驱动程序，包括Oracle, Sybase, Microsoft SQL Server以及Informix。它也带有一种JDBC驱动程序用于Cloudscape，这是一种纯Java的DBMS，WebLogic服务器中带有该数据库的评估版本。 <br /><br />以下让我们看一个实例。 <br /><br />JDBC实例 <br /><br />在这个例子中我们假定你已经在Cloudscape中建立了一个PhoneBook数据库，并且包含一个表，名为 CONTACT_TABLE ，它带有2个字段：NAME 和 PHONE。 开始的时候先装载Cloudscape JDBC driver，并请求 driver manager得到一个对PhoneBook Cloudscape数据库的连接。通过这一连接，我们可以构造一个 Statement 对象并用它来执行一个简单的SQL查询。最后，用循环来遍历结果集的所有数据，并用标准输出将NAME和PHONE字段的内容进行输出。 <br /><br /><br /><br /><br />import java.sql.*; <br />public class JDBCExample <br />{ <br />public static void main( String args[] ) <br />{ <br />try <br />{ <br />Class.forName("COM.cloudscape.core.JDBCDriver"); <br />Connection conn = DriverManager.getConnection("jdbc:cloudscape:PhoneBook"); <br />Statement stmt = conn.createStatement(); <br />String sql = "SELECT name, phone FROM CONTACT_TABLE ORDER BY name"; <br />ResultSet resultSet = stmt.executeQuery( sql ); <br />String name; <br />String phone; <br />while ( resultSet.next() ) <br />{ <br />name = resultSet.getString(1).trim(); <br />phone = resultSet.getString(2).trim(); <br />System.out.println( name + ", " + phone ); <br />} <br />} <br />catch ( Exception e ) <br />{ <br />// Handle exception here <br />e.printStackTrace(); <br />} <br />} <br />} <br /><br /><br /><br /><br />OK。接着我们来看一看JDBC是如何在企业应用中的进行使用。 <br /><br />JDBC在企业级应用中的应用 <br /><br />以上实例其实是很基本的，可能有些微不足道。它假定了一个2层结构。在一个多层的企业级应用中，更大的可能是在客户端和一个EJB进行通信，该EJB将建立数据库连接。为了实现和改进可伸缩性和系统性能， WebLogic服务器提供了对连接缓冲池connection pool的支持。 <br /><br />Connection pool减少了建立和释放数据库连接的消耗。在系统启动以后即可建立这样的缓冲池，此后如故再有对数据库的请求，WebLogic服务器可以很简单地从缓冲池中取出数据。数据缓冲池可以在WebLogic服务器的 weblogic.properties 文件中进行定义。(可参考 weblogic.properties 文件中的例子，WebLogic服务器的文档中还有更详细的参考信息) <br /><br />在企业级应用的另一个常见的数据库特性是事务处理。事务是一组申明statement，它们必须做为同一个statement来处理以保证数据完整性。缺省情况下JDBC使用 auto-commit 事务模式。这可以通过使用Connection类的 setAutoCommit() 方法来实现。 <br /><br />现在我们已经对JDBC有了一些认识，下面该转向JNDI了。</p>
		<p>Java Naming and Directory Interface (JNDI) <br /><br />JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP，本地文件系统，后者在应用服务器中的对象。 <br /><br />在JNDI中，在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的。这里没有绝对名字的概念存在。对一个应用来说，它可以通过使用 InitialContext 类来得到其第一个context: <br /><br /><br /><br /><br />Context ctx = new InitialContext(); <br /><br /><br /><br /><br />应用可以通过这个初始化的context经有这个目录树来定位它所需要的资源或对象。例如，假设你在Weblogic服务器中展开了一个EJB并将home接口绑定到名字 myApp.myEJB ，那么该EJB的某个客户在取得一个初始化context以后，可以通过以下语句定位home接口： <br /><br /><br />MyEJBHome home = ctx.lookup( "myApp.myEJB" ); <br /><br /><br /><br /><br />在这个例子中，一旦你有了对被请求对象的参考，EJB的home接口就可以在它上面调用方法。我们将在下面的"Enterprise Java Beans"章节中做更多的介绍。 <br /><br />以上关于JNDI的讨论只是冰山之一角而已。如果要更进一步地在context中查找对象，JNDI也提供了一些方法来进行以下操作：　 <br /><br />将一个对象插入或绑定到context。这在你展开一个EJB的时候是很有效的。 <br /><br />从context中移去对象。 <br /><br />列出context中的所有对象。 <br /><br />创建或删除子一级的context。 <br /><br />接下来，我们要开始关注EJB了。 <br /><br />Enterprise Java Beans (EJB) <br /><br />J2EE技术之所以赢得某体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑，由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务，例如目录服务、事务管理、安全性、资源缓冲池以及容错性。 <br /><br />EJB规范定义了3中基本的bean类型: <br /><br />Stateless session beans: 提供某种单一的服务，不维持任何状态，在服务器故障发生时无法继续存在，生命期相对较短。例如，一个stateless session bean可能被用于执行温度转换计算。 <br /><br />Stateful session bean: T提供了与客户端的会话交互，可以存储状态从而代表一个客户。典型例子是购物车。Stateful session bean在服务器故障时无法继续生存，生命气相对较短。每一个实例只用于一个单个的线程。 <br /><br />Entity beans: 提供了一致性数据的表示-- 通常存放在数据库中 -- 在服务器故障发生后能继续存在。多用户情况下可以使用EJB来表示相同的数据。entity EJB的一个典型例子是客户的帐号信息。 <br /><br />尽管有以上的区别，所有的EJB还是有许多的共同之处。它们都处理home interface。它定义了一个客户端是如何创建与消亡EJB的。可以在bean中对定义了客户端方法的远程接口进行调用；bean类则执行了主要的商务逻辑。 <br /><br />描述EJB的开发已经超出了本文的范围。但是，如果一个EJB已经被开发了或者从第三方进行了购买，它就必须在应用服务器中进行发布。WebLogic Server 5.1带有一个EJB Deployer Tool来协助处理EJB的发布。当你使用EJB Deployer Tool的时候，你要定义客户端所用的JNDI名字来定位EJB。Deployer Tool将生成wrapper类来处理和容器的通信以及在一个jar文件中把被请求的Java类绑定在一起。 <br /><br />一旦EJB被发布，客户端就可以使用它的JNDI名字来定位EJB。首先，它必须得到一个到home接口的reference。然后，客户端可以使用该接口，调用一个 create() 方法来得到服务器上运行的某个bean实例的句柄；最后，客户端可以使用该句柄在bean中调用方法。 <br /><br />了解 EJB后，让我们再来看JSP。 <br /><br />JavaServer Pages (JSPs) <br /><br />我们中间可能已经有许多人已经熟悉Microsoft的Active Server Pages (ASP)技术了。JSP和ASP相对应的，但更具有平台对立性。他们被设计用以帮助Web内容开发人员创建动态网页，并且只需要相对较少的代码。 即使Web设计师不懂得如何编程也可以使用JSP，因为JSP应用是很方便的。 JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理，然后将生成的HTML页面返回给客户端的浏览器。 <br /><br />下面我们来看一个JSP的简单实例。它只显示了服务器的当前日期和时间。虽然，对语法的具体解释已经超出了本文的范围，但我们还是可以很直观地看到，Java代码被放在符号的中间，而Java的表达式则放在符号之间。 <br /><br />Date JSP sample <br /><br />The current date is . <br /><br />您可能有时候听说过JHTML。这是JSP以前的一种较老的标准。WebLogic服务器既可支持JSP，又可支持JHTML。请注意，在缺省状况下，JSP在WebLogic服务器中并没有处于有效状态。要使之有效，你可以编辑weblogic.properties文件。如果Web服务器还没有处于有效状态，则要先使之有效。Servlet的情况和JSP是一样的。 <br /><br />下面是: Java servlets <br /><br />Java servlets <br /><br />servlet提供的功能大多与JSP类似，不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码，而servlets全部由Java写成并且生成HTML。 <br /><br />servlet是一种小型的Java程序，它扩展了Web服务器的功能。作为一种服务器端的应用，当被请求时开始执行，这和CGI Perl脚本很相似。Servlets和CGI脚本的一个很大的区别是：每一个CGI在开始的时候都要求开始一个新的进程 -- 而servlets是在servlet引擎中以分离的线程来运行的。因此servlets在可伸缩性上提供了很好的改进。 <br /><br />在开发servlets的时候，您常常需要扩展javax.servlet.http.HttpServlet 类，并且override一些它的方法，其中包括： <br /><br />service(): 作为dispatcher来实现命令-定义方法 <br /><br />doGet(): 处理客户端的HTTP GET请求。 <br /><br />doPost(): 进行HTTP POST操作 <br /><br />其它的方法还包括处理不同类型的HTTP请求 -- 可以参考HttpServlet API文档。 <br /><br />以上描述的是标准J2EE Servlet API的各种方法。WebLogic服务器提供了一个该API完整的实现途径。一旦你开发了一个servlet，你就可以在weblogic.properties 中加以注册并由此可以在WebLogic服务器中对它进行配置。 <br /><br />通过Java servlets,我们已经到达了J2EE主要技术的末尾了。但J2EE所提供的并不止于这些。下面的段落中我们将简要地看一下现存的一些技术，包括RMI, Java IDL和CORBA, JTA, 以及XML，等等。 <br /><br />Remote Method Invocation (RMI) <br /><br />正如其名字所表示的那样，RMI协议是在远程对象上调用一些方法。它使用了连续序列方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更下层的协议。 <br /><br />Java IDL/CORBA <br /><br />在Java IDL的支持下，开发人员可以将Java和CORBA集成在一起。 他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径，通过它Java可以被用于将你的新的应用和legacy系统相集成。 <br /><br />Java Transaction Architecture (JTA)/Java Transaction Service (JTS) <br /><br />JTA定义了一种标准的API，应用系统由此可以存取各种事务监控。 <br /><br />JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范，并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。 <br /><br />JavaMail and JavaBeans Activation Framework <br /><br />JavaMail是用于存取邮件服务器的API，它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器，也支持IMAP服务器。 <br /><br />JavaMail利用JavaBeans Activation Framework (JAF)来处理MIME-编码的邮件附件。MIME的字节流可以被转换成Java对象，或者转换自Java对象。由此大多数应用都可以不需要直接使用JAF。 <br /><br />Java Messaging Service (JMS) <br /><br />JMS是用于和面向消息的中间件相互通信的应用程序接口(Java Naming and Directory Interface (JNDI) <br /><br />JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP，本地文件系统，后者在应用服务器中的对象。 <br /><br />在JNDI中，在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的。这里没有绝对名字的概念存在。对一个应用来说，它可以通过使用 InitialContext 类来得到其第一个context: <br /><br /><br /><br /><br />Context ctx = new InitialContext(); <br /><br /><br /><br /><br />应用可以通过这个初始化的context经有这个目录树来定位它所需要的资源或对象。例如，假设你在Weblogic服务器中展开了一个EJB并将home接口绑定到名字 myApp.myEJB ，那么该EJB的某个客户在取得一个初始化context以后，可以通过以下语句定位home接口： <br /><br /><br />MyEJBHome home = ctx.lookup( "myApp.myEJB" ); <br /><br /><br /><br /><br />在这个例子中，一旦你有了对被请求对象的参考，EJB的home接口就可以在它上面调用方法。我们将在下面的"Enterprise Java Beans"章节中做更多的介绍。 <br /><br />以上关于JNDI的讨论只是冰山之一角而已。如果要更进一步地在context中查找对象，JNDI也提供了一些方法来进行以下操作：　 <br /><br />将一个对象插入或绑定到context。这在你展开一个EJB的时候是很有效的。 <br /><br />从context中移去对象。 <br /><br />列出context中的所有对象。 <br /><br />创建或删除子一级的context。 <br /><br />接下来，我们要开始关注EJB了。 <br /><br />Enterprise Java Beans (EJB) <br /><br />J2EE技术之所以赢得某体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑，由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务，例如目录服务、事务管理、安全性、资源缓冲池以及容错性。 <br /><br />EJB规范定义了3中基本的bean类型: <br /><br />Stateless session beans: 提供某种单一的服务，不维持任何状态，在服务器故障发生时无法继续存在，生命期相对较短。例如，一个stateless session bean可能被用于执行温度转换计算。 <br /><br />Stateful session bean: T提供了与客户端的会话交互，可以存储状态从而代表一个客户。典型例子是购物车。Stateful session bean在服务器故障时无法继续生存，生命气相对较短。每一个实例只用于一个单个的线程。 <br /><br />Entity beans: 提供了一致性数据的表示-- 通常存放在数据库中 -- 在服务器故障发生后能继续存在。多用户情况下可以使用EJB来表示相同的数据。entity EJB的一个典型例子是客户的帐号信息。 <br /><br />尽管有以上的区别，所有的EJB还是有许多的共同之处。它们都处理home interface。它定义了一个客户端是如何创建与消亡EJB的。可以在bean中对定义了客户端方法的远程接口进行调用；bean类则执行了主要的商务逻辑。 <br /><br />描述EJB的开发已经超出了本文的范围。但是，如果一个EJB已经被开发了或者从第三方进行了购买，它就必须在应用服务器中进行发布。WebLogic Server 5.1带有一个EJB Deployer Tool来协助处理EJB的发布。当你使用EJB Deployer Tool的时候，你要定义客户端所用的JNDI名字来定位EJB。Deployer Tool将生成wrapper类来处理和容器的通信以及在一个jar文件中把被请求的Java类绑定在一起。 <br /><br />一旦EJB被发布，客户端就可以使用它的JNDI名字来定位EJB。首先，它必须得到一个到home接口的reference。然后，客户端可以使用该接口，调用一个 create() 方法来得到服务器上运行的某个bean实例的句柄；最后，客户端可以使用该句柄在bean中调用方法。 <br /><br />了解 EJB后，让我们再来看JSP。 <br /><br />JavaServer Pages (JSPs) <br /><br />我们中间可能已经有许多人已经熟悉Microsoft的Active Server Pages (ASP)技术了。JSP和ASP相对应的，但更具有平台对立性。他们被设计用以帮助Web内容开发人员创建动态网页，并且只需要相对较少的代码。 即使Web设计师不懂得如何编程也可以使用JSP，因为JSP应用是很方便的。 JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理，然后将生成的HTML页面返回给客户端的浏览器。 <br /><br />下面我们来看一个JSP的简单实例。它只显示了服务器的当前日期和时间。虽然，对语法的具体解释已经超出了本文的范围，但我们还是可以很直观地看到，Java代码被放在符号的中间，而Java的表达式则放在符号之间。 <br /><br />Date JSP sample <br /><br />The current date is . <br /><br />您可能有时候听说过JHTML。这是JSP以前的一种较老的标准。WebLogic服务器既可支持JSP，又可支持JHTML。请注意，在缺省状况下，JSP在WebLogic服务器中并没有处于有效状态。要使之有效，你可以编辑weblogic.properties文件。如果Web服务器还没有处于有效状态，则要先使之有效。Servlet的情况和JSP是一样的。 <br /><br />下面是: Java servlets <br /><br />Java servlets <br /><br />servlet提供的功能大多与JSP类似，不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码，而servlets全部由Java写成并且生成HTML。 <br /><br />servlet是一种小型的Java程序，它扩展了Web服务器的功能。作为一种服务器端的应用，当被请求时开始执行，这和CGI Perl脚本很相似。Servlets和CGI脚本的一个很大的区别是：每一个CGI在开始的时候都要求开始一个新的进程 -- 而servlets是在servlet引擎中以分离的线程来运行的。因此servlets在可伸缩性上提供了很好的改进。 <br /><br />在开发servlets的时候，您常常需要扩展javax.servlet.http.HttpServlet 类，并且override一些它的方法，其中包括： <br /><br />service(): 作为dispatcher来实现命令-定义方法 <br /><br />doGet(): 处理客户端的HTTP GET请求。 <br /><br />doPost(): 进行HTTP POST操作 <br /><br />其它的方法还包括处理不同类型的HTTP请求 -- 可以参考HttpServlet API文档。 <br /><br />以上描述的是标准J2EE Servlet API的各种方法。WebLogic服务器提供了一个该API完整的实现途径。一旦你开发了一个servlet，你就可以在weblogic.properties 中加以注册并由此可以在WebLogic服务器中对它进行配置。 <br /><br />通过Java servlets,我们已经到达了J2EE主要技术的末尾了。但J2EE所提供的并不止于这些。下面的段落中我们将简要地看一下现存的一些技术，包括RMI, Java IDL和CORBA, JTA, 以及XML，等等。 <br /><br />Remote Method Invocation (RMI) <br /><br />正如其名字所表示的那样，RMI协议是在远程对象上调用一些方法。它使用了连续序列方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更下层的协议。 <br /><br />Java IDL/CORBA <br /><br />在Java IDL的支持下，开发人员可以将Java和CORBA集成在一起。 他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径，通过它Java可以被用于将你的新的应用和legacy系统相集成。 <br /><br />Java Transaction Architecture (JTA)/Java Transaction Service (JTS) <br /><br />JTA定义了一种标准的API，应用系统由此可以存取各种事务监控。 <br /><br />JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范，并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。 <br /><br />JavaMail and JavaBeans Activation Framework <br /><br />JavaMail是用于存取邮件服务器的API，它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器，也支持IMAP服务器。 <br /><br />JavaMail利用JavaBeans Activation Framework (JAF)来处理MIME-编码的邮件附件。MIME的字节流可以被转换成Java对象，或者转换自Java对象。由此大多数应用都可以不需要直接使用JAF。 <br /><br />Java Messaging Service (JMS) <br /><br />JMS是用于和面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的域，有支持发布/订阅(publish/subscribe)类型的域，并且提供对下列类型的支持：经认可的消息传递,事务型消息的传递，一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与legacy backend系统相集成。 <br /><br />Extensible Markup Language (XML) <br /><br />XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的，但是，它和Java具有的相同目标正是平台独立性。通过将Java和XML的组合，您可以得到一个完美的具有平台独立性的解决方案。目前正有许多不同的公司在为Java和XML的组合而努力。如果要了解更多的这方面的信息，可以访问Sun的Java-XML页面，或者IBM developerWorks的XML Zone。 <br />API)。它既支持点对点的域，有支持发布/订阅(publish/subscribe)类型的域，并且提供对下列类型的支持：经认可的消息传递,事务型消息的传递，一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与legacy backend系统相集成。 <br /><br />Extensible Markup Language (XML) <br /><br />XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的，但是，它和Java具有的相同目标正是平台独立性。通过将Java和XML的组合，您可以得到一个完美的具有平台独立性的解决方案。目前正有许多不同的公司在为Java和XML的组合而努力。如果要了解更多的这方面的信息，可以访问Sun的Java-XML页面，或者IBM developerWorks的XML Zone。</p>
<img src ="http://www.blogjava.net/jiabao/aggbug/102710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-09 01:11 <a href="http://www.blogjava.net/jiabao/articles/102710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE架构下系统设计模式</title><link>http://www.blogjava.net/jiabao/articles/102708.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 08 Mar 2007 16:52:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/articles/102708.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/102708.html</wfw:comment><comments>http://www.blogjava.net/jiabao/articles/102708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/102708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/102708.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.1 								J2EE								应用模型																		J2EE				提供了一个企业级的计算模型和运行环境用于开发和部署多层分布式结构的应用模型。该模型具有重用组件的能力、基于扩展标记语言				(XML)				的数据交换、统一的安全模式和灵活的事务控制。它通过提供企业计算环境所必需的各种服务，使得部署在				J...&nbsp;&nbsp;<a href='http://www.blogjava.net/jiabao/articles/102708.html'>阅读全文</a><img src ="http://www.blogjava.net/jiabao/aggbug/102708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2007-03-09 00:52 <a href="http://www.blogjava.net/jiabao/articles/102708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>