﻿<?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>IT博客-HERE WE GO!!!-随笔分类-J2EE</title><link>http://www.cnitblog.com/xiaoyaocao/category/878.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 22 Oct 2013 07:33:37 GMT</lastBuildDate><pubDate>Tue, 22 Oct 2013 07:33:37 GMT</pubDate><ttl>60</ttl><item><title>Hibernate4.1应用在WAS7上的事务问题</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2013/10/21/88748.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Mon, 21 Oct 2013 14:02:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2013/10/21/88748.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/88748.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2013/10/21/88748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/88748.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/88748.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: hibernate4.1+Spring3.1+websphere7的事务问题&nbsp;&nbsp;<a href='http://www.cnitblog.com/xiaoyaocao/archive/2013/10/21/88748.html'>阅读全文</a><img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/88748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2013-10-21 22:02 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2013/10/21/88748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中输入输出类</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2008/09/09/48895.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Tue, 09 Sep 2008 11:54:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2008/09/09/48895.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/48895.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2008/09/09/48895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/48895.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/48895.html</trackback:ping><description><![CDATA[<font color=#330000>java中输入输出类如果理不清思路的话就会很混乱!<br>一.File类提供与操作系统无关的文件操作!可以查看api文档了解它的方法<br>二.输出操作:<br>&nbsp;&nbsp; 1.把信息输出到屏幕上<br>&nbsp;&nbsp;&nbsp;&nbsp; 最简单的操作就是使用标准输出:System.out.println();<br>&nbsp;&nbsp;&nbsp;&nbsp; 下面讨论一下流方式的输出,与之相关的类如下<br>&nbsp; &nbsp; &nbsp;&nbsp; OutputStreamWriter:它提供字符流到字节流的转换,换句话说它写入字符数据然后按照指定字符集转换为字节数据 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedWriter:它可以将文本写入到字符流中,并且使用字符缓冲来提高写入的效率.建立在屏幕上输出字符的输出流应该采用如下代码:BufferedWriter bw=new BufferedWriter(new OutputStreamWriter());可以查看文档了解更多的方法.<br>例子:import java.io.*;<br>public class Hello{<br>public static void main(String args[]){<br>try{<br>String filename="/home/wuxiaoxiao/1.txt";<br>File file=new File(filename);<br>if(file.exists())<br>{<br></font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println("这是基本的输出!");<br>}else{<br>BufferedWriter writerstream=new BufferedWriter(new OutputStreamWriter(System.out));<br>String str="这是个特殊输出!";<br>writerstream.write(str,0,str.length());<br>writerstream.flush();<br>writerstream.close();<br>}<br>}catch(IOException e){<br></font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println(e);<br>}<br>}<br>}<br>&nbsp;&nbsp; 2.向文件中输出字符数据:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileWriter:按照字符形式写入文件<br>例子:import java.io.*;<br>public class hello{<br>public static void main(String args[]){<br>try{<br>BufferedWriter bw=new BufferedWriter(new FileWriter("/home/wuxiaoxiao/1.txt"));<br>bw.write("hello java world!");<br>bw.newLine();<br>bw.write("你好啊!");<br>bw.close();<br>}catch(IOException e){<br></font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println(e);<br>}<br>}<br>}<br>&nbsp;&nbsp;&nbsp; FileOutputStream按照字节形式写入数据<br>例子:import java.io.*;<br>public class hello{<br>public static void main(String args[]){<br>try{<br>int v1=10;<br>double v2=20.345D;<br>String str="hello word!";<br>DataOutputStream bw=new DataOutputStream(new FileOutputStream("/home/wuxiaoxiao/1.txt"));<br>//向文件中写入二进制数据<br>bw.writeInt(v1);<br>bw.writeChars(str);<br>bw.close();<br>}catch(IOException e){<br></font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println(e);<br>}<br>}<br>打开文件会看到乱码,因为这是二进制形式!<br>三.输入操作<br>&nbsp; 1.从键盘上读取字符数据<br>&nbsp;&nbsp;&nbsp;&nbsp; InputStreamReader:它提供了字节流到字符流的转换<br>&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader:从字符流中读取文本,并且使用字符缓存来提高读取效率<br>例子:import java.io.*;<br>public class Hello{<br>public static void main(String args[]){<br>try{<br>BufferedReader br=new BufferedReader(new InputStreamReader(System.in));<br></font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println("输入:");<br>String str=br.readLine();<br></font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println("输入的数据是:"+str);<br>}catch(IOException e){<br></font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println(e);<br>}<br>}<br>2.从文件中读取字符数据:<br>&nbsp;&nbsp; FileReader:按照字符方式读取文件内容<br>import java.io.*;<br>public class Hello{<br>public static void main(String args[]){<br>try{<br>BufferedReader br=new BufferedReader(new FileReader("/home/wuxiaoxiao/1.txt"));<br>String in;<br>while((in=br.readLine())!=null)<br>&nbsp; </font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println(in);<br>}catch(IOException e){<br></font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println(e);<br>}<br>}<br>}<br>3.从文件中读取字节数据<br>&nbsp; FileInputStream:按照字节方式读取文件内容<br>例子:import java.io.*;<br>public class Hello{<br>public static void main(String args[]){<br>try{<br>&nbsp; DataInputStream br=new DataInputStream(new FileInputStream("/home/wuxiaoxiao/1.txt"));<br>//读取数据<br>int v1=br.readInt();<br>double v2=br.readDouble();<br>byte[] buff=new byte[17];<br>br.read(buff);<br>String v3=new String(buff);<br>//显示数据<br></font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println(v1.....);<br>}catch(IOException e){<br></font><a title=system href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target=_blank><u><font color=#800080>system</font></u></a><font color=#330000>.out.println(e);<br>}<br>}<br>}</font><br>
<img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/48895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2008-09-09 19:54 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2008/09/09/48895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 专业人士必备的书籍和网站列表</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2007/03/08/23736.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Thu, 08 Mar 2007 02:33:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2007/03/08/23736.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/23736.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2007/03/08/23736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/23736.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/23736.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java 														专业人士必备的书籍和网站列表												级别: 初级																						Roy Miller						 (roy@roywmiller.com), 				创始人兼总裁, The Other Road, LLC								2007 				年 1 ...&nbsp;&nbsp;<a href='http://www.cnitblog.com/xiaoyaocao/archive/2007/03/08/23736.html'>阅读全文</a><img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/23736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2007-03-08 10:33 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2007/03/08/23736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 Apache Geronimo 上远程部署 Web 应用程序</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/20/17094.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Wed, 20 Sep 2006 03:21:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/20/17094.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/17094.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/20/17094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/17094.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/17094.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0">
				<tbody>
						<tr>
								<td class="main_ArticleTitle" style="WORD-BREAK: break-all" align="middle" height="35">在 Apache Geronimo 上远程部署 Web 应用程序</td>
						</tr>
						<tr>
								<td class="main_ArticleSubheading" style="WORD-BREAK: break-all">
								</td>
						</tr>
						<tr>
								<td class="Article_tdbgall" align="middle" height="23">作者：Michael … 文章来源：IBM developerWorks <br />引用自：<a href="http://www.crackj2ee.com/Article/ShowArticle.asp?ArticleID=693">http://www.crackj2ee.com/Article/ShowArticle.asp?ArticleID=693</a></td>
						</tr>
				</tbody>
		</table>
		<div style="CLEAR: right">
				<blockquote>
						<p align="left">Apache Geronimo 是一种认证的 Java™ 2 Platform Enterprise Edition（J2EE） 1.4 应用服务器。大多数人在想到 J2EE 时，会想到事务管理、Web 应用程序和异步消息传递等东西。但是，有了这些特性也不一定能够通过 J2EE 认证。应用服务器必须提供任务关键型生产系统所需的许多工具。这些工具之一是远程部署。Geronimo 是为满足大多数部署场景而设计的，所以它包含对远程部署的支持。本文解释使用 Geronimo 远程部署应用程序的许多方式。学习如何使用命令行工具（Geronimo 部署工具）和基于浏览器的工具（Geronimo Administration Console）远程部署应用程序，以及如何在集成开发环境（Eclipse）中部署应用程序。本文还提供一个对小型 Web 应用程序进行部署的简单示例。</p>
				</blockquote>
				<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
				<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
				<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
				<p>
						<a name="N10048">
								<span class="atitle">
										<strong>
												<font size="4">远程部署和 JSR 88</font>
										</strong>
								</span>
						</a>
				</p>
				<p>远程部署是任何 J2EE 认证的应用服务器的重要特性之一。任务关键型应用服务器需要运行在专用的系统上。安全性也是许多系统必须关注的问题，所以会限制对系统的访问。受到限制的访问意味着应用程序不能在进行部署和运行的系统上进行构建和打包。</p>
				<p>Java 社区认识到了远程部署的重要性。2000 年 10 月，引入了 Java Specification Request 88：Java Application Deployment（JSR 88）来解决这个问题。Java Community Process（JCP）通过 JSR 对应用程序的许多方面进行标准化。这种标准化的一个例子是应用程序的打包。Web 应用程序具有标准的布局并打包为 Web 应用程序存档（WAR）。这使应用程序开发人员在开发 Web 应用程序时不需要太多考虑在什么环境中部署应用程序。这是经典的 Java 格言 “<i>一次编写，到处运行</i> ” 在企业部署方面的应用。</p>
				<p>与通过 JCP 建立的其他 JSR 一样，JSR 88 是许多行业领先公司的代表之间协商的成果，比如 IBM®、Sun Microsystems、BEA 和 Oracle。这个规范引入了一种将任何 J2EE 应用程序部署到任何 J2EE 应用服务器的标准方式。它提供了部署（尤其是远程部署）的许多重要方面的细节，从而实现了标准化。它确定了应该如何识别和定位远程应用服务器，并为访问应用服务器建立了基本的安全模型。它还选定了应用服务器应该支持的几个核心部署阶段，比如部署、取消部署和重新部署。</p>
				<p>许多工作成果集中在 JSR 88 中。这个规范的草案于 2001 年 10 月提交给 JCP。当然，在此之前，所有主流应用服务器厂商已经在自己的产品中提供了某种远程部署支持。不同的厂商采用不同的方法，因此关于如何对部署进行标准化有许多争论。JCP 拟订了一个草案，于 2002 年 1 月向公众发布。JSR 88 于 2002 年 6 月定稿并获得批准。自此之后，它在 2003 年进行了更新，并于当年随 Java Platform, Enterprise Edition（Java EE） 5 的发布再次更新。（关于 JSR 88 的更多细节和历史，请参阅本文后面的 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#resources"><u><font color="#5c81a7">参考资料</font></u></a>。）</p>
				<p>JSR 88 使独立软件厂商能够开发可以部署在任何 J2EE 认证应用服务器上的 J2EE 应用程序。当然，在支持 JSR 88 的同时，每个应用服务器的开发者可以添加额外的部署功能。例如，Apache Geronimo 通过它的 Geronimo 部署计划提供了许多高级部署特性。部署计划将关于应用程序的重要元数据告诉 Geronimo。对于 Web 应用程序，要做的重要事情之一是设置应用程序的上下文根。这样就很容易让应用程序出现在 http://&lt;host&gt; 这样的位置，而不需要在 URL 上提供额外路径。本文包含一个简单的 Web 应用程序，其中包含一个 Geronimo 部署计划（关于部署计划的更多信息，请参见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#resources"><u><font color="#5c81a7">参考资料</font></u></a>）。</p>
				<br />
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600477.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#main">
																						<b>
																								<font face="Verdana" color="#5c81a7">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N1006B">
								<span class="atitle">
										<strong>
												<font size="4">Web 应用程序示例</font>
										</strong>
								</span>
						</a>
				</p>
				<p>为了了解远程部署在 Geronimo 上如何工作，最好有一个要部署的应用程序。<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig1"><u><font color="#5c81a7">图 1</font></u></a> 显示本文使用的简单 Web 应用程序 remoteApp 的布局。</p>
				<br />
				<a name="fig1">
						<b>图 1. 简单 Web 应用程序 remoteApp 的文件结构</b>
				</a>
				<br />
				<img height="377" alt="简单 Web 应用程序 remoteApp 的文件结构" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600689.jpg" width="283" />
				<br />
				<p>这个应用程序只包含一个 Web 页面 index.jsp。<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#list1"><u><font color="#5c81a7">清单 1</font></u></a> 给出这个 Web 页面，这个页面显示 <code><font face="Courier" size="2">Hello World</font></code> 以及当前时间。</p>
				<br />
				<a name="list1">
						<b>清单 1. remoteApp 的 index.jsp</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<code>
														<pre class="section">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;
&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" session="false"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /&gt;
&lt;title&gt;My Remote Web Application&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	Hello Remote World! The current time is: &lt;%= new
 java.util.Date().toString() %&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
												</code>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>这个应用程序使用 Ant 进行构建和打包。<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#list2"><u><font color="#5c81a7">清单 2</font></u></a> 给出构建脚本。它所做的仅仅是调用 Java <code><font face="Courier" size="2">jar</font></code> 函数将应用程序打包为 .war 文件。为了对应用程序进行构建和打包，只需运行 <code><font face="Courier" size="2">ant buildwar</font></code>。</p>
				<br />
				<a name="list2">
						<b>清单 2. 简单的 Ant 构建文件</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<code>
														<pre class="section">&lt;project name="remoteApp" basedir="." default="usage"&gt;
    &lt;property name="src.dir" value="src"/&gt;
    &lt;property name="web.dir" value="war"/&gt;
    &lt;property name="build.dir" value="${web.dir}/WEB-INF/classes"/&gt;
    &lt;property name="name" value="remoteApp"/&gt;
    &lt;target name="build" description="Compile main source 
tree java files"&gt;
        &lt;mkdir dir="${build.dir}"/&gt;
        &lt;javac destdir="${build.dir}" debug="true"
               deprecation="false" optimize="false" failonerror="true"&gt;
            &lt;src path="${src.dir}"/&gt;
            &lt;classpath refid="master-classpath"/&gt;
        &lt;/javac&gt;
    	&lt;copy todir="${build.dir}" preservelastmodified="true"&gt;
    		&lt;fileset dir="${src.dir}"&gt;
    			&lt;include name="**/*.hbm.xml"/&gt;
    		&lt;/fileset&gt;
    	&lt;/copy&gt;
    &lt;/target&gt;
    &lt;target name="buildwar" depends="build"
 description="Builds application as a WAR file"&gt;
        &lt;war destfile="${name}.war"
             webxml="${web.dir}/WEB-INF/web.xml"&gt;
            &lt;fileset dir="${web.dir}"&gt;
                &lt;include name="**/*.*"/&gt;
            &lt;/fileset&gt;
        &lt;/war&gt;
    &lt;/target&gt;
&lt;/project&gt;
</pre>
												</code>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>最后（但并非不重要），这个应用程序包含一个 Geronimo 部署计划。Geronimo 在释放 .war 文件时寻找部署计划。这个部署计划指定上下文根是 /helloRemote（见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#list3"><u><font color="#5c81a7">清单 3</font></u></a>）。因此能够在 http://&lt;host&gt;:&lt;port&gt;/helloRemote 访问这个 Web 应用程序。这个计划还给应用程序分配 <code><font face="Courier" size="2">ID</font></code>：<code><font face="Courier" size="2">HelloRemote</font></code>。 </p>
				<br />
				<a name="list3">
						<b>清单 3. remoteApp 的 Geronimo 部署计划</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<code>
														<pre class="section">&lt;web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.0"
         configId="HelloRemote"&gt;
    &lt;context-root&gt;/helloRemote&lt;/context-root&gt;
   
&lt;context-priority-classloader&gt;false&lt;/context-priority-classloader&gt;
&lt;/web-app&gt;
</pre>
												</code>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>有了这个简单的应用程序，现在就可以使用 Geronimo 的远程部署特性将应用程序部署到 Geronimo 的远程实例。进行远程部署有几种不同的方式；下一节讨论不同的方法以及它们如何工作。</p>
				<br />
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600477.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#main">
																						<b>
																								<font face="Verdana" color="#5c81a7">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N100D1">
								<span class="atitle">
										<strong>
												<font size="4">Geronimo 上的远程部署</font>
										</strong>
								</span>
						</a>
				</p>
				<p>JSR 88 提出的规范是对任何 J2EE 1.4 应用服务器的要求，Apache Geronimo 完全实现了这个规范。Geronimo 提供了几种将应用程序部署到本地和远程系统的方式。它提供了一个命令行实用程序 —— Geronimo 部署工具。这个工具提供完整的 JSR 88 支持，甚至可以用于其他应用服务器。</p>
				<p>Geronimo 还通过 Geronimo Administration Console 提供部署，这是一个供 Geronimo 管理员使用的 Web 应用程序。最后，可以在 Geronimo 上使用提供了 JSR 88 支持的其他第三方工具，比如流行的 Eclipse Web Tools Platform（更多信息见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#resources"><u><font color="#5c81a7">参考资料</font></u></a>）。本文讲解如何使用 Geronimo 部署工具部署示例应用程序，以及如何使用 Geronimo Administration Console 来检验它的部署。首先看看 Geronimo 部署工具。</p>
				<p>
						<a name="N100E2">
								<span class="smalltitle">
										<strong>
												<font size="3">Geronimo 部署工具</font>
										</strong>
								</span>
						</a>
				</p>
				<p>Geronimo 部署工具在 $GERONIMO_HOME/bin/deployer.jar 中。它提供 JSR 88 指定的所有选项以及 Geronimo 特有的额外选项，比如指定外部 Geronimo 部署计划。对于习惯使用命令行的系统管理员，这个工具是自然的选择，可以用于本地和远程部署。它的语法很简单：</p>
				<font size="2">
						<font face="Courier">
								<code>java -jar deployer.jar &lt;general_options&gt; &lt;command&gt;<br />&lt;command_options&gt; </code>
								<br />
								<br />
						</font>
				</font>
				<p>有几个启用远程部署的选项。<code><font face="Courier" size="2">--uri</font></code> 选项允许使用 JSR 88 中定义的 URI 语法识别远程服务器。URI 像下面这样：</p>
				<font size="2">
						<font face="Courier">
								<code>deployer:geronimo:jmx:rmi:///jndi/rmi:[//host[:port]]/JMXConnector </code>
								<br />
								<br />
						</font>
				</font>
				<p>这允许指定远程服务器（主机）并可选地指定主机监听的端口。如果没有指定主机和端口，那么默认值分别是 localhost 和 1099。另外，也可以使用 <code><font face="Courier" size="2">--host</font></code> 和 <code><font face="Courier" size="2">--port</font></code> 选项指定主机和端口。</p>
				<p>当然，部署必须是安全的。因此，需要向部署工具提供用户名和密码作为凭证。使用 <code><font face="Courier" size="2">--user</font></code> 选项指定用户名，使用 <code><font face="Courier" size="2">--password</font></code> 选项指定密码。如果没有提供密码，那么部署工具会提示用户输入密码。</p>
				<p>还可以使用部署工具对应用程序进行启动、停止和取消部署。它甚至可以用于其他 J2EE 应用服务器。为此，需要用 <code><font face="Courier" size="2">--driver</font></code> 选项指定一个 JSR 88 兼容驱动程序 JAR。还可以将各种选项组合成一个部署脚本（一个简单的 XML 文件），然后将部署脚本传递给部署工具。</p>
				<p>部署工具还有几个您应该知道的需求。本地机器需要打开它的 Remote Method Invocation（RMI）端口。默认端口是 1099。它还必须与远程服务器共享它的文件系统。这样远程服务器才能读取应用程序存档文件（常常是 EAR 或 WAR）。远程服务器也必须打开 RMI 端口和 HTTP 端口（默认情况下是 8080）。最后，它必须正在运行 remote-deploy Web 应用程序，这是 Geronimo 上默认包含和运行的程序。 </p>
				<p>在本文的后面，您将看到使用 Geronimo 部署工具将 remoteApp 部署在一个 Geronimo 远程实例上。在此之前，先看看另一种部署方式，Geronimo Administration Console。</p>
				<p>
						<a name="N10124">
								<span class="smalltitle">
										<strong>
												<font size="3">使用 Geronimo Administration Console 进行远程部署</font>
										</strong>
								</span>
						</a>
				</p>
				<p>remote-deploy Web 应用程序允许使用 Geronimo Administration Console 进行部署（见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig2"><u><font color="#5c81a7">图 2</font></u></a>）。可以从 http://&lt;host&gt;:&lt;port&gt;/console 访问 Geronimo Administration Console。</p>
				<br />
				<a name="fig2">
						<b>图 2. Geronimo Administration Console：欢迎页面</b>
				</a>
				<br />
				<img height="436" alt="Geronimo Administration Console：欢迎页面" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080602162.jpg" width="572" />
				<br />
				<p>点击左边导航面板中 Applications 文件夹下面的 <b>Deploy New</b> 链接，见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig3"><u><font color="#5c81a7">图 3</font></u></a>。</p>
				<br />
				<a name="fig3">
						<b>图 3. Geronimo Administration Console：Deploy new application 屏幕</b>
				</a>
				<br />
				<img height="411" alt="Geronimo Administration Console：Deploy new application 屏幕" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080605960.jpg" width="572" />
				<br />
				<p>这允许上传应用程序的 .ear 或 .war 文件和部署计划。可以将 Geronimo 部署计划包含在 EAR 或 WAR 中，示例 Web 应用程序 remoteApp 中就是这么做的。也可以单独指定它。这对于已经部署在其他应用服务器上的应用程序是有用的。例如，如果有一个 Web 应用程序当前正在 JBoss 上运行，希望将它迁移到 Geronimo 上。使用这个选项，可以在 Web 应用程序 .war 文件之外的部署计划中编写任何特殊的 Geronimo 元数据，并对现有的 WAR 进行部署。 </p>
				<p>Geronimo Administration Console 是 Geronimo 部署工具的简单图形化替代品。这个控制台是一个 Web 应用程序，所以必须部署它（它是默认的），还必须安装一个 Web 容器（Tomcat 或 Jetty）。在某些生产系统上，可能不希望部署这个 Web 应用程序，因为它会使用一些资源，而且它提供的是已经通过命令行特性提供了的管理功能。另外，您在 Geronimo 上运行的应用程序可能根本不需要 Web 容器。在这种情况下，可以利用 Geronimo 的模块性，通过删除 Web 容器去掉这个应用程序。这可以释放一些资源，从而提高 Geronimo 的性能。但是，它对于开发人员仍然是好工具。在开发期间，另一个好办法是使用 Eclipse Web Tools Platform 和 Geronimo 插件（请参见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#resources"><u><font color="#5c81a7">参考资料</font></u></a> 中一篇解释这个方法的 developerWorks 文章的链接）。</p>
				<p>
						<a name="N10162">
								<span class="smalltitle">
										<strong>
												<font size="3">使用 Eclipse Web Tools Platform 进行部署</font>
										</strong>
								</span>
						</a>
				</p>
				<p>J2EE 应用程序部署的标准化允许构建其他工具来提供部署功能，并支持各种应用服务器。还可以使用 Eclipse 的 Web Tools Platform 将应用程序部署到 Geronimo 的本地和远程实例上。在本节其余部分中，您将看到一个用来在 Geronimo 远程实例上进行部署的 Eclipse 示例。需要安装用于 Eclipse 的 Geronimo 插件（参见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#resources"><u><font color="#5c81a7">参考资料</font></u></a> 中的下载链接）。然后，在 Eclipse 中创建一个新的服务器实例（通常使用 New Server 向导），再指定要部署到这个服务器上的应用程序。 </p>
				<p>在默认情况下，这个向导使用 localhost 作为服务器的主机名，所以需要将它改为自己的远程主机名，见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig4"><u><font color="#5c81a7">图 4</font></u></a>。注意，在本地机器上也需要安装 Geronimo，因为需要使用它的部署工具。在 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig4"><u><font color="#5c81a7">图 4</font></u></a> 中，本地已经安装了一个 Geronimo 运行时；如果不是这样，就需要使用 <b>Installed Runtimes...</b> 按钮设置它。</p>
				<br />
				<a name="fig4">
						<b>图 4. 步骤 1：选择要使用的 J2EE 服务器类型</b>
				</a>
				<br />
				<img height="538" alt="步骤 1：选择要使用的 J2EE 服务器类型" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080608959.jpg" width="518" />
				<br />
				<p>
						<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig5">
								<u>
										<font color="#5c81a7">图 5</font>
								</u>
						</a> 显示连接任何 Geronimo 实例所需的常用信息，比如 Geronimo 使用的 Web、RMI 和 Enterprise JavaBeans（EJB）端口，以及安全凭证。</p>
				<br />
				<a name="fig5">
						<b>图 5. 步骤 2：指定连接 Geronimo 所需的参数</b>
				</a>
				<br />
				<img height="538" alt="步骤 2：指定连接 Geronimo 所需的参数" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080610126.jpg" width="518" />
				<br />
				<p>最后一步是选择要部署到服务器上的应用程序（见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig6"><u><font color="#5c81a7">图 6</font></u></a>）。当然，可以选择其他应用程序来部署到 Eclipse 中配置好的任何服务器上。（关于设置 Eclipse、WTP 和 Geronimo 插件，然后使用 Eclipse 将应用程序部署到 Geronimo 上的详细说明，请参见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#resources"><u><font color="#5c81a7">参考资料</font></u></a>。） </p>
				<br />
				<a name="fig6">
						<b>图 6. 步骤 3：指定要部署的应用程序</b>
				</a>
				<br />
				<img height="538" alt="步骤 3：指定要部署的应用程序" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080612277.jpg" width="518" />
				<br />
				<p>既然已经讨论了进行远程部署的一些不同方法，就让我们使用 Geronimo 部署工具对示例应用程序进行部署。 </p>
				<br />
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600477.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#main">
																						<b>
																								<font face="Verdana" color="#5c81a7">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N101BC">
								<span class="atitle">
										<strong>
												<font size="4">部署示例：部署 remoteApp</font>
										</strong>
								</span>
						</a>
				</p>
				<p>这个示例使用 Apache Geronimo 部署工具。但是，使用 Administration Console 或 Eclipse 来部署这个应用程序也一样容易。在开发期间，选择哪种工具只是个人喜好问题，但是生产系统可能要求使用某种部署工具。</p>
				<p>要使用部署工具，必须确保远程环境能够访问本地文件系统。在 Microsoft® Windows® 环境中，可以通过对网络驱动器进行映射来实现共享。在这个示例中，远程系统有一个映射的网络驱动器 Y:，它映射到本地系统的 %GERONIMO_HOME%/deploy 目录。这是一个合乎逻辑的选择，因为开发人员很可能先在本地对应用程序进行测试；所以应用程序可能已经放在这个目录中了。现在，进行部署的命令就很简单了：</p>
				<font size="2">
						<font face="Courier">
								<code>java -jar %GERONIMO_HOME%/bin/deployer.jar --user system<br />--password manager --host aristotle deploy remoteApp.war </code>
								<br />
								<br />
						</font>
				</font>
				<p>其中，<code><font face="Courier" size="2">aristotle</font></code> 是远程服务器的名称。使用 <code><font face="Courier" size="2">--host</font></code> 选项来指定远程主机而不是使用 URI。没有使用 <code><font face="Courier" size="2">--port</font></code> 选项；因此 Geronimo 将使用默认的 RMI 端口 1099。应该会看到与 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#list4"><u><font color="#5c81a7">清单 4</font></u></a> 相似的输出。</p>
				<br />
				<a name="list4">
						<b>清单 4. 使用部署工具对示例应用程序进行远程部署</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<code>
														<pre class="section">C:\dev\geronimo-1.0\deploy&gt;java -jar %GERONIMO_HOME%/bin/deployer.jar 
--host aristotle --user system --password manager deploy remoteApp.war
    Uploading 1 file(s) to server

    File upload complete (Server: OK)

    1 file(s) transferred to server.  Resuming deployment operation.

    Deployed HelloRemote @ http://aristotle:8080/helloRemote
</pre>
												</code>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>在部署应用程序之后，就可以登录到远程管理控制台并看到应用程序已经出现了（见 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig7"><u><font color="#5c81a7">图 7</font></u></a>）。</p>
				<br />
				<a name="fig7">
						<b>图 7. Geronimo Administration Console：安装的 Web 应用程序</b>
				</a>
				<br />
				<img height="411" alt="Geronimo Administration Console：安装的 Web 应用程序" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080614411.jpg" width="572" />
				<br />
				<p>为了看到已经安装的 Web 应用程序的列表，点击左边菜单中 Applications 文件夹下面的 <b>Web App WARs</b> 链接。应该会在列表的顶部看到 <code><font face="Courier" size="2">HelloRemote</font></code>（这是 Geronimo 部署计划中为应用程序指定的 ID）。注意，Administration Console 显示 <code><font face="Courier" size="2">HelloRemote</font></code> 正在运行，并提供了停止和卸载的功能。它还显示 Geronimo 上运行的其他 Web 应用程序。<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig7"><u><font color="#5c81a7">图 7</font></u></a> 所示的列表显示正在 Geronimo with Jetty 默认安装上运行的所有标准 Web 应用程序。它包含 JavaServer Pages（JSP）和 servlet 示例。还记得前面提到的 remote-deploy Web 应用程序吗？在这个列表中也应该会看到它。 </p>
				<p>当然，确定您的 Web 应用程序正在运行的最容易的方法是，直接从 Web 浏览器访问它。在使用 Geronimo 部署工具部署示例应用程序时，它提供了 Web 应用程序的 URL。将这个地址输入浏览器中，应该会看到与 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig8"><u><font color="#5c81a7">图 8</font></u></a> 相似的显示。</p>
				<br />
				<a name="fig8">
						<b>图 8. 部署在远程服务器上的 remoteApp</b>
				</a>
				<br />
				<img height="119" alt="部署在远程服务器上的 remoteApp" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080617455.jpg" width="572" />
				<br />
				<p>
						<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#fig8">
								<u>
										<font color="#5c81a7">图 8</font>
								</u>
						</a> 所示的结果说明这个应用程序已经部署到了远程服务器上并正在运行。</p>
				<br />
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600477.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#main">
																						<b>
																								<font face="Verdana" color="#5c81a7">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N10234">
								<span class="atitle">
										<strong>
												<font size="4">结束语</font>
										</strong>
								</span>
						</a>
				</p>
				<p>远程部署是任何 J2EE 应用服务器的必要特性。它是使 Java 技术非常适合企业环境的原因之一。Geronimo 完全实现了 JSR 88，从而以标准化方式提供了远程部署功能。它还提供其他部署方法来简化应用程序的开发、部署和测试。</p>
				<br />
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600477.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#main">
																						<b>
																								<font face="Verdana" color="#5c81a7">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="resources">
								<span class="atitle">
										<strong>
												<font size="4">参考资料 </font>
										</strong>
								</span>
						</a>
				</p>
				<strong>学习</strong>
				<br />
				<ul>
						<li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/opensource/library/os-ag-remotedeploy/?S_TACT=105AGX52&amp;S_CMP=cn-a-os" target="_blank"><u><font color="#5c81a7">英文原文</font></u></a> 。<br /><br /></li>
						<li>阅读 “<a href="http://www.ibm.com/developerworks/cn/opensource/os-gerplug/index.html"><u><font color="#5c81a7">创建、部署和调试 Apache Geronimo 应用程序</font></u></a>” （developerWorks，2005 年 5 月），学习如何使用 Eclipse 将应用程序部署到 Geronimo 远程实例上。<br /><br /></li>
						<li>阅读 “<a href="http://www.ibm.com/developerworks/cn/opensource/os-boynes/"><u><font color="#5c81a7">构建更佳的 J2EE 服务器，开源之路</font></u></a>” （developerWorks，2005 年 5 月），这篇文章介绍了 Geronimo 背后的开发过程，包括它的 JSR 88 支持。<br /><br /></li>
						<li>阅读 “<a href="http://www.ibm.com/developerworks/cn/java/j-geron1/"><u><font color="#5c81a7">Geronimo！第 1 部分: 支持 J2EE 1.4 引擎</font></u></a>” （developerWorks，2005 年 5 月），了解 Geronimo 对完整 J2EE 1.4 规范的支持。<br /><br /></li>
						<li>阅读 <a href="http://www.jcp.org/en/jsr/detail?id=88"><u><font color="#5c81a7">JSR 88</font></u></a> 的 JCP 规范。<br /><br /></li>
						<li>阅读 “<a href="http://www.ibm.com/developerworks/cn/opensource/os-ag-deploy/index.html"><u><font color="#5c81a7">了解 Geronimo 的部署架构</font></u></a>” （developerWorks，2005 年 8 月），这篇文章详细描述了 Geronimo 部署计划以及 Geronimo 如何使用它们。<br /><br /></li>
						<li>访问 <a href="http://www.ibm.com/developerworks/cn/opensource"><u><font color="#5c81a7">developerWorks 开放源码专区</font></u></a>，这里有丰富的 how-to 信息、工具和项目更新，可以帮助您利用开放源码技术进行开发并将其用于 IBM 产品。<br /><br /></li>
						<li>访问 <a href="http://www.ibm.com/developerworks/cn/opensource/top-projects/geronimo.html"><u><font color="#5c81a7">developerWorks Apache Geronimo 项目区</font></u></a>，这里的文章、教程和其他参考资料可以帮助您马上开始使用 Geronimo 进行开发。<br /><br /></li>
						<li>查阅 <a href="http://www.ibm.com/software/webservers/appserv/geronimo/?S_TACT=105AGX44&amp;S_CMP=GRNMO"><u><font color="#5c81a7">IBM Support for Apache Geronimo</font></u></a> 提供的内容，从而在具有世界级水平的 IBM 支持下开发 Geronimo 应用程序。<br /><br /></li>
						<li>在 <a href="http://www.ibm.com/developerworks/cn/opensource/top-projects/geronimo-starthere.html"><u><font color="#5c81a7">developerWorks 的 Get started now with Apache Geronimo 部分</font></u></a>，查找面向初学者和有经验用户的有用参考资料。<br /><br /></li>
						<li>阅读 <a href="http://www.ibm.com/developerworks/cn/views/opensource/articles.jsp?view_by=search&amp;search_by=Geronimo+%E5%8F%9B%E9%80%86%E8%80%85"><u><font color="#5c81a7">Geronimo 叛逆者专栏</font></u></a>，了解 Apache Geronimo 项目的最新信息。<br /><br /></li>
						<li>了解关于 <a href="http://www.eclipse.org/webtools/"><u><font color="#5c81a7">Eclipse Web Tools Platform</font></u></a> 的更多信息。<br /><br /></li>
						<li>浏览 developerWorks 专区上所有的 <a href="http://www.ibm.com/developerworks/cn/views/opensource/articles.jsp?view_by=search&amp;search_by=apache"><u><font color="#5c81a7">Apache 文章</font></u></a> 和 <a href="http://www.ibm.com/developerworks/cn/views/opensource/tutorials.jsp?view_by=search&amp;search_by=apache"><u><font color="#5c81a7">免费 Apache 教程</font></u></a>。<br /><br /></li>
						<li>在 <a href="http://safari.bvdep.com/?x=1&amp;portal=bvdep&amp;uicode=&amp;Key=&amp;GUID=D1F1DB57-50AF-4998-99-DA-6D-BB-A5-E0-E4-0B"><u><font color="#5c81a7">Safari 书店</font></u></a> 浏览关于这些主题和其他技术主题的图书。</li>
				</ul>
				<br />
				<b>获得产品和技术</b>
				<br />
				<ul>
						<li>下载 <a href="http://geronimo.apache.org/downloads.html"><u><font color="#5c81a7">Apache Geronimo</font></u></a> 的最新版本。<br /><br /></li>
						<li>使用 <a href="http://www.ibm.com/developerworks/downloads/?S_TACT=105AGX52&amp;S_CMP=cn-a-os"><u><font color="#5c81a7">IBM 试用软件</font></u></a> 改进您的下一个开放源码开发项目，这些软件可以下载或者通过 DVD 获得。<br /><br /></li>
						<li>下载 <a href="http://www.ibm.com/developerworks/downloads/ws/wasce/?S_TACT=105AGX52&amp;S_CMP=cn-a-os"><u><font color="#5c81a7">IBM WebSphere® Application Server Community Edition V1.0</font></u></a> 的免费副本，这是一个在 Apache Geronimo 开放源码技术上构建的轻量级 J2EE 应用服务器，用来帮助加速开发和部署工作。<br /><br /></li>
				</ul>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600477.gif" width="100%" />
												<br />
												<img height="6" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="8" border="0" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<img height="4" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="100%" />
												<br />
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/index.html?ca=drs-#main">
																						<b>
																								<font face="Verdana" color="#5c81a7">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="author">
								<span class="atitle">
										<strong>
												<font size="4">关于作者</font>
										</strong>
								</span>
						</a>
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td colspan="3">
												<strong>
														<font size="4">
																<img height="5" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="100%" />
														</font>
												</strong>
										</td>
								</tr>
								<tr valign="top" align="left">
										<td>
												<p>
														<strong>
																<font size="4">
																</font>
														</strong>
												</p>
										</td>
										<td>
												<strong>
														<font size="4">
																<img height="5" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200609/20060901080600306.gif" width="4" />
														</font>
												</strong>
										</td>
										<td width="100%">
												<p>Michael Galpin 拥有 California Institute of Technology 的数学学位。他从 20 世纪 90 年代晚期开始成为 Java 开发人员，作为软件工程师为加州 Sunnyvale 的 Vitria Technology 公司工作。</p>
										</td>
								</tr>
						</tbody>
				</table>
				<center>
				</center>
		</div>
<img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/17094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-09-20 11:21 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/09/20/17094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建、部署和调试 Apache Geronimo 应用程序</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/20/17093.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Wed, 20 Sep 2006 02:48:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/20/17093.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/17093.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/20/17093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/17093.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/17093.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<h1>创建、部署和调试 Apache Geronimo 应用程序</h1>
										<p id="subtitle">如何使用针对 Geronimo 的新 Eclipse 插件 </p>
										<img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
								</td>
								<td class="no-print" width="192">
										<img height="18" alt="developerWorks" src="http://www-128.ibm.com/developerworks/cn/i/dw.gif" width="192" />
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%">
										<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
												<tbody>
														<tr>
																<td width="10">
																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
																</td>
																<td>
																		<table cellspacing="0" cellpadding="0" width="150" border="0">
																				<tbody>
																						<tr>
																								<td class="v14-header-1-small">文档选项</td>
																						</tr>
																				</tbody>
																		</table>
																		<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td class="no-padding" width="150">
																										<table cellspacing="0" cellpadding="0" width="143" border="0">
																												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																												<form name="email" action="https://www-128.ibm.com/developerworks/secure/email-it.jsp">
																														<input type="hidden" value="Eclipse 项目在过去几年中一直为开放源码社区提供高质量的和可扩展的集成开发环境。开始学习使用新的 Eclipse 插件来开发和部署 Web 应用程序到 Apache Geromimo 服务器吧。IBM 高级技术人员 Tim Francis 将为您介绍其中的细节。" name="body" />
																														<input type="hidden" value="创建、部署和调试 Apache Geronimo 应用程序" name="subject" />
																														<input type="hidden" value="cn" name="lang" />
																														<script language="JavaScript" type="text/javascript">
																																<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><b>将此页作为电子邮件发送</b></a></p></td></tr>');
//-->
																														</script>
																														<tbody>
																																<tr valign="top">
																																		<td width="8">
																																				<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																																		</td>
																																		<td width="16">
																																				<img height="16" alt="将此页作为电子邮件发送" src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" />
																																		</td>
																																		<td width="122">
																																				<p>
																																						<a class="smallplainlink" href="javascript:document.email.submit();">
																																								<b>
																																										<font color="#5c81a7" size="2">将此页作为电子邮件发送</font>
																																								</b>
																																						</a>
																																				</p>
																																		</td>
																																</tr>
																																<noscript>
																																		<tr valign="top">
																																				<td width="8">
																																						<img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif" />
																																				</td>
																																				<td width="16">
																																						<img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif" />
																																				</td>
																																				<td class="small" width="122">
																																						<p>
																																								<span class="ast">未显示需要 JavaScript 的文档选项</span>
																																						</p>
																																				</td>
																																		</tr>
																																</noscript>
																														</tbody>
																												</form>
																										</table>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- 03/20/06 updated by gretchen -->
										<br />
										<table cellspacing="0" cellpadding="0" width="150" border="0">
												<tbody>
														<tr>
																<td class="v14-header-2-small">最新推荐</td>
														</tr>
												</tbody>
										</table>
										<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td class="no-padding" width="150">
																		<table cellspacing="0" cellpadding="0" width="143" border="0">
																				<tbody>
																						<tr valign="top">
																								<td width="8">
																										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																								</td>
																								<td>
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/fw_bold.gif" width="16" vspace="3" border="0" />
																								</td>
																								<td width="125">
																										<p>
																												<a class="smallplainlink" href="http://www-128.ibm.com/developerworks/cn/kickstart/">
																														<font color="#5c81a7" size="2">Java 应用开发源动力 － 下载免费软件，快速启动开发</font>
																												</a>
																										</p>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<p>级别: 初级</p>
		<p>
				<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#author">
						<font color="#996699">Tim Francis</font>
				</a>, 高级技术人员, WebSphere Application Integration Middleware<br /></p>
		<p>2005 年 6 月 06 日</p>
		<blockquote>Eclipse 项目在过去几年中一直为开放源码社区提供高质量的和可扩展的集成开发环境。开始学习使用新的 Eclipse 插件来开发和部署 Web 应用程序到 Apache Geromimo 服务器吧。IBM 高级技术人员 Tim Francis 将为您介绍其中的细节。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N10046">
						<span class="atitle">
								<font face="Arial" size="4">插件为 Eclipse 添加了功能</font>
						</span>
				</a>
		</p>
		<p>Eclipse 平台吸引了许多开发人员，因为可以通过添加功能来扩展其核心能力。Eclipse 为这种扩展能力提供了定义良好的机制。Eclipse 的每一个方面都包含在 <i>插件</i> 中，而插件可以动态扩展其他插件，也可定义自身的 <i>扩展点</i>使其他插件可以扩展它们。插件本身定义了通过这些扩展可以提供的、而不属于基本的 Eclipse 基础设施的功能的类型。例如，扩展可以简单到只是弹出菜单中的一个新项，也可以像一个完全的新型项目、或是一系列的编辑器和视图这样包括众多。</p>
		<p>基本 Eclipse 支持包括 Java 开发工具（Java Development Tool，JDT），它提供了完全的 Java 开发环境。不过，去年宣布了一个名为 Web Tools Platform (WTP) 的新 Eclipse 工具项目，其目的是提供开发 J2EE™ Web 应用程序所需的基本能力。IBM 已经为这个项目贡献了很多的代码，而其他几家公司正在合作开发它。WTP 的首次发布定于 2005 年 7 月 29 日。</p>
		<p>尽管 WTP 项目没有提供当前商业集成开发环境（如 IBM Rational® Application Developer）所具有的高级开发能力或易用的功能，但是它提供了一个公共开放源码库，后者定义了必要的底层结构。这个代码库包括基本项目类型的定义和结构和可以用来修改各种工件的基本编辑器，并支持对应用服务器的定义和交互。（您可以从本文后面的 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#resources"><font color="#996699">参考资料</font></a> 部分中找到更多关于 Eclipse 和 Web Tools Platform的信息）。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10060">
						<span class="atitle">
								<font face="Arial" size="4">Web Tools Platform 和 Apache Geronimo</font>
						</span>
				</a>
		</p>
		<p>WTP 项目当前支持部署项目到几种开放源码和 Web 应用服务器上，包括 Apache Tomcat servlet 容器。一个正在开发的新开放源码项目 —— Apache Geronimo —— 提供了完全的应用服务器，不仅包括 servlet 容器，包括对消息收发的支持，还包括一个包含 JDBC 连接器的数据库和一个门户框架。在 eclipse.org 网站上有一个正在开发的针对 WTP 的新插件，它提供了 WTP 与 Apache Geronimo 之间的集成（该插件的链接请参阅 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#resources"><font color="#996699">参考资料</font></a>）。这个插件允许您将 WTP 作为一个创建、部署和调试 Geronimo 应用程序的很基本的开发环境。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1006E">
						<span class="atitle">
								<font face="Arial" size="4">部署和使用基本 WTP 项目</font>
						</span>
				</a>
		</p>
		<p>在写本文的时候，WTP 项目的 M4 里程碑刚刚发布，并可以下载了（请参阅 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#resources"><font color="#996699">参考资料</font></a>）。正如在 eclipse.org 上对该项目的概述中所说，安装 WTP 需要一些先决条件，在安装 WTP 之前必须先下载并安装它们。这些先决条件包括基本 Eclipse 驱动和其他针对 GEF、EMF 和 Java EMF 模型的驱动。所有这些文件的正确版本的链接可从 eclipse.org 中得到 （请参阅 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#resources"><font color="#996699">参考资料</font></a>）。</p>
		<p>
				<a name="N10080">
						<span class="smalltitle">
								<strong>
										<font face="Arial">下载并解压缩基本 WTP 项目和 Geronimo 插件</font>
								</strong>
						</span>
				</a>
		</p>
		<p>下载了先决条件并解压缩基本 WTP 项目以及最新的 WTP 里程碑构建之后，您可以下载 Geronimo 插件了。在 WTP 以后的构建中会包括该插件，但是如果使用的是 WTP M4 驱动，可以单独下载该插件（请参阅 <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#resources"><font color="#996699">参考资料</font></a>）。将这个插件解压缩到以下位置： eclipse/plugins/org.eclipse.jst.server.geronimo.core_1.0.0。 </p>
		<p>
				<a name="N1008E">
						<span class="smalltitle">
								<strong>
										<font face="Arial">启动 Eclipse</font>
								</strong>
						</span>
				</a>
		</p>
		<p>准备过程的最后一步是用 <code>–clean</code> 选项第一次启动 Eclipse，以确保能识别新插件。启动 Eclipse 之后，您就会看到如下的启动屏幕： </p>
		<br />
		<a name="N1009E">
				<b>图 1. Eclipse 启动屏幕</b>
		</a>
		<br />
		<img height="433" alt="Eclipse 启动屏幕 " src="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/fig1.jpg" width="600" />
		<br />
		<p>启动 Eclipse 后，下一步就是在环境中定义 Geronimo 服务器。选择 <b>File &gt; New file wizard</b> 以创建一个新的服务器。在这个向导的第二页，当提示选择服务器类型时，选择 <b>Apache Geronimo</b>，如图 2 所示。 </p>
		<br />
		<a name="N100B8">
				<b>图 2. 定义一个新的服务器</b>
		</a>
		<br />
		<img height="514" alt="定义一个新的服务器 " src="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/fig2.jpg" width="348" />
		<br />
		<p>然后将提示输入 Apache 服务器的安装位置以及用来定位开发项目的类路径所必需的转移地址寄存器的根目录。在下一页中，可以定义关于服务器的附加信息，尤为重要的是在安装 Geronimo 时指定的管理员用户 ID 和密码。在向导的最后一页上，可以向服务器添加已有的项目。因为还没有创建任何项目，所以就选择 <b>Finish</b>。</p>
		<p>现在您已经获得了在 Eclipse 中启动和停止 Geronimo 服务器所需的足够信息。要看服务器的状态，最容易的方法是进入 J2EE 透视图；选择 <b>Window &gt; Open Perspective &gt; Other</b> 菜单，然后从出现的对话框中选择 J2EE perspective。在这个透视图中，在屏幕的右下角有一个 Servers 视图，如图 3 所示：</p>
		<br />
		<a name="N100D5">
				<b>图 3. J2EE 透视图中的 Servers 视图</b>
		</a>
		<br />
		<img height="433" alt="J2EE 透视图中的 Servers 视图" src="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/fig3.jpg" width="600" />
		<br />
		<p>选择这个视图中的 Geronimo 服务器，并从弹出菜单中选择 <b>start</b>。这将启动服务器并在控制台窗口中显示输出。还可以从调试模式下的同一视图启动服务器。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100EA">
						<span class="atitle">
								<font face="Arial" size="4">创建项目和模块定义</font>
						</span>
				</a>
		</p>
		<p>服务器运行后，下一步就是创建一个在其上运行的应用程序。WTP 支持使您可以在一个 Eclipse 项目中有多个 Web 模块 —— 因此，现在您需要创建项目和模式定义。从 J2EE navigator 中，选中 <b>Dynamic Web Projects</b> 图标，再从弹出菜单中选择 <b>Create a new J2EE Web module</b>。在得到的向导中，可以选择一个已有的项目或者新建一个项目来包含 Web 模块。因为这是一个空白工作区，选择 <b>New</b> 来新建一个项目。在 <b>New project</b> 对话框中，输入项目名并选择 <b>Geronimo</b> 作为目标服务器。完成这个向导之后，输入要创建的新 Web 模块的名字。完成新模块向导之后，将会在 <b>Dynamic Web projects</b> 图标下面看到新创建的项目和模块，如图 4 所示。 </p>
		<br />
		<a name="N10108">
				<b>图 4. 新创建的项目和模块</b>
		</a>
		<br />
		<img height="463" alt="新创建的项目和模块 " src="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/fig4.jpg" width="600" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10117">
						<span class="atitle">
								<font face="Arial" size="4">创建和部署 Web 项目</font>
						</span>
				</a>
		</p>
		<p>在 navigator 视图中展开项目和模块节点，并找到 <b>WebContent</b> 文件夹。这个文件夹包含要放在生成的 Web 应用程序中的文件。从这个图标上的弹出菜单中，新建一个 HTML 文件。可以任意命名这个文件，并在出现的编辑器中输入一些简单的 HTML 文本。在 navigator 视图中，选择刚创建的文件，出现弹出菜单，然后选择 <b>Run As &gt; Run on server</b>。在出现的对话框中，确保选中了 Geronimo 服务器，选择复选框以将 Geronimo 设置为这个项目的默认服务器，然后选择 <b>Finish</b>。现在这个 Web 应用程序就被创建并部署到运行中的 Geronimo 服务器上了，而一个 Web 浏览器将会打开，显示出刚创建的文件。如果不希望打开外部浏览器，那么 Eclipse 可以使用一个嵌入式窗口中的浏览器：如要设置偏好，则选择 <b>Open window &gt; Preferences &gt; General &gt; Web browser</b>。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1012D">
						<span class="atitle">
								<font face="Arial" size="4">在 Eclipse 中调试应用程序</font>
						</span>
				</a>
		</p>
		<p>成功地部署 Web 项目之后，就可以探究如何在 Eclipse 中调试应用程序了。最简单的方法是在刚创建的 Web 应用程序中添加一个 JSP 文件。</p>
		<p>第一步是返回 <b>Navigator</b> 视图，并用弹出菜单在 WebContent 文件夹中新建一个 JSP 文件。在随后打开的 JSP 编辑器中，在 JSP 文件中加入一些非常基本的内容，包括一些嵌入式 Java 代码，如图 5 所示的示例。现在您可以通过双击相应行左栏来在该Java 代码中设置中断点。 </p>
		<p>下一步是在调试模式下重启 Geronimo 服务器。当 WTP 项目完成后，这项操作将自动进行，但是目前您需要在“Debug”模式下手动重启服务器。在右下窗格中选择 <b>Servers</b> 选项卡，并从弹出菜单中停止 Geronimo 服务器，然后再在“Debug”模式下重启它。现在您可以选择新建的 JSP 文件，并从其弹出菜单中选择 <b>Debug as &gt; Debug on server</b>。新建的 JSP 文件会被编译，应用程序会重新部署到服务器上，而调试器会停在设置中断点的位置。现在您可以单步调试 JSP 文件，同时查看并更改变量值，而当您继续执行（使用绿色箭头），JSP 文件就被提交给浏览器。 </p>
		<br />
		<a name="N10148">
				<b>图 5. 向 Web 浏览器提交 JSP文件</b>
		</a>
		<br />
		<img height="463" alt="向 Web 浏览器提交 JSP文件 " src="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/fig5.jpg" width="600" />
		<br />
		<p>您可以对应用程序做任何需要的更改，然后，如上所述，选择 <b>Run on server</b> 操作，将更改重新部署到 Geronimo中。servers 视图的“Publish”操作也会将与所选服务器相关的所有应用程序重新部署。</p>
		<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
				<tbody>
						<tr>
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">
																		<a name="N1015F">
																				<b>使用 Eclipse XML 编辑器</b>
																		</a>
																		<br />
																		<p>这个编辑器预计将会被扩展以支持整个部署计划方案，但是目前您可以用它来编辑这个文件。 </p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10169">
						<span class="atitle">
								<font face="Arial" size="4">部署计划</font>
						</span>
				</a>
		</p>
		<p>Geronimo Web 应用程序在部署计划中定义了它们的基本行为。对于 Web 应用程序来说，这个计划被命名为 geronimo-jetty.xml，它在 WebContent &gt; WEB-INF 目录中。在将应用程序部署到 Geronimo 中时，如果还没有基本部署计划，就会自动创建一个。您必须修改这个文件来为应用程序指定一个新的上下文路径。有一个编辑器可用来操纵这个文件的基本方面。要使用这个编辑器，在 navigator 视图中找到该文件，并选择 <b>Open with &gt; Deployment plan editor</b> 来打开编辑器。部署计划的一些方面还没有展现在编辑器中，这些数据没有显示在编辑器中，但是保存文件时它们也不会丢失。</p>
		<br />
		<a name="N10179">
				<b>图 6. Geronimo 部署计划编辑器</b>
		</a>
		<br />
		<img height="463" alt=" Geronimo 部署计划编辑器" src="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/fig6.jpg" width="600" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10188">
						<span class="atitle">
								<font face="Arial" size="4">结束语</font>
						</span>
				</a>
		</p>
		<p>Geronimo 服务器适配器插件还处于初期。它为与 Geronimo 的交互提供了基本支持，但是还需要做很多改进和完善。该插件是作为 Eclipse WTP 项目的一部分开发的，欢迎有兴趣的开发人员访问 Eclipse 网站并为该插件仍在进行的开发尽一份力。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">
								<font face="Arial" size="4">参考资料 </font>
						</span>
				</a>
		</p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/opensource/library/os-gerplug/" target="_blank"><font color="#5c81a7">英文原文</font></a>。<br /><br /></li>
				<li>从 eclipse.org 获得关于 <a href="http://www.eclipse.org/webtools/"><font color="#5c81a7">Web Tools Platform</font></a> 项目的更多信息。<br /><br /></li>
				<li>从 eclipse.org 下载 WTP 的 <a href="http://download.eclipse.org/webtools/downloads/drops/S-1.0M4-200504292037/"><font color="#996699">M4 里程碑</font></a>。<br /><br /></li>
				<li>从 eclipse.org 下载提供了 WTP 与 Apache Geronimo 之间交互的 <a href="http://www.eclipse.org/webtools/development/news/geronimo.html"><font color="#5c81a7">插件</font></a>。<br /><br /></li>
				<li>参阅 developerWorks <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-boynes/"><font color="#5c81a7">访谈 Jeremy Boynes</font></a> （developerWorks，2005 年 5 月）以了解 Gluecode acquisition 的概况以及它对开放源码开发的意义。 <br /><br /></li>
				<li>Tim 与人合著了 <a href="http://devworks.krcinfo.com/WebForms/ProductDetails.aspx?ProductID=0764543660"><font color="#5c81a7"><i>Professional IBM WebSphere 5.0 Application Server</i></font></a>(Wrox Press，2002 年），它详细介绍了如何针对 IBM WebSphere® Application Server Version 5.0 来开发、部署和管理企业应用程序。<br /><br /></li>
				<li>在 developerWorks 上寻找更多 <a href="http://www.ibm.com/developerworks/views/opensource/articles.jsp?sort_order=desc&amp;expand=&amp;sort_by=Date&amp;show_abstract=false&amp;view_by=Eclipse&amp;search_by="><font color="#5c81a7">针对 Eclipse 用户的文章</font></a>。<br /><br /></li>
				<li>请访问 developerWorks <a href="http://www-128.ibm.com/developerworks/cn/opensource"><font color="#5c81a7">developerWorks 开放源码专区</font></a> 以得到大量 how-to 信息、工具和项目更新，它们会帮助您用开放源码技术进行开发并使用到 IMB 的产品上。<br /><br /></li>
				<li>利用 <a href="http://www.ibm.com/developerworks/downloads/?S_TACT=105AGX44"><font color="#5c81a7">IBM 测试软件</font></a> 改革您的下一个开放源码开发项目，可以下载它或者使用 DVD。<br /><br /></li>
				<li>在 Developer Bookstore 的开放源码专区中可以找到数百种 <a href="http://devworks.krcinfo.com/WebForms/ProductList.aspx?Search=Category&amp;id=1400"><font color="#5c81a7">关于开放源码的打折书籍</font></a>，包括许多 <a href="http://devworks.krcinfo.com/WebForms/ProductList.aspx?search=FreeText&amp;SearchT=Keyword&amp;txtSearch=apache"><font color="#5c81a7">关于 Apache 的书籍</font></a>、<a href="http://devworks.krcinfo.com/WebForms/ProductList.aspx?search=FreeText&amp;SearchT=Keyword&amp;txtSearch=eclipse"><font color="#5c81a7">关于 Eclipse 的书籍</font></a> 和 <a href="http://devworks.krcinfo.com/WebForms/ProductList.aspx?search=FreeText&amp;SearchT=Keyword&amp;txtSearch=j2ee"><font color="#5c81a7">关于 J2EE 的书籍</font></a>。<br /><br /></li>
				<li>通过参与 <a href="http://www.ibm.com/developerworks/blogs/"><font color="#5c81a7">developerWorks blogs</font></a> 加入 developerWorks 社区。<br /></li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">
								<font face="Arial" size="4">关于作者</font>
						</span>
				</a>
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<font face="Arial" size="4">
												<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										</font>
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
												<font face="Arial" size="4">
														<img height="80" alt="Tim Francis" src="http://www.ibm.com/developerworks/i/p-tfrancis.jpg" width="64" align="left" />
												</font>
										</p>
								</td>
								<td>
										<font face="Arial" size="4">
												<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
										</font>
								</td>
								<td width="100%">
										<p>Tim Francis 是 IBM 加拿大多伦多实验室 WebSphere Tools 团组的高级技术人员和架构师。他在滑铁卢大学取得了应用电子工程学学士学位（BASc）和软件工程数学硕士学位（MMath），并于 1990 年加入 IBM。Tim 是 WebSphere Architecture Board 的高级成员，并且是 Rational Tools Development Council 的核心成员。Tim 与人合著了 J2EE 书籍 <i><a href="http://devworks.krcinfo.com/WebForms/ProductDetails.aspx?ProductID=0764543660"><font color="#5c81a7">Professional IBM WebSphere 5.0 Application Server</font></a></i>（Wrox Press，2002 年）。</p>
								</td>
						</tr>
				</tbody>
		</table>引用地址：<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html">http://www-128.ibm.com/developerworks/cn/opensource/os-gerplug/index.html</a><img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/17093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-09-20 10:48 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/09/20/17093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit入门 </title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/15/16881.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Fri, 15 Sep 2006 06:47:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/15/16881.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/16881.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/15/16881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/16881.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/16881.html</trackback:ping><description><![CDATA[
		<table style="WORD-BREAK: break-all" cellspacing="0" cellpadding="0" width="700" align="center" border="0">
				<tbody>
						<tr>
								<td align="middle" height="25">
										<font face="黑体" size="4">JUnit入门</font>
								</td>
						</tr>
						<tr bgcolor="#f9f9f9">
								<td align="middle" height="30">作者：佚名    来自：未知</td>
						</tr>
						<tr bgcolor="#f9f9f9">
								<td id="fontzoom" style="LINE-HEIGHT: 200%">
										<p>　　<strong>一、简介</strong></p>
										<p>　　JUnit是一个开源的java单元测试框架。在1997年，由 Erich Gamma 和 Kent Beck 开发完成。这两个牛人中 Erich Gamma 是 GOF 之一；Kent Beck 则在 XP 中有重要的贡献（你觉得眼熟一点都不奇怪）。<br />　　正如常言道：“麻雀虽小，五脏俱全。” JUnit设计的非常小巧，但是功能却非常强大。<br />　　下面是JUnit一些特性的总结：<br />　　1) 提供的API可以让你写出测试结果明确的可重用单元测试用例<br />　　2) 提供了三种方式来显示你的测试结果，而且还可以扩展<br />　　3) 提供了单元测试用例成批运行的功能<br />　　4) 超轻量级而且使用简单，没有商业性的欺骗和无用的向导<br />　　5) 整个框架设计良好，易扩展  <br />　　对不同性质的被测对象，如Class，Jsp，Servlet，Ejb等，Junit有不同的使用技巧。由于本文的性质，以下仅以Class测试为例。</p>
										<p>　　<strong>二、下载</strong></p>
										<p>　　点击<a href="http://www.junit.org/" target="_blank">http://www.junit.org</a>可以下载到最新版本的JUnit，本文使用的为3.8.1版。至于安装或者配置之类，你只需要轻松的将下载下来的压缩包中的jar文件，放到你工程的classpath中就可以了。<br />　　这样，你的系统中就可以使用JUnit编写单元测试代码了（是不是很简单）！</p>
										<p>　　<strong>三、HelloWorld</strong></p>
										<p>　　记得在几乎每本语言教学书上都能找到HelloWorld这个入门代码。今天在这里，我们也从一个简单到根本不用单元测试的例子入手。这是一个只会做两数加减的超级简单的计算器（小学一年级必备极品）。代码如下：</p>
										<p>public class SampleCalculator<br />{<br />       public int add(int augend , int addend)<br />       {<br />              return augend + addend ;<br />       }</p>
										<p>       public int subtration(int minuend , int subtrahend)</p>
										<p>       {</p>
										<p>              return minuend - subtrahend ;</p>
										<p>       }</p>
										<p>}</p>
										<p>　　将上面的代码编译通过。下面就是我为上面程序写的一个单元测试用例：</p>
										<p>//请注意这个程序里面类名和方法名的特征<br />import junit.framework.TestCase;<br />public class TestSample extends TestCase</p>
										<p>{</p>
										<p>       public void testAdd()</p>
										<p>       {      </p>
										<p>SampleCalculator calculator = new SampleCalculator();    </p>
										<p>              int result = calculator.add(50 , 20);</p>
										<p>              assertEquals(70 , result);</p>
										<p>       }</p>
										<p>       public void testSubtration()</p>
										<p>       {</p>
										<p>              SampleCalculator calculator = new SampleCalculator();</p>
										<p>              int result = calculator.subtration(50 , 20);</p>
										<p>              assertEquals(30 , result);</p>
										<p>       }</p>
										<p>}</p>
										<p>　　好了，在DOS命令行里面输入javac  TestSample.java 将测试类编译通过。然后再输入 java  junit.swingui.TestRunner TestSample 运行测试类，你会看到如下的窗口。 </p>
										<p>　　绿色说明单元测试通过，没有错误产生；如果是红色的，则就是说测试失败了。这样一个简单的单元测试就完成了.</p>
										<p>　　按照框架规定：编写的所有测试类，必须继承自junit.framework.TestCase类；里面的测试方法，命名应该以Test开头，必须是public void 而且不能有参数；而且为了测试查错方便，尽量一个TestXXX方法对一个功能单一的方法进行测试；使用assertEquals等junit.framework.TestCase中的断言方法来判断测试结果正确与否。</p>
										<p>　　你可以对比着上面测试类中的实现来体会下规定——很简单！而且你在这个测试类中有加入多少个测试方法，就会运行多少个测试方法。</p>
										<p>　　<strong>四、向前一步</strong></p>
										<p>　　学完了HelloWorld，你已经可以编写标准的单元测试用例了。但是还有一些细节，这里还要说明一下。不要急，很快的！<br />　　另外你是否注意到，上面弹出窗口的一个细节，在绿条下面有Errors、Failures统计。这两者有何区别呢？<br />　　Failures作为单元测试所期望发生的错误，它预示你的代码有bug，不过也可能是你的单元测试代码有逻辑错误（注意是逻辑错误）。Errors不是你所期待的，发生了Error你可以按照下面的顺序来检查：</p>
										<p>　　检查测试所需的环境，如：数据库连接</p>
										<p>　　检查单元测试代码</p>
										<p>　　检查你的系统代码</p>
										<p>　　<strong>五、成批运行test case</strong></p>
										<p>　　这是前面提到的JUnit特性之一。它方便于系统单元测试的成批运行。使用起来也是非常简单，先看下使用代码：</p>
										<p>import junit.framework.Test;</p>
										<p>import junit.framework.TestSuite;</p>
										<p>public class TestAll{</p>
										<p>    public static Test suite(){</p>
										<p>        TestSuite suite = new TestSuite("TestSuite Test");</p>
										<p>        suite.addTestSuite( TestSample.class);</p>
										<p>        return suite;</p>
										<p>    }</p>
										<p>}</p>
										<p>　　这个测试程序的编译、运行，和上面TestSample的方式是一样的。</p>
										<p>　　javac  TestAll.java</p>
										<p>　　java  junit.swingui.TestRunner TestAll</p>
										<p>　　怎么样？这样你在suite方法里面添加几个TestCase就会运行几个，而且它也可以添加TestSuite来将小一点的集合加入大的集合中来，方便了对于不断增加的TestCase的管理和维护。</p>
										<p>　　你觉得suite方法的作用是不是于java应用程序的main很类似？并且这里的suite必须严格遵守上面的写法！<br />本文引自：<a href="http://www.javafan.net/article/20051227090707319.html">http://www.javafan.net/article/20051227090707319.html</a></p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/16881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-09-15 14:47 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/09/15/16881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat和Apache的集成 </title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/12/16725.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Tue, 12 Sep 2006 03:41:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/12/16725.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/16725.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/09/12/16725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/16725.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/16725.html</trackback:ping><description><![CDATA[
		<strong>Connector的选择</strong>
		<br />　　选择合适的Connector对于性能、配置的方便性有很重要的影响，目前大致上有JK1。x， JK2， mod_webapp三种connector可以使用。 JK使用比较广泛。JK2是JK1.x的改进，比较新。但是不太容易配置，相关的文档也比较少。此外，JK可以支持其他Web服务器和tomcat的集成。 但mod_webapp不支持。 因此，目前JK1.x是最好的选择。 <br />　　获得JK <br />　　<br />　　<b>使用二进制版本</b><br />　　如果你对手工编译源代码心有余悸，使用二进制版本也许是个明智的选择。你可以从http://apache。linuxforum。net/dist/jakarta/tomcat-connectors/jk/binaries/下载JK1.x的最新版本。 <br />　　然而，不幸的是二进制版本的JK和Apache的版本是捆绑在一起的，如果你使用了比较新的Apache(比如httpd-2.0.29)的话，往往很难找到对应的二进制版本的JK。 <br />　　<br />　　<b>手工编译源代码</b><br />　　对于不同的操作系统和Apache的版本，如果没有预编译好的JK，则需要进行手工编译。除了Linux以外，其他操作系统一般不会安装编译环境。这时你还需要安装编译器。典型的例子是在Solaris上安装GCC，或是在Windows上安装Visual C++。另外，通常Open Source的软件一般都是用GNU的autoconf、automake生成自动配置脚本和Makefile的，JK也不例外。除了Linux以外的Unix系统中的make不一定能够兼容这些脚本。 所以如果你碰到这些问题就需要安装gmake。下面以Solaris8为例说明如何安装配置编译环境： <br />　　在Solaris8中系统自带的make不能兼容automake产生的某些Makefile。 <br />　　需要的软件包： <br />　　gcc-3.3-sol9-sparc-local.gz <br />　　make-3.80-sol8-sparc-local.tar.gz <br />　　所有需要的软件包都可以在www.sunfreeware.com上下载到。 <br />　　解压缩： <br />　　代码: <br />　　$gunzip gcc-3.3-sol9-sparc-local.gz <br />　　$gunzip make-3.80-sol8-sparc-local.gz <br />　　<br />　　用pkgadd安装，需要root权限: <br />　　代码: <br />　　#pkgadd -d gcc-3.3-sol9-sparc-local <br />　　#pkgadd -d make-3.80-sol8-sparc-local <br />　　用pkgadd安装后，通常gcc， make会被安装在/usr/local/bin目录下。这是需要让gmake <br />　　成为系统默认的make。检查PATH环境变量，确保/usr/local/bin目录的位置在Solaris8自带的make的bin之前: <br />　　代码: <br />　　$which make <br />　　/usr/ccs/bin/make <br />　　$echo $PATH <br />　　/usr/bin:/usr/ccs/bin:/usr/local/bin <br />　　<br />　　如果发现gmake还不是系统默认的make，可以修改/etc/profile调整PATH。但有一种更简单有效的方法，在/usr/bin目录下建一个到/usr/local/bin/make的符号连接make，这样就能使gmake成为系统默认的make了： <br />　　代码: <br />　　# cd /usr/bin <br />　　# ln -s /usr/local/bin/make make <br />　　同样的技巧可以解决一些Perl脚本对perl解释器可执行文件路径引用的不正确。如某个perl脚本的头信息有#!/usr/local/bin/perl -w但Perl在系统上被安装在/usr/bin/目录下。这时需要在 <br />　　/usr/local/bin/下建立一个到/usr/bin/perl的符号连接perl。 <br />　　编译完JK后，把它安装到apache中去，执行： <br />　　代码: <br />　　# make install <br />　　如果不成功，可以手工把mod_jk.so拷贝到apache的modules目录下。 <br />　　配置 <br />　　在具体动手配置之前应该考虑一下你集成的目标：仅仅是简单的把某个subcontext由tomcat处理，还是更高层次的动态/静态内容整合？是否允许HTTPS的转发;是否要进行负载平衡？具体配置的复杂度会因你的集成目标不同而大相径庭。 <br />　　<br />　　假定我们的集成目标是: <br />　　1. 所有的静态资源由Apache处理 <br />　　2. 所有的动态资源由Tomcat处理 <br />　　配置Tomcat <br />　　apache和tomcat整合大致上有三种方式： <br />　　1. 在apache进程中运行tomcat来处理动态内容 <br />　　2. 通过ajp13协议，apache将动态内容的请求转发给tomcat <br />　　3. 使用本地高速Unix domain socket，apache将动态内容的请求转发给tomcat <br />　　<br />　　方式2可以将apache和tomcat分布在不同的机器上，从而可以实现负载平衡。方式3速度比较快，当apache和tomcat分布在相同的机器上时可以考虑使用。 <br />　　本文以方式2的为例说明tomcat和apache的集成。 <br />　　为了能处理ajp13请求，tomcat需要起一个服务。 这是通过在tomcat的server.xml中定义一个Connector来实现的。 在最新的tomcat4.1.30版本中该Connector默认情况下是启用的。如果没有启用在server.xml加入 <br />　　代码: <br />　　　　&lt;Connector className="org。apache。coyote。tomcat4。CoyoteConnector" <br />　　　　　　　　　 port="8009" minProcessors="5" maxProcessors="75" <br />　　　　　　　　　 enableLookups="true" redirectPort="8443" <br />　　　　　　　　　 acceptCount="10" debug="0" connectionTimeout="20000" <br />　　　　　　　　　 useURIValidationHack="false" <br />　　　　　　　　　 protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/&gt; <br />　　<br />　　启动tomcat， 检查ajp13服务是否运行 <br />　　netstat -a | grep 8009 <br />　　或则查看tomcat标准输出上是否有类似的输出： <br />　　代码: <br />　　info: JK2: ajp13 listening on /0.0.0.0:8009 <br />　　2004-5-22 14:50:35 org.apache.jk.server.JkMain start <br />　　info: Jk running ID=0 time=20/200　config=D:\Tomcat4.1\conf\jk2.properties <br />　　<br />　　<b>配置Apache</b><br />　　配置完Tomcat后，进行Apache的配置。首先，我们需要确定整个web应用所在的context，确定了context也就能确定用户通过什么样的URL可以访问该web应用。比如，网站为www.example.com， 如果web应用的context为purchase，那么用户可以通过URL http://www.example.com/purchase访问该应用;如果web应用的context为/，那么用户可以通过URL http://www.example.com访问该应用。一般而言，将web应用的context设定为/可以方便用户。如果存在多个独立的应用，可以考虑把它们放到不同的子context中去。下面介绍把应用context设为/情况下如何配置，其他情况类似。将jk的配置放在一个独立的文件里，然后在httpd。conf中Include该文件即可。 <br />　　第一步，让apache加载mod_jk: <br />　　代码: <br />　　#mod jk for tomcat-apache integration <br />　　LoadModule jk_module modules/mod_jk.so <br />　　<br />　　把应用context映射到存放该应用静态资源的目录: <br />　　代码: <br />　　# Static files in the examples webapp are served by apache <br />　　Alias / /www/tomcat4。1/webapps/ROOT/　<br />　　<br />　　同时，因为现在静态资源不是由tomcat处理了，所以出于安全考虑和遵守JSP/Servlet规范需要禁止对WEB-INF子目录的访问： <br />　　代码: <br />　　# The following line prohibits users from directly access WEB-INF <br />　　&lt;Location "ROOT/WEB-INF/"&gt; <br />　　　AllowOverride None <br />　　　deny from all <br />　　&lt;/Location&gt; <br />　　<br />　　在集成的调试阶段可以考虑允许目录列表功能： <br />　　代码: <br />　　&lt;Directory "/www/tomcat4。1/webapps/ROOT"&gt; <br />　　　　AllowOverride FileInfo AuthConfig Limit Indexes <br />　　　　Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec <br />　　&lt;/Directory&gt; <br />　　<br />　　接下来一步告诉apache哪些动态内容应该让tomcat处理，为了确定动态内容URL的特征，应该把web.xml中的所有servlet mapping中出现的URL模式在jk.conf中声明： <br />　　代码: <br />　　JkMount /BaseServlet worker1 <br />　　JkMount /Servlet/* worker1 <br />　　JkMount /ProductUploadServlet worker1 <br />　　JkMount /upload worker1 <br />　　JkMount /test worker1 <br />　　JkMount /*.jsp worker1 <br />　　JkMount /*.do worker1 <br />　　<br />　　其它可能需要修改的配置 <br />　　配置项 说明 <br />　　JkWorkersFile 指定jk workers.properties的位置，如果是相对路径，则假定在apache的ServerRoot目录下 <br />　　JkLogFile 指定jk log文件的位置，如果是相对路径，则假定在apache的ServerRoot目录下 <br />　　JkLogLevel 指定jk log的级别有效的选项有：debug/error/info <br />　　JkLogStampFormat 指定log中的时间格式，使用c函数strftime()的格式字符串语法 <br />　　<br />　　总结Tomcat和Apache集成时通常需要一下步骤： <br />　　1. 决定使用哪种connector <br />　　2. 获得connector，如果没有现成的二进制的connector，则需要手工编译，根据操作系统的不同可能还要设置编译环境。 <br />　　3. 配置tomcat <br />　　4. 配置apache，确定context，将context对应到应用的顶层目录。根据web.xml中的servlet映射把所有的动态内容的url模式配置在apache中 <br />　　5. 测试<br />　　<br />　　<b>附录</b><br />　　一个完整的配置例子： <br />　　代码: <br />　　#mod jk for tomcat-apache integration <br />　　LoadModule jk_module modules/mod_jk.so <br />　　<br />　　JkWorkersFile conf/workers.properties <br />　　# Where to put jk logs <br />　　<br />　　JkLogFile logs/mod_jk。log <br />　　# Set the jk log level [debug/error/info] <br />　　JkLogLevel debug <br />　　<br />　　# Select the log format <br />　　JkLogStampFormat "[%Y-%m-%d %H:%M:%S] " <br />　　<br />　　# JkOptions indicate to send SSL KEY SIZE， <br />　　JkOptions +ForwardKeySize +ForwardURICompat +ForwardURICompatUnparsed -ForwardDirectories <br />　　<br />　　# JkRequestLogFormat set the request format <br />　　JkRequestLogFormat "%w %V %T" <br />　　<br />　　# Static 
<p><br />本文引用地址：<a href="http://www.uplinux.net/article/2006/0703/article_963.html">http://www.uplinux.net/article/2006/0703/article_963.html</a></p><div class="content_text" id="11519019862" style="DISPLAY: none"><a href="http://www.uplinux.net/article/2006/0703/article_963.html">来源：Linux起点(http://www.uplinux.net/)<br />作者：tiredboy<br />原文：经验与技巧：Tomcat和Apache的集成(http://www.uplinux.net/article/2006/0703/article_963.html)</a></div><img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/16725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-09-12 11:41 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/09/12/16725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+Spring+Hibernate 的示例（一）（转载）</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/08/05/14767.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Sat, 05 Aug 2006 08:12:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/08/05/14767.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/14767.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/08/05/14767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/14767.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/14767.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
												<tbody>
														<tr>
																<td class="title1" align="middle" width="100%" bgcolor="#eeeeee" colspan="3" height="40">
																		<b>Struts+Spring+Hibernate 的示例（一）</b>
																</td>
														</tr>
														<tr>
																<td valign="top" align="middle" width="100%">
																		<!--start of article content -->
																		<table width="98%" border="0">
																				<tbody>
																						<tr>
																								<td class="text" align="left" width="100%">
																										<br />先说说《Wiring Your Web Application with Open Source Java by Mark Eagle》这个示例，网上有这个的中英文文章。在后续的说明中我会将文章的部分内容引用进来。我使用的开发工具是 Eclipse3.1 + MyEclipse4.0M2。<br /><br /><br />针对一个简单或者复杂的 Web 应用程序，我们需要考虑诸如是怎样建立用户接口？在哪里处理业务逻辑？怎样持久化的数据？而针对这三个层次，每个层次我们都要仔细考虑：各个层该使用什么技术？ 怎样的设计能松散耦合还能灵活改变？ 怎样替换某个层而不影响整体构架？应用程序如何做各种级别的业务处理（比如事务处理）？等等。<br /><br />对于这个示例我们采用当前流行的三种框架来做到 Web 应用程序的松散耦合：表示层我们用 Struts；业务层我们用 Spring；而持久层则用 Hibernate。 <br /><br />Struts 负责管理用户的请求，做出响应；提供控制器，委派调用业务逻辑；处理异常；UI 验证等。<br />Spring 负责处理应用程序的业务逻辑和业务校验；管理事务；提供与其它层相互作用的接口；管理业务层级别的对象的依赖等。<br />Hibernate 负责存储、更新、删除数据库记录等。<br /><br />这篇文章举例说明如何使用这三个框架整合开发，并揭示一个请求是如何贯穿于各个层的。（从用户的加入一个Order到数据库，显示；进而更新、删除）。 <br /><br />1. 首先创建一组对象，这些对象有的需要持久化，有的提供业务逻辑，有的是显示接口的设计。Hibernate 允许你将数据库中的信息存放入对象，可以在连接断开的情况下把这些数据显示到UI层。而那些对象也可以返回给持续层，从而在数据库里更新。<br /><br />使用 myeclipse 的 Web  Project 新建一个项目 SSHTest：<br /><img src="http://www.softstudio.com.cn/LeadBBS/images/upload/2005/08/10/114940.jpg" /><br />创建 Order 类：<br /><img src="http://www.softstudio.com.cn/LeadBBS/images/upload/2005/08/10/114946.jpg" /><br />利用 eclipse 生成 Getters 和 Setters。<br /><br />同样创建 OrderLineItem 类。<br /><br />com.ivan.ssh.bo.Order 包含一个订单的主要信息：订单号，订单总价，订单客户名。<br />com.ivan.ssh.bo.OrderLineItem 包含订单的详细信息：订单单项号，单价，描述。一个订单对应于多个订单项。<br /><br />Order 与 OrderLineItem 的关系是一对多的关系，这里为它们建立双向一对多的关系。<br />在类中我们需要分别为 Order 和 OrderLineItem 添加属性 orderLineItems(java.util.Set 类型) 和 order(Order 类型)及其 getter 和 setter 方法。<br /><br />2. 配置持久层，Hibernate 通过 XML 文件来映射 (OR) 对象，以下两个 xml 文件分别映射了Order 和 OrderItem 对象。<br />Order.hbm.xml:<br />&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC <br /> "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br /> "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd";&gt;<br /><br />&lt;hibernate-mapping&gt;<br />    &lt;class<br />        name="com.meagle.bo.Order"<br />        table="Orders"<br />        dynamic-update="false"<br />        dynamic-insert="false"&gt;<br /><br />        &lt;id<br />            name="id"<br />            column="Order_ID"<br />            type="int"<br />            unsaved-value="0"&gt;<br />            &lt;generator class="native"&gt;<br />            &lt;/generator&gt;<br />        &lt;/id&gt;<br /><br />        &lt;set<br />            name="orderLineItems"<br />            table="OrderLineItem"<br />            lazy="true"<br />            inverse="true"<br />            cascade="save-update"<br />            sort="unsorted"&gt;<br />              &lt;key column="Order_ID"/&gt;<br />              &lt;one-to-many class="com.meagle.bo.OrderLineItem"/&gt;<br />        &lt;/set&gt;<br /><br />        &lt;property<br />            name="userName"<br />            type="string"<br />            update="true"<br />            insert="true"<br />            column="UserName"<br />            not-null="true"<br />            unique="false"/&gt;<br />        &lt;property<br />            name="total"<br />            type="double"<br />            update="true"<br />            insert="true"<br />            column="Total"<br />            not-null="false"<br />            unique="false"/&gt;<br />    &lt;/class&gt;<br />&lt;/hibernate-mapping&gt;<br /><br />OrderLineItem.hbm.xml：<br />&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC <br /> "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br /> "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd";&gt;<br /><br />&lt;hibernate-mapping&gt;<br />    &lt;class<br />        name="com.meagle.bo.OrderLineItem"<br />        table="OrderLineItem"<br />        dynamic-update="false"<br />        dynamic-insert="false"&gt;<br /><br />        &lt;id<br />            name="id"<br />            column="OrderLineItem_ID"<br />            type="int"<br />            unsaved-value="0"&gt;<br />            &lt;generator class="native"&gt;<br />            &lt;/generator&gt;<br />        &lt;/id&gt;<br /><br />        &lt;many-to-one<br />            name="order"<br />            class="com.meagle.bo.Order"<br />            cascade="none"<br />            outer-join="auto"<br />            update="true"<br />            insert="true"<br />            column="Order_ID"/&gt;<br /><br />        &lt;property<br />            name="description"<br />            type="string"<br />            update="true"<br />            insert="true"<br />            column="Description"<br />            not-null="false"<br />            unique="false"/&gt;<br /><br />        &lt;property<br />            name="lineItemPrice"<br />            type="double"<br />            update="true"<br />            insert="true"<br />            column="LineItemPrice"<br />            not-null="false"<br />            unique="false"/&gt;<br />    &lt;/class&gt;<br />&lt;/hibernate-mapping&gt;<br /><br />稍后我们介绍怎样配置 SessionFactory 和 Session，前者说明与哪个数据库通信，使用哪个连接池或使用了 DataSource，加载哪些持久对象，后者用来完成查找、保存、删除和更新这些操作。<br /><br />3. 配置业务层，这里要创建业务服务对象(Business Service Object)，用他们来执行程序的逻辑，调用持久层，得到 UI 层的 requests，处理 transactions，并且控制 exceptions。为了将这些连接起来并且易于管理，我们将使用面向方面的 SpringFramework。Spring 提供了控制倒置(Inversion of Control)和注射依赖设置(Setter Dependency Injection) 这些方式（可供选择），用 XML 文件将对象连接起来。IoC 是一个简单概念（它允许一个对象在上层接受其他对象的创建），用 IoC 这种方式让你的对象从创建中释放了出来，降低了偶合度。<br /><br />我们将用一个 business service object 接收一个 DAO，用它来控制 domain objects 的持久化。 由于在这个例子中使用了 Hibernate，我们可以很方便的用其他持久框架实现同时通知 Spring 有新的 DAO 可以使用了。在面向接口的编程中，你会明白 “注射依赖”模式是怎样松散耦合你的业务逻辑和持久机制的。<br /><br />public interface IOrderService {<br />  public abstract Order saveNewOrder(Order order)<br />     throws OrderException, OrderMinimumAmountException;<br />  public abstract List findOrderByUser(String user) throws OrderException;<br />  public abstract Order findOrderById(int id) throws OrderException;<br />  public abstract void setOrderDAO(IOrderDAO orderDAO);<br />}<br /><br />注意到这段代码里有一个 setOrderDao()，它就是一个DAO Object设置方法（注射器）。<br /><br />其实现类：<br />public class OrderServiceSpringImpl implements IOrderService {<br /><br /> private static final double ORDER_MINIMUM = 100.0;<br /><br /> private IOrderDAO orderDAO;<br /><br /> public Order saveNewOrder(Order order)<br />  throws OrderException, OrderMinimumAmountException {<br /><br />  // do some business logic<br />  if (order != null &amp;&amp; order.getTotal() == 0) {<br /><br />   double total = 0.0;<br /><br />   Set items = order.getOrderLineItems();<br />   Iterator iter = items.iterator();<br />   while (iter.hasNext()) {<br />    OrderLineItem item = (OrderLineItem) iter.next();<br />    total += item.getLineItemPrice();<br />   }<br /><br />   if (total &lt; OrderServiceSpringImpl.ORDER_MINIMUM) {<br />    throw new OrderMinimumAmountException("Order did not exceed the order minimum");<br />   } else {<br />    order.setTotal(total);<br />   }<br />  }<br /><br />  Order savedOrder = null;<br />  try {<br />   savedOrder = getOrderDAO().saveOrder(order);<br />  } catch (RuntimeException e) {<br />   throw new OrderException("Could not save order " + e.toString());<br />  }<br /><br />  return savedOrder;<br /> }<br /><br /> public List findOrderByUser(String user) throws OrderException {<br /><br />  List orders = null;<br />  try {<br />   orders = getOrderDAO().findOrdersPlaceByUser(user);<br />  } catch (RuntimeException e) {<br />   // should really use a logger instead of System.out<br />   System.out.println(<br />    "Could not locate order by user " + e.getMessage());<br />   throw new OrderException(<br />    "Could not locate order by user " + e.getMessage());<br />  }<br />  return orders;<br /> }<br /><br /> public Order findOrderById(int id) throws OrderException {<br /><br />  Order order = null;<br />  try {<br />   order = getOrderDAO().findOrderById(id);<br />  } catch (RuntimeException e) {<br />   // should really use a logger instead of System.out<br />   System.out.println(<br />    "Could not locate order by ID " + e.getMessage());<br />   throw new OrderException(<br />    "Could not locate order by ID " + e.getMessage());<br />  }<br />  return order;<br /> }<br /><br /> public IOrderDAO getOrderDAO() {<br />  return orderDAO;<br /> }<br /><br /> public void setOrderDAO(IOrderDAO orderDAO) {<br />  this.orderDAO = orderDAO;<br /> }<br />}<br /><br />接下去对 DAO 的实现类进行编码。既然 Spring 已经有对 Hibernate 的支持，那这个例子就直接继承 HibernateDaoSupport类了，这个类很有用，我们可以参考 HibernateTemplate（它主要是针对 HibernateDaoSupport 的一个用法，具体可以查看 Spring 的 API）。<br /><br />public interface IOrderDAO {<br /> public  Order findOrderById(final int id);<br /> public abstract List findOrdersPlaceByUser(final String placedBy);<br /> public abstract Order saveOrder(final Order order);<br />}<br /><br />此接口的实现类：<br />public class OrderHibernateDAO<br /> extends HibernateDaoSupport<br /> implements IOrderDAO {<br /><br /> public OrderHibernateDAO() {<br />  super();<br /> }<br /><br /> public Order findOrderById(final int id) {<br /><br />  Order order = (Order) getHibernateTemplate().load(Order.class, new Integer(id));<br />   <br />  if(order.getOrderLineItems().size() &gt; 0){<br />   // collection initialized. <br />  }   <br />  return order;<br /> }<br /><br /> public List findOrdersPlaceByUser(final String placedBy) {<br /><br />  return getHibernateTemplate().executeFind(new HibernateCallback() {<br />   public Object doInHibernate(Session session)<br />    throws HibernateException, SQLException {<br /><br />    StringBuffer sb = new StringBuffer(100);<br />    sb.append("select distinct order ");<br />    sb.append("from Order order ");<br />    sb.append("join order.lineItems lineItems ");<br />    sb.append("where order.placedBy = :placedBy");<br /><br />    sb.append("order by order.id");<br /><br />    Query query = session.createQuery(sb.toString());<br />    query.setString("placedBy", placedBy);<br /><br />    List list = query.list();<br /><br />    return list;<br />   }<br />  });<br /> }<br /><br /> public Order saveOrder(final Order order) {<br />  getHibernateTemplate().save(order);<br />  return order;<br /> }</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>文章来源：<a href="http://www.javaresearch.org/article/showarticle.jsp?column=23&amp;thread=53684">http://www.javaresearch.org/article/showarticle.jsp?column=23&amp;thread=53684</a><img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/14767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-08-05 16:12 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/08/05/14767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组 哈希表 属性类</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/18/10688.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Thu, 18 May 2006 03:57:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/18/10688.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/10688.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/18/10688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/10688.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/10688.html</trackback:ping><description><![CDATA[
		<p>动态小数据操作是WEB开发中不可避免的,这就涉及到<b>数组 哈希表 属性类</b>等几个功能;本文提供本人常用语法和简单解释:</p>
		<p>
				<i>
						<b>一般数组定义</b>
				</i>
		</p>
		<blockquote>
				<p>//定义数组catalogs<br />public static final String[] catalogs = <br />{"Business","Entertainment","Law","Real Estate","Medical","Services","Computers &amp; Internet","Food","Other"};</p>
				<p>//在form中逐个显示数组内容<br />&lt;SELECT name="catalog"&gt;<br />&lt;% <br />for (int i = 0; i &lt; catalogs.length; i++) <br />{ <br />String catalog=(String)catalogs[i];<br />if (i==catalogid) //catalogid是需要selected的int类型<br />　　out.println("&lt;OPTION value="+i+" selected&gt;"+catalog+"&lt;/OPTION&gt;");<br />else<br />　　out.println("&lt;OPTION value="+i+"&gt;"+catalog+"&lt;/OPTION&gt;");<br />}<br />%&gt; <br />&lt;/SELECT&gt; </p>
		</blockquote>
		<p> </p>
		<p>
				<i>
						<b>vector</b>
				</i>
		</p>
		<blockquote>vector是java的动态数组的功能， 随着更多元素加入其中，数组变的更大.<br /><br />public Vector getGraphFile(Hashtable hashtable)<br />{<br />　　Vector vector = new Vector(); <br />　　for(Enumeration enumeration = hashtable.keys(); enumeration.hasMoreElements();) <br />　　{ <br />　　　　String s1 = (String)enumeration.nextElement();<br />　　　　if (isGraphFile(s1))<br />　　　　{<br />　　　　　　vector.addElement(s1);<br />　　　　}<br />　　}<br /><br />　　return vector;<br />} <br />本例是将hashtable 的关键词转为vector数组. 要遍历vector或hashtable使用java的Enumeration 
<p>for (Enumeration e = v.elements(); e.hasMoreElements();) <br />{ <br />　　out.println((String)e.nextElement()); <br />}</p><p>这是将Vector中的值输出.注意使用类型强制转换.</p></blockquote>
		<p>
				<br />
				<i>
						<b>Hashtable</b>
				</i>
		</p>
		<blockquote>
				<p>Hashtable是一个关键字对应关键值的表,使用该表,可以迅速索引到某个值.这个表很好用,补充Vector不足.<br />Hashtable hashtable=new Hashtable();<br />hashtable.put("1","男"); <br />hashtable.put("2","女"); <br />out.println("性别是"+(String)hashtable.get("2")) </p>
				<p>如果一个关键字对应多个关键值,而且这几个关键词中不一定是字符形,可能包含其他复杂类型:<br />//加入数据 <br />hashtable.put(name, new UploadedFile(dir.toString(), fileName,filePart.getContentType()));</p>
				<p>//取数据<br />UploadedFile file = (UploadedFile)hashtable.get(name);<br />return file.getFilesystemName(); //得fileName<br />return file.getContentType(); //得type</p>
				<p>//类 UploadedFile定义:<br />class UploadedFile {</p>
				<p>private String dir;<br />private String filename;<br />private String type;</p>
				<p>UploadedFile(String dir, String filename, String type) {<br />this.dir = dir;<br />this.filename = filename;<br />this.type = type;<br />}</p>
				<p>public String getContentType() {<br />return type;<br />}</p>
				<p>public String getFilesystemName() {<br />return filename;<br />}</p>
				<p>public File getFile() {<br />if (dir == null || filename == null) {<br />return null;<br />}<br />else {<br />return new File(dir + File.separator + filename);<br />}<br />}<br /></p>
		</blockquote>
		<p>台湾蔡学镛先生有专门一篇 <a href="http://www.csdn.net/expert/cxy/9901.htm" target="_blank">谈论Collection</a> 文章,有兴趣者可进一步研究.</p>
		<p>
				<br />
				<b>
						<i>Properties</i>
				</b>
				<br />
		</p>
		<blockquote>
				<p>下面是获取系统属性的方法<br />import java.util.Properties; <br />public class getSystemProperties <br />{ <br />　　public static void main(String args[]) <br />　　{ <br />　　　　//通过获得系统属性构造属性类 prop <br />　　　　Properties prop = new Properties( <br />　　　　System.getProperties() ); <br />　　　　//在标准输出中输出系统属性的内容 <br />　　　　prop.list(System.out); <br />　　} <br />　　　　//根据获取的系统属性确定程序执行流程 <br />} <br /></p>
				<p>属性文件的操作:<br />Properties prop = new Properties();<br />try<br />{ <br />　　FileInputStream fis=new FileInputStream(“firstProp.txt”); <br />}catch (FileNotFoundException ex) {<br />　　throw new Exception("error:"+ex.getMessage()); <br />} <br />prop.load(fis); <br />out.println(getProperty("fruits"))</p>
				<p>
						<br />Properties可以对下列文件格式进行操作:<br />firstProp.txt </p>
				<p>Truth = Beauty<br />Truth:Beauty<br />Truth :Beauty<br />fruits apple, banana, pear, \<br />　　　　cantaloupe, watermelon, \<br />　　　　kiwi, mango<br /></p>
		</blockquote>
<img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/10688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-05-18 11:57 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/05/18/10688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java的Collections框架的理解（Collection接口和Map接口）</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/18/10687.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Thu, 18 May 2006 03:56:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/18/10687.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/10687.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/18/10687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/10687.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/10687.html</trackback:ping><description><![CDATA[在Java 2的Collections框架中，主要包括两个接口及其扩展和实现类：Collection接口和Map接口。两者的区别在于前者存储一组对象，后者则存储一些关键字/值对。<br /><br /><pre class="overflow">public interface java.util.Map {<br /><br />    //Altering Methods<br />    public Object put(Object key, Object value);   <br />    public Object remove(Object key);         <br />    public void putAll(java.util.Map);         <br />    public void clear();   <br /><br />    //Querying Methods<br />    public Object get(Object key);       <br />    public int size();               <br />    public boolean isEmpty();             <br />    public boolean containsKey(Object);       <br />    public boolean containsValue(Object);       <br />    public boolean equals(Object);           <br /><br />    //Viewing Methods<br />    public java.util.Set keySet();             //Gets keys<br />    public java.util.Collection values();       //Gets values<br />    public java.util.Set entrySet();           //Gets mappings<br /><br />    public static interface java.util.Map.Entry {   //a map-entry (single key/value pair)<br />      public Object getKey();             //returns current entry key<br />      public Object getValue();             //returns current entry value<br />      public Object setValue(Object value);     <br />      public boolean equals(Object);         <br />      public int hashCode();                 <br />    }<br />}</pre><br /><br />Map接口提供了方便易用的方法，通过这些方法可以查询、查看、修改当前Map的内容。注意对于Map接口的keySet()方法返回一个Set，Set是Collection接口的一个扩展，包含不重复的一组对象。因为Map中的key是不可重复的，所以得到所有key的keySet()方法返回一个Set对象。Map接口本身还包含了一个Map.Entry接口，一个Map.Entry就是Map中的一个关键字/值对。Map接口中的entrySet()方法就返回了一个集合对象，其中每一个元素都实现了Map.Entry接口。Map接口的get(Object key),put(Object key,Object value),和remove(Object key)方法都有同一个问题。他们的返回类型都是Object，当返回null时，可以猜测为调用那个方法前那个key不存在。但是只有在null不允许作为Map的值时可以这样猜测。所有Map接口的通用实现都允许null作为key或者value，这就说当返回一个null值，就可以意味着很多事情。只是因为通用实现允许null值，你不能下那个映射有null值的结论。如果你确知没有null值，那返回null值就意味着调用那个方法前，映射里并没有那个键。否则，你必须调用containsKey(Object key)来看看那个Key是否存在。<br /><br />Hashtable<br /><br />java.util.Hashtable实现了Map接口，在Hashtable中使用key对象的hashCode()作为对应的对象的相对存储地址，以便实现根据关键字快速查找对象的功能。所以只有一个实现了hashCode()和equals()方法的对象才可作为Hashtable的key。null值不能作为关键字或值。<br /><pre class="overflow">public class java.util.Hashtable extends Dictionary implements Cloneable, Map, Serializable {<br /><br />  //Hashtable constructors<br />  //construct a default Hashtable with default capacity and load of 0.75<br />  public Hashtable();               <br />  //construct a Hashtable with passed capacity and default load of 0.75 <br />  public Hashtable (int initialCapacity); <br />  //construct Hashtable with passed capacity and load <br />  public Hashtable(int initialCapacity, float load); <br />  //construct Hashtable with passed mapping <br />  public Hashtable(Map);             <br />  <br />  //Hashtable specific methods<br />  //checks if Object is in Hashtable <br />  public boolean contains(Object);     <br />  //returns Enumeration of elements in Hashtable <br />  public Enumeration elements();       <br />  //returns Enumeration of keys in hashtable<br />  public Enumeration keys();         <br />  //creates shallow copy of Hashtable(structure copied, but not key/values)<br />  public Object clone();             <br />  //prints out key/value pairs of Hashtable elements<br />  public String toString();           <br />  //reorganizes all elements in Hashtable, and increases Hashtable capacity <br />  protected void rehash();           <br />  <br />  //get Value from passed in key <br />  public Object get(Object);         <br />  //insert key/value pair<br />  public Object put(Object key, Object value);     <br /><br />}</pre><br /><br />Hashtable是Java 2集合框架推出之前的一个老的工具类，在新的Java 2集合框架下，已经被HashMap取代。Hashtable和HashMap的区别主要是前者是同步的，后者是快速失败机制保证不会出现多线程并发错误（Fast-Fail）。在初始化一个Hashtable时，可以指定两个参数：初始容量、负荷，这两个参数强烈的影响着Hashtable的性能。容量是指对象的个数，负荷是指散列表中的实际存储的对象个数和容量的比率。如果初始容量太小，那么Hashtable需要不断的扩容并rehash()，而这是很耗时的；如果初始容量太大，又会造成空间的浪费。负荷则相反，负荷太小会造成空间浪费，负荷太大又会耗时（因为这会造成较多的关键字的散列码重复，Hashtable使用一个链接表来存储这些重复散列码的对象）。容量的缺省值是11，负荷的缺省值是0.75，一般情况下你都可以使用缺省值来生成一个Hashtable。另外，在Hashtable中的大部分的方法都是同步的。<br /><br />HashMap<br /><br />HashMap基本实现了Map接口的全部方法。方法的签名大家看上面的Map接口。这儿主要说说几个Map接口中的方法。<br />按照集合框架的实现，哈希表是单链表作为元素的数组，有着同样索引值的两个或更多入口被一起链结到单链表中。哈希表声明如下：<br />  private Entry[] table;<br />组件类型Entry是Map.Entry接口的实现，Map.Entry声明于Map接口内。下边是Map.Entry接口的简化实现：<br />  <pre class="overflow">private static class Entry implements Map.Entry{<br />    int hashCode;<br />    Object key;<br />    Object value;<br />    Entry next;<br /><br />    Entry(int hashCode,Object key,Object value,Entry next){<br />        This.hashCode=hashCode;<br />        This.key=key;<br />        This.value=value;<br />        This.next=next;<br />    }<br />    public Object getKey(){<br />      return key;<br />    }<br />    public Object getValue(){<br />      return value;<br />    }<br />    public Object setValue(Object value){<br />      Object oldValue=this.value;<br />      This.value=value;<br />      Return oldValue;<br />    }<br />}</pre><br /><br />SortedMap是Map接口的子接口，SortedMap的标准实现是TreeMap，实现了一个排序的Map。<br />这里翻译的是对《Java 规则》（Java Rules）中对Java2的集合框架的研究。<br />详细可以参考Java2源码中的集合实现代码和API doc。<img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/10687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-05-18 11:56 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/05/18/10687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shtml学习（4）--Windows环境下的tomcat + apache配置（转）</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/10/10294.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Wed, 10 May 2006 03:20:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/10/10294.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/10294.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/10/10294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/10294.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/10294.html</trackback:ping><description><![CDATA[
		<span class="javascript" id="text172565">Apache的HTTPD是目前比较受欢迎的网站服务器软件，它不但功能强大，而且完全免费，并且支持市场上流行的各种操作系统(Windows,Linux,Mac os)。同时对于Java Servlet/JSP的支持，通常也会使用同样Apache出品的Tomcat。<br />Tomcat除了支持Java Servlet/JSP之外，也可以当做网站服务器使用，但是在对于静态的html文件、图片文件等的解析效率上不如Apache HTTPD的执行效率高。应用tomcat的服务器如果网站的访问量较大，系统资源占用会明显升高，近日笔者在项目执行过程中遇到这一问题，便也想到同时应用tomcat+apache服务。Apache负责静态资源处理，tomcat负责jsp和java servlet等动态资源的处理。在网上看了不少介绍Apache和Tomcat集成的帖子。大多为互相转贴，有几个关键问题没有讲清楚，并且多数文章讲解中所举的软件版本都已经比较老旧。因而笔者总结自己实际操作的经验，希望对大家有所帮助。<br /><br />准备工作：<br />1、  apache 2.0.55<br />下载地址：http://apache.justdn.org/httpd/binaries/win32/apache_2.0.55-win32-x86-no_ssl.msi<br />2、  Tomcat 5.5<br />下载地址：http://tomcat.apache.org/download-55.cgi<br />3、  JRE1.5.0 update6<br />下载地址：http://java.sun.com/j2se/1.5.0/download.jsp<br />你也可以选择安装JDK,JDK不仅包含了运行java应用程序的支持，同时也包含J2SE的开发包。但如果您只是应用的话，我建议您仅下载JRE即可，为什么？因为它小啊：）<br />4、JK-apache-2.0.55<br />下载地址：<br /><a class="ilink" href="http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/mod_jk-apache-2.0.55.so" target="_blank"><font color="#004080">http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/mod_jk-apache-2.0.55.so</font></a><br />注意jk的版本一定要与你的apache版本相同。Jk下载可以直接到apache.org官网下载，有多种版本，适用于各种操作系统，地址如下：<br /><a class="ilink" href="http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/" target="_blank"><font color="#004080">http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/</font></a><br />windows用户进入win32目录，不同的tomcat对应不同jk文件扩展名不同，有可能是*.dll,或者*.so，根据你的tomcat版本下载合适的jk版本。<br /><br />安装，软件的安装顺序可以适当调整，但是jre(jdk)一定要在tomcat之前安装：<br />1、安装JRE(JDK)<br />此处选择默认安装即可，(旧版本的JDK安装完之后需要设置系统的环境变量，JRE和JDK1.5.0以后版本不设置也没关系。)安装完成之后你可以选择按照下面的示例设置你的系统环境变量：我的电脑-&gt;右键属性-&gt;常规-&gt;高级-&gt;环境变量<br />JAVA_HOME = d:\Java\jre1.5.0_06<br />CLASSPATH = .;d:\Java\jre1.5.0_06\lib\dt.jar;d:\Java\jre1.5.0_06\lib\tools.jar<br />PATH = d:\Java\jre1.5.0_06\bin<br />注意文件路径要改成你实际安装的路径。<br /><br />2、Apache安装<br />此处注意，如果你本机已经装了iis并且占用80端口,务必先在服务中将iis停止或禁用。软件默认安装即可。安装过程中设置Network Domain和Server Name为localhost,设置你的email地址，下方会让你选择only for the current user或for all users。默认选择for all users。这样Apache就会占用80端口，并且做为一个系统服务开机自运行。<br />安装完成之后，你在浏览器中输入http://localhost,将会看到Apache的成功页面.Apache的主目录是d:\Apache\Apache2,此时Apache,已经运行,你可以在窗口的托盘看到他的图标,双击图标，在弹开的窗口选择"Open Apache Monitor",点Stop，停止Apaceh服务，因为下面要安装Tomcat和JK.<br /><br />3、Tomcat安装<br />选择安装目录为了d:\Tomcat,其余为默认安装.成功后在浏览器中输入http://localhost:8080,出现Tomcat页面表示安装成功了。关于tomcat的设置已经有很多非常详细的文章，在此就不再详述了。<br /><br />4、JK的安装<br />把mod_jk_2.0.55.so拷贝到d:\Apache\Apache2\modules\下.<br /><br />以上安装全部完成后,打开cmd命令提示符,运行d:\Apache\Apache2\bin\Apache.exe -t 你将会看到"Syntax OK"，表示Apache配置正常．这个命令非常有用，下面在继续配置Apache的时候还会再次用到。<br /><br />配置服务器：<br /><br />1、配置Tomcat<br />查找目录下的conf/workers.properties文件，并对比下方文本内容，如有不同以下方内容为准修改。<br />workers.tomcat_home=d:\Tomcat #让mod_jk模块知道Tomcat的位置<br />workers.java_home=d:\Java\jre1.5.0_06 #让mod_jk模块知道jre的位置<br />ps=\<br />worker.list=ajp13 #模块版本<br />worker.ajp13.port=8009 #工作端口,若没占用则不用修改<br />worker.ajp13.host=localhost #本机,若上面的Apache主机不为localhost,作相应修改<br />worker.ajp13.type=ajp13 #类型<br />worker.ajp13.lbfactor=1 #代理数,不用修改<br /><br />如果文件不存在则创建。并填充上述内容。<br /><br />2、配置Apache<br />打开d:\Apache\Apache2\conf下的httpd.conf，在最后加入下面这段代码并保存。<br />#设置Apache与Tomcat之间的连接，让Apache遇到jsp文件时，在后台将其交由Tomcat去处理<br />LoadModule jk_module modules/mod_jk_2.0.55.so<br />#此处mod_jk的文件为你下载的文件<br />JkWorkersFile "d:/Tomcat/conf/workers.properties"<br />#指定tomcat监听配置文件地址<br />JkLogFile "d:/Tomcat/logs/mod_jk2.log" <br />#指定日志存放位置<br />JkLogLevel info<br /><br />#设置虚拟主机<br />&lt;VirtualHost localhost&gt;<br />ServerAdmin localhost<br />DocumentRoot d:/test1 <br />#您的站点项目所在路径，应与tomcat中的目录设置相同<br />ServerName localhost<br />DirectoryIndex index.html index.htm index.jsp<br />ErrorLog logs/shsc-error_log.txt<br />CustomLog logs/shsc-access_log.txt common<br />JkMount /servlet/* ajp13 <br />#让Apache支持对servlet传送，用以Tomcat解析<br />JkMount /*.jsp ajp13 <br />#让Apache支持对jsp传送，用以Tomcat解析<br />JkMount /*.do ajp13 <br />#让Apache支持对.do传送，用以Tomcat解析<br />&lt;/VirtualHost&gt;<br /><br />#开头的行为注释，可以删除。此处的配置我是以设置虚拟目录，重新指定了serverName,DocumentRoot路径的方式配置站点，实际上，Apache的配置可以非常灵活，你也可以不采用虚拟目录的方式，而直接去修改站点的默认配置，使用任意文本编辑工具，搜索如ServerName,DocumentRoot,ServerAdmin等相关项，然后将该项的配置根据你的实际情况进行修改即可。我建议大家可以多多尝试不同的配置，这是一种很有乐趣的体验。<br />所有的修改完成这后，再次执行d:\Apache\Apache2\bin\Apache.exe -t 如果看到"Syntax OK"，说明你所有配置无误，双击窗口的托盘中的图标，然后点击Start运行。<br />在地址栏中分别输入http://localhost/，与http://localhost:8080/若结果相同,Apache与Tomcat整合成功</span>
<img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/10294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-05-10 11:20 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/05/10/10294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shtml学习（3）---Apache中SSI和CGI的设定方法</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10265.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Tue, 09 May 2006 09:44:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10265.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/10265.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/10265.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/10265.html</trackback:ping><description><![CDATA[由于Apache具有相当高的可移植性，它支持超过30种操作系统，包括Unix、Windows 及Darwin等系统，所以目前在网络上已注册的网域里大部份是使用Apache网页服务器。目前ApacheSoftware Foundation 正致力于发展现在已进入alpha测试阶段的Apache2.0。在这里，我和大家探讨如何修改服务器选项让服务器能提供简单的动态网页内容，也就是支持CGI程序及 Server-Side Include（SSI）程序。<br /><br />　　1、准备工作<br /><br />　　首先，我假设你已经安装好Apache而且你的Apache能提供静态网页供浏览。Apache的安装会自动附上静态的HTML测试页，也就是说如果能看到那测试页，就代表你的Apache能正常运作了。基本安装下的Apache仅能提供静态的HTML网页。然而，你可以通过使用模块（modules）来提升它的功能。在原始的设定下，Apache的编译会包含mod_include 及 moc_cgi 这两个模块。你可以在bin子目录下执行./httpd -l来查看你的Apache是否装有这两个模块。执行的输出会是一长串Apache现在安装的所有模块。如果mod_include及moc_cgi 这两个模块不在清单里，你必须重新编译服务器。重新编译时，确定依照如何含括 mod_include、moc_cgi 模块的说明。此外你还必需有提供实时网页的Server-Side Includes（相关资料网址：<a href="http://www.oreilly.com/catalog/apache/excerpt/ch10.html" target="_blank">http://www.oreilly.com/catalog/apache/excerpt/ch10.html</a>）。有了 server-side includes （SSI）支持，你就能制作出实时的动态网页。接下来，我先从服务器的SSI支持设定开始，然后进入CGI的编写。<br /><br />　　2、Apache的设定<br /><br />　　首先你必须先找到Apache这个设定文件。Apache的原始安装目录在 Unix下是/usr/local/apache，在Windows下则是 c:\Program Files\Apache。接着在conf子目录下你会找到httpd.conf 文件。这就是Apache的设定档。这个设定文件是个纯文字文件，所以你可以使用一般的文字编辑器，如vi或Notepad 等，来编辑。首先要注意的是在这个设定档里有些行的起始文字是#符号，这表示这行的文字全为批注。适当地在你的设定档内做批注是个好习惯，因为那帮你记得你曾做了哪些设定以及为什么。<br /><br />　　3、执行 SSI 程序<br /><br />　　开启设定文件并寻找以下这些文字：<br /><br />　　　　#<br />　　　　# To use server-parsedHTMLfiles<br />　　　　#<br />　　　　#AddType text/html .shtml<br />　　　　#AddHandler server-parsed .shtml <br /><br />　　删除AddType及AddHandler这两行指令前的#符号。AddType指令会要求服务器在传回任何附属档名为.shtml的网页时，以 text或HTML做为传回文件的内容格式。AddHandler 则是用来指示服务器将文件内容送交给mod_include 处理。之后，mod_include 就会判断该如何响应这样的文件。接下来，寻找以下文字： <br />         <strong>&lt;Directory "C:/Program Files/Apache Group/Apache2/htdocs"&gt;<br /></strong><font size="2"><strong>        </strong><u><strong><font face="Verdana">（</font>注意：如果你所要部署的应用程序在另外的目录，那么在这个地方可以把路径改成你自己的目录</strong><font face="Verdana"><strong>）<br /></strong></font></u></font><br />　　在这行文字及对应的&lt;/Directory&gt; 间会有一行选项行（options line）。原始的设定是：<br /><br />　　<strong>Options Indexes FollowSymLinks MultiViews</strong><br /><br />　　在这行尾端加上Includes ，结果看起来会是这样：<br /><br />　　<strong>Options Indexes FollowSymLinks MultiViews Includes</strong><br /><br />　　这是要求Apache在htdocs子目录里执行 server-side includes 程序。为了让这些修改生效，我们必须重新启动服务器。在 Unix 下重新激活，执行"kill -HUP `cat /usr/local/apache/logs/httpd.pid`"。在 Windows 下，执行"Apache-k restart"。现在我们来试试刚才的设定结果。在/usr/local/apache/htdocs 目录里新增一个文件 test.shtml。这个文件必须要包含以下程序代码：<br /><br />　　[&lt;!--#include virtual="hello.txt "--&gt;]; The file hello.txt is [&lt;!--#fsize file="hello.txt "--&gt;] long and it was last modified on[&lt;!--#flastmod file="hello.txt "--&gt;]]; <br /><br />　　这段 SSI 程序会去读取一个称为 hello.txt 文件，并将该文件的大小以及最近一次的修改日期输出到网页上。显然的，我们还必须在 htdocs 目录下新增这个hello.txt 文件。在我的hello.txt 文件里只有一行文字：HOW ARE YOU!。完成新增这些文件后，打开你惯用的浏览器并开启<a href="http://localhost/test.shtml" target="_blank">http://localhost/test.shtml</a>网页。如果你服务器的安装并不是通过root用户，你可能必须改为开启<a href="http://localhost:8080/test.shtml" target="_blank">http://localhost:8080/test.shtml</a>。之后将得到如下结果：<br /><br />　　HOW ARE YOU! The file hello.txt is 1k bytes long and it was last modified on Wednesday, 02-Aug-2000 20:18:28 PDT<br /><br />　　另外一种可以激活支持SSI程序的方法称为XbitHack设定（相关资料网址：<a href="http://www.apache.org/docs/mod/mod_include.html#xbithack" target="_blank">http://www.apache.org/docs/mod/mod_include.html#xbithack</a> ）。这个方法的由来是当你将文本文件的使用者可执行位（user-executable bit）设为可执行状态后，Apache会将那些文件视为 SSI 程序文件。<br />　　　　要激活这样的功能必须将以下指令（directive）放在所有目录的 .htaccess 文件里：XbitHack status on (or full) status 的值可以设为on 、off 或是full。on 的设定会强制服务器将所有使用者可执行的文件视为SSI项。Off则使服务器完全忽略使用者可执行的设定状态。若是设定为Full，服务器会视所有使用者可执行档为SSI项，同时也会检查组可执行（group-executable bit）。如果组可执行项设定为可执行时，传回header的last modified time的值就会被设定为该文件最近一次被修改的时间。这样的设定可以让客户端的浏览器及代理服务器（proxy）进行缓存（caching）。不过在使用这样的功能时必须要小心。例如说，如果你的网页有提供轮替式广告看板你就不会想要设定群组可执行位为开启的状态，因为那么做会让第一个下载的广告被快取起来，导致使用者再也看不到其它页的广告。<br /><br />　　4、执行CGI程序<br /><br />　　在Apache原始安装里，cgi-bin子目录下附有两组CGI程序，test-cgi 以及printenv，只不过这两组程序有潜在的安全漏洞。但是由于我们只是要做设定测试，并且我们不会将这样的原始安装设定直接放在主运行服务器（live server），所以我们还是会激活其中一组CGI程序，看看Apache当初是如何被设定来执行这组程序。最后我们会自己撰写一支简单的CGI程序。<br /><br />　　首先，要确定这组程序是能执行的。进入cgi-bin子目录，确定程序文件被设定为使用者（服务器执行时使用者）可执行以及使用组（服务器执行时使用组）可执行。对 Windows系统来说，这一步应该是非必要的。接着，对服务器要求这样的内容：<br /><br />　　<a href="http://localhost:8080/cgi-bin/test-cgi" target="_blank">http://localhost:8080/cgi-bin/test-cgi</a><br /><br />　　注意：只有在通过非root使用者进行服务器安装的情况下才需要指定8080端口（port）。这支Apache内建的test-cgi程序会列出CGI程序会存取的变量值。激活CGI支持是设定在httpd.conf设定文件内的ScriptAlias 指令区段。这个指令区段的原始设定值是：<br /><br />　　ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"<br /><br />　　这行指令是告诉Apache如果要求的网页路径是以cgi-bin为起始，这些文件可在/usr/local/apache/cgi-bin/ 目录下找得到。这行指令同时也告诉Apache要在这个目录下执行文件。在下面我准备了一个会输出"How are you!"的简单CGI程序。我将它命名为 how.sh。<br /><br />　　　　#!/bin/sh<br />　　　　echo "Content-type: text/html"<br />　　　　echo<br />　　　　echo "How are you!" <br /><br />　　修改这个文件的权限使其成为可执行文件并且向你的服务器提出以下的要求：<br /><br />　　<a href="http://localhost:8080/cgi-bin/how.sh" target="_blank">http://localhost:8080/cgi-bin/how.sh</a><br /><br />　　虽然这组CGI是采用shell script来编写，其实它可以用任何适用于该系统的语言来撰写。至于关于CGI程序的撰写如果有机会我会和大家作更深入的探讨。<br /><br />　　结论：<br /><br />　　Apache支持的所有SSI 指令可以在Apachedocumentation 里找到，Apache所有的功能都可以通过设定文件 （config file）进行调试。在这里我所介绍的仅只是设定文件相关知识的皮毛。设定文件的原始设定有着非常详尽的说明文件，而且每一个系统版本都附有核心模块及标准模块的说明文件，如果你花些时间在这些文件里摸索，你会找到任何你想要的功能。 <!-- 正文end --><img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/10265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-05-09 17:44 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shtml学习(2)--Tomcat配置SSI</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10260.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Tue, 09 May 2006 08:22:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10260.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/10260.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/10260.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/10260.html</trackback:ping><description><![CDATA[Tomcat对SSI提供了支持，但在默认的情况下这种支持是关闭的。如果你用Tomcat做为HTTP服务器并且需要SSI，那么需要自己来设置。设置方法如下： 
<ol><li>        在$CATALINA_BASE/server/lib/目录下找到servlets-ssi.renametojar文件 </li><li>        将这个文件重命名为servlets-ssi.jar </li><li>        在$CATALINA_BASE/conf/目录下找到web.xml文件</li><li>        使用SSI Servlet就删除在SSI servlet和servlet-mapping周围的注释 </li><li>        使用SSI filter就删除在SSI filter和filter-mapping周围的注释</li></ol><img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/10260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-05-09 16:22 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shtml学习(1)--什么是shtml？语法及其指令？（转）</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10259.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Tue, 09 May 2006 08:17:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10259.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/10259.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/10259.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/10259.html</trackback:ping><description><![CDATA[
		<div class="post-body">SSI有什么用? <br />之所以要扯到ssi，是因爲shtml--server-parsed HTML 的首字母缩略词。包含有嵌入式服务器方包含命令的 HTML 文本。在被传送给浏览器之前，服务器会对 SHTML 文档进行完全地读取、分析以及修改。 <br />shtml和asp 有一些相似，以shtml命名的文件里，使用了ssi的一些指令，就像asp中的指令，你可以在SHTML文件中写入SSI指令，当客户端访问这些shtml文件时，服务器端会把这些SHTML文件进行读取和解释，把SHTML文件中包含的SSI指令解释出来<br />比如：你可以在SHTML文件中用SSI指令引用其他的html文件（#include ），服务器传送给客户端的文件，是已经解释的SHTML不会有SSI指令。它实现了HTML所没有的功能，就是可以实现了动态的SHTML，可以说是HTML的一种进化吧。像新浪的新闻系统就是这样的，新闻内容是固定的但它上面的广告和菜单等就是用#include引用进来的。 <br /><br /><b>　　目前，主要有以下几种用用途： <br />[li]　　1、显示服务器端环境变量&lt;#echo&gt; [/li]<br />[li]　　2、将文本内容直接插入到文档中&lt;#include&gt; [/li]<br />[li]　　3、显示WEB文档相关信息&lt;#flastmod #fsize&gt; (如文件制作日期/大小等) [/li]<br />[li]　　4、直接执行服务器上的各种程序&lt;#exec&gt;(如CGI或其他可执行程序) [/li]<br />[li]　　5、设置SSI信息显示格式&lt;#config&gt;(如文件制作日期/大小显示方式) 高级SSI&lt;XSSI&gt;可设置变量使用if条件语句。[/li] </b><br />　 <br />使用SSI <br />　　SSI是为WEB服务器提供的一套命令，这些命令只要直接嵌入到HTML文档的注释内容之中即可。如： <br />　　&lt;!--#include file="info.htm"--&gt; <br />　　就是一条SSI指令，其作用是将"info.htm"的内容拷贝到当前的页面中，当访问者来浏览时，会看到其它HTML文档一样显示info.htm其中的内容。 <br />　　其它的SSI指令使用形式基本同刚才的举例差不多，可见SSI使用只是插入一点代码而已，使用形式非常简单。 <br />　　当然，如果WEB服务器不支持SSI，它就会只不过将它当作注释信息，直接跳过其中的内容；浏览器也会忽略这些信息。 <br />　 <br />如何在我的WEB服务器上配置SSI功能？ <br />　　在一些WEB服务器上（如IIS 4.0/SAMBAR 4.2），包含 #include 指令的文件必须使用已被映射到 SSI 解释程序的扩展名；否则，Web 服务器将不会处理该SSI指令；默认情况下，扩展名 .stm、.shtm 和 .shtml 被映射到解释程序（Ssinc.dll）。 <br /><br />　　Apache则是根据你的设置情况而定，修改srm.conf如： <br />　　AddType text/x-server-parsed-html .shtml 将只对.shtml扩展名的文件解析SSI指令 <br />　　AddType text/x-server-parsed-html .html将对所有HTML文档解析SSI指令 <br />　　Netscape WEB服务器直接使用Administration Server(管理服务器)可打开SSI功能。 <br />　　Website使用Server Admin程序中的Mapping标签，扩展名添加内容类型为：wwwserver/html-ssi <br />　　Cern服务器不支持SSI，可用SSI诈骗法，到<a title="http://sw.cse.bris.ac.uk/WebTools/fakessi.html" href="http://sw.cse.bris.ac.uk/WebTools/fakessi.html" target="_blank">http://sw.cse.bris.ac.uk/WebTools/fakessi.html</a> ;上下载一个PERL脚本，即可使你的CERN服务器使用一些SSI指令。（不支持exec指令。） <br />　 <br />SSI指令基本格式 <br />SSI指令基本格式： <br />程序代码: <br />&lt;!-– 指令名称="指令参数"&gt; <br />&lt;!-– 指令名称="指令参数"&gt; <br />如 程序代码: <br /><br />&lt;!--#include file="info.htm"--&gt; <br />&lt;!--#include file="info.htm"--&gt; <br />说明: <br />1．&lt;!-- --&gt;是HTML语法中表示注释，当WEB服务器不支持SSI时，会忽略这些信息。 <br />2．#include 为SSI指令之一。 <br />3．file 为include的参数, info.htm为参数值，在本指令中指将要包含的文档名。 <br /><br />注意: <br /><br />1．&lt;!--与#号间无空格，只有SSI指令与参数间存在空格。 <br />2．上面的标点=""，一个也不能少。 <br />3．SSI指令是大小写敏感的，因此参数必须是小写才会起作用。 <br />　 <br />SSI指令使用详解 <br /><br />#echo 示范 <br />作用： <br />将环境变量插入到页面中。 <br />语法： <br />程序代码: <br /><br />&lt;!--#echo var="变量名称"--&gt; <br />&lt;!--#echo var="变量名称"--&gt; <br /><br />本文档名称：程序代码: <br /><br />&lt;!--#echo var="DOCUMENT_NAME"--&gt; <br />&lt;!--#echo var="DOCUMENT_NAME"--&gt; <br />现在时间：程序代码: <br />&lt;!--#echo var="DATE_LOCAL"--&gt; <br />&lt;!--#echo var="DATE_LOCAL"--&gt; <br />你的IP地址是程序代码: <br /><br />&lt;!--#echo var="REMOTE_ADDR"--&gt; <br />&lt;!--#echo var="REMOTE_ADDR"--&gt; <br /><br />#include 示范 <br />作用： <br />将文本文件的内容直接插入到文档页面中。 <br />语法： <br />程序代码: <br /><br />&lt;!--#include file="文件名称"--&gt; <br />&lt;!--#include virtual="文件名称"--&gt; <br />&lt;!--#include file="文件名称"--&gt; <br />&lt;!--#include virtual="文件名称"--&gt; <br />file 文件名是一个相对路径，该路径相对于使用 #include 指令的文档所在的目录。被包含文件可以在同一级目录或其子目录中，但不能在上一级目录中。如表示当前目录下的的nav_head.htm文档，则为file="nav_head.htm"。 <br />virtual 文件名是 Web 站点上的虚拟目录的完整路径。如表示相对于服务器文档根目录下hoyi目录下的nav_head.htm文件；则为file="/hoyi/nav_head.htm" <br />参数： <br />file 指定包含文件相对于本文档的位置 <br />virtual 指定相对于服务器文档根目录的位置 <br />注意： <br />1、文件名称必须带有扩展名。 <br />2、被包含的文件可以具有任何文件扩展名，我觉得直接使用htm扩展名最方便，微软公司推荐使用 .inc 扩展名（这就看你的爱好了）。 <br />示例： <br />程序代码: <br /><br />&lt;!--#include file="nav_head.htm"--&gt;将头文件插入到当前页面 <br />&lt;!--#include file="nav_foot.htm"--&gt;将尾文件插入到当前页面 <br />&lt;!--#include file="nav_head.htm"--&gt;将头文件插入到当前页面 <br />&lt;!--#include file="nav_foot.htm"--&gt;将尾文件插入到当前页面 <br /><br />#flastmod 和#fsize 示范 <br />作用： #flastmod 文件最近更新日期 <br />#fsize 文件的长度 <br />语法： <br />程序代码: <br /><br />&lt;!--#flastmod file="文件名称"--&gt; <br />&lt;!--#fsize file="文件名称"--&gt; <br />&lt;!--#flastmod file="文件名称"--&gt; <br />&lt;!--#fsize file="文件名称"--&gt; <br />参数： <br />file 指定包含文件相对于本文档的位置 如 info.txt 表示当前目录下的的info.txt文档 <br />virtual 指定相对于服务器文档根目录的位置 如 /hoyi/info.txt 表示 <br />注意： <br />文件名称必须带有扩展名。 <br />示例： <br />程序代码: <br /><br />&lt;!--#flastmod file="news.htm"--&gt; <br />&lt;!--#flastmod file="news.htm"--&gt; <br />将当前目录下news.htm文件的最近更新日期插插入到当前页面 <br />程序代码: <br /><br />&lt;!--#fsize file="news.htm"--&gt; <br />&lt;!--#fsize file="news.htm"--&gt; <br />将当前目录下news.htm的文件大小入到当前页面 <br />　 <br />#exec 示范 <br />作用： <br />将某一外部程序的输出插入到页面中。可插入CGI程序或者是常规应用程序的输入，这取决于使用的参数是cmd还是cgi。 <br />语法： <br />程序代码: <br /><br />&lt;!--#exec cmd="文件名称"--&gt; <br />&lt;!--#exec cgi="文件名称"--&gt; <br />&lt;!--#exec cmd="文件名称"--&gt; <br />&lt;!--#exec cgi="文件名称"--&gt; <br />参数： <br />cmd 常规应用程序 <br />cgi CGI脚本程序 <br />示例： <br />程序代码: <br /><br />&lt;!--#exec cmd="cat /etc/passwd"--&gt;将会显示密码文件 <br />&lt;!--#exec cmd="dir /b"--&gt;将会显示当前目录下文件列表 <br />&lt;!--#exec cgi="/cgi-bin/gb.cgi"--&gt;将会执行CGI程序gb.cgi。 <br />&lt;!--#exec cgi="/cgi-bin/access_log.cgi"--&gt;将会执行CGI程序access_log.cgi。 <br />&lt;!--#exec cmd="cat /etc/passwd"--&gt;将会显示密码文件 <br />&lt;!--#exec cmd="dir /b"--&gt;将会显示当前目录下文件列表 <br />&lt;!--#exec cgi="/cgi-bin/gb.cgi"--&gt;将会执行CGI程序gb.cgi。 <br />&lt;!--#exec cgi="/cgi-bin/access_log.cgi"--&gt;将会执行CGI程序access_log.cgi。 <br />注意： <br />从上面的示例可以看出，这个指令相当方便，但是也存在安全问题。 <br />禁止方法： <br />．Apache，将access.conf中的"Options Includes ExecCGI"这行代码删除； <br />．在IIS中，要禁用 #exec 命令，可修改 SSIExecDisable 元数据库； <br /><br />#config <br />作用： 指定返回给客户端浏览器的错误信息、日期和文件大小的格式。 <br />语法： <br />程序代码: <br /><br />&lt;!--#config errmsg="自定义错误信息"--&gt; <br />&lt;!--#config sizefmt="显示单位"--&gt; <br />&lt;!--#config timefmt="显示格式"--&gt; <br />&lt;!--#config errmsg="自定义错误信息"--&gt; <br />&lt;!--#config sizefmt="显示单位"--&gt; <br />&lt;!--#config timefmt="显示格式"--&gt; <br />参数： <br />errmsg 自定义SSI执行错误信息，可以为任何你喜欢的方式。 <br />sizefmt 文件大小显示方式，默认为字节方式("bytes")可以改为千字节方式("abbrev") <br />timefmt 时间显示方式，最灵活的配置属性。 <br />示例： 显示一个不存在文件的大小 <br />程序代码: <br /><br />&lt;!--#config errmsg="服务器执行错误，请联系管理员 yiho@126.com，谢谢！"--&gt; <br />&lt;!--#fsize file="不存在的文件.htm"--&gt; <br />&lt;!--#config errmsg="服务器执行错误，请联系管理员 yiho@126.com，谢谢！"--&gt; <br />&lt;!--#fsize file="不存在的文件.htm"--&gt; <br />以千字节方式显示文件大小 <br />程序代码: <br /><br />&lt;!--#config sizefmt="abbrev"--&gt; <br />&lt;!--#fsizefile="news.htm"--&gt; <br />&lt;!--#config sizefmt="abbrev"--&gt; <br />&lt;!--#fsizefile="news.htm"--&gt; <br />以特定的时间格式显示时间 <br />程序代码: <br /><br />&lt;!--#config timefmt="%Y年/%m月%d日 星期%W 北京时间%H:%M:%s，%Y年已过去了%j天 今天是%Y年的第%U个星期"--&gt; <br />&lt;!--#echo var="DATE_LOCAL"--&gt; 显示今天是星期几,几月,时区 <br />&lt;!--#config timefmt="今天%A, %B ,服务器时区是 %z，是"--&gt; <br />&lt;!--#echo var="DATE_LOCAL"--&gt; <br />&lt;!--#config timefmt="%Y年/%m月%d日 星期%W 北京时间%H:%M:%s，%Y年已过去了%j天 今天是%Y年的第%U个星期"--&gt; <br />&lt;!--#echo var="DATE_LOCAL"--&gt; 显示今天是星期几,几月,时区 <br />&lt;!--#config timefmt="今天%A, %B ,服务器时区是 %z，是"--&gt; <br />&lt;!--#echo var="DATE_LOCAL"--&gt; <br /><br />XSSI <br />XSSI（Extended SSI）是一组高级SSI指令，内置于Apache 1.2或更高版本的mod-include模块之中。 <br />其中可利用的的指令有： <br />#printenv <br />#set <br />#if <br />#printenv <br />作用： 显示当前存在于WEB服务器环境中的所有环境变量。 <br />语法：程序代码: <br /><br />&lt;!--#printenv--&gt; <br />&lt;!--#printenv--&gt; <br />&lt;!--#printenv--&gt; <br />&lt;!--#printenv--&gt; <br /><br />#set <br />作用：可给变量赋值，以用于后面的if语句。 <br />语法：程序代码: <br /><br />&lt;!--#set var="变量名"value="变量值"--&gt; <br />&lt;!--#set var="变量名"value="变量值"--&gt; <br />参数：无 <br />示例： 程序代码: <br /><br />&lt;!--#set var="color"value="红色"--&gt; <br />&lt;!--#set var="color"value="红色"--&gt; <br /><br />#if <br />作用： 创建可以改变数据的页面，这些数据根据使用if语句时计算的要求予以显示。 <br />语法： 程序代码: <br /><br />&lt;!--#if expr="$变量名=\"变量值A\""--&gt; <br />显示内容 <br />&lt;!--#elif expr="$变量名=\"变量值B\""--&gt; <br />显示内容 <br />&lt;!--#else--&gt; <br />显示内容 <br />&lt;!--#endif"--&gt; <br />&lt;!--#if expr="$变量名=\"变量值A\""--&gt; <br />显示内容 <br />&lt;!--#elif expr="$变量名=\"变量值B\""--&gt; <br />显示内容 <br />&lt;!--#else--&gt; <br />显示内容 <br />&lt;!--#endif"--&gt; <br />示例： <br />程序代码: <br /><br />&lt;!--#if expr="$SERVER_NAME=\"hoyi.zb169.net\""--&gt; <br />欢迎光临好易CGI工厂在淄博热线的分站<a title="http://hoyi.zb169.net。" href="http://hoyi.zb169.net。/" target="_blank">http://hoyi.zb169.net。</a><br />&lt;!--#elif expr="$SERVER_NAME=\"linux.cqi.com.cn\"" --&gt; <br />欢迎光临好易CGI工厂在太阳城的分站<a title="http://linux.cqi.com.cn/~hoyi。" href="http://linux.cqi.com.cn/~hoyi。" target="_blank">http://linux.cqi.com.cn/~hoyi。</a><br />&lt;!--#else--&gt; <br />欢迎光临好易CGI工厂！ <br />&lt;!--#endif"--&gt; <br />&lt;!--#if expr="$SERVER_NAME=\"hoyi.zb169.net\""--&gt; <br />欢迎光临好易CGI工厂在淄博热线的分站<a title="http://hoyi.zb169.net。" href="http://hoyi.zb169.net。/" target="_blank">http://hoyi.zb169.net。</a><br />&lt;!--#elif expr="$SERVER_NAME=\"linux.cqi.com.cn\"" --&gt; <br />欢迎光临好易CGI工厂在太阳城的分站<a title="http://linux.cqi.com.cn/~hoyi。" href="http://linux.cqi.com.cn/~hoyi。" target="_blank">http://linux.cqi.com.cn/~hoyi。</a><br />&lt;!--#else--&gt; <br />欢迎光临好易CGI工厂！ <br />&lt;!--#endif"--&gt; <br />注意： 用于前面指令中的反斜杠，是用来代换内部的引号，以便它们不会被解释为结束表达式。不可省略。 <br /><br />1、Config命令 <br /><br />　　Config命令主要用于修改SSI的默认设置。其中： <br /><br />　　Errmsg：设置默认错误信息。为了能够正常的返回用户设定的错误信息，在HTML文件中Errmsg参数必须被放置在其它SSI命令的前面，否则客户端只能显示默认的错误信息，而不是由用户设定的自定义信息。 <br /><br />　　　　&lt;!--#config errmsg="Error! Please email webmaster@mydomain.com --&gt; <br /><br />　　Timefmt：定义日期和时间的使用格式。Timefmt参数必须在echo命令之前使用。 <br /><br />　　　　&lt;!--#config timefmt="%A, %B %d, %Y"--&gt;<br />　　　　&lt;!--#echo var="LAST_MODIFIED" --&gt; <br /><br />　　显示结果为： <br /><br />　　　　Wednesday, April 12, 2000 <br /><br />　　也许用户对上例中所使用的%A %B %d感到很陌生，下面我们就以表格的形式总结一下SSI中较为常用的一些日期和时间格式。 <br /><br />　　Sizefmt：决定文件大小是以字节、千字节还是兆字节为单位表示。如果以字节为单位，参数值为"bytes"；对于千字节和兆字节可以使用缩写形式。同样，sizefmt参数必须放在fsize命令的前面才能使用。 <br /><br />　　　　&lt;!--#config sizefmt="bytes" --&gt;<br />　　　　&lt;!--#fsize file="index.html" --&gt; <br /><br />　　2、Include命令 <br /><br />　　Include命令可以把其它文档中的文字或图片插入到当前被解析的文档中，这是整个SSI的关键所在。通过Include命令只需要改动一个文件就可以瞬间更新整个站点！ <br /><br />　　Include命令具有两个不同的参数： <br /><br />　　Virtual：给出到服务器端某个文档的虚拟路径。例如： <br /><br />　　　　&lt;!--#include virtual="/includes/header.html" --&gt; <br /><br />　　File：给出到当前目录的相对路径，其中不能使用"../"，也不能使用绝对路径。例如： <br /><br />　　　　&lt;!--#include file="header.html" --&gt; <br /><br />　　这就要求每一个目录中都包含一个header.html文件。 <br /><br />　　3、Echo命令 <br /><br />　　Echo命令可以显示以下各环境变量：<br /><br />　　DOCUMENT_NAME：显示当前文档的名称。<br /><br />　　　　&lt;!--#echo var="DOCUMENT_NAME" --&gt; <br /><br />显示结果为：<br /><br />　　　　index.html<br /><br />　　DOCUMENT_URI：显示当前文档的虚拟路径。例如：<br /><br />　　　　&lt;!--#echo var="DOCUMENT_URI" --&gt; <br /><br />　　显示结果为： <br /><br />　　　　/YourDirectory/YourFilename.html <br /><br />　　随着网站的不断发展，那些越来越长的URL地址肯定会让人头疼。如果使用SSI，一切就会迎刃而解。因为我们可以把网站的域名和SSI命令结合在一起显示完整的URL，即： <br /><br />　　<a title="http://YourDomain" href="http://yourdomain/" target="_blank">http://YourDomain</a>&lt;;!--#echo var="DOCUMENT_URI" --&gt; <br /><br />　　QUERY_STRING_UNESCAPED：显示未经转义处理的由客户端发送的查询字串，其中所有的特殊字符前面都有转义符"\"。例如： <br /><br />　　&lt;!--#echo var="QUERY_STRING_UNESCAPED" --&gt; <br /><br />　　DATE_LOCAL：显示服务器设定时区的日期和时间。用户可以结合config命令的timefmt参数，定制输出信息。例如： <br /><br />　　&lt;!--#config timefmt="%A, the %d of %B, in the year %Y" --&gt;<br />　&lt;!--#echo var="DATE_LOCAL" --&gt; <br /><br />　　显示结果为： <br /><br />　　Saturday, the 15 of April, in the year 2000 <br /><br />　　DATE_GMT：功能与DATE_LOCAL一样，只不过返回的是以格林尼治标准时间为基准的日期。例如： <br /><br />　　&lt;!--#echo var="DATE_GMT" --&gt; <br /><br />　　LAST_MODIFIED：显示当前文档的最后更新时间。同样，这是SSI中非常实用的一个功能，只要在HTML文档中加入以下这行简单的文字，就可以在页面上动态的显示更新时间。 <br /><br />　　&lt;!--#echo var="LAST_MODIFIED" --&gt; <br /><br />　　CGI环境变量 <br /><br />　　除了SSI环境变量之外，echo命令还可以显示以下CGI环境变量： <br /><br />　　　　SERVER_SOFTWARE：显示服务器软件的名称和版本。例如：<br />　　　　&lt;!--#echo var="SERVER_SOFTWARE" --&gt;<br />　　　　SERVER_NAME： 显示服务器的主机名称，DNS别名或IP地址。例如：<br />　　　　&lt;!--#echo var="SERVER_NAME" --&gt;<br />　　　　SERVER_PROTOCOL：显示客户端请求所使用的协议名称和版本，如HTTP/1.0。例如：<br />　　　　&lt;!--#echo var="SERVER_PROTOCOL" --&gt;<br />　　　　SERVER_PORT：显示服务器的响应端口。例如：<br />　　　　&lt;!--#echo var="SERVER_PORT" --&gt;<br />　　　　REQUEST_METHOD：显示客户端的文档请求方法，包括GET, HEAD, 和POST。例如：<br />　　　　&lt;!--#echo var="REQUEST_METHOD" --&gt;<br />　　　　REMOTE_HOST：显示发出请求信息的客户端主机名称。<br />　　　　&lt;!--#echo var="REMOTE_HOST" --&gt;<br />　　　　REMOTE_ADDR：显示发出请求信息的客户端IP地址。<br />　　　　&lt;!--#echo var="REMOTE_ADDR" --&gt;<br />　　　　AUTH_TYPE：显示用户身份的验证方法。<br />　　　　&lt;!--#echo var="AUTH_TYPE" --&gt;<br />　　　　REMOTE_USER：显示访问受保护页面的用户所使用的帐号名称。<br />　　　　&lt;!--#echo var="REMOTE_USER" --&gt; <br />4、Fsize：显示指定文件的大小，可以结合config命令的sizefmt参数定制输出格式。 <br /><br />　　　　&lt;!--#fsize file="index_working.html" --&gt; <br /><br />　　5、Flastmod：显示指定文件的最后修改日期，可以结合config 命令的timefmt参数控制输出格式。 <br /><br />　　　　&lt;!--#config timefmt="%A, the %d of %B, in the year %Y" --&gt;<br />　　　　&lt;!--#flastmod file="file.html" --&gt; <br /><br />　　这里，我们可以利用flastmod参数显示出一个页面上所有链接页面的更新日期。方法如下： <br /><br />　　　　&lt;!--#config timefmt=" %B %d, %Y" --&gt;<br />　　　　&lt;A HREF="/directory/file.html"&gt;File&lt;/A&gt;<br />　　　　&lt;!--#flastmod virtual="/directory/file.html" --&gt;<br />　　　　&lt;A HREF="/another_directory/another_file.html"&gt;Another File&lt;/A&gt;<br />　　　　&lt;!--#flastmod virtual="/another_directory/another_file.html" --&gt;<br />　　显示结果为：<br />　　　　File April 19, 2000<br />　　　　Another File January 08, 2000 <br /><br />　　6、Exec <br /><br />　　Exec命令可以执行CGI脚本或者shell命令。使用方法如下：<br /><br />　　　Cmd：使用/bin/sh执行指定的字串。如果SSI使用了IncludesNOEXEC选项，则该命令将被屏蔽。 <br /><br />　　　Cgi：可以用来执行CGI脚本。例如，下面这个例子中使用服务端cgi-bin目录下的counter.pl脚本程序在每个页面放置一个计数器： <br /><br />　　　&lt;!--#exec cgi="/cgi-bin/counter.pl" --&gt; </div>
<img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/10259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-05-09 16:17 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/05/09/10259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DAO编程模式</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/03/31/8442.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Fri, 31 Mar 2006 09:58:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/03/31/8442.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/8442.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/03/31/8442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/8442.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/8442.html</trackback:ping><description><![CDATA[
		<div id="OutBox">
				<form id="CSDNFrontEndForm" name="CSDNFrontEndForm" action="display.aspx?GUID=2d6b329b-c350-4a00-8399-7988f48df35e" method="post">
						<div id="listMainArea">
								<div id="SimpleNav">
										<div id="listSimpleNav"> </div>
								</div>
								<dl class="ReadArticle">
										<dt>
										</dt>
										<div align="center">
												<span id="LblTitle">DAO编程模式</span>
										</div>
										<dd class="ArticleInfo">作者： <a id="HyperAuthor" href="http://kb.csdn.net/ArticleAuthor.aspx?author="></a>∣来源：<a id="HyFromWhere" href="http://www.javaresearch.org/article/" target="_blank">JavaResearch</a>∣<a id="HyHistoryUrl" title="http://www.javaresearch.org/article/showarticle.jsp?column=31&amp;amp;thread=30488" href="http://www.javaresearch.org/article/showarticle.jsp?column=31&amp;thread=30488" target="_blank">原文地址</a>∣<span id="LblUpdateDate">2005-6-23</span></dd>
										<dd class="ArticleContent">
												<div class="HideDiv" style="OVERFLOW: hidden; WIDTH: 100%">
														<span id="LblContent">J2EE开发人员使用数据访问对象(DAO)设计模式把底层的数据访问逻辑和高层的商务逻辑分开.实现DAO模式能够更加专注于编写数据访问代码.在这篇文章中,Java开发人员Sean C. Sullivan从三个方面讨论DAO编程的结构特征:事务划分,异常处理,日志记录.<br /><br />在最近的18个月,我和一个优秀的软件开发团队一起工作,开发定制基于WEB的供应链管理应用程序.我们的应用程序访问广泛的持久层数据,包括出货状态,供应链制度,库存,货物发运,项目管理数据,和用户属性等.我们使用JDBC API连接我们公司的各种数据库平台,并且在整个应用程序中应用了DAO设计模式.<br />下图显示了应用程序和数据源的关系:<br /> <br /><br />通过在整个应用程序中应用数据访问对象(DAO)设计模式使我们能够把底层的数据访问逻辑和上层的商务逻辑分开.我们为每个数据源创建了提供CRUD(创建,读取,更新,删除)操作的DAO类.<br /><br />在之篇文章中,我将向你介绍DAO的实现策略以及创建更好的DAO类的技术.我会明确的介绍日志记录,异常处理,和事务划分三项技术.你将学在你的DAO类中怎样把这三种技术结合在一起.这篇文章假设你熟悉JDBC API,SQL和关系性数据库编程.<br /><br />我们先来回顾一下DAO设计模式和数据访问对象.<br />DAO基础<br />DAO模式是标准的J2EE设计模式之一.开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开.一个典型的DAO实现有下列几个组件:<br />1.    一个DAO工厂类;<br />2.    一个DAO接口;<br />3.    一个实现DAO接口的具体类;<br />4.    数据传递对象(有些时候叫做值对象).<br /><br />具体的DAO类包含了从特定的数据源访问数据的逻辑。在下面的这段中你将学到设计和实现数据访问对象的技术。<br />事务划分：<br />关于DAO要记住的一件重要事情是它们是事务性对象。每个被DAO执行的操作（象创建，更新、或删除数据）都是和事务相关联的。同样的，事务划分（transaction demarcation）的概念是特别重要的。<br />事务划分是在事务界定定义中的方式。J2EE规范为事务划分描述了两种模式：编程性事务（programmatic）和声明性事务（declarative）.下表是对这两种模式的拆分：<br />声明性事务划分    编程性事务划分<br />程序员使用EJB的布署描述符声明事务属性    程序员担负编写事务逻辑代码的责任。<br />运行时环境（EJB容器）使用这些属性来自动的管理事务。    应用程序通过一个API接口来控制事务。 <br /><br />我将把注意力集中的编程性事务划分上。<br />象前面的介绍一样，DAOs是一些事务对象。一个典型的DAO要执行象创建、更新、和删除这的事务性操作。在设计一个DAO时，首先要问自己如下问题：<br />1、    事务将怎样开始？<br />2、    事务将怎样结束？<br />3、    那个对象将承担起动一个事务的责任？<br />4、    那个对象将承担结束一个事务的责任？<br />5、    DAO应该承担起动和结束事务的责任？<br />6、    应用程序需要交叉访问多个DAO吗？<br />7、    一个事务包含一个DAO还是多个DAO？<br />8、    一个DAO包含其它的DAO中的方法吗？<br /><br />回答这些问题将有助于你为DAO对象选择最好的事务划分策略。对ADO中的事务划分有两个主要的策略。一种方法是使用DAO承担事务划分的责任；另一种是延期性事务，它把事务划分到调用DAO对象的方法中。如果你选择前者，你将要在DAO类中嵌入事务代码。如果你选择后者，事务代码将被写在DAO类的外部。我们将使用简单的代码实例来更好的理解这两种方法是怎样工作的。<br />实例1展示了一个带有两种数据操作的DAO：创建（create）和更新（update）:<br />public void createWarehouseProfile(WHProfile profile);<br />public void updateWarehouseStatus(WHIdentifier id, StatusInfo status);<br />实例2展示了一个简单的事务，事务划分代码是在DAO类的外部。注意：在这个例子中的调用者把多个DOA操作组合到这个事务中。<br /><br />tx.begin();    // start the transaction<br />dao.createWarehouseProfile(profile);<br />dao.updateWarehouseStatus(id1, status1);<br />dao.updateWarehouseStatus(id2, status2);<br />tx.commit();   // end the transaction<br /><br />这种事务事务划分策略对在一个单一事务中访问多个DAO的应用程序来说尤为重要。<br /><br />你即可使用JDBC API也可以使用Java 事务API(JTA)来实现事务的划分。JDBC事务划分比JTA事务划分简单，但是JTA提供了更好的灵活性。在下面的这段中，我们会进一步的看事务划分机制。<br />使用JDBC的事务划分<br />JDBC事务是使用Connection对象来控制的。JDBC的连接接口（java.sql.Connection）提供了两种事务模式：自动提交和手动提交。Java.sql.Connection为控制事务提供了下列方法：<br />.public void setAutoCommit(Boolean)<br />.public Boolean getAutoCommit()<br />.public void commit()<br />.public void rollback()<br />实例3展示怎样使用JDBC API来划分事务：<br />import java.sql.*;<br />import javax.sql.*;<br />// ...<br />DataSource ds = obtainDataSource();<br />Connection conn = ds.getConnection();<br />conn.setAutoCommit(false);<br />// ...<br />pstmt = conn.prepareStatement("UPDATE MOVIES ...");<br />pstmt.setString(1, "The Great Escape");<br />pstmt.executeUpdate();<br />// ...<br />conn.commit();<br />// ...<br /><br />使用JDBC事务划分，你能够把多个SQL语句组合到一个单一事务中。JDBC事务的缺点之一就是事务范围被限定在一个单一的数据库连接中。一个JDBC事务不能够跨越多个数据库。接下来，我们会看到怎样使用JTA来做事务划分的。因为JTA不象JDBC那样被广泛的了解，所以我首先概要的介绍一下JTA。<br /><br />JTA概要介绍<br />Java事务API（JTA Java Transaction API）和它的同胞Java事务服务(JTS Java Transaction Service)，为J2EE平台提供了分布式事务服务。一个分布式事务（distributed transaction）包括一个事务管理器（transaction manager）和一个或多个资源管理器(resource manager)。一个资源管理器（resource manager）是任意类型的持久化数据存储。事务管理器（transaction manager）承担着所有事务参与单元者的相互通讯的责任。下车站显示了事务管理器和资源管理的间的关系。<br /> <br /><br />JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者，而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中：<br />.JDBC连接<br />.JDO PersistenceManager 对象<br />.JMS 队列<br />.JMS 主题<br />.企业JavaBeans（EJB）<br />.一个用J2EE Connector Architecture 规范编译的资源分配器。<br /><br />使用JTA的事务划分<br />要用JTA来划分一个事务，应用程序调用javax.transaction.UserTransaction接口中的方法。示例4显示了一个典型的JNDI搜索的UseTransaction对象。<br />import javax.transaction.*;<br />import javax.naming.*;<br />// ...<br />InitialContext ctx = new InitialContext();<br />Object txObj = ctx.lookup("java:comp/UserTransaction");<br />UserTransaction utx = (UserTransaction) txObj;<br /><br />应用程序有了UserTransaction对象的引用之后，就可以象示例5那样来起动事务。<br /><br />utx.begin();<br />// ...<br />DataSource ds = obtainXADataSource();<br />Connection conn = ds.getConnection();<br />pstmt = conn.prepareStatement("UPDATE MOVIES ...");<br />pstmt.setString(1, "Spinal Tap");<br />pstmt.executeUpdate();<br />// ...<br />utx.commit();<br />// ...<br /><br />当应用程序调用commit()时，事务管理器使用两段提交协议来结束事务。<br />JTA事务控制的方法<br />.javax.transaction.UserTransaction接口提供了下列事务控制方法：<br />.public void begin()<br />.public void commit()<br />.public void rollback()<br />.public void getStatus()<br />.public void setRollbackOnly()<br />.public void setTransactionTimeout(int)<br />应用程序调用begin()来起动事务，即可调用commit()也可以调用rollback()来结束事务。<br />使用JTA和JDBC<br />开发人员经常使用JDBC来作为DAO类中的底层数据操作。如果计划使用JTA来划分事务，你将需要一个实现了javax.sql.XADataSource,javax.sql.XAConnection和javax.sql.XAResource接口JDBC的驱动。实现了这些接口的驱动将有能力参与到JTA事务中。一个XADataSource对象是一个XAConnection对象的工厂。XAConnections是参与到JTA事务中的连接。<br /><br />你需要使用应用程序服务器管理工具来建立XADataSource对象。对于特殊的指令请参考应用程序服务器文档和JDBC驱动文档。<br /><br />J2EE应用程序使用JNDI来查找数据源。一旦应用程序有了一个数据源对象的引用，这会调用javax.sql.DataSource.getConnection()来获得数据库的连接。<br /><br />XA连接区别于非XA连接。要记住的是XA连接是一个JTA事务中的参与者。这就意味着XA连接不支持JDBC的自动提交特性。也就是说应用程序不必在XA连接上调用java.sql.Connection.commit()或java.sql.Connection.rollback()。相反，应用程序应该使用UserTransaction.begin()、UserTransaction.commit()和UserTransaction.rollback().<br /><br />选择最好的方法<br />我们已经讨论了JDBC和JTA是怎样划分事务的。每一种方法都有它的优点，回此你需要决定为你的应用程序选择一个最适应的方法。<br /><br />在我们团队许多最近的对于事务划分的项目中使用JDBC API来创建DAO类。这DAO类总结如下：<br />.事务划分代码被嵌入到DAO类内部<br />.DAO类使用JDBC API来进行事务划分<br />.调用者没有划分事务的方法<br />.事务范围被限定在一个单一的JDBC连接<br /><br />JDBC事务对复杂的企业应用程序不总是有效的。如果你的事务将跨越多个DAO对象或<br />多个数据库，那么下面的实现策略可能会更恰当。：<br />.用JTA对事务进行划分<br />.事务划分代码被DAO分开<br />.调用者承担划分事务的责任<br />.DAO参与一个全局的事务中<br /><br />JDBC方法由于它的简易性而具有吸引力，JTA方法提供了更多灵活性。你选择什么样的实现将依赖于你的应用程序的特定需求。<br /><br />日志记录和DAO<br />一个好的DAO实现类将使用日志记录来捕获有关它在运行时的行为细节。你可以选择记录异常、配置信息、连接状态、JDBC驱动程序的元数据或查询参数。日志对开发整个阶段都是有益的。我经常检查应用程序在开发期间、测试期间和产品中的日志记录。<br />在这段中，我们将展现一段如何把Jakarta Commaons Logging结合中一个DAO中的例子。在我们开始之前，让我们先回顾一些基础知识。<br /><br />选择一个日志例库<br />许多开发人员使用的基本日志形式是：System.out.println和System.err.println.Println语句。这种形式快捷方便，但它们不能提供一个完整的日志系统的的能力。下表列出了Java平台的日志类库：<br />日志类库    开源吗？    URL<br />Java.util.logging    否    <a href="http://java.sun.com/j2ee">http://java.sun.com/j2ee</a><br /><br />Jakarta Log4j    是    <a href="http://hajarta.apache.org/log4j/">http://hajarta.apache.org/log4j/</a><br />Jakarta Commons Logging    是    http:/Jakarta.apache.org/commons/logging.html<br /><br />Java.util.logging是J2SE1.4平台上的标准的API。但是，大多数开发人员都认为Jakarta Log4j提供了更大的功能性和灵活性。Log4j超越java.util.logging的优点之一就是它支持J2SE1.3和J2SE1.4平台。<br /><br />Jakarta Commons Logging能够被用于和java.util.loggin或Jakarta Log4j一起工作。Commons Logging是一个把你的应用程序独立于日志实现的提取层。使用Commons Logging你能够通过改变一个配置文件来与下面的日志实现来交换数据。Commons Logging被用于JAKARTA Struts1.1和Jakarta HttpClient2.0中。<br /><br />一个日志示例<br />示例7显示了在一个DOA类中怎样使用Jakarta Commons Logging<br /><br />import org.apache.commons.logging.*;<br />class DocumentDAOImpl implements DocumentDAO<br />{<br />      static private final Log log = LogFactory.getLog(DocumentDAOImpl.class);<br />      public void deleteDocument(String id)<br />      {<br />          // ...<br />          log.debug("deleting document: " + id);<br />          // ...<br />          try<br />          {<br />              // ... data operations ...<br />          }<br />          catch (SomeException ex)<br />          {<br />              log.error("Unable to delete document", ex);<br />              // ... handle the exception ...<br />  }<br />      }<br />}<br /><br />日志是评估应用程序的基本部分。如果你在一个DAO中遇到了失败，日志经常会为理解发生的什么错误提供最好的信息。把日志结合到你的DAO中，确保得到调试和解决问题的有效手段。<br /><br />DAO中的异常处理<br />我们已经看了事务划分和日志记录，并且现在对于它们是怎样应用于数据访问对象的有一个深入的理解。我们第三部分也是最后要讨论的是异常处理。下面的一些简单的异常处理方针使用你的DAO更容易使用，更加健壮和更具有可维护性。<br /><br />在实现DAO模式的时候，要考滤下面的问题：<br />.在DAO的public接口中的方法将抛出被检查的异常吗？<br />.如果是，将抛出什么样的检查性异常？<br />.在DAO实现类中怎能样处理异常。<br />在用DAO模式工作的过程中，我们的团队为异常处理开发了一组方针。下面的这些方针会很大程度的改善你的DAO：<br />.DAO方法应该抛出有意义的异常。<br />.DAO方法不应该抛出java.lang.Exception异常。因为java.lang.Exception太一般化，它不能包含有关潜在问题的所有信息。<br />.DAO方法不应该抛出java.sql.SQLException异常。SQLException是一个底层的JDBC异常，DAO应用努力封装JDBC异常而不应该把JDBC异常留给应用程序的其它部分。<br />.在DAO接口中的方法应该只抛出调用者期望处理的检查性异常。如果调用者不能用适当的方法来处理异常，考滤抛出不检查性（运行时run-time）异常。<br /><br />.如果你的数据访问代码捕获了一个异常，不可要忽略它。忽略捕获异常的DAO是很处理的。<br />.使用异常链把底层的异常传递给高层的某个处理器。<br />.考滤定义一个标准的DAO异常类。Spring框架提供了一个优秀的预定义的DAO异常类的集合。<br />看Resources，查看有异常和异常处理技术的更详细信息。<br /><br />实现示例：MovieDAO<br />MoveDAO是一个示范了在这篇文章中所讨论的所有技术，包括事务划分、日志记录和异常处理。你会在Resources段找到MovieDAO的源代码。它被分下面的三个包：<br />.daoexamples.exception<br />.daoexamples.move<br />.daoexamples.moviedemo<br /><br />这个DAO模式的实现由下面的类和接口组成：<br />.daoexamples.movie.MovieDAOFactory<br />.daoexamples.movie.MovieDAO<br />.daoexamples.movie.MovieDAOImpl<br />.daoexamples.movie.MovieDAOImplJTA<br />.daoexamples.movie.Movie<br />.daoexamples.movie.MovieImple<br />.daoexamples.movie.MovieNotFoundException<br />.daoexamples.movie.MovieUtil<br /><br />MovieDAO接口定义了DAO的数据操作。这个接口有如下五个方法：<br />.public Movie findMovieById(String id)<br />.public java.util.Collection findMoviesByYear(String year)<br />.public void deleteMovie(String id)<br />.public Movie createMovie(String rating,String year,String title)<br />.public void updateMovie(String id,String rating,String year,String title)<br />daoexamples.movie包包含了两个MovieDAO接口的实现。每个实现使用了一个同的事务划分方法，如下表所示：<br />    MovieDAOImpl    MovieDAOImplJTA<br />实现了MovieDAO接口吗？    Yes    Yes<br />通过JNDI获得DataSource吗？    Yes    Yes<br />从一个DataSource获得java.sql.Connection对象吗？    Yes    Yes<br />DAO界定内部的事务吗？    Yes    No<br />使用JDBC事务吗？    Yes    No<br />使用一个XA DataSource吗？    No    Yes<br />分担JTA事务吗？    No    Yes<br /><br /><br />MovieDAO 示范应用程序<br />这个示范应用程序是一个叫做daoexamples.moviedemo.DemoServlet.DemoServlet的servlet类，它使用Movie DAO来查询和更新一个表中的movie数据。<br /><br />这个servlet示范了把JTA感知的MovieDAO和Java消息服务组合到一个单一的事务中，如示例8所示：<br />UserTransaction utx = MovieUtil.getUserTransaction();<br />utx.begin();<br />batman = dao.createMovie("R",<br />      "2008",<br />      "Batman Reloaded");<br />publisher = new MessagePublisher();<br />publisher.publishTextMessage("I'll be back");<br />dao.updateMovie(topgun.getId(),<br />      "PG-13",<br />      topgun.getReleaseYear(),<br />      topgun.getTitle());<br />dao.deleteMovie(legallyblonde.getId());<br />utx.commit();<br /><br />要运行这个范例应用程序，在你的应用程序服务器中配置一个XA 数据源和一个非XA数据源。然后布署daoexamples.ear文件。这个应用程序将运行在任何与J2EE兼容的应用程序服务器。</span>
												</div>
										</dd>
								</dl>
						</div>
				</form>
		</div>
<img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/8442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-03-31 17:58 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/03/31/8442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈Java的输入输出流（转）</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2006/03/09/7393.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Thu, 09 Mar 2006 02:28:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2006/03/09/7393.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/7393.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2006/03/09/7393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/7393.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/7393.html</trackback:ping><description><![CDATA[　Java语言的输入输出功能是十分强大而灵活的，美中不足的是看上去输入输出的代码并不是很简洁，因为你往往需要包装许多不同的对象。在Java类库中，<A class=bluekey href="http://www.yesky.com/key/938/160938.html" target=_blank>IO</A>部分的内容是很庞大的，因为它涉及的领域很广泛:标准输入输出，文件的操作，网络上的数据流，字符串流，对象流，zip文件流....本文的目的是为大家做一个简要的介绍。 <BR>
<P></P>
<P align=left>　　流是一个很形象的概念，当程序需要读取数据的时候，就会开启一个通向数据源的流，这个数据源可以是文件，内存，或是网络连接。类似的，当程序需要写入数据的时候，就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样，如下图：</P>
<P align=center><IMG alt=" " onerror="this.src='http://www.yesky.com/image20010518/42132.gif';" hspace=3 src="file:///D:/fzc/文档中心/J_F_RIA-浅谈Java的输入输出流.files/42132.gif" align=center vspace=1 border=1></P>
<P align=center><IMG alt=" " onerror="this.src='http://www.yesky.com/image20010518/42133.gif';" hspace=3 src="file:///D:/fzc/文档中心/J_F_RIA-浅谈Java的输入输出流.files/42133.gif" align=center vspace=1 border=1></P>
<P align=left>　　Java中的流分为两种，一种是字节流，另一种是字符流，分别由四个抽象类来表示（每种流包括输入和输出两种所以一共四个）:InputStream，OutputStream，Reader，Writer。Java中其他多种多样变化的流均是由它们派生出来的:</P>
<P align=center><IMG alt=" " onerror="this.src='http://www.yesky.com/image20010518/42134.gif';" hspace=3 src="file:///D:/fzc/文档中心/J_F_RIA-浅谈Java的输入输出流.files/42134.gif" align=center vspace=1 border=1><BR><BR><IMG alt=" " onerror="this.src='http://www.yesky.com/image20010518/42135.gif';" hspace=3 src="file:///D:/fzc/文档中心/J_F_RIA-浅谈Java的输入输出流.files/42135.gif" align=center vspace=1 border=1></P>
<P align=center><IMG alt=" " onerror="this.src='http://www.yesky.com/image20010518/42136.gif';" hspace=3 src="file:///D:/fzc/文档中心/J_F_RIA-浅谈Java的输入输出流.files/42136.gif" align=center vspace=1 border=1></P>
<P align=center><IMG alt=" " onerror="this.src='http://www.yesky.com/image20010518/42137.gif';" hspace=3 src="file:///D:/fzc/文档中心/J_F_RIA-浅谈Java的输入输出流.files/42137.gif" align=center vspace=1 border=1></P>
<P align=left>　　在这其中InputStream和OutputStream在早期的Java版本中就已经存在了，它们是基于字节流的，而基于字符流的Reader和Writer是后来加入作为补充的。以上的层次图是Java类库中的一个基本的层次体系。</P>
<P align=left>　　在这四个抽象类中，InputStream和Reader定义了完全相同的接口：</P>
<TABLE class=code cellSpacing=2 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD><FONT color=#0000ff><SPAN class=unnamed1>int</SPAN></FONT><SPAN class=unnamed1> read（）<BR><FONT color=#0000ff>int</FONT> read（<FONT color=#0000ff>char</FONT> cbuf[]）<BR><FONT color=#0000ff>int</FONT> read（<FONT color=#0000ff>char</FONT> cbuf[], <FONT color=#0000ff>int </FONT>offset, <FONT color=#0000ff>int</FONT> length）</SPAN></TD></TR></TBODY></TABLE>
<P align=left>　　而OutputStream和Writer也是如此：</P>
<TABLE class=code cellSpacing=2 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD><FONT color=#0000ff><SPAN class=unnamed1>int</SPAN></FONT><SPAN class=unnamed1> write（<FONT color=#0000ff>int</FONT> c）<BR><FONT color=#0000ff>int</FONT> write（<FONT color=#0000ff>char</FONT> cbuf[]）<BR><FONT color=#0000ff>int</FONT> write（<FONT color=#0000ff>char</FONT> cbuf[], <FONT color=#0000ff>int</FONT> offset, <FONT color=#0000ff>int</FONT> length）</SPAN></TD></TR></TBODY></TABLE>
<P align=left>　　这六个方法都是最基本的，read（）和write（）通过方法的重载来读写一个字节，或者一个字节数组。</P>
<P align=left>　　更多灵活多变的功能是由它们的子类来扩充完成的。知道了Java输入输出的基本层次结构以后，本文在这里想给大家一些以后可以反复应用例子，对于所有子类的细节及其功能并不详细讨论。</P>
<TABLE class=code cellSpacing=2 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<DIV align=center>
<P align=left><FONT color=#0000ff><SPAN class=unnamed1>import</SPAN></FONT><SPAN class=unnamed1> java.io.*；</SPAN></P></DIV>
<OL>
<DIV align=left>
<P class=unnamed1 align=left><FONT color=#0000ff>public class</FONT> IOStreamDemo {<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public void</FONT> samples（） throws IOException {</P>
<P align=left><SPAN class=unnamed1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#006600>//1. 这是从键盘读入一行数据,返回的是一个字符串</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>BufferedReader</FONT> stdin =<FONT color=#0000ff><A class=bluekey href="http://www.yesky.com/key/1252/161252.html" target=_blank>new</A></FONT> BufferedReader（new InputStreamReader（System.in））； <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>System</FONT>.out.print（<FONT color=#ff00ff>"Enter a line:"</FONT>）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>System</FONT>.out.println（stdin.readLine（））；</SPAN></P>
<P class=unnamed1 align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#006600>//2. 这是从文件中逐行读入数据 </FONT></P>
<P class=unnamed1 align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>BufferedReader</FONT> in = <FONT color=#0000ff>new</FONT> BufferedReader（<FONT color=#0000ff>new</FONT> FileReader（<FONT color=#ff00ff>"IOStreamDemo.java"</FONT>））；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>String</FONT> s, s2 = <FONT color=#0000ff>new</FONT> String（）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>while</FONT>（（s = in.readLine（））!= <FONT color=#0000ff>null</FONT>）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s2 += s + <FONT color=#ff00ff>"\n"</FONT>；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close（）；<BR></P>
<P class=unnamed1 align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#006600>//3. 这是从一个字符串中逐个读入字节 </FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>StringReader</FONT> in1 = <FONT color=#0000ff>new</FONT> StringReader（s2）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>int</FONT> c；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>while</FONT>（（c = in1.read（）） != -1）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>System</FONT>.out.print（（char）c）；<BR></P>
<P align=left><SPAN class=unnamed1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#006600>//4. 这是将一个字符串写入文件 </FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>try</FONT> {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>BufferedReader</FONT> in2 = <FONT color=#0000ff>new</FONT> BufferedReader（new StringReader（s2））；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>PrintWriter</FONT> out1 = <FONT color=#000000>new</FONT> PrintWriter（new BufferedWriter（new FileWriter（<FONT color=#ff00ff>"IODemo.out"</FONT>）））；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>int</FONT> lineCount = 1；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>while</FONT>（（s = in2.readLine（）） != <FONT color=#0000ff>null</FONT> ）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out1.println（lineCount++ + <FONT color=#ff00ff>": "</FONT> + s）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out1.close（）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <FONT color=#0000ff>catch</FONT>（EOFException e） {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>System</FONT>.err.println（<FONT color=#ff00ff>"End of stream"</FONT>）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </SPAN></P>} </DIV></OL></TD></TR></TBODY></TABLE>
<P align=left>　　对于上面的例子，需要说明的有以下几点：</P>
<DIV></DIV>
<DIV align=center>
<P align=left>　　1.<FONT color=#ff0000> BufferedReader</FONT>是<FONT color=#ff0000>Reader</FONT>的一个子类，它具有缓冲的作用，避免了频繁的从物理设备中读取信息。它有以下两个构造函数：</P>
<TABLE class=code cellSpacing=2 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD><FONT color=#ff0000><SPAN class=unnamed1>BufferedReader</SPAN></FONT><SPAN class=unnamed1>（<FONT color=#0000ff>Reader</FONT> in） <BR><FONT color=#ff0000>BufferedReader</FONT>（<FONT color=#0000ff>Reader</FONT> in, <FONT color=#0000ff>int</FONT> sz） </SPAN></TD></TR></TBODY></TABLE>
<P align=left>　　这里的sz是指定缓冲区的大小。</P>
<P align=left>　　它的基本方法：</P>
<TABLE class=code cellSpacing=2 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD><FONT color=#0000ff><SPAN class=unnamed1>void</SPAN></FONT><SPAN class=unnamed1><FONT color=#000000> close（</FONT>） <FONT color=#006600>//关闭流 </FONT><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>void </FONT>mark（int readAheadLimit）<FONT color=#006600> //标记当前位置</FONT><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>boolean</FONT> markSupported（） <FONT color=#006600>//是否支持标记</FONT><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>int</FONT> read（） <FONT color=#006600>//继承自Reader的基本方法</FONT><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>int</FONT> read（<FONT color=#0000ff>char</FONT>[] cbuf, <FONT color=#0000ff>int</FONT> off,<FONT color=#000000> <FONT color=#0000ff>int</FONT></FONT> len） <FONT color=#006600>//继承自Reader的基本方法</FONT><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>String</FONT> readLine（） <FONT color=#006600>//读取一行内容并以字符串形式返回</FONT><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>boolean</FONT> ready（） <FONT color=#006600>//判断流是否已经做好读入的准备</FONT><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>void</FONT> reset（） <FONT color=#006600>//重设到最近的一个标记</FONT><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>long</FONT> skip（<FONT color=#0000ff>long</FONT> n） <FONT color=#006600>//跳过指定个数的字符读取</FONT></SPAN></TD></TR></TBODY></TABLE>
<P align=left>　　2. <FONT color=#000000>InputStreamReader</FONT>是<FONT color=#000000>InputStream</FONT>和<FONT color=#000000>Reader</FONT>之间的桥梁，由于System.in是字节流，需要用它来包装之后变为字符流供给 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>BufferedReader</FONT>使用。<BR></P>
<P align=left>　　3. <FONT color=#0000ff>PrintWriter</FONT> out1 = <FONT color=#0000ff>new</FONT> PrintWriter（<FONT color=#0000ff>new</FONT> BufferedWriter（<FONT color=#0000ff>new</FONT> FileWriter（<FONT color=#ff00ff>"IODemo.out"</FONT>）））；</P>
<P align=left>　　这句话体现了Java输入输出系统的一个特点，为了达到某个目的，需要包装好几层。首先，输出目的地是文件IODemo.out，所以最内层包装的是FileWriter，建立一个输出文件流，接下来，我们希望这个流是缓冲的，所以用<FONT color=#ff0000>BufferedWriter</FONT>来包装它以达到目的，最后，我们需要格式化输出结果，于是将<FONT color=#ff0000>PrintWriter</FONT>包在最外层。<BR></P>
<P align=left>　　Java提供了这样一个功能，将标准的输入输出流转向，也就是说，我们可以将某个其他的流设为标准输入或输出流，看下面这个例子：</P>
<TABLE class=code cellSpacing=2 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P align=left><FONT color=#0000ff><SPAN class=unnamed1>import</SPAN></FONT><SPAN class=unnamed1> java.io.*；</SPAN></P>
<P class=unnamed1 align=left><FONT color=#0000ff>public class</FONT> Redirecting {<BR><FONT color=#0000ff><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void </FONT>main（<FONT color=#0000ff>String</FONT>[] args） throws <FONT color=#ff0000>IOException</FONT> {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>PrintStream</FONT> console = System.out；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>BufferedInputStream</FONT> in = <FONT color=#0000ff>new</FONT> <FONT color=#ff0000>BufferedInputStream</FONT>（ <FONT color=#0000ff>new</FONT><FONT color=#ff0000> FileInputStream</FONT>（ <FONT color=#ff00ff>"Redirecting.java"</FONT>））；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>PrintStream</FONT> out =<FONT color=#0000ff> new</FONT> <FONT color=#ff0000>PrintStream</FONT>（ new <FONT color=#ff0000>BufferedOutputStream</FONT>（<FONT color=#0000ff> new FileOutputStream</FONT>（<FONT color=#ff00ff>"test.out"</FONT>）））；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setIn（in）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setOut（out）；</P>
<P align=left><SPAN class=unnamed1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>BufferedReader</FONT> br = <FONT color=#0000ff>new</FONT> <FONT color=#ff0000>BufferedReader</FONT>（ <FONT color=#0000ff>new</FONT> <FONT color=#ff0000>InputStreamReader</FONT>（System.in））；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>String</FONT> s；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>while</FONT>（（s = br.readLine（）） !=<FONT color=#0000ff> null</FONT>）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println（s）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close（）； <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setOut（console）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>}</SPAN></P></TD></TR></TBODY></TABLE>
<P align=left>　　在这里java.lang.System的静态方法</P>
<TABLE class=code cellSpacing=2 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD><FONT color=#0000ff><SPAN class=unnamed1>static void</SPAN></FONT><SPAN class=unnamed1> setIn（InputStream in） <BR><FONT color=#0000ff>static void</FONT> setOut（PrintStream out） </SPAN></TD></TR></TBODY></TABLE>
<P align=left>　　提供了重新定义标准输入输出流的方法，这样做是很方便的，比如一个程序的结果有很多，有时候甚至要翻页显示，这样不便于观看结果，这是你就可以将标准输出流定义为一个文件流，程序运行完之后打开相应的文件观看结果，就直观了许多。</P>
<P align=left>　　Java流有着另一个重要的用途，那就是利用对象流对对象进行序列化。下面将开始介绍这方面的问题。</P>
<P align=left>　　在一个程序运行的时候，其中的变量数据是保存在内存中的，一旦程序结束这些数据将不会被保存，一种解决的办法是将数据写入文件，而Java中提供了一种机制，它可以将程序中的对象写入文件，之后再从文件中把对象读出来重新建立。这就是所谓的对象序列化Java中引入它主要是为了RMI（Remote Method Invocation）和<A class=bluekey href="http://www.yesky.com/key/4445/149445.html" target=_blank>Java Bean</A>所用，不过在平时应用中，它也是很有用的一种技术。</P>
<P align=left>　　所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子：</P>
<TABLE class=code cellSpacing=2 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P align=left><FONT color=#0000ff><SPAN class=unnamed1>import</SPAN></FONT><SPAN class=unnamed1> java.io.*；<BR><FONT color=#0000ff>import</FONT> java.util.*；</SPAN></P>
<P class=unnamed1 align=left><FONT color=#0000ff>public class</FONT> <A class=bluekey href="http://www.yesky.com/key/833/160833.html" target=_blank>Logon</A> implements Serializable {<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>private Date</FONT> date = <FONT color=#0000ff>new</FONT> Date（）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>private String</FONT> username；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>private transient String</FONT> password；</P>
<P class=unnamed1 align=left><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logon（<FONT color=#0000ff>String</FONT> <A class=bluekey href="http://www.yesky.com/key/99/160099.html" target=_blank>name</A>, <FONT color=#0000ff>String</FONT> pwd） {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username = name；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password = pwd；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P class=unnamed1 align=left><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>public String</FONT> toString（） {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>String</FONT> pwd = （password == <FONT color=#0000ff>null</FONT>） ? <FONT color=#ff00ff>"（n/a）"</FONT> : password；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return <FONT color=#ff00ff>"logon info: \n "</FONT> + <FONT color=#ff00ff>"username: "</FONT> + username + <FONT color=#ff00ff>"\n date: "</FONT> + date +<FONT color=#ff00ff> "\n password: "</FONT> + pwd；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P class=unnamed1 align=left><FONT color=#0000ff><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void</FONT> main（<FONT color=#ff0000>String[]</FONT> args） throws <FONT color=#ff0000>IOException</FONT>, ClassNotFoundException {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>Logon</FONT> a = <FONT color=#0000ff>new</FONT> Logon（<FONT color=#ff00ff>"Morgan"</FONT>, <FONT color=#ff00ff>"morgan83"</FONT>）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>System</FONT>.out.println（ <FONT color=#ff00ff>"logon a = "</FONT> + a）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>ObjectOutputStream</FONT> o = <FONT color=#0000ff>new</FONT> <FONT color=#ff0000>ObjectOutputStream</FONT>（ <FONT color=#0000ff>new</FONT> <FONT color=#ff0000>FileOutputStream</FONT>（<FONT color=#ff00ff>"Logon.out"</FONT>））；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.writeObject（a）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.close（）；</P>
<P align=left><SPAN class=unnamed1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>int</FONT> seconds = 5；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>long</FONT> t = <FONT color=#ff0000>System</FONT>.currentTimeMillis（）&nbsp;+ seconds * 1000；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#0000ff>while</FONT>（<FONT color=#ff0000>System</FONT>.currentTimeMillis（） &lt; t） ；<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>ObjectInputStream</FONT> in = <FONT color=#0000ff>new</FONT><FONT color=#ff0000> ObjectInputStream</FONT>（ <FONT color=#0000ff>new</FONT> <FONT color=#ff0000>FileInputStream</FONT>（<FONT color=#ff00ff>"Logon.out"</FONT>））；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>System</FONT>.out.println（ <FONT color=#ff00ff>"Recovering object at "</FONT> + <FONT color=#0000ff>new</FONT> Date（））；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a = （Logon）in.readObject（）；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>System</FONT>.out.println（<FONT color=#ff00ff>"logon a = "</FONT> + a）； <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></P></TD></TR></TBODY></TABLE>
<P align=left>　　类Logon是一个记录登录信息的类，包括用户名和密码。首先它实现了接口Serializable，这就标志着它可以被序列化。之后再main方法里<FONT color=#ff0000>ObjectOutputStream</FONT> o = <FONT color=#0000ff>new</FONT> <FONT color=#ff0000>ObjectOutputStream</FONT>（ <FONT color=#0000ff>new</FONT> <FONT color=#ff0000>FileOutputStream</FONT>（<FONT color=#ff00ff>"Logon.out"</FONT>））；新建一个对象输出流包装一个文件流，表示对象序列化的目的地是文件Logon.out。然后用方法<FONT color=#ff0000>writeObject</FONT>开始写入。想要还原的时候也很简单<FONT color=#ff0000>ObjectInputStream </FONT>in = <FONT color=#0000ff>new</FONT> <FONT color=#ff0000>ObjectInputStream</FONT>（ <FONT color=#0000ff>new</FONT> <FONT color=#ff0000>FileInputStream</FONT>（<FONT color=#ff00ff>"Logon.out"</FONT>））；新建一个对象输入流以文件流Logon.out为参数，之后调用readObject方法就可以了。</P>
<P align=left>　　需要说明一点，对象序列化有一个神奇之处就是，它建立了一张对象网，将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件，更为奇妙的是，如果你一次序列化了好几个对象，它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝。</P>
<P align=left>　　关键字transient在这里表示当前内容将不被序列化，比如例子中的密码，需要保密，所以没有被写入文件。</P>
<P align=left>　　对Java的输入输出功能，就浅浅的介绍到这里，本文的目的只是开一个好头，希望能让大家对Java输入输出流有个基本的认识。</P></DIV><img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/7393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2006-03-09 10:28 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2006/03/09/7393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse, Lomboz and Tomcat 的配置和调试</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2005/12/05/5183.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Mon, 05 Dec 2005 07:47:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2005/12/05/5183.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/5183.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2005/12/05/5183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/5183.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/5183.html</trackback:ping><description><![CDATA[一、安装准备&nbsp;<BR>在进行安装以前，你应该准备以下软件：&nbsp;<BR>&nbsp;软件:j2sdk-1_4_2_04-windows-i586-p.exe<BR>&nbsp;版本:1.4.2_04&nbsp;<BR>&nbsp;官方下载:<A href="http://java.sun.com/j2se/1.4.2/download.html">http://java.sun.com/j2se/1.4.2/download.html</A>&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;软件:jakarta-tomcat-5.0.28.exe&nbsp;<BR>&nbsp;版本:5.0.28&nbsp;<BR>&nbsp;官方下载:<A href="http://www.apache.org/dist/jakarta/">http://www.apache.org/dist/jakarta/</A>&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;软件:jakarta-struts-1.1.zip&nbsp;<BR>&nbsp;版本:1.1&nbsp;<BR>&nbsp;官方下载:<A href="http://www.apache.org/dist/jakarta/struts/">http://www.apache.org/dist/jakarta/struts/</A>&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;软件:eclipse-SDK-2.1.3-win32.zip&nbsp;<BR>&nbsp;版本:2.1.3&nbsp;<BR>&nbsp;官方下载:<A href="http://www.eclipse.org/downloads/index.php">http://www.eclipse.org/downloads/index.php</A>&nbsp;<BR>&nbsp;ftp://download2.eclipse.org/R-2.1.1-200306271545/eclipse-SDK-2.1.1-win32.zip&nbsp;<BR>&nbsp;备注:目前eclipse最新版为eclipse3.0&nbsp;<BR>&nbsp;软件:eclipse2.1.1-SDK-win-LanguagePackFeature.zip&nbsp;&nbsp;<BR>&nbsp;版本:2.1.1&nbsp;<BR>&nbsp;官方下载:<A href="http://download2.eclipse.org/downloads/drops/">http://download2.eclipse.org/downloads/drops/</A><BR>&nbsp;L-2.1.x%20Translations-200307021300<BR>&nbsp;/eclipse2.1.1-SDK-win-LanguagePackFeature.zip&nbsp;&nbsp;<BR>&nbsp;备注:该版本只能汉化eclipse2.1.3及以下版本&nbsp;<BR>&nbsp;软件:TomcatPlugin&nbsp;<BR>&nbsp;版本:2.2.1&nbsp;<BR>&nbsp;官方下载:<A href="http://www.sysdeo.com/eclipse/tomcatPlugin.html">http://www.sysdeo.com/eclipse/tomcatPlugin.html</A>&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;软件:Lomboz&nbsp;<BR>&nbsp;版本:2.1.3&nbsp;<BR>&nbsp;官方下载:<A href="http://www.objectlearn.com/index.jsp">http://www.objectlearn.com/index.jsp</A>&nbsp;<BR>&nbsp;&nbsp;软件:EasyStruts&nbsp;<BR>&nbsp;版本:0.6.4&nbsp;<BR>&nbsp;官方下载:<A href="http://sourceforge.net/projects/easystruts">http://sourceforge.net/projects/easystruts</A>&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>如果要找其他eclipse插件可以去下面这个站点&nbsp;<BR><A href="http://www.eclipse-plugins.info/">http://www.eclipse-plugins.info/</A>&nbsp;<BR>&nbsp;&nbsp;<BR>二、JDK安装&nbsp;<BR>1．安装J2SE-SDK到C:\j2sdk1.4.2_04&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;部分目录结构如下：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\j2sdk1.4.2_04\bin&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\j2sdk1.4.2_04\lib&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\j2sdk1.4.2_04\jre<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;．．．&nbsp;<BR>2．配置环境变量如下：&nbsp;<BR>JAVA_HOME=C:\j2sdk1.4.2_04&nbsp;<BR>PATH=%PATH%;C:\j2sdk1.4.2_04\bin&nbsp;<BR>CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%TOMCAT_HOME%\common\lib\servlet-api.jar;%TOMCAT_HOME%\common\lib\jsp-api.jar<BR><BR>三、Tomcat安装&nbsp;<BR>1．安装jakarta-tomcat-5.0.28.exe到C:\Tomcat&nbsp;5.0&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;部分目录结构如下：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\Tomcat&nbsp;5.0\bin&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\Tomcat&nbsp;5.0\conf&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\Tomcat&nbsp;5.0\webapps&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;．．．&nbsp;<BR>2．配置环境变量如下：&nbsp;<BR>CATALINA_HOME=C:\Tomcat&nbsp;5.0<BR>TOMCAT_HOME=C:\Tomcat&nbsp;5.0&nbsp;<BR>四、Struts安装&nbsp;<BR>1．解压jakarta-struts-1.1.zip到C:\jakarta-struts-1.1&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;部分目录结构如下：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\jakarta-struts-1.1\lib&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:\jakarta-struts-1.1\webapps&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;．．．&nbsp;<BR>五、Eclipse安装&nbsp;<BR>1．解压eclipse-SDK-2.1.3-win32.zip到D:\eclipse&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;部分目录结构如下：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D:\eclipse\features&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D:\eclipse\plugins&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;．．．&nbsp;<BR>2．启动Eclipse，看看安装是否成功&nbsp;<BR>&nbsp;&nbsp;&nbsp;如果启动不成功，请查看JRE是否安装&nbsp;<BR>3．启动Eclipse，点击菜单&nbsp;windows-&gt;preferences&nbsp;<BR>&nbsp;&nbsp;&nbsp;在左边树中点击展开java，选择Installed&nbsp;JREs，&nbsp;<BR>如果Installed&nbsp;JREs如下则正确：&nbsp;<BR>&nbsp;JRE&nbsp;Type:Standard&nbsp;VM&nbsp;<BR>&nbsp;Name:j2re1.4.2_04&nbsp;<BR>&nbsp;Location:C:\j2sdk1.4.2_04\jre<BR><BR>六、Eclipse汉化&nbsp;<BR>1．解压eclipse2.1.2.1-SDK-win32-LanguagePackFeature.zip<BR>到D:\eclipse下&nbsp;<BR>将目录名eclipse2.1.2.1-SDK-win32-LanguagePackFeature<BR>改为eclipse2.1.2.1Language&nbsp;<BR>部分目录结构如下：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D:\eclipse\eclipse2.1.2.1Language\eclipse\features&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D:\eclipse\eclipse2.1.2.1Language\eclipse\plugins&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;．．．&nbsp;<BR>2．在E:\eclipse下新建文件夹links，使得文件夹links<BR>&nbsp;&nbsp;&nbsp;和文件夹eclipse2.1.2.1Language同级&nbsp;<BR>3．在D:\eclipse\links下新建文件，文件名任取，<BR>&nbsp;&nbsp;&nbsp;我们命名为language.link，打开此文件，&nbsp;<BR>加入&nbsp;path&nbsp;=&nbsp;D:\\eclipse\\eclipse2.1.2.1Language&nbsp;<BR>4．启动Eclipse，看看汉化是否成功，<BR>如不成功请检查language.link文件中配置信息<BR>path&nbsp;=&nbsp;D:\\eclipse\\eclipse2.1.2.1Language<BR>和汉化文件夹eclipse2.1.2.1Language的安装路径是否一致&nbsp;&nbsp;&nbsp;<BR>七、TomcatPlugin安装&nbsp;<BR>1．解压tomcatPluginV221.zip&nbsp;<BR>2．将解压目录tomcatPluginV221下<BR>文件夹com.sysdeo.eclipse.tomcat_2.2.1复制到eclipse安装<BR>目录中的plugins目录中，即D:\eclipse\plugins&nbsp;<BR>3．启动Eclipse&nbsp;<BR>4．启动后你将看到你的菜单上多了一个下拉项Tomcat，<BR>快捷栏里多了三个Tomcat的猫图表，如果没有看到，<BR>请点击&nbsp;窗口-&gt;定制透视图，展开树结构中的“其它”，选择“Tomcat”&nbsp;<BR>5．点击&nbsp;窗口-&gt;首选项&nbsp;<BR>&nbsp;在左边树中点击tomcat，<BR>&nbsp;设置tomcat&nbsp;version为version&nbsp;5.x&nbsp;<BR>&nbsp;设置tomcat-home为C:\Tomcat&nbsp;5.0<BR>&nbsp;设置perspective&nbsp;to&nbsp;switch&nbsp;when&nbsp;tomcat&nbsp;is&nbsp;started为java&nbsp;<BR>&nbsp;<BR>在左边树中点击tomcat-&gt;JVM&nbsp;setting，设置JRE为j2sdk1.4.2&nbsp;<BR>在“Tomcat”选项的子选项“JVM&nbsp;Settings”&nbsp;-&gt;&nbsp;“Classpath”中，<BR>添加&nbsp;Jar/Zip&nbsp;，该值应该是&nbsp;java_home/lib/tools.jar。<BR>这用于编译&nbsp;JSP&nbsp;文件。<BR>为项目的&nbsp;classpath&nbsp;引用设置&nbsp;classpath&nbsp;变量&nbsp;TOMCAT_HOME。<BR>要完成这一任务，请在与步骤&nbsp;5&nbsp;相同的弹出菜单中选择“Java”选项，<BR>然后选择“Classpath&nbsp;Variables”子选项，<BR>并添加一个新的变量“TOMCAT_HOME”，其路径是C:\Tomcat&nbsp;5.0。<BR>确保“Tomcat”菜单和&nbsp;3&nbsp;个工具栏按钮可用。到现在为止，<BR>我们应该在&nbsp;Java&nbsp;视图中可以看到一个“Tomcat”菜单和&nbsp;3&nbsp;个&nbsp;Tomcat&nbsp;工具栏<BR>按钮.如果您没有看到这些内容，回到“Window”菜单中，<BR>选择“Customize&nbsp;Perspective...”项，打开选项树，<BR>选中“Other”项并选中“Tomcat”子选项。&nbsp;<BR>点击应用确定&nbsp;<BR>6．点击快捷按钮“Start&nbsp;Tomcat”来启动Tomcat吧。&nbsp;&nbsp;&nbsp;<BR>八、Lomboz安装&nbsp;<BR>1．解压lomboz.213.zip&nbsp;<BR>2．将解压目录lomboz.213\plugins下文件夹com.objectlearn.jdt.j2ee<BR>和com.objectlearn.jdt.j2ee.editors&nbsp;复制到eclipse安装目录中的plugins<BR>目录中，即D:\eclipse\plugins&nbsp;<BR>3．启动Eclipse&nbsp;<BR>4．点击&nbsp;窗口-&gt;首选项&nbsp;<BR>&nbsp;&nbsp;在左边树中点击lomboz，设置JDK&nbsp;tools.jar位置为<BR>&nbsp;&nbsp;C:\j2sdk1.4.2_04\lib\tools.jar&nbsp;<BR>在左边树中点击lomboz-&gt;server&nbsp;definitions，<BR>设置Server&nbsp;Type为Apache&nbsp;Tomcat&nbsp;v5.0.x&nbsp;<BR>设置Application&nbsp;Server&nbsp;Directory为C:\Tomcat&nbsp;5.0<BR>设置classpath&nbsp;Variable&nbsp;Name为TOMCAT_HOME&nbsp;<BR>&nbsp;设置classpath&nbsp;Variable为C:\Tomcat&nbsp;5.0&nbsp;<BR>点击应用确定。<BR>九、easyStruts安装&nbsp;<BR>1．解压org.easystruts.eclipse_0.6.4.zip&nbsp;<BR>2．将解压目录org.easystruts.eclipse_0.6.4下文件夹<BR>com.cross.easystruts.eclipse_0.6.4复制到eclipse安装目录中的plugins<BR>目录中，即D:\eclipse\plugins&nbsp;<BR>3．启动Eclipse&nbsp;<BR>4．点击&nbsp;窗口-&gt;首选项&nbsp;<BR>&nbsp;在左边树中点击Easy&nbsp;Struts，选择struts1.1&nbsp;<BR>ADD&nbsp;JREs如下：&nbsp;<BR>struts.jar-C:\jakarta-struts-1.1\lib\struts.jar&nbsp;<BR>ADD&nbsp;TLDs如下：<BR>struts-tiles.tld-C:\jakarta-struts-1.1\lib\struts-tiles.tld&nbsp;<BR>struts-template.tld-C:\jakarta-struts-1.1\lib\struts-template.tld&nbsp;<BR>struts-nested.tld-C:\jakarta-struts-1.1\lib\struts-nested.tld&nbsp;<BR>struts-logic.tld-C:\jakarta-struts-1.1\lib\struts-logic.tld&nbsp;<BR>struts-html.tld-C:\jakarta-struts-1.1\lib\struts-html.tld&nbsp;<BR>struts-bean.tld-C:\jakarta-struts-1.1\lib\struts-bean.tld&nbsp;<BR>点击应用确定。<BR>至此，所有需要的插件都安装好了，下次详细讲述如何用eclipse<BR>来开发&nbsp;Struts&nbsp;应用程序<BR><BR><BR>/************************************************/<BR><BR>用个例子调试：<BR>建立工程&nbsp;<BR><BR>操作过程：&nbsp;<BR>菜单【文件】－【新建】选择【项目】如图所示<BR>&nbsp;<BR>点击下一步输入你的工程名称，如图所示<BR>&nbsp;<BR>点玩下一步后出现如下：<BR>，如图<BR>&nbsp;<BR>再下一步就出现如下，<BR>&nbsp;这时候要注意了，<BR>下一步&nbsp;<BR><BR>选择【Web&nbsp;Modules】添加Module&nbsp;如图所示&nbsp;<BR><BR>&nbsp;<BR><BR>输入&nbsp;Module名称&nbsp;[如：test]&nbsp;<BR>选择Targeted&nbsp;Servers&nbsp;,如图&nbsp;<BR>把JBOSS&nbsp;3.2.x改为选择配置好的【Apache&nbsp;Tomcat&nbsp;v&nbsp;4.01/4.02】,<BR>添加后（一定要添加），完成，如图所示[界面可能跟个人的界面设置不同而有所不同]&nbsp;<BR><BR>&nbsp;<BR>如果右边的没有代码显示的话，展开TestJsp,再展开test，双击index.jsp，这样就打开了<BR>好了，现在就让我们来调试这个程序吧<BR>启动tomcat，右键点击index.jsp，然后下拉到Lomboz&nbsp;J2EE,左击Check&nbsp;Jsp&nbsp;Syntax<BR><BR>如图：<BR><BR>&nbsp;<BR><BR>右键点击test，进行如下图操作：<BR>&nbsp;<BR>最后就是运行，如下图：<BR>&nbsp;<BR>然后就可以看到在浏览器上显示的结果了：）<BR><BR><BR>注：文章转自：<A href="http://www.javaresearch.org/article/showarticle.jsp?column=2&amp;thread=27151">http://www.javaresearch.org/article/showarticle.jsp?column=2&amp;thread=27151</A><BR><img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/5183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2005-12-05 15:47 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2005/12/05/5183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclpse 学习</title><link>http://www.cnitblog.com/xiaoyaocao/archive/2005/12/05/5179.html</link><dc:creator>逍遥草</dc:creator><author>逍遥草</author><pubDate>Mon, 05 Dec 2005 04:48:00 GMT</pubDate><guid>http://www.cnitblog.com/xiaoyaocao/archive/2005/12/05/5179.html</guid><wfw:comment>http://www.cnitblog.com/xiaoyaocao/comments/5179.html</wfw:comment><comments>http://www.cnitblog.com/xiaoyaocao/archive/2005/12/05/5179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/xiaoyaocao/comments/commentRss/5179.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/xiaoyaocao/services/trackbacks/5179.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;结束了一段的工作，今天又开始了为明天的生活而奔波。拿起书，重新走进编成的海洋，很多东西等待我去学习，去掌握。感觉有点手足无措。<BR>&nbsp;&nbsp;&nbsp;想想，还是从工具着手，然后结合书本动动手练习一下。我想这样掌握起来比较快点。<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; 
<P><A name=N10045><SPAN class=atitle2>Eclipse 是什么？</SPAN></A><BR>Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言，它只是一个框架和一组服务，用于通过插件组件构建开发环境。幸运的是，Eclipse 附带了一个标准的插件集，包括 Java 开发工具（Java Development Tools，JDT）。</P>
<P>虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用，但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境（Plug-in Development Environment，PDE），这个组件主要针对希望扩展 Eclipse 的软件开发人员，因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件，对于给 Eclipse 提供插件，以及给用户提供一致和统一的集成开发环境而言，所有工具开发人员都具有同等的发挥场所。</P>
<P>这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的，但它的用途并不限于 Java 语言；例如，支持诸如 C/C++、COBOL 和 Eiffel 等编程语言的插件已经可用，或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础，比如内容管理系统。</P>
<P>基于 Eclipse 的应用程序的突出例子是 IBM 的 WebSphere Studio Workbench，它构成了 IBM Java 开发工具系列的基础。例如，WebSphere Studio Application Developer 添加了对 JSP、servlet、EJB、XML、Web 服务和数据库访问的支持。<BR><BR><BR>看这段介绍，不是很懂，但目前我就权当是做为Java&nbsp;的一个编译工具 来使用吧<BR><BR></P><SPAN class=atitle2><FONT size=4>Eclipse 安装</FONT><BR><BR>我下载了<SPAN class=atitle2>Eclipse3.1.1版本，解压后，运行eclipse.exe，提示我need jdk1.4.1。我记得我是装了jdk1.4.2<BR>的，不可能不支持吧。后来，去网上搜了一下，发现原来是因为我装了oracle，环境变量Path有问题。将jdk安装目录放在path的最前面，重起eclipse.exe，成功了！<BR><BR><SPAN class=atitle2>Eclipse 插件安装<BR><BR>原来我有MyEclipse 3.8.0 ,安装时，提示我选择eclipse的安装路径，选择好，点击next，提示我不对，郁闷，难道是因为我用的是eclipse3.1.1的版本？去<A href="http://www.myeclipseide.com/modules.php?op=modload&amp;name=Downloads&amp;file=dl_options">http://www.myeclipseide.com/modules.php?op=modload&amp;name=Downloads&amp;file=dl_options</A>注册一下，down来Myeclipse4 ，安装，一切ok。这个兼容真是有点问题哦</SPAN></SPAN></SPAN><img src ="http://www.cnitblog.com/xiaoyaocao/aggbug/5179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/xiaoyaocao/" target="_blank">逍遥草</a> 2005-12-05 12:48 <a href="http://www.cnitblog.com/xiaoyaocao/archive/2005/12/05/5179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>