<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>sunrie</title>
    <description></description>
    <link>http://sunrie.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>正确使用Ramdisk来虚拟内存硬盘</title>
        <author>sunrie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunrie.javaeye.com">sunrie</a>&nbsp;
                    链接：<a href="http://sunrie.javaeye.com/blog/213792" style="color:red;">http://sunrie.javaeye.com/blog/213792</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong><span style="font-family: Arial;">正确使用ＲＡＭＤＩＳＫ来虚拟内存硬盘<br />
</span>
<br />
</strong>
对
于拥有1G内存，却只上上网、玩玩小游戏的朋友来说。禁用虚拟内存是可行的。对于拥有很大容量内存的朋友，如果真想禁用虚拟内存加快运行速度，其实可以用
折中的办法&ldquo;骗&rdquo;过Windows，就是把物理内存划出一部分来虚拟成物理硬盘。但禁用虚拟内存并不是你在在我的电脑右键盘属性-高级-性能设置里把虚拟
内存调成0就可以解决的。需要用ramdisk等第三方软件模拟，把一部分内存虚拟成硬盘的一个分区，然后再把Pagefile.sys页面文件设到该虚
拟盘上。其实这样做就是骗过XP，把虚拟内存建在内存上.<br />
首先，要搞清楚什么是&ldquo;大内存&rdquo;配置。当初设计Windows使用虚拟内存本身是因为物
理内存很贵，一般都不会超过128MB容量，需要硬盘空间作临时缓冲&mdash;&mdash;也就是说，你应该把应用时需要多少物理内存和自己
实际拥有的内存作一个比较，如果实际拥有的内存少于应用峰值，就会遇到麻烦了。<br />
　　一般来说，如果要进行平面大图、3D动画渲染等数据量很大的任
务，不应禁用虚拟内存;如果经常要打印带大量图片的文档，禁止虚拟内存也会让程序出现错误。因为像Word一类软件打印之前要生成缓冲文件，再传输到打印
机上，图片尺寸较大、分辨率较高时，需要的缓冲区容量也很大，笔者以前帮助广告美工出设计图时，就遇到打印一张图生成将近300MB临时文件的情况。因为
Windows和应用程序本身也是需要一定内存来运行的，如果你是512MB的配置，禁用了虚拟内存，很有可能中途报告虚拟内存不足，强行退出造成打印纸
张及油墨的浪费。<br />
　　所以，必须根据你的任务应用环境，来决定是否禁用虚拟内存。即使是把虚拟内存大小固定设置，也必须谨慎，否则在运行大型应用软件的时候才出现虚拟内存不足的提示，整个系统会因为CPU的占用率极高而变得很慢，此时再改动就没那么方便了。<br />
考虑操作系统的因素<br />
              在不同的操作系统下，虚拟内存的设置或禁用也是不同的，不能一概而论。<br />
因为架构问题，Windows 9x/Me对大于256MB的内存有先天的不足，大于这个数量的内存，Windows
98会出现不稳定及启动速度变慢的情况。如果使用了大内存加上禁用虚拟内存，不稳定的因素将会进一步增加。Windows
2000/XP可有效管理的内存容量为1GB左右，大于这个数目也会出现不稳定的情况，而且视主板BIOS型号及芯片组性能而不同。<br />
　　另外，<br />
<span style="color: red;">Windows
本身的设计就是，一旦发现有进程转入不活跃状态，就会把分配给它的内存空间映射到交换文件中，尽可能空出物理内存给其它活动的线程，并不是用完物理内存才
开始动用交换文件。因为如果等到物理内存用完再调用，就已经太迟了，在配置较低的机器上势必造成数据传输和处理停滞。</span>
<br />
所以禁止虚拟内存从原则上来讲，最容易引起Windows异常，即使不出现运行不了的故障，也会频繁地提示虚拟内存不够，请重新设置云云，让你不胜其烦。<br />
<span style="color: red;">*其实大部分人根本不必禁用虚拟内存，可在windows目录下System.ini中 的&ldquo;[386enh]&rdquo;底部加入一句，&quot;ConservativeSwapfileUsage=1&quot;，让Windows优先使用物理内存，我想这是一个不错的方法。*</span>
<br />
关
于那些有条件而且想禁用虚拟内存的,个人心得是,256/512内存就最好不必了,XP系统如果多几个启动程序,开机就有180是正常的,所以没有不必
要,划分物理内存做虚拟硬盘反而会引起系统不稳定,不过用到*号内容所讲是完全有必要的.如果512内存要用RAMDISK的话,我建议可以划
20--40M出来,然后把Internet临时文件夹转到上面,可以避免系统碎片和垃圾文件的产生,和加快IE浏览速度.不过首先是要把
internet临时文件夹大小设为和你划出来的虚拟磁盘大小一样或者略小,要不多溢出崩溃我也不知道啥情况,具体操作打开IE--工具
--Internet选项--设置--先调整IE临时目录大小---移动文件夹(移动前完成其他所有操作,因为系统会在你确认是自动注销重起).<br />
关于1G的,我以前用1G的时候,划480为虚拟,其他为物理,后来发现系统常提示虚拟内存不足(系统有这个提示的时候,就会自动给C盘划分页面文件).这样就没达到完全禁用的目的,后来设了544M,512为虚拟,剩下的划给IE临时目录.就再没提示过虚拟内存不足.<br />
关于2G,随便分吧,反正给虚拟内存的空间大小划为大于物理内存就好.<br />
个
人使用XP对虚拟内存的一点心得,为什么128的内存能跑XP,2G也同样跑呢?这就是虚拟内存的作用,当物理内存不足的时候,系统会自动分配更多的虚拟
内存,来支持系统运行,所以往往当物理内存不够的时候,系统会自动利用虚拟的页面文件来补充物理内存的不足,这就是为什么我们没见过系统提示物理内存不足
都是提示虚拟内存不足的原因(我想即使提示物理内存不足也没用吧,俺不可能马上插跟USB内存条吧,没见过..).而根据我使用和打开任务管理器,[查看
--勾选虚拟内存],然后对比物理内存和虚拟内存大小关系之后,发现基本上任何程序任何时候所需要的虚拟内存都大于物理内存.所以建议1G或者以上的内
存,划分内存的时候,划分虚拟硬盘的大小大于所剩余的物理内存.最好是5.5:4.5,也就是1G话550为虚拟,2G话1200M为虚拟
(以上为个人经验,有兴趣的朋友可以自己研究,欢迎高手提出指正)<br />
<span style="color: red;">注意</span>
<br />
几
点：因为是内存虚拟的硬盘，所以系统关机以后上面的文件都将消失，不要把重要文件放在上面，比如我上面所说的那些文件，可文件夹，不然提高系统使用效率，
还连垃圾文件都不用清理，关机自然就没了。还有关于Temp文件夹,也就是&quot;%USERPROFILE%\Local
Settings\Temp&quot;,其实他是也是一个临时文件夹,他里面的东西都可以随时删除的,但是最好不要把他设在虚拟硬盘上呢?是因为我们平时比如安装
一些几百M的大型文件比如OFFICE,PS之类的文件,其解压的临时目录就是他,如果设在虚拟盘上,如果空间不够大,估计会系统崩溃滴,偶没试过.谁去
试试.告诉我.
关于楼下一些朋友说的关机可以保存其内容的虚拟内存,我想意义不大,因为要保存内存内容,势必造成每次开关机都要形成一个内存内容到硬盘的读写工作,而减
慢开关机速度.而我们虚拟内存的目的只有一个:要系统跑得更快!<br />
我是2G内存,划了1.2G做虚拟硬盘,把IE
临时文件夹,系统临时文件夹(我是确定不会再安装大型文件)都转到虚拟内存上,浏览网页速度巨快,特别适合喜欢开多窗口的用户,以前在各个窗口之间切换的
时候,总是很慢,因为系统把没有在最面上的IE窗口,都写在虚拟内存上也就是硬盘上,你再读取的时候,系统必须从硬盘从新读取,所以如果那个窗口图片特别
多的时候,打开就会满,而现在都在内存上,所以很快.<br />
本来XP系统是不可能禁用虚拟内存的,而BT下载的时候就会用在本身在硬盘上的虚拟内存在保
存文件,所以即使BT开的缓存,其实还是在进行磁盘读写,而把虚拟内存转到内存虚拟的硬盘上情况就不一样了,一下是我的截图,比特精灵纪录,读取请求
605次,实际操作2次,下了40多M的文件才写2次盘,这才是真的做到了保护硬盘.哈哈...爽吧.<br />
一般来说对于禁用虚拟内存的具体步骤如下：右键单击&ldquo;我的电脑&rdquo;&rarr;属性&rarr;高级&rarr;性能　设置&rarr;高级&rarr;虚拟内存　更改&rarr;选择虚拟内存（页面文件）存放的分区&rarr;自定义大小&rarr;确定最大值和最小值&rarr;设置。<br />
可是当你禁用以后,打开任务管理器&rarr;查看&rarr;选择列&rarr;虚拟内存大小, 你会发现虚拟内存依然存在.因为XP本身设计就不可能禁用虚拟内存,就算你禁用,系统开机以后会自动分配页面文件,做虚拟内存.而实际上,一般512的内存也不可能满足XP的运行.<br />
小
弟曾做过以下试验,既然系统不可能禁用虚拟内存.那么我就不禁用它,在512物理内存的机子上,我取消所有盘的虚拟内存,确定.然后在C盘设置
100--100的虚拟内存.重起之后.我发现.只要稍微开多点程序,系统就会提示,虚拟内存不足. 那么,请问既然我给了100
都会出现不足提示,那么完全禁用的时候为什么没有提示?因为系统会自动设置
物理内存0.5--1.5倍作为虚拟内存,也就是200--800左右,当然不会出现提示.
还不信的话,你可以试试这个,先手动把虚拟内存设置在C盘以外的盘(比如D盘,E盘,要够大500M以上,禁用C盘的虚拟内存),关机重起之后打开文件查
看,取消隐藏系统文件选项,再去C盘找出pagefile.sys文件删除(这个就是虚拟内存的页面文件).,清空回收站以后,记住你的C盘空余空间大
小,然后再去设置虚拟内存,把所有虚拟内存完全禁用(取消所以盘面的虚拟内存),开机重起.运行几个程序,耗内存的最好,然后在去察看你的C盘,是不是空
间少了很多? 当然啦,系统又自己分配了虚拟内存.</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sunrie.javaeye.com/blog/213792#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 09:47:56 +0800</pubDate>
        <link>http://sunrie.javaeye.com/blog/213792</link>
        <guid>http://sunrie.javaeye.com/blog/213792</guid>
      </item>
          <item>
        <title>小黑重新分区后一键恢复失效的解决方法 </title>
        <author>sunrie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunrie.javaeye.com">sunrie</a>&nbsp;
                    链接：<a href="http://sunrie.javaeye.com/blog/212190" style="color:red;">http://sunrie.javaeye.com/blog/212190</a>&nbsp;
          发表时间: 2008年07月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1>
                                    <a href="http://blog.ednchina.com/viseng/116571/message.aspx#">
                                        小黑重新分区后一键恢复失效的解决方法</a>
</h1>
<p>&nbsp;</p>
<h2>ThinkPad分区说明(隐藏分区系统)</h2>
<div>参考水木Notebook精华区文章，所需文件见附件:<br />
1、<strong>不破坏<span>隐藏</span>
<span>分区</span>
的方式</strong>
：<br />
分区前&quot;开始&quot;---&gt;&quot;运行&quot;---&gt;&quot;cmd&quot;，然后运行&quot;chkdsk /f&quot;，检查硬盘后再分区通常即可不破坏<span>一键恢复</span>
;<br />
<br />
2、<strong>已分区，未破坏<span>隐藏分区</span>
，但一键恢复不可用的解决方法</strong>
：<br />
&nbsp; &nbsp;A、同上进入命令行，运行&quot;c:\ibmtools\utils\bmgr32.exe /fc:bootmgr.bin /M2 /IBM&quot;(新出来的T60/X60已不叫ibmtools改为SWTools,搜索对应bmgr32.exe命令)</div>
<p>
<span style="color: #ff0033;">(试了一下,bmgr32.exe的位置不在这个位置,可以在C盘找一下吧...然后在CMD下进入那个目录,&quot;bmgr32.exe&nbsp;&nbsp;&nbsp; /fc:bootmgr.bin&nbsp;&nbsp; /M2&nbsp;&nbsp;&nbsp; /IBM&quot; 命令中的空格只一个就行,这里为了大家分清楚点我加的)</span>
<br />
&nbsp;&nbsp;&nbsp;B、重启，按F11进入一键恢复，退出重启；<br />
&nbsp; &nbsp;C、按<span>ThinkVantage</span>
键，进入文本界面，可相应设置部分选项；<br />
&nbsp; &nbsp;D、重启，再按ThinkVantange键，出错，按esc可进入恢复界面，退出重启；<br />
&nbsp; &nbsp;E、进入xp,再次进行A操作；<br />
&nbsp; &nbsp;F、重启，ThinkVantange键即可直接进入一键恢复</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sunrie.javaeye.com/blog/212190#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Jul 2008 09:53:33 +0800</pubDate>
        <link>http://sunrie.javaeye.com/blog/212190</link>
        <guid>http://sunrie.javaeye.com/blog/212190</guid>
      </item>
          <item>
        <title>Windows下Oracle进程启动和关闭</title>
        <author>sunrie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunrie.javaeye.com">sunrie</a>&nbsp;
                    链接：<a href="http://sunrie.javaeye.com/blog/120956" style="color:red;">http://sunrie.javaeye.com/blog/120956</a>&nbsp;
          发表时间: 2007年09月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>启动进程：<br />
dbstart.cmd<br />
<br />
</strong>REM &quot;dbstart.cmd&quot;<br />
@echo off<br />
if &quot;%1&quot; == &quot;&quot; goto ERROR<br />
set ORASID=&quot;%1&quot;<br />
set ORAHOME=&quot;oracle&quot;<br />
net start OracleService%ORASID%<br />
REM net start Oracle%ORAHOME%HTTPServer<br />
net start Oracle%ORAHOME%TNSListener<br />
REM net start Oracle%ORAHOME%ClientCache<br />
REM net start Oracle%ORAHOME%Agent<br />
REM net start Oracle%ORAHOME%SNMPPeerEncapsulator<br />
REM net start Oracle%ORAHOME%SNMPPeerMasterAgent<br />
REM net start Oracle%ORAHOME%PagingServer<br />
REM net start OracleMTSRecoverService<br />
goto END<br />
<br />
<strong>关闭进程：</strong><br />
<strong>dbshut.cmd</strong><br />
<br />
REM &quot;dbshut.cmd&quot;<br />
@echo off<br />
if &quot;%1&quot; == &quot;&quot; goto ERROR<br />
set ORASID=&quot;%1&quot;<br />
set ORAHOME=&quot;oracle&quot;<br />
net stop OracleService%ORASID%<br />
REM net stop Oracle%ORAHOME%HTTPServer<br />
net stop Oracle%ORAHOME%TNSListener<br />
REM net stop Oracle%ORAHOME%ClientCache<br />
REM net stop Oracle%ORAHOME%Agent<br />
REM net stop Oracle%ORAHOME%SNMPPeerEncapsulator<br />
REM net stop Oracle%ORAHOME%SNMPPeerMasterAgent<br />
REM net stop Oracle%ORAHOME%PagingServer<br />
REM net stop OracleMTSRecoverService<br />
goto END<br />
<br />
:ERROR<br />
@echo 启动数据库未指定！<br />
<br />
:END<br />
@echo on<br />
<br />
<strong> 使用方式：</strong><br />
<br />
<strong>启动TDB数据库：</strong><br />
<strong>dbstart.cmd</strong><br />
REM &quot;tdbstart.cmd&quot;<br />
@echo off<br />
call dbstart.cmd TDB<br />
@echo on<br />
<br />
<strong>关闭TDB数据库：</strong><br />
<strong>dbshut.cmd</strong><br />
REM &quot;tdbshut.cmd&quot;<br />
@echo off<br />
call dbshut.cmd TDB<br />
@echo on
          <br/><br/>
          <span style="color:red;">
            <a href="http://sunrie.javaeye.com/blog/120956#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 06 Sep 2007 09:32:28 +0800</pubDate>
        <link>http://sunrie.javaeye.com/blog/120956</link>
        <guid>http://sunrie.javaeye.com/blog/120956</guid>
      </item>
          <item>
        <title>字符串截取（中文长度为2）</title>
        <author>sunrie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunrie.javaeye.com">sunrie</a>&nbsp;
                    链接：<a href="http://sunrie.javaeye.com/blog/115608" style="color:red;">http://sunrie.javaeye.com/blog/115608</a>&nbsp;
          发表时间: 2007年08月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">StringTrimUtils，使用charArray，Java内部使用unicode，不用在意编码<br />
java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@author sunrie</span></span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;StringTrimUtils&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;截取一段字符的长度(汉、日、韩文字符长度为2),不区分中英文,如果数字不正好，则少取一个字符位</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;str&nbsp;原始字符串</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;specialCharsLength&nbsp;截取长度(汉、日、韩文字符长度为2)</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;trim(String&nbsp;str,&nbsp;</span><span class="keyword">int</span><span>&nbsp;specialCharsLength)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(str&nbsp;==&nbsp;</span><span class="keyword">null</span><span>&nbsp;||&nbsp;</span><span class="string">&quot;&quot;</span><span>.equals(str)&nbsp;||&nbsp;specialCharsLength&nbsp;&lt;&nbsp;</span><span class="number">1</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">char</span><span>[]&nbsp;chars&nbsp;=&nbsp;str.toCharArray();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;charsLength&nbsp;=&nbsp;getCharsLength(chars,&nbsp;specialCharsLength);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(chars,&nbsp;</span><span class="number">0</span><span>,&nbsp;charsLength);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取一段字符的长度，输入长度中汉、日、韩文字符长度为2，输出长度中所有字符均长度为1</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;chars&nbsp;一段字符</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;specialCharsLength&nbsp;输入长度，汉、日、韩文字符长度为2</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;输出长度，所有字符均长度为1</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getCharsLength(</span><span class="keyword">char</span><span>[]&nbsp;chars,&nbsp;</span><span class="keyword">int</span><span>&nbsp;specialCharsLength)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;count&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;normalCharsLength&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;chars.length;&nbsp;i++)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;specialCharLength&nbsp;=&nbsp;getSpecialCharLength(chars[i]);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(count&nbsp;&lt;=&nbsp;specialCharsLength&nbsp;-&nbsp;specialCharLength)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;+=&nbsp;specialCharLength;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;normalCharsLength++;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;normalCharsLength;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取字符长度：汉、日、韩文字符长度为2，ASCII码等字符长度为1</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;c&nbsp;字符</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;字符长度</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getSpecialCharLength(</span><span class="keyword">char</span><span>&nbsp;c)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(isLetter(c))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="number">1</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="number">2</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;判断一个字符是Ascill字符还是其它字符（如汉，日，韩文字符）</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;char&nbsp;c,&nbsp;需要判断的字符</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;boolean,&nbsp;返回true,Ascill字符</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;isLetter(</span><span class="keyword">char</span><span>&nbsp;c)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;k&nbsp;=&nbsp;</span><span class="number">0x80</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;c&nbsp;/&nbsp;k&nbsp;==&nbsp;</span><span class="number">0</span><span>&nbsp;?&nbsp;</span><span class="keyword">true</span><span>&nbsp;:&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<div class="code_title"><br />
SubString，网上找到的代码，加上了GBK处理，在UTF8等编码状态下也无问题<br />
java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.UnsupportedEncodingException;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SubString&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;判断一个字符是Ascill字符还是其它字符（如汉，日，韩文字符）</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;c&nbsp;需要判断的字符</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;返回true,Ascill字符</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;isLetter(</span><span class="keyword">char</span><span>&nbsp;c)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;k&nbsp;=&nbsp;</span><span class="number">0x80</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;c&nbsp;/&nbsp;k&nbsp;==&nbsp;</span><span class="number">0</span><span>&nbsp;?&nbsp;</span><span class="keyword">true</span><span>&nbsp;:&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到一个字符串的长度,显示的长度,一个汉字或日韩文长度为2,英文字符长度为1</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;s&nbsp;需要得到长度的字符串</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;i得到的字符串长度</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;length(String&nbsp;s)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(s&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">char</span><span>[]&nbsp;c&nbsp;=&nbsp;s.toCharArray();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;len&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;c.length;&nbsp;i++)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len++;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!isLetter(c[i]))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len++;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;len;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;截取一段字符的长度,不区分中英文,如果数字不正好，则少取一个字符位</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;origin&nbsp;原始字符串</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;len&nbsp;截取长度(一个汉字长度按2算的)</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;c&nbsp;后缀&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;返回的字符串</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;substring(String&nbsp;origin,&nbsp;</span><span class="keyword">int</span><span>&nbsp;len,String&nbsp;c)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(origin&nbsp;==&nbsp;</span><span class="keyword">null</span><span>&nbsp;||&nbsp;origin.equals(</span><span class="string">&quot;&quot;</span><span>)&nbsp;||&nbsp;len&nbsp;&lt;&nbsp;</span><span class="number">1</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">byte</span><span>[]&nbsp;strByte&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[len];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(len&nbsp;&gt;&nbsp;length(origin))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;origin+c;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(origin.getBytes(<span class="string">&quot;GBK&quot;</span><span>),&nbsp;</span><span class="number">0</span><span>,&nbsp;strByte,&nbsp;</span><span class="number">0</span><span>,&nbsp;len);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;count&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;i++)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;value&nbsp;=&nbsp;(</span><span class="keyword">int</span><span>)&nbsp;strByte[i];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(value&nbsp;&lt;&nbsp;</span><span class="number">0</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(count&nbsp;%&nbsp;</span><span class="number">2</span><span>&nbsp;!=&nbsp;</span><span class="number">0</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;(len&nbsp;==&nbsp;<span class="number">1</span><span>)&nbsp;?&nbsp;++len&nbsp;:&nbsp;--len;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(strByte,&nbsp;</span><span class="number">0</span><span>,&nbsp;len,&nbsp;</span><span class="string">&quot;GBK&quot;</span><span>)+c;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(UnsupportedEncodingException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(e);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sunrie.javaeye.com/blog/115608#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 23 Aug 2007 11:19:00 +0800</pubDate>
        <link>http://sunrie.javaeye.com/blog/115608</link>
        <guid>http://sunrie.javaeye.com/blog/115608</guid>
      </item>
          <item>
        <title>用ant进行war打包</title>
        <author>sunrie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunrie.javaeye.com">sunrie</a>&nbsp;
                    链接：<a href="http://sunrie.javaeye.com/blog/109470" style="color:red;">http://sunrie.javaeye.com/blog/109470</a>&nbsp;
          发表时间: 2007年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          还是用附件算了
          <br/><br/>
          <span style="color:red;">
            <a href="http://sunrie.javaeye.com/blog/109470#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Aug 2007 17:58:00 +0800</pubDate>
        <link>http://sunrie.javaeye.com/blog/109470</link>
        <guid>http://sunrie.javaeye.com/blog/109470</guid>
      </item>
          <item>
        <title>嵌入式Tomcat用于在Eclipse中调试</title>
        <author>sunrie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunrie.javaeye.com">sunrie</a>&nbsp;
                    链接：<a href="http://sunrie.javaeye.com/blog/108109" style="color:red;">http://sunrie.javaeye.com/blog/108109</a>&nbsp;
          发表时间: 2007年08月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">嵌入式tomcat相对于myeclipse、wtp等eclipse插件优势主要在与速度快、免部署、方便调试。<br />
<br />
首先下载嵌入式的tomcat<br />
<a href="http://apache.mirror.phpchina.com/tomcat/tomcat-5/v5.5.25/bin/apache-tomcat-5.5.25-embed.zip" target="_blank">http://apache.mirror.phpchina.com/tomcat/tomcat-5/v5.5.25/bin/apache-tomcat-5.5.25-embed.zip</a><br />
解压，假设解压路径为%CATALINA_HOME%=D:/apache-tomcat-5.5.25-embed<br />
在eclipse中Window-&gt;Preference-&gt;Java-&gt;Build Path-&gt;User Libraries中添加一个EmbedTomcat的库，将%CATALINA_HOME%/lib下的所有包都加入到该库中。<br />
在工程中加入EmbedTomcat库，加入如下2个java文件，设置好contextPath，mappingPath，以及tomcat路径，将<br />
<span><span>SimpleTomcatLauncher以DEBUG方式作为普通java application启动，即可设置断点进行调试。</span></span><br />
<br />
EmbeddedTomcatLauncher<br />
java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;per.sunrie;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.apache.catalina.Context;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.apache.catalina.Engine;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.apache.catalina.Host;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.apache.catalina.connector.Connector;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.apache.catalina.startup.Embedded;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;sunrie</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@version&nbsp;$Id$</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;EmbeddedTomcatLauncher&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;DEFAULT_PORT&nbsp;=&nbsp;</span><span class="number">8080</span><span>;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;Embedded&nbsp;tomcat;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;EmbeddedTomcatLauncher()&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initEmbedded();&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initShutdownHook();&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;String[]&nbsp;getContextsAbsolutePath();&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;String[]&nbsp;getContextsMappingPath();&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;String&nbsp;getTomcatPath();&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getPort(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;DEFAULT_PORT;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;startTomcat()&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">long</span><span>&nbsp;startTime&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tomcat.start();&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;Embedded&nbsp;Tomcat&nbsp;started&nbsp;in&nbsp;&quot;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(System.currentTimeMillis()&nbsp;-&nbsp;startTime)&nbsp;+&nbsp;<span class="string">&quot;&nbsp;ms.&quot;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;initEmbedded()&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tomcat&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Embedded();&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tomcat.setCatalinaBase(getTomcatPath());&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Host&nbsp;host&nbsp;=&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tomcat.createHost(&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;localhost&quot;</span><span>,&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tomcat.getCatalinaHome()&nbsp;+&nbsp;<span class="string">&quot;/webapps&quot;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;contexts&nbsp;=&nbsp;getContextsMappingPath();&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;contextsPath&nbsp;=&nbsp;getContextsAbsolutePath();&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;context&nbsp;=&nbsp;<span class="keyword">null</span><span>;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;contexts.length;&nbsp;++i)&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;=&nbsp;tomcat.createContext(contexts[i],&nbsp;contextsPath[i]);&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host.addChild(context);&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Engine&nbsp;engine&nbsp;=&nbsp;tomcat.createEngine();&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.setName(<span class="string">&quot;MyDevAppServer&quot;</span><span>);&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.addChild(host);&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.setDefaultHost(host.getName());&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tomcat.addEngine(engine);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;只能本机访问</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connector&nbsp;connector&nbsp;=&nbsp;tomcat.createConnector(<span class="string">&quot;localhost&quot;</span><span>,&nbsp;getPort(),&nbsp;</span><span class="keyword">false</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;可从其它机器访问</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Connector&nbsp;connector&nbsp;=&nbsp;tomcat.createConnector((InetAddress)&nbsp;null,&nbsp;getPort(),&nbsp;false);</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connector.setURIEncoding(<span class="string">&quot;UTF-8&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tomcat.addConnector(connector);&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;initShutdownHook()&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runtime.getRuntime().addShutdownHook(&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;Thread()&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;run()&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopTomcat();&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;stopTomcat()&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tomcat.stop();&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
<div class="code_title"><span><span>SimpleTomcatLauncher</span><span class="keyword"></span></span><br />
java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;per.sunrie;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.net.MalformedURLException;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;java.net.URL;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;sunrie</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@version&nbsp;$Id$</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SimpleTomcatLauncher&nbsp;</span><span class="keyword">extends</span><span>&nbsp;EmbeddedTomcatLauncher&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;SimpleTomcatLauncher().startTomcat();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;String[]&nbsp;getContextsAbsolutePath()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;String[]&nbsp;{&nbsp;getSingleContextAbsolutePath()&nbsp;};&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;String&nbsp;getSingleContextAbsolutePath()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;=&nbsp;getClass().getResource(<span class="string">&quot;/&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;URL(url,&nbsp;getSingleContextPathRelativeToClassPath());<br />
    &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String path = url.getPath();<br />
    &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;path = URLDecoder.decode(url.getPath(), <font color="#0000ff">&quot;UTF-8&quot;</font>);<br />
    &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return path;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(MalformedURLException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(e);<br />
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} catch (UnsupportedEncodingException e) {<br />
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span></span><span><span> RuntimeException(e); &nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;String&nbsp;getSingleContextPathRelativeToClassPath()&nbsp;{<br />
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//实际contextPath(与classpath的相对路径) &nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;../web&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;String[]&nbsp;getContextsMappingPath()&nbsp;{<br />
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//映射路径 &nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;String[]&nbsp;{&nbsp;</span><span class="string">&quot;/webContext&quot;</span><span>&nbsp;};&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;String&nbsp;getTomcatPath()&nbsp;{<br />
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//Tomcat的HOME &nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;/D:/apache-tomcat-5.5.25-embed&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sunrie.javaeye.com/blog/108109#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 02 Aug 2007 10:19:00 +0800</pubDate>
        <link>http://sunrie.javaeye.com/blog/108109</link>
        <guid>http://sunrie.javaeye.com/blog/108109</guid>
      </item>
          <item>
        <title>Java Servlet API中文说明文档(2)(转)</title>
        <author>sunrie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunrie.javaeye.com">sunrie</a>&nbsp;
                    链接：<a href="http://sunrie.javaeye.com/blog/105485" style="color:red;">http://sunrie.javaeye.com/blog/105485</a>&nbsp;
          发表时间: 2007年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          软件包：javax.servlet.http <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所包含的接口：HttpServletRequest；HttpServletResponse；HttpSession；HttpSessionBindingListener；HttpSessionContext。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所包含的类：Cookie；HttpServlet；HttpSessionBindingEvent；HttpUtils。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一、HttpServletRequest接口<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface HttpServletRequest extends ServletRequest;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来处理一个对Servlet的HTTP格式的请求信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、getAuthType<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getAuthType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个请求的身份验证模式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、getCookies<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Cookie[] getCookies();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个数组，该数组包含这个请求中当前的所有cookie。如果这个请求中没有cookie，返回一个空数组。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、getDateHeader<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public long getDateHeader(String name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回指定的请求头域的值，这个值被转换成一个反映自1970-1-1日（GMT）以来的精确到毫秒的长整数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果头域不能转换，抛出一个IllegalArgumentException。如果这个请求头域不存在，这个方法返回-1。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、getHeader<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getHeader(String name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个请求头域的值。（译者注：与上一个方法不同的是，该方法返回一个字符串）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个请求头域不存在，这个方法返回-1。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、getHeaderNames<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getHeaderNames();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法返回一个String对象的列表，该列表反映请求的所有头域名。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有的引擎可能不允许通过这种方法访问头域，在这种情况下，这个方法返回一个空的列表。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、getIntHeader<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getIntHeader(String name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回指定的请求头域的值，这个值被转换成一个整数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果头域不能转换，抛出一个IllegalArgumentException。如果这个请求头域不存在，这个方法返回-1。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、getMethod<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getMethod();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个请求使用的HTTP方法（例如：GET、POST、PUT）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、getPathInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getPathInfo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回在这个请求的URL的Servlet路径之后的请求URL的额外的路径信息。如果这个请求URL包括一个查询字符串，在返回值内将不包括这个查询字符串。这个路径在返回之前必须经过URL解码。如果在这个请求的URL的Servlet路径之后没有路径信息。这个方法返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、getPathTranslated<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getPathTranslated();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法获得这个请求的URL的Servlet路径之后的额外的路径信息，并将它转换成一个真实的路径。在进行转换前，这个请求的URL必须经过URL解码。如果在这个URL的Servlet路径之后没有附加路径信息。这个方法返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10、getQueryString<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getQueryString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个请求URL所包含的查询字符串。一个查询字串符在一个URL中由一个&ldquo;？&rdquo;引出。如果没有查询字符串，这个方法返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11、getRemoteUser<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getRemoteUser<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回作了请求的用户名，这个信息用来作HTTP用户论证。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果在请求中没有用户名信息，这个方法返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、getRequestedSessionId<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getRequestedSessionId();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个请求相应的session id。如果由于某种原因客户端提供的session id是无效的，这个session id将与在当前session中的session id不同，与此同时，将建立一个新的session。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个请求没与一个session关联，这个方法返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13、getRequestURI<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getRequestURI();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从HTTP请求的第一行返回请求的URL中定义被请求的资源的部分。如果有一个查询字符串存在，这个查询字符串将不包括在返回值当中。例如，一个请求通过 /catalog/books?id=1这样的URL路径访问，这个方法将返回/catalog/books。这个方法的返回值包括了Servlet路径和路径信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个URL路径中的的一部分经过了URL编码，这个方法的返回值在返回之前必须经过解码。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14、getServletPath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getServletPath();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回请求URL反映调用Servlet的部分。例如，一个Servlet被映射到/catalog/summer这个URL路径，而一个请求使用了/catalog/summer/casual这样的路径。所谓的反映调用Servlet的部分就是指/catalog/summer。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个Servlet不是通过路径匹配来调用。这个方法将返回一个空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15、getSession<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSession getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSession getSession(boolean create);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回与这个请求关联的当前的有效的session。如果调用这个方法时没带参数，那么在没有session与这个请求关联的情况下，将会新建一个session。如果调用这个方法时带入了一个布尔型的参数，只有当这个参数为真时，session才会被建立。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了确保session能够被完全维持。Servlet开发者必须在响应被提交之前调用该方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果带入的参数为假，而且没有session与这个请求关联。这个方法会返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16、isRequestedSessionIdValid<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isRequestedSessionIdValid();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法检查与此请求关联的session当前是不是有效。如果当前请求中使用的session无效，它将不能通过getSession方法返回。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17、isRequestedSessionIdFromCookie<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isRequestedSessionIdFromCookie();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个请求的session id是通过客户端的一个cookie提供的，该方法返回真，否则返回假。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18、isRequestedSessionIdFromURL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isRequestedSessionIdFromURL();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个请求的session id是通过客户端的URL的一部分提供的，该方法返回真，否则返回假。请注意此方法与isRequestedSessionIdFromUrl在URL的拼写上不同。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下方法将被取消\<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19、isRequestedSessionIdFromUrl<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isRequestedSessionIdFromUrl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法被isRequestedSessionIdFromURL代替。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二、HttpServletResponse接口<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义\<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface HttpServletResponse extends ServletResponse<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述一个返回到客户端的HTTP回应。这个接口允许Servlet程序员利用HTTP协议规定的头信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成员变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_CONTINUE = 100;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_SWITCHING_PROTOCOLS = 101;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_OK = 200;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_CREATED = 201;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_ACCEPTED = 202;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NO_CONTENT = 204;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_RESET_CONTENT = 205;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_PARTIAL_CONTENT = 206;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_MULTIPLE_CHOICES = 300;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_MOVED_PERMANENTLY = 301;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_MOVED_TEMPORARILY = 302;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_SEE_OTHER = 303;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NOT_MODIFIED = 304;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_USE_PROXY = 305;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_BAD_REQUEST = 400;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_UNAUTHORIZED = 401;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_PAYMENT_REQUIRED = 402;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_FORBIDDEN = 403;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NOT_FOUND = 404;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_METHOD_NOT_ALLOWED = 405;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NOT_ACCEPTABLE = 406;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_REQUEST_TIMEOUT = 408;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_CONFLICT = 409;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_GONE = 410;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_LENGTH_REQUIRED = 411;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_PRECONDITION_FAILED = 412;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_REQUEST_URI_TOO_LONG = 414;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_INTERNAL_SERVER_ERROR = 500;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_NOT_IMPLEMENTED = 501;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_BAD_GATEWAY = 502;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_SERVICE_UNAVAILABLE = 503;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_GATEWAY_TIMEOUT = 504;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上HTTP产状态码是由HTTP/1.1定义的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、addCookie<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void addCookie(Cookie cookie);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在响应中增加一个指定的cookie。可多次调用该方法以定义多个cookie。为了设置适当的头域，该方法应该在响应被提交之前调用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、containsHeader<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean containsHeader(String name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检查是否设置了指定的响应头。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、encodeRedirectURL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String encodeRedirectURL(String url);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对sendRedirect方法使用的指定URL进行编码。如果不需要编码，就直接返回这个URL。之所以提供这个附加的编码方法，是因为在 redirect的情况下，决定是否对URL进行编码的规则和一般情况有所不同。所给的URL必须是一个绝对URL。相对URL不能被接收，会抛出一个 IllegalArgumentException。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有提供给sendRedirect方法的URL都应通过这个方法运行，这样才能确保会话跟踪能够在所有浏览器中正常运行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、encodeURL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String encodeURL(String url);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对包含session ID的URL进行编码。如果不需要编码，就直接返回这个URL。Servlet引擎必须提供URL编码方法，因为在有些情况下，我们将不得不重写URL，例如，在响应对应的请求中包含一个有效的session，但是这个session不能被非URL的（例如cookie）的手段来维持。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有提供给Servlet的URL都应通过这个方法运行，这样才能确保会话跟踪能够在所有浏览器中正常运行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、sendError<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void sendError(int statusCode) throws IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void sendError(int statusCode, String message) throws<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用给定的状态码发给客户端一个错误响应。如果提供了一个message参数，这将作为响应体的一部分被发出，否则，服务器会返回错误代码所对应的标准信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用这个方法后，响应立即被提交。在调用这个方法后，Servlet不会再有更多的输出。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、sendRedirect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void sendRedirect(String location) throws IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用给定的路径，给客户端发出一个临时转向的响应（SC_MOVED_TEMPORARILY）。给定的路径必须是绝对URL。相对URL将不能被接收，会抛出一个IllegalArgumentException。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法必须在响应被提交之前调用。调用这个方法后，响应立即被提交。在调用这个方法后，Servlet不会再有更多的输出。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、setDateHeader<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setDateHeader(String name, long date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用一个给定的名称和日期值设置响应头，这里的日期值应该是反映自1970-1-1日（GMT）以来的精确到毫秒的长整数。如果响应头已经被设置，新的值将覆盖当前的值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、setHeader<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setHeader(String name, String value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用一个给定的名称和域设置响应头。如果响应头已经被设置，新的值将覆盖当前的值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、setIntHeader<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setIntHeader(String name, int value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用一个给定的名称和整形值设置响应头。如果响应头已经被设置，新的值将覆盖当前的值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10、setStatus<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setStatus(int statusCode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法设置了响应的状态码，如果状态码已经被设置，新的值将覆盖当前的值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下的几个方法将被取消\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11、encodeRedirectUrl<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String encodeRedirectUrl(String url);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法被encodeRedirectURL取代。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、encodeUrl<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String encodeUrl(String url);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法被encodeURL取代。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13、setStatus<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setStatus(int statusCode, String message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法设置了响应的状态码，如果状态码已经被设置，新的值将覆盖当前的值。如果提供了一个message，它也将会被作为响应体的一部分被发送。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三、HttpSession接口<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface HttpSession<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个接口被Servlet引擎用来实现在HTTP客户端和HTTP会话两者的关联。这种关联可能在多外连接和请求中持续一段给定的时间。session用来在无状态的HTTP协议下越过多个请求页面来维持状态和识别用户。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个session可以通过cookie或重写URL来维持。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、getCreationTime<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public long getCreationTime();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回建立session的时间，这个时间表示为自1970-1-1日（GMT）以来的毫秒数。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、getId<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getId();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回分配给这个session的标识符。一个HTTP session的标识符是一个由服务器来建立和维持的唯一的字符串。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、getLastAccessedTime<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public long getLastAccessedTime();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回客户端最后一次发出与这个session有关的请求的时间，如果这个session是新建立的，返回-1。这个时间表示为自1970-1-1日（GMT）以来的毫秒数。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、getMaxInactiveInterval<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getMaxInactiveInterval();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返加一个秒数，这个秒数表示客户端在不发出请求时，session被Servlet引擎维持的最长时间。在这个时间之后，Servlet引擎可能被Servlet引擎终止。如果这个session不会被终止，这个方法返回-1。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、getValue<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object getValue(String name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个以给定的名字绑定到session上的对象。如果不存在这样的绑定，返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、getValueNames<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String[] getValueNames();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以一个数组返回绑定到session上的所有数据的名称。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、invalidate<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void invalidate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法会终止这个session。所有绑定在这个session上的数据都会被清除。并通过HttpSessionBindingListener接口的valueUnbound方法发出通告。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、isNew<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isNew();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个布尔值以判断这个session是不是新的。如果一个session已经被服务器建立但是还没有收到相应的客户端的请求，这个session将被认为是新的。这意味着，这个客户端还没有加入会话或没有被会话公认。在他发出下一个请求时还不能返回适当的session认证信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、putValue<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void putValue(String name, Object value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以给定的名字，绑定给定的对象到session中。已存在的同名的绑定会被重置。这时会调用HttpSessionBindingListener接口的valueBound方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10、removeValue<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void removeValue(String name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取消给定名字的对象在session上的绑定。如果未找到给定名字的绑定的对象，这个方法什么出不做。 这时会调用HttpSessionBindingListener接口的valueUnbound方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当session无效后再调用这个方法会抛出一个IllegalStateException。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11、setMaxInactiveInterval<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int setMaxInactiveInterval(int interval);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置一个秒数，这个秒数表示客户端在不发出请求时，session被Servlet引擎维持的最长时间。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下这个方法将被取消\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、getSessionContext<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSessionContext getSessionContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回session在其中得以保持的环境变量。这个方法和其他所有HttpSessionContext的方法一样被取消了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 四、HttpSessionBindingListener接口<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface HttpSessionBindingListener<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个对象被加入到HTTP的session中，执行这个接口会通告有没有什么对象被绑定到这个HTTP session中或被从这个HTTP session中取消绑定。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、valueBound<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void valueBound(HttpSessionBindingEvent event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个对象被绑定到session中，调用此方法。HttpSession.putValue方法被调用时，Servlet引擎应该调用此方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、valueUnbound<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void valueUnbound(HttpSessionBindingEvent event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个对象被从session中取消绑定，调用此方法。HttpSession.removeValue方法被调用时，Servlet引擎应该调用此方法。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 五、HttpSessionContext接口<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此接口将被取消\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface HttpSessionContext<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个对象是与一组HTTP session关联的单一的实体。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个接口由于安全的原因被取消，它出现在目前的版本中仅仅是为了兼容性的原因。这个接口的方法将模拟以前的版本的定义返回相应的值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、getSession<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSession getSession(String sessionId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当初用来返回与这个session id相关的session。现在返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、getIds<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Enumeration getIds();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当初用来返回这个环境下所有session id的列表。现在返回空的列表。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 六、Cookie类\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Cookie implements Cloneable<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个类描述了一个cookie，有关cookie的定义你可以参照Netscape Communications Corporation的说明，也可以参照RFC 2109。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Cookie(String name, String value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用一个name-value对定义一个cookie。这个name必须能被HTTP/1.1所接受。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以字符$开头的name被RFC 2109保留。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给定的name如果不能被HTTP/1.1所接受，该方法抛出一个IllegalArgumentException。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、getComment<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getComment();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回描述这个cookie目的的说明，如果未定义这个说明，返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、getDomain<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getDomain();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个cookie可以出现的区域，如果未定义区域，返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、getMaxAge<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getMaxAge();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回这个cookie指定的最长存活时期。如果未定义这个最长存活时期，该方法返回-1。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、getName<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法返回cookie名。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、getPath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getPath();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个cookie有效的所有URL路径的前缀，如果未定义，返回空值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、getSecure<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean getSecure();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果这个cookie只通过安全通道传输返回真，否则返回假。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、getValue<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法返回cookie的值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、getVersion<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getVersion();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回cookie的版本。版本1由RFC 2109解释。版本0由Netscape Communications Corporation的说明解释。新构造的cookie默认使用版本0。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、setComment<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setComment(String purpose);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果一个用户将这个cookie提交给另一个用户，必须通过这个说明描述这个cookie的目的。版本0不支持这个属性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10、setDomain<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setDomain(String pattern);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法设置cookie的有效域的属性。这个属性指定了cookie可以出现的区域。一个有效域以一个点开头（.foo.com），这意味着在指定的域名解析系统的区域中（可能是www.foo.com但不是a.b.foo.com）的主机可以看到这个cookie。默认情况是，cookie只能返回保存它的主机。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11、setMaxAge<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setMaxAge(int expiry);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法设定这个cookie的最长存活时期。在该存活时期之后，cookie会被终目。负数表示这个cookie不会生效，0将从客户端删除这个cookie。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、setPath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setPath(String uri);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法设置cookie的路径属性。客户端只能向以这个给定的路径String开头的路径返回cookie。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13、setSecure<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setSecure(boolean flag);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指出这个cookie只能通过安全通道（例如HTTPS）发送。只有当产生这个cookie的服务器使用安全协议发送这个cookie值时才能这样设置。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14、setValue<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setValue(String newValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置这个cookie的值，对于二进制数据采用BASE64编码。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 版本0不能使用空格、{}、()、=、，、&ldquo;&rdquo;、/、?、@、：以及；。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15、setVersion<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setVersion(int v);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置cookie的版本号<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 七、HttpServlet类\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class HttpServlet extends GenericServlet implements <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serializable<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个抽象类，用来简化HTTP Servlet写作的过程。它是GenericServlet类的扩充，提供了一个处理HTTP协议的框架。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这个类中的service方法支持例如GET、POST这样的标准的HTTP方法。这一支持过程是通过分配他们到适当的方法（例如doGet、doPost）来实现的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、doDelete<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doDelete(HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用，用来处理一个HTTP DELETE操作。这个操作允许客户端请求从服务器上删除URL。这一操作可能有负面影响，对此用户就负起责任。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当你要处理DELETE请求时，你必须重载这一方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、doGet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doGet(HttpServletRequest request, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用，用来处理一个HTTP GET操作。这个操作允许客户端简单地从一个HTTP服务器&ldquo;获得&rdquo;资源。对这个方法的重载将自动地支持HEAD方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GET操作应该是安全而且没有负面影响的。这个操作也应该可以安全地重复。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、doHead<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doHead(HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用，用来处理一个HTTP HEAD操作。默认的情况是，这个操作会按照一个无条件的GET方法来执行，该操作不向客户端返回任何数据，而仅仅是返回包含内容长度的头信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与GET操作一样，这个操作应该是安全而且没有负面影响的。这个操作也应该可以安全地重复。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法的默认执行结果是自动处理HTTP HEAD操作，这个方法不需要被一个子类执行。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、doOptions<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doOptions(HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用，用来处理一个HTTP OPTION操作。这个操作自动地决定支持哪一种HTTP方法。例如，一个Servlet写了一个HttpServlet的子类并重载了doGet方法，doOption会返回下面的头：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Allow: GET,HEAD,TRACE,OPTIONS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你一般不需要重载这个方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、doPost<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doPost(HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用，用来处理一个HTTP POST操作。这个操作包含请求体的数据，Servlet应该按照他行事。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个操作可能有负面影响。例如更新存储的数据或在线购物。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当你要处理POST操作时，你必须在HttpServlet的子类中重载这一方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、doPut<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doPut(HttpServletRequest request, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用，用来处理一个HTTP PUT操作。这个操作类似于通过FTP发送文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个操作可能有负面影响。例如更新存储的数据或在线购物。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当你要处理PUT操作时，你必须在HttpServlet的子类中重载这一方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、doTrace<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doTrace(HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被这个类的service方法调用，用来处理一个HTTP TRACE操作。这个操作的默认执行结果是产生一个响应，这个响应包含一个反映trace请求中发送的所有头域的信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当你开发Servlet时，在多数情况下你需要重载这个方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、getLastModified<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected long getLastModified(HttpServletRequest request);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回这个请求实体的最后修改时间。为了支持GET操作，你必须重载这一方法，以精确地反映最后修改的时间。这将有助于浏览器和代理服务器减少装载服务器和网络资源，从而更加有效地工作。返回的数值是自1970-1-1日（GMT）以来的毫秒数。 <br />
默认的执行结果是返回一个负数，这标志着最后修改时间未知，它也不能被一个有条件的GET操作使用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、service<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void service(HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response) throws ServletException,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void service(ServletRequest request, ServletResponse response)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException, IOException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个Servlet的HTTP-specific方案，它分配请求到这个类的支持这个请求的其他方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当你开发Servlet时，在多数情况下你不必重载这个方法。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 八、HttpSessionBindingEvent类\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class HttpSessionBindingEvent extends EventObject<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个事件是在监听到HttpSession发生绑定和取消绑定的情况时连通HttpSessionBindingListener的。这可能是一个session被终止或被认定无效的结果。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 事件源是HttpSession.putValue或HttpSession.removeValue。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSessionBindingEvent(HttpSession session, String name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过引起这个事件的Session和发生绑定或取消绑定的对象名构造一个新的HttpSessionBindingEvent。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、getName<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回发生绑定和取消绑定的对象的名字。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、getSession<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public HttpSession getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回发生绑定和取消绑定的session的名字。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 九、HttpUtils类\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class HttpUtils<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 收集HTTP Servlet使用的静态的有效的方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、getRequestURL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static StringBuffer getRequestURL(HttpServletRequest<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在服务器上重建客户端用来建立请求的URL。这个方法反映了不同的协议（例如http和https）和端口，但不包含查询字符串。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法返回一个StringBuffer而不是一个String，这样URL可以被Servlet开发者有效地修改。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、parsePostData<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Hashtable parsePostData(int len, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletInputstream in);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解析一个包含MIME类型application/x-www-form-urlencoded的数据的流，并创建一个具有关键值-数据对的 hash table。这里的关键值是字符串，数据是该字符串所对应的值的列表。一个关键值可以在POST的数据中出现一次或多次。这个关键值每出现一次，它的相应的值就被加入到hash table中的字符串所对应的值的列表中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从POST数据读出的数据将经过URL解码，+将被转换为空格以十六进制传送的数据（例如%xx）将被转换成字符。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当POST数据无效时，该方法抛出一个IllegalArgumentException。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、parseQueryString<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Hashtable parseQueryString(String s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解析一个查询字符串，并创建一个具有关键值-数据对的hash table。这里的数据是该字符串所对应的值的列表。一个关键值可以出现一次或多次。这个关键值每出现一次，它的相应的值就被加入到hash table中的字符串所对应的值的列表中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从查询字符串读出的数据将经过URL解码，+将被转换为空格以十六进制传送的数据（例如%xx）将被转换成字符。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当查询字符串无效时，该方法抛出一个IllegalArgumentException。<br />
<br />
术语表<br />
bytecode <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字节码：由Java编译器和Java解释程序生成的机器代码。<br />
cookie <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由Web服务器建立的数据，该数据存储在用户的计算机上，提供了一个Web站点跟踪用户的参数并存储在用户自己硬盘上的方法。<br />
HTTP <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 超文本传输协议。一个请求响应协议用来连接WWW服务器向客户端浏览器传输HTML页面。<br />
输入流对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个对象，由ServletInputStream类定义，被Servlet用来从客户端读取请求。<br />
映射<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由Servlet实例和Servlet返回数据的URL组成的一对，例如，HelloServlet和/hello/index.html。<br />
输出流对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个对象，由ServletOutputStream class类定义，被Servlet用来向客户端返回数据。<br />
request dispatcher object <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由RequestDispatcher接口定义的一个对象，用来从客户端接收请求，并将其发送到Web服务器上可用的其他资源（例如Servlet、CGI、HTML文件或JSP文件）。<br />
sandboxed servlet <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个安全性约束下运行的Servlet。<br />
servlet <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个小的，具有平台无关性的，没有图形用户界面的Java程序。它可以在许多方面扩充Web服务的功能。<br />
servlet configuration object <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletConfig接口定义的一个对象，用来配置一个Servlet。<br />
servlet context object <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext接口定义的一个对象。给予Servlet有关Servlet引擎的信息。<br />
servlet引擎<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由Web服务器提供商制作的一个环境，可以允许Servlet在具体的Web服务器上运行。<br />
servlet请求对象 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由ServletRequest接口定义的一个对象，允许Servlet获得用关客户端请求的数据。<br />
servlet response object <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由ServletResponse接口定义的一个对象，允许Servlet作出响应。<br />
servlet runner <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java Servlet Developer&rsquo;s Kit (JSDK)中的sun.servlet.http.HttpServer过程，它使得Servlet得以运行。<br />
会话跟踪 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个Web应用程序中，识别一个从同一个客户端发出的连续的唯一的请求的能力。<br />
SSL <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加密套接字协议层。一个安全协议，用来在Iternet上的客户端浏览器和服务器交换密钥和加密数据。<br />
URI <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 统一资源标识。定义一个Internet地址，它是一个URL的超集。<br />
URL <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 统一资源路径。这个地址定义了到达一个WWW上的文件的路线，通常由协议前缀、域名、目录名和文件名组成。
          <br/><br/>
          <span style="color:red;">
            <a href="http://sunrie.javaeye.com/blog/105485#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jul 2007 21:09:50 +0800</pubDate>
        <link>http://sunrie.javaeye.com/blog/105485</link>
        <guid>http://sunrie.javaeye.com/blog/105485</guid>
      </item>
          <item>
        <title>Java Servlet API中文说明文档(转)</title>
        <author>sunrie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunrie.javaeye.com">sunrie</a>&nbsp;
                    链接：<a href="http://sunrie.javaeye.com/blog/105483" style="color:red;">http://sunrie.javaeye.com/blog/105483</a>&nbsp;
          发表时间: 2007年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Java Servlet API中文说明文档<br />
译者前言：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 近来在整理有关Servlet资料时发现，在网上竟然找不到一份中文的Java Servlet API的说明文档，而在有一本有关JSP的书后面附的Java Servlet API说明竟然不全，而这份文档的2.1a版在1998年的11月份就已定稿。所以我决定翻译一份中文的文档（其中一些与技术关系不大的部分已被略去），有兴趣的读者可以从http: //java.sun.com/products/servlet/2.1/servletspec-2.1.zip下载原文阅读。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java Servlet API说明文档（2.1a版）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1998年11月<br />
<br />
绪言<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一份关于2.1版Java Servlet API的说明文档，作为对这本文档的补充，你可以到http://java.sun.com/products/servlet/index.html下面下载Javadoc格式的文档。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 谁需要读这份文档<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这份文档描述了Java Servlet API的最新版本2.1版。所以，这本书对于Servlet的开发者及servlet引擎的开发者同样适用。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java Servlet API的组成<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java Servlet API由两个软件包组成：一个是对应HTTP的软件包，另一个是不对应HTTP的通用的软件包。这两个软件包的同时存在使得Java Servlet API能够适应将来的其他请求-响应的协议。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这份文档以及刚才提及的Javadoc格式的文档都描述了这两个软件包，Javadoc格式的文档还描述了你应该如何使用这两个软件包中的所有方法。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有关规范<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你也许对下面的这些Internet规范感兴趣，这些规范将直接影响到Servlet API的发展和执行。你可以从http: //info.internet.isi.edu/7c/in-notes/rfc/.cache 找到下面提到的所有这些RFC规范。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 1738 统一资源定位器(URL) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 1808 相关统一资源定位器 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 1945 超文本传输协议--HTTP/1.0 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2045 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第一部分:Internet信息体格式 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2046 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第二部分:媒体类型 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2047 多用途网际邮件扩充协议(MIME)(多用途Internet邮件扩展)第三部分:信息标题扩展用于非ASCII文本 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2048 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第四部分: 注册步骤 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2049 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第五部分:一致性标准和例子 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2068 超文本传输协议 -- HTTP/1.1 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2069 一个扩展HTTP:摘要访问鉴定 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2109 HTTP状态管理机制 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2145 HTTP 版本号的使用和解释 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 2324 超文本Coffee Pot控制协议 (HTCPCP/1.0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 万维网协会（http://www.w3.org）管理着这些协议的规范和执行。<br />
<br />
<br />
有关Java Servlets<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JavaTM servlets 是一个不受平台约束的Java小程序，它可以被用来通过多种方法扩充一个Web服务器的功能。你可以把Servlet理解成Server上的 applets，它被编译成字节码，这样它就可以被动态地载入并用效地扩展主机的处理能力。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet与applets不同的地方是，它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过servlet引擎运行在Web服务器中，以执行请求和响应，请求、响应的典型范例是HTTP协议。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个客户端程序，可以是一个Web浏览器，或者是非其他的可以连接上Internet的程序，它会访问Web服务器并发出请求。这个请求被运行在Web服务器上的Servlet引擎处理，并返回响应到Servlet。Servlet通过HTTP将这个响应转发到客户端。<br />
在功能上，Servlet与CGI、NSAPI有点类似，但是，与他们不同的是：Servlet具有平台无关性。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java Servlet概论<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet与其他普通的server扩展机制有以下进步：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为它采用了不同的进程处理模式，所以它比CGI更快。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它使用了许多Web服务器都支持的标准的API。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它继承了Java的所有优势，包括易升级以及平台无关性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它可以调用Java所提供的大量的API的功能模块。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这份文档说明了Java Servlet API的类和接口的方法。有关更多的信息，请参看下面的API说明。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet的生命周期<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个Java servlet具有一个生命周期，这个生命周期定义了一个Servlet如何被载入并被初始化，如何接收请求并作出对请求的响应，如何被从服务中清除。Servlet的生命周期被javax.servlet.Servlet这个接口所定义。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有的Java Servlet都会直接地或间接地执行javax.servlet.Servlet接口，这样它才能在一个Servlet引擎中运行。 Servlet引擎是Web 服务器按照Java Servlet API定制的扩展。Servlet引擎提供网络服务，能够理解MIME请求，并提供一个运行Servlet的容器。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.servlet.Servlet接口定义了在Servlet的生命周期中特定时间以及特定顺序被调用的方法。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet的解析和载入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet引擎解析并载入一个Servlet，这个过程可以发生在引擎启动时，需要一个Servlet去响应请求时，以及在此之间的任何时候。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet引擎利用Java类载入工具载入一个Servlet，Servlet引擎可以从一个本地的文件系统、一个远程的文件系统以及网络载入Servlet。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet的初始化<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet引擎载入Servlet后，Servlet引擎必须对Servlet进行初始化，在这一过程中，你可以读取一些固定存储的数据、初始化JDBC的连接以及建立与其他资源的连接。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在初始化过程中，javax.servlet.Servlet接口的init()方法提供了Servlet的初始化信息。这样，Servlet可以对自己进行配置。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init()方法获得了一个Servlet配置对象（ServletConfig）。这个对象在Servlet引擎中执行，并允许Servlet通过它获处相关参数。这个对象使得Servlet能够访问ServletContext对象。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet处理请求<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet被初始化之后，它已经可以处理来自客户端的请求，每一个来自客户端的请求都被描述成一个ServletRequest对象，Servlet的响应被描述成一个ServletResponse对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当客户端发出请求时，Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象，这两个对象作为参数传递到service()方法中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet 也可以执行ServletRequest接口和ServletResponse接口。ServletRequest接口使得Servlet有权使用客户端发出的请求。Servlet可以通过ServletInputStream对象读取请求信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletResponse接口允许Servlet建立响应头和状态代码。通过执行这个接口，Servlet有权使用ServletOutputStream类来向客户端返回数据。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多线程和映射<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在多线程的环境下，Servlet必须能处理许多同时发生的请求。例外的情况是这个Servlet执行了SingleThreadModel接口，如果是那样的话，Servlet只能同时处理一个请求。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet依照Servlet引擎的映射来响应客户端的请求。一个映射对包括一个Servlet实例以及一个Servlet返回数据的URL，例如：HelloServlet with /hello/index.html。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然而，一个映射可能是由一个URL和许多Servlet实例组成，例如：一个分布式的Servlet引擎可能运行在不止一个的服务器中，这样的话，每一个服务器中都可能有一个Servlet实例，以平衡进程的载入。作为一个Servlet的开发者，你不能假定一个Servlet只有一个实例。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet的卸载<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet引擎并不必需保证一个Servlet在任何时候或在服务开启的任何时候都被载入。Servlet引擎可以自由的在任何时候使用或清除一个Servlet。因此，我们不能依赖一个类或实例来存储重要的信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当Servlet引擎决定卸载一个Servlet时（例如，如果这个引擎被关闭或者需要让资源），这个引擎必须允许Servlet释放正在使用的资源并存储有关资料。为了完成以上工作，引擎会调用Servlet的destroy()方法。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在卸载一个Servlet之前，Servlet引擎必须等待所有的service()方法完成或超时结束（Servlet引擎会对超时作出定义）。当一个 Servlet被卸载时，引擎将不能给Servlet发送任何请求。引擎必须释放Servlet并完成无用存储单元的收集<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet映射技术<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作为一个Servlet引擎的开发者，你必须对于如何映射客户端的请求到Servlet有大量的适应性。这份说明文档不规定映射如何发生。但是，你必须能够自由地运用下面的所有技术：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 映射一个Servlet到一个URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如，你可以指定一个特殊的Servlet它仅被来自/feedback/index.html的请求调用。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 映射一个Servlet到以一个指定的目录名开始的所有URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如，你可以映射一个Servlet到/catalog，这样来自/catalog/、 /catalog/garden和 /catalog/housewares/index.html的请求都会被映射到这个Servlet。但是来自/catalogtwo 或 /catalog.html的请求没被映射。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 映射一个Servlet到所有以一个特定的字段结尾的所有URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如，你可以映射一个来自于所有以in.thtml结尾的请求到一个特定的Servlet。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 映射一个Servlet到一个特殊的URL /servlet/servlet_name。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如，如果你建立了一个名叫listattributes的Servlet，你可以通过使用/servlet/listattributes来访问这个Servlet。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过类名调用Servlet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如，如果Servlet引擎接收了来自/servlet/com.foo.servlet.MailServlet的请求，Servlet引擎会载入这个com.foo.servlet.MailServlet类，建立实例，并通过这个Servlet来处理请求。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext 接口定义了一个Servlet环境对象，这个对象定义了一个在Servlet引擎上的Servlet的视图。通过使用这个对象，Servlet可以记录事件、得到资源并得到来自Servlet引擎的类（例如RequestDispatcher对象）。一个Servlet只能运行在一个Servlet环境中，但是不同的Servlet可以在Servlet引擎上有不同的视图。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果Servlet引擎支持虚拟主机，每个虚拟主机有一个Servlet环境。一个Servlet环境不能在虚拟主机之间共享。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Servlet引擎能够允许一个Servlet环境有它自己的活动范围。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如，一个Servlet环境是属于bank应用的，它将被映射到/bank目录下。在这种情况下，一个对getContext方法的调用会返回/bank的Servlet环境。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP会话<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP是一个没有状态的协议。要建立一个有效的Web服务应用，你必须能够识别一个连续