<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>喝咖啡的小和尚</title>
<link>http://blogger.org.cn/blog/blog.asp?name=moshco</link>
<description>moshco zhu的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[关于Java之父戈斯林离职的愤怒]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=49943</link>
<author>moshco</author>
<pubDate>2010/9/30 23:48:07</pubDate>
<description><![CDATA[首先，我非常生气，非常！狗日的Oracle，太不是东西了，迟早全世界所有的程序员会把你抛弃，等着瞧吧，我敢肯定，你一定会被程序员抛弃的！因为你抛弃了我们程序员，完全不顾及他们的的尊严！<BR>骂完以后，我个人觉得，戈斯林，你不应该完全不顾及全世界的程序员的命运，而放弃Java，你应该明白Java对全世界所有的程序员来说是多么重要，如果把它交给你不放心的人，程序员们会有多么担心。<BR>程序员的命运太苦了，被些无耻之徒利用，然后抛弃。我们迟早会成长起来的，看吧，我们不仅会创建奇迹和伟大，同样会具备控制这一切的能力，不再被人左右。<BR>狗日Oracle，我还是要警告你，你会死的很惨，等着瞧吧！我还要警告你，全世界所有的程序员很生气，非常，没有我们的支持，你应该知道后果有多么严重，你最好收敛些，免得日后死的太惨！一个不懂的尊重人才的企业，不爱惜人才的企业，当然也不可能给这个世界掌握科技的人才们带来前途和希望，更不会给世界带来任何贡献，Oracle终将死去。抛弃人才，不尊重人才，没有人才，后果很严重，不会有人容许这种事情发生的......]]></description>
</item><item>
<title><![CDATA[在Weblogic 10中做EJB3的开发    之基础开发 (7)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29535</link>
<author>moshco</author>
<pubDate>2007/11/9 12:01:41</pubDate>
<description><![CDATA[
<P>在Weblogic 10中做EJB3的开发&nbsp;&nbsp;&nbsp; 之基础开发 (7)</P>
<P>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<BR>&nbsp;好了，现在可以编写表示层的代码了。<BR>&nbsp;文件地址：[WebContext/test/trade_record.jsp]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %&gt;<BR>&nbsp;&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<A href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</A>"&gt;<BR>&nbsp;&lt;html xmlns="<A href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</A>"&gt;<BR>&nbsp;&lt;head&gt;<BR>&nbsp;&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312" /&gt;<BR>&nbsp;&lt;title&gt;测试－交易记录&lt;/title&gt;<BR>&nbsp;&lt;/head&gt;<BR>&nbsp;&lt;script language="javascript" type="text/javascript"&gt;</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;getSysAliasAss<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;获取运行系统别名（辅助）<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function getSysAliasAss(){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取系统当前请求的pathName<BR>&nbsp;&nbsp;&nbsp;var strPathName = window.location.pathname;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//以字符串"/"分割到数组<BR>&nbsp;&nbsp;&nbsp;var oAryTmp = strPathName.split("/");<BR>&nbsp;&nbsp;&nbsp;//系统别名<BR>&nbsp;&nbsp;&nbsp;var strSysAlias = "/" + oAryTmp[1];<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return strSysAlias;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/*<BR>&nbsp;&nbsp; *&nbsp;函数名称：&nbsp;getDocXML<BR>&nbsp;&nbsp; *&nbsp;功能：&nbsp;&nbsp;数据文档对象<BR>&nbsp;&nbsp; *<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function getDocXML(strXMLUrl){<BR>&nbsp;&nbsp;&nbsp;var oXMLDoc = new ActiveXObject("Microsoft.XMLDOM");<BR>&nbsp;&nbsp;&nbsp;oXMLDoc.async = false;<BR>&nbsp;&nbsp;&nbsp;oXMLDoc.load(strXMLUrl);<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return oXMLDoc;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;queryUnsharp<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;模糊查询<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function queryUnsharp(){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//获取查询关键字<BR>&nbsp;&nbsp;&nbsp;var strKeyword = keyword.value;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/TradeRecordSV.do?dowith=queryUnsharp&amp;keyword=" + strKeyword;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var oXML = xmlHttpReq.responseXML;<BR>&nbsp;&nbsp;&nbsp;//alert(xmlHttpReq.responseText);</P>
<P>&nbsp;&nbsp;&nbsp;//样式表文档对象<BR>&nbsp;&nbsp;&nbsp;var strXMLUrl = getSysAliasAss() + "/xml/lstTradeRecord.xsl";<BR>&nbsp;&nbsp;&nbsp;var oXSL = getDocXML(strXMLUrl);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//转换为HTML代码<BR>&nbsp;&nbsp;&nbsp;var strHTML = oXML.transformNode(oXSL);<BR>&nbsp;&nbsp;&nbsp;//装载HTML<BR>&nbsp;&nbsp;&nbsp;lstTradeRecord.innerHTML = strHTML;<BR>&nbsp;&nbsp;&nbsp;detailTradeRecord.innerHTML ="";<BR>&nbsp;&nbsp;&nbsp;//alert(strHTML);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return oXML;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;findTradeRecord<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;模糊查询<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function findTradeRecord(iId){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//alert("[" + iId + "]");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if(iId == null || iId &lt; 0){<BR>&nbsp;&nbsp;&nbsp;&nbsp;return ;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/TradeRecordSV.do?dowith=findTradeRecord&amp;id=" + iId;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var oXML = xmlHttpReq.responseXML;<BR>&nbsp;&nbsp;&nbsp;//alert(xmlHttpReq.responseText);</P>
<P>&nbsp;&nbsp;&nbsp;//样式表文档对象<BR>&nbsp;&nbsp;&nbsp;var strXMLUrl = getSysAliasAss() + "/xml/detailTradeRecord.xsl";<BR>&nbsp;&nbsp;&nbsp;var oXSL = getDocXML(strXMLUrl);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//转换为HTML代码<BR>&nbsp;&nbsp;&nbsp;var strHTML = oXML.transformNode(oXSL);<BR>&nbsp;&nbsp;&nbsp;//装载HTML<BR>&nbsp;&nbsp;&nbsp;detailTradeRecord.innerHTML = strHTML;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return oXML;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&lt;/script&gt;</P>
<P>&nbsp;&lt;body&gt;<BR>&nbsp;&lt;p&gt;使用标签配置JNDI：&lt;br /&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;&lt;hr width="100%" size="1" /&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;&lt;table width="800" border="0" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"&gt;<BR>&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;td bgcolor="#FFFFFF"&gt;&lt;table width="100%" border="0" cellspacing="1" cellpadding="0"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&lt;td height="20" bgcolor="#CCCCCC"&gt;交易记录列表&lt;/td&gt;<BR>&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&lt;td height="20"&gt;&lt;hr width="100%" size="1" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<BR>&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&lt;td height="40" align="center"&gt;&lt;p&gt;查询内容：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name="keyword" type="text" id="keyword" size="40" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name="query" type="button" id="query" value="查询" onclick="queryUnsharp();" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/p&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td height="20" bgcolor="#FFFFFF" &gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span id="lstTradeRecord"&gt;&lt;/span&gt;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/table&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<BR>&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&lt;td height="40" align="center" valign="top"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;span id="detailTradeRecord"&gt;&lt;/span&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;<BR>&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&lt;/table&gt;<BR>&nbsp;&lt;/body&gt;<BR>&nbsp;&lt;/html&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<BR>&nbsp;下面是两个必要的样式表文件。</P>
<P>&nbsp;文件地址：[WebContext/xml/detailTradeRecord.xsl]<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;</P>
<P>&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;</P>
<P>&nbsp;&lt;xsl:stylesheet version="1.0"<BR>&nbsp;&nbsp;xmlns:xsl="<A href="http://www.w3.org/1999/XSL/Transform">http://www.w3.org/1999/XSL/Transform</A>"&gt;</P>
<P>&nbsp;&nbsp;&lt;xsl:template match="/"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;table width="50%" border="0" cellspacing="0" cellpadding="0"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:for-each select="beans/bean/field"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:sort data-type="number" order="ascending"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="@IndexOrder" /&gt;&lt;!-- ascending descending&nbsp; --&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td width="35%" height="20" align="left"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'Id'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编号&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'TradeType'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;交易类型&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'TimeBegin'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开始时间&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'GoodsName'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;货品名称&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'GoodsInfo'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;货品信息&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'Money'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总金额&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'MoneyInfo'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;金额相关信息&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'TradePoint'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;交易方向&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'User'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'Comrade'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;交易伙伴&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'State'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;状态&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name = 'Remark'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;备注&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td width="3%"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td width="62%" align="left"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:value-of select="." /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:for-each&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/table&gt;</P>
<P>&nbsp;&nbsp;&lt;/xsl:template&gt;<BR>&nbsp;&lt;/xsl:stylesheet&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;文件地址：[WebContext/xml/lstTradeRecord.xsl]<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;</P>
<P>&nbsp;&lt;xsl:stylesheet version="1.0"<BR>&nbsp;&nbsp;xmlns:xsl="<A href="http://www.w3.org/1999/XSL/Transform">http://www.w3.org/1999/XSL/Transform</A>"&gt;</P>
<P>&nbsp;&nbsp;&lt;xsl:template match="/"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;table width="100%" border="0" cellspacing="0"<BR>&nbsp;&nbsp;&nbsp;&nbsp;cellpadding="0"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#FFFF33"&gt;交易类型&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#FFFF33"&gt;开始时间&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#FFFF33"&gt;货品名称&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#FFFF33"&gt;总金额&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#FFFF33"&gt;交易方向&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#FFFF33"&gt;交易伙伴&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#FFFF33"&gt;状态&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#FFFF33"&gt;操作&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:for-each select="beans/bean"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:sort data-type="number" order="ascending"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select="@IndexOrder" /&gt;&lt;!-- ascending descending&nbsp; --&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:for-each select="field"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="@name != 'Id'"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#FFFFFF"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:value-of select="." /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:for-each&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#FFFFFF"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input name="findTradeRecord" type="button"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="findTradeRecord" value="详细"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:attribute name="onclick"&gt;findTradeRecord(&lt;xsl:value-of select="field[1]" /&gt;);&lt;/xsl:attribute&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/input&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:for-each&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:if test="count(beans/bean)=0"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="30" bgcolor="#FFFFFF" colspan="7"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;font color="red"&gt;没有找到数据！&lt;/font&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xsl:text disable-output-escaping="yes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xsl:if&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;/table&gt;</P>
<P>&nbsp;&nbsp;&lt;/xsl:template&gt;<BR>&nbsp;&lt;/xsl:stylesheet&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;好了，到此，可以编译发布了！</P>
<P>&nbsp;</P>
<P><BR>&nbsp;5.2 在同一个JVM中，使用依赖注入的方式访问本地容器中的EJB对象</P>
<P>&nbsp;现在我需要强调一点的是：在weblogic server中，如果你的servlet采用依赖注入（DI）的方式访问本地JVM中的EJB，必须要注意的是，web.xml中根节点[web-app]的属性[version]一定要等于[2.5]或者更高的版本，比如像写成下面这样：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;web-app version="2.5"&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这里，需要提醒一点的是，我们之前写成：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;web-app version="2.4" xmlns="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A>" xmlns:xsi="<A href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</A>" xsi:schemaLocation="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A> <A href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</A>"&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;它是不支持servlet中使用依赖注入的方式访问EJB3的。</P>
<P>&nbsp;还有一点就是：依赖注入只能注入本地服务器的对象，不能注入远程服务器的对象。</P>
<P>&nbsp;可以去这里参考一下：[http://edocs.bea.com.cn/wls/docs100/webapp/annotateservlet.html]</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;5.3 在配置文件中引用EJB，然后使用JNDI访问</P>
<P>&nbsp;</P>
<P>待续......</P>]]></description>
</item><item>
<title><![CDATA[在Weblogic 10中做EJB3的开发 之基础开发 (6)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29452</link>
<author>moshco</author>
<pubDate>2007/11/7 15:01:26</pubDate>
<description><![CDATA[<P><BR>在Weblogic 10中做EJB3的开发&nbsp;&nbsp;&nbsp; 之基础开发 (6)</P>
<P>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>5.访问EJB3</P>
<P>&nbsp;我们常用于访问EJB的可能有如下几种：<BR>&nbsp;1.EJB调用远程或本地JVM的EJB；<BR>&nbsp;2.Servlet访问远程或本地JVM的EJB；<BR>&nbsp;3.普通Java类也可以调用远程JVM的EJB；<BR>&nbsp;注意：这里的远程不一定是另外一台电脑。同一台电脑，如果一个是weblogic服务器，一个是运行中的普通Java类，它们也不是在同一个JVM中。</P>
<P>&nbsp;weblogic server中，EJB3提供的访问方式有：<BR>&nbsp;1.使用标签配置JNDI，然后使用这个JNDI访问EJB对象；<BR>&nbsp;2.在同一个JVM中，使用依赖注入的方式访问本地容器中的EJB对象；<BR>&nbsp;3.在配置文件中引用EJB，然后使用JNDI访问。</P>
<P>&nbsp;下面我对各种访问方式分别做一个例子。</P>
<P>&nbsp;5.1 使用标签配置JNDI，然后使用这个JNDI访问EJB对象</P>
<P>&nbsp;这种访问方式是EJB3最明显的特性。正是因为大量使用标签，EJB3的开发才大大降低了繁琐度、难度，使开发一个EJB变得十分简单和有趣。</P>
<P>&nbsp;下面我们设想一种业务需求来完成这种访问方式的演示。<BR>&nbsp;需求：用户账户有多条资金交易记录，现在把它查询列表显示，并提供每条记录的明细。<BR>&nbsp;设计：设计一个EJB用来操作用户账户交易记录，实现两个功能：模糊查询显示列表，根据ID查询显示详细；<BR>&nbsp;观察：EJB的JNDI采用标签配置。</P>
<P>&nbsp;<BR>&nbsp;第一要做的是创建数据库表，我是在MySQL中实现的，表的数据结构如下：<BR>&nbsp;表名：[traderecord]<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&nbsp; 字段&nbsp;&nbsp;数据类型&nbsp;&nbsp;&nbsp;编码类型&nbsp;可否为空&nbsp;默认值&nbsp;&nbsp;自动增加&nbsp;&nbsp;描述<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&nbsp; Id&nbsp;&nbsp;int(11)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;否&nbsp;&nbsp;&nbsp;&nbsp;auto_increment&nbsp;&nbsp;记录编号<BR>&nbsp;&nbsp; TradeType&nbsp;varchar(32)&nbsp;&nbsp;&nbsp;gbk_bin&nbsp;&nbsp;否&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;业务类型<BR>&nbsp;&nbsp; TimeBegin&nbsp;datetime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;否&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开始时间<BR>&nbsp;&nbsp; GoodsName&nbsp;varchar(256)&nbsp;&nbsp;&nbsp;gbk_bin&nbsp;&nbsp;是&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;货品名称<BR>&nbsp;&nbsp; GoodsInfo&nbsp;varchar(1024)&nbsp;&nbsp;&nbsp;gbk_bin&nbsp;&nbsp;是&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;货品信息<BR>&nbsp;&nbsp; Money&nbsp;&nbsp;float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总金额<BR>&nbsp;&nbsp; MoneyInfo&nbsp;varbinary(1024)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;否&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;金额信息<BR>&nbsp;&nbsp; TradePoint&nbsp;varchar(8) gbk_bin&nbsp;&nbsp;&nbsp;&nbsp;否&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;交易方向<BR>&nbsp;&nbsp; User&nbsp;&nbsp;varbinary(64)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;否&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户<BR>&nbsp;&nbsp; Comrade&nbsp;varchar(64) gbk_bin&nbsp;&nbsp;&nbsp;&nbsp;是&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;交易伙伴<BR>&nbsp;&nbsp; State&nbsp;&nbsp;varchar(8) gbk_bin&nbsp;&nbsp;&nbsp;&nbsp;否&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;状态<BR>&nbsp;&nbsp; Remark&nbsp;varchar(1024) gbk_bin&nbsp;&nbsp;&nbsp;&nbsp;是&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;备注<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&nbsp;</P>
<P><BR>&nbsp;我们创建两个业务Java Bean的类，这两个Bean类的主要作用是封装数据，数据格式标准化转换，这两个Java Bean类是继承一个基础Java Bean类。</P>
<P>&nbsp;基础Java Bean类。<BR>&nbsp;文件地址：[Java/JavaSource/com/mh/javabean/CommondBean.java]<BR>&nbsp;包路径：[com.mh.javabean]<BR>&nbsp;名称：[CommondBean]<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.javabean;</P>
<P>&nbsp;import java.io.Serializable;<BR>&nbsp;import java.lang.reflect.Field;<BR>&nbsp;import java.lang.reflect.InvocationTargetException;<BR>&nbsp;import java.lang.reflect.Method;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@SuppressWarnings("serial")<BR>&nbsp;public class CommondBean implements Serializable {</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：将Bean数组转化为XML字符串<BR>&nbsp;&nbsp; * @param bean<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws InvocationTargetException<BR>&nbsp;&nbsp; * @throws IllegalAccessException<BR>&nbsp;&nbsp; * @throws IllegalArgumentException<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public static String toXML(CommondBean[] aBean)<BR>&nbsp;&nbsp;&nbsp;&nbsp;throws IllegalArgumentException, IllegalAccessException,<BR>&nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException {</P>
<P>&nbsp;&nbsp;&nbsp;// 定义变量<BR>&nbsp;&nbsp;&nbsp;String strResult = "";</P>
<P>&nbsp;&nbsp;&nbsp;// Bean数组对象不能为空<BR>&nbsp;&nbsp;&nbsp;if (aBean == null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;return "";<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// xml头字符串<BR>&nbsp;&nbsp;&nbsp;strResult += "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n";<BR>&nbsp;&nbsp;&nbsp;strResult += "&lt;beans name=\"TradeRecordList\"&gt;\n";<BR>&nbsp;&nbsp;&nbsp;// 逐一处理数组中每一个Bean对象<BR>&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; aBean.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 获取Bean对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;CommondBean bean = aBean[i];<BR>&nbsp;&nbsp;&nbsp;&nbsp;strResult += bean.getBeanXML();<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;strResult += "&lt;/beans&gt;";</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return strResult;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：将Bean对象转换为XML字符串<BR>&nbsp;&nbsp; * @param bean<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws InvocationTargetException<BR>&nbsp;&nbsp; * @throws IllegalAccessException<BR>&nbsp;&nbsp; * @throws IllegalArgumentException<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public static String toXML(CommondBean bean)<BR>&nbsp;&nbsp;&nbsp;&nbsp;throws IllegalArgumentException, IllegalAccessException,<BR>&nbsp;&nbsp;&nbsp;&nbsp;InvocationTargetException {</P>
<P>&nbsp;&nbsp;&nbsp;// 定义变量<BR>&nbsp;&nbsp;&nbsp;String strResult = "";</P>
<P>&nbsp;&nbsp;&nbsp;// Bean数组对象不能为空<BR>&nbsp;&nbsp;&nbsp;if (bean == null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;return "";<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// xml头字符串<BR>&nbsp;&nbsp;&nbsp;strResult += "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n";<BR>&nbsp;&nbsp;&nbsp;strResult += "&lt;beans name=\"TradeRecordList\"&gt;\n";<BR>&nbsp;&nbsp;&nbsp;// 获取Bean对象<BR>&nbsp;&nbsp;&nbsp;strResult += bean.getBeanXML();<BR>&nbsp;&nbsp;&nbsp;strResult += "&lt;/beans&gt;";</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return strResult;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：获取Bean的XML字符串<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws InvocationTargetException<BR>&nbsp;&nbsp; * @throws IllegalAccessException<BR>&nbsp;&nbsp; * @throws IllegalArgumentException<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getBeanXML() throws IllegalArgumentException,<BR>&nbsp;&nbsp;&nbsp;&nbsp;IllegalAccessException, InvocationTargetException {</P>
<P>&nbsp;&nbsp;&nbsp;// 定义变量<BR>&nbsp;&nbsp;&nbsp;String strResult = "";</P>
<P>&nbsp;&nbsp;&nbsp;// 获取Bean对象的字段数组<BR>&nbsp;&nbsp;&nbsp;Field[] aFld = this.getClass().getDeclaredFields();<BR>&nbsp;&nbsp;&nbsp;if (aFld == null || aFld.length == 0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;return "";<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 获取Bean对象的方法数组<BR>&nbsp;&nbsp;&nbsp;Method[] aMth = this.getClass().getDeclaredMethods();<BR>&nbsp;&nbsp;&nbsp;if (aMth == null || aMth.length == 0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;return "";<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 开始组合：执行每一个有get方法、set方法的字段<BR>&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; aFld.length; i++) {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取字段的名称<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strFildName = aFld[i].getName();<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strNameGet = ("get" + strFildName).toLowerCase();<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strNameSet = ("set" + strFildName).toLowerCase();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 寻找get、set方法的标识<BR>&nbsp;&nbsp;&nbsp;&nbsp;boolean bGet = false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;boolean bSet = false;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// Get方法的位置<BR>&nbsp;&nbsp;&nbsp;&nbsp;int iGet = -1;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 搜索所有的方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;for (int j = 0; j &lt; aMth.length; j++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 匹配Get方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strNameGet.equals(aMth[j].getName().toLowerCase())) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bGet = true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iGet = j;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 匹配Set方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strNameSet.equals(aMth[j].getName().toLowerCase())) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bSet = true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (bGet &amp;&amp; bSet) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 组合XML字符串<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (bGet &amp;&amp; bSet &amp;&amp; iGet &gt;= 0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strResult += "\t\t&lt;field name=\"" + strFildName + "\"&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[] aO = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object oResult = aMth[iGet].invoke(this, aO);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (oResult != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strResult += oResult.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strResult += "&lt;/field&gt;\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if(strResult != null &amp;&amp; strResult.length() &gt; 0){<BR>&nbsp;&nbsp;&nbsp;&nbsp;strResult = "\t&lt;bean&gt;\n"+strResult+ "\t&lt;/bean&gt;\n";<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return strResult;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这个Bean类的作用，主要是将Bean类数据转换为XML字符串。它是一个Bean类的基础类，可以在这个类里面扩展一些JavaBean公用和基础的功能。<BR>&nbsp;这里我们主要实现了三个功能：<BR>&nbsp;&nbsp;public static String toXML(CommondBean[] aBean)：将Bean对象数组转换为标准的XML文件格式字符串；<BR>&nbsp;&nbsp;public static String toXML(CommondBean bean)：将Bean对象转换为标准的XML文件格式字符串；<BR>&nbsp;&nbsp;public String getBeanXML()：将Bean本自己转换为标准XML字符串。</P>
<P><BR>&nbsp;第一个Java Bean类。<BR>&nbsp;文件地址：[Java/JavaSource/com/mh/ejb3/test/javabean/TradeRecord.java]<BR>&nbsp;包路径：[com.mh.ejb3.test.javabean]<BR>&nbsp;名称：[TradeRecord]<BR>&nbsp;具体内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test.javabean;</P>
<P>&nbsp;import java.io.Serializable;<BR>&nbsp;import java.sql.Timestamp;</P>
<P>&nbsp;import com.mh.javabean.CommondBean;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@SuppressWarnings("serial")<BR>&nbsp;public class TradeRecord extends CommondBean {</P>
<P>&nbsp;&nbsp;private int Id = -1;</P>
<P>&nbsp;&nbsp;private String TradeType = null;</P>
<P>&nbsp;&nbsp;private Timestamp TimeBegin = null;</P>
<P>&nbsp;&nbsp;private String GoodsName = null;</P>
<P>&nbsp;&nbsp;private String GoodsInfo = null;</P>
<P>&nbsp;&nbsp;private String Money = null;</P>
<P>&nbsp;&nbsp;private String MoneyInfo = null;</P>
<P>&nbsp;&nbsp;private String TradePoint = null;</P>
<P>&nbsp;&nbsp;private String User = null;</P>
<P>&nbsp;&nbsp;private String Comrade = null;</P>
<P>&nbsp;&nbsp;private String State = null;</P>
<P>&nbsp;&nbsp;private String Remark = null;</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return remark<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getRemark() {<BR>&nbsp;&nbsp;&nbsp;return Remark;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param remark<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 remark<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setRemark(String remark) {<BR>&nbsp;&nbsp;&nbsp;Remark = remark;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return comrade<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getComrade() {<BR>&nbsp;&nbsp;&nbsp;return Comrade;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param comrade<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 comrade<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setComrade(String comrade) {<BR>&nbsp;&nbsp;&nbsp;Comrade = comrade;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return goodsInfo<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getGoodsInfo() {<BR>&nbsp;&nbsp;&nbsp;return GoodsInfo;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param goodsInfo<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 goodsInfo<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setGoodsInfo(String goodsInfo) {<BR>&nbsp;&nbsp;&nbsp;GoodsInfo = goodsInfo;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return goodsName<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getGoodsName() {<BR>&nbsp;&nbsp;&nbsp;return GoodsName;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param goodsName<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 goodsName<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setGoodsName(String goodsName) {<BR>&nbsp;&nbsp;&nbsp;GoodsName = goodsName;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return id<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public int getId() {<BR>&nbsp;&nbsp;&nbsp;return Id;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param id<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 id<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setId(int id) {<BR>&nbsp;&nbsp;&nbsp;Id = id;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return money<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getMoney() {<BR>&nbsp;&nbsp;&nbsp;return Money;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param money<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 money<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setMoney(String money) {<BR>&nbsp;&nbsp;&nbsp;Money = money;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return moneyInfo<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getMoneyInfo() {<BR>&nbsp;&nbsp;&nbsp;return MoneyInfo;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param moneyInfo<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 moneyInfo<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setMoneyInfo(String moneyInfo) {<BR>&nbsp;&nbsp;&nbsp;MoneyInfo = moneyInfo;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return state<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getState() {<BR>&nbsp;&nbsp;&nbsp;return State;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param state<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 state<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setState(String state) {<BR>&nbsp;&nbsp;&nbsp;State = state;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return timeBegin<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public Timestamp getTimeBegin() {<BR>&nbsp;&nbsp;&nbsp;return TimeBegin;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param timeBegin<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 timeBegin<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setTimeBegin(Timestamp timeBegin) {<BR>&nbsp;&nbsp;&nbsp;TimeBegin = timeBegin;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return tradePoint<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getTradePoint() {<BR>&nbsp;&nbsp;&nbsp;return TradePoint;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param tradePoint<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 tradePoint<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setTradePoint(String tradePoint) {<BR>&nbsp;&nbsp;&nbsp;TradePoint = tradePoint;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return tradeType<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getTradeType() {<BR>&nbsp;&nbsp;&nbsp;return TradeType;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param tradeType<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 tradeType<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setTradeType(String tradeType) {<BR>&nbsp;&nbsp;&nbsp;TradeType = tradeType;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return user<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getUser() {<BR>&nbsp;&nbsp;&nbsp;return User;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param user<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 user<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setUser(String user) {<BR>&nbsp;&nbsp;&nbsp;User = user;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;TradeRecord类的主要作用是封装交易记录完整信息。</P>
<P><BR>&nbsp;第二个Java Bean类。<BR>&nbsp;文件地址：[Java/JavaSource/com/mh/ejb3/test/javabean/TradeRecordList.java]<BR>&nbsp;包路径：[com.mh.ejb3.test.javabean]<BR>&nbsp;名称：[TradeRecordList]<BR>&nbsp;具体内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test.javabean;</P>
<P>&nbsp;import java.io.Serializable;<BR>&nbsp;import java.lang.reflect.Field;<BR>&nbsp;import java.lang.reflect.InvocationTargetException;<BR>&nbsp;import java.lang.reflect.Method;<BR>&nbsp;import java.sql.Timestamp;</P>
<P>&nbsp;import com.mh.javabean.CommondBean;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@SuppressWarnings("serial")<BR>&nbsp;public class TradeRecordList extends CommondBean{</P>
<P>&nbsp;&nbsp;private int Id = -1;</P>
<P>&nbsp;&nbsp;private String TradeType = null;</P>
<P>&nbsp;&nbsp;private Timestamp TimeBegin = null;</P>
<P>&nbsp;&nbsp;private String GoodsName = null;</P>
<P>&nbsp;&nbsp;private String Money = null;</P>
<P>&nbsp;&nbsp;private String TradePoint = null;</P>
<P>&nbsp;&nbsp;private String Comrade = null;</P>
<P>&nbsp;&nbsp;private String State = null;</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return comrade<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getComrade() {<BR>&nbsp;&nbsp;&nbsp;return Comrade;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param comrade<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 comrade<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setComrade(String comrade) {<BR>&nbsp;&nbsp;&nbsp;Comrade = comrade;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return goodsName<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getGoodsName() {<BR>&nbsp;&nbsp;&nbsp;return GoodsName;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param goodsName<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 goodsName<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setGoodsName(String goodsName) {<BR>&nbsp;&nbsp;&nbsp;GoodsName = goodsName;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return id<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public int getId() {<BR>&nbsp;&nbsp;&nbsp;return Id;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param id<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 id<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setId(int id) {<BR>&nbsp;&nbsp;&nbsp;Id = id;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return money<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getMoney() {<BR>&nbsp;&nbsp;&nbsp;return Money;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param money<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 money<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setMoney(String money) {<BR>&nbsp;&nbsp;&nbsp;Money = money;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return state<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getState() {<BR>&nbsp;&nbsp;&nbsp;return State;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param state<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 state<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setState(String state) {<BR>&nbsp;&nbsp;&nbsp;State = state;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return timeBegin<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public Timestamp getTimeBegin() {<BR>&nbsp;&nbsp;&nbsp;return TimeBegin;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param timeBegin<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 timeBegin<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setTimeBegin(Timestamp timeBegin) {<BR>&nbsp;&nbsp;&nbsp;TimeBegin = timeBegin;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return tradePoint<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getTradePoint() {<BR>&nbsp;&nbsp;&nbsp;return TradePoint;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param tradePoint<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 tradePoint<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setTradePoint(String tradePoint) {<BR>&nbsp;&nbsp;&nbsp;TradePoint = tradePoint;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @return tradeType<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String getTradeType() {<BR>&nbsp;&nbsp;&nbsp;return TradeType;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @param tradeType<BR>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要设置的 tradeType<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void setTradeType(String tradeType) {<BR>&nbsp;&nbsp;&nbsp;TradeType = tradeType;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;TradeRecordList类的作用主要是封装交易记录用来列表显示的信息。</P>
<P>&nbsp;到这里已经完成了数据模型的创建，接下来创建数据操作层DAO类。</P>
<P>&nbsp;创建DAO类。<BR>&nbsp;文件地址：[Java/JavaSource/com/mh/dao/test/TradeRecordDAO.java]<BR>&nbsp;包名：[com.mh.dao.test]<BR>&nbsp;名称：[TradeRecordDAO]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.dao.test;</P>
<P>&nbsp;import java.io.Serializable;<BR>&nbsp;import java.sql.Connection;<BR>&nbsp;import java.sql.PreparedStatement;<BR>&nbsp;import java.sql.ResultSet;<BR>&nbsp;import java.sql.SQLException;<BR>&nbsp;import java.util.ArrayList;<BR>&nbsp;import java.util.List;</P>
<P>&nbsp;import javax.sql.DataSource;</P>
<P>&nbsp;import com.mh.ejb3.test.javabean.TradeRecord;<BR>&nbsp;import com.mh.ejb3.test.javabean.TradeRecordList;<BR>&nbsp;import com.mh.util.DSUtil;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@SuppressWarnings("serial")<BR>&nbsp;public class TradeRecordDAO implements Serializable {</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：定义成员变量<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;private DataSource ds = null;</P>
<P>&nbsp;&nbsp;private Connection conn = null;</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：构造函数<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public TradeRecordDAO() {</P>
<P>&nbsp;&nbsp;&nbsp;// 获取数据源<BR>&nbsp;&nbsp;&nbsp;try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取数据源对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;ds = DSUtil.getDSObject("mysql_ejb31");<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 获取数据库连接<BR>&nbsp;&nbsp;&nbsp;&nbsp;conn = ds.getConnection();<BR>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：获取指定的Bean对象<BR>&nbsp;&nbsp; * @param iId<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public TradeRecord findTradeRecord(int iId) {</P>
<P>&nbsp;&nbsp;&nbsp;// 获取数据源<BR>&nbsp;&nbsp;&nbsp;TradeRecord bean = null;</P>
<P>&nbsp;&nbsp;&nbsp;try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 查询数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strSQL = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "select ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;Id,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;TradeType,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;TimeBegin,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;GoodsName,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;GoodsInfo,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;Money,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;MoneyInfo,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;TradePoint,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;User,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;Comrade,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;State,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;Remark ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "from ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;TradeRecord ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "where ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;Id = ?";<BR>&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement psta = conn.prepareStatement(strSQL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;psta.setInt(1, iId);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet rs = psta.executeQuery();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取结果<BR>&nbsp;&nbsp;&nbsp;&nbsp;while (rs.next()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 创建Bean对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean = new TradeRecord();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setId(rs.getInt("Id"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setTradeType(rs.getString("TradeType"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setTimeBegin(rs.getTimestamp("TimeBegin"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setGoodsName(rs.getString("GoodsName"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setGoodsInfo(rs.getString("GoodsInfo"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setMoney(rs.getString("Money"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setMoneyInfo(rs.getString("MoneyInfo"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setTradePoint(rs.getString("TradePoint"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setUser(rs.getString("User"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setComrade(rs.getString("Comrade"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setState(rs.getString("State"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setRemark(rs.getString("Remark"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 中断<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (conn != null &amp;&amp; !conn.isClosed()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;} catch (SQLException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;ds = null;<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return bean;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@SuppressWarnings("unchecked")<BR>&nbsp;&nbsp;public TradeRecordList[] queryUnsharp(String strKeyWord) {</P>
<P>&nbsp;&nbsp;&nbsp;// 获取数据源<BR>&nbsp;&nbsp;&nbsp;List lstTradeRecord = new ArrayList();<BR>&nbsp;&nbsp;&nbsp;TradeRecordList bean = null;<BR>&nbsp;&nbsp;&nbsp;TradeRecordList[] aBean = null;</P>
<P>&nbsp;&nbsp;&nbsp;try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 查询数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strSQL = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "select ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;Id,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;TradeType,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;TimeBegin,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;GoodsName,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;Money,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;TradePoint,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;Comrade,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;State ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "from ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;TradeRecord ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "where ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;GoodsName like concat('%',concat(?,'%'))";<BR>&nbsp;&nbsp;&nbsp;&nbsp;strSQL += "&nbsp;&nbsp;or Comrade like concat('%',concat(?,'%'))";<BR>&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement psta = conn.prepareStatement(strSQL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;psta.setString(1, strKeyWord);<BR>&nbsp;&nbsp;&nbsp;&nbsp;psta.setString(2, strKeyWord);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet rs = psta.executeQuery();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取结果<BR>&nbsp;&nbsp;&nbsp;&nbsp;while (rs.next()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 创建Bean对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean = new TradeRecordList();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setId(rs.getInt("Id"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setTradeType(rs.getString("TradeType"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setTimeBegin(rs.getTimestamp("TimeBegin"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setGoodsName(rs.getString("GoodsName"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setMoney(rs.getString("Money"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setTradePoint(rs.getString("TradePoint"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setComrade(rs.getString("Comrade"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setState(rs.getString("State"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 加入数组<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lstTradeRecord.add(bean);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 转换为数组<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (lstTradeRecord != null &amp;&amp; lstTradeRecord.size() &gt; 0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aBean = new TradeRecordList[lstTradeRecord.size()];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aBean = (TradeRecordList[]) lstTradeRecord.toArray(aBean);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (conn != null &amp;&amp; !conn.isClosed()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;} catch (SQLException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;ds = null;<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return aBean;<BR>&nbsp;&nbsp;}<BR>&nbsp;}</P>
<P>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这个DAO类实现的功能主要是：<BR>&nbsp;public TradeRecordDAO()：构造函数，用来获取数据源，DSUtil类的内容在上一篇文件中已经讲过了。需要注意的是数据源JNDI[mysql_ejb31]的配置大家要根据实际情况来写。<BR>&nbsp;public TradeRecord findTradeRecord(int iId)：根据记录Id，查找相关Bean对象。<BR>&nbsp;public TradeRecordList[] queryUnsharp(String strKeyWord)：通过关键字查询所有服务要求的Bean对象列表。</P>
<P><BR>&nbsp;下面介绍业务逻辑层的编写。</P>
<P>&nbsp;首先编写EJB。<BR>&nbsp;接口类。</P>
<P>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/labeljndi/TradeRecordManage.java]<BR>&nbsp;包名：[com.mh.ejb3.test.labeljndi]<BR>&nbsp;名称：[TradeRecordManage]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test.labeljndi;</P>
<P>&nbsp;import com.mh.ejb3.test.javabean.TradeRecord;<BR>&nbsp;import com.mh.ejb3.test.javabean.TradeRecordList;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public interface TradeRecordManage {</P>
<P>&nbsp;&nbsp;public TradeRecordList[] queryUnsharp(String strKeyWord);</P>
<P>&nbsp;&nbsp;public TradeRecord findTradeRecord(int iId);</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;</P>
<P>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/labeljndi/TradeRecordManageBean.java]<BR>&nbsp;包名：[com.mh.ejb3.test.labeljndi]<BR>&nbsp;名称：[TradeRecordManageBean]<BR>&nbsp;EJB类型：无状态会话Bean<BR>&nbsp;实现业务接口：远程接口<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test.labeljndi;</P>
<P>&nbsp;import javax.ejb.Remote;<BR>&nbsp;import javax.ejb.Stateless;</P>
<P>&nbsp;import com.mh.dao.test.TradeRecordDAO;<BR>&nbsp;import com.mh.ejb3.test.javabean.TradeRecord;<BR>&nbsp;import com.mh.ejb3.test.javabean.TradeRecordList;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@Stateless(mappedName = "TradeRecordManageBean")<BR>&nbsp;@Remote(TradeRecordManage.class)<BR>&nbsp;public class TradeRecordManageBean implements TradeRecordManage {</P>
<P>&nbsp;&nbsp;/*<BR>&nbsp;&nbsp; * （非 Javadoc）<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @see com.mh.ejb3.test.labeljndi.TradeRecordManage#findTradeRecord(int)<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public TradeRecord findTradeRecord(int iId) {</P>
<P>&nbsp;&nbsp;&nbsp;// 创建DAO对象<BR>&nbsp;&nbsp;&nbsp;TradeRecordDAO dao = new TradeRecordDAO();</P>
<P>&nbsp;&nbsp;&nbsp;// 实现业务操作<BR>&nbsp;&nbsp;&nbsp;TradeRecord bean = dao.findTradeRecord(iId);</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return bean;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/*<BR>&nbsp;&nbsp; * （非 Javadoc）<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @see com.mh.ejb3.test.labeljndi.TradeRecordManage#queryUnsharp(java.lang.String)<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public TradeRecordList[] queryUnsharp(String strKeyWord) {</P>
<P>&nbsp;&nbsp;&nbsp;// 创建DAO对象<BR>&nbsp;&nbsp;&nbsp;TradeRecordDAO dao = new TradeRecordDAO();</P>
<P>&nbsp;&nbsp;&nbsp;// 实现业务操作<BR>&nbsp;&nbsp;&nbsp;TradeRecordList[] aBean = dao.queryUnsharp(strKeyWord);</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return aBean;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;EJB实现了两个功能：[findTradeRecord]和[findTradeRecord]，一个是显示详细Bean数据，一个是显示模糊查询的列表。<BR>&nbsp;需要注意的是，我们这里采用的是通过注解来定义EJB的JNDI，根据[@Stateless(mappedName = "TradeRecordManageBean")]，我们可以确定JNDI应该是[TradeRecordManageBean@com.mh.ejb3.test.labeljndi.TradeRecordManage]，[@]后面的部分是EJB的接口全名称。</P>
<P><BR>&nbsp;接下来我们编写，逻辑控制层Servlet的代码。<BR>&nbsp;文件地址：[WebContext/JavaSource/com/mh/servlet/test/pay/TradeRecordSV.java]<BR>&nbsp;包名：[com.mh.servlet.test.pay]<BR>&nbsp;名称：[TradeRecordSV]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.servlet.test.pay;</P>
<P>&nbsp;import java.io.IOException;<BR>&nbsp;import java.io.PrintWriter;</P>
<P>&nbsp;import javax.servlet.ServletException;<BR>&nbsp;import javax.servlet.http.HttpServlet;<BR>&nbsp;import javax.servlet.http.HttpServletRequest;<BR>&nbsp;import javax.servlet.http.HttpServletResponse;</P>
<P>&nbsp;import com.mh.ejb3.test.javabean.TradeRecord;<BR>&nbsp;import com.mh.ejb3.test.javabean.TradeRecordList;<BR>&nbsp;import com.mh.ejb3.test.labeljndi.TradeRecordManage;<BR>&nbsp;import com.mh.util.EJBUtil;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@SuppressWarnings("serial")<BR>&nbsp;public class TradeRecordSV extends HttpServlet {</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void init() throws ServletException {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.init();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void destroy() {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.destroy();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doGet(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;doWork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doPost(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;doWork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：公共处理方法<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Excep<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;private void doWork(HttpServletRequest request, HttpServletResponse response)<BR>&nbsp;&nbsp;&nbsp;&nbsp;throws ServletException, IOException {</P>
<P>&nbsp;&nbsp;&nbsp;// 获取输出对象<BR>&nbsp;&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<BR>&nbsp;&nbsp;&nbsp;response.setCharacterEncoding("UTF-8"); // 设置输出编码<BR>&nbsp;&nbsp;&nbsp;response.setContentType("text/XML;charset=UTF-8");<BR>&nbsp;&nbsp;&nbsp;PrintWriter out = response.getWriter();<BR>&nbsp;&nbsp;&nbsp;// 结果值<BR>&nbsp;&nbsp;&nbsp;String message = "Test:&lt;br&gt;&lt;hr size='1'&gt;";</P>
<P>&nbsp;&nbsp;&nbsp;try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取参数<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strPara = (String) request.getParameter("dowith");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;if (strPara != null &amp;&amp; strPara.equals("queryUnsharp")) {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TradeRecordManage ejbDB = (TradeRecordManage) EJBUtil<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getEJBObject("TradeRecordManageBean#com.mh.ejb3.test.labeljndi.TradeRecordManage");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 模糊查询<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String strKeyWord = request.getParameter("keyword");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TradeRecordList[] aBean = ejbDB.queryUnsharp(strKeyWord);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Bean数组转换为XML字符串<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message = TradeRecordList.toXML(aBean);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("findTradeRecord")) {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TradeRecordManage ejbDB = (TradeRecordManage) EJBUtil<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getEJBObject("TradeRecordManageBean#com.mh.ejb3.test.labeljndi.TradeRecordManage");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 查询Bean对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int iId = Integer.parseInt(request.getParameter("id"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TradeRecord bean = ejbDB.findTradeRecord(iId);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Bean数组转换为XML字符串<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message = TradeRecord.toXML(bean);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;message += e.toString();<BR>&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 输出<BR>&nbsp;&nbsp;&nbsp;out.print(message);<BR>&nbsp;&nbsp;&nbsp;out.flush();<BR>&nbsp;&nbsp;&nbsp;out.close();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;上面的Servlet中，我们提交请求后返回的是XML标准文件字符串，主要是通过基础Bean类的[toXML]方法来转换的，之所以把他转换为XML字符串，是因为在js中可以使用不同的样式表来显示不同的样式。需要提醒一下的是，上面有一段是这样写的[response.setContentType("text/XML;charset=UTF-8");]，这是在告诉Servlet返回数据类型应该是text和xml格式，如果是HTML格式应该写成：[response.setContentType("text/html;charset=UTF-8");]。</P>
<P>&nbsp;因为创建了新的Servlet，所以，我们要在[web.xml]中加以定义。<BR>&nbsp;打开文件[WebContext/WEB-INF/web.xml]，添加下面这段：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&nbsp;&lt;!-- 定义一个Servlet --&gt;<BR>&nbsp;&nbsp;&lt;servlet&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;TradeRecordSV&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;com.mh.servlet.test.pay.TradeRecordSV<BR>&nbsp;&nbsp;&nbsp;&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;4&lt;/load-on-startup&gt;<BR>&nbsp;&nbsp;&lt;/servlet&gt;<BR>&nbsp;&nbsp;&lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;TradeRecordSV&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/sv/TradeRecordSV.do&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&lt;/servlet-mapping&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;<BR></P>]]></description>
</item><item>
<title><![CDATA[在Weblogic 10中做EJB3的开发    之基础开发 (5)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29414</link>
<author>moshco</author>
<pubDate>2007/11/6 15:37:32</pubDate>
<description><![CDATA[<P>在Weblogic 10中做EJB3的开发&nbsp;&nbsp;&nbsp; 之基础开发 (5)</P>
<P>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>4.配置数据源<BR>&nbsp;<BR>&nbsp;我这里使用的数据库是MySQL，版本是：5.0.37。下载安装的过程我就不多说了！我使用的客户端软件是：phpMyAdmin 2.10.0.2。如果能熟练使用MySQL命令，也可以不使用这个软件。</P>
<P>&nbsp;下载安装完成MySQL后，创建一个数据库，名称[ejb3]，在数据库中创建一个表[user]，表的结构如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;字段&nbsp;&nbsp;数据类型&nbsp;是否可为空&nbsp;&nbsp;其它&nbsp;&nbsp;&nbsp;备注<BR>&nbsp;id&nbsp;&nbsp;int&nbsp;&nbsp;否&nbsp;&nbsp;&nbsp;auto_increment&nbsp;&nbsp;记录编号<BR>&nbsp;Name&nbsp;&nbsp;varchar(64)&nbsp;否&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;姓名<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;向表[user]中插入几条记录，至少要有一条[id=1]的，等会程序会搜索这条记录。</P>
<P>&nbsp;启动weblogic服务，打开控制中心。</P>
<P>&nbsp;进入[Domain Structure]-&gt;[Services]-&gt;[JDBC]-&gt;[Data Sources]，然后点击左上角的[lock &amp;Edit]，然后点击[new]，创建一个新的数据源，设置[name="mysql_ejb31"]、[JNDI name = "mysql_ejb31"]、[Database Type ="MySQL"]、[Database Driver="com.mysql.jdbc.Driver"]，然后点击[Next]按钮，再次点击[Next]，[Database Name="ejb3"]、[Database Name="localhost"]、[Port="3306"]、[Database User Name ="root"]（这个要根据你自己的实际情况来填写），[Password=""][Confirm Password=""]（这两个也要根据你的实际情况填写）、然后点击[Next]，点击[Test Configuration]，测试一下我们的配置，如果上面显示成功，我们要继续点击[Next]，然后构选服务器[AdminServer]，点击[Finish]，最好点击左上角的[Activate Changes]。这样就算配置完成了！</P>
<P>&nbsp;做完上面的操作，你可以打开服务器[AdminServer]的JNDI树，看一下是否多了一个[mysql_ejb31]。</P>
<P>&nbsp;好！下面我们做一个程序来使用这个数据源。</P>
<P>&nbsp;首先创建一个工具类。<BR>&nbsp;文件地址：[Java/JavaSource/com/mh/util/DSUtil.java]<BR>&nbsp;包名：[com.mh.util]<BR>&nbsp;名称：[DSUtil]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.util;</P>
<P>&nbsp;import java.util.Properties;</P>
<P>&nbsp;import javax.naming.Context;<BR>&nbsp;import javax.naming.InitialContext;<BR>&nbsp;import javax.sql.DataSource;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public class DSUtil {</P>
<P>&nbsp;&nbsp;public static String Host = "localhost";<BR>&nbsp;&nbsp;static {<BR>&nbsp;&nbsp;&nbsp;Host = "localhost";<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @功能 获取EJB对象从默认的应用服务器<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Exception<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public static DataSource getDSObject(String strJNDI) throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;// 创建属性对象<BR>&nbsp;&nbsp;&nbsp;Properties props = new Properties();<BR>&nbsp;&nbsp;&nbsp;props.setProperty(Context.INITIAL_CONTEXT_FACTORY,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"weblogic.jndi.WLInitialContextFactory");<BR>&nbsp;&nbsp;&nbsp;props.setProperty(Context.PROVIDER_URL, "t3://" + Host + ":7001");</P>
<P>&nbsp;&nbsp;&nbsp;// 创建上下文环境对象<BR>&nbsp;&nbsp;&nbsp;InitialContext ctx;<BR>&nbsp;&nbsp;&nbsp;ctx = new InitialContext(props);</P>
<P>&nbsp;&nbsp;&nbsp;// 远程计算机<BR>&nbsp;&nbsp;&nbsp;DataSource oDS = (DataSource) ctx.lookup(strJNDI);</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return oDS;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @功能 获取本地EJB对象<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Exception<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public static DataSource getDSLocalObject(String strJNDI) throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;// 创建上下文环境对象<BR>&nbsp;&nbsp;&nbsp;InitialContext ctx;<BR>&nbsp;&nbsp;&nbsp;ctx = new InitialContext();</P>
<P>&nbsp;&nbsp;&nbsp;// 本地电脑<BR>&nbsp;&nbsp;&nbsp;DataSource oDS = (DataSource) ctx.lookup(strJNDI);</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return oDS;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这个类的作用主要是获取一个数据源，以后扩展它的功能，还可以用来管理多个数据源。<BR>&nbsp;<BR>&nbsp;下面创建一个接口程序。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/EJB3TestDBConnection.java]<BR>&nbsp;包名：[com.mh.ejb3.test]<BR>&nbsp;名称：[EJB3TestDBConnection]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; *<BR>&nbsp; */<BR>&nbsp;public interface EJB3TestDBConnection {<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;public String sayTest();</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;创建EJB的Bean类。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/EJB3TestDBConnectionBean.java]<BR>&nbsp;包名：[com.mh.ejb3.test]<BR>&nbsp;名称：[EJB3TestDBConnectionBean]<BR>&nbsp;EJB类型：无状态会话Bean<BR>&nbsp;实现接口：远程接口<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;import java.sql.Connection;<BR>&nbsp;import java.sql.PreparedStatement;<BR>&nbsp;import java.sql.ResultSet;<BR>&nbsp;import java.sql.SQLException;</P>
<P>&nbsp;import javax.ejb.Remote;<BR>&nbsp;import javax.ejb.Stateless;<BR>&nbsp;import javax.sql.DataSource;</P>
<P>&nbsp;import com.mh.util.DSUtil;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@Stateless(mappedName = "EJB3TestDBConnectionBean")<BR>&nbsp;@Remote(EJB3TestDBConnection.class)<BR>&nbsp;public class EJB3TestDBConnectionBean implements EJB3TestDBConnection {</P>
<P>&nbsp;&nbsp;/*<BR>&nbsp;&nbsp; * （非 Javadoc）<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @see com.mh.ejb3.test.EJB3TestDBConnection#sayTest()<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String sayTest() {</P>
<P>&nbsp;&nbsp;&nbsp;// 定义变量<BR>&nbsp;&nbsp;&nbsp;DataSource ds = null;<BR>&nbsp;&nbsp;&nbsp;Connection conn = null;<BR>&nbsp;&nbsp;&nbsp;String strMessage = "";</P>
<P>&nbsp;&nbsp;&nbsp;try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取数据源<BR>&nbsp;&nbsp;&nbsp;&nbsp;ds = DSUtil.getDSObject("mysql_ejb31");<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 获取数据库连接<BR>&nbsp;&nbsp;&nbsp;&nbsp;conn = ds.getConnection();<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (conn != null &amp;&amp; !conn.isClosed()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strMessage += "数据库连接成功！\n&lt;br&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 查询用户名<BR>&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement pre = conn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.prepareStatement("select Name from user where id = 1");<BR>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet rs = pre.executeQuery();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;while (rs.next()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strMessage += "Hello,";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strMessage += rs.getString("Name") + "!\n&lt;br&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;strMessage += "出错了：[" + e.toString() + "]\n&lt;br&gt;";<BR>&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (conn != null &amp;&amp; !conn.isClosed()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;} catch (SQLException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;ds = null;<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return strMessage;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;上面的程序，通过数据库的JNDI获取数据源，进而获取数据库连接，最后查询数据库表，获取用户名。</P>
<P>&nbsp;打开文件[WebContext/JavaSource/com/mh/servlet/test/CommonSV.java]，我们在servelt中加入下面这段：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&nbsp;&nbsp;} else if (strPara != null<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; strPara.equals("EJB3TestDBConnection")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;EJB3TestDBConnection test = (EJB3TestDBConnection) getEJBObject("EJB3TestDBConnectionBean#com.mh.ejb3.test.EJB3TestDBConnection");<BR>&nbsp;&nbsp;&nbsp;&nbsp;message += test.sayTest();<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<BR>&nbsp;在欢迎页面程序[WebContext/index.jsp]中加入下面这段：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;&lt;a<BR>&nbsp;&nbsp;href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=EJB3TestDBConnection"<BR>&nbsp;&nbsp;target="_blank"&gt;EJB3测试：使用数据库&lt;/a&gt;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<BR>&nbsp;好！现在可以编译发布看效果了！</P>]]></description>
</item><item>
<title><![CDATA[在Weblogic 10中做EJB3的开发    之基础开发 (4)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29352</link>
<author>moshco</author>
<pubDate>2007/11/5 10:17:50</pubDate>
<description><![CDATA[<P><BR>在Weblogic 10中做EJB3的开发&nbsp;&nbsp;&nbsp; 之基础开发 (4)</P>
<P>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;3.2 有状态会话Bean的生命周期</P>
<P>&nbsp;其实有状态会话Bean和无状态会话Bean都是有生命周期的，但是，清楚的掌握有状态的会话Bean的生命周期意义更为重要。</P>
<P>&nbsp;@PostConstruct：当bean对象完成实例化后，使用了这个注释的方法会被立即调用。这个注释同时适用于有状态和无状态的会话bean。<BR>&nbsp;@PreDestroy：使用这个注释的方法会在容器从它的对象池中销毁一个无用的或者过期的bean 实例之前调用。这个注释同时适用于有状态和无状态的会话bean。<BR>&nbsp;@PrePassivate：当一个有状态的session bean 实例空闲过长的时间，容器将会钝化(passivate)它，并把它的状态保存在缓存当中。使用这个注释的方法会在容器钝化bean 实例之前调用。这个注释适用于有状态的会话bean。当钝化后，又经过一段时间该bean 仍然没有被操作，容器将会把它从存储介质中删除。以后，任何针对该bean方法的调用容器都会抛出例外。<BR>&nbsp;@PostActivate：当客户端再次使用已经被钝化的有状态session bean 时，新的实例被创建，状态被恢复。使用此注释的session bean 会在bean 的激活完成时调用。这个注释只适用于有状态的会话bean。<BR>&nbsp;@Init：这个注释指定了有状态session bean 初始化的方法。它区别于@PostConstruct 注释在于：多个@Init注释方法可以同时存在于有状态session bean 中，但每个bean 实例只会有一个@Init 注释的方法会被调用。这取决于bean 是如何创建的（细节请看EJB 3.0 规范）。@PostConstruct 在@Init 之后被调用。<BR>&nbsp;另一个有用的生命周期方法注释是@Remove，特别是对于有状态session bean。当应用通过存根对象调用使用了@Remove 注释的方法时，容器就知道在该方法执行完毕后，要把bean 实例从对象池中移走。</P>
<P>&nbsp;下面我们做一个例子来体验一下有状态会话Bean的生命周期！</P>
<P>&nbsp;首先新建一个接口。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/statefull/TestLifeCycle.java]<BR>&nbsp;报名：[com.mh.ejb3.test.statefull]<BR>&nbsp;名称：[TestLifeCycle]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test.statefull;</P>
<P>&nbsp;import java.io.Serializable;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public interface TestLifeCycle extends Serializable {</P>
<P>&nbsp;&nbsp;public String sayTest();</P>
<P>&nbsp;&nbsp;public void remove();</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;需要注意的就是：有状态会话Bean是需要实现序列化接口的。</P>
<P>&nbsp;创建Bean类。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/statefull/TestLifeCycleBean.java]<BR>&nbsp;包名：[com.mh.ejb3.test.statefull]<BR>&nbsp;名称：[TestLifeCycleBean]<BR>&nbsp;EJB类型：[有状态会话Bean]<BR>&nbsp;实现接口：[远程接口]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test.statefull;</P>
<P>&nbsp;import javax.annotation.PostConstruct;<BR>&nbsp;import javax.annotation.PreDestroy;<BR>&nbsp;import javax.ejb.Init;<BR>&nbsp;import javax.ejb.PostActivate;<BR>&nbsp;import javax.ejb.PrePassivate;<BR>&nbsp;import javax.ejb.Remote;<BR>&nbsp;import javax.ejb.Remove;<BR>&nbsp;import javax.ejb.Stateful;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@SuppressWarnings("serial")<BR>&nbsp;@Stateful(mappedName = "TestLifeCycleBean")<BR>&nbsp;@Remote(TestLifeCycle.class)<BR>&nbsp;public class TestLifeCycleBean implements TestLifeCycle {</P>
<P>&nbsp;&nbsp;@Init<BR>&nbsp;&nbsp;public void ejbCreate() {</P>
<P>&nbsp;&nbsp;&nbsp;System.out.println("EJB3测试：有状态会话Bean生命周期，生命周期方法被容器调用：[初始化]。");<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@PostConstruct<BR>&nbsp;&nbsp;public void post() {</P>
<P>&nbsp;&nbsp;&nbsp;System.out.println("EJB3测试：有状态会话Bean生命周期，生命周期方法被容器调用：[初始化后的内容初始化]。");</P>
<P>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp; @PrePassivate<BR>&nbsp;&nbsp; public void passivate() {<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; System.out.println("EJB3测试：有状态会话Bean生命周期，生命周期方法被容器调用：[EJB处于钝化状态]。");<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; @PostActivate<BR>&nbsp;&nbsp; public void postActivate() {<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; System.out.println("EJB3测试：有状态会话Bean生命周期，生命周期方法被容器调用：[EJB处于钝化激活状态]。");<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;@Remove<BR>&nbsp;&nbsp;public void remove() {</P>
<P>&nbsp;&nbsp;&nbsp;System.out.println("EJB3测试：有状态会话Bean生命周期，生命周期方法被容器调用：[EJB将被删除]。");</P>
<P>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp; @PreDestroy<BR>&nbsp;&nbsp; public void destroy() {<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; System.out.println("EJB3测试：有状态会话Bean生命周期，生命周期方法被容器调用：[EJB处于销毁状态]。");<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;/*<BR>&nbsp;&nbsp; * （非 Javadoc）<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @see com.mh.ejb3.test.statefull.TestLifeCycle#sayTest()<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String sayTest() {</P>
<P>&nbsp;&nbsp;&nbsp;String strResult = "EJB3测试：有状态会话Bean的生命周期！业务方法被调用了！";</P>
<P>&nbsp;&nbsp;&nbsp;return strResult;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这个EJB的JNDI应该是：[TestLifeCycleBean#com.mh.ejb3.test.statefull.TestLifeCycle]。<BR>&nbsp;这里有个地方是要特别注意一下，就是：[@Init]定义的方法的名称在Weblogic中必须是[ejbCreate]，而且可以有多个，就像EJB的构造方法一样，容器会通用哪个，是由调用者决定的。</P>
<P>&nbsp;下面写访问的Servlet,打开文件[WebContext/JavaSource/com/mh/servlet/test/CommonSV.java]，添加下面一段：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("TestLifeCycle")) {<BR>&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;TestLifeCycle test = (TestLifeCycle) getEJBObject("TestLifeCycleBean#com.mh.ejb3.test.statefull.TestLifeCycle");<BR>&nbsp;&nbsp;message += test.sayTest() + "\n&lt;br&gt;";<BR>&nbsp;&nbsp;message += "这是一个关于有状态会话Bean的生命周期的例子！你注意观察控制台！";</P>
<P>&nbsp;&nbsp;// 把会话Bean保存到session中<BR>&nbsp;&nbsp;HttpSession session = request.getSession(true);<BR>&nbsp;&nbsp;session.setAttribute("TestLifeCycle", test);<BR>&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("RemoveTestLifeCycle")) {<BR>&nbsp;&nbsp;// 通过JNDI获取EJB对象</P>
<P>&nbsp;&nbsp;// 从session中取出之前的session Bean<BR>&nbsp;&nbsp;HttpSession session = request.getSession(true);<BR>&nbsp;&nbsp;TestLifeCycle test = (TestLifeCycle) session<BR>&nbsp;&nbsp;&nbsp;&nbsp;.getAttribute("TestLifeCycle");<BR>&nbsp;&nbsp;test.remove();</P>
<P>&nbsp;&nbsp;message += "删除有状态会话Bean完成！\n&lt;br&gt;";<BR>&nbsp;&nbsp;message += "这是一个关于有状态会话Bean的生命周期的例子！你注意观察控制台！";<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;在欢迎页面程序[WebContext/index.jsp]，加入下面这段：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;p&gt;&lt;center&gt;<BR>&nbsp;EJB3测试：有状态会话Bean生命周期的例子&lt;br&gt;<BR>&nbsp;&lt;a href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=TestLifeCycle" target="_blank"&gt;创建一个有状态会话Bean&lt;/a&gt;&lt;br&gt;<BR>&nbsp;&lt;a href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=RemoveTestLifeCycle" target="_blank"&gt;删除当前的有状态会话Bean&lt;/a&gt;&lt;br&gt;<BR>&nbsp;&lt;/center&gt;&lt;/p&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;编译发布程序，等一会你就可以看效果了！</P>
<P>&nbsp;如果发布的过程中，你遇到一些奇怪的问题，比如什么不能发布，或者能发布却不能激活，你可以打开你的电脑的任务管理器，看一看有没有一个叫[bea...]（后面部分不记得了）的进程，把它Kill，问题就解决了！这个是花费了我近2天的时间才发现的。</P>
<P>&nbsp;weblogic中，一个有状态会话Bean对象在容器中如果10分钟不被使用，它会被容器放人硬盘缓存，处于钝化状态；如果再过一段时间不被使用，它会被容器容器删除；如果中间有调用，它就会激活。</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[在Weblogic 10中做EJB3的开发    之基础开发 (3)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29351</link>
<author>moshco</author>
<pubDate>2007/11/5 10:13:44</pubDate>
<description><![CDATA[<P><BR>在Weblogic 10中做EJB3的开发&nbsp;&nbsp;&nbsp; 之基础开发 (3)</P>
<P>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>下面用jsp实现表示层，还是两个，一个是有状态会话Bean的业务，一个是无状态会话Bean的业务。</P>
<P>&nbsp;文件地址：[WebContext/JavaSource/com/mh/servlet/test/ejb3statefull/AccountMoneyStatelessSV.java]<BR>&nbsp;包名：[com.mh.servlet.test.ejb3statefull]<BR>&nbsp;名称：[AccountMoneyStatelessSV]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage=""%&gt;<BR>&nbsp;&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<A href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</A>"&gt;<BR>&nbsp;&lt;html xmlns="<A href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</A>"&gt;<BR>&nbsp;&lt;head&gt;<BR>&nbsp;&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312" /&gt;<BR>&nbsp;&lt;title&gt;测试－使用有状态会话Bean&lt;/title&gt;<BR>&nbsp;&lt;/head&gt;<BR>&nbsp;&lt;script language="javascript" type="text/javascript"&gt;</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;&nbsp;getSysAliasAss<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;获取运行系统别名（辅助）<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function getSysAliasAss(){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取系统当前请求的pathName<BR>&nbsp;&nbsp;&nbsp;var strPathName = window.location.pathname;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//以字符串"/"分割到数组<BR>&nbsp;&nbsp;&nbsp;var oAryTmp = strPathName.split("/");<BR>&nbsp;&nbsp;&nbsp;//系统别名<BR>&nbsp;&nbsp;&nbsp;var strSysAlias = "/" + oAryTmp[1];<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return strSysAlias;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;isInitAccount<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;是否已经初始化<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function isInitAccount(){<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=isInitAccount";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strIsInitAccount = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return strIsInitAccount;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;initAccount<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;初始化账户<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function initAccount(){<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//账户是否已经初始化<BR>&nbsp;&nbsp;&nbsp;var strIsInitAccount = isInitAccount();<BR>&nbsp;&nbsp;&nbsp;if(strIsInitAccount != null &amp;&amp; strIsInitAccount == "yes"){<BR>&nbsp;&nbsp;&nbsp;&nbsp;alert("账户已经初始化！不能重复初始化！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=initAccount";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strMessage = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;outMessage.innerHTML = strMessage;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//刷新账户状态<BR>&nbsp;&nbsp;&nbsp;refreshState();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;delAccount<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;删除账户<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function delAccount(){<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//账户是否已经初始化<BR>&nbsp;&nbsp;&nbsp;var strIsInitAccount = isInitAccount();<BR>&nbsp;&nbsp;&nbsp;if(strIsInitAccount != null &amp;&amp; strIsInitAccount == "no"){<BR>&nbsp;&nbsp;&nbsp;&nbsp;alert("账户还没有初始化！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=delAccount";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strMessage = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;outMessage.innerHTML = strMessage;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//刷新账户状态<BR>&nbsp;&nbsp;&nbsp;refreshState();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;charge<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;给账户冲值<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function charge(){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//获取账户<BR>&nbsp;&nbsp;&nbsp;var strAccountCharge = accountCharge.value;<BR>&nbsp;&nbsp;&nbsp;//金额<BR>&nbsp;&nbsp;&nbsp;var fMoney = chargeMoney.value;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=charge&amp;account=" + strAccountCharge + "&amp;money=" + fMoney;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strMessage = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;outMessage.innerHTML = strMessage;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;pay<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;账户扣款<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function pay(){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//获取账户<BR>&nbsp;&nbsp;&nbsp;var strAccountPay = accountPay.value;<BR>&nbsp;&nbsp;&nbsp;//金额<BR>&nbsp;&nbsp;&nbsp;var fMoney = payMoney.value;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=pay&amp;account=" + strAccountPay + "&amp;money=" + fMoney;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strMessage = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;outMessage.innerHTML = strMessage;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;refreshState<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;刷新账户状态<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function refreshState(){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=isInitAccount";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strIsInitAccount = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;if(strIsInitAccount != null &amp;&amp; strIsInitAccount == "no"){<BR>&nbsp;&nbsp;&nbsp;&nbsp;accountState.innerHTML = "&lt;font color='red'&gt;没有初始化&lt;/font&gt;";<BR>&nbsp;&nbsp;&nbsp;}else if(strIsInitAccount != null &amp;&amp; strIsInitAccount == "yes"){<BR>&nbsp;&nbsp;&nbsp;&nbsp;accountState.innerHTML = "&lt;font color='blue'&gt;激活&lt;/font&gt;";<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;account<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;获取账户余额<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function account(){<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//账户是否已经初始化<BR>&nbsp;&nbsp;&nbsp;var strIsInitAccount = isInitAccount();<BR>&nbsp;&nbsp;&nbsp;if(strIsInitAccount != null &amp;&amp; strIsInitAccount == "no"){<BR>&nbsp;&nbsp;&nbsp;&nbsp;alert("账户还没有初始化！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=account";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strMessage = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;outMessage.innerHTML = strMessage;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}</P>
<P><BR>&nbsp;&lt;/script&gt;</P>
<P>&nbsp;&lt;body&gt;<BR>&nbsp;&lt;p&gt;账户管理：&lt;br&gt;<BR>&nbsp;&lt;hr width="100%" size="1" /&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;&lt;table width="600" border="0" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"&gt;<BR>&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;td bgcolor="#FFFFFF"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;table width="600" border="0" cellspacing="1" cellpadding="0"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#CCCCCC"&gt;有状态会话Bean测试&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;hr width="100%" size="1" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td height="20"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input name="initAccount" type="button" id="initAccount" value="账户初始化" onclick="initAccount();" /&gt;&amp;nbsp; <BR>&nbsp;&nbsp;&lt;input type="button" name="Submit" value="删除账户A、B" onclick="delAccount();" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;账户当前状态：&lt;span id="accountState"&gt;&lt;/span&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input name="refreshState" type="button" id="refreshState" value="刷新" onclick="refreshState()" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20"&gt;选择一个账户：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;select name="accountCharge" id="accountCharge"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;选择一个账户&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="A"&gt;A&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="B"&gt;B&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="ALL"&gt;All&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/select&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 冲值金额： <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name="chargeMoney" type="text" id="chargeMoney" size="10" /&gt; 元 &lt;input<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name="charge" type="button" id="charge" value="冲值" onclick="charge();" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20"&gt;选择一个账户：<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;select name="accountPay" id="accountPay"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;选择一个账户&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="A"&gt;A&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="B"&gt;B&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="ALL"&gt;All&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/select&gt;<BR>&nbsp;扣款金额： <BR>&nbsp;&lt;input name="payMoney" type="text" id="payMoney" size="10" /&gt; 元 &lt;input name="pay"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="button" id="pay" value="扣款" onclick="pay();" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input name="account" type="button" id="account" value="账户余额" onclick="account();" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="40"&gt;&lt;span id="outMessage"&gt;&lt;/span&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/table&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&lt;/table&gt;<BR>&nbsp;&lt;/body&gt;<BR>&nbsp;&lt;/html&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这个是实现有状态会话Bean。</P>
<P><BR>&nbsp;文件地址：[WebContext/account_stateless.jsp]<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage=""%&gt;<BR>&nbsp;&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<A href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</A>"&gt;<BR>&nbsp;&lt;html xmlns="<A href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</A>"&gt;<BR>&nbsp;&lt;head&gt;<BR>&nbsp;&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312" /&gt;<BR>&nbsp;&lt;title&gt;测试－使用无状态会话Bean&lt;/title&gt;<BR>&nbsp;&lt;/head&gt;<BR>&nbsp;&lt;script language="javascript" type="text/javascript"&gt;</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;&nbsp;getSysAliasAss<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;获取运行系统别名（辅助）<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function getSysAliasAss(){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取系统当前请求的pathName<BR>&nbsp;&nbsp;&nbsp;var strPathName = window.location.pathname;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//以字符串"/"分割到数组<BR>&nbsp;&nbsp;&nbsp;var oAryTmp = strPathName.split("/");<BR>&nbsp;&nbsp;&nbsp;//系统别名<BR>&nbsp;&nbsp;&nbsp;var strSysAlias = "/" + oAryTmp[1];<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return strSysAlias;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;isInitAccount<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;是否已经初始化<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function isInitAccount(){<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=isInitAccount";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strIsInitAccount = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return strIsInitAccount;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;initAccount<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;初始化账户<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function initAccount(){<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//账户是否已经初始化<BR>&nbsp;&nbsp;&nbsp;var strIsInitAccount = isInitAccount();<BR>&nbsp;&nbsp;&nbsp;if(strIsInitAccount != null &amp;&amp; strIsInitAccount == "yes"){<BR>&nbsp;&nbsp;&nbsp;&nbsp;alert("账户已经初始化！不能重复初始化！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=initAccount";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strMessage = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;outMessage.innerHTML = strMessage;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//刷新账户状态<BR>&nbsp;&nbsp;&nbsp;refreshState();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;delAccount<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;删除账户<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function delAccount(){<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//账户是否已经初始化<BR>&nbsp;&nbsp;&nbsp;var strIsInitAccount = isInitAccount();<BR>&nbsp;&nbsp;&nbsp;if(strIsInitAccount != null &amp;&amp; strIsInitAccount == "no"){<BR>&nbsp;&nbsp;&nbsp;&nbsp;alert("账户还没有初始化！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=delAccount";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strMessage = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;outMessage.innerHTML = strMessage;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//刷新账户状态<BR>&nbsp;&nbsp;&nbsp;refreshState();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;charge<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;给账户冲值<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function charge(){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//获取账户<BR>&nbsp;&nbsp;&nbsp;var strAccountCharge = accountCharge.value;<BR>&nbsp;&nbsp;&nbsp;//金额<BR>&nbsp;&nbsp;&nbsp;var fMoney = chargeMoney.value;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=charge&amp;account=" + strAccountCharge + "&amp;money=" + fMoney;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strMessage = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;outMessage.innerHTML = strMessage;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;pay<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;账户扣款<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function pay(){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//获取账户<BR>&nbsp;&nbsp;&nbsp;var strAccountPay = accountPay.value;<BR>&nbsp;&nbsp;&nbsp;//金额<BR>&nbsp;&nbsp;&nbsp;var fMoney = payMoney.value;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=pay&amp;account=" + strAccountPay + "&amp;money=" + fMoney;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strMessage = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;outMessage.innerHTML = strMessage;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;refreshState<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;刷新账户状态<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function refreshState(){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=isInitAccount";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strIsInitAccount = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;if(strIsInitAccount != null &amp;&amp; strIsInitAccount == "no"){<BR>&nbsp;&nbsp;&nbsp;&nbsp;accountState.innerHTML = "&lt;font color='red'&gt;没有初始化&lt;/font&gt;";<BR>&nbsp;&nbsp;&nbsp;}else if(strIsInitAccount != null &amp;&amp; strIsInitAccount == "yes"){<BR>&nbsp;&nbsp;&nbsp;&nbsp;accountState.innerHTML = "&lt;font color='blue'&gt;激活&lt;/font&gt;";<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; *&nbsp;函数名：&nbsp;account<BR>&nbsp;&nbsp; *&nbsp;功能描述：&nbsp;获取账户余额<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;function account(){<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//账户是否已经初始化<BR>&nbsp;&nbsp;&nbsp;var strIsInitAccount = isInitAccount();<BR>&nbsp;&nbsp;&nbsp;if(strIsInitAccount != null &amp;&amp; strIsInitAccount == "no"){<BR>&nbsp;&nbsp;&nbsp;&nbsp;alert("账户还没有初始化！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//创建Ajax对象<BR>&nbsp;&nbsp;&nbsp;var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//确定请求的Url<BR>&nbsp;&nbsp;&nbsp;var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=account";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//发出请求<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.open("GET", strUrl, false);<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");<BR>&nbsp;&nbsp;&nbsp;xmlHttpReq.send();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//读取数据<BR>&nbsp;&nbsp;&nbsp;var strMessage = xmlHttpReq.responseText;<BR>&nbsp;&nbsp;&nbsp;outMessage.innerHTML = strMessage;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;//返回函数值<BR>&nbsp;&nbsp;&nbsp;return true;<BR>&nbsp;&nbsp;}</P>
<P><BR>&nbsp;&lt;/script&gt;</P>
<P>&nbsp;&lt;body&gt;<BR>&nbsp;&lt;p&gt;账户管理：&lt;br&gt;<BR>&nbsp;&lt;hr width="100%" size="1" /&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;&lt;table width="600" border="0" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"&gt;<BR>&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;td bgcolor="#FFFFFF"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;table width="600" border="0" cellspacing="1" cellpadding="0"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20" bgcolor="#CCCCCC"&gt;无状态会话Bean测试&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;hr width="100%" size="1" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td height="20"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input name="initAccount" type="button" id="initAccount" value="账户初始化" onclick="initAccount();" /&gt;&amp;nbsp; <BR>&nbsp;&nbsp;&lt;input type="button" name="Submit" value="删除账户A、B" onclick="delAccount();" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;账户当前状态：&lt;span id="accountState"&gt;&lt;/span&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input name="refreshState" type="button" id="refreshState" value="刷新" onclick="refreshState()" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20"&gt;选择一个账户：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;select name="accountCharge" id="accountCharge"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;选择一个账户&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="A"&gt;A&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="B"&gt;B&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="ALL"&gt;All&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/select&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 冲值金额： <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input name="chargeMoney" type="text" id="chargeMoney" size="10" /&gt; 元 &lt;input<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name="charge" type="button" id="charge" value="冲值" onclick="charge();" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20"&gt;选择一个账户：<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;select name="accountPay" id="accountPay"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;选择一个账户&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="A"&gt;A&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="B"&gt;B&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="ALL"&gt;All&lt;/option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/select&gt;<BR>&nbsp;扣款金额： <BR>&nbsp;&lt;input name="payMoney" type="text" id="payMoney" size="10" /&gt; 元 &lt;input name="pay"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="button" id="pay" value="扣款" onclick="pay();" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="20"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input name="account" type="button" id="account" value="账户余额" onclick="account();" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td height="40"&gt;&lt;span id="outMessage"&gt;&lt;/span&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/table&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/td&gt;<BR>&nbsp;&nbsp;&lt;/tr&gt;<BR>&nbsp;&lt;/table&gt;<BR>&nbsp;&lt;/body&gt;<BR>&nbsp;&lt;/html&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这个是实现无状态会话Bean。</P>
<P>&nbsp;上面两个表示层使用了Ajx技术，据微软说Ajax是一种老调重谈的技术，但是我很纳闷，为什么以前我一直想要实现这样的效果就从来没有人跟我说呢？！所以，我觉得AJax是一门新技术，而且应该再次基础上发展，它应该是很有潜质的。</P>
<P>&nbsp;接下来要在欢迎页面[WebContext/index.jsp]中加入下面的部分：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;<BR>&nbsp;EJB3测试：有状态会话Bean与无状态会话Bean的差别&lt;br&gt;<BR>&nbsp;&lt;a href="&lt;%=request.getContextPath() %&gt;/account.jsp" target="_blank"&gt;账户管理：有状态会话Bean实现&lt;/a&gt;&lt;br&gt;<BR>&nbsp;&lt;a href="&lt;%=request.getContextPath() %&gt;/account_stateless.jsp" target="_blank"&gt;账户管理：无状态会话Bean实现&lt;/a&gt;<BR>&nbsp;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;<BR>&nbsp;最后使用[build.xml]来构建发布程序吧！</P>
<P><BR>&nbsp;测试效果的时候，你会发现，有状态的两个账户[A、B]的金额是无不关连互不影响的，但是，无状态就会出现，A账户增加减少金额，会反应在A、B上，而且删除账户后，再从新创建账户，账户的金额会反应在新创建的账户上。这就就说明，无状态会话Bean是可以被重复利用，并不会因为一个用户不使用就从容器中删除，而是由容器来合理配置，继续提供给下一个用户使用；而用状态会话Bean它只与一个用户保持关联，每个用户的调用，都是一个新的Bean对象。</P>
<P><BR>&nbsp;</P>
<P><BR>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[在Weblogic 10中做EJB3的开发    之基础开发 (2)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29350</link>
<author>moshco</author>
<pubDate>2007/11/5 10:11:05</pubDate>
<description><![CDATA[
<P><BR>在Weblogic 10中做EJB3的开发&nbsp;&nbsp;&nbsp; 之基础开发 (2)</P>
<P>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P><BR>3.有状态会话Bean的使用</P>
<P><BR>&nbsp;3.1 有状态会话Bean与无状态会话Bean的差异</P>
<P>&nbsp;在EJB的容器中，服务器启动以后，容器会预先创建一些EJB对象在容器中，其目的是让调用者能更高效率的使用EJB对象。创建的的这些EJB对象有的是有状态会话Bean，有的是无状态会话Bean，它们的区别主要在于：有状态会话Bean被一个使用者调用后，它就不会再被其它使用者调用；而无状态会话Bean，可以被多个使用者调用，一个用完了，另一个可以接着使用。由此大家可以看出，简单的从效率方面讲，无状态会话Bean明显更好。但是，在有些时候，用户会有一些这样的需求，他们希望在某段时间内，保存一些他自己的信息，而这些信息只能他自己修改使用，不能被其它使用者修改使用，而这一点使用无状态会话Bean是做不到的。</P>
<P>&nbsp;下面我设想一个需求：用户有一个资金账户，他消费后账户资金会减少，他充值后账户资金会增加。<BR>&nbsp;设计方案如下：创建一个EJB对象，定义一个成员变量来保存资金数额，定义三个业务方法，一个冲值，一个是消费，一个获取剩余资金数额。<BR>&nbsp;测试方案：使用一个Servlet创建两个EJB对象，对两个对象交叉进行通过一系列冲值和消费改变金额数量。<BR>&nbsp;观察：如果是有状态会话Bean，两个EJB对象无论你如何冲值消费，它们的金额互不受到影响。如果是无状态会话Bean，它们的金额会被另一个EJB的操作影响。<BR>&nbsp;结论：有状态会话Bean它会记录与操作者之间的联系，直到不再使用，只提供给一个用户使用；无状态会话Bean可以被多个用户同时操作，能够重复使用，效率极高。</P>
<P>&nbsp;接下来实现这个业务，看具体效果。</P>
<P>&nbsp;创建有状态会话Bean的远程接口。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/statefull/AccountMoney.java]<BR>&nbsp;包名：[com.mh.ejb3.test.statefull]<BR>&nbsp;名称：[AccountMoney]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test.statefull;</P>
<P>&nbsp;import java.io.Serializable;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public interface AccountMoney extends Serializable {</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：冲值<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float charge(float fMoney);</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：消费<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float pay(float fMoney);</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：剩余资金<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float account();</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;需要注意的一点是：有状态会话Bean一定要实现序列化接口，因为用户可能中间很长时间不使用，容器需要把它保存在硬盘上，以提高效率。</P>
<P>&nbsp;下面是有状态会话Bean的Bean类。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/statefull/AccountMoneyBean.java]<BR>&nbsp;包名：[com.mh.ejb3.test.statefull]<BR>&nbsp;名称：[AccountMoneyBean]<BR>&nbsp;EJB类型：[无状态会话Bean]<BR>&nbsp;实现接口：[远程接口]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;package com.mh.ejb3.test.statefull;</P>
<P>&nbsp;import javax.ejb.Remote;<BR>&nbsp;import javax.ejb.Stateful;</P>
<P>&nbsp;@SuppressWarnings("serial")<BR>&nbsp;@Stateful(mappedName = "AccountMoneyBean")<BR>&nbsp;@Remote(AccountMoney.class)<BR>&nbsp;public class AccountMoneyBean implements AccountMoney {</P>
<P>&nbsp;&nbsp;private float money = 0; // 账户金额</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：冲值<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float charge(float fMoney) {</P>
<P>&nbsp;&nbsp;&nbsp;money += fMoney;</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return money;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：消费<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float pay(float fMoney) {</P>
<P>&nbsp;&nbsp;&nbsp;money -= fMoney;</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return money;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：剩余资金<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float account() {</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return money;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;创建无状态会话Bean。</P>
<P>&nbsp;创建无状态会话Bean的远程接口<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/statefull/AccountMoneyStateless.java]<BR>&nbsp;包名：[com.mh.ejb3.test.statefull]<BR>&nbsp;名称：[AccountMoneyStateless]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test.statefull;</P>
<P><BR>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public interface AccountMoneyStateless {</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：冲值<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float charge(float fMoney);</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：消费<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float pay(float fMoney);</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：剩余资金<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float account();</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<BR>&nbsp;无状态会话Bean的Bean类。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/statefull/AccountMoneyStatelessBean.java]<BR>&nbsp;包名：[com.mh.ejb3.test.statefull]<BR>&nbsp;名称：[AccountMoneyStatelessBean]<BR>&nbsp;EJB类型：[无状态会话Bean]<BR>&nbsp;实现接口：[远程接口]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;package com.mh.ejb3.test.statefull;</P>
<P>&nbsp;import javax.ejb.Remote;<BR>&nbsp;import javax.ejb.Stateless;</P>
<P>&nbsp;@Stateless(mappedName = "AccountMoneyStatelessBean")<BR>&nbsp;@Remote(AccountMoneyStateless.class)<BR>&nbsp;public class AccountMoneyStatelessBean implements AccountMoneyStateless {</P>
<P>&nbsp;&nbsp;private float money = 0; // 账户金额</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：冲值<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float charge(float fMoney) {</P>
<P>&nbsp;&nbsp;&nbsp;money += fMoney;</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return money;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：消费<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float pay(float fMoney) {</P>
<P>&nbsp;&nbsp;&nbsp;money -= fMoney;</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return money;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：剩余资金<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public float account() {</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return money;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;到这里，我们已经创建完成了两个EJB，一个是用状态会话Bean[AccountMoney]，一个是无状态会话Bean[AccountMoneyStateless]，它们都实现了远程接口。</P>
<P>&nbsp;下面我们实现这个业务的控制和表示层。</P>
<P>&nbsp;首先，我们创建一个EJB的工具类。<BR>&nbsp;文件地址：[Java/JavaSource/com/mh/ejb/ejbutil.java]<BR>&nbsp;包名：[com.mh.ejb]<BR>&nbsp;名称：[ejbutil]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb;</P>
<P>&nbsp;import java.util.Properties;</P>
<P>&nbsp;import javax.naming.Context;<BR>&nbsp;import javax.naming.InitialContext;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public class ejbutil {</P>
<P>&nbsp;&nbsp;public static String Host = "localhost";<BR>&nbsp;&nbsp;static {<BR>&nbsp;&nbsp;&nbsp;Host = "localhost";<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @功能 获取EJB对象从默认的应用服务器<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Exception<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public static Object getEJBObject(String strJNDI) throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;// 创建属性对象<BR>&nbsp;&nbsp;&nbsp;Properties props = new Properties();<BR>&nbsp;&nbsp;&nbsp;props.setProperty(Context.INITIAL_CONTEXT_FACTORY,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"weblogic.jndi.WLInitialContextFactory");<BR>&nbsp;&nbsp;&nbsp;props.setProperty(Context.PROVIDER_URL, "t3://" + Host + ":7001");</P>
<P>&nbsp;&nbsp;&nbsp;// 创建上下文环境对象<BR>&nbsp;&nbsp;&nbsp;InitialContext ctx;<BR>&nbsp;&nbsp;&nbsp;ctx = new InitialContext(props);</P>
<P>&nbsp;&nbsp;&nbsp;// 本地接口<BR>&nbsp;&nbsp;&nbsp;Object oEJB = ctx.lookup(strJNDI);</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return oEJB;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @功能 获取本地EJB对象<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Exception<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public static Object getEJBLocalObject(String strJNDI) throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;// 创建上下文环境对象<BR>&nbsp;&nbsp;&nbsp;InitialContext ctx;<BR>&nbsp;&nbsp;&nbsp;ctx = new InitialContext();</P>
<P>&nbsp;&nbsp;&nbsp;// 本地接口<BR>&nbsp;&nbsp;&nbsp;Object oEJB = ctx.lookup(strJNDI);</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return oEJB;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这个类主要是提供几种方式，让使用者可以直接通过JNDI获取自己想要的EJB，并可以扩展功能用来管理分布在不同计算机上的EJB的访问。</P>
<P><BR>&nbsp;下面要写一个Servelt，用来控制并客户端各种请求，返回结果。<BR>&nbsp;文件地址：[WebContext/JavaSource/com/mh/servlet/test/ejb3statefull/AccountMoneySV.java]<BR>&nbsp;包名：[com.mh.servlet.test.ejb3statefulls]<BR>&nbsp;名称：[AccountMoneySV]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.servlet.test.ejb3statefull;</P>
<P>&nbsp;import java.io.IOException;<BR>&nbsp;import java.io.PrintWriter;</P>
<P>&nbsp;import javax.servlet.ServletException;<BR>&nbsp;import javax.servlet.http.HttpServlet;<BR>&nbsp;import javax.servlet.http.HttpServletRequest;<BR>&nbsp;import javax.servlet.http.HttpServletResponse;<BR>&nbsp;import javax.servlet.http.HttpSession;</P>
<P>&nbsp;import com.mh.ejb3.test.statefull.AccountMoney;<BR>&nbsp;import com.mh.util.ejbutil;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public class AccountMoneySV extends HttpServlet {</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void destroy() {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.destroy();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void init() throws ServletException {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.init();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doGet(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;dowork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doPost(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;dowork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：业务方法<BR>&nbsp;&nbsp; * @param request<BR>&nbsp;&nbsp; * @param response<BR>&nbsp;&nbsp; * @throws ServletException<BR>&nbsp;&nbsp; * @throws IOException<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;private void dowork(HttpServletRequest request, HttpServletResponse response)<BR>&nbsp;&nbsp;&nbsp;&nbsp;throws ServletException, IOException {</P>
<P>&nbsp;&nbsp;&nbsp;// 获取输出对象<BR>&nbsp;&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<BR>&nbsp;&nbsp;&nbsp;response.setCharacterEncoding("UTF-8"); // 设置输出编码<BR>&nbsp;&nbsp;&nbsp;response.setContentType("text/html;charset=UTF-8");<BR>&nbsp;&nbsp;&nbsp;PrintWriter out = response.getWriter();<BR>&nbsp;&nbsp;&nbsp;// 结果值<BR>&nbsp;&nbsp;&nbsp;String message = "";</P>
<P>&nbsp;&nbsp;&nbsp;try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpSession session = request.getSession(true);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取参数<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strPara = (String) request.getParameter("dowith");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 通过参数实现业务<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (strPara != null &amp;&amp; strPara.equals("isInitAccount")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 判断账户是否已经初始化</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoney accountA = (AccountMoney) session<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoney accountB = (AccountMoney) session<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (accountA == null || accountB == null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message = "no";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message = "yes";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("initAccount")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 初始化账户</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoney accountA = (AccountMoney) ejbutil<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getEJBObject("AccountMoneyBean#com.mh.ejb3.test.statefull.AccountMoney");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 保存EJB对象在Session中<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute("A", accountA);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoney accountB = (AccountMoney) ejbutil<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getEJBObject("AccountMoneyBean#com.mh.ejb3.test.statefull.AccountMoney");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 保存EJB对象在Session中<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute("B", accountB);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 返回信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "账户A、B初始化成功！\n&lt;br&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "账户[A]的余额：" + accountA.account() + "\n&lt;br&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "账户[B]的余额：" + accountB.account() + "\n&lt;br&gt;";</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("delAccount")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除账户</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除账户<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.removeAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.removeAttribute("B");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 返回信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "账户A、B已经成功删除！";</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("charge")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 冲值</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String strAccount = (String) request.getParameter("account");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoney account = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strAccount != null &amp;&amp; strAccount.equals("A")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoney) session.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if (strAccount != null &amp;&amp; strAccount.equals("B")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoney) session.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 冲值<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (account != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float fMoney = (float) Float.parseFloat(request<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getParameter("money"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account.charge(fMoney);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取当前余额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "冲值成功！账户[" + strAccount + "]当前余额是："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if (strAccount != null &amp;&amp; strAccount.equals("ALL")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 给两个账户冲值</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取金额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float fMoney = (float) Float.parseFloat(request<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getParameter("money"));</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 冲值<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoney) session.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (account != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account.charge(fMoney);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "给所有账户冲值，账户[A]冲值成功！账户余额："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "给所有账户冲值，冲值失败！账户[A]不存在！";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoney) session.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (account != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account.charge(fMoney);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "给所有账户冲值，账户[B]冲值成功！账户余额："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "给所有账户冲值，冲值失败！账户[B]不存在！";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "冲值失败！账户[" + strAccount + "]不存在！";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("pay")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 消费</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String strAccount = (String) request.getParameter("account");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoney account = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strAccount != null &amp;&amp; strAccount.equals("A")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoney) session.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if (strAccount != null &amp;&amp; strAccount.equals("B")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoney) session.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 消费<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (account != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float fMoney = (float) Float.parseFloat(request<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getParameter("money"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account.pay(fMoney);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取当前余额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "扣款成功！账户[" + strAccount + "]当前余额是："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "扣款失败！账户[" + strAccount + "]不存在！";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("account")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户余额</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String strAccount = (String) request.getParameter("account");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoney account = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strAccount != null &amp;&amp; strAccount.equals("A")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoney) session.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if (strAccount != null &amp;&amp; strAccount.equals("B")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoney) session.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户余额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (account != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "当前账户[" + strAccount + "]的余额是："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 账户A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoney) session.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "账户[A]的余额是：" + account.account();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 账户B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoney) session.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "\n&lt;br&gt;账户[B]的余额是：" + account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;message += e.toString();<BR>&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 输出<BR>&nbsp;&nbsp;&nbsp;out.print(message);<BR>&nbsp;&nbsp;&nbsp;out.flush();<BR>&nbsp;&nbsp;&nbsp;out.close();</P>
<P>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这个Servlet用来处理使用有状态会话Bean来实现的业务控制层。</P>
<P><BR>&nbsp;文件地址：[WebContext/account.jsp]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;package com.mh.servlet.test.ejb3statefull;</P>
<P>&nbsp;import java.io.IOException;<BR>&nbsp;import java.io.PrintWriter;</P>
<P>&nbsp;import javax.servlet.ServletException;<BR>&nbsp;import javax.servlet.http.HttpServlet;<BR>&nbsp;import javax.servlet.http.HttpServletRequest;<BR>&nbsp;import javax.servlet.http.HttpServletResponse;<BR>&nbsp;import javax.servlet.http.HttpSession;</P>
<P>&nbsp;import com.mh.ejb3.test.statefull.AccountMoneyStateless;<BR>&nbsp;import com.mh.util.ejbutil;</P>
<P>&nbsp;public class AccountMoneyStatelessSV extends HttpServlet {</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void destroy() {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.destroy();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void init() throws ServletException {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.init();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doGet(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;dowork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doPost(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;dowork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：业务方法<BR>&nbsp;&nbsp; * @param request<BR>&nbsp;&nbsp; * @param response<BR>&nbsp;&nbsp; * @throws ServletException<BR>&nbsp;&nbsp; * @throws IOException<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;private void dowork(HttpServletRequest request, HttpServletResponse response)<BR>&nbsp;&nbsp;&nbsp;&nbsp;throws ServletException, IOException {</P>
<P>&nbsp;&nbsp;&nbsp;// 获取输出对象<BR>&nbsp;&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<BR>&nbsp;&nbsp;&nbsp;response.setCharacterEncoding("UTF-8"); // 设置输出编码<BR>&nbsp;&nbsp;&nbsp;response.setContentType("text/html;charset=UTF-8");<BR>&nbsp;&nbsp;&nbsp;PrintWriter out = response.getWriter();<BR>&nbsp;&nbsp;&nbsp;// 结果值<BR>&nbsp;&nbsp;&nbsp;String message = "";</P>
<P>&nbsp;&nbsp;&nbsp;try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpSession session = request.getSession(true);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取参数<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strPara = (String) request.getParameter("dowith");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 通过参数实现业务<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (strPara != null &amp;&amp; strPara.equals("isInitAccount")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 判断账户是否已经初始化</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoneyStateless accountA = (AccountMoneyStateless) session<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoneyStateless accountB = (AccountMoneyStateless) session<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (accountA == null || accountB == null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message = "no";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message = "yes";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("initAccount")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 初始化账户</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoneyStateless accountA = (AccountMoneyStateless) ejbutil<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getEJBObject("AccountMoneyStatelessBean#com.mh.ejb3.test.statefull.AccountMoneyStateless");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 保存EJB对象在Session中<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute("A", accountA);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoneyStateless accountB = (AccountMoneyStateless) ejbutil<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getEJBObject("AccountMoneyStatelessBean#com.mh.ejb3.test.statefull.AccountMoneyStateless");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 保存EJB对象在Session中<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute("B", accountB);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 返回信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "账户A、B初始化成功！\n&lt;br&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "账户[A]的余额：" + accountA.account() + "\n&lt;br&gt;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "账户[B]的余额：" + accountB.account() + "\n&lt;br&gt;";</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("delAccount")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除账户</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除账户<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.removeAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.removeAttribute("B");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 返回信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "账户A、B已经成功删除！";</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("charge")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 冲值</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String strAccount = (String) request.getParameter("account");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoneyStateless account = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strAccount != null &amp;&amp; strAccount.equals("A")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoneyStateless) session.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if (strAccount != null &amp;&amp; strAccount.equals("B")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoneyStateless) session.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 冲值<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (account != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float fMoney = (float) Float.parseFloat(request<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getParameter("money"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account.charge(fMoney);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取当前余额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "冲值成功！账户[" + strAccount + "]当前余额是："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if (strAccount != null &amp;&amp; strAccount.equals("ALL")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 给两个账户冲值</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取金额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float fMoney = (float) Float.parseFloat(request<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getParameter("money"));</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 冲值<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoneyStateless) session.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (account != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account.charge(fMoney);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "给所有账户冲值，账户[A]冲值成功！账户余额："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "给所有账户冲值，冲值失败！账户[A]不存在！";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoneyStateless) session.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (account != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account.charge(fMoney);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "给所有账户冲值，账户[B]冲值成功！账户余额："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "给所有账户冲值，冲值失败！账户[B]不存在！";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "冲值失败！账户[" + strAccount + "]不存在！";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("pay")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 消费</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String strAccount = (String) request.getParameter("account");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoneyStateless account = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strAccount != null &amp;&amp; strAccount.equals("A")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoneyStateless) session.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if (strAccount != null &amp;&amp; strAccount.equals("B")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoneyStateless) session.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 消费<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (account != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float fMoney = (float) Float.parseFloat(request<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getParameter("money"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account.pay(fMoney);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取当前余额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "扣款成功！账户[" + strAccount + "]当前余额是："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "扣款失败！账户[" + strAccount + "]不存在！";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("account")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户余额</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String strAccount = (String) request.getParameter("account");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountMoneyStateless account = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strAccount != null &amp;&amp; strAccount.equals("A")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoneyStateless) session.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if (strAccount != null &amp;&amp; strAccount.equals("B")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoneyStateless) session.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取账户余额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (account != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "当前账户[" + strAccount + "]的余额是："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 账户A<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoneyStateless) session.getAttribute("A");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "账户[A]的余额是：" + account.account();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 账户B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = (AccountMoneyStateless) session.getAttribute("B");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += "\n&lt;br&gt;账户[B]的余额是：" + account.account();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;message += e.toString();<BR>&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 输出<BR>&nbsp;&nbsp;&nbsp;out.print(message);<BR>&nbsp;&nbsp;&nbsp;out.flush();<BR>&nbsp;&nbsp;&nbsp;out.close();</P>
<P>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这个Servlet是用无状态会话Bean实现业务的控制层。</P>
<P><BR>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[在Weblogic 10中做EJB3的开发    之基础开发 (1)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29275</link>
<author>moshco</author>
<pubDate>2007/11/1 14:27:50</pubDate>
<description><![CDATA[
<P><BR>在Weblogic 10中做EJB3的开发&nbsp;&nbsp;&nbsp; 之基础开发 (1)</P>
<P>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>阅读本文前需要先读《Hello world》</P>
<P><BR>EJB3已经出现，它超强的个性光芒四射，因此这时候我们应该把焦点放在应用它的身上，而不是去用它和EJB2做比较。本文的特点是，不与EJB2做任何比较，教你学会EJB3。</P>
<P><IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0><A href="http://blogger.org.cn/blog/uploadfile/20071112174925128.RAR" target=_blank>EJB3Test.rar</A></P>
<P><BR>1.重点关注</P>
<P>&nbsp;EJB3的基础开发，其中最为重要的几点是：<BR>&nbsp;1.接口与Bean类的开发；<BR>&nbsp;2.注释的使用；<BR>&nbsp;3.JNDI的定义；<BR>&nbsp;4.访问EJB；</P>
<P><BR>2.无状态会话Bean<BR>&nbsp;<BR>&nbsp;2.1 实现远程接口。<BR>&nbsp;<BR>&nbsp;创建接口。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/EJB3Test.java]<BR>&nbsp;包：[com.mh.ejb3.test]<BR>&nbsp;名称：[EJB3Test]<BR>&nbsp;内容如下：&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;public interface EJB3Test {</P>
<P>&nbsp;&nbsp;public String sayTest();</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;是不是觉得这也太简单了，是的，这就是EJB3！</P>
<P>&nbsp;创建Bean类。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/EJB3TestBean.java]<BR>&nbsp;包：[com.mh.ejb3.test]<BR>&nbsp;名称：[EJB3TestBean]<BR>&nbsp;Bean类型：[无状态会话Bean]<BR>&nbsp;实现接口:[远程接口]<BR>&nbsp;内容如下：&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;import javax.ejb.Remote;<BR>&nbsp;import javax.ejb.Stateless;</P>
<P>&nbsp;@Stateless(mappedName = "EJB3TestBean")<BR>&nbsp;@Remote(EJB3Test.class)<BR>&nbsp;public class EJB3TestBean implements EJB3Test {</P>
<P>&nbsp;&nbsp;public String sayTest() {</P>
<P>&nbsp;&nbsp;&nbsp;String strResult = "EJB3，无状态会话Bean，实现远程接口！";</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return strResult;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;其实我觉得，做程序开发是需要激情的，如果你不爱好它，你会觉得它是一项繁重的工作。简洁的开发，会让程序员乐趣无穷，这就是EJB3的特点！</P>
<P>&nbsp;[@Stateless(mappedName = "EJB3TestBean")]：Bean类映射的名称，它决定了你访问它的JNDI是：[EJB3TestBean#com.mh.ejb3.test.EJB3Test]，#后面是接口的全称。如果你想查看你的JNDI，可以在[控制中心]中查看服务器的JNDI树，在《Hello world》中有讲到。<BR>&nbsp;[@Remote(EJB3Test.class)]：表示实现了远程接口，接口是：[EJB3Test.class]。有了这段，你下面的部分可以写成[public class EJB3TestBean implements EJB3Test]，也是可以的。但最好不要这样写，这样写不好。</P>
<P><BR>&nbsp;到这里，这个名叫[EJB3Test]的EJB，我们就做完了，接下来，我们要调用这个EJB了。</P>
<P>&nbsp;修改文件[WebContext/JavaSource/com/mh/servlet/test/CommonSV.java]<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;package com.mh.servlet.test;</P>
<P>&nbsp;import java.io.IOException;<BR>&nbsp;import java.io.PrintWriter;<BR>&nbsp;import java.util.Properties;</P>
<P>&nbsp;import javax.naming.Context;<BR>&nbsp;import javax.naming.InitialContext;<BR>&nbsp;import javax.servlet.ServletException;<BR>&nbsp;import javax.servlet.http.HttpServlet;<BR>&nbsp;import javax.servlet.http.HttpServletRequest;<BR>&nbsp;import javax.servlet.http.HttpServletResponse;</P>
<P>&nbsp;import com.mh.ejb3.test.EJB3Test;<BR>&nbsp;import com.mh.ejb3.test.HelloWorldLocal;</P>
<P>&nbsp;public class CommonSV extends HttpServlet {</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void init() throws ServletException {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.init();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void destroy() {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.destroy();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doGet(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;doWork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doPost(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;doWork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：公共处理方法<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Excep<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;private void doWork(HttpServletRequest request, HttpServletResponse response)<BR>&nbsp;&nbsp;&nbsp;&nbsp;throws ServletException, IOException {</P>
<P>&nbsp;&nbsp;&nbsp;// 获取输出对象<BR>&nbsp;&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<BR>&nbsp;&nbsp;&nbsp;response.setCharacterEncoding("UTF-8"); // 设置输出编码<BR>&nbsp;&nbsp;&nbsp;response.setContentType("text/html;charset=UTF-8");<BR>&nbsp;&nbsp;&nbsp;PrintWriter out = response.getWriter();<BR>&nbsp;&nbsp;&nbsp;// 结果值<BR>&nbsp;&nbsp;&nbsp;String message = "Test:&lt;br&gt;&lt;hr size='1'&gt;";</P>
<P>&nbsp;&nbsp;&nbsp;try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取参数<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strPara = (String) request.getParameter("dowith");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 处理运行<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (strPara != null &amp;&amp; strPara.equals("HelloworldLocal")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorldLocal helloLocal = (HelloWorldLocal) getEJBObject("java:comp/env/HelloWorldLocalBean");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += helloLocal.sayHello();<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*－－－－－－－－－－－－－－－－－－－－－－ 这里是新加的 －－－－－－－－－－－－－－－－－－－－－－－－－－－－*/<BR>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("EJB3Test")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EJB3Test test = (EJB3Test) getEJBObject("EJB3TestBean#com.mh.ejb3.test.EJB3Test");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += test.sayTest();<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*－－－－－－－－－－－－－－－－－－－－－－ 这里是新加的 －－－－－－－－－－－－－－－－－－－－－－－－－－－－*/<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;message += e.toString();<BR>&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 输出<BR>&nbsp;&nbsp;&nbsp;out.print(message);<BR>&nbsp;&nbsp;&nbsp;out.flush();<BR>&nbsp;&nbsp;&nbsp;out.close();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @功能 获取EJB对象<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Exception<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;private Object getEJBObject(String strJNDI) throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;// 创建属性对象<BR>&nbsp;&nbsp;&nbsp;Properties props = new Properties();<BR>&nbsp;&nbsp;&nbsp;props.setProperty(Context.INITIAL_CONTEXT_FACTORY,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"weblogic.jndi.WLInitialContextFactory");<BR>&nbsp;&nbsp;&nbsp;props.setProperty(Context.PROVIDER_URL, "t3://localhost:7001");</P>
<P>&nbsp;&nbsp;&nbsp;// 创建上下文环境对象<BR>&nbsp;&nbsp;&nbsp;InitialContext ctx;<BR>&nbsp;&nbsp;&nbsp;ctx = new InitialContext(props);</P>
<P>&nbsp;&nbsp;&nbsp;// 本地接口<BR>&nbsp;&nbsp;&nbsp;Object oEJB = ctx.lookup(strJNDI);</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return oEJB;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;上面新加部分的JNDI[EJB3TestBean#com.mh.ejb3.test.EJB3Test]的解释，之前已经讲过原理了，这里就不多说了。</P>
<P>&nbsp;修改欢迎页面[WebContext/index.jsp]。<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%&gt;<BR>&nbsp;&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<BR>&nbsp;&lt;html&gt;<BR>&nbsp;&lt;head&gt;<BR>&nbsp;&lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt;<BR>&nbsp;&lt;title&gt;EJB3测试&lt;/title&gt;<BR>&nbsp;&lt;/head&gt;<BR>&nbsp;&lt;body&gt;</P>
<P><BR>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;&lt;a href="<A href="http://localhost:7001/console/">http://localhost:7001/console/</A>" target="_blank"&gt;weblogic控制&lt;/a&gt;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;&lt;hr size="1"&gt;</P>
<P>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;&lt;a href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=HelloworldLocal" target="_blank"&gt;EJB3测试：本地会话Bean&lt;/a&gt;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;</P>
<P>&nbsp;&lt;!-- －－－－－－－－－－－－－－－－－－－－－－－－－－ 这里是新加的 －－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ --&gt;<BR>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;&lt;a href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=EJB3Test" target="_blank"&gt;EJB3测试：无状态会话Bean远程接口&lt;/a&gt;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;&lt;!-- －－－－－－－－－－－－－－－－－－－－－－－－－－ 这里是新加的 －－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ --&gt;</P>
<P><BR>&nbsp;&lt;/body&gt;<BR>&nbsp;&lt;/html&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<BR>&nbsp;做完这些，你就可以使用[build.xml]来编译发布程序了！等一会后你可以打开[http://localhost:7001/ejb3test/]，看到你预想到的结果！一切就是这么容易！</P>
<P>&nbsp;</P>
<P>&nbsp;2.2 实现本地接口<BR>&nbsp;<BR>&nbsp;创建接口。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/EJB3TestLocal.java]<BR>&nbsp;包：[com.mh.ejb3.test]<BR>&nbsp;名称：[EJB3TestLocal]<BR>&nbsp;内容如下：&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public interface EJB3TestLocal {</P>
<P>&nbsp;&nbsp;public String sayTest();</P>
<P>&nbsp;}&nbsp;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<BR>&nbsp;创建Bean类。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/EJB3TestLocalBean.java]<BR>&nbsp;包：[com.mh.ejb3.test]<BR>&nbsp;名称：[EJB3TestLocalBean]<BR>&nbsp;EJB类型：[无状态会话Bean]<BR>&nbsp;实现接口：[本地接口]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;import javax.ejb.Local;<BR>&nbsp;import javax.ejb.Stateless;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@Stateless<BR>&nbsp;@Local(EJB3TestLocal.class)<BR>&nbsp;public class EJB3TestLocalBean implements EJB3TestLocal {</P>
<P>&nbsp;&nbsp;/*<BR>&nbsp;&nbsp; * （非 Javadoc）<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @see com.mh.ejb3.test.EJB3TestLocal#sayTest()<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String sayTest() {</P>
<P>&nbsp;&nbsp;&nbsp;String strResult = "EJB3，无状态会话Bean，实现本地接口！";</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return strResult;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;其实，EJB最初设计时，是没有本地接口的，后来，发现这是一个缺陷，因此加上了，但实际上从中间件分布式应用的角度讲，本地接口的意义是不存在的。EJB的应用本就不应该只是做些小型的开发，它的目标应该是让客户使用最少的硬件成本，弄出一个无限膨胀的业务系统！满足客户一个简单的需求：“我需要什么，它就能帮我做到什么！”<BR>&nbsp;那些还在使用价格100万人民币的服务器，装一个web服务的时代早就应该结束了！呵呵！</P>
<P><BR>&nbsp;到这里为止，我们已经开发出了一个实现本地接口的EJB，在《Hello,world》中已经讲了如何使用servlet访问本地无状态会话Bean，这里就不想重复了，现在我们使用一种叫做[依赖注入]的方式来调用这个本地会话Bean，讲到这里，有两点需要强调：<BR>&nbsp;1.依赖注入，是java一种创建Java对象的概念，说简单点就是要创建一个对象，使用了这种方式；其实我很讨厌使用一些披着华丽的名词而又晦涩难懂的东西！<BR>&nbsp;2.想要访问只实现本地接口的EJB，条件是：必须在同一个运行的应用服务器中，才有可能，而且不同的应用服务器，采用的方式还不一样！weblogic ejb3只有两种方式：第一是同一容器的其它EJB访问（依赖注入的方式；或在配置文件中定义引用，再使用JNDI访问。）；第二种是同一服务器的servlet中，先在配置文件中定义引用，再在servlet中使用JNDI访问。除此以外再没有其它可能。</P>
<P>&nbsp;下面我们实现上面说的[依赖注入]的访问方式。</P>
<P>&nbsp;创建一个接口。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/UseLocalEJB.java]<BR>&nbsp;包：[com.mh.ejb3.test]<BR>&nbsp;名称：[UseLocalEJB]<BR>&nbsp;内容如下：&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public interface UseLocalEJB {</P>
<P>&nbsp;&nbsp;public String sayTest();</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;创建Bean类。<BR>&nbsp;文件地址：[EJB3/JavaSource/com/mh/ejb3/test/UseLocalEJBBean.java]<BR>&nbsp;包：[com.mh.ejb3.test]<BR>&nbsp;名称：[UseLocalEJB]<BR>&nbsp;EJB类型：[无状态会话Bean]<BR>&nbsp;实现接口：[远程接口]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;import javax.ejb.EJB;<BR>&nbsp;import javax.ejb.Remote;<BR>&nbsp;import javax.ejb.Stateless;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@Stateless(mappedName = "UseLocalEJBBean")<BR>&nbsp;@Remote(UseLocalEJB.class)<BR>&nbsp;public class UseLocalEJBBean implements UseLocalEJB {</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * 这里使用了依赖注入的方式访问本地会话Bean[EJB3TestLocal]，需要注意的是，<BR>&nbsp;&nbsp; * [EJB3TestLocal]这个EJB必须和当前会话Bean在同一个容器中才能这样使用。<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;@EJB<BR>&nbsp;&nbsp;private EJB3TestLocal ejb3Test;</P>
<P>&nbsp;&nbsp;/*<BR>&nbsp;&nbsp; * （非 Javadoc）<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @see com.mh.ejb3.test.UserLocalEJB#sayTest()<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String sayTest() {</P>
<P>&nbsp;&nbsp;&nbsp;String strResult = "EJB3，使用依赖注入的方式，远程接口的EJB使用了实现本地接口的EJB[EJB3TestLocal]！\n&lt;br&gt;";<BR>&nbsp;&nbsp;&nbsp;if (ejb3Test != null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;strResult += ejb3Test.sayTest();<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return strResult;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;[@EJB private EJB3TestLocal ejb3Test;]，EJB容器会在第一次访问这个变量时，容器会根据变量的类型[EJB3TestLocal]创建一个EJB对象给它。容器是不是太厉害了，了不起！</P>
<P>&nbsp;到这里，我们创建了两个EJB，一个是实现本地接口的EJB[EJB3TestLocal]，它是被调用者；一个是实现远程接口的EJB[UseLocalEJB]，调用了实现本地接口的EJB；接下来，我们使用servlet来用JNDI的方式调用这个实现远程接口的EJB。</P>
<P><BR>&nbsp;修改文件[WebContext/JavaSource/com/mh/servlet/test/CommonSV.java]。<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;package com.mh.servlet.test;</P>
<P>&nbsp;import java.io.IOException;<BR>&nbsp;import java.io.PrintWriter;<BR>&nbsp;import java.util.Properties;</P>
<P>&nbsp;import javax.naming.Context;<BR>&nbsp;import javax.naming.InitialContext;<BR>&nbsp;import javax.servlet.ServletException;<BR>&nbsp;import javax.servlet.http.HttpServlet;<BR>&nbsp;import javax.servlet.http.HttpServletRequest;<BR>&nbsp;import javax.servlet.http.HttpServletResponse;</P>
<P>&nbsp;import com.mh.ejb3.test.EJB3Test;<BR>&nbsp;import com.mh.ejb3.test.HelloWorldLocal;<BR>&nbsp;import com.mh.ejb3.test.UseLocalEJB;</P>
<P>&nbsp;public class CommonSV extends HttpServlet {</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void init() throws ServletException {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.init();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void destroy() {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.destroy();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doGet(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;doWork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doPost(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;doWork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：公共处理方法<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Excep<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;private void doWork(HttpServletRequest request, HttpServletResponse response)<BR>&nbsp;&nbsp;&nbsp;&nbsp;throws ServletException, IOException {</P>
<P>&nbsp;&nbsp;&nbsp;// 获取输出对象<BR>&nbsp;&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<BR>&nbsp;&nbsp;&nbsp;response.setCharacterEncoding("UTF-8"); // 设置输出编码<BR>&nbsp;&nbsp;&nbsp;response.setContentType("text/html;charset=UTF-8");<BR>&nbsp;&nbsp;&nbsp;PrintWriter out = response.getWriter();<BR>&nbsp;&nbsp;&nbsp;// 结果值<BR>&nbsp;&nbsp;&nbsp;String message = "Test:&lt;br&gt;&lt;hr size='1'&gt;";</P>
<P>&nbsp;&nbsp;&nbsp;try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取参数<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strPara = (String) request.getParameter("dowith");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 处理运行<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (strPara != null &amp;&amp; strPara.equals("HelloworldLocal")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorldLocal helloLocal = (HelloWorldLocal) getEJBObject("java:comp/env/HelloWorldLocalBean");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += helloLocal.sayHello();<BR>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("EJB3Test")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EJB3Test test = (EJB3Test) getEJBObject("EJB3TestBean#com.mh.ejb3.test.EJB3Test");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += test.sayTest();<BR>&nbsp;&nbsp;&nbsp;&nbsp;/* －－－－－－－－－－－－－－－－－－－－－ 这里是新加的部分 －－－－－－－－－－－－－－－－－－－－－－－－－ */<BR>&nbsp;&nbsp;&nbsp;&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("UseLocalEJB")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UseLocalEJB test = (UseLocalEJB) getEJBObject("UseLocalEJBBean#com.mh.ejb3.test.UseLocalEJB");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += test.sayTest();<BR>&nbsp;&nbsp;&nbsp;&nbsp;/* －－－－－－－－－－－－－－－－－－－－－ 这里是新加的部分 －－－－－－－－－－－－－－－－－－－－－－－－－ */<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;message += e.toString();<BR>&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 输出<BR>&nbsp;&nbsp;&nbsp;out.print(message);<BR>&nbsp;&nbsp;&nbsp;out.flush();<BR>&nbsp;&nbsp;&nbsp;out.close();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @功能 获取EJB对象<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Exception<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;private Object getEJBObject(String strJNDI) throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;// 创建属性对象<BR>&nbsp;&nbsp;&nbsp;Properties props = new Properties();<BR>&nbsp;&nbsp;&nbsp;props.setProperty(Context.INITIAL_CONTEXT_FACTORY,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"weblogic.jndi.WLInitialContextFactory");<BR>&nbsp;&nbsp;&nbsp;props.setProperty(Context.PROVIDER_URL, "t3://localhost:7001");</P>
<P>&nbsp;&nbsp;&nbsp;// 创建上下文环境对象<BR>&nbsp;&nbsp;&nbsp;InitialContext ctx;<BR>&nbsp;&nbsp;&nbsp;ctx = new InitialContext(props);</P>
<P>&nbsp;&nbsp;&nbsp;// 本地接口<BR>&nbsp;&nbsp;&nbsp;Object oEJB = ctx.lookup(strJNDI);</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return oEJB;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;还记得访问实现远程接口EJB的方式吗？<BR>&nbsp;[UseLocalEJBBean#com.mh.ejb3.test.UseLocalEJB]，[UseLocalEJBBean]是你在EJB中使用注释定义的映射名称，就是这一部分[@Stateless(mappedName = "UseLocalEJBBean")]，如果你不写[(mappedName = "UseLocalEJBBean")]，那么它的默认名称应该是Bean类的名称，就是[UseLocalEJBBean]。<BR>&nbsp;[com.mh.ejb3.test.UseLocalEJB]是EJB的接口[com.mh.ejb3.test.UseLocalEJB]。</P>
<P>&nbsp;接下来在[WebContext/index.jsp]中添加一个访问servlet的连接。<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%&gt;<BR>&nbsp;&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<BR>&nbsp;&lt;html&gt;<BR>&nbsp;&lt;head&gt;<BR>&nbsp;&lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt;<BR>&nbsp;&lt;title&gt;EJB3测试&lt;/title&gt;<BR>&nbsp;&lt;/head&gt;<BR>&nbsp;&lt;body&gt;</P>
<P><BR>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;&lt;a href="<A href="http://localhost:7001/console/">http://localhost:7001/console/</A>" target="_blank"&gt;weblogic控制&lt;/a&gt;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;&lt;hr size="1"&gt;</P>
<P>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;&lt;a href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=HelloworldLocal" target="_blank"&gt;EJB3测试：本地会话Bean&lt;/a&gt;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;</P>
<P>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;&lt;a href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=EJB3Test" target="_blank"&gt;EJB3测试：无状态会话Bean远程接口&lt;/a&gt;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;</P>
<P>&nbsp;&lt;!-- －－－－－－－－－－－－－－－－－－－－－－－－－－－ 这里是新加的部分 －－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ --&gt;<BR>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;&lt;a href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=UseLocalEJB" target="_blank"&gt;EJB3测试：使用无状态会话Bean本地接口&lt;/a&gt;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;&lt;!-- －－－－－－－－－－－－－－－－－－－－－－－－－－－ 这里是新加的部分 －－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ --&gt;</P>
<P><BR>&nbsp;&lt;/body&gt;<BR>&nbsp;&lt;/html&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;使用[Build/build.xml]，编译发布，然后看结果吧！<BR>&nbsp;是不是越来越有感觉了！这说明你已经进入了状态！</P>
<P><BR>&nbsp;2.3 实现本地和远程接口</P>
<P>&nbsp;有一种业务需求是可能存在的，就是可能希望某一个EJB所有的业务功能都能被本地访问，但只有其中一部分业务功能被远程计算机访问，如果有这种需求，我们就需要让这个EJB既实现本地接口，也实现远程接口。并组织好它们之间的关系！</P>
<P>&nbsp;对于这个业务需求的基本设计应该是这样的：本地接口应该继承了远程接口，EJB Bean类应该既实现本地接口也实现远程接口。</P>
<P>&nbsp;好！首先创建一个远程接口。内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public interface EJB3TestRL {</P>
<P>&nbsp;&nbsp;public String sayTest();</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<BR>&nbsp;本地接口，本地接口继承于远程接口。<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public interface EJB3TestRLLocal extends EJB3TestRL {</P>
<P>&nbsp;&nbsp;public String sayTestLocal();</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;EJB Bean类：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;import javax.ejb.Local;<BR>&nbsp;import javax.ejb.Remote;<BR>&nbsp;import javax.ejb.Stateless;</P>
<P>&nbsp;@Stateless(mappedName = "EJB3TestRLBean")<BR>&nbsp;@Local(EJB3TestRLLocal.class)<BR>&nbsp;@Remote(EJB3TestRL.class)<BR>&nbsp;public class EJB3TestRLBean implements EJB3TestRLLocal {</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：这是远程接口中要实现的方法，访问无限制。<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String sayTest() {</P>
<P>&nbsp;&nbsp;&nbsp;String strResult = "EJB3，实现远程和本地接口，这是远程接口的业务方法！";</P>
<P>&nbsp;&nbsp;&nbsp;// 函数返回值<BR>&nbsp;&nbsp;&nbsp;return strResult;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：这是本地接口要实现的方法，只能在同一应用服务器中访问<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public String sayTestLocal() {</P>
<P>&nbsp;&nbsp;&nbsp;String strResult = "EJB3，实现远程和本地接口，这是本地接口的业务方法！";</P>
<P>&nbsp;&nbsp;&nbsp;// 函数返回值<BR>&nbsp;&nbsp;&nbsp;return strResult;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;要注意[public class EJB3TestRLBean implements EJB3TestRLLocal ]容易让人难于理解，其实这一部分可用简写成[public class EJB3TestRLBean]，但是这样写不好，因为在IDE中编写代码的时候，你会忘记了自己的Bean类要实现那些方法。还有就是，这里真正决定EJB实现那些接口的应该是[@Local(EJB3TestRLLocal.class)]和[@Remote(EJB3TestRL.class)]。</P>
<P>&nbsp;到这里EJB就算是写好了，接下来编写访问的代码。</P>
<P>&nbsp;为了能够在servlet中有效的访问到本地接口，我们需要在web.xml中加入引用，需要再次强调的是，本地接口的只能在同一个server中访问，另外一台电脑的应用服务器的web服务是没有办法访问到当前电脑的本地接口的。<BR>&nbsp;修改web.xml的内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;</P>
<P>&nbsp;&lt;!-- version="2.4"这一部分不可以顺便改动，改动容易造成发布错误 --&gt;<BR>&nbsp;&lt;web-app version="2.4" xmlns="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A>"<BR>&nbsp;&nbsp;xmlns:xsi="<A href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</A>"<BR>&nbsp;&nbsp;xsi:schemaLocation="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A> <A href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</A>"&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- web项目发布名称 --&gt;<BR>&nbsp;&nbsp;&lt;display-name&gt;ejb3test&lt;/display-name&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 默认文件列表 --&gt;<BR>&nbsp;&nbsp;&lt;welcome-file-list&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&lt;/welcome-file-list&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 定义一个Servlet --&gt;<BR>&nbsp;&nbsp;&lt;servlet&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;CommonSV&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;com.mh.servlet.test.CommonSV&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<BR>&nbsp;&nbsp;&lt;/servlet&gt;<BR>&nbsp;&nbsp;&lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;CommonSV&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/sv/CommonSV.do&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&lt;/servlet-mapping&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 定义引用一个ejb3的本定接口 --&gt;<BR>&nbsp;&nbsp;&lt;ejb-local-ref&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-ref-name&gt;HelloWorldLocalBean&lt;/ejb-ref-name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-ref-type&gt;Session&lt;/ejb-ref-type&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- 因为是EJB3所有不能有这一部分 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- &lt;local-home&gt;&lt;/local-home&gt; --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;local&gt;com.mh.ejb3.test.HelloWorldLocal&lt;/local&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-link&gt;ejb3test_ejb.jar#HelloWorldLocalBean&lt;/ejb-link&gt;<BR>&nbsp;&nbsp;&lt;/ejb-local-ref&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- －－－－－－－－－－－－－－－－－－－－－ 这里是新加的 －－－－－－－－－－－－－－－－－－－－－－－ --&gt;<BR>&nbsp;&nbsp;&lt;!-- 定义引用一个ejb3的本定接口 --&gt;<BR>&nbsp;&nbsp;&lt;ejb-local-ref&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-ref-name&gt;EJB3TestRLBean&lt;/ejb-ref-name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-ref-type&gt;Session&lt;/ejb-ref-type&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- 因为是EJB3所有不能有这一部分 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- &lt;local-home&gt;&lt;/local-home&gt; --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;local&gt;com.mh.ejb3.test.EJB3TestRLLocal&lt;/local&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-link&gt;ejb3test_ejb.jar#EJB3TestRLBean&lt;/ejb-link&gt;<BR>&nbsp;&nbsp;&lt;/ejb-local-ref&gt;<BR>&nbsp;&nbsp;&lt;!-- －－－－－－－－－－－－－－－－－－－－－ 这里是新加的 －－－－－－－－－－－－－－－－－－－－－－－ --&gt;</P>
<P>&nbsp;&lt;/web-app&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<BR>&nbsp;修改文件[WebContext/JavaSource/com/mh/servlet/test/CommonSV.java]，在方法[doWork]中加入下面一部分：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("EJB3TestRL")) {<BR>&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;EJB3TestRL test = (EJB3TestRL) getEJBObject("EJB3TestRLBean#com.mh.ejb3.test.EJB3TestRL");<BR>&nbsp;&nbsp;message += test.sayTest();<BR>&nbsp;} else if (strPara != null &amp;&amp; strPara.equals("EJB3TestRLLocal")) {<BR>&nbsp;&nbsp;// 通过JNDI获取EJB对象<BR>&nbsp;&nbsp;EJB3TestRLLocal test = (EJB3TestRLLocal) getEJBObject("java:comp/env/EJB3TestRLBean");<BR>&nbsp;&nbsp;message += test.sayTestLocal() + "\n&lt;br&gt;";<BR>&nbsp;&nbsp;message += test.sayTest();<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;看看，这是两种不同的JNDI的访问。</P>
<P>&nbsp;在欢迎页面程序[WebContext/index.jsp]，中加入下面一部分：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;<BR>&nbsp;EJB3测试：实现了本地接口和远程接口的EJB:&lt;br&gt;<BR>&nbsp;&lt;a href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=EJB3TestRL" target="_blank"&gt;远程接口访问&lt;/a&gt;<BR>&nbsp;&lt;br&gt;<BR>&nbsp;&lt;a href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=EJB3TestRLLocal" target="_blank"&gt;使用web.xml中定义的JNDI访问本地接口&lt;/a&gt;<BR>&nbsp;&lt;br&gt;<BR>&nbsp;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;好了！可以使用[Build/build.xml]发布编译了。看结果吧！</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P><BR>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[在Weblogic 10中做EJB3的开发  之HelloWorld]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29264</link>
<author>moshco</author>
<pubDate>2007/11/1 10:55:36</pubDate>
<description><![CDATA[<P><BR>在Weblogic 10中做EJB3的开发<BR>&nbsp;&nbsp;之HelloWorld</P>
<P>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>阅读本文的前提条件是：<BR>&nbsp;1.你必须有Java编程的基本能力，并能熟练使用servlet；<BR>&nbsp;2.同时要能熟练并多次安装过weblogic server，了解安装的一些基本常识；<BR>&nbsp;3.熟练使用Eclipse开发工具开发Java程序。</P>
<P><BR>1.Weblogic 的版本</P>
<P>&nbsp;我使用的weblogic版本是Workshop for WebLogic 10，weblogic是从WebLogic 10.0的版本开始完全支持EJB3的。可是在Bea的主页上下载，下载地址是[http://www.bea.com.cn/products/workshop/workshop2/index.jsp]，下载需要注册一个帐号，登录了帐号才可以顺利下载试用版。</P>
<P>2.一些准备工作</P>
<P>&nbsp;启动Workshop for WebLogic 10，其实就是Eclipse 3.2加入了Weblogic的一些插件，我除了用它启动Weblogic server以外，基本没有用到其它什么特别于Eclipse的功能，所以如果使用Eclipse 3.2也是一样的。</P>
<P>&nbsp;安装完成后需要首先创建一个域主目录，这个过程比较简单，按默认创建就可以了。</P>
<P>&nbsp;如果你安装的根目录是[D:\bea]，那么你的服务器应该在[D:\bea\wlserver_10.0]。</P>
<P>&nbsp;启动开发环境以后，第一件要做的事是创建一个服务器，在服务器视图中新建，其它基本安默认来，只是在设定域目录时，注意设置在[D:\bea\user_projects\domains\base_domain]，[base_domain]是你创建的域的名称。</P>
<P>&nbsp;系统安装的JRE版本要在[1.5]以上。</P>
<P>3.创建项目框架</P>
<P>&nbsp;创建一个用户自定义库：<BR>&nbsp;&nbsp;[窗口]-&gt;[首选项]-&gt;[Java]-&gt;[构建路径]-&gt;[用户库]，点击[新建]，名字叫[weblogic]。选中[Weblogic]，点击[添加外部Jar]，将[D:\bea\wlserver_10.0\server\lib]下的所有jar包导入到用户库[weblogic]。</P>
<P>&nbsp;新建一个普通的Java项目，需要导入两个库[系统jre库、用户自定义库weblogic]，项目目录结构如下：<BR>&nbsp;[App]&nbsp;&nbsp;&nbsp;&nbsp;应用程序主目录<BR>&nbsp;[App\META-INF]&nbsp;&nbsp;&nbsp;应用程序配置文件目录<BR>&nbsp;[bin]&nbsp;&nbsp;&nbsp;&nbsp;Eclipse编译输出目录，项目创建的时候，要设置一个源代码默认输出目录，就是它<BR>&nbsp;[Build]&nbsp;&nbsp;&nbsp;&nbsp;编译、打包目录<BR>&nbsp;[EJB3]&nbsp;&nbsp;&nbsp;&nbsp;EJB程序目录<BR>&nbsp;[EJB3\JavaSource]&nbsp;&nbsp;EJB源代码目录&nbsp;需要设置为源代码目录<BR>&nbsp;[EJB3\META-INF]&nbsp;&nbsp;&nbsp;EJB程序配置文件目录<BR>&nbsp;[Java]&nbsp;&nbsp;&nbsp;&nbsp;Java程序目录<BR>&nbsp;[Java\JavaSource]&nbsp;&nbsp;Java程序源代码目录&nbsp;需要设置为源代码目录<BR>&nbsp;[WebContext]&nbsp;&nbsp;&nbsp;web程序目录<BR>&nbsp;[WebContext\JavaSource]&nbsp;&nbsp;Web程序Java源代码目录&nbsp;需要设置为源代码目录<BR>&nbsp;[WebContext\WEB-INF]&nbsp;&nbsp;web程序配置文件目录</P>
<P>&nbsp;下面是需要首先编辑的几个文件<BR>&nbsp;[App/META-INF/application.xml]&nbsp;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&nbsp;&lt;application xmlns="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A>" version="1.4"<BR>&nbsp;&nbsp;xmlns:xsi="<A href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</A>"<BR>&nbsp;&nbsp;xsi:schemaLocation="<A href="http://java.sun.com">http://java.sun.com</A> /xml/ns/j2ee<BR>&nbsp;<A href="http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">http://java.sun.com/xml/ns/j2ee/application_1_4.xsd</A>"&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- 引用程序名称 --&gt;<BR>&nbsp;&nbsp;&lt;display-name&gt;EIB3Test&lt;/display-name&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- 应用程序描述 --&gt;<BR>&nbsp;&nbsp;&lt;description&gt;EJB3 Test Application&lt;/description&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- EJB模块 --&gt;<BR>&nbsp;&nbsp;&lt;module&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- EJB模块Jar包 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb&gt;ejb3test_ejb.jar&lt;/ejb&gt;<BR>&nbsp;&nbsp;&lt;/module&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- WEB模块 --&gt;<BR>&nbsp;&nbsp;&lt;module&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;web&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- web模块包 --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;web-uri&gt;ejb3test_web.war&lt;/web-uri&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- web模块根 就是<A href="http://localhost:7001/ejb3test">http://localhost:7001/ejb3test</A> --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;context-root&gt;/ejb3test&lt;/context-root&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/web&gt;<BR>&nbsp;&nbsp;&lt;/module&gt;<BR>&nbsp;&lt;/application&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&nbsp;<BR>&nbsp;[WebContext/WEB-INF/web.xml]<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;</P>
<P>&nbsp;&lt;!-- version="2.4"这一部分不可以随便改动，改动容易造成发布错误 --&gt;<BR>&nbsp;&lt;web-app version="2.4" xmlns="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A>"<BR>&nbsp;&nbsp;xmlns:xsi="<A href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</A>"<BR>&nbsp;&nbsp;xsi:schemaLocation="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A> <A href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</A>"&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- web项目发布名称 --&gt;<BR>&nbsp;&nbsp;&lt;display-name&gt;ejb3test&lt;/display-name&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 默认文件列表 --&gt;<BR>&nbsp;&nbsp;&lt;welcome-file-list&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&lt;/welcome-file-list&gt;</P>
<P>&nbsp;&lt;/web-app&gt;&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;创建一个Ant编译文件。<BR>&nbsp;文件地址：[Build/build.xml]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;</P>
<P>&nbsp;&lt;project default="main" basedir="../"&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 项目名称 --&gt;<BR>&nbsp;&nbsp;&lt;property name="proName" value="ejb3test" /&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- Bea Weblogic 安装目录 --&gt;<BR>&nbsp;&nbsp;&lt;property name="bea.home" value="D:\bea" /&gt;<BR>&nbsp;&nbsp;&lt;property name="bea.server.lib" value="${bea.home}/wlserver_10.0/server/lib" /&gt;<BR>&nbsp;&nbsp;&lt;property name="domain.name" value="base_domain" /&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- JRE --&gt;<BR>&nbsp;&nbsp;&lt;property name="jre.home" value="D:\Java\jre1.5.0_12" /&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 编译目录 --&gt;<BR>&nbsp;&nbsp;&lt;property name="build" value="Build" /&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 指定输出目录 --&gt;<BR>&nbsp;&nbsp;&lt;property name="out" value="D:/out" /&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 编译库 --&gt;<BR>&nbsp;&nbsp;&lt;path id="classpath"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- JRE.lib --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;pathelement location="${jre.home}/lib" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;pathelement location="${jre.home}/lib/ext" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;fileset dir="${jre.home}/lib"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="*.jar" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="ext/*.jar" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- JBossEJB3.lib --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;pathelement location="${bea.server.lib}" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;fileset dir="${bea.server.lib}"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="*.jar" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;</P>
<P>&nbsp;&nbsp;&lt;/path&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- Java编译库 --&gt;<BR>&nbsp;&nbsp;&lt;path id="java"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- Java库 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;fileset file="${build}/out/lib/${proName}_java.jar" /&gt;</P>
<P>&nbsp;&nbsp;&lt;/path&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- EJB编译库 --&gt;<BR>&nbsp;&nbsp;&lt;path id="ejb"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- Java库 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;fileset file="${build}/out/${proName}_ejb.jar" /&gt;</P>
<P>&nbsp;&nbsp;&lt;/path&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- Java编译打包 --&gt;<BR>&nbsp;&nbsp;&lt;target name="java"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="Java编译打包开始 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 编译 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;javac srcdir="Java/JavaSource" destdir="${build}/java"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;classpath refid="classpath" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/javac&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 打包 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;mkdir dir="${build}/out/lib" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;jar basedir="${build}/java" jarfile="${build}/out/lib/${proName}_java.jar" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="Java编译打包结束 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&lt;/target&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- EJB编译打包 --&gt;<BR>&nbsp;&nbsp;&lt;target name="ejb" depends="java"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="EJB编译打包开始 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 编译 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;javac srcdir="EJB3/JavaSource" destdir="${build}/ejb"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;classpath refid="classpath" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;classpath refid="java" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/javac&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 复制配置文件 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;copy todir="${build}/ejb/META-INF"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset dir="EJB3/META-INF" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/copy&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 打包 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;jar basedir="${build}/ejb" jarfile="${build}/out/${proName}_ejb.jar"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;manifest&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;attribute name="Class-Path" value="lib/${proName}_java.jar" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/manifest&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/jar&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="EJB编译打包结束 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&lt;/target&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- Web编译打包 --&gt;<BR>&nbsp;&nbsp;&lt;target name="web" depends="ejb"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="Web编译打包开始 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 复制web内容目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;copy todir="${build}/web"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset dir="WebContext" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/copy&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 编译Java源代码 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete dir="${build}/web/WEB-INF/classes" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;mkdir dir="${build}/web/WEB-INF/classes" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;javac srcdir="${build}/web/JavaSource" destdir="${build}/web/WEB-INF/classes"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;classpath refid="classpath" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;classpath refid="java" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;classpath refid="ejb" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/javac&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 打包Java源代码 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete dir="${build}/web/WEB-INF/lib" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;mkdir dir="${build}/web/WEB-INF/lib" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;jar basedir="${build}/web/WEB-INF/classes" jarfile="${build}/web/WEB-INF/lib/${proName}_servlet.jar" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 复制EJB包到Web库 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;copy todir="${build}/web/WEB-INF/lib" file="${build}/out/${proName}_ejb.jar" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 打包web目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete dir="${build}/web/JavaSource" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete dir="${build}/web/WEB-INF/classes" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;jar basedir="${build}/web" jarfile="${build}/out/${proName}_web.war"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;manifest&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;attribute name="Class-Path" value="lib/${proName}_java.jar" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/manifest&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/jar&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="Web编译打包结束 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&lt;/target&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 企业包打包 --&gt;<BR>&nbsp;&nbsp;&lt;target name="ear" depends="web"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="企业包打包开始 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 复制Java包、ejb包、web包 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;copy todir="${build}/ear"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset dir="${build}/out"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="lib/${proName}_java.jar" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="${proName}_ejb.jar" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="${proName}_web.war" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/copy&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 复制配置文件 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;copy todir="${build}/ear/META-INF"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset dir="App/META-INF" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/copy&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 打包 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;jar basedir="${build}/ear" jarfile="${build}/out/${proName}_ear.ear" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="企业包打包结束 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&lt;/target&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 初始化 为编译初始化 --&gt;<BR>&nbsp;&nbsp;&lt;target name="init"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="初始化开始 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 创建java编译目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;mkdir dir="${build}/java" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 创建ejb编译目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;mkdir dir="${build}/ejb" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 创建web编译目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;mkdir dir="${build}/web" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 创建应用程序编译目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;mkdir dir="${build}/ear" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 创建编译输出目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;mkdir dir="${build}/out" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="初始化结束 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&lt;/target&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 清理项目 清理项目中编译产生的文件和目录 --&gt;<BR>&nbsp;&nbsp;&lt;target name="clear"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="清理项目开始 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 删除java编译目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete dir="${build}/java" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 删除ejb编译目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete dir="${build}/ejb" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 删除web编译目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete dir="${build}/web" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 删除应用程序编译目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete dir="${build}/ear" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 删除编译输出目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete dir="${build}/out" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="清理项目结束 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&lt;/target&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 默认运行任务 编译、发布应用程序 --&gt;<BR>&nbsp;&nbsp;&lt;target name="main" depends="clear,init,ear"&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="编译打包项目开始 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 发布到自动编译的目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete file="${bea.home}/user_projects/domains/${domain.name}/autodeploy/${proName}_ear.ear" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;copy todir="${bea.home}/user_projects/domains/${domain.name}/autodeploy"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset file="${build}/out/${proName}_ear.ear" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/copy&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;!-- 输出到指定目录 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;delete file="${out}/${proName}_ear.ear" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;copy todir="${out}"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset file="${build}/out/${proName}_ear.ear" /&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/copy&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&lt;echo message="编译打包项目结束 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" /&gt;</P>
<P>&nbsp;&nbsp;&lt;/target&gt;</P>
<P>&nbsp;&lt;/project&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;文件中需要注意的有以下几点：<BR>&nbsp;1.[&lt;property name="bea.home" value="D:\bea" /&gt;]，这里表示你安装的weblogic的路径，其中[value]的设定根据自己实际情况设定；<BR>&nbsp;2.[&lt;property name="domain.name" value="base_domain" /&gt;]，这里是你创建的域的名字，也是根据实际情况设定；<BR>&nbsp;3.[&lt;property name="jre.home" value="D:\Java\jre1.5.0_12" /&gt;]，JRE的路径，根据实际情况设定；<BR>&nbsp;4.[&lt;property name="out" value="D:/out" /&gt;]，一个指定的外部输出目录，要创建这个目录。</P>
<P>&nbsp;如果你已经安装了Ant，可以创建一个Bat文件。<BR>&nbsp;文件地址：[Build/build.bat]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;F:<BR>&nbsp;cd F:\Epd\Workshop4WP\EJB3Test\Build<BR>&nbsp;%ANT_HOME%\bin\ant -file build.xml <BR>&nbsp;pause<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;根据实际情况，模仿编写。</P>
<P><BR>4.创建EJB3</P>
<P>&nbsp;创建一个EJB3现在已经变得非常容易，你只需要加一个接口，并定义业务方法，然后再创建一个类文件，实现改接口，并作一些标签，以表示它是EJB，就可以了！</P>
<P>&nbsp;创建一个EJB的接口：<BR>&nbsp;文件路径：[EJB3/JavaSource/com/mh/ejb3/test/HelloWorldLocal.java]<BR>&nbsp;包：com.mh.ejb3.test<BR>&nbsp;接口名称：HelloWorldLocal<BR>&nbsp;内容如下<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;public interface HelloWorldLocal {</P>
<P>&nbsp;&nbsp;public String sayHello();</P>
<P>&nbsp;}</P>
<P>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;创建Bean类：<BR>&nbsp;文件路径：[EJB3/JavaSource/com/mh/ejb3/test/HelloWorldLocalBean.java]<BR>&nbsp;包：com.mh.ejb3.test<BR>&nbsp;类名：HelloWorldLocalBean<BR>&nbsp;EJB类型：无状态会话bean<BR>&nbsp;EJB实现接口类型：本地接口<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;/**<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;package com.mh.ejb3.test;</P>
<P>&nbsp;import javax.ejb.Local;<BR>&nbsp;import javax.ejb.Stateless;</P>
<P>&nbsp;/**<BR>&nbsp; * @author moshco zhu<BR>&nbsp; * @Stateless：表示无状态会话Bean<BR>&nbsp; * @Local(HelloWorldLocal.class)：实现本地接口，括号中是表示实现的本地接口<BR>&nbsp; * <BR>&nbsp; */<BR>&nbsp;@Stateless<BR>&nbsp;@Local(HelloWorldLocal.class)<BR>&nbsp;public class HelloWorldLocalBean implements HelloWorldLocal {<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;public String sayHello() {</P>
<P>&nbsp;&nbsp;&nbsp;String strReult = "Hello,world!";</P>
<P>&nbsp;&nbsp;&nbsp;return strReult;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;修改文件[WebContext/WEB-INF/web.xml]<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;</P>
<P>&nbsp;&lt;!-- version="2.4"这一部分不可以顺便改动，改动容易造成发布错误 --&gt;<BR>&nbsp;&lt;web-app version="2.4" xmlns="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A>"<BR>&nbsp;&nbsp;xmlns:xsi="<A href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</A>"<BR>&nbsp;&nbsp;xsi:schemaLocation="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A> <A href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</A>"&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- web项目发布名称 --&gt;<BR>&nbsp;&nbsp;&lt;display-name&gt;ejb3test&lt;/display-name&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 默认文件列表 --&gt;<BR>&nbsp;&nbsp;&lt;welcome-file-list&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&lt;/welcome-file-list&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- －－－－－－－－－－－－－－－－－－－－－－－ 新加的部分 －－－－－－－－－－－－－－－－－－－－－－－－－－ --&gt;<BR>&nbsp;&nbsp;&lt;!-- 定义引用一个ejb3的本定接口 --&gt;<BR>&nbsp;&nbsp;&lt;ejb-local-ref&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- EJB的引用名称 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-ref-name&gt;HelloWorldLocalBean&lt;/ejb-ref-name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-ref-type&gt;Session&lt;/ejb-ref-type&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- 因为是EJB3所有不能有这一部分 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- &lt;local-home&gt;&lt;/local-home&gt; --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;local&gt;com.mh.ejb3.test.HelloWorldLocal&lt;/local&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-link&gt;ejb3test_ejb.jar#HelloWorldLocalBean&lt;/ejb-link&gt;<BR>&nbsp;&nbsp;&lt;/ejb-local-ref&gt;<BR>&nbsp;&nbsp;&lt;!-- －－－－－－－－－－－－－－－－－－－－－－－ 新加的部分 －－－－－－－－－－－－－－－－－－－－－－－－－－ --&gt;</P>
<P>&nbsp;&lt;/web-app&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;因为我们使用的是本地会话Bean，本地会话Bean在同一个weblogic server中的web容器中使用，是需要这样引用一下的。记住，如果不在同一个weblogic server中的其它地方，是没有办法使用这个本地会话Bean的。</P>
<P><BR>&nbsp;创建一个Servlet，使用这个本地会话Bean。<BR>&nbsp;文件路径：[WebContext/JavaSource/com/mh/servlet/test/CommonSV.java]<BR>&nbsp;包：com.mh.servlet.test<BR>&nbsp;类名：CommonSV<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;package com.mh.servlet.test;</P>
<P>&nbsp;import java.io.IOException;<BR>&nbsp;import java.io.PrintWriter;<BR>&nbsp;import java.util.Properties;</P>
<P>&nbsp;import javax.naming.Context;<BR>&nbsp;import javax.naming.InitialContext;<BR>&nbsp;import javax.naming.NamingException;<BR>&nbsp;import javax.servlet.ServletException;<BR>&nbsp;import javax.servlet.http.HttpServlet;<BR>&nbsp;import javax.servlet.http.HttpServletRequest;<BR>&nbsp;import javax.servlet.http.HttpServletResponse;</P>
<P>&nbsp;import com.mh.ejb3.test.HelloWorldLocal;</P>
<P>&nbsp;public class CommonSV extends HttpServlet {</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void init() throws ServletException {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.init();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;public void destroy() {<BR>&nbsp;&nbsp;&nbsp;// TODO 自动生成方法存根<BR>&nbsp;&nbsp;&nbsp;super.destroy();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doGet(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;doWork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;@Override<BR>&nbsp;&nbsp;protected void doPost(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;&nbsp;&nbsp;doWork(request, response);<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @描述：公共处理方法<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Excep<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;private void doWork(HttpServletRequest request, HttpServletResponse response)<BR>&nbsp;&nbsp;&nbsp;&nbsp;throws ServletException, IOException {</P>
<P>&nbsp;&nbsp;&nbsp;// 获取输出对象<BR>&nbsp;&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<BR>&nbsp;&nbsp;&nbsp;response.setCharacterEncoding("UTF-8"); // 设置输出编码<BR>&nbsp;&nbsp;&nbsp;response.setContentType("text/html;charset=UTF-8");<BR>&nbsp;&nbsp;&nbsp;PrintWriter out = response.getWriter();<BR>&nbsp;&nbsp;&nbsp;// 结果值<BR>&nbsp;&nbsp;&nbsp;String message = "Test:&lt;br&gt;&lt;hr size='1'&gt;";</P>
<P>&nbsp;&nbsp;&nbsp;try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 获取参数<BR>&nbsp;&nbsp;&nbsp;&nbsp;String strPara = (String) request.getParameter("dowith");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;// 处理运行<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (strPara != null &amp;&amp; strPara.equals("HelloworldLocal")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 通过JNDI获取对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorldLocal helloLocal = (HelloWorldLocal) getEJBObject("java:comp/env/HelloWorldLocalBean");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message += helloLocal.sayHello();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;message += e.toString();<BR>&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;// 输出<BR>&nbsp;&nbsp;&nbsp;out.print(message);<BR>&nbsp;&nbsp;&nbsp;out.flush();<BR>&nbsp;&nbsp;&nbsp;out.close();<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;/**<BR>&nbsp;&nbsp; * @功能 获取EJB对象<BR>&nbsp;&nbsp; * <BR>&nbsp;&nbsp; * @param strJNDI<BR>&nbsp;&nbsp; * @return<BR>&nbsp;&nbsp; * @throws Exception<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;private Object getEJBObject(String strJNDI) throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;// 创建属性对象<BR>&nbsp;&nbsp;&nbsp;Properties props = new Properties();<BR>&nbsp;&nbsp;&nbsp;props.setProperty(Context.INITIAL_CONTEXT_FACTORY,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"weblogic.jndi.WLInitialContextFactory");<BR>&nbsp;&nbsp;&nbsp;props.setProperty(Context.PROVIDER_URL, "t3://localhost:7001");</P>
<P>&nbsp;&nbsp;&nbsp;// 创建上下文环境对象<BR>&nbsp;&nbsp;&nbsp;InitialContext ctx;<BR>&nbsp;&nbsp;&nbsp;ctx = new InitialContext(props);</P>
<P>&nbsp;&nbsp;&nbsp;// 本地接口<BR>&nbsp;&nbsp;&nbsp;Object oEJB = ctx.lookup(strJNDI);</P>
<P>&nbsp;&nbsp;&nbsp;// 返回函数值<BR>&nbsp;&nbsp;&nbsp;return oEJB;<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;注意上面引用本地会话Bean的JNDI是这样[java:comp/env/HelloWorldLocalBean]的，这个JNDI在服务器的JNDI树中是找不到的。这里的[HelloWorldLocalBean]与[web.xml]中的[&lt;ejb-ref-name&gt;HelloWorldLocalBean&lt;/ejb-ref-name&gt;]保持一致。<BR>&nbsp;<BR>&nbsp;关于JNDI树的查看：<BR>&nbsp;1.启动weblogic server；<BR>&nbsp;2.打开浏览器，进入网址[http://localhost:7001/console/login/LoginForm.jsp]，输入你创建域的时候输入的用户名和密码；<BR>&nbsp;3.选择[域结构]-&gt;[环境]-&gt;[服务器]，点击服务器名称，进入服务器管理页面，点击[查看JNDI树]，弹出的窗体显示的是服务器所有的JNDI。</P>
<P>&nbsp;<BR>&nbsp;修改文件[WebContext/WEB-INF/web.xml]，定义刚创建的servlet。<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;</P>
<P>&nbsp;&lt;!-- version="2.4"这一部分不可以顺便改动，改动容易造成发布错误 --&gt;<BR>&nbsp;&lt;web-app version="2.4" xmlns="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A>"<BR>&nbsp;&nbsp;xmlns:xsi="<A href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</A>"<BR>&nbsp;&nbsp;xsi:schemaLocation="<A href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</A> <A href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</A>"&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- web项目发布名称 --&gt;<BR>&nbsp;&nbsp;&lt;display-name&gt;ejb3test&lt;/display-name&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 默认文件列表 --&gt;<BR>&nbsp;&nbsp;&lt;welcome-file-list&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<BR>&nbsp;&nbsp;&lt;/welcome-file-list&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- －－－－－－－－－－－－－－－－－－－－－－－ 新加的部分 －－－－－－－－－－－－－－－－－－－－－－－－－－ --&gt;<BR>&nbsp;&nbsp;&lt;!-- 定义一个Servlet --&gt;<BR>&nbsp;&nbsp;&lt;servlet&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;CommonSV&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;com.mh.servlet.test.CommonSV&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<BR>&nbsp;&nbsp;&lt;/servlet&gt;<BR>&nbsp;&nbsp;&lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;CommonSV&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/sv/CommonSV.do&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&lt;/servlet-mapping&gt;<BR>&nbsp;&nbsp;&lt;!-- －－－－－－－－－－－－－－－－－－－－－－－ 新加的部分 －－－－－－－－－－－－－－－－－－－－－－－－－－ --&gt;</P>
<P>&nbsp;&nbsp;&lt;!-- 定义引用一个ejb3的本定接口 --&gt;<BR>&nbsp;&nbsp;&lt;ejb-local-ref&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- EJB的引用名称 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-ref-name&gt;HelloWorldLocalBean&lt;/ejb-ref-name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-ref-type&gt;Session&lt;/ejb-ref-type&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- 因为是EJB3所以不能有这一部分 --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;!-- &lt;local-home&gt;&lt;/local-home&gt; --&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;local&gt;com.mh.ejb3.test.HelloWorldLocal&lt;/local&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;ejb-link&gt;ejb3test_ejb.jar#HelloWorldLocalBean&lt;/ejb-link&gt;<BR>&nbsp;&nbsp;&lt;/ejb-local-ref&gt;</P>
<P>&nbsp;&lt;/web-app&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;创建一个web默认的jsp欢迎页面。<BR>&nbsp;文件路径:[WebContext/index.jsp]<BR>&nbsp;内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%&gt;<BR>&nbsp;&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<BR>&nbsp;&lt;html&gt;<BR>&nbsp;&lt;head&gt;<BR>&nbsp;&lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt;<BR>&nbsp;&lt;title&gt;EJB3测试&lt;/title&gt;<BR>&nbsp;&lt;/head&gt;<BR>&nbsp;&lt;body&gt;</P>
<P><BR>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;&lt;a href="<A href="http://localhost:7001/console/">http://localhost:7001/console/</A>" target="_blank"&gt;weblogic控制&lt;/a&gt;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;<BR>&nbsp;&lt;hr size="1"&gt;<BR>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;center&gt;&lt;a href="&lt;%=request.getContextPath() %&gt;/sv/CommonSV.do?dowith=HelloworldLocal" target="_blank"&gt;EJB3测试：本地会话Bean&lt;/a&gt;&lt;/center&gt;<BR>&nbsp;&lt;/p&gt;</P>
<P><BR>&nbsp;&lt;/body&gt;<BR>&nbsp;&lt;/html&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P><BR>5.编译发布程序</P>
<P>&nbsp;打开文件[Build/build.xml]，在[大纲]视图中，选中[project]，右键选择[运行方式]-&gt;[Ant构建]，等一会weblogic server会自动发布程序。你可以通过下面的地址访问[http://localhost:7001/ejb3test/]。</P>
<P>&nbsp;需要注意的是，你在发布程序的时候，记住不要在[控制中心](<A href="http://localhost:7001/console">http://localhost:7001/console</A>)，让它处于[锁定编辑]状态，如果处于锁定编辑状态，系统自动发布程序会报告错误，发布失败。</P>
<P>6.总结与思考</P>
<P>&nbsp;1.EJB3大量使用注释定义，减少配置文件，大大简化了开发，这是它最明显的特点；</P>
<P>&nbsp;2.EJB3在weblogic中，编写本地会话Bean，在同一个weblogic server的低版本(web.xml的版本低于2.5)servlet中访问不能使用依赖注入的的方式，就是下面这样：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;@EJB<BR>&nbsp;private HelloWorld helloWorldLocal;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;关于这个问题，会在下一编文档中详细介绍。</P>
<P>&nbsp;3.EJB3在weblogic中，访问本地会话Bean，只有两种可能：同一个weblogic server的servlet访问，需要在web.xml中引用定义；或者，同一个容器中的其它会话Bean使用依赖注入（或在配置文件ejb-jar.xml中定义引用）的方式访问。</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[用Maven2管理EJB项目]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29062</link>
<author>moshco</author>
<pubDate>2007/10/25 9:48:06</pubDate>
<description><![CDATA[
<P>用Maven2管理EJB项目</P>
<P>&nbsp;</P>
<P>待续......</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[嫦娥飞天了，她干嘛老是绕地球几天才到月球呢？]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29061</link>
<author>moshco</author>
<pubDate>2007/10/25 9:28:29</pubDate>
<description><![CDATA[
<P>嫦娥一号飞天了，我在想为什么她还要绕地球几天才到月球呢？直接从地球飞到月球不就得了吗？！</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[给Apache加上SSL]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=29010</link>
<author>moshco</author>
<pubDate>2007/10/24 15:55:54</pubDate>
<description><![CDATA[
<P>　给Apache加上SSL</P>
<P>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>1.下载</P>
<P>&nbsp;Apache 选择带openssl的版本，这样可以省去下载OpenSSL，我下载的是apache_2.2.6-win32-x86-openssl-0.9.8e.msi。<BR>&nbsp;地址：<A href="http://apache.mirror.phpchina.com/httpd/binaries/win32/">http://apache.mirror.phpchina.com/httpd/binaries/win32/</A></P>
<P>2.安装配置</P>
<P>&nbsp;安装Apache是很简单的，就不多说了！我安装的路径是[D:\Apache2.2]。</P>
<P>&nbsp;打开文件[D:\Apache2.2\conf\httpd.conf]，去掉下面一行的注释（前面的#）：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;#LoadModule ssl_module modules/mod_ssl.so<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;取消下面一行的注释：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;#Include conf/extra/httpd-ssl.conf<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;打开文件[D:\Apache2.2\conf\extra\httpd-ssl.conf]</P>
<P>&nbsp;把下面的内容都注释掉（前面分别加上#）<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;DocumentRoot "D:/Apache2.2/htdocs"<BR>&nbsp;ServerName moshco:443<BR>&nbsp;ServerAdmin <A href="mailto:moshco@163.com">moshco@163.com</A><BR>&nbsp;ErrorLog "D:/Apache2.2/logs/error_log"<BR>&nbsp;TransferLog "D:/Apache2.2/logs/access_log"<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;把[#SSLMutex&nbsp; "file:D:/Apache2.2/logs/ssl_mutex"]修改为[SSLMutex default]；</P>
<P>&nbsp;找到[SSLCertificateFile]、[SSLCertificateKeyFile]，注意他们后面的文件名和路径；等会生成的认证文件要对应起来。</P>
<P>3.生成认证文件</P>
<P>&nbsp;把[D:\Apache2.2\conf\openssl.cnf]拷贝到[D:\Apache2.2]下。</P>
<P>&nbsp;Dos状态下进入[D:\Apache2.2]，分别输入下面的命令：</P>
<P>&nbsp;第一条：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;bin\openssl req -new -out server.csr -config openssl.cnf<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;首先要求你输入密码，我输入的是：[Tightly imprisons the gate which the song (1) manner passes in and outto be locked, crawls the hole for the dog to open wide, a sound pitchis calling: - Crawls, is free for you! I long for the freedom, but Ideeply deeply knew how - person's stature can crawl from the dog hole!I hoped has under a world the raging fire, live coffin burns in oncemy Lian the Zhei, I should and warm-blooded center obtain aquaticallyin the raging fire! ]，记住输入的时候它不会有什么反应，而且前后两次必须输入相同，如果你是粘贴的，粘贴完一次后回车，系统会要你确认，再粘贴一次就可以了。<BR>&nbsp;第二次会要你输入国家名称，你可以输入[CN]，不要超过两个字符；<BR>&nbsp;第三次是省会名字，输入[10]等；<BR>&nbsp;第四次是城市，输入[BJ]；<BR>&nbsp;第五次要求输入公司，输入[MHFO]；<BR>&nbsp;第六次是部门，输入[]；<BR>&nbsp;第七次比较重要，输入你的服务器的名字[moshco]，如果有域名，要输入网站域名，或者IP；<BR>&nbsp;第八次是Email地址，输入[moshco@163.com]；<BR>&nbsp;第九次是一个密码，输入[Helloworld]<BR>&nbsp;第十次是公司组织，输入[MHFO]；</P>
<P>&nbsp;结束，会创建几个文件[.rnd、privkey.pem、server.csr]<BR>&nbsp;下面是我的输入<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;D:\Apache2.2&gt;bin\openssl req -new -out server.csr -config openssl.cnf<BR>&nbsp;Loading 'screen' into random state - done<BR>&nbsp;Generating a 1024 bit RSA private key<BR>&nbsp;..++++++<BR>&nbsp;.++++++<BR>&nbsp;writing new private key to 'privkey.pem'<BR>&nbsp;Enter PEM pass phrase:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入的是密码，不会显示出来<BR>&nbsp;Verifying - Enter PEM pass phrase:&nbsp;&nbsp;&nbsp;&nbsp;确认密码，不会显示出来<BR>&nbsp;-----<BR>&nbsp;You are about to be asked to enter information that will be incorporated<BR>&nbsp;into your certificate request.<BR>&nbsp;What you are about to enter is what is called a Distinguished Name or a DN.<BR>&nbsp;There are quite a few fields but you can leave some blank<BR>&nbsp;For some fields there will be a default value,<BR>&nbsp;If you enter '.', the field will be left blank.<BR>&nbsp;-----<BR>&nbsp;Country Name (2 letter code) [AU]:CN<BR>&nbsp;State or Province Name (full name) [Some-State]:10<BR>&nbsp;Locality Name (eg, city) []:BJ<BR>&nbsp;Organization Name (eg, company) [Internet Widgits Pty Ltd]:MHFO<BR>&nbsp;Organizational Unit Name (eg, section) []:<BR>&nbsp;Common Name (eg, YOUR name) []:moshco&nbsp;&nbsp;&nbsp;&nbsp;你的网站的域名或IP地址<BR>&nbsp;Email Address []:moshco@163.com</P>
<P>&nbsp;Please enter the following 'extra' attributes<BR>&nbsp;to be sent with your certificate request<BR>&nbsp;A challenge password []:Helloworld<BR>&nbsp;An optional company name []:MhFO</P>
<P>&nbsp;D:\Apache2.2&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;第二条：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;bin\openssl rsa -in privkey.pem -out server.key<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;要求输入前面输入的密码[Tightly imprisons the gate which the song (1) manner passes in and outto be locked, crawls the hole for the dog to open wide, a sound pitchis calling: - Crawls, is free for you! I long for the freedom, but Ideeply deeply knew how - person's stature can crawl from the dog hole!I hoped has under a world the raging fire, live coffin burns in oncemy Lian the Zhei, I should and warm-blooded center obtain aquaticallyin the raging fire! ]。输入的时候也不会有任何反应。会创建文件[server.key]</P>
<P>&nbsp;第三条：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;创建一个在3650天内有效的证书[server.crt]</P>
<P>&nbsp;将新创建的这些文件[.rnd、privkey.pem、server.csr、server.key、server.crt]拷贝到[D:\Apache2.2\conf]下。完成！</P>
<P>&nbsp;重新启动服务器，输入[https://moshco/]。</P>
<P>4.只提供SSL访问</P>
<P>&nbsp;如果你想只提供https的方式访问，你可以这样：<BR>&nbsp;打开文件[D:\Apache2.2\conf\httpd.conf]，修改[Listen 80]为[#Listen 80]，修改[ServerName moshco:80]为[ServerName moshco:443]，从新启动服务。</P>
<P><BR>&nbsp;<BR>&nbsp;</P>
<P><BR>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[房价要跌了，我很兴奋......]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=28884</link>
<author>moshco</author>
<pubDate>2007/10/20 22:13:05</pubDate>
<description><![CDATA[<P>刚才看了新浪的新闻：<A href="http://finance.sina.com.cn/g/20071020/00024080397.shtml">http://finance.sina.com.cn/g/20071020/00024080397.shtml</A></P>
<P>实在是太兴奋了，等房子跌了，我要在北京买一套房子，把父母接过来，在北京安家！</P>]]></description>
</item><item>
<title><![CDATA[MH-ERP架构创想]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=28850</link>
<author>moshco</author>
<pubDate>2007/10/19 12:58:05</pubDate>
<description><![CDATA[
<P><A><FONT face=新宋体 size=5>　</FONT></A><FONT face=新宋体 size=5>MH-ERP架构创想</FONT></P>
<P><FONT face=新宋体 size=2>-------------------------------------------------------------------------</FONT></P>
<P>我想开发一套免费可以自由下载的ERP框架，并基于这个ERP框架去开发一些ERP系统，这是我现在最基本的思考。我暂时的想法是，至少要具备一下一些特点：</P>
<P>1.要能在各种操作系统上运行；</P>
<P>2.要易于安装，入门简单（针对开发人员）；</P>
<P>3.要能在此基础上实现各种变化的业务需求，可以满足客户想到哪里做到哪里的需求；</P>
<P>4.界面友好性要强；</P>
<P>5.开发人员基于此框架，只需要少量的开发，就能实现复杂的功能。</P>
<P>6.安全性要好；</P>
<P>7.要有很好的开放性，任何人都可以基于此做二次开发和业务实现。</P>&nbsp;]]></description>
</item><item>
<title><![CDATA[囚歌]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=28837</link>
<author>moshco</author>
<pubDate>2007/10/19 9:15:07</pubDate>
<description><![CDATA[
<P>囚歌①</P>
<P>　　为人进出的门紧锁着，<BR>　　为狗爬出的洞敞开着，<BR>　　一个声音高叫着：<BR>　　——爬出来吧，给你自由！</P>
<P>　　我渴望自由，<BR>　　但我深深地知道——<BR>　　人的身躯怎能从狗洞子里爬出！</P>
<P>　　我希望有一天<BR>　　地下的烈火，<BR>　　将我连这活棺材一齐烧掉，<BR>　　我应该在烈火与热血中得到水生！</P>
<P>　　叶挺（1896－1946），字希夷，广东惠阳人。1924年赴苏联东方劳动大学与军事学校学习。1925年回国。第一次国内革命战争时期，曾任国民革命军独立团团长、二十四师师长、十一军军长。1927年先后参加南昌起义和广州起义。抗战时任新四军军长。1941年皖南事变时被国民党非法逮捕，先后被囚于江西上饶，湖北恩施，广西桂林等地，最后移禁于重庆“中美特种技术合作所”集中营。1946年3月4日，由于中共中央的坚决要求，始获自由。出狱后即电中共中央请求加入中国共产党，于3月7日经中共中央批准。4月8日自重庆飞返延安，途中因飞机失事遇难。</P>]]></description>
</item><item>
<title><![CDATA[SVN安装配置笔记]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=28824</link>
<author>moshco</author>
<pubDate>2007/10/18 16:24:15</pubDate>
<description><![CDATA[
<P>SVN安装配置笔记</P>
<P>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>1.下载</P>
<P>&nbsp;首先要说一定的是，SVN有详细的安装配置文档，地址在：<A href="http://www.subversion.org.cn/tsvndoc/">http://www.subversion.org.cn/tsvndoc/</A>。</P>
<P>&nbsp;下载Apache，版本选定在2.0.x的最高版本apache_2.0.61-win32-x86-no_ssl.msi，为什么选择这个版本，原因是支持Apache2.2版本的SVN现在还不稳定，特别是在配置细粒度权限控制时，会报告错误！<BR>&nbsp;下载地址：<A href="http://www.apache.org/dist/httpd/binaries/win32/">http://www.apache.org/dist/httpd/binaries/win32/</A></P>
<P><BR>&nbsp;下载SVN，版本选择要注意，要选择在Apache2.0下构建生成的包，我选择的是svn-1.4.5-setup.exe。<BR>&nbsp;地址:http://subversion.tigris.org/project_packages.html<BR>&nbsp;<BR>&nbsp;SVN客户端TortoiseSVN-1.4.5.10425-win32-svn-1.4.5.msi，可以在这里选择下载语言包。<BR>&nbsp;地址：<A href="http://tortoisesvn.net/downloads">http://tortoisesvn.net/downloads</A><BR>&nbsp;</P>
<P>2.安装Apache</P>
<P>&nbsp;Apache的安装很简单，基本是按照默认设置。我安装的路径设置在[D:\Apache2]。安装完成后，会启动服务器。可以在浏览器中输入[http://localhost/]，如果看到[It works！]，说明安装成功了！</P>
<P>&nbsp;如果你想修改web访问的端口，可以打开文件[D:\Apache_2.2.6\conf\httpd.conf]，在120行附近找到[Listen 80]，修改80为你想要的端口；<BR>&nbsp;如果你想修改主机默认的主页[It works]，你可以在230行找到[DocumentRoot "D:/Apache2/htdocs"]；修改这个地方的[index.html]文件的内容，或者干脆修改["D:/Apache2/htdocs"]为你从新设定的地址。</P>
<P><BR>3.安装Subversion</P>
<P>&nbsp;Subversion的安装也很简单，基本是按照默认设置。我安装的路径是：[D:\subversion\for2.0]。安装的过程中安装程序会关闭已经启动的Apache服务，在配置文件[D:\Apache2\conf\httpd.conf]中自动做一些配置，主要的配置如下：<BR>&nbsp;1&gt;145行，去掉[#]注释<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;LoadModule dav_module modules/mod_dav.so<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;2&gt;173、174行增加两行<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;LoadModule dav_svn_module "D:/subversion/for2.0/bin/mod_dav_svn.so"<BR>&nbsp;LoadModule authz_svn_module "D:/subversion/for2.0/bin/mod_authz_svn.so"<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;3并在系统环境变量里面增加设置变量[APR_ICONV_PATH=D:\subversion\for2.0\iconv]，在Path的末尾增加[;D:\subversion\for2.0\bin]，然后会从新启动Apache服务。</P>
<P><BR>4.安装SVN客户端TortoiseSVN<BR>&nbsp;<BR>&nbsp;点击安装文件，按步骤一步一步安装，没有什么特别的。安装语言包。安装完毕后需要从新启动电脑。</P>
<P>&nbsp;语言设置<BR>&nbsp;在任何一个目录点击右键，选择[TortoiseSVN]-&gt;[设置]-&gt;[常规设置]-&gt;[语言]，选择[中文(简体)]。</P>
<P>5.创建版本库</P>
<P>&nbsp;使用TortoiseSVN创建版本库</P>
<P>&nbsp;创建一个目录[D:\subversion\Repository]，进入目录，创建一个目录[TH]，选择[TH]点击右键，选择[TortoiseSVN]-&gt;[在此创建版本库]，选择[本地文件系统(FSFS)]，接着会提示创建成功的消息。<BR>&nbsp;注意：<BR>&nbsp;1&gt; 如果要在一个目录上创建版本库，目录不能为只读，且为空。<BR>&nbsp;2&gt; 只有选择了[FSFS]文件系统的版本库才可以使用[file:///D:/svn-win32-1.4.5_apache2.2.x/Repository/TH]的方式访问。<BR>&nbsp;下面对两种文件系统做些解释：<BR>&nbsp;FS文件系统，版本库可以使用的一种Subversion专用的后台文件系统格式，能够在通过网络共享的文件系统上使用，FSFS是Subversion 1.2版以后的缺省版本库格式。<BR>&nbsp;伯克利DB（Berkeley DB），版本库可以使用的一种经过充分测试的后台数据库实现，不能在通过网络共享的文件系统上使用，伯克利DB是Subversion 1.2版以前的缺省版本库格式。</P>
<P>&nbsp;</P>
<P>&nbsp;使用命令行工具[svnadmin]创建版本库</P>
<P>&nbsp;进入目录[D:\Apache2\bin]，照下面输入<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;D:\Apache2\bin&gt;svnadmin create --fs-type bdb MyNewRepository<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;或者<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;D:\Apache2\bin&gt;svnadmin create --fs-type fsfs MyNewRepository<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;将创建生成的目录拷贝到[D:\subversion\Repository]目录下，便于统一管理。<BR>&nbsp;</P>
<P><BR>6.设置从web端访问版本库</P>
<P>&nbsp;在Apache配置文件的最后(960行)添加下面内容，下面#号后的注释去掉：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;Location /svn&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#svn是你设定的Web访问的一个虚拟名，它在Http中的位置是：<A href="http://localhost/svn">http://localhost/svn</A><BR>&nbsp;&nbsp;DAV svn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#告诉Apache是哪个模块响应那个URL的请求－此刻是Subversion模块。<BR>&nbsp;&nbsp;SVNListParentPath on&nbsp;&nbsp;&nbsp;&nbsp;#对于Subversion1.3或者更高版本，这个指示表示显示所有SVNParentPath下的版本库。<BR>&nbsp;&nbsp;SVNParentPath D:\subversion\Repository&nbsp;&nbsp;#告诉Subversion需要查看的版本库位于D:\svn-win32-1.4.5_apache2.2.x\Repository之下<BR>&nbsp;&nbsp;AuthType Basic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#激活基本认证，就是用户名/密码<BR>&nbsp;&nbsp;AuthName "这是Apache2.0的SVN:"&nbsp;&nbsp;&nbsp;#用来说明何时弹出要求用户输入认证信息的认证对话框<BR>&nbsp;&nbsp;AuthUserFile passwd&nbsp;&nbsp;&nbsp;&nbsp;#指定使用的认证密码文件 <BR>&nbsp;&nbsp;#AuthzSVNAccessFile svnaccessfile&nbsp;&nbsp;#位置Subversion版本库的访问控制文件的路径<BR>&nbsp;&nbsp;Require valid-user&nbsp;&nbsp;&nbsp;&nbsp;#指定只有输入了正确的用户/密码的用户可以访问URL<BR>&nbsp;&lt;/Location&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;注意：<BR>&nbsp;如果你打算把密码文件放在[D:\Apache2\bin]下，你的密码文件的路径就应该是：[D:\Apache2\bin\passwd]或者[bin\passwd]；而不是[passwd]，密码文件名[passwd]你可以改变的。[svnaccessfile]也是类似。</P>
<P>&nbsp;创建密码文件:<BR>&nbsp;Dos状态下，来到路径[D:\Apache2\bin]，输入命令，创建一个密码文件：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;D:\Apache2\bin&gt;htpasswd -c passwd admin<BR>&nbsp;Automatically using MD5 format.<BR>&nbsp;New password: *******<BR>&nbsp;Re-type new password: *******<BR>&nbsp;Adding password for user admin<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;如果你要再添加一个用户，照下面输入：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;D:\Apache2\bin&gt;htpasswd passwd moshco<BR>&nbsp;Automatically using MD5 format.<BR>&nbsp;New password: ********<BR>&nbsp;Re-type new password: ********<BR>&nbsp;Adding password for user moshco<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;删除一个用户，照下面输入：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;D:\Apache2\bin&gt;htpasswd -D passwd moshco1<BR>&nbsp;Automatically using MD5 format.<BR>&nbsp;Deleting password for user moshco1<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;做完以上的操作后需要从新启动Apache服务器。</P>
<P>&nbsp;如果你希望所有人可以读你的版本库，但是只有特定用户可以写，你可以修改下面几行<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;[Require valid-user]改为<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;<BR>&nbsp;Require valid-user<BR>&nbsp;&lt;/LimitExcept&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;</P>
<P>&nbsp;这时候你可以打开[http://localhost/svn/]，要求输入用户名和密码，输入刚才创建的用户[admin]和密码，既可以打开网页，看到你在目录[D:\svn-win32-1.4.5_apache2.2.x\Repository]下创建的几个版本库。</P>
<P><BR>&nbsp;到这个时候为止，你只是做到了通过用户名和密码限制用户访问(写入)版本库，却不能做到用户的权限控制。如果要打开用户的权限控制功能，你需要在去掉上面配置的这一行的[#]注释。<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;AuthzSVNAccessFile bin\svnaccessfile<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;并在[D:\Apache_2.2.6\bin]目录下创建文本文件[svnaccessfile]，内容如下（去掉后面的注释部分）：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;[groups]&nbsp;&nbsp;&nbsp;#用户组配置<BR>&nbsp;gwr = admin,moshco&nbsp;&nbsp;#admin，moshco都属于gwr组<BR>&nbsp;gr = cn&nbsp;&nbsp;&nbsp;&nbsp;#cn属于gr组</P>
<P>&nbsp;[/]&nbsp;&nbsp;&nbsp;&nbsp;#[http://localhost/svn/]此路径下的权限配置<BR>&nbsp;* = r&nbsp;&nbsp;&nbsp;&nbsp;#所有用户都能读<BR>&nbsp;@gwr = rw&nbsp;&nbsp;&nbsp;#用户组gwr有读写权限<BR>&nbsp;cn = r&nbsp;&nbsp;&nbsp;&nbsp;#cn用户只有读的权限</P>
<P><BR>&nbsp;[MHSVN:/]&nbsp;&nbsp;&nbsp;#MHSVN版本库根路径[/]下的权限配置，即[http://localhost/svn/MHSVN/]<BR>&nbsp;@gwr = rw&nbsp;&nbsp;&nbsp;#用户组gwr有读写权限<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;下面贴出一个权限控制的例子<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;[groups]<BR>&nbsp;admin = john, kate<BR>&nbsp;devteam1 = john, rachel, sally<BR>&nbsp;devteam2 = kate, peter, mark<BR>&nbsp;docs = bob, jane, mike<BR>&nbsp;training = zak<BR>&nbsp;# Default access rule for ALL repositories<BR>&nbsp;# Everyone can read, admins can write, Dan German is excluded.<BR>&nbsp;[/]<BR>&nbsp;* = r<BR>&nbsp;@admin = rw<BR>&nbsp;dangerman =<BR>&nbsp;# Allow developers complete access to their project repos<BR>&nbsp;[proj1:/]<BR>&nbsp;@devteam1 = rw<BR>&nbsp;[proj2:/]<BR>&nbsp;@devteam2 = rw<BR>&nbsp;[bigproj:/]<BR>&nbsp;@devteam1 = rw<BR>&nbsp;@devteam2 = rw<BR>&nbsp;trevor = rw<BR>&nbsp;# Give the doc people write access to all the docs folders<BR>&nbsp;[/trunk/doc]<BR>&nbsp;@docs = rw<BR>&nbsp;# Give trainees write access in the training repository only<BR>&nbsp;[TrainingRepos:/]<BR>&nbsp;@training = rw<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P><BR>&nbsp;到现在为止，你就已经能通过用户名和密码完全控制SVN版本库的权限访问了。<BR>&nbsp;需要说明一点的是，之前你打开[http://localhost/svn/]会有一个版本库列表，现在不会出现了。如果你的Apache配置了PHP支持，你需要建立一个PHP的站点，然后写入下面一段程序svn_index.php，放在指定位置。<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;html&gt;<BR>&nbsp;&lt;head&gt;<BR>&nbsp;&lt;title&gt;Subversion Repositories&lt;/title&gt;<BR>&nbsp;&lt;/head&gt;<BR>&nbsp;&lt;body&gt;</P>
<P>&nbsp;&lt;h2&gt;Subversion Repositories&lt;/h2&gt;<BR>&nbsp;&lt;p&gt;<BR>&nbsp;&lt;?php<BR>&nbsp;&nbsp;&nbsp;&nbsp; $svnparentpath = "D:/svn-win32-1.4.5_apache2.2.x/Repository";<BR>&nbsp;&nbsp;&nbsp;&nbsp; $svnparenturl = "/svn";</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; $dh = opendir( $svnparentpath );<BR>&nbsp;&nbsp;&nbsp;&nbsp; if( $dh ) {<BR>&nbsp;&nbsp;while( $dir = readdir( $dh ) ) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $svndir = $svnparentpath . "/" . $dir;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $svndbdir = $svndir . "/db";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $svnfstypefile = $svndbdir . "/fs-type";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( is_dir( $svndir ) &amp;&amp; is_dir( $svndbdir ) ) {<BR>&nbsp;&nbsp;&nbsp;echo "&lt;a href=\"" . $svnparenturl . "/" .<BR>&nbsp;&nbsp;&nbsp;&nbsp;$dir . "\"&gt;" . $dir . "&lt;/a&gt;\n";<BR>&nbsp;&nbsp;&nbsp;if( file_exists( $svnfstypefile ) ) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $handle = fopen ("$svnfstypefile", "r");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $buffer = fgets($handle, 4096);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fclose( $handle );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $buffer = chop( $buffer );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( strcmp( $buffer, "fsfs" )==0 ) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;echo " (FSFS) &lt;br /&gt;\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;echo " (BDB) &lt;br /&gt;\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo " (BDB) &lt;br /&gt;\n";<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;closedir( $dh );<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;?&gt;<BR>&nbsp;&lt;/p&gt;</P>
<P>&nbsp;&lt;/body&gt;<BR>&nbsp;&lt;/html&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;你可以输入[http://localhost/web/svn_index.php]见到版本库列表。[web]是你配置的一个虚拟目录。<BR>&nbsp;</P>
<P>7.给Web端加上SSL</P>
<P>&nbsp;为了使访问变得更加安全，我给web端访问SVN加上了SSL。<BR>&nbsp;首先需要去[http://brandleadershipmarketing.com/apache/]这里下载一个Apache版的OpenSSL，我下载的时候这里没有与Apache2.0.61相同版本的可以选择，我下载了一个最接近的版本[Apache_2.0.59-Openssl_0.9.8d-Win32]，下载完毕后将它解压缩。关闭Apache服务。<BR>&nbsp;拷贝[modules\mod_ssl.so]到Apache安装目录的[modules\mod_ssl.so]；<BR>&nbsp;拷贝[bin\openssl.exe、openssl.exe、libeay32.dll、ssleay32.dll、Apache.exe、ApacheMonitor.exe]到Apache安装目录的[bin\]；<BR>&nbsp;拷贝[conf/ssl.conf]到Apache安装目录的[conf/ssl.conf]；<BR>&nbsp;<BR>&nbsp;需要注意的是，一定要拷贝[Apache.exe、ApacheMonitor.exe]，否则你的服务启动会报告一些错误！</P>
<P><BR>&nbsp;使用文本编辑器打开Apache的conf目录的ssl.conf，注释掉（使用#）下面几行：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;DocumentRoot "c:/apache/htdocs"<BR>&nbsp;ServerName <A href="http://www.example.com:443/">www.example.com:443</A><BR>&nbsp;ServerAdmin <A href="mailto:you@example.com">you@example.com</A><BR>&nbsp;ErrorLog logs/error_log<BR>&nbsp;TransferLog logs/access_log<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;修改[SSLCertificateFile conf/ssl.crt/server.crt]为[SSLCertificateFile conf/ssl/my-server.cert]；</P>
<P>&nbsp;修改[SSLCertificateKeyFile conf/ssl.key/server.key]为[SSLCertificateKeyFile conf/ssl/my-server.key]；</P>
<P>&nbsp;修改[SSLMutex&nbsp; file:logs/ssl_mutex]为[SSLMutex&nbsp; default]；</P>
<P>&nbsp;删除[&lt;IfDefine SSL&gt;]和[&lt;/IfDefine&gt;]；</P>
<P>&nbsp;打开Apache配置文件（httpd.conf），并且去掉此行的注释<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;#LoadModule ssl_module modules/mod_ssl.so<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;下载[http://tud.at/programm/openssl.cnf]这个文件保存到[D:\Apache2\bin]，接下来开始创建SSL证书。</P>
<P>&nbsp;首先在DOS状态下进入目录[D:\Apache2\bin]，逐一输入下面的命令：</P>
<P>&nbsp;第一个命令行<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;bin\openssl req -config bin/openssl.cnf -new -out my-server.csr<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<BR>&nbsp;如果出现下面的状况<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;D:\Apache2&gt;bin\openssl req -config bin/openssl.cnf -new -out my-server.csr<BR>&nbsp;Loading 'screen' into random state -<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;你应该去看看，你是不是把文件[libeay32.dll]和[ssleay32.dll]没有拷贝过来！</P>
<P>&nbsp;你会被讯问密语，请不要使用简单的单词，而是使用整段话，例如一段诗，越长越好。你也需要输入server的URL，其他所有问题都是可选的，但是我们建议你最好输入这些信息。通常会自动产生privkey.pem文件，但是如果没有，请输入下面的命令生成它：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;bin\openssl genrsa -out privkey.pem 2048<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P><BR>&nbsp;第二个命令行<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;bin\openssl rsa -in privkey.pem -out my-server.key<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;第三个命令行<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;bin\openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这样会创建一个在4000天里过期的证书。</P>
<P>&nbsp;第四个命令行<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;bin\openssl x509 -in my-server.cert -out my-server.der.crt -outform DER<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>&nbsp;这些命令在Apache目录（my-server.der.crt、my-server.csr、my-server.key、.rnd、privkey.pem、my-server.cert）里创建了一些文件，拷贝这些文件到目录conf/ssl（例如C:\program files\apache group\apache2\conf\ssl），如果这个目录不存在，你需要首先创建一个。</P>
<P><BR>&nbsp;重启apache服务，在浏览器中输入[https://localhost/svn/MHSVN]。</P>
<P><BR>&nbsp;下面我实际操作的记录：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;D:\Apache2&gt;bin\openssl req -config bin/openssl.cnf -new -out my-server.csr<BR>&nbsp;Loading 'screen' into random state - done<BR>&nbsp;Generating a 1024 bit RSA private key<BR>&nbsp;..............++++++<BR>&nbsp;.............++++++<BR>&nbsp;writing new private key to 'privkey.pem'<BR>&nbsp;Enter PEM pass phrase:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#这里是要你输入一段因为，你输入的时候不会显示<BR>&nbsp;Verifying - Enter PEM pass phrase:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#这里是确认上面输入的话，也不会显示<BR>&nbsp;-----<BR>&nbsp;You are about to be asked to enter information that will be incorporated<BR>&nbsp;into your certificate request.<BR>&nbsp;What you are about to enter is what is called a Distinguished Name or a DN.<BR>&nbsp;There are quite a few fields but you can leave some blank<BR>&nbsp;For some fields there will be a default value,<BR>&nbsp;If you enter '.', the field will be left blank.<BR>&nbsp;-----<BR>&nbsp;Country Name (2 letter code) []:10<BR>&nbsp;State or Province Name (full name) []:moshco zhu<BR>&nbsp;Locality Name (eg, city) []:BJ<BR>&nbsp;Organization Name (eg, company) []:MHFO<BR>&nbsp;Organizational Unit Name (eg, section) []:<BR>&nbsp;Common Name (eg, your websites domain name) []:moshco<BR>&nbsp;Email Address []:moshco@163.com</P>
<P>&nbsp;Please enter the following 'extra' attributes<BR>&nbsp;to be sent with your certificate request<BR>&nbsp;A challenge password []:Helloworld</P>
<P>&nbsp;D:\Apache2&gt;bin\openssl rsa -in privkey.pem -out my-server.key<BR>&nbsp;Enter pass phrase for privkey.pem:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#这里也是让你输入一段话，不会显示<BR>&nbsp;writing RSA key</P>
<P>&nbsp;D:\Apache2&gt;bin\openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000<BR>&nbsp;Loading 'screen' into random state - done<BR>&nbsp;Signature ok<BR>&nbsp;subject=/C=10/ST=moshco <A href="mailto:zhu/L=BJ/O=MHFO/CN=moshco/emailAddress=moshco@163.com">zhu/L=BJ/O=MHFO/CN=moshco/emailAddress=moshco@163.com</A><BR>&nbsp;Getting Private key</P>
<P>&nbsp;D:\Apache2&gt;bin\openssl x509 -in my-server.cert -out my-server.der.crt -outform DER</P>
<P>&nbsp;D:\Apache2&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P><BR>&nbsp;强制SSL访问<BR>&nbsp;当你设置了SSL让你的版本库更安全，你一定希望关闭普通的非ssl访问，为此，你需要在Subversion的&lt;Location&gt; 增加指示：SSLRequireSSL。<BR>&nbsp;一个&lt;Location&gt;实例就像这个样子：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;Location /svn&gt;<BR>&nbsp;DAV svn<BR>&nbsp;SVNListParentPath on<BR>&nbsp;SVNParentPath D:\subversion\Repository<BR>&nbsp;SSLRequireSSL<BR>&nbsp;AuthType Basic<BR>&nbsp;AuthName "这是Apache2.0的SVN:"<BR>&nbsp;AuthUserFile passwd<BR>&nbsp;AuthzSVNAccessFile svnaccessfile<BR>&nbsp;Require valid-user<BR>&nbsp;&lt;/Location&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P><BR>8.使用Svnserve服务器</P>
<P><BR>&nbsp;有一些情况下，不能使用Apache作为你的服务器，Subversion包括Svnserve－一个轻型的独立服务器，使用普通TCP/IP连接之上的自定义协议。大多数情况下svnserve的设置更加简单，也比Apache的服务器更加快。</P>
<P>&nbsp;打开资源管理器，进入Subversion的[D:\subversion\for2.0\bin]目录，拷贝svnserve.exe、libdb44.dll、libeay32.dll和ssleay32.dll到你的目录[D:\subversion\svnserver2.0]。</P>
<P>&nbsp;创建一个[svnserve_all.bat]，内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;D:\subversion\svnserver2.0\svnserve.exe --daemon<BR>&nbsp;pause<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;启动这个程序，本地电脑下的所有SVN库都可以通过网络访问。例如[svn://localhost/subversion/Repository/MHSVN]，[localhost]以后的部分是不带硬盘驱动器的路径。</P>
<P>&nbsp;再创建一个[svnserve_MHSVN.bat]，内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;D:\subversion\svnserver2.0\svnserve.exe --daemon --root D:\Subversion\Repository\MHSVN<BR>&nbsp;pause<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;启动这个程序，网络上的电脑只能访问MHSVN一个库。访问方式为[svn://localhost/]</P>
<P><BR>&nbsp;配置认证与权限控制<BR>&nbsp;这里需要说明一点的是，此处的权限配置，与Apache方式配置的权限是无不相干的，它们是两种不同的访问方式。<BR>&nbsp;缺省的svnserve设置提供了匿名的只读访问，这意味着你可以使用svn://的URL进行检出和更新，或者使用TortoiseSVN的版本库浏览器查看版本库，但是不能提交任何修改。为了打开对版本库的写访问，你可以编辑版本库目录的conf/svnserve.conf文件，这个文件控制了svnserve守护进程的配置，也提供了有用的文档。为了打开匿名的写访问，只需要简单得设置：<BR>&nbsp;－－－－－－－－－－－－－－<BR>&nbsp;[general]<BR>&nbsp;anon-access = write<BR>&nbsp;－－－－－－－－－－－－－－<BR>&nbsp;然而，你不会知道谁修改了版本库，因为svn:author属性是空的，你也不能控制谁来修改版本库，这是一个很危险的设置。解决这个问题的一个方法是创建密码数据库：<BR>&nbsp;－－－－－－－－－－－－－－－－－<BR>&nbsp;[general]<BR>&nbsp;anon-access = none<BR>&nbsp;auth-access = write<BR>&nbsp;password-db = userfile<BR>&nbsp;－－－－－－－－－－－－－－－－－<BR>&nbsp;这里userfile与svnserve.conf文件在同一个目录，这个文件也可以存在于文件系统的其他地方（当多个版本库使用相同的访问权限时尤其有用），并使用绝对路径引用，或者是conf的相对目录，使用\或盘符不能工作。userfile的结构如下：<BR>&nbsp;－－－－－－－－－－－－－－－－<BR>&nbsp;[users]<BR>&nbsp;username = password<BR>&nbsp;－－－－－－－－－－－－－－－－<BR>&nbsp;如果你要配置细粒度权限，需要加下面一段<BR>&nbsp;－－－－－－－－－－－－－－－－<BR>&nbsp;[general]<BR>&nbsp;authz-db = authz<BR>&nbsp;－－－－－－－－－－－－－－－－<BR>&nbsp;[authz]是文件名，它的格式与Apache配置权限的格式一样。</P>
<P>&nbsp;我的[svnserve.conf]内容如下：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;[general]<BR>&nbsp;anon-access = none<BR>&nbsp;auth-access = write<BR>&nbsp;password-db = passwd<BR>&nbsp;authz-db = authz<BR>&nbsp;realm = Moshco's second Repository<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</P>
<P>9.本地[file]方式访问</P>
<P>&nbsp;使用本地[file]方式访问需要使用Tortoise的版本库浏览器，使用方式是：在任何地方点击右键，选择[TortoiseSVN]-&gt;[版本库浏览器]，输入如下格式：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;<A href="file:///d:/subversion/Repository/MHSVN">file://localhost/d:/subversion/Repository/MHSVN</A><BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;注意，本地[file]方式访问是不需要任何服务器启动的。</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P><BR>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[使用Continuum配置定时打包发布服务]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=28814</link>
<author>moshco</author>
<pubDate>2007/10/18 14:04:15</pubDate>
<description><![CDATA[<P><BR>使用Continuum配置定时打包发布服务<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</P>
<P>1.下载安装<BR>&nbsp;<BR>&nbsp;到下面的网址<BR>&nbsp;<A href="http://maven.apache.org/continuum/download.html">http://maven.apache.org/continuum/download.html</A><BR>&nbsp;去下载一个最新版本的Continuum，我下载的是[Continuum 1.0.3，下载zip包；</P>
<P>&nbsp;将下载的continuum-1.0.3-bin.zip解压到你想安装的位置，我解压缩在D:\，这样就算安装完成。</P>
<P>2.基本配置</P>
<P>&nbsp;双击运行文件[D:\continuum-1.0.3\bin\plexus.bat]，第一次运行会有些错误报告，启动完毕后关闭启动的服务，再一次运行启动文件，这次就会正常启动。</P>
<P>&nbsp;如果你想修改WEB访问的端口，可以打开文件[D:\continuum-1.0.3\apps\continuum\conf\application.xml]，找到下面一行<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;http-listener&gt;<BR>&nbsp;&nbsp;&lt;port&gt;8080&lt;/port&gt;<BR>&nbsp;&lt;/http-listener&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;修改为：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;&lt;http-listener&gt;<BR>&nbsp;&nbsp;&lt;port&gt;8089&lt;/port&gt;<BR>&nbsp;&lt;/http-listener&gt;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;这样WEB访问端口就被修改为8089了，你可以根据自己的实际情况修改，修改端口后需要从新启动服务。</P>
<P><BR>&nbsp;使用浏览器打开[http://localhost:8089/continuum/]，第一次登录会要求你做一些基本配置，<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;Admin account<BR>&nbsp;username:admin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;新建的账户名，必须填写<BR>&nbsp;Password:admin12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;密码，必须填写<BR>&nbsp;Re-enter-Password:admin12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;确认密码，必须填写<BR>&nbsp;Full Name: admin zhu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;全名，必须填写<BR>&nbsp;Email:continuum_moshco@163.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Email帐号，我特别去新注册的一个，建议去新注册一个，下面要用到</P>
<P>&nbsp;Directories<BR>&nbsp;Working Directory:D:\continuum-1.0.3\vsnapp\work&nbsp;&nbsp;这个目录是Continuum从版本控制服务器(SVN)上捡出最新代码的地方，continuum会为每一&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;个项目在这个目录下新创建一个目录，用来存放源代码。<BR>&nbsp;Build Output Directory:D:\continuum-1.0.3\vsnapp\out&nbsp;&nbsp;work目录中每一个项目目录对应，里面好像只是一个log文件。<BR>&nbsp;Deployment Repository Directory:&nbsp;&nbsp;&nbsp;&nbsp;可以不用填写</P>
<P>&nbsp;BaseURL<BR>&nbsp;Base <A href="http://localhost:8089/continuum/servlet/continuum">URL:http://localhost:8089/continuum/servlet/continuum</A>&nbsp;修改一下端口就可以了。</P>
<P>&nbsp;Company Informations<BR>&nbsp;Name:MHFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;公司名称<BR>&nbsp;Logo:F:\Dmt\My Pictures\ICO\logo32.gif&nbsp;&nbsp;&nbsp;&nbsp;Log文件的位置，可以输入http://...<BR>&nbsp;URL:</P>
<P>&nbsp;Guest Access<BR>&nbsp;Allow Guest:选择&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否接受Guest账户访问<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;其中选项根据实际情况输入，完毕后提交。</P>
<P><BR>&nbsp;如果你想从新配置刚才输入的一些信息，或者新添加一些账户和用户组，你可以从左边的导航栏选择进入。</P>
<P>3.添加一个Ant项目</P>
<P>&nbsp;从左边的[Add Project]-&gt;[Ant Project]，照如下填写：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;Project Name:Helloworld_EJB3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;项目名称<BR>&nbsp;Version：1.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;版本<BR>&nbsp;Scm Url：scm:svn:https://localhost/svn/MHSVN/HelloWorld&nbsp;&nbsp;源代码版本访问方式，需要严格按照Scm规则填写<BR>&nbsp;Scm Username:moshco&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;登录版本服务器的用户名<BR>&nbsp;Scm Password:moshco123456&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;登录版本服务器的密码<BR>&nbsp;Scm Branch/Tag:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;项目的分支/标签，可以不填写<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;填写完毕后提交。<BR>&nbsp;这里需要说明一点的是，Scm的填写，可以参考<A href="http://maven.apache.org/scm/scms-overview.html">http://maven.apache.org/scm/scms-overview.html</A><BR>&nbsp;SCM的基本规则是这样的：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;scm:&lt;scm_provider&gt;&lt;delimiter&gt;&lt;provider_specific_part&gt;&nbsp;<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;scm_provider:版本控制的方式，如：svn、cvs、vss、file......<BR>&nbsp;delimiter:分隔符号<BR>&nbsp;provider_specific_part：访问版本服务器的url<BR>&nbsp;SVN:<BR>&nbsp;scm:svn:svn://[username[:password]@]server_name[:port]/path_to_repository<BR>&nbsp;scm:svn:svn+ssh://[username@]server_name[:port]/path_to_repository<BR>&nbsp;scm:svn:file://[hostname]/path_to_repository<BR>&nbsp;scm:svn:http://[username[:password]@]server_name[:port]/path_to_repository<BR>&nbsp;scm:svn:https://[username[:password]@]server_name[:port]/path_to_repository<BR>&nbsp;&nbsp;例如：<BR>&nbsp;&nbsp;scm:svn:file:///svn/root/module<BR>&nbsp;&nbsp;scm:svn:file://localhost/path_to_repository<BR>&nbsp;&nbsp;scm:svn:file://my_server/path_to_repository<BR>&nbsp;&nbsp;scm:svn:http://svn.apache.org/svn/root/module<BR>&nbsp;&nbsp;scm:svn:https://username@svn.apache.org/svn/root/module<BR>&nbsp;&nbsp;scm:svn:https://username:password@svn.apache.org/svn/root/module<BR>&nbsp;&nbsp;scm:svn:https://svn.apache.org/repos/asf/struts/core/trunk</P>
<P><BR>&nbsp;CVS:<BR>&nbsp;scm:cvs&lt;delimiter&gt;local&lt;delimiter&gt;path_to_repository&lt;delimiter&gt;module_name<BR>&nbsp;scm:cvs&lt;delimiter&gt;lserver&lt;delimiter&gt;[username@]servername[&lt;delimiter&gt;port]&lt;delimiter&gt;path_to_repository&lt;delimiter&gt;module_name&nbsp;scm:cvs&lt;delimiter&gt;pserver&lt;delimiter&gt;[username[&lt;delimiter&gt;password]@]servername[&lt;delimiter&gt;port]&lt;delimiter&gt;path_to_repository&lt;delimiter&gt;module_name<BR>&nbsp;scm:cvs&lt;delimiter&gt;ext&lt;delimiter&gt;[username@]servername&lt;delimiter&gt;path_to_repository&lt;delimiter&gt;module_name<BR>&nbsp;scm:cvs&lt;delimiter&gt;sspi&lt;delimiter&gt;[username@]host&lt;delimiter&gt;path&lt;delimiter&gt;module<BR>&nbsp;&nbsp;例如：<BR>&nbsp;&nbsp;scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-cactus<BR>&nbsp;&nbsp;scm:cvs:ext:tobrien@somehost:/home/cvs/repository:modulename<BR>&nbsp;&nbsp;scm:cvs:pserver:anoncvs:@cvs.apache.org:/cvs/root:module<BR>&nbsp;&nbsp;scm:cvs|pserver|username@localhost|C:/Program Files/cvsnt/repositories|module_name<BR>&nbsp;&nbsp;scm:cvs:ext:username@cvs.apache.org:/cvs/root:module<BR>&nbsp;&nbsp;scm:cvs:local:/cvs/root:module<BR>&nbsp;<BR>&nbsp;VSS:<BR>&nbsp;scm:vss|path_to_repository|/module_name<BR>&nbsp;&nbsp;例如：<BR>&nbsp;&nbsp;scm:vss|C:\Program Files\Microsoft Visual Studio\VSS|/SomeProject</P>
<P><BR>4.设置项目定时服务</P>
<P>&nbsp;选择[Administration]-&gt;[Schedules]-&gt;[add]<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;Name:BT1&nbsp;&nbsp;&nbsp;&nbsp;名称<BR>&nbsp;Description:每天凌晨4点&nbsp;&nbsp;&nbsp;描述<BR>&nbsp;Cron Expression:0 0 4 * * ?&nbsp;&nbsp;Build的时间规则<BR>&nbsp;Quiet Period (seconds):0&nbsp;&nbsp;<BR>&nbsp;Enabled:选择&nbsp;&nbsp;&nbsp;&nbsp;是否激活<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;Build的时间规则可以参考：<A href="http://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.html">http://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.html</A><BR>&nbsp;填写完毕后提交。</P>
<P>&nbsp;选择[Continuum]-&gt;[ShowProjects]，选择项目[Helloworld_EJB3]，选择[Build Definitions]，点击[Add]<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;Ant build filename:build.xml&nbsp;&nbsp;build的文件<BR>&nbsp;Targets:&nbsp;&nbsp;&nbsp;&nbsp;目标<BR>&nbsp;Arguments:&nbsp;&nbsp;&nbsp;&nbsp;参数<BR>&nbsp;Is it default?:&nbsp;&nbsp;&nbsp;&nbsp;是否默认<BR>&nbsp;Schedule:BT1&nbsp;&nbsp;&nbsp;&nbsp;选择规则<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;填写完毕后提交保存，这样每天凌晨4点，Continuum会自动构建项目。</P>
<P>&nbsp;</P>
<P>5.设置发送信息</P>
<P>&nbsp;continuum有个比较有特色的地方就是它提供了发送信息的功能。</P>
<P>&nbsp;设置MSN发送信息：<BR>&nbsp;打开文件[D:\continuum-1.0.3\apps\continuum\conf\application.xml]，找到下面这一部分<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;&lt;!--<BR>&nbsp;&nbsp;&nbsp;&nbsp; | The MSN notifier<BR>&nbsp;&nbsp;&nbsp;&nbsp; |--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;component&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.notification.notifier.Notifier&lt;/role&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role-hint&gt;msn&lt;/role-hint&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;implementation&gt;org.apache.maven.continuum.notification.msn.MsnContinuumNotifier&lt;/implementation&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;requirements&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.msn.MsnClient&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.apache.maven.continuum.configuration.ConfigurationService&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.apache.maven.continuum.store.ContinuumStore&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/requirements&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<BR>&nbsp;&nbsp;&lt;alwaysSend&gt;false&lt;/alwaysSend&gt;<BR>&nbsp;&nbsp;&lt;!-- from-address/&gt;<BR>&nbsp;&nbsp;&lt;from-password/ --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/component&gt;</P>
<P>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;修改为：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;&lt;!--<BR>&nbsp;&nbsp;&nbsp;&nbsp; | The MSN notifier<BR>&nbsp;&nbsp;&nbsp;&nbsp; |--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;component&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.notification.notifier.Notifier&lt;/role&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role-hint&gt;msn&lt;/role-hint&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;implementation&gt;org.apache.maven.continuum.notification.msn.MsnContinuumNotifier&lt;/implementation&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;requirements&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.msn.MsnClient&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.apache.maven.continuum.configuration.ConfigurationService&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.apache.maven.continuum.store.ContinuumStore&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/requirements&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<BR>&nbsp;&nbsp;&lt;alwaysSend&gt;true&lt;/alwaysSend&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;from-address&gt;continuum_moshco@hotmail.com&lt;/from-address&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;from-password&gt;moshco12&lt;/from-password&gt;<BR>&nbsp;&nbsp;&lt;!-- from-address/&gt;<BR>&nbsp;&nbsp;&lt;from-password/ --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/component&gt;<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;打开Web页面，选择[Continuum]-&gt;[Show Projects]，选择[Helloworld_EJB3]，选择[Notifiers]，点击[Add]，进入[Notifier Selection]页面，选择[MSN]，点击[Next]，进入[MSN Notification]页面，按照如下填写：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;MSN Login：<A href="mailto:continuum_moshco@hotmail.com">continuum_moshco@hotmail.com</A>&nbsp;&nbsp;&nbsp;&nbsp;发送端的MSN<BR>&nbsp;MSN Password：moshco12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSN密码<BR>&nbsp;MSN Recipient address：<A href="mailto:moshco_zhu@hotmail.com">moshco_zhu@hotmail.com</A>&nbsp;&nbsp;&nbsp;接受端的MSN<BR>&nbsp;Send on Success：选择&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;成功的是否发送<BR>&nbsp;Send on Failure：选择&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;失败的时候发送<BR>&nbsp;Send on Error：选择&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;错误的时候发送<BR>&nbsp;Send on Warning：选择&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;警告的时候发送<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;修改完配置文件，需要重新启动服务！还有就是，发送端MSN和接受端MSN必须互相加到成员列表中，或者发送端加到MSN群组中。</P>
<P>&nbsp;设置Email发送信息<BR>&nbsp;打开文件[D:\continuum-1.0.3\apps\continuum\conf\application.xml]，找到下面这一部分<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--<BR>&nbsp;&nbsp;&nbsp;&nbsp; | The mail notifier<BR>&nbsp;&nbsp;&nbsp;&nbsp; |--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;component&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.notification.notifier.Notifier&lt;/role&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role-hint&gt;mail&lt;/role-hint&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;implementation&gt;org.apache.maven.continuum.notification.mail.MailContinuumNotifier&lt;/implementation&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;requirements&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.velocity.VelocityComponent&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.apache.maven.continuum.store.ContinuumStore&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.mailsender.MailSender&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.apache.maven.continuum.configuration.ConfigurationService&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/requirements&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<BR>&nbsp;&nbsp;&lt;from-mailbox&gt;&lt;/from-mailbox&gt;<BR>&nbsp;&nbsp;&lt;from-name&gt;&lt;/from-name&gt;<BR>&nbsp;&nbsp;&lt;timestamp-format&gt;EEE, d MMM yyyy HH:mm:ss Z&lt;/timestamp-format&gt;<BR>&nbsp;&nbsp;&lt;includeBuildResult&gt;true&lt;/includeBuildResult&gt;<BR>&nbsp;&nbsp;&lt;alwaysSend&gt;false&lt;/alwaysSend&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/component&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;component&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.notification.RecipientSource&lt;/role&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;implementation&gt;org.apache.maven.continuum.notification.ContinuumRecipientSource&lt;/implementation&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<BR>&nbsp;&nbsp;&lt;!--<BR>&nbsp;&nbsp;Setting this propery will make Continuum send all emails to<BR>&nbsp;&nbsp;this address instead the address specified in the project<BR>&nbsp;&nbsp;configuration<BR>&nbsp;&nbsp;--&gt;<BR>&nbsp;&nbsp;&lt;to-override&gt;&lt;/to-override&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/component&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; &lt;component&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.mailsender.MailSender&lt;/role&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;implementation&gt;org.codehaus.plexus.mailsender.javamail.JavamailMailSender&lt;/implementation&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<BR>&nbsp;&nbsp;&lt;smtp-host&gt;localhost&lt;/smtp-host&gt;<BR>&nbsp;&nbsp;&lt;smtp-port&gt;25&lt;/smtp-port&gt;<BR>&nbsp;&nbsp;&lt;sslProvider&gt;com.sun.net.ssl.internal.ssl.Provider&lt;/sslProvider&gt;<BR>&nbsp;&nbsp;&lt;!--<BR>&nbsp;&nbsp;&lt;username&gt;mylogin&lt;/username&gt;<BR>&nbsp;&nbsp;&lt;password&gt;mypassword&lt;/password&gt;<BR>&nbsp;&nbsp;&lt;sslMode&gt;true&lt;/sslMode&gt;<BR>&nbsp;&nbsp;--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/component&gt;<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;将它修改为：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--<BR>&nbsp;&nbsp;&nbsp;&nbsp; | The mail notifier<BR>&nbsp;&nbsp;&nbsp;&nbsp; |--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;component&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.notification.notifier.Notifier&lt;/role&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role-hint&gt;mail&lt;/role-hint&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;implementation&gt;org.apache.maven.continuum.notification.mail.MailContinuumNotifier&lt;/implementation&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;requirements&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.velocity.VelocityComponent&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.apache.maven.continuum.store.ContinuumStore&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.mailsender.MailSender&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&lt;requirement&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;role&gt;org.apache.maven.continuum.configuration.ConfigurationService&lt;/role&gt;<BR>&nbsp;&nbsp;&lt;/requirement&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/requirements&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<BR>&nbsp;&nbsp;&lt;from-mailbox&gt;continuum_moshco@163.com&lt;/from-mailbox&gt;<BR>&nbsp;&nbsp;&lt;from-name&gt;continuum&lt;/from-name&gt;<BR>&nbsp;&nbsp;&lt;timestamp-format&gt;EEE, d MMM yyyy HH:mm:ss Z&lt;/timestamp-format&gt;<BR>&nbsp;&nbsp;&lt;includeBuildResult&gt;true&lt;/includeBuildResult&gt;<BR>&nbsp;&nbsp;&lt;alwaysSend&gt;true&lt;/alwaysSend&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/component&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;component&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.notification.RecipientSource&lt;/role&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;implementation&gt;org.apache.maven.continuum.notification.ContinuumRecipientSource&lt;/implementation&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<BR>&nbsp;&nbsp;&lt;!--<BR>&nbsp;&nbsp;Setting this propery will make Continuum send all emails to<BR>&nbsp;&nbsp;this address instead the address specified in the project<BR>&nbsp;&nbsp;configuration<BR>&nbsp;&nbsp;--&gt;<BR>&nbsp;&nbsp;&lt;to-override&gt;&lt;/to-override&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/component&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; &lt;component&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;org.codehaus.plexus.mailsender.MailSender&lt;/role&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;implementation&gt;org.codehaus.plexus.mailsender.javamail.JavamailMailSender&lt;/implementation&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<BR>&nbsp;&nbsp;&lt;smtp-host&gt;smtp.163.com&lt;/smtp-host&gt;<BR>&nbsp;&nbsp;&lt;smtp-port&gt;25&lt;/smtp-port&gt;<BR>&nbsp;&nbsp;&lt;sslProvider&gt;com.sun.net.ssl.internal.ssl.Provider&lt;/sslProvider&gt;<BR>&nbsp;&nbsp;&lt;username&gt;continuum_moshco@163.com&lt;/username&gt;<BR>&nbsp;&nbsp;&lt;password&gt;moshco12&lt;/password&gt;<BR>&nbsp;&nbsp;&lt;sslMode&gt;false&lt;/sslMode&gt;<BR>&nbsp;&nbsp;&lt;!--<BR>&nbsp;&nbsp;&lt;username&gt;mylogin&lt;/username&gt;<BR>&nbsp;&nbsp;&lt;password&gt;mypassword&lt;/password&gt;<BR>&nbsp;&nbsp;&lt;sslMode&gt;true&lt;/sslMode&gt;<BR>&nbsp;&nbsp;--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/component&gt;<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;打开Web页面，选择[Continuum]-&gt;[Show Projects]，选择[Helloworld_EJB3]，选择[Notifiers]，点击[Add]，进入[Notifier Selection]页面，选择[Mail]，点击[Next]，进入[Mail Notification]页面，按照如下填写：<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;Mail Recipient address：<A href="mailto:moshco@sina.com">moshco@sina.com</A>&nbsp;&nbsp;&nbsp;&nbsp;接受邮件的邮箱<BR>&nbsp;Send on Success：moshco12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;Send on Failure：<A href="mailto:moshco_zhu@hotmail.com">moshco_zhu@hotmail.com</A>&nbsp;&nbsp;&nbsp;<BR>&nbsp;Send on Error：选择&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;Send on Warning：选择&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋<BR>&nbsp;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<BR>&nbsp;修改完配置文件，需要重新启动服务！</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[我最讨厌与之打交道的人]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=28717</link>
<author>moshco</author>
<pubDate>2007/10/15 9:10:18</pubDate>
<description><![CDATA[毕业后几年，一直在为自己的理想奋斗，但是这个世界真不是那么好，它在压抑我，让我时常感觉到自己的才能无从施展。<BR>毕业时间不长，但工作就换了不少，我常常想，既然人力资源这项工作是帮助我们更好的规划自己的事业人生，但是为什么我常常感觉到的是，她们除了用最少的工资请人，用最野蛮无耻的方法克扣，用最无理的方式炒人外，好像还真没有最其它的什么工作！<BR>所以我真想高呼：“让做人事的所有人滚出我的世界！”]]></description>
</item><item>
<title><![CDATA[Turbine 学习笔记]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=moshco&amp;id=28651</link>
<author>moshco</author>
<pubDate>2007/10/12 10:49:54</pubDate>
<description><![CDATA[<P><BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</P>
<P>初次体验Maven</P>
<P>1.首先要说明一点Maven1和Maven2有很大的不同，我这里说的Maven是指Maven1；</P>
<P>2.到这里[http://maven.apache.org/maven-1.x/start/download.html]去下载Maven1;我使用的是[Maven1.0.2];</P>
<P>3.安装很简单，只需要将下载的zip包解压缩到[d:\]就可以了；</P>
<P>4.配置系统环境变量。打开[我的电脑]-&gt;[属性]-&gt;[高级]-&gt;[环境变量]-&gt;[系统变量]-&gt;[新建]<BR>********************************************************************************************************************<BR>变量名：MAVEN_HOME<BR>变量值：d:\maven-1.0.2<BR>********************************************************************************************************************<BR>在Path变量中新加入一段：<BR>********************************************************************************************************************<BR>%MAVEN_HOME%\bin;<BR>********************************************************************************************************************</P>
<P>5.在使用Maven构建项目的时候，Maven首先会在本地电脑的[C:\Documents and Settings\moshco zhu\.maven\repository][这个目<BR>录是使用Maven的使用自动创建的]目录下查找项目根目录下的文件[project.xml]中定义的需求Jar包，比如项目文件[project.xml]<BR>中有这样一段：<BR>********************************************************************************************************************<BR>&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;turbine&lt;/groupId&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;turbine&lt;/artifactId&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;2.3.2&lt;/version&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type&gt;jar&lt;/type&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;properties&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;war.bundle&gt;true&lt;/war.bundle&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/properties&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<BR>********************************************************************************************************************<BR>表示项目需要下载turbine版本是:2.3.2的Jar包。而经常因为版权的问题无法下载，会报告出现如下类似的错误：<BR>********************************************************************************************************************<BR>Plugin cache will be regenerated<BR>???????? D:\maven-1.0\local\repository ???????????????? ??????????????¨????????????<BR>???????????????? commons-lang-2.1.jar????????<BR>Error retrieving artifact from [http://www.ibiblio.org/maven/commons-lang/jars/commons-lang-2.1.jar]: java.io.IOExceptio<BR>n: Unknown error downloading; status code was: 301<BR>???????????? commons-lang-2.1.jar ??????????§°??????<BR>???????????????? commons-net-1.4.0.jar????????<BR>Error retrieving artifact from [http://www.ibiblio.org/maven/commons-net/jars/commons-net-1.4.0.jar]: java.io.IOExceptio<BR>n: Unknown error downloading; status code was: 301<BR>???????????? commons-net-1.4.0.jar ??????????§°??????<BR>??????????????????????????????±??????????????¨????????????????????</P>
<P>commons-lang-2.1.jar<BR>commons-net-1.4.0.jar</P>
<P>Total time: 18 seconds<BR>Finished at: Thu Oct 11 17:05:54 CST 2007<BR>********************************************************************************************************************<BR>解决这个问题有两中方案：<BR>第一：<BR>直接通过浏览器下载文件[http://www.ibiblio.org/maven/commons-lang/jars/commons-lang-2.1.jar]，并将下载的文件存<BR>放在[C:\Documents and Settings\moshco zhu\.maven\repository\commons-lang/jars/commons-lang-2.1.jar]，注意对应关系是从<BR>url的[commons-lang/jars/commons-lang-2.1.jar]部分开始的。你也可以在其它地方下载该jar包，然后改名存放到这个位置。这一<BR>方案在需要下载的文件不多时还能凑合，如果需要下载大量Jar包就不是个好办法了；<BR>第二：<BR>解压缩文件[D:\maven-1.0\lib\maven.jar]，修改其下的文件[defaults.properties]，找到一行：<BR>********************************************************************************************************************<BR>maven.repo.remote = <A href="http://www.ibiblio.org/maven">http://www.ibiblio.org/maven</A><BR>********************************************************************************************************************<BR>将它修改为：<BR>********************************************************************************************************************<BR>maven.repo.remote = <A href="http://apache.linuxforum.net/dist/java-repository">http://apache.linuxforum.net/dist/java-repository</A>,<BR><A href="http://dist.codehaus.org">http://dist.codehaus.org</A>, <A href="http://mirrors.sunsite.dk/maven/">http://mirrors.sunsite.dk/maven/</A>,<BR><A href="http://public.planetmirror.com/pub/maven">http://public.planetmirror.com/pub/maven</A>,<BR><A href="http://www.ibiblio.org/maven">http://www.ibiblio.org/maven</A><BR>********************************************************************************************************************<BR>注意上面内容"="后的部分是在同一行。<BR>将解压缩的文件再压缩到jar包中，这样问题就解决了！</P>
<P>为了解决重装系统后长期积累下载的Jar包库丢失的问题，可以修改本地Jar包库的位置：<BR>找到一行<BR>********************************************************************************************************************<BR>maven.home.local = ${user.home}/.maven<BR>********************************************************************************************************************<BR>将它修改为<BR>********************************************************************************************************************<BR>maven.home.local = ${maven.home}/local<BR>********************************************************************************************************************</P>
<P>Maven的提示语言在中文环境中可能出现乱码(就是?????)，进入maven.jar，发现org\apache\maven\messages目录下的<BR>messages_zh_CN.properties里面直接写了中文字符。删掉它！就不会乱码了。<BR>或者用native2ascii转换[native2ascii messages_zh_CN.properties new.properties]</P>
<P><BR>6.体验正式开始：</P>
<P>创建一个空目录[epd3]，在DOS下输入命令：<BR>********************************************************************************************************************<BR>maven genapp<BR>********************************************************************************************************************</P>
<P>接下来照如下输入<BR>********************************************************************************************************************<BR>Enter a project template to use: [default]<BR>web<BR>Please specify an id for your application:&nbsp; [app]<BR>websample<BR>Please specify a name for your application:&nbsp; [Example Application]</P>
<P>Please specify the package for your application:&nbsp; [example.web]<BR>com.mh<BR>********************************************************************************************************************</P>
<P>添加Eclipse支持，执行命令<BR>********************************************************************************************************************<BR>maven eclipse<BR>********************************************************************************************************************<BR>这样就可以直接使用Eclipse导入该项目[文件-&gt;导入-&gt;现有项目到工作控件中]，导入以后Eclipse会报错，主要原因是Eclipse中没<BR>有定义类路径变量[MAVEN_REPO]，在Eclipse的[窗口－首选项－Java－构建路径－类路径变量－新建]<BR>[MAVEN_REPO]指向[D:/maven-1.0/local/repository]，这样问题解决！</P>
<P>7.一些指令<BR>如果想要查看配置文件中所有的goals，输入:<BR>********************************************************************************************************************<BR>maven -g<BR>********************************************************************************************************************</P>
<P>想看所有可用的Maven选项,输入:<BR>********************************************************************************************************************<BR>maven -h<BR>********************************************************************************************************************</P>
<P>想使用UI控制台：<BR>********************************************************************************************************************<BR>maven wizard:ui<BR>********************************************************************************************************************<BR>[Ctrl+Z],回车，结束UI控制台运行。</P>
<P>使用[maven]创建的项目，运行下面的命令<BR>********************************************************************************************************************<BR>maven site:generate<BR>********************************************************************************************************************<BR>Maven会依据配置好的POM文件(project.xml)为您项目生成相应的站点。<BR>如果是第一次运行,还可以看到Maven会到中央构建资源库或网上下载必须的.jars包。运行这个goal，Maven会为您编译源代码，拷贝<BR>conf目录里的资源文件到类文件classes的目录，生成Javadoc文档以及项目分析报告。可以看到,一个目标含有很多的功能!进入<BR>target目录，您可以看到site:generate goal生成的文件。target目录下的docs目录存放着Maven为您的项目产生的报告文档。</P>
<P>将所有的goals放在一个文本文件中<BR>********************************************************************************************************************<BR>maven -g &gt; goals.txt<BR>********************************************************************************************************************</P>
<P><BR>在Maven中运行Ant任务<BR>要整合Ant任务到Maven中，您需要创建名为maven.xml的文件并存放到project.xml文件的目录。在maven.xml文件中写入:<BR>**************************************&nbsp; 开始&nbsp; **********************************************************************<BR>&lt;project default="myGoal"&gt;<BR>&nbsp; &lt;goal name="myGoal"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;echo&gt;Hello Maven!&lt;/echo&gt;<BR>&nbsp; &lt;/goal&gt;<BR>&lt;/project&gt;<BR>**************************************&nbsp; 结束&nbsp; **********************************************************************<BR>保存maven.xml文件，在project.xml和maven.xml所在的目录中运行<BR>**************************************&nbsp; 开始&nbsp; **********************************************************************<BR>maven<BR>**************************************&nbsp; 结束&nbsp; **********************************************************************<BR>您可以看到以下输出:<BR>**************************************&nbsp; 开始&nbsp; **********************************************************************<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myGoal: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [echo] Hello Maven!<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BUILD SUCCESSFUL<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Total time:&nbsp; 1 seconds<BR>**************************************&nbsp; 结束&nbsp; **********************************************************************</P>
<P><BR>如果您想定义在ibiblio.org的Maven构建资源库中没有的公司自己的项目相关性，您可以照下面定义<BR>**************************************&nbsp; 开始&nbsp; **********************************************************************<BR>&lt;dependency&gt;<BR>&nbsp;&lt;id&gt;SomeJar&lt;/id&gt;<BR>&nbsp;&lt;jar&gt;someJar1.2.jar&lt;/jar&gt;<BR>&lt;/dependency&gt;<BR>**************************************&nbsp; 结束&nbsp; **********************************************************************<BR>然后，您需要将somJar1.2.jar文件放到您自己的中央构建资源库目录中。该目录由project.properties文件中的maven.repo.local<BR>属性指定。默认为${maven.home.local}/repository或${user.home}/.maven/repository，其路径对应关系是资源库下的<BR>[SomeJar/jars/someJar1.2.jar]。</P>
<P><BR>在project.xml文件中添加下列&lt;reports&gt;元素还可以自定义生成的报告文档<BR>**************************************&nbsp; 开始&nbsp; **********************************************************************<BR>&lt;reports&gt;<BR>&nbsp; &lt;report&gt;maven-checkstyle-plugin&lt;/report&gt;<BR>&nbsp; &lt;report&gt;maven-changelog-plugin&lt;/report&gt;<BR>&nbsp; &lt;report&gt;maven-developer-activity-plugin&lt;/report&gt;<BR>&nbsp; &lt;report&gt;maven-file-activity-plugin&lt;/report&gt;<BR>&nbsp; &lt;report&gt;maven-javadoc-plugin&lt;/report&gt;<BR>&nbsp; &lt;report&gt;maven-jdepend-plugin&lt;/report&gt;<BR>&nbsp; &lt;report&gt;maven-junit-report-plugin&lt;/report&gt;<BR>&nbsp; &lt;report&gt;maven-jxr-plugin&lt;/report&gt;<BR>&nbsp; &lt;report&gt;maven-statcvs-plugin&lt;/report&gt;<BR>&nbsp; &lt;report&gt;maven-simian-plugin&lt;/report&gt;<BR>&lt;/reports&gt;<BR>**************************************&nbsp; 结束&nbsp; **********************************************************************<BR>除了最后两个，其他都是默认配置的。maven-statcvs-plugin产生CVS统计报告，maven-simian-plugin可以识辨程序里重复的代码。<BR>一旦你自己定义了一个&lt;reports&gt;元素，将会覆盖掉所有默认文档配置。</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P><BR>**************************************&nbsp; 开始&nbsp; **********************************************************************</P>
<P>**************************************&nbsp; 结束&nbsp; **********************************************************************</P>
<P><BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</P>
<P>使用Maven创建一个Turbine的应用</P>
<P>1.新建一个目录epd2,在目录下面创建文件build.properties;内容如下：<BR>********************************************************************************************************************<BR>maven.appserver.home=maven.appserver.home=D:/apache-tomcat-6.0.14&nbsp;#这里是你的Tomcat的安装路径，这段注释文<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#字不要在文件中出现，发布的时候会出错！<BR>********************************************************************************************************************</P>
<P>2.Dos状态下进入目录epd2，运行如下命令：<BR>********************************************************************************************************************<BR>maven -Dturbine.app.name=helloworld turbine:setup<BR>********************************************************************************************************************</P>
<P>3.这样会在epd2下创建一个项目目录helloworld，Dos状态下进入目录helloworld，运行命令<BR>********************************************************************************************************************<BR>maven turbine:deploy<BR>********************************************************************************************************************<BR>备注：打包命令是：maven turbine:war</P>
<P><BR>4.在Tomcat的目录下的webapps目录下会多了一个应用helloworld，就是刚才我们的发布。</P>
<P>5.启动Tomcat，在浏览器中输入:http://localhost:8080/helloworld。</P>
<P><BR>Turbine小小的体验</P>
<P>1.创建文件[helloworld/src/templates/navigations/header.vm]，内容如下：<BR>********************************************************************************************************************<BR>&lt;center&gt;<BR>&lt;b&gt;Header&lt;/b&gt;<BR>&lt;/center&gt;<BR>********************************************************************************************************************</P>
<P>2.再创建一个文件[helloworld/src/templates/navigations/footer.vm]，内容如下：<BR>********************************************************************************************************************<BR>&amp;copy; 2005 Leon<BR>********************************************************************************************************************</P>
<P>3.打开文件[helloworld\src\templates\layouts\Default.vm]，修改内容如下：<BR>********************************************************************************************************************<BR>&lt;html&gt;<BR>#TurbineHtmlHead()<BR>&lt;body #TurbineHtmlBodyAttributes() &gt;<BR>&lt;table&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $navigation.setTemplate( "header.vm" )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $screen_placeholder<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $navigation.setTemplate( "footer.vm" )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&lt;/table&gt;</P>
<P>&lt;/body&gt;<BR>&lt;/html&gt;<BR>********************************************************************************************************************</P>
<P>4.创建一个新的文件[helloworld\src\templates\screens\content1.vm]，内容如下：<BR>********************************************************************************************************************<BR>&lt;h1&gt;Welcome to my content1&lt;/h1&gt;<BR>This is content</P>
<P>&lt;p&gt;&lt;/p&gt;<BR>&lt;a href="$link.setPage( 'Index.vm' )"&gt;Index&lt;/a&gt;<BR>********************************************************************************************************************</P>
<P>5.打开文件[helloworld\src\templates\screens\Index.vm]，在最下端增加一行，内容如下：<BR>********************************************************************************************************************<BR>&lt;p&gt;&lt;/p&gt;<BR>&lt;a href="$link.setPage( 'content1.vm' )"&gt;Content 1&lt;/a&gt;<BR>********************************************************************************************************************</P>
<P>6.从新发布，看一下效果：<BR>********************************************************************************************************************<BR>maven turbine:deploy<BR>********************************************************************************************************************</P>
<P><BR>在Screen中使用自己的变量</P>
<P>1.新建一个Java源代码文件[helloworld\src\java\org\apache\turbine\app\helloworld\modules\screens\content2.java]，内容<BR>如下：<BR>********************************************************************************************************************<BR>package org.apache.turbine.app.helloworld.modules.screens;</P>
<P>import org.apache.velocity.context.Context;<BR>import org.apache.turbine.modules.screens.VelocityScreen;<BR>import org.apache.turbine.util.RunData;</P>
<P>public class content2 extends VelocityScreen {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void doBuildTemplate( RunData data, Context context ) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.put( "content_field", "some text" );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch( Exception e ) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>}</P>
<P>********************************************************************************************************************<BR>注意：Java类的包名一定要与路径名称对应</P>
<P>2.创建一个文件[helloworld\src\templates\screens\content2.vm]，内容如下：<BR>********************************************************************************************************************<BR>&lt;h1&gt;A field&lt;/h1&gt;<BR>The contents of content_field is [$content_field] &lt;br&gt;</P>
<P>&lt;p&gt;&lt;/p&gt;<BR>&lt;a href="$link.setPage( 'Index.vm' )"&gt;Index&lt;/a&gt;<BR>********************************************************************************************************************</P>
<P>3.打开文件[helloworld\src\templates\screens\Index.vm]，再增加一行：<BR>********************************************************************************************************************<BR>&lt;a href="$link.setPage( 'content2.vm' )"&gt;Content 2&lt;/a&gt;<BR>********************************************************************************************************************</P>
<P>4.发布，看效果。</P>
<P><BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</P>]]></description>
</item>
</channel>
</rss>