﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-snowolf</title><link>http://www.blogjava.net/snowolf/</link><description>        这样的一种生活</description><language>zh-cn</language><lastBuildDate>Tue, 21 Apr 2026 06:33:58 GMT</lastBuildDate><pubDate>Tue, 21 Apr 2026 06:33:58 GMT</pubDate><ttl>60</ttl><item><title>prototype.js 1.4 原代码阅读</title><link>http://www.blogjava.net/snowolf/archive/2007/05/11/116903.html</link><dc:creator>snowolf</dc:creator><author>snowolf</author><pubDate>Fri, 11 May 2007 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/snowolf/archive/2007/05/11/116903.html</guid><wfw:comment>http://www.blogjava.net/snowolf/comments/116903.html</wfw:comment><comments>http://www.blogjava.net/snowolf/archive/2007/05/11/116903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/snowolf/comments/commentRss/116903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/snowolf/services/trackbacks/116903.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: /** &nbsp;* 定义一个全局对象, 属性 Version 在发布的时候会替换为当前版本号 &nbsp;*/ var Prototype = {&nbsp; Version: '1.5.0_rc0',&nbsp; ScriptFragment: '(?:&lt;script.*?&gt;)((\n|\r|.)*?)(?:&lt;\/script&gt;)',&nbsp; emptyFun...&nbsp;&nbsp;<a href='http://www.blogjava.net/snowolf/archive/2007/05/11/116903.html'>阅读全文</a><img src ="http://www.blogjava.net/snowolf/aggbug/116903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/snowolf/" target="_blank">snowolf</a> 2007-05-11 23:05 <a href="http://www.blogjava.net/snowolf/archive/2007/05/11/116903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js常用函数及其用法</title><link>http://www.blogjava.net/snowolf/archive/2007/05/11/116896.html</link><dc:creator>snowolf</dc:creator><author>snowolf</author><pubDate>Fri, 11 May 2007 14:53:00 GMT</pubDate><guid>http://www.blogjava.net/snowolf/archive/2007/05/11/116896.html</guid><wfw:comment>http://www.blogjava.net/snowolf/comments/116896.html</wfw:comment><comments>http://www.blogjava.net/snowolf/archive/2007/05/11/116896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/snowolf/comments/commentRss/116896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/snowolf/services/trackbacks/116896.html</trackback:ping><description><![CDATA[&nbsp;prototype.js常用函数:
<table height=1194 cellSpacing=0 cellPadding=0 width=943 border=1>
    <tbody>
        <tr>
            <td width=208>函数名</td>
            <td width=385>&nbsp;解释</td>
            <td width=340>&nbsp;举例</td>
        </tr>
        <tr>
            <td>&nbsp;Element.toggle</td>
            <td>&nbsp;交替隐藏或显示</td>
            <td>&nbsp;Element.toggle(''div1'',''div2'')</td>
        </tr>
        <tr>
            <td>&nbsp;Element.hide</td>
            <td>&nbsp;隐藏</td>
            <td>&nbsp;Element.hide(''div1'',''div2'')</td>
        </tr>
        <tr>
            <td>&nbsp;Element.show</td>
            <td>显示</td>
            <td>&nbsp;Element.show(''div1'',''div2'')</td>
        </tr>
        <tr>
            <td>&nbsp;Element.remove</td>
            <td>&nbsp;删除</td>
            <td>&nbsp;Element.remove(''div1'',''div2'')</td>
        </tr>
        <tr>
            <td>&nbsp;Element.getHeight</td>
            <td>&nbsp;取得高度</td>
            <td>&nbsp;Element.getHeight(''div1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Toggle.display</td>
            <td>&nbsp;和Element.toggle相同</td>
            <td>&nbsp;Toggle.display(''div1'',''div2'')</td>
        </tr>
        <tr>
            <td>&nbsp;Insertion.Before</td>
            <td>&nbsp;在DIV前插入文字</td>
            <td>&nbsp;Insertion.Before(''div1'',''my content'')</td>
        </tr>
        <tr>
            <td>&nbsp;Insertion.After</td>
            <td>&nbsp;在DIV后插入文字</td>
            <td>&nbsp;Insertion.After(''div1'',''my content'')</td>
        </tr>
        <tr>
            <td>&nbsp;Insertion.Top</td>
            <td>&nbsp;在DIV里最前插入文字</td>
            <td>&nbsp;Insertion.Top(''div1'',''this is a text'')</td>
        </tr>
        <tr>
            <td>&nbsp;Insertion.Bottom</td>
            <td>&nbsp;在DIV里最后插入文字</td>
            <td>&nbsp;Insertion.Bottom(''div1'',''this is a text'')</td>
        </tr>
        <tr>
            <td>&nbsp;PeriodicalExecuter</td>
            <td>&nbsp;以给定频率调用一段JavaScript</td>
            <td>&nbsp;PeridicalExecutor(test, 1)"这里test是Javascript的函数,1是频率(1秒).</td>
        </tr>
        <tr>
            <td>&nbsp;$</td>
            <td>&nbsp;取得一个DIV, 相当于getElementById()</td>
            <td>&nbsp;$(''div1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Field.clear</td>
            <td>&nbsp;清空一个输入框</td>
            <td>&nbsp;Field.clear(''textfield1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Field.focus</td>
            <td>把&nbsp;焦点集中在输入框上</td>
            <td>&nbsp;Field.focus(''select1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Field.present</td>
            <td>&nbsp;判断内容是否为空</td>
            <td>&nbsp;alert(Field.present(''textfield1''))"</td>
        </tr>
        <tr>
            <td>&nbsp;Field.select</td>
            <td>&nbsp;选择输入框的内容</td>
            <td>&nbsp;Field.select(''textfield1'')"</td>
        </tr>
        <tr>
            <td>&nbsp;Field.activate</td>
            <td>&nbsp;把&nbsp;焦点集中在输入框上并选择输入框的内容</td>
            <td>&nbsp;Field.activate(''textfield1'')"</td>
        </tr>
        <tr>
            <td>&nbsp;Form.serialize</td>
            <td>&nbsp;把表格内容转化成string</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;Form.getElements</td>
            <td>&nbsp;取得表格内容为数组形式</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;Form.disable</td>
            <td>&nbsp;disable表格所有内容</td>
            <td>&nbsp;Form.disable(''form1'') (这个好象不work)</td>
        </tr>
        <tr>
            <td>&nbsp;Form.focusFirstElement</td>
            <td>&nbsp;把焦点集中在表格第一个元素上</td>
            <td>&nbsp;Form.focusFirstElement(''form1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Form.reset</td>
            <td>&nbsp;Reset表格</td>
            <td>Form.reset(''form1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Form.Element.getValue</td>
            <td>&nbsp;取得表格输入框的值</td>
            <td>&nbsp;Form.Element.getValue(''text1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Form.Element.serialize</td>
            <td>&nbsp;&nbsp;把表格中输入框内容转化成string</td>
            <td>&nbsp;Form.Element.serialize(''text1'')</td>
        </tr>
        <tr>
            <td>&nbsp;$F</td>
            <td>&nbsp;等同于Form.Element.getValue()</td>
            <td>&nbsp;$F(''text1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Effect.Highlight</td>
            <td>&nbsp;高亮特效.</td>
            <td>&nbsp;Effect.Highlight(''text1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Effect.Fade</td>
            <td>&nbsp;褪色特效</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;Effect.Scale</td>
            <td>&nbsp;放大缩小(百分比）</td>
            <td>
            <p>Effect.Scale(''text1'', 200)<br>这里200 = 200%, 即两倍</p>
            </td>
        </tr>
        <tr>
            <td>&nbsp;Effect.Squish</td>
            <td>&nbsp;消失特效．文字缩小后消失</td>
            <td>&nbsp;Effect.Squish(''text1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Effect.Puff</td>
            <td>&nbsp;消失特效．文字放大后消失</td>
            <td>&nbsp;Effect.Puff(''text1'')</td>
        </tr>
        <tr>
            <td>&nbsp;Effect.Appear</td>
            <td>&nbsp;出现特效</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;Effect.ContentZoom</td>
            <td>&nbsp;ZOOM特效．</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;Ajax.Request</td>
            <td>&nbsp;传送Ajax请求给服务器</td>
            <td>&nbsp;Ajax.Request(''http://server/s.php'')</td>
        </tr>
        <tr>
            <td>&nbsp;Ajax.Updater</td>
            <td>&nbsp;传送Ajax请求给服务器并用答复的结果更新指定的Container</td>
            <td>&nbsp;Ajax.Updater(''text1'',''http://server/s.php'')</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本用法:prototype.js给每个主要的类都分了一个Class,使用起来很方便.要产生特定的效果,只要用new Class.function(&lt;argument&gt;)就可以了.例如:</p>
<pre>&lt;DIV id="div1"&gt;&lt;a href="#" onclick="new Element.toggle('div2')"&gt;Click Me&lt;/a&gt;&lt;/DIV&gt;<br>
&lt;DIV id="div2"&gt;Hello!&lt;/DIV&gt;</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当点击Click Me的时候,div2就会交替隐藏或显示.注意,你可以给toggle加上无限个parameter,比如Element.toggle(''div2'',''div3'',''div4'',...)</p>
<img src ="http://www.blogjava.net/snowolf/aggbug/116896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/snowolf/" target="_blank">snowolf</a> 2007-05-11 22:53 <a href="http://www.blogjava.net/snowolf/archive/2007/05/11/116896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js　1.4版开发者手册</title><link>http://www.blogjava.net/snowolf/archive/2007/05/11/116893.html</link><dc:creator>snowolf</dc:creator><author>snowolf</author><pubDate>Fri, 11 May 2007 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/snowolf/archive/2007/05/11/116893.html</guid><wfw:comment>http://www.blogjava.net/snowolf/comments/116893.html</wfw:comment><comments>http://www.blogjava.net/snowolf/archive/2007/05/11/116893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/snowolf/comments/commentRss/116893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/snowolf/services/trackbacks/116893.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 开发者手册 对应版本1.4.0 original article by sp('Sergio Pereira') Sergio Pereiralast update: March 30th 2006中文版：THIN最后更新：2006-3-31&nbsp;看到一个很好的东西在国内没有被很多人使用起来，实在是不爽，所以花了很大功夫把这个手册翻译成中文，由于这篇文...&nbsp;&nbsp;<a href='http://www.blogjava.net/snowolf/archive/2007/05/11/116893.html'>阅读全文</a><img src ="http://www.blogjava.net/snowolf/aggbug/116893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/snowolf/" target="_blank">snowolf</a> 2007-05-11 22:47 <a href="http://www.blogjava.net/snowolf/archive/2007/05/11/116893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型数据库设计原则</title><link>http://www.blogjava.net/snowolf/archive/2007/03/27/106656.html</link><dc:creator>snowolf</dc:creator><author>snowolf</author><pubDate>Tue, 27 Mar 2007 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/snowolf/archive/2007/03/27/106656.html</guid><wfw:comment>http://www.blogjava.net/snowolf/comments/106656.html</wfw:comment><comments>http://www.blogjava.net/snowolf/archive/2007/03/27/106656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/snowolf/comments/commentRss/106656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/snowolf/services/trackbacks/106656.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/snowolf/archive/2007/03/27/106656.html'>阅读全文</a><img src ="http://www.blogjava.net/snowolf/aggbug/106656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/snowolf/" target="_blank">snowolf</a> 2007-03-27 13:44 <a href="http://www.blogjava.net/snowolf/archive/2007/03/27/106656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统设计说明书(架构、概要、详细)目录结构</title><link>http://www.blogjava.net/snowolf/archive/2007/03/27/106602.html</link><dc:creator>snowolf</dc:creator><author>snowolf</author><pubDate>Tue, 27 Mar 2007 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/snowolf/archive/2007/03/27/106602.html</guid><wfw:comment>http://www.blogjava.net/snowolf/comments/106602.html</wfw:comment><comments>http://www.blogjava.net/snowolf/archive/2007/03/27/106602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/snowolf/comments/commentRss/106602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/snowolf/services/trackbacks/106602.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: center" align="center">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%">XXX</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构设计说明书</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: center" align="center">
				<i style="mso-bidi-font-style: normal">
						<span lang="EN-US">(</span>
				</i>
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构设计重点在于将系统分层并产生层次内的模块、阐明模块之间的关系</span>
						<span lang="EN-US">)</span>
				</i>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: 150%; mso-outline-level: 1; mso-list: l0 level1 lfo1; tab-stops: list 21.25pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; mso-bidi-font-family: 宋体">
								<span style="mso-list: Ignore">一.<span style="FONT: 7pt 'Times New Roman'">  </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">概述</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">描述本文的参考依据、资料以及大概内容。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: 150%; mso-outline-level: 1; mso-list: l0 level1 lfo1; tab-stops: list 21.25pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; mso-bidi-font-family: 宋体">
								<span style="mso-list: Ignore">二.<span style="FONT: 7pt 'Times New Roman'">  </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目的</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">描述本文编写的目的。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: 150%; mso-outline-level: 1; mso-list: l0 level1 lfo1; tab-stops: list 21.25pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; mso-bidi-font-family: 宋体">
								<span style="mso-list: Ignore">三.<span style="FONT: 7pt 'Times New Roman'">  </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构设计</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">阐明进行架构设计的总体原则，如对问题域的分析方法。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: 150%; mso-outline-level: 2; mso-list: l0 level2 lfo1; tab-stops: list 1.0cm">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.1.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构分析</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对场景以及问题域进行分析，构成系统的架构级设计，阐明对于系统的分层思想。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: 150%; mso-outline-level: 2; mso-list: l0 level2 lfo1; tab-stops: list 1.0cm">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.2.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计思想</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">阐明进行架构设计的思想，可参考一些架构设计的模式，需结合当前系统的实际情况而定。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: 150%; mso-outline-level: 2; mso-list: l0 level2 lfo1; tab-stops: list 1.0cm">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.3.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构体系</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据架构分析和设计思想产生系统的架构图，并对架构图进行描述，说明分层的原因、层次的职责，并根据架构图绘制系统的物理部署图，描述系统的部署体系。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: 150%; mso-outline-level: 2; mso-list: l0 level2 lfo1; tab-stops: list 1.0cm">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.4.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模块划分</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据架构图进行模块的划分并阐明模块划分的理由，绘制模块物理图以及模块依赖图。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 35.45pt; TEXT-INDENT: -35.45pt; LINE-HEIGHT: 150%; mso-outline-level: 3; mso-list: l0 level3 lfo1; tab-stops: list 35.45pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.4.1.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模块描述</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据模块物理图描述各模块的职责，并声明其对其他模块的接口要求。。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 35.45pt; TEXT-INDENT: -35.45pt; LINE-HEIGHT: 150%; mso-outline-level: 3; mso-list: l0 level3 lfo1; tab-stops: list 35.45pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.4.2.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模块接口设计</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对模块接口进行设计，并提供一定的伪代码。</span>
				</i>
				<br />
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: center" align="center">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%">XXX</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">概要设计说明书</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: center" align="center">
				<i style="mso-bidi-font-style: normal">
						<span lang="EN-US">(</span>
				</i>
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">概要设计重点在于将模块分解为对象并阐明对象之间的关系</span>
						<span lang="EN-US">) 
<p> </p></span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: 150%; mso-outline-level: 1; mso-list: l0 level1 lfo1; tab-stops: list 21.25pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; mso-bidi-font-family: 宋体">
								<span style="mso-list: Ignore">一.<span style="FONT: 7pt 'Times New Roman'">  </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">概述</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">描述本文的参考依据、资料以及大概内容。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: 150%; mso-outline-level: 1; mso-list: l0 level1 lfo1; tab-stops: list 21.25pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; mso-bidi-font-family: 宋体">
								<span style="mso-list: Ignore">二.<span style="FONT: 7pt 'Times New Roman'">  </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目的</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">描述本文的编写目的。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: 150%; mso-outline-level: 1; mso-list: l0 level1 lfo1; tab-stops: list 21.25pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; mso-bidi-font-family: 宋体">
								<span style="mso-list: Ignore">三.<span style="FONT: 7pt 'Times New Roman'">  </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模块概要设计</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引用架构设计说明书中的模块图，并阐述对于模块进行设计的大致思路。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: 150%; mso-outline-level: 2; mso-list: l0 level2 lfo1; tab-stops: list 1.0cm">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.1.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计思想</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">阐明概要设计的思想，概要设计的思想通常是涉及设计模式的。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: 150%; mso-outline-level: 2; mso-list: l0 level2 lfo1; tab-stops: list 1.0cm">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.2.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模块</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">A 
<p> </p></span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 35.45pt; TEXT-INDENT: -35.45pt; LINE-HEIGHT: 150%; mso-outline-level: 3; mso-list: l0 level3 lfo1; tab-stops: list 35.45pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.2.1.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">概要设计</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 35.45pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据该模块的职责对模块进行概要设计</span>
						<span lang="EN-US">(</span>
				</i>
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分解模块为对象、描述对象的职责以及声明对象之间的接口</span>
						<span lang="EN-US">)</span>
				</i>
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，绘制模块的对象图、对象间的依赖图以及模块主要功能的序列图，分别加以描述并相应的描述模块异常的处理方法。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 35.45pt; TEXT-INDENT: -35.45pt; LINE-HEIGHT: 150%; mso-outline-level: 3; mso-list: l0 level3 lfo1; tab-stops: list 35.45pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.2.2.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模块接口实现</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 35.45pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">阐明对于架构设计中定义的模块接口的实现的设计。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: center" align="center">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%">XXX</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">详细设计说明书</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: center" align="center">
				<i style="mso-bidi-font-style: normal">
						<span lang="EN-US">(</span>
				</i>
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">详细设计重点在于对模块进行实现，将模块的对象分解为属性和方法，并阐述如何实现</span>
						<span lang="EN-US">)</span>
				</i>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US">
						<p> </p>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: 150%; mso-outline-level: 1; mso-list: l0 level1 lfo1; tab-stops: list 21.25pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; mso-bidi-font-family: 宋体">
								<span style="mso-list: Ignore">一.<span style="FONT: 7pt 'Times New Roman'">  </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">概述</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">阐述本文的参考依据、资料以及大概内容。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: 150%; mso-outline-level: 1; mso-list: l0 level1 lfo1; tab-stops: list 21.25pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; mso-bidi-font-family: 宋体">
								<span style="mso-list: Ignore">二.<span style="FONT: 7pt 'Times New Roman'">  </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目的</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">阐述本文的编写目的。</span>
						<span lang="EN-US">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: 150%; mso-outline-level: 1; mso-list: l0 level1 lfo1; tab-stops: list 21.25pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; mso-bidi-font-family: 宋体">
								<span style="mso-list: Ignore">三.<span style="FONT: 7pt 'Times New Roman'">  </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模块详细设计</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: 150%; mso-outline-level: 2; mso-list: l0 level2 lfo1; tab-stops: list 1.0cm">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.1.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计思想</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">
								<p> </p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 150%">
				<i style="mso-bidi-font-style: normal">
						<span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">阐述对模块进行详细设计的思想。</span>
				</i>
				<i style="mso-bidi-font-style: normal">
						<span lang="EN-US" style="LINE-HEIGHT: 150%; mso-bidi-font-size: 10.5pt">
								<p> </p>
						</span>
				</i>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: 150%; mso-outline-level: 2; mso-list: l0 level2 lfo1; tab-stops: list 1.0cm">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3.2.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模块</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">A 
<p> </p></span>
				</b>
		</p>
<img src ="http://www.blogjava.net/snowolf/aggbug/106602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/snowolf/" target="_blank">snowolf</a> 2007-03-27 10:15 <a href="http://www.blogjava.net/snowolf/archive/2007/03/27/106602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOW——工作说明书</title><link>http://www.blogjava.net/snowolf/archive/2007/03/15/sow.html</link><dc:creator>snowolf</dc:creator><author>snowolf</author><pubDate>Thu, 15 Mar 2007 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/snowolf/archive/2007/03/15/sow.html</guid><wfw:comment>http://www.blogjava.net/snowolf/comments/104026.html</wfw:comment><comments>http://www.blogjava.net/snowolf/archive/2007/03/15/sow.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/snowolf/comments/commentRss/104026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/snowolf/services/trackbacks/104026.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 工作说明书 （SOW）——合同中对提供的产品或服务的表述，有时候被称为需求说明书。工作说明书应足够详细，以使期望中的卖方确定是否有能力提供各事项。SOW应该包括任何所需的间接服务，比如运行情况报告或者项目后续的运作支持等。&nbsp;&nbsp;<a href='http://www.blogjava.net/snowolf/archive/2007/03/15/sow.html'>阅读全文</a><img src ="http://www.blogjava.net/snowolf/aggbug/104026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/snowolf/" target="_blank">snowolf</a> 2007-03-15 15:24 <a href="http://www.blogjava.net/snowolf/archive/2007/03/15/sow.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在MS SQL SERVER中取得表中最大自增长ID</title><link>http://www.blogjava.net/snowolf/archive/2006/08/03/61547.html</link><dc:creator>snowolf</dc:creator><author>snowolf</author><pubDate>Thu, 03 Aug 2006 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/snowolf/archive/2006/08/03/61547.html</guid><wfw:comment>http://www.blogjava.net/snowolf/comments/61547.html</wfw:comment><comments>http://www.blogjava.net/snowolf/archive/2006/08/03/61547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/snowolf/comments/commentRss/61547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/snowolf/services/trackbacks/61547.html</trackback:ping><description><![CDATA[
		<h1>
				<a name="_ident_current(t-sql)">
				</a>
				<sup>
				</sup>
				<font size="4">IDENT_CURRENT</font>
		</h1>
		<p>返回为任何会话和任何作用域中的指定表最后生成的标识值。 </p>
		<h5>语法</h5>
		<p>IDENT_CURRENT<b>('</b><i>table_name</i><b>')</b></p>
		<h5>参数</h5>
		<p>
				<i>table_name</i>
		</p>
		<p class="indent">是将要返回其标识值的表的名称。<i>table_name</i> 的数据类型为 <b>varchar</b>，没有默认值。</p>
		<h5>返回类型</h5>
		<p>
				<strong>sql_variant<br /><br />--------------------------------------------------------------------------------------------------<br /></strong>
		</p>
		<h1>
				<a name="_scope_identity_(t-sql)">
				</a>
				<font size="4">SCOPE_IDENTITY</font>
		</h1>
		<p>返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此，如果两个语句处于同一个存储过程、函数或批处理中，则它们位于相同的作用域中。</p>
		<h5>语法</h5>
		<p>
				<code>SCOPE_IDENTITY( )</code>
		</p>
		<h5>返回类型</h5>
		<p>
				<strong>sql_variant<br /><br /></strong>IDENT_CURRENT 不受作用域和会话的限制，而受限于指定的表。<br /></p>
<img src ="http://www.blogjava.net/snowolf/aggbug/61547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/snowolf/" target="_blank">snowolf</a> 2006-08-03 17:38 <a href="http://www.blogjava.net/snowolf/archive/2006/08/03/61547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置技巧Top 10</title><link>http://www.blogjava.net/snowolf/archive/2006/06/13/52538.html</link><dc:creator>snowolf</dc:creator><author>snowolf</author><pubDate>Tue, 13 Jun 2006 09:49:00 GMT</pubDate><guid>http://www.blogjava.net/snowolf/archive/2006/06/13/52538.html</guid><wfw:comment>http://www.blogjava.net/snowolf/comments/52538.html</wfw:comment><comments>http://www.blogjava.net/snowolf/archive/2006/06/13/52538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/snowolf/comments/commentRss/52538.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/snowolf/services/trackbacks/52538.html</trackback:ping><description><![CDATA[作者：Jason Brittain &amp; Ian F. Darwin<br />出处：http://www.orielly.com<br />译者：陈光<br />2003-12-31<br /><br />编者按：现在开发Java Web应用，建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性，并且更新得很快，现在非常的流行。<br /><br />你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧，这些技巧源自于我的书：《Tomcat权威指南》，希望对你有所帮助。—— Jason Brittain<br /><br />1． 配置系统管理（Admin Web Application）<br />大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现，当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。<br /><br />Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml 。<br />（译者注：CATALINA_BASE即tomcat安装目录下的server目录）<br /><br />你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择，你也可以删除这个自动部署文件，而在server.xml文件中建立一个Admin Web Application的context，效果是一样的。你不能管理Admin Web Application这个应用，换而言之，除了删除CATALINA_BASE/webapps/admin.xml ，你可能什么都做不了。<br /><br />如果你使用UserDatabaseRealm（默认），你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件，添加一个名叫“admin”的role 到该文件中，如下：<br /><br />&lt;role name="admin"/&gt;<br /><br />你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）：<br /><br />&lt;user name="admin" password="deep_dark_secret" roles="admin"/&gt;<br /><br />当你完成这些步骤后，请重新启动Tomcat，访问http://localhost:8080/admin，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。<br /><br />2．配置应用管理（Manager Web Application）<br />Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。<br /><br />Manager Web Application被被定义在一个自动部署文件中：<br /><br />CATALINA_BASE/webapps/manager.xml 。<br /><br />你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。<br />（译者注：CATALINA_HOME即tomcat安装目录）<br /><br />如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中：<br /><br />&lt;role name=”manager”&gt;<br /><br />你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）：<br /><br />&lt;user name="manager" password="deep_dark_secret" roles="manager"/&gt;<br /><br />然后重新启动Tomcat，访问http://localhost/manager/list，将看到一个很朴素的文本型管理界面，或者访问http://localhost/manager/html/list，将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。<br /><br />Manager application让你可以在没有系统管理特权的基础上，安装新的Web应用，以用于测试。如果我们有一个新的web应用位于/home/user/hello下在，并且想把它安装到 /hello下，为了测试这个应用，我们可以这么做，在第一个文件框中输入“/hello”（作为访问时的path），在第二个文本框中输入“file:/home/user/hello”（作为Config URL）。<br /><br />Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将看到一个503的错误——“503 - This application is not currently available”。<br /><br />移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。<br /><br />3．部署一个web应用<br />有两个办法可以在系统中部署web服务。<br />1&gt; 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。<br />2&gt; 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。<br /><br />如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。<br /><br />部署web应用的另一种方式是写一个Context XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为“context片断”。<br /><br />举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断：<br /><br />&lt;!--  <br /> Context fragment for deploying MyWebApp.war  <br />--&gt;<br />&lt;Context path="/demo" docBase="webapps/MyWebApp.war" <br />        debug="0" privileged="true"&gt;<br /> &lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"                <br />        resourceName="UserDatabase"/&gt; <br />&lt;/Context&gt;<br /><br />把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。<br /><br />这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。<br /><br /><br />4．配置虚拟主机（Virtual Hosts）<br />关于server.xml中“Host”这个元素，只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制，对每个域名而言，都好象独享了整个主机。实际上，大多数的小型商务网站都是采用虚拟主机实现的，这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽，以保障合理的访问响应速度，另外虚拟主机还能提供一个稳定的固定IP。<br /><br />基于名字的虚拟主机可以被建立在任何web服务器上，建立的方法就是通过在域名服务器（DNS）上建立IP地址的别名，并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat，我们不准备介绍在各种操作系统上设置DNS的方法，如果你在这方面需要帮助，请参考《DNS and Bind》一书，作者是Paul Albitz and Cricket Liu (O'Reilly)。为了示范方便，我将使用一个静态的主机文件，因为这是测试别名最简单的方法。<br />在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下：<br /><br />&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;<br /> &lt;Service name="Tomcat-Standalone"&gt;<br />   &lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<br />port="8080" minProcessors="5" maxProcessors="75"<br />enableLookups="true" redirectPort="8443"/&gt;<br />   &lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<br />port="8443" minProcessors="5" maxProcessors="75"<br />acceptCount="10" debug="0" scheme="https" secure="true"/&gt;<br />     &lt;Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"<br />clientAuth="false" protocol="TLS" /&gt;<br />   &lt;/Connector&gt;<br />   &lt;Engine name="Standalone" defaultHost="localhost" debug="0"&gt;<br />     &lt;!-- This Host is the default Host --&gt;<br />     &lt;Host name="localhost" debug="0" appBase="webapps"<br />     unpackWARs="true" autoDeploy="true"&gt;<br />       &lt;Context path="" docBase="ROOT" debug="0"/&gt;<br />       &lt;Context path="/orders" docBase="/home/ian/orders" debug="0"<br />                      reloadable="true" crossContext="true"&gt;<br />       &lt;/Context&gt;<br />     &lt;/Host&gt;<br /><br />     &lt;!-- This Host is the first "Virtual Host": www.example.com --&gt;<br />     &lt;Host name="www.example.com" appBase="/home/example/webapp"&gt;<br />       &lt;Context path="" docBase="."/&gt;<br />     &lt;/Host&gt;<br /><br />   &lt;/Engine&gt;<br /> &lt;/Service&gt;<br />&lt;/Server&gt;<br /><br />Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。<br /><br />5．配置基础验证（Basic Authentication）<br />容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，Tomcat将通过HTTP Basic Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。<br /><br />注意：使用Basic Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。但是，如果你是刚开始使用Tomcat，或者你想在你的web应用中测试一下基于容器的安全管理，Basic Authentication还是非常易于设置和使用的。只需要添加&lt;security-constraint&gt;和&lt;login-config&gt;两个元素到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的&lt;role&gt;和&lt;user&gt;即可，然后重新启动Tomcat。<br /><br />下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。<br /><br />&lt;!--<br /> Define the Members-only area, by defining<br /> a "Security Constraint" on this Application, and<br /> mapping it to the subdirectory (URL) that we want<br /> to restrict.<br />--&gt;<br />&lt;security-constraint&gt;<br /> &lt;web-resource-collection&gt;<br />   &lt;web-resource-name&gt;<br />     Entire Application<br />   &lt;/web-resource-name&gt;<br />   &lt;url-pattern&gt;/members/*&lt;/url-pattern&gt;<br /> &lt;/web-resource-collection&gt;<br /> &lt;auth-constraint&gt;<br />     &lt;role-name&gt;member&lt;/role-name&gt;<br /> &lt;/auth-constraint&gt;<br />&lt;/security-constraint&gt;<br />&lt;!-- Define the Login Configuration for this Application --&gt;<br />&lt;login-config&gt;<br /> &lt;auth-method&gt;BASIC&lt;/auth-method&gt;<br /> &lt;realm-name&gt;My Club Members-only Area&lt;/realm-name&gt;<br />&lt;/login-config&gt;<br /><br />6．配置单点登录（Single Sign-On）<br />一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。<br /><br />Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn Valve元素即可，如下所示：<br /><br />&lt;Valve className="org.apache.catalina.authenticator.SingleSignOn"<br />      debug="0"/&gt;<br /><br />在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。<br /><br />使用single sign-on valve有一些重要的限制：<br />1&gt; value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。<br />2&gt; 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。<br />3&gt; 不能被context中的realm覆盖。<br />4&gt; 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的&lt;auth-method&gt;中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。<br />5&gt; 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。<br />6&gt; 单点登录需要使用cookies。<br /><br />7．配置用户定制目录（Customized User Directores）<br />一些站点允许个别用户在服务器上发布网页。例如，一所大学的学院可能想给每一位学生一个公共区域，或者是一个ISP希望给一些web空间给他的客户，但这又不是虚拟主机。在这种情况下，一个典型的方法就是在用户名前面加一个特殊字符（~），作为每位用户的网站，比如：<br /><br />http://www.cs.myuniversity.edu/~username<br />http://members.mybigisp.com/~username<br /><br />Tomcat提供两种方法在主机上映射这些个人网站，主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig，userClass属性应该是几个映射类之一。如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase 映射类。<br /><br />&lt;Listener className="org.apache.catalina.startup.UserConfig" <br />directoryName="public_html" <br />userClass="org.apache.catalina.startup.PasswdUserDatabase"/&gt;<br /><br />web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。<br /><br />实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。<br /><br />&lt;Listener className="org.apache.catalina.startup.UserConfig" <br />directoryName="public_html" homeBase="/home" <br />userClass="org.apache.catalina.startup.HomesUserDatabase"/&gt;<br /><br />这样一来，web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。<br /><br />这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。<br /><br /><br />8．在Tomcat中使用CGI脚本<br />Tomcat主要是作为Servlet/JSP容器，但它也有许多传统web服务器的性能。支持通用网关接口（Common Gateway Interface，即CGI）就是其中之一，CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用，是因为它能在大多数程序或脚本中被调用，包括：Perl，Python，awk，Unix shell scripting等，甚至包括Java。当然，你大概不会把一个Java应用程序当作CGI来运行，毕竟这样太过原始。一般而言，开发Servlet总要比CGI具有更好的效率，因为当用户点击一个链接或一个按钮时，你不需要从操作系统层开始进行处理。<br /><br />Tomcat包括一个可选的CGI Servlet，允许你运行遗留下来的CGI脚本。<br /><br />为了使Tomcat能够运行CGI，你必须做如下几件事：<br />1. 把servlets-cgi.renametojar （在CATALINA_HOME/server/lib/目录下）改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。<br />2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中，把关于&lt;servlet-name&gt; CGI的那段的注释去掉（默认情况下，该段位于第241行）。<br />3. 同样，在Tomcat的CATALINA_BASE/conf/web.xml文件中，把关于对CGI进行映射的那段的注释去掉（默认情况下，该段位于第299行）。注意，这段内容指定了HTML链接到CGI脚本的访问方式。<br />4. 你可以把CGI脚本放置在WEB-INF/cgi 目录下（注意，WEB-INF是一个安全的地方，你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处），或者你也可以把CGI脚本放置在context下的其他目录下，并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置，且不能与上一步指定的URL重名。<br />5. 重新启动Tomcat，你的CGI就可以运行了。<br /><br />在Tomcat中，CGI程序缺省放置在WEB-INF/cgi目录下，正如前面所提示的那样，WEB-INF目录受保护的，通过客户端的浏览器无法窥探到其中内容，所以对于放置含有密码或其他敏感信息的CGI脚本而言，这是一个非常好的地方。为了兼容其他服务器，尽管你也可以把CGI脚本保存在传统的/cgi-bin目录，但要知道，在这些目录中的文件有可能被网上好奇的冲浪者看到。另外，在Unix中，请确定运行Tomcat的用户有执行CGI脚本的权限。<br /><br />9．改变Tomcat中的JSP编译器（JSP Compiler）<br />在Tomcat 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在&lt;init-param&gt; 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下：<br /><br />&lt;servlet&gt;<br />   &lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />   &lt;servlet-class&gt;<br />     org.apache.jasper.servlet.JspServlet<br />   &lt;/servlet-class&gt;<br />   &lt;init-param&gt;<br />     &lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<br />     &lt;param-value&gt;WARNING&lt;/param-value&gt;<br />   &lt;/init-param&gt;<br />   &lt;init-param&gt;<br />     &lt;param-name&gt;compiler&lt;/param-name&gt;<br />     &lt;param-value&gt;jikes&lt;/param-value&gt;<br />   &lt;/init-param&gt;<br />   &lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />&lt;/servlet&gt;<br /><br />当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。<br /><br />10．限制特定主机访问（Restricting Access to Specific Hosts）<br />有时，你可能想限制对Tomcat web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果，Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。<br /><br />通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。<br />例如你可以把Admin Web application设置成只允许本地访问，设置如下：<br /><br />&lt;Context path="/path/to/secret_files" ...&gt;<br /> &lt;Valve className="org.apache.catalina.valves.RemoteAddrValve"<br />        allow="127.0.0.1" deny=""/&gt;<br />&lt;/Context&gt;<br /><br />如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。<br /><br />--------------------------------------<br /><br />作者简介：<br />Jason Brittain是CollabNet公司的一名资深软件工程师，主要负责软件底层架构的开发。他已经为Apache Jakarta项目做了很多贡献，多年以来，他一直是一名积极的开源软件开发者。<br /><br />Ian F. Darwin已经在计算机行业工作了30年：从1980年开始使用Unix，从1995年开始使用Java，从1998年开始使用OpenBSD。他是两本Oreilly图书的作者：Checking C Programs with lint 和 Java Cookbook，还与Jason Brittain合著了Tomcat: The Definitive Guide。<br /><br />译者简介：<br />陈光（Holen Chen），J2EE项目经理，熟悉知识管理及电子政务，致力于Apache Jakarta项目在国广的推广及深层次应用，可通过 holen@263.net与作者联系。<img src ="http://www.blogjava.net/snowolf/aggbug/52538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/snowolf/" target="_blank">snowolf</a> 2006-06-13 17:49 <a href="http://www.blogjava.net/snowolf/archive/2006/06/13/52538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于AJAX的动态树型结构的设计与实现</title><link>http://www.blogjava.net/snowolf/archive/2006/06/13/52537.html</link><dc:creator>snowolf</dc:creator><author>snowolf</author><pubDate>Tue, 13 Jun 2006 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/snowolf/archive/2006/06/13/52537.html</guid><wfw:comment>http://www.blogjava.net/snowolf/comments/52537.html</wfw:comment><comments>http://www.blogjava.net/snowolf/archive/2006/06/13/52537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/snowolf/comments/commentRss/52537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/snowolf/services/trackbacks/52537.html</trackback:ping><description><![CDATA[作者：佚名  来源：转载<br /><br /><div class="ContentFont" id="NewaspContentLabel" style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px"><font id="font_word" style="FONT-SIZE: 14px; FONT-FAMILY: 宋体, Verdana, Arial, Helvetica, sans-serif"><p><font size="3">　树型结构是一类应用非常广泛的数据结构。人类社会中宗族的族谱和现代企业的组织形式都是树型结构。在计算机领域中,文件系统中文件的管理结构、存储器管理中的页表、数据库中的索引等也都是树型结构。随着Internet的飞速发展，树型结构在浏览器/服务器（Browser/Server，简称B/S）应用系统的应用也越来越广泛。 <br /><br />　　目前，在互联网上广泛存在、应用的树型结构一般分为两种：静态和动态结构。静态结构存在最多、实现简单，但是静态导致不能改变树的结构和内容，无法反映树的节点信息的变化；而实现相对复杂的动态构造树，虽然可以动态增加、删除、更新节点信息，但是大部分不能直接拖放节点来改变树的结构以及节点间的次序，并且反复刷新整个页面，给用户维护带来了许多不便。本文提出了一种基于Ajax（Asynchronous JavaScript and XML）通用的、动态加载节点的解决方案。实现上采用J2EE多层架构，树节点的描述信息采用数据库存储，以可扩展标记语言（eXtensible Markup Language，简称XML）展现给JavaScript解析，支持无刷新地增加、删除、更新节点信息，以及拖放节点来改变树的结构和节点间的次序。文中第1部分简要介绍了Ajax技术；第2部分详细介绍了该方案的技术实现过程；第3部分分析了该方案的效率。<br /><br /><b>　　1、Ajax简介</b><br /><br />　　Ajax概念的最早提出者Jesse James Garrett认为：Ajax并不是一门新的语言或技术，它实际上是几项技术按一定的方式组合在共同的协作中发挥各自的作用，它包括：<br /><br />　　·使用扩展超媒体标记语言（eXtended Hypertext Markup Language，简称XHTML）和级联样式单（Cascading Style Sheet，简称CSS）标准化呈现；<br /><br />　　·使用文档对象模型（Document Object Model，简称DOM）实现动态显示和交互；<br /><br />　　·使用可扩展标记语言（eXtensible Markup Language，简称XML）和可扩展样式表转换（eXtensible Stylesheet Language Transformation，简称XSLT）进行数据交换与处理；<br /><br />　　·使用XMLHTTP组件XMLHttpRequest对象进行异步数据读取；<br /><br />　　·最后用JavaScript绑定和处理所有数据。<br /><br />　　Ajax的工作原理如图1所示，它相当于在用户和服务器之间加了一个中间层，使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器，像—些数据验证和数据处理等都交给Ajax引擎处理，只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。这样就把一些服务器负担的工作转嫁到客户端，利用客户端闲置的处理能力来处理，减轻服务器和带宽的负担，从而达到节约ISP的空间及带宽租用成本的目的。<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div><img src="http://java.chinaitlab.com/UploadFiles_8734/200512/20051229100108136.gif" onload="return imgzoom(this,550)" border="0" /><br />图 1 未使用Ajax（a）和使用Ajax（b）的web应用比较</div></td></tr></tbody></table><br /><b>　　2、总体设计方案</b><br /><br />　　传统的服务器程序采用Model 1开发模型，通常将业务逻辑、服务器端处理过程和HTML代码集中在一起表示，快速完成应用开发。Model 1 在小规模应用开发时优势明显，但是应用实现一般是基于过程的，一组服务器页面实现一个流程，如果流程改动将导致多个地方修改，非常不利于应用的扩展和更新。此外业务逻辑和表示逻辑混合在服务器页面中，耦合紧密，无法模块化，导致代码无法复用。<br /><br />　　Model 2则解决了这些问题，它是面向对象的MVC模式（Model-View-Controller，模型-视图-控制器）在Web开发中的应用，Model表示应用的业务逻辑，View是应用的表示层页面，Controller是提供应用的处理过程控制。通过这种MVC设计模式把应用逻辑，处理过程和显示逻辑划分成不同的组件、模块实现，组件间可以进行交互和重用。<br /><br />　　本方案是采用J2EE的多层架构，设计时结合Struts框架将表示层、业务逻辑层和数据层划分成不同的模块。表示层专注于树的外观显示，业务逻辑层为服务器端处理程序，处理树的生成、变化，为减少耦合性，该程序全部模块化实现，不在表示页面嵌入服务器程序；模型层是数据的存储和表示。下面分别介绍各层实现。<br /><br /><b>　　2.1 表示层实现</b><br /><br />　　类似<a class="wordstyle" href="http://www.newasp.cn/" target="_blank">Windows</a>资源管理器的文件夹模式，节点的图片样式如表1所示。对于每个节点的DHTML 代码，需要包含节点的位置、前导图片、样式、针对该节点的其他操作等。同时为了节点显示的连贯性，还需一些前导图片。<br /><br />　　表1 树节点的前的图片样式表<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div><img src="http://java.chinaitlab.com/UploadFiles_8734/200512/20051229100108564.gif" onload="return imgzoom(this,550)" border="0" /></div></td></tr></tbody></table><br />　 对于树的非叶子节点，图片和节点信息等，采用一个DIV ( division) 容器包含。DIV 等容器是DHTML 的基础，使用它可以通过脚本程序对其属性进行操作，如设置其style 样式的display 属性来控制子节点的展开和隐藏。节点的位置、前导图片、样式、针对该节点的其他的操作等都放入容器中，例：<br />＜ DIV id =mParentID＞<br />＜ IMG align = center border = 0 onclick =″nodeExpand (‘leafid’)″ name = m1Tree src =′Tplus.gif′＞<br />＜ IMG align = center border = 0 name = m1Folder src =′folderClosed. gif′＞ 计算机学院 ＜/DIV＞<br /><br />　　叶子节点无需容器直接输出即可。<br /><br />　　当点击某节点前的“ + ”、“ - ”图片时通过DIV 的style 样式的display 属性控制子节点的展开和隐藏。display：“none”(隐藏,不可见)，display：“block”(显示) 。相关JavaScript 代码如下：<br />if (expandChild.style.display = =″none″){<br />　// 当前为隐藏状态,执行展开动作<br />　this.Loading(parentObject);//判断该分支的数据是否已经加载<br />　expandChild.style.display =″block″;<br />if (para2 = =″last″)<br />　parentObject.src =″Lminus. gif″; // 最后一个节点<br />else<br />　parentObject.src = ″Tminus. gif″; // 显示┠<br />　expandFolder.src = ″folderOpen. gif″;<br />}else {<br />　// 将当前节点的子节点全部隐藏<br />　expandChild.style.display = ″none″;<br />　if (para2 = = ″last″)<br />　　parentObject.src = ″Lplus. gif″;<br />　else<br />　　parentObject.src = ″Tplus. gif″;<br />　　expandFolder.src = ″folderClosed. gif″;<br />}<br /><br /><b>　　2.2 树型表结构设计</b><br /><br />　　我们以数据库为载体记录节点的变化，树型表结构至少要有以下字段：节点的编号(CLASSID) ,对节点的描述(ClassName)，父节点的编号(ParentId)，这些是构建树结构所必须的信息。同时引入节点的类别代码（ClassCode），节点的级别（ClassLevel），是否叶子节点 (Terminated)等辅助字段，记录节点次序，实体关系图如图3所示。<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div><img src="http://java.chinaitlab.com/UploadFiles_8734/200512/20051229100108927.gif" onload="return imgzoom(this,550)" border="0" /><br />图 3 树型表结构示意图</div></td></tr></tbody></table><div>　　树遍历的时间复杂度是O( <i>n </i>)，但是将树信息存放到数据库后，就不能按传统的方式遍历树，必须使用SQL 语句访问数据库表的内容，而一次性取的数据量越多，消耗的资源也越多，用户等待的时间就越长。如果将无序的数据从数据库中读出，在服务器端，必须将排序后的树送到客户端显示。因此，最好从数据库读出已排好序的树。<br /><br />　　我们知道，字符串排序是按照字典序形式。结合SQL 语句的特点和树结构特点，数据库表中，节点的类别代码采用多级字符串形式，如AAABBBCCC，从树根节点开始，每向下一级字符串就增加一级，并且子节点类别代码以父节点类别代码开始，再开始本级的类别代码。同级的节点按照生成的顺序编号，如节点类别代码为AAA 的下一级孩子类别代码为AAAAAA，AAAAAB 等，AAAAAB 的孩子节点为AAAAABAAA、AAAAABAAB等。每一级编号字符的宽度与实际的应用关联，如AAA～ZZZ 一级则有263 个节点，如果不够用再增加一个字符用于编码。该巧妙的编号方式。使得在执行SQL 语句select * from tree_class order by classcode 后，一次获得完整的先序树。</div><div><br />　　2.3.1 动态加载技术<br /><br />　　如果一次性获取完整的先序树，构造成xml提供给JavaScript解析，数据量越大，消耗的资源越多，客户端响应延迟时间就越长，因此对于大数据量的树，采用动态加载方式，即每次单击“+”图片时，判断是否已加载子节点数据，如果未加载则通过Ajax的XMLHTTP组件XMLHTTPRequest对象异步发送请求，连接服务器执行SQL 语句“select * from tree_class where parent = ？order by classcode ”获取节点数据。相关JavaScript 代码如下：<br />/*判断是否已经加载数据，未加载则访问服务器加载数据*/ 
<div><p>dhtmlTree.prototype.Loading=function(pObject){<br />　if(((pObject.XMLload==0)&amp;&amp;(this.XMLsource))&amp;&amp;(!this.XMLloading)){<br />　　pObject.XMLload=1;<br />　　this.loadXML(this.XMLsource+getUrlSymbol(this.XMLsource)+"id="+escape(pObject.id));<br />　}<br />}<br />dtmlXMLObject.prototype.loadXML=function(url){//加载数据<br />　try {<br />　　this.xmlDoc = new XMLHttpRequest();<br />　　/*通过GET方法异步连接到 url 加载数据*/<br />　　this.xmlDoc.open("GET", url,true);//true：异步；false：同步<br />　　this.xmlDoc.send(null);<br />　} catch(e){<br />　　this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");//使用IE<br />　　this.xmlDoc.open("GET", url,true);//true：异步；false：同步<br />　　this.xmlDoc.send(null);<br />　}<br />　return this.xmlDoc.responseXML;<br />}<br /><br />　　每次只取同一个父节点ParentId的子节点序列，按XML格式封装成树的文档结构，例如：<br />＜tree id="0"＞<br />＜leaf child=”1" name="国防科技大学" id="1" im0="leaf.gif" im1="folderOpen.gif" im2=" folderClosed.gif"/＞<br />＜/tree＞<br /></p><p>　　提供给JavaScript的dhtmlTreeObject.prototype.insertItem（）解析并组织好html输出节点；其中child：1表示有子节点，0表示没有子节点；im0表示没有子节点时的图标；im1表示有子节点并且打开节点时的图标；im2表示有子节点并且关闭时的图标；所以还可以在构造XML时自定义图标。<br /><br />　　2.3.2 树型结构的构造<br /><br />　　从数据库中返回的是有序的先序树，而XML是完整的树型结构文档，所以将树型数据构造成预定义的XML格式，只需从根节点开始，遍历一遍树，即可将树全部生成。相关JavaScript代码如下：<br />/*动态加载树的构造方法*/</p><p>dtmlXMLObject.prototype.constructTree=function(){</p><p>//采用动态加载时获取的xml数据，解析树型数据</p><p>var node=this.XMLLoader.getXMLTopNode("tree");</p><p>var parentId=node.getAttribute("id");</p><p>for(var i=0;i＜node.childNodes.length;i++) { //逐个解析xml文件的leaf节点</p><p>　if((node.childNodes[i].nodeType==1)&amp;&amp;(node.childNodes[i].tagName == "leaf")){<br />　　var name=node.childNodes[i].getAttribute("text");<br />　　…………<br />　　var temp=dhtmlObject.a0Find(parentId);//获取父节点对象<br />　　temp.XMLload=1;//已加载<br />　　//构造html输出节点<br />　　dhtmlObject.insertItem(parentId,cId,name,im0,im1,im2,chd);<br />　　dhtmlObject.addDragger = this;//设置可拖放的对象<br />　};<br />}<br /><br />　　2.3.3 树型结构的维护<br /><br />　　在维护树型结构表时,删除节点较为简单，SQL 语句为: "delete from tree_class where classcode like′"+ classcode +"%′",即可将其节点和孩子一并删除；增加节点时,分为前插、后插、和插入子节点三种情况，前两种情况需要更新递归更新类别代码，后者只需找到父节点的孩子的最大类别代码加1 后,作为增加节点的类别代码；通过拖放来改变树的结构时，只需将拖动节点的parentId更新为目标节点的Classid即可，对应的SQL语句为："update tree_class set parentId = "+ classidTo+" where classid = "+ classidFrom。<br /><br /><b>　　3、效率分析</b><br /><br />　　对于树的存储一般有两种形式：二维表和链表，遍历方式一般也有深度遍历和广度遍历两种方式，遍历的时间复杂度都是O( <i>n </i>)。用二维表存储时，在内存中用数组的下标能准确定位节点的父节点、兄弟节点所在的数组下标。数据库中节点的定位也是准确的，但是将节点信息从数据库中读到内存中时，如果无法通过内存数组下标定位节点信息，那么就必须遍历一遍寻找一个节点，<i>n </i>个节点中寻找一个节点的时间是O(<i>n/</i>2)，<i>n </i>个节点排序的时间复杂度将是O( <i>n<sup></sup></i><sup>2</sup>/2)，这也是一般实现的B/S 模式的树结构效率低下的原因。本方案采用字典序编号方案，使得从数据库中取得的树是已经排序的，直接遍历生成客户页面程序，时间复杂度为O( <i>n </i>)。 <br /><br /><b>　　4、结 论</b><br /><br />　　本文讨论了基于Ajax的动态树型结构的实现方案，支持无刷新动态维护树的节点信息，支持拖放节点改变树的节点结构以及次序；同时采用数据库存储节点信息，保证了该方案有一定的通用性，此外结合XML描述树的节点信息，使得任何按本方案预定的xml文档描述的信息都可以通过树来展现。本方案已经应用在我校的数字迎新系统以及老百姓大药房信息系统中。</p></div></div></font></p></font></div><img src ="http://www.blogjava.net/snowolf/aggbug/52537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/snowolf/" target="_blank">snowolf</a> 2006-06-13 17:48 <a href="http://www.blogjava.net/snowolf/archive/2006/06/13/52537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精确截取字符串（转载） </title><link>http://www.blogjava.net/snowolf/archive/2006/06/13/52369.html</link><dc:creator>snowolf</dc:creator><author>snowolf</author><pubDate>Tue, 13 Jun 2006 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/snowolf/archive/2006/06/13/52369.html</guid><wfw:comment>http://www.blogjava.net/snowolf/comments/52369.html</wfw:comment><comments>http://www.blogjava.net/snowolf/archive/2006/06/13/52369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/snowolf/comments/commentRss/52369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/snowolf/services/trackbacks/52369.html</trackback:ping><description><![CDATA[开发中经常遇到，字符串过长，无法完全显示的问题<br /><br />这时候就需要截取我们所需要的长度，后面显示省略号或其他字符。<br /><br />由于中文字符占两个字节，而英文字符占用一个字节，所以，单纯地判断字符数，效果往往不尽如人意<br /><br />下面的方法通过判断字符的类型来进行截取，效果还算可以：）<br /><br /><br />如果大家有其他的解决方法欢迎贴出来，共同学习：）<br />**********************************************************************<br />private String str;<br />private int counterOfDoubleByte;<br />private byte b[];<br />/**<br />* 设置需要被限制长度的字符串<br />* @param str 需要被限制长度的字符串<br />*/<br />public void setLimitLengthString(String str){<br />  this.str = str;<br />}<br />/**<br />* @param len 需要显示的长度(&lt;font color="red"&gt;注意：长度是以byte为单位的，一个汉字是2个byte&lt;/font&gt;)<br />* @param symbol 用于表示省略的信息的字符，如“...”,“&gt;&gt;&gt;”等。<br />* @return 返回处理后的字符串<br />*/<br />public String getLimitLengthString(int len, String symbol) throws UnsupportedEncodingException {<br />  counterOfDoubleByte = 0;<br />  b = str.getBytes("GBK");<br />  if(b.length &lt;= len)<br />    return str;<br />  for(int i = 0; i &lt; len; i++){<br />    if(b[i] &lt; 0)<br />      counterOfDoubleByte++;<br />  }<br /><br />  if(counterOfDoubleByte % 2 == 0)<br />    return new String(b, 0, len, "GBK") + symbol;<br />  else<br />    return new String(b, 0, len - 1, "GBK") + symbol;<br />}<br /><br /><br /><font color="#ff0000" size="2"><strong>本文转贴自网友：focus2004 的文章<br /><br /><a title="permalink: re: 精确截取字符串（转载）" href="/rosen/archive/2005/08/12/9949.html#29339"><font color="#000080">#</font></a><font color="#000000"> </font><a name="29339"></a><font color="#000000">re: 精确截取字符串（转载） <span>2006-01-28 18:24 </span></font><a id="Comments1_CommentList_ctl02_NameLink" href="http://fstdg2003@21cn.com/" target="_blank"><font color="#000080">tdg</font></a><br /></strong><font color="#000000">大作拜读，有一点愚见，特抛砖引玉： <br />1。字符串除了可以基于byte[]操作外，还可以基于char[]操作。看老大你的意图是想截取字符串的前几个字符然后加上省略符号最后输出而已，完全不必考虑用byte[]数组操作啊 。而且好像开发中更注重语义上的第几个字符而不是你说的这种情况哦。 <br />2。以下是拙作，请斧正： <br />/** <br />* 字符串截取函数 <br />* @param str String 要处理的字符串 <br />* @param length int 需要显示的长度 <br />* @param symbol String 用于表示省略的信息的字符，如“...”,“&gt;&gt;&gt;”等 <br />* @return String 返回处理后的字符串 <br />* @throws UnsupportedEncodingException <br />*/ <br />public String getLimitLengthString(String str, int length, String symbol) throws <br />UnsupportedEncodingException { <br />assert str != null; <br />assert length &gt; 0; <br />assert symbol != null; <br />//如果字符串的位数小于等于要截取的位数，附加上表示省略的信息的字符串后返回 <br />if (str.length() &lt;= length) { <br />return str + symbol; <br />//从零开始，截取length个字符，附加上表示省略的信息的字符串后返回 <br />} else { <br />str = new String(str.getBytes("GBK")); <br />char[] charArray = str.toCharArray(); <br />char[] charArrayDesc = new char[length]; <br />System.arraycopy(charArray, 0, charArrayDesc, 0, length); <br />return new String(charArrayDesc) + symbol; <br />} <br />}  <br /><br />呵呵 tdg 兄很认真喔，谈不上斧正。主要是这个问题，用 char 处理，如果是字母或者数字，实际上截取出来的会比汉字少占用一半的空间，所以截取出来后，还是不能对齐。而实际上 char 数组中，不管是字母、数字还是汉字，它们都只代表一个单元。但是 byte 则不同，字母、数字只占用一个字节，而汉字占用两个字节（都是GBK编码）。  <br /><br />您好！ <br />你的文章让我受益不少，有个问题想向您确认一下： <br />在代码中 <br />b = str.getBytes("GBK"); <br />if(b.length &lt;= len) <br />return str; <br />for(int i = 0; i &lt; len; i++){ <br />if(b[i] &lt; 0) <br />counterOfDoubleByte++; <br />} <br />是不是如果只要是中文汉字，在b[i]对应的值都是小于0的， <br />也就是说，在汉字代表的两个字节中，这两个汉字分别转化为整数值时，是不是一定小于0，但值范围不能小于-127的。做过测试，不能肯定。：） <br /><br />istarliu，这里要强调一下，GBK、GB2312 双字节编码字节才是负的。UTF-8 三字节编码未去核实。<br /><br /><a class="" title="转贴" href="/rosen/archive/2005/08/12/9949.html" target="_blank">来源</a></font></font><img src ="http://www.blogjava.net/snowolf/aggbug/52369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/snowolf/" target="_blank">snowolf</a> 2006-06-13 10:46 <a href="http://www.blogjava.net/snowolf/archive/2006/06/13/52369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>