﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-没有眼泪</title><link>http://www.blogjava.net/zhangchao/</link><description>Don't Cry!</description><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 04:31:43 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 04:31:43 GMT</pubDate><ttl>60</ttl><item><title>get和post乱码解决</title><link>http://www.blogjava.net/zhangchao/archive/2013/07/27/402039.html</link><dc:creator>zhangchao</dc:creator><author>zhangchao</author><pubDate>Sat, 27 Jul 2013 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/zhangchao/archive/2013/07/27/402039.html</guid><wfw:comment>http://www.blogjava.net/zhangchao/comments/402039.html</wfw:comment><comments>http://www.blogjava.net/zhangchao/archive/2013/07/27/402039.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangchao/comments/commentRss/402039.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangchao/services/trackbacks/402039.html</trackback:ping><description><![CDATA[<span style="font-family: Courier; ">在javaweb开发过程中get和post乱码是一个老生常谈的话题了，相信人人都遇到过。网上的文章也很多，但往往是看的越多就越糊涂，有些东西只有自己了然于心才能真正地明白。下面就写一篇文章，就乱码产生的过程分析一下。</span><br /><span class="Apple-style-span" style="font-family: Courier; ">为什么会产生乱码？<br /></span><span class="Apple-style-span" style="font-family: 宋体; "><span style="font-size:10.5pt;font-family:宋体;Times New Roman&quot;;"><br /><div><p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span style="font-family: Courier; ">1.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp; &nbsp;</span></span></span><span style="font-family: Courier; ">为什么会产生乱码？</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">因为浏览器不允许提交非</span><span style="font-family: Courier; ">ASCII</span><span style="font-family: Courier; ">字符，如果提交了非</span><span style="font-family: Courier; ">ASCII</span><span style="font-family: Courier; ">，则浏览器自动对其进行编码，将它们转换为</span><span style="font-family: Courier; ">ASCII</span><span style="font-family: Courier; ">字符。根据浏览器的不同，转换时使用的编码也不同，比如有些浏览器会使用</span><span style="font-family: Courier; ">utf-8</span><span style="font-family: Courier; ">进行编码，而有些会使用</span><span style="font-family: Courier; ">gbk</span><span style="font-family: Courier; ">进行编码。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span style="font-family: Courier; ">2.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp; &nbsp;</span></span></span><span style="font-family: Courier; ">浏览器为什么不允许提交非</span><span style="font-family: Courier; ">ASCII</span><span style="font-family: Courier; ">字符？</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">以下是我个人观点，仅供参考。</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">因为浏览器和服务器通信，传输的都是字节。而我们在页面提交的都是字符，所以浏览器底层就有一个将字符转换为字节的过程，这个过程涉及到编码，浏览器到底是用</span><span style="font-family: Courier; ">utf-8</span><span style="font-family: Courier; ">、</span><span style="font-family: Courier; ">gbk</span><span style="font-family: Courier; ">还是</span><span style="font-family: Courier; ">iso-8859-1</span><span style="font-family: Courier; ">将字符转换为字节呢？我想应该是</span><span style="font-family: Courier; ">iso-8859-1</span><span style="font-family: Courier; ">，因为这是西欧默认使用的编码。何况，也没有任何理由使用前两种编码格式。但是</span><span style="font-family: Courier; ">iso-8859-1</span><span style="font-family: Courier; ">编码是不能识别中文以及其他非</span><span style="font-family: Courier; ">ASCII</span><span style="font-family: Courier; ">字符的，所以如果字符中存在这类字符，那么将字符转换为字节的过程中势必会产生乱码。为了避免这种情况的发生，浏览器自动对非</span><span style="font-family: Courier; ">ASCII</span><span style="font-family: Courier; ">字符进行了编码，将这类字符转换为</span><span style="font-family: Courier; ">ASCII</span><span style="font-family: Courier; ">字符，这样就能避免乱码问题。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span style="font-family: Courier; ">3.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp; &nbsp;</span></span></span><span style="font-family: Courier; ">GET</span><span style="font-family: Courier; ">和</span><span style="font-family: Courier; ">POST</span><span style="font-family: Courier; ">提交表单，分别根据什么对非</span><span style="font-family: Courier; ">ASCII</span><span style="font-family: Courier; ">字符进行编码？</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">GET</span><span style="font-family: Courier; ">：</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">情况比较复杂，不同浏览器也不一样，有的使用</span><span style="font-family: Courier; ">gbk</span><span style="font-family: Courier; ">，有的使用</span><span style="font-family: Courier; ">utf-8</span><span style="font-family: Courier; ">不好一概而论。</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">POST</span><span style="font-family: Courier; ">：</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">浏览器会根据网页编码对表单中的数据编码。比如我们在</span><span style="font-family: Courier; ">jsp</span><span style="font-family: Courier; ">页面第一行所写的：</span><span style="font-family: Courier; ">&lt;%@page contentType="text/html;charset=UTF-8"%&gt;</span><span style="font-family: Courier; ">。那么这个网页响应给客户端后使用的就是</span><span style="font-family: Courier; ">utf-8</span><span style="font-family: Courier; ">编码，那么</span><span style="font-family: Courier; ">post</span><span style="font-family: Courier; ">时使用的也是这个编码。</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">编码后的格式可以参考</span><span style="font-family: Courier; ">java</span><span style="font-family: Courier; ">中的</span><span style="font-family: Courier; ">URLEncoder.encode</span><span style="font-family: Courier; ">方法编码的结果。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span style="font-family: Courier; ">4.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-family: Courier; ">服务器底层如何处理提交的数据。</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">上面</span><span style="font-family: Courier; ">2</span><span style="font-family: Courier; ">已经提到，客户端和服务器端传输的是字节，那么服务器端接收到的原始数据就是字节。但是我们的程序通常需要从服务器获取字符，而不是字节，所以服务器端必须将字节转换为字符。这里也涉及编码，服务器采取什么编码方式将字节转换为字符？我想也是</span><span style="font-family: Courier; ">iso-8859-1</span><span style="font-family: Courier; ">，这样和客户端的编码方式一致，不会产生乱码，相当于一个还原字符的过程。这里有个问题，比如客户端发送：</span><span style="font-family: Courier; ">name=%D6%D0%B9%FA</span><span style="font-family: Courier; ">，那么服务器端还原后也是：</span><span style="font-family: Courier; ">name=%D6%D0%B9%FA</span><span style="font-family: Courier; ">。那么我们使用</span><span style="font-family: Courier; ">request.getParameter(&#8220;name&#8221;)</span><span style="font-family: Courier; ">如何能得到正确的值呢？难道要我们自己再进行转换？答案是：</span><span style="font-family: Courier; ">NO</span><span style="font-family: Courier; ">。根据</span><span style="font-family: Courier; ">Servlet</span><span style="font-family: Courier; ">规范，</span><span style="font-family: Courier; ">Servlet</span><span style="font-family: Courier; ">中获取数据的方法会按照指定的字符集解码。指定的字符集是什么？默认是</span><span style="font-family: Courier; ">iso-8859-1</span><span style="font-family: Courier; ">。正是因为使用了</span><span style="font-family: Courier; ">iso-8859-1</span><span style="font-family: Courier; ">解码我们发送的参数，导致了乱码的产生，这里才是产生乱码的源头。具体解码的过程可以看看</span><span style="font-family: Courier; ">java</span><span style="font-family: Courier; ">的</span><span style="font-family: Courier; ">URLDecode.decode</span><span style="font-family: Courier; ">方法。既然知道了产生乱码的原因是因为服务器默认使用</span><span style="font-family: Courier; ">iso-8859-1</span><span style="font-family: Courier; ">解码，那我们就得想办法更改服务器使用的解码编码。好在服务器已经提供给我们修改的方式了，我们可以在服务器中进行配置，比如</span><span style="font-family: Courier; ">Tomcat</span><span style="font-family: Courier; ">可以在</span><span style="font-family: Courier; ">server.xml</span><span style="font-family: Courier; ">中进行配置，比如：</span><span style="font-family: Courier; ">URIEncoding=</span><span style="font-family: Courier; ">"GBK"</span><span style="font-family: Courier; ">这样服务器就会使用gbk</span><span style="font-family: Courier; ">编码解码</span><span style="font-family: Courier; ">，这种方式主要针对</span><span style="font-family: Courier; ">GET</span><span style="font-family: Courier; ">提交的数据，对于</span><span style="font-family: Courier; ">POST</span><span style="font-family: Courier; ">更常用的是</span><span style="font-family: Courier; ">request.setCharacterEncoding(String charset)</span><span style="font-family: Courier; ">设置解码编码。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span style="font-family: Courier; ">5.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-family: Courier; ">为了避免乱码，客户端应该如何做？</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">GET</span><span style="font-family: Courier; ">：</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">对于含有非</span><span style="font-family: Courier; ">ASCII</span><span style="font-family: Courier; ">字符的</span><span style="font-family: Courier; ">URL</span><span style="font-family: Courier; ">自己进行编码，比如使用</span><span style="font-family: Courier; ">javascript</span><span style="font-family: Courier; ">中的方法进行编码。这样就不需要浏览器为我们编码了，从而解决了浏览器编码的不确定性。</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">POST</span><span style="font-family: Courier; ">：</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family: Courier; ">只要正确设置网页编码即可。</span></p></div></span></span><img src ="http://www.blogjava.net/zhangchao/aggbug/402039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangchao/" target="_blank">zhangchao</a> 2013-07-27 16:56 <a href="http://www.blogjava.net/zhangchao/archive/2013/07/27/402039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java编码问题汇总</title><link>http://www.blogjava.net/zhangchao/archive/2011/05/26/351051.html</link><dc:creator>zhangchao</dc:creator><author>zhangchao</author><pubDate>Thu, 26 May 2011 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/zhangchao/archive/2011/05/26/351051.html</guid><wfw:comment>http://www.blogjava.net/zhangchao/comments/351051.html</wfw:comment><comments>http://www.blogjava.net/zhangchao/archive/2011/05/26/351051.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangchao/comments/commentRss/351051.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangchao/services/trackbacks/351051.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 工作中经常遇到java编码问题，由于缺乏研究，总是无法给出确切的答案，这个周末在网上查了一些资料，在此做些汇总。  &nbsp;&nbsp;&nbsp; 问题一：在java中读取文件时应该采用什么编码？  Java读取文件的方式总体可以分为两类：按字节读取和按字符读取。按字节读取就是采用InputStream.read()方法来读取字节，然后保存到一个byte[]数组中，最后经常用new Stri...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhangchao/archive/2011/05/26/351051.html'>阅读全文</a><img src ="http://www.blogjava.net/zhangchao/aggbug/351051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangchao/" target="_blank">zhangchao</a> 2011-05-26 10:35 <a href="http://www.blogjava.net/zhangchao/archive/2011/05/26/351051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入研究Servlet线程安全性问题</title><link>http://www.blogjava.net/zhangchao/archive/2009/05/31/279163.html</link><dc:creator>zhangchao</dc:creator><author>zhangchao</author><pubDate>Sun, 31 May 2009 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/zhangchao/archive/2009/05/31/279163.html</guid><wfw:comment>http://www.blogjava.net/zhangchao/comments/279163.html</wfw:comment><comments>http://www.blogjava.net/zhangchao/archive/2009/05/31/279163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangchao/comments/commentRss/279163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangchao/services/trackbacks/279163.html</trackback:ping><description><![CDATA[Servlet/JSP技术和ASP、PHP等相比，由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的，所
以，在编写代码时需要非常细致地考虑多线程的安全性问题。然而，很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题，这往往造成编写
的程序在少量用户访问时没有任何问题，而在并发用户上升到一定值时，就会经常出现一些莫明其妙的问题。
<p>　　Servlet的多线程机制</p>
<p>
Servlet体系结构是建立在Java多线程机制之上的，它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet
时，Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时，一般不会再实例化该
Servlet类，也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行，如图1所示。</p>
<p>　　<img src="http://www.feeten.cn/article/UploadPic/2009-1/200912181631955.jpg" onload="return imgresize(this);" onclick="javascript:window.open(this.src);" style="cursor: pointer;"  alt="" /></p>
<p>　　图1 Servlet线程池</p>
<p>　　这样，当两个或多个线程同时访问同一个Servlet时，可能会发生多个线程同时访问同一资源的情况，数据可能会变得不一致。所以在用Servlet构建的Web应用时如果不注意线程安全的问题，会使所写的Servlet程序有难以发现的错误。</p>
<p>　　Servlet的线程安全问题</p>
<p>　　Servlet的线程安全问题主要是由于实例变量使用不当而引起的，这里以一个现实的例子来说明。</p>
<code>Import javax.servlet. *;<br />
Import javax.servlet.http. *;<br />
Import java.io. *;<br />
Public class Concurrent Test extends HttpServlet {PrintWriter output;<br />
Public void service (HttpServletRequest request,<br />
HttpServletResponse response) throws ServletException, IOException {String username;<br />
Response.setContentType ("text/html; charset=gb2312");<br />
Username = request.getParameter ("username");<br />
Output = response.getWriter ();<br />
Try {Thread. sleep (5000); //为了突出并发问题，在这设置一个延时<br />
} Catch (Interrupted Exception e){}<br />
output.println("用户名:"+Username+"&lt;BR&gt;");<br />
}<br />
}</code>
<p>
该Servlet中定义了一个实例变量output，在service方法将其赋值为用户的输出。当一个用户访问该Servlet时，程序会正常的运
行，但当多个用户并发访问时，就可能会出现其它用户的信息显示在另外一些用户的浏览器上的问题。这是一个严重的问题。为了突出并发问题，便于测试、观察，
我们在回显用户信息时执行了一个延时的操作。假设已在web.xml配置文件中注册了该Servlet，现有两个用户a和b同时访问该Servlet（可
以启动两个IE浏览器，或者在两台机器上同时访问）,即同时在浏览器中输入：</p>
<p>　　a： http://localhost: 8080/servlet/ConcurrentTest? Username=a</p>
<p>　　b： http://localhost: 8080/servlet/ConcurrentTest? Username=b</p>
<p>　　如果用户b比用户a回车的时间稍慢一点，将得到如图2所示的输出：</p>
<p>　　<img src="http://www.feeten.cn/article/UploadPic/2009-1/200912181631627.jpg" onload="return imgresize(this);" onclick="javascript:window.open(this.src);" style="cursor: pointer;"  alt="" /></p>
<p>　　图2 a用户和b用户的浏览器输出</p>
<p>
从图2中可以看到，Web服务器启动了两个线程分别处理来自用户a和用户b的请求，但是在用户a的浏览器上却得到一个空白的屏幕，用户a的信息显示在用
户b的浏览器上。该Servlet存在线程不安全问题。下面我们就从分析该实例的内存模型入手,观察不同时刻实例变量output的值来分析使该
Servlet线程不安全的原因。</p>
<p>　　Java的内存模型JMM（Java Memory
Model）JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计，系统存在一个主内存(Main
Memory)，Java中所有实例变量都储存在主存中，对于所有线程都是共享的。每条线程都有自己的工作内存(Working
Memory)，工作内存由缓存和堆栈两部分组成，缓存中保存的是主存中变量的拷贝，缓存可能并不总和主存同步，也就是缓存中变量的修改可能没有立刻写到
主存中；堆栈中保存的是线程的局部变量，线程之间无法相互直接访问堆栈中的变量。根据JMM，我们可以将论文中所讨论的Servlet实例的内存模型抽象
为图3所示的模型。</p>
<p>　　<img src="http://www.feeten.cn/article/UploadPic/2009-1/200912181631541.jpg" onload="return imgresize(this);" onclick="javascript:window.open(this.src);" style="cursor: pointer;"  alt="" /></p>
<p>　　图3 Servlet实例的JMM模型</p>
<p>　　下面根据图3所示的内存模型，来分析当用户a和b的线程（简称为a线程、b线程）并发执行时，Servlet实例中所涉及变量的变化情况及线程的执行情况，如图4所示。</p>
<table>
    <tbody>
        <tr>
            <td>调度时刻 </td>
            <td>a线程</td>
            <td>b线程</td>
        </tr>
        <tr>
            <td>T1</td>
            <td>访问Servlet页面</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>T2 </td>
            <td><br />
            </td>
            <td>访问Servlet页面</td>
        </tr>
        <tr>
            <td>T3 </td>
            <td>output=a的输出username=a休眠5000毫秒，让出CPU </td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>T4 </td>
            <td><br />
            </td>
            <td>output=b的输出（写回主存）username=b休眠5000毫秒，让出CPU</td>
        </tr>
        <tr>
            <td>T5 </td>
            <td>在用户b的浏览器上输出a线程的username的值,a线程终止。</td>
            <td>　</td>
        </tr>
        <tr>
            <td>T6</td>
            <td><br />
            </td>
            <td>在用户b的浏览器上输出b线程的username的值,b线程终止。</td>
        </tr>
    </tbody>
</table>
<p>　　图4 Servlet实例的线程调度情况</p>
<p>
从图4中可以清楚的看到，由于b线程对实例变量output的修改覆盖了a线程对实例变量output的修改，从而导致了用户a的信息显示在了用户b的
浏览器上。如果在a线程执行输出语句时，b线程对output的修改还没有刷新到主存，那么将不会出现图2所示的输出结果，因此这只是一种偶然现象，但这
更增加了程序潜在的危险性。</p>
<p>　　设计线程安全的Servlet</p>
<p>　　通过上面的分析，我们知道了实例变量不正确的使用是造成Servlet线程不安全的主要原因。下面针对该问题给出了三种解决方案并对方案的选取给出了一些参考性的建议。</p>
<p>　　1、实现 SingleThreadModel 接口</p>
<p>
该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不
会有两个线程被同时执行，当然也就不存在线程安全的问题。这种方法只要将前面的Concurrent Test类的类头定义更改为：</p>
<code>Public class Concurrent Test extends HttpServlet implements SingleThreadModel {<br />
&#8230;&#8230;&#8230;&#8230;<br />
}</code>
<p>　　2、同步对共享数据的操作</p>
<p>　　使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段，在本论文中的Servlet可以通过同步块操作来保证线程的安全。同步后的代码如下：</p>
<code>&#8230;&#8230;&#8230;&#8230;<br />
Public class Concurrent Test extends HttpServlet { &#8230;&#8230;&#8230;&#8230;<br />
Username = request.getParameter ("username");<br />
Synchronized (this){<br />
Output = response.getWriter ();<br />
Try {<br />
Thread. Sleep (5000);<br />
} Catch (Interrupted Exception e){}<br />
output.println("用户名:"+Username+"&lt;BR&gt;");<br />
}<br />
}<br />
}</code>
<p>　　3、避免使用实例变量</p>
<p>　　本实例中的线程安全问题是由实例变量造成的，只要在Servlet里面的任何方法里面都不使用实例变量，那么该Servlet就是线程安全的。</p>
<p>　　修正上面的Servlet代码，将实例变量改为局部变量实现同样的功能，代码如下：</p>
<code>&#8230;&#8230;<br />
Public class Concurrent Test extends HttpServlet {public void service (HttpServletRequest request, HttpServletResponse<br />
Response) throws ServletException, IOException {<br />
Print Writer output;<br />
String username;<br />
Response.setContentType ("text/html; charset=gb2312");<br />
&#8230;&#8230;<br />
}<br />
}</code>
<p>
对上面的三种方法进行测试，可以表明用它们都能设计出线程安全的Servlet程序。但是，如果一个Servlet实现了
SingleThreadModel接口，Servlet引擎将为每个新的请求创建一个单独的Servlet实例，这将引起大量的系统开销。
SingleThreadModel在Servlet2.4中已不再提倡使用；同样如果在程序中使用同步来保护要使用的共享的数据，也会使系统的性能大大
下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它，使得其同时处理客户请求的吞吐量降低，而且很多客户处于阻塞状态。另外为保证主存内容和线
程的工作内存中的数据的一致性，要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化 Servlet
中的同步代码；在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java
内存模型也可以知道，方法中的临时变量是在栈上分配空间，而且每个线程都有自己私有的栈空间，所以它们不会影响线程的安全。</p>
<p>　　小结</p>
<p>
Servlet的线程安全问题只有在大量的并发访问时才会显现出来，并且很难发现，因此在编写Servlet程序时要特别注意。线程安全问题主要是由实
例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量，那么使用同步来保护要使用的实例变量，但为保证系统的
最佳性能，应该同步可用性最小的代码路径。</p>
<p><br />
</p>
原文出处:http://www.feeten.cn/html/jsp/01/20090102181631103402.html<br />
作者:佚名
<img src ="http://www.blogjava.net/zhangchao/aggbug/279163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangchao/" target="_blank">zhangchao</a> 2009-05-31 10:06 <a href="http://www.blogjava.net/zhangchao/archive/2009/05/31/279163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.io.File中的绝对路径和相对路径.</title><link>http://www.blogjava.net/zhangchao/archive/2009/04/15/265644.html</link><dc:creator>zhangchao</dc:creator><author>zhangchao</author><pubDate>Tue, 14 Apr 2009 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/zhangchao/archive/2009/04/15/265644.html</guid><wfw:comment>http://www.blogjava.net/zhangchao/comments/265644.html</wfw:comment><comments>http://www.blogjava.net/zhangchao/archive/2009/04/15/265644.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangchao/comments/commentRss/265644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangchao/services/trackbacks/265644.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="chsdate" downloadurl=""></o:smarttagtype><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" latentstylecount="156">
</w:LatentStyles>
</xml><![endif]--><!--[if !mso]><object classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id="ieooui"></object>
<style>
st1\:*{behavior:url(#ieooui) }
</style>
<![endif]--><style>
<!-- /* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
code
{mso-ansi-font-size:12.0pt;
mso-bidi-font-size:12.0pt;
font-family:宋体;
mso-ascii-font-family:宋体;
mso-fareast-font-family:宋体;
mso-hansi-font-family:宋体;
mso-bidi-font-family:宋体;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">File</span><span style="font-family: 宋体;">类是用来构造文件或文件夹的类</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">在其构造函数中要求传入一个</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">String</span><span style="font-family: 宋体;">类型的参数</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">用于指示文件所在的路径</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">以前一直使用绝对路径作为参数</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">其实这里也可以使用相对路径</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">使用绝对路径不用说</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">很容易就能定位到文件</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">那么使用了相对路径</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">如何定位文件的呢</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">?<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">按照</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jdk Doc</span><span style="font-family: 宋体;">上的说法</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">&#8221;</span><span style="font-family: 宋体;">绝对路径名是完整的路径名，不需要任何其他信息就可以定位自身表示的文件。相反，<span style="color: red;">相对路径名必须使用来自其他路径名的信息进行解释</span>。默认情况下，</span><code><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">java.io</span></code><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"> </span><span style="font-family: 宋体;">包中的类总是根据<span style="color: red;">当前用户目录</span>来分析相对路径名。此目录由系统属性</span><span style="font-family: &quot;Courier New&quot;;"> </span><code><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">user.dir</span></code><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"> </span><span style="font-family: 宋体;">指定，<span style="color: red;">通常是</span></span><span style="font-family: &quot;Courier New&quot;; color: red;" lang="EN-US"> Java </span><span style="font-family: 宋体; color: red;">虚拟机的调用目录</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">相对路径顾名思义</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">相对于某个路径</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">那么究竟相对于什么路径我们必须弄明白</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">按照上面</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jdk</span><span style="font-family: 宋体;">文档上讲的这个路径是</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">当前用户目录</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">也就是</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">java</span><span style="font-family: 宋体;">虚拟机的调用目录</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">更明白的说这个路径其实是我们在哪里调用</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">的路径</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">举个例子</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">假设有一</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">java</span><span style="font-family: 宋体;">源文件</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Example.java</span><span style="font-family: 宋体;">在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">d</span><span style="font-family: 宋体;">盘根目录下</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">该文件不含</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">package</span><span style="font-family: 宋体;">信息</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">我们进入命令行窗口</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">然后使用</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">d:</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">命令切换到</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">d</span><span style="font-family: 宋体;">盘根目录下</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">然后用</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">javac Example.java</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">来编译此文件</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">编译无错后</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">会在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">d</span><span style="font-family: 宋体;">盘根目录下自动生成</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Example.class</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">文件</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">我们在调用</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">java Example</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">来运行该程序</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">此时我们已经启动了一个</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm,</span><span style="font-family: 宋体;">这个</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">是在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">d</span><span style="font-family: 宋体;">盘根目录下被启动的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">所以此</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">所加载的程序中</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">File</span><span style="font-family: 宋体;">类的相对路径也就是相对这个路径的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">即</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">d</span><span style="font-family: 宋体;">盘根目录</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">:D:\.</span><span style="font-family: 宋体;">同时</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"> </span><span style="font-family: 宋体;">当前用户目录</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">也是</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">D:\.</span><span style="font-family: 宋体;">在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">System.getProperty(</span><span lang="EN-US">&#8220;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">user.dir</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">);</span><span style="font-family: 宋体;">系统变量</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">user.dir</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">存放的也是这个值</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">我们可以多做几次试验</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">把</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Example.class</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">移动到不同路径下</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">同时在那些路径下</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">执行</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">java Example</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">命令启动</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm,</span><span style="font-family: 宋体;">我们会发现这个</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">当前用户目录</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">是不断变化的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">它的路径始终和我们在哪启动</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">的路径是一致的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">搞清了这些</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">我们可以使用相对路径来创建文件</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">例如</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">File
file = new File(</span><span lang="EN-US">&#8220;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">a.txt</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">);<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">File.createNewFile();<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">假设</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">是在</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">D:\</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">下启动的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">那么</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">a.txt</span><span style="font-family: 宋体;">就会生成在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">D:\a.txt;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">此外</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">这个参数还可以使用一些常用的路径表示方法</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">例如</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">或</span><span lang="EN-US">&#8221;</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.\</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">代表当前目录</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">这个目录也就是</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">启动路径</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">所以如下代码能得到当前目录完整路径</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">:</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">File f = new File(&#8220;.&#8221;);<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">String absolutePath = f.getAbsolutePath();<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">System.out.println(absolutePath);//D:\<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">最后要说说在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">eclipse</span><span style="font-family: 宋体;">中的情况</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Eclipse</span><span style="font-family: 宋体;">中启动</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">都是在项目根路径上启动的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">比如有个项目名为</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">blog,</span><span style="font-family: 宋体;">其完整路径为</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">:D:\work\IDE\workspace\blog.</span><span style="font-family: 宋体;">那么这个路径就是</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">的启动路径了</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">所以以上代码如果在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">eclipse</span><span style="font-family: 宋体;">里运行</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">则输出结果为</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">&#8221; D:\work\IDE\workspace\blog.&#8221;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tomcat</span><span style="font-family: 宋体;">中的情况</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">如果在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">tomcat</span><span style="font-family: 宋体;">中运行</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">web</span><span style="font-family: 宋体;">应用</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">此时</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-family: 宋体;">如果我们在某个类中使用如下代码</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">File f = new File(&#8220;.&#8221;);<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">String absolutePath = f.getAbsolutePath();<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">System.out.println(absolutePath);<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">那么输出的将是</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">tomcat</span><span style="font-family: 宋体;">下的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">bin</span><span style="font-family: 宋体;">目录</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">我的机器就是</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">&#8221;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> D:\work\server\jakarta-tomcat-<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">5.0.28</st1:chsdate>\bin\.</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">&#8221;,</span><span style="font-family: 宋体;">由此可以看出</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">tomcat</span><span style="font-family: 宋体;">服务器是在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">bin</span><span style="font-family: 宋体;">目录下启动</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">其实是在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">bin</span><span style="font-family: 宋体;">目录下的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">&#8221;</span><span lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">catalina.bat&#8221;</span><span style="font-family: 宋体;">文件中启动</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">jvm</span><span style="font-family: 宋体;">的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.<o:p></o:p></span></p>
<img src ="http://www.blogjava.net/zhangchao/aggbug/265644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangchao/" target="_blank">zhangchao</a> 2009-04-15 00:01 <a href="http://www.blogjava.net/zhangchao/archive/2009/04/15/265644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>session cookie详解.</title><link>http://www.blogjava.net/zhangchao/archive/2009/04/14/265643.html</link><dc:creator>zhangchao</dc:creator><author>zhangchao</author><pubDate>Tue, 14 Apr 2009 15:59:00 GMT</pubDate><guid>http://www.blogjava.net/zhangchao/archive/2009/04/14/265643.html</guid><wfw:comment>http://www.blogjava.net/zhangchao/comments/265643.html</wfw:comment><comments>http://www.blogjava.net/zhangchao/archive/2009/04/14/265643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangchao/comments/commentRss/265643.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangchao/services/trackbacks/265643.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="chmetcnv" downloadurl=""></o:smarttagtype><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" latentstylecount="156">
</w:LatentStyles>
</xml><![endif]--><!--[if !mso]><object classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id="ieooui"></object>
<style>
st1\:*{behavior:url(#ieooui) }
</style>
<![endif]--><style>
<!-- /* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
pre
{margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:宋体;
mso-bidi-font-family:宋体;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]--><span style="font-size: 10.5pt;">通常所说的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">实际上可以分为</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">2</span><span style="font-size: 10.5pt;">种</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">一种是由</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">Cookie</span><span style="font-size: 10.5pt;">对象产生的保存在客户端硬盘上的持久化的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie,</span><span style="font-size: 10.5pt;">另一种就是由</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session</span><span style="font-size: 10.5pt;">对象产生的保存在浏览器内存里的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session cookie.session cookie</span><span style="font-size: 10.5pt;">的组成是形如</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">: JSESSIONID=0EB8CEDE<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="30" unitname="a" w:st="on">030A</st1:chmetcnv>4B6FB5366317D8BF1978(tomcat</span><span style="font-size: 10.5pt;">下</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">).<o:p></o:p></span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">Session cookie</span><span style="font-size: 10.5pt;">何时产生</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">?</span><span style="font-size: 10.5pt;">当新创建一个</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session</span><span style="font-size: 10.5pt;">对象时产生</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session cookie.</span><span style="font-size: 10.5pt;">当使用</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">request.getSession()</span><span style="font-size: 10.5pt;">或</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">request.getSession(true)</span><span style="font-size: 10.5pt;">方法时</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">如果请求范围内根据</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">jsessionid</span><span style="font-size: 10.5pt;">能够找到一个对应的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session</span><span style="font-size: 10.5pt;">对象</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">则不产生</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session cookie</span><span style="font-size: 10.5pt;">也不返回给客户端保存</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">找不到则新创建一个</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session cookie</span><span style="font-size: 10.5pt;">并生成一个形如</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">JSESSIONID=0EB8CEDE<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="30" unitname="a" w:st="on">030A</st1:chmetcnv>4B6FB5366317D8BF1978(tomcat</span><span style="font-size: 10.5pt;">下</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">)</span><span style="font-size: 10.5pt;">的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session cookie</span><span style="font-size: 10.5pt;">并放在本次响应头信息中返回给客户端保存</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">客户端之前保存的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session cookie</span><span style="font-size: 10.5pt;">也将被这个</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session cookie</span><span style="font-size: 10.5pt;">所代替</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-size: 10.5pt;">与</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session cookie</span><span style="font-size: 10.5pt;">不同的是</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">如果服务器端明确使用</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">Cookie</span><span style="font-size: 10.5pt;">类来生成的持久化</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">将在每次响应中返回给客户端保存</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">不管客户端是否存在这个</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie.</span><span style="font-size: 10.5pt;">当浏览器接受</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">后</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">(</span><span style="font-size: 10.5pt;">不管是持久化</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">还是</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session cookie),</span><span style="font-size: 10.5pt;">在对同一站点进行访问时</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">会自动把这些</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">信息放在请求头信息中一起发送给服务器端</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-size: 10.5pt;">这样服务器端就能得到这些</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">来跟踪会话</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-size: 10.5pt;">向服务器端发送</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">这个过程对用户来是完全透明的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">是浏览器自动进行的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.<o:p></o:p></span>
<pre><span style="font-size: 10.5pt;">以上讨论是在浏览器接受</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">的情况下</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">下面谈谈浏览器禁用</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">的情况</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.<o:p></o:p></span></pre>
<pre><span style="font-size: 10.5pt;">如果浏览器禁用了</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie,</span><span style="font-size: 10.5pt;">那么浏览器不会接收保存服务器端存在响应头中的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">信息</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">(ie6</span><span style="font-size: 10.5pt;">有</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">bug,</span><span style="font-size: 10.5pt;">会保存</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session cookie).</span><span style="font-size: 10.5pt;">浏览器再次访问同一站点时</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">请求头信息里也不会携带任何</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">信息的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">(</span><span style="font-size: 10.5pt;">因为浏览器根禁止了该功能</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">).</span><span style="font-size: 10.5pt;">正因如此</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">服务器端接收不到客户端的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt;">信息</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">也就无法识别客户端的身份</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">从而把它当作一个新的客户对待</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt;">也就会丢失以前的会话信息</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-size: 10.5pt;">在这种情况下服务器端使用</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">request.getSession()</span><span style="font-size: 10.5pt;">或</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">request.getSession(true)</span><span style="font-size: 10.5pt;">方法时将会重新创建一个</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session.<o:p></o:p></span></pre>
<span style="font-size: 10.5pt; font-family: 宋体;">那么如何在用户禁用了</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt; font-family: 宋体;">的情况下维护会话呢</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">?</span><span style="font-size: 10.5pt; font-family: 宋体;">以上讨论我们已经知道</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt; font-family: 宋体;">服务器端判断是新的会话还是旧的会话是根据请求头中是否有一个</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">jsessionid</span><span style="font-size: 10.5pt; font-family: 宋体;">的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-size: 10.5pt; font-family: 宋体;">由于浏览器禁用了</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cookie</span><span style="font-size: 10.5pt; font-family: 宋体;">从而不会自动向服务器发送这个参数</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt; font-family: 宋体;">那么要维持会话就需要我们自己每次服务器发送请求时带上这个参数</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.url</span><span style="font-size: 10.5pt; font-family: 宋体;">重写正是这样一种技术</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt; font-family: 宋体;">只要在我们的代码中把所有向服务器发送请求的地方用</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">response.encodeRedirectUrl(String
arg0)</span><span style="font-size: 10.5pt; font-family: 宋体;">包装一下</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">,</span><span style="font-size: 10.5pt; font-family: 宋体;">这样我们请求的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">url</span><span style="font-size: 10.5pt; font-family: 宋体;">就会自动加上当前</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">session</span><span style="font-size: 10.5pt; font-family: 宋体;">对象产生的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">jsessionid.</span><span style="font-size: 10.5pt; font-family: 宋体;">服务器端也能取得这个值从而识别客户端</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.</span>
<img src ="http://www.blogjava.net/zhangchao/aggbug/265643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangchao/" target="_blank">zhangchao</a> 2009-04-14 23:59 <a href="http://www.blogjava.net/zhangchao/archive/2009/04/14/265643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript数组中的splice方法</title><link>http://www.blogjava.net/zhangchao/archive/2008/05/28/203462.html</link><dc:creator>zhangchao</dc:creator><author>zhangchao</author><pubDate>Wed, 28 May 2008 04:58:00 GMT</pubDate><guid>http://www.blogjava.net/zhangchao/archive/2008/05/28/203462.html</guid><wfw:comment>http://www.blogjava.net/zhangchao/comments/203462.html</wfw:comment><comments>http://www.blogjava.net/zhangchao/archive/2008/05/28/203462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangchao/comments/commentRss/203462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangchao/services/trackbacks/203462.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; splice方法是javascript中数组的一个方法,其功能是:可向数组删除并加入新的元素.其方法声明如下: <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">arrayObject.splice(index,howmany,element1,<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />..,elementX)</span></div>
index:必选项.指定在哪个位置加入/删除元素,必须是数字.<br />
howmany:必选项.指定有多少元素应该被删除,必须是数字,可以是"0".<br />
element1:可选.指定要加入到数组中的新元素.<br />
elementX:可选.可以加入多个元素.<br />
说明:如果howmany为0或"0",则该数组中将没有元素被删除,那么element1至elementX个参数将从index指定的位置插入到该数组中,数组中原位置的元素将后移.如果howmany不为0,则从index指定位置开始删除howmany个元素(包括index位置的元素),然后再从index开始插入element1至elementX个参数,数组中原位置的元素将后移.<br />
例1:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #000000">script&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">text/javascript</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />var&nbsp;arr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Array(</span><span style="color: #000000">5</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Jani</span><span style="color: #000000">";</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hege</span><span style="color: #000000">";</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">2</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Stale</span><span style="color: #000000">";</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">3</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Kai&nbsp;Jim</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">4</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Borge</span><span style="color: #000000">";</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />document.write(arr&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&nbsp;/&gt;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr.splice(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Lene</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />document.write(arr&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&nbsp;/&gt;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">script</span><span style="color: #000000">&gt;</span></div>
输出结果为:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Jani,Hege,Stale,Kai&nbsp;Jim,Borge<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Jani,Hege,Lene,Stale,Kai&nbsp;Jim,Borge</span></div>
例2:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #000000">script&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">text/javascript</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />var&nbsp;arr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Array(</span><span style="color: #000000">5</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Jani</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hege</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">2</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Stale</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">3</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Kai&nbsp;Jim</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">4</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Borge</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />document.write(arr&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&nbsp;/&gt;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr.splice(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Tove</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />document.write(arr);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">script</span><span style="color: #000000">&gt;</span></div>
输出结果为:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Jani,Hege,Stale,Kai&nbsp;Jim,Borge<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Jani,Hege,Tove,Kai&nbsp;Jim,Borge</span></div>
例3:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #000000">script&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">text/javascript</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />var&nbsp;arr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Array(</span><span style="color: #000000">5</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Jani</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hege</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">2</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Stale</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">3</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Kai&nbsp;Jim</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr[</span><span style="color: #000000">4</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Borge</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />document.write(arr&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&nbsp;/&gt;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />arr.splice(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">3</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Tove</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />document.write(arr);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">script</span><span style="color: #000000">&gt;</span></div>
输出结果为:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Jani,Hege,Stale,Kai&nbsp;Jim,Borge<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Jani,Hege,Tove</span></div>
<img src ="http://www.blogjava.net/zhangchao/aggbug/203462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangchao/" target="_blank">zhangchao</a> 2008-05-28 12:58 <a href="http://www.blogjava.net/zhangchao/archive/2008/05/28/203462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>离别</title><link>http://www.blogjava.net/zhangchao/archive/2008/05/09/199563.html</link><dc:creator>zhangchao</dc:creator><author>zhangchao</author><pubDate>Fri, 09 May 2008 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/zhangchao/archive/2008/05/09/199563.html</guid><wfw:comment>http://www.blogjava.net/zhangchao/comments/199563.html</wfw:comment><comments>http://www.blogjava.net/zhangchao/archive/2008/05/09/199563.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangchao/comments/commentRss/199563.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangchao/services/trackbacks/199563.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;终于到了要离开的一天,毕业之后来到这家公司,从一个毕业生成长为一个程序员,经历过许多辛酸与磨炼,回想往事,眼前浮现出曾经那一张张熟悉的面孔.谢谢曾经给过我帮助的同事与朋友,没有你们也没有今天的我,希望大家越来越好,也希望公司越来越好,也希望自己能有个美好的未来.
<img src ="http://www.blogjava.net/zhangchao/aggbug/199563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangchao/" target="_blank">zhangchao</a> 2008-05-09 17:12 <a href="http://www.blogjava.net/zhangchao/archive/2008/05/09/199563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我所理解的原型对象</title><link>http://www.blogjava.net/zhangchao/archive/2008/05/09/199550.html</link><dc:creator>zhangchao</dc:creator><author>zhangchao</author><pubDate>Fri, 09 May 2008 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/zhangchao/archive/2008/05/09/199550.html</guid><wfw:comment>http://www.blogjava.net/zhangchao/comments/199550.html</wfw:comment><comments>http://www.blogjava.net/zhangchao/archive/2008/05/09/199550.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangchao/comments/commentRss/199550.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangchao/services/trackbacks/199550.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;众所周知,javascript中的继承是通过原型对象(prototype)来实现的.原型对象是由函数的构造函数创建,它所拥有的属性能被所有对象共享.初始时原型对象指向一个Object对象,并且定义了一个constructor属性,该属性指向定义该原型对象的构造函数本身,上述过程可以理解为以下代码:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;BaseClass()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;document.write('This&nbsp;is&nbsp;BaseClass.');<br />
}<br />
BaseClass.prototype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object();<br />
BaseClass.prototype.constructor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;BaseClass;</span></div>
因为原型对象的所有属性能被构造函数创建对象共享,所以创建的对象可以访问这里的constructor属性:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BaseClass();<br />
document.write(c.constructor&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;BaseClass);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">true</span><span style="color: #008000"><br />
</span><span style="color: #000000">c.constructor();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用BaseClass函数,输出This&nbsp;is&nbsp;BaseClass.</span></div>
由于对象本身也可以自定义属性,所以在读取对象属性时js先检查该对象是否定义了该属性,如果已经定义了则使用该属性,如果没有定义则再从其原型对象中读取该属性,所以如果对象自定义的属性和其原型中的属性存在重名则自定义属性"隐藏"了其原型对象中的同名属性.例:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">c.constructor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;document.write('This&nbsp;is&nbsp;c');<br />
}<br />
c.constructor();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">This&nbsp;is&nbsp;c</span></div>
加入上述代码之后再次调用c.constructor(),则会打印出"This is c".这是因为c已自定义constructor属性"隐藏"了其原型对象中的constructor属性.当然js保证了读写的不对称性,也就是说读取一个对象的属性时有可能要从其原型对象中去读取,但写一个对象的属性时却从不涉及其原型对象,无论在一个对象加入或修改多少属性这都不影响其原型对象中属性的本来面目.比如这里c自定义了constructor属性,但这一行为并不影响其原型对象中constructor指向其构造函数这一事实,如果再创建一个对象且不自定义constructor属性,再调用constructor则依然调用对象的构造函数,例:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BaseClass();<br />
b.constructor();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用BaseClass函数,输出This&nbsp;is&nbsp;BaseClass.</span></div>
<p>很容易理解js为什么这样做,因为一个对象的行为不能影响到其他对象,否则将会造成混乱.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;理解上述规则之后让我们看看js中是如何通过原型对象实现继承的.当我们创建一个对象时,可以把该对象看成是由2部分组成的,一部分存储了该对象自己定义的属性(称为A部分),而另一个部分则存储了其构造函数所定义的原型对象引用(称为B部分),例如这里的BaseClass.prototype.当读取对象的属性时可以分为以下2步:<br />
1.js先检查该对象引用所指向的内存区域的A部分是否存在该属性,如果存在则读出.<br />
2.如果没有则再从B部分存储的引用(BaseClass.prototype)所指向的内存区域中读取该属性.</p>
<p>从步骤2开始这就是个不断往上寻找的过程,因为BaseClass.prototype所指向的内存区域也会分为A和B两个部分,如果再A部分也不存在该属性,则又会从其B部分所指向的内存区域去寻找该属性,而该内存区域也有A和B两个部分,如果A部分仍然不存在,则还要从B部分所指向的内存区域去寻找该属性,直到达到最顶层的Object类.所以在无形当中就形成了一条链,也就是我们常说的原型链.如果理解了这个过程我想也就能了解原型对象了.下面简单分析下b.constructor();的调用过程便于加深理解.<br />
1.js会在b所指向的内存区域A部分读取constructor属性.<br />
2.当发现没有该属性后再从其类的构造函数原型对象引用所指向的内存区域读取该属性.因为原型对象引用初始时指向一Object对象内存区域(BaseClass.prototype = new Object();)<br />
3.再从此Object对象的A部分寻找constructor属性.<br />
4.没有找到该属性则从其类的原型对象即Object.prototype中去寻找constructor.<br />
5.如果找到该属性则调用.<br />
6.否则,到达链的顶端,返回.<br />
到此能很清楚的知道js中是如何实现继承的,如果我们自定义的类不想继承自Object,则可以修改其prototype的指向,可以让其指向任意一个类,这样也就实现了继承自定义类,但js中所有的类都继承自Object类,所以原型链的关系仍然存在.</p>
<img src ="http://www.blogjava.net/zhangchao/aggbug/199550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangchao/" target="_blank">zhangchao</a> 2008-05-09 16:43 <a href="http://www.blogjava.net/zhangchao/archive/2008/05/09/199550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext2.0中的createDelegate方法.</title><link>http://www.blogjava.net/zhangchao/archive/2008/04/30/197562.html</link><dc:creator>zhangchao</dc:creator><author>zhangchao</author><pubDate>Wed, 30 Apr 2008 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/zhangchao/archive/2008/04/30/197562.html</guid><wfw:comment>http://www.blogjava.net/zhangchao/comments/197562.html</wfw:comment><comments>http://www.blogjava.net/zhangchao/archive/2008/04/30/197562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangchao/comments/commentRss/197562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangchao/services/trackbacks/197562.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 项目中经常使用createDelegate()方法来创建代理函数,从而改变当前函数中this的作用域.看下了源码,发现是通过js中的apply()方法来实现,想想也只能通过apply()或者call()方法来实现,因为js中只有这2个方法提供了改变当前函数内部this作用域的功能.此外,Ext中很多地方用到了call()和apply()方法,要想看懂源码,则必须先搞清这2个方法的用法.<br />
&nbsp;&nbsp;&nbsp;&nbsp;createDelegate方法声明为:
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_48_716_Open_Image" onclick="this.style.display='none'; Codehighlighter1_48_716_Open_Text.style.display='none'; Codehighlighter1_48_716_Closed_Image.style.display='inline'; Codehighlighter1_48_716_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_48_716_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_48_716_Closed_Text.style.display='none'; Codehighlighter1_48_716_Open_Image.style.display='inline'; Codehighlighter1_48_716_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">createDelegate&nbsp;:&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">(obj,&nbsp;args,&nbsp;appendArgs)</span><span id="Codehighlighter1_48_716_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_48_716_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;method&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img id="Codehighlighter1_103_709_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_709_Open_Text.style.display='none'; Codehighlighter1_103_709_Closed_Image.style.display='inline'; Codehighlighter1_103_709_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_103_709_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_103_709_Closed_Text.style.display='none'; Codehighlighter1_103_709_Open_Image.style.display='inline'; Codehighlighter1_103_709_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">()&nbsp;</span><span id="Codehighlighter1_103_709_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_103_709_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;callArgs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;args&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;arguments;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_186_319_Open_Image" onclick="this.style.display='none'; Codehighlighter1_186_319_Open_Text.style.display='none'; Codehighlighter1_186_319_Closed_Image.style.display='inline'; Codehighlighter1_186_319_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_186_319_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_186_319_Closed_Text.style.display='none'; Codehighlighter1_186_319_Open_Image.style.display='inline'; Codehighlighter1_186_319_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(appendArgs&nbsp;</span><span style="color: #000000">===</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">)</span><span id="Codehighlighter1_186_319_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_186_319_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callArgs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Array.prototype.slice.call(arguments,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callArgs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;callArgs.concat(args);<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_358_641_Open_Image" onclick="this.style.display='none'; Codehighlighter1_358_641_Open_Text.style.display='none'; Codehighlighter1_358_641_Closed_Image.style.display='inline'; Codehighlighter1_358_641_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_358_641_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_358_641_Closed_Text.style.display='none'; Codehighlighter1_358_641_Open_Image.style.display='inline'; Codehighlighter1_358_641_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">&nbsp;appendArgs&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">number</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span id="Codehighlighter1_358_641_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_358_641_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callArgs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Array.prototype.slice.call(arguments,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;copy&nbsp;arguments&nbsp;first</span><span style="color: #008000"><br />
</span><span style="color: #008080">10</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;applyArgs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[appendArgs,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">].concat(args);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;method&nbsp;call&nbsp;params</span><span style="color: #008000"><br />
</span><span style="color: #008080">11</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.prototype.splice.apply(callArgs,&nbsp;applyArgs);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;splice&nbsp;them&nbsp;in</span><span style="color: #008000"><br />
</span><span style="color: #008080">12</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;method.apply(obj&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;window,&nbsp;callArgs);<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">,</span></div>
其中obj表示函数内部this作用域的范围,args是数组,appendArgs是"Boolean或Number",如果appendArgs是Boolean型的且值为true,那么args参数将跟在调用代理方法时传入的参数后面组成数组一起传入当前方法,否则只传入args,如果appendArgs为Number型,那么args将插入到appendArgs指定的位置.<br />
注意点:<br />
1.函数内部的arguments关键字是函数执行时动态创建的,用来存储调用函数时所传入参数.这里第4行的arguments&nbsp;&nbsp; 并不指调用createDelegate方法所传入的参数(obj,args,appendArgs),而是指调用return function()时所传入的参数,即调用代理函数时所传入的参数.而args和appendArgs就是调用createDelegate方法时所传入的参数.总的来说,函数是在定义它的作用域中执行,而不是在调用它的作用域中执行.但也有特殊,比如这里的arguments.<br />
2.call和apply的区别.<br />
二者的第一个参数都是函数内部this的作用域,call的参数只能作为一串参数传入,而apply可以传入数组或arguments对象.如<br />
fun.call(window,args0,args1,.....);<br />
fun.apply(window,[1,2,3]);<br />
但要注意的是apply方法传递到函数内部的参数实际也是作为一个个参数传递的.如果在fun内部测试arguments.length的话,则长度为3.同样,我们可以采用arguments[0],arguments[1],arguments[2]来分别引用1,2,3三个参数,而不是用arguments[0][0],arguments[0][1],arguments[0][2]来引用3个参数.这样才能解释11行的代码.
<img src ="http://www.blogjava.net/zhangchao/aggbug/197562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangchao/" target="_blank">zhangchao</a> 2008-04-30 17:11 <a href="http://www.blogjava.net/zhangchao/archive/2008/04/30/197562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext中的namespace</title><link>http://www.blogjava.net/zhangchao/archive/2008/03/19/187372.html</link><dc:creator>zhangchao</dc:creator><author>zhangchao</author><pubDate>Wed, 19 Mar 2008 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhangchao/archive/2008/03/19/187372.html</guid><wfw:comment>http://www.blogjava.net/zhangchao/comments/187372.html</wfw:comment><comments>http://www.blogjava.net/zhangchao/archive/2008/03/19/187372.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangchao/comments/commentRss/187372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangchao/services/trackbacks/187372.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext2.0中,Ext类有个namespace方法,该方法的作用是把传入的参数转换成对象.使用该方法的目的主要在于可以区分类名相同的类,这有点和java中的package作用类似.让我们先看下源码:
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img id="Codehighlighter1_22_374_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_374_Open_Text.style.display='none'; Codehighlighter1_22_374_Closed_Image.style.display='inline'; Codehighlighter1_22_374_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_22_374_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_22_374_Closed_Text.style.display='none'; Codehighlighter1_22_374_Open_Image.style.display='inline'; Codehighlighter1_22_374_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000;">namespace&nbsp;:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()</span><span id="Codehighlighter1_22_374_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_22_374_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">arguments,&nbsp;o</span><span style="color: #000000;">=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,&nbsp;i,&nbsp;j,&nbsp;d,&nbsp;rt;<br />
<img id="Codehighlighter1_97_372_Open_Image" onclick="this.style.display='none'; Codehighlighter1_97_372_Open_Text.style.display='none'; Codehighlighter1_97_372_Closed_Image.style.display='inline'; Codehighlighter1_97_372_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_97_372_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_97_372_Closed_Text.style.display='none'; Codehighlighter1_97_372_Open_Image.style.display='inline'; Codehighlighter1_97_372_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">a.length;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)&nbsp;</span><span id="Codehighlighter1_97_372_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_97_372_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d</span><span style="color: #000000;">=</span><span style="color: #000000;">a[i].split(</span><span style="color: #000000;">"</span><span style="color: #000000;">.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rt&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;d[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eval('</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">&nbsp;'&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;rt&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;'&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">undefined</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span id="Codehighlighter1_210_227_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_210_227_Open_Text"><span style="color: #000000;">{'&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;rt&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;'&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_224_225_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_224_225_Open_Text"><span style="color: #000000;">{}</span></span><span style="color: #000000;">;}</span></span><span style="color: #000000;">&nbsp;o&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;rt&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;';');<br />
<img id="Codehighlighter1_298_366_Open_Image" onclick="this.style.display='none'; Codehighlighter1_298_366_Open_Text.style.display='none'; Codehighlighter1_298_366_Closed_Image.style.display='inline'; Codehighlighter1_298_366_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_298_366_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_298_366_Closed_Text.style.display='none'; Codehighlighter1_298_366_Open_Image.style.display='inline'; Codehighlighter1_298_366_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(j</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;j</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">d.length;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">j)&nbsp;</span><span id="Codehighlighter1_298_366_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_298_366_Open_Text"><span style="color: #000000;">{<br />
<img id="Codehighlighter1_331_332_Open_Image" onclick="this.style.display='none'; Codehighlighter1_331_332_Open_Text.style.display='none'; Codehighlighter1_331_332_Closed_Image.style.display='inline'; Codehighlighter1_331_332_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_331_332_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_331_332_Closed_Text.style.display='none'; Codehighlighter1_331_332_Open_Image.style.display='inline'; Codehighlighter1_331_332_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o[d[j]]</span><span style="color: #000000;">=</span><span style="color: #000000;">o[d[j]]&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_331_332_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_331_332_Open_Text"><span style="color: #000000;">{}</span></span><span style="color: #000000;">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; o</span><span style="color: #000000;">=</span><span style="color: #000000;">o[d[j]];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
从代码可以看出,如果我们传入的字符串参数是以"."分割的,那么将会创建多个对象,比如:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">Ext.namespace('system.corp');</span></div>
则会创建2个对象,相当于执行了下面的代码:
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img id="Codehighlighter1_9_10_Open_Image" onclick="this.style.display='none'; Codehighlighter1_9_10_Open_Text.style.display='none'; Codehighlighter1_9_10_Closed_Image.style.display='inline'; Codehighlighter1_9_10_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_9_10_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_9_10_Closed_Text.style.display='none'; Codehighlighter1_9_10_Open_Image.style.display='inline'; Codehighlighter1_9_10_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000;">system&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_9_10_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_9_10_Open_Text"><span style="color: #000000;">{}</span></span><span style="color: #000000;">;<br />
<img id="Codehighlighter1_27_28_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_28_Open_Text.style.display='none'; Codehighlighter1_27_28_Closed_Image.style.display='inline'; Codehighlighter1_27_28_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_28_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_27_28_Closed_Text.style.display='none'; Codehighlighter1_27_28_Open_Image.style.display='inline'; Codehighlighter1_27_28_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />system.corp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_27_28_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_27_28_Open_Text"><span style="color: #000000;">{}</span></span><span style="color: #000000;">;</span></div>
这样,我们在自定义类的时候就能这样使用:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">Ext.namespace('system.corp');<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_67_87_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_87_Open_Text.style.display='none'; Codehighlighter1_67_87_Closed_Image.style.display='inline'; Codehighlighter1_67_87_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_67_87_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_67_87_Closed_Text.style.display='none'; Codehighlighter1_67_87_Open_Image.style.display='inline'; Codehighlighter1_67_87_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />system.corp.ManageCorp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;</span><span id="Codehighlighter1_67_87_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_67_87_Open_Text"><span style="color: #000000;">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething</span><span style="color: #008000;"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">}</span></span></div>
如果还想定义一个同名的类,那么可以就使用不同的namespace来区分,这样2个类就不会冲突了:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">Ext.namespace('system.admin');<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img id="Codehighlighter1_69_89_Open_Image" onclick="this.style.display='none'; Codehighlighter1_69_89_Open_Text.style.display='none'; Codehighlighter1_69_89_Closed_Image.style.display='inline'; Codehighlighter1_69_89_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="Codehighlighter1_69_89_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_69_89_Closed_Text.style.display='none'; Codehighlighter1_69_89_Open_Image.style.display='inline'; Codehighlighter1_69_89_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" />system.admin.ManageCorp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;</span><span id="Codehighlighter1_69_89_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_69_89_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething</span><span style="color: #008000;"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" /></span><span style="color: #000000;">}</span></span></div>
<br />
此外,注意源码中"eval"方法的使用,如果有需要可以采用这种方式来解决问题.
<img src ="http://www.blogjava.net/zhangchao/aggbug/187372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangchao/" target="_blank">zhangchao</a> 2008-03-19 22:24 <a href="http://www.blogjava.net/zhangchao/archive/2008/03/19/187372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>