<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>johnnyhg</title>
    <description></description>
    <link>http://johnnyhg.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>test</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/216635" style="color:red;">http://johnnyhg.javaeye.com/blog/216635</a>&nbsp;
          发表时间: 2008年07月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>a</p>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/216635#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Jul 2008 01:54:22 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/216635</link>
        <guid>http://johnnyhg.javaeye.com/blog/216635</guid>
      </item>
      <item>
        <title>调用EJB远端接口</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/215397" style="color:red;">http://johnnyhg.javaeye.com/blog/215397</a>&nbsp;
          发表时间: 2008年07月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="blog_content">
<p class="MsoNormal"><span style="font-family: 宋体;">今天写了一个Session Bean调用的Demo，可是总是报错</span>
<span lang="EN-US">java.lang.ClassCastException:
$Proxy91，郁闷至极，删掉整个项目重新写，可是问题依然存在。原来EJB接口Jar文件，我放在client项目的web-info/lib目录
下了，并且EJB接口jar文件和client同时发布到jboss下，</span>
<span style="font-family: 宋体;">在调用</span>
<span lang="EN-US">Stateful Bean </span>
<span style="font-family: 宋体;">就会发生类型冲突。总结一下整理给大家，希望有帮助。</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">当你的</span>
<span lang="EN-US">EJB3</span>
<span style="font-family: 宋体;">是</span>
<span lang="EN-US">deploy to jboss</span>
<span style="font-family: 宋体;">的情况下，</span>
<span lang="EN-US">EJB client</span>
<span style="font-family: 宋体;">调用</span>
<span lang="EN-US">EJB3</span>
<span style="font-family: 宋体;">分两种情况：</span>
</p>
<p class="MsoNormal"><strong><span lang="EN-US">1) </span>
</strong>
<strong><span style="font-family: 宋体;">发布在</span>
<span lang="EN-US">jboss</span>
</strong>
<strong><span style="font-family: 宋体;">的</span>
<span lang="EN-US">web app</span>
</strong>
<strong><span style="font-family: 宋体;">作为</span>
<span lang="EN-US">client</span>
</strong>
<strong><span style="font-family: 宋体;">来调用</span>
<span lang="EN-US">EJB</span>
</strong>
</p>
<p class="MsoNormal"><span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">和调用</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">WEB </span>
<span style="font-family: 宋体;">应用都发布在</span>
<span lang="EN-US">Jboss </span>
<span style="font-family: 宋体;">集成环境下。在</span>
<span lang="EN-US">Jboss</span>
<span style="font-family: 宋体;">下发布</span>
<span lang="EN-US">WEB </span>
<span style="font-family: 宋体;">应用，需要把</span>
<span lang="EN-US">WEB </span>
<span style="font-family: 宋体;">应用打包成</span>
<span lang="EN-US">war </span>
<span style="font-family: 宋体;">文件。另外在此环境下调用</span>
<span lang="EN-US">EJB </span>
<span style="font-family: 宋体;">不需要把</span>
<span lang="EN-US">EJB </span>
<span style="font-family: 宋体;">的接口类放入</span>
<span lang="EN-US">/WEB-INF/classes/</span>
<span style="font-family: 宋体;">目录中，否则在调用</span>
<span lang="EN-US">Stateful Bean </span>
<span style="font-family: 宋体;">就会发生类型冲突，引发下面的例外</span>
<span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US">java.lang.ClassCastException: $Proxy84</span>
</p>
<p class="MsoNormal"><span lang="EN-US">org.apache.jsp.StatefulBeanTest_jsp._jspService(org.apache.jsp.StatefulBeanTest_jsp:55)</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;</span>
</span>
<span style="font-family: 宋体;">如果</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">和调用</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">WEB </span>
<span style="font-family: 宋体;">应用都发布在</span>
<span lang="EN-US">Jboss </span>
<span style="font-family: 宋体;">集成环境下，那么</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">Local</span>
<span style="font-family: 宋体;">或</span>
<span lang="EN-US">Remote</span>
<span style="font-family: 宋体;">接口都可以被调用</span>
<span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">发布在</span>
<span lang="EN-US">Jboss </span>
<span style="font-family: 宋体;">下的客户端不需要明确设置</span>
<span lang="EN-US">JNDI </span>
<span style="font-family: 宋体;">访问的上下文环境，可以直接通过</span>
<span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US">InitialContext ctx = new InitialContext()</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">获得上下文环境，容器会自动赋给</span>
<span lang="EN-US">InitialContext </span>
<span style="font-family: 宋体;">正确的环境，例如：</span>
<span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US">InitialContext ctx = new InitialContext();//</span>
<span style="font-family: 宋体;">客户端和</span>
<span lang="EN-US">jboss</span>
<span style="font-family: 宋体;">运行在同一个</span>
<span lang="EN-US">jvm,</span>
<span style="font-family: 宋体;">不需要传入</span>
<span lang="EN-US">props</span>
</p>
<p class="MsoNormal"><span lang="EN-US">HelloWorld helloworld = (HelloWorld) ctx.lookup(&quot;HelloWorldBean/remote&quot;);</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;</span>
</span>
<span style="font-family: 宋体;">如果硬给</span>
<span lang="EN-US">InitialContext </span>
<span style="font-family: 宋体;">设置了访问属性，反而会带来不可移植的问题，因为你的应用有可能部署在</span>
<span lang="EN-US">weblogic </span>
<span style="font-family: 宋体;">等应用服务器。（本教程考虑到部分同学可能需要在独立的</span>
<span lang="EN-US">J2se </span>
<span style="font-family: 宋体;">中调用</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">，为了教学的方便，把访问属性都设上了，这样不管在</span>
<span lang="EN-US">jboss</span>
<span style="font-family: 宋体;">、</span>
<span lang="EN-US">j2se </span>
<span style="font-family: 宋体;">或独立</span>
<span lang="EN-US">tomcat</span>
<span style="font-family: 宋体;">，都能获得正确的</span>
<span lang="EN-US">InitialContext</span>
<span style="font-family: 宋体;">）</span>
<span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><strong><span lang="EN-US">2) </span>
</strong>
<strong><span style="font-family: 宋体;">在单独的</span>
<span lang="EN-US">Tomcat</span>
</strong>
<strong><span style="font-family: 宋体;">或</span>
<span lang="EN-US">J2SE</span>
</strong>
<strong><span style="font-family: 宋体;">（如</span>
<span lang="EN-US">junit test</span>
</strong>
<strong><span style="font-family: 宋体;">）中调用</span>
<span lang="EN-US">EJB</span>
</strong>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">在正式的生产环境下，大部分调用</span>
<span lang="EN-US">EJB </span>
<span style="font-family: 宋体;">的客户端可能是单独的</span>
<span lang="EN-US">Tomcat </span>
<span style="font-family: 宋体;">或</span>
<span lang="EN-US">Resin</span>
<span style="font-family: 宋体;">。下面介绍如何在单独的</span>
<span lang="EN-US">Tomcat</span>
<span style="font-family: 宋体;">服务器中调用</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">。在单独的</span>
<span lang="EN-US">Tomcat </span>
<span style="font-family: 宋体;">服务器中调用</span>
<span lang="EN-US">EJB </span>
<span style="font-family: 宋体;">需要有以下步骤：</span>
<span lang="EN-US"></span>
</p>
<p class="MsoNormal" style="margin-left: 10.5pt;"><span lang="EN-US">A) </span>
<span style="font-family: 宋体;">把调用</span>
<span lang="EN-US">EJB </span>
<span style="font-family: 宋体;">所依赖的</span>
<span lang="EN-US">Jar </span>
<span style="font-family: 宋体;">包拷贝到</span>
<span lang="EN-US">tomcat </span>
<span style="font-family: 宋体;">下的</span>
<span lang="EN-US">/shared/lib </span>
<span style="font-family: 宋体;">目录或</span>
<span lang="EN-US">WEB </span>
<span style="font-family: 宋体;">应用的</span>
<span lang="EN-US">WEB-INF/lib</span>
<span style="font-family: 宋体;">下</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">所依赖的</span>
<span lang="EN-US">Jar</span>
<span style="font-family: 宋体;">在</span>
<span lang="EN-US">jboss </span>
<span style="font-family: 宋体;">安装目录的</span>
<span lang="EN-US">client</span>
<span style="font-family: 宋体;">目录下。你可以在</span>
<span lang="EN-US">eclipse</span>
<span style="font-family: 宋体;">里设置一个自定义的</span>
<span lang="EN-US">library </span>
<span style="font-family: 宋体;">&ldquo;</span>
<span lang="EN-US">ejb3 library</span>
<span style="font-family: 宋体;">&rdquo;，把这些</span>
<span lang="EN-US">jars</span>
<span style="font-family: 宋体;">都添加到该</span>
<span lang="EN-US">library</span>
<span style="font-family: 宋体;">里，然后在你的</span>
<span lang="EN-US">EJB project</span>
<span style="font-family: 宋体;">里把&ldquo;</span>
<span lang="EN-US">ejb3 library</span>
<span style="font-family: 宋体;">&rdquo;</span>
<span lang="EN-US"> add to classpath</span>
</p>
<p class="MsoNormal" style="margin-left: 10.5pt;"><span lang="EN-US">B) </span>
<span style="font-family: 宋体;">把</span>
<span lang="EN-US">EJB </span>
<span style="font-family: 宋体;">接口拷贝到应用的</span>
<span lang="EN-US">/WEB-INF/classes/</span>
<span style="font-family: 宋体;">目录下</span>
<span lang="EN-US"></span>
</p>
<p class="MsoNormal" style="margin-left: 10.5pt;"><span lang="EN-US">C) </span>
<span style="font-family: 宋体;">客户端访问</span>
<span lang="EN-US">EJB </span>
<span style="font-family: 宋体;">时必须明确设置</span>
<span lang="EN-US">InitialContext </span>
<span style="font-family: 宋体;">环境属性，代码如下</span>
<span lang="EN-US">:</span>
</p>
<p class="MsoNormal"><span lang="EN-US">Properties props = new Properties();</span>
</p>
<p class="MsoNormal"><span lang="EN-US">props.setProperty(&quot;java.naming.factory.initial&quot;, &quot;org.jnp.interfaces.NamingContextFactory&quot;);</span>
</p>
<p class="MsoNormal"><span lang="EN-US">props.setProperty(&quot;java.naming.provider.url&quot;, &quot;localhost:1099&quot;);</span>
</p>
<p class="MsoNormal"><span lang="EN-US">props.setProperty(&quot;java.naming.factory.url.pkgs&quot;, &quot;org.jboss.naming&quot;);</span>
</p>
<p class="MsoNormal"><span lang="EN-US">InitialContext ctx = new InitialContext(props);//</span>
<span style="font-family: 宋体;">客户端和</span>
<span lang="EN-US">jboss</span>
<span style="font-family: 宋体;">运行在同一个</span>
<span lang="EN-US">jvm,</span>
<span style="font-family: 宋体;">不需要传入</span>
<span lang="EN-US">props</span>
</p>
<p class="MsoNormal"><span lang="EN-US">HelloWorld helloworld = (HelloWorld) ctx.lookup(&quot;HelloWorldBean/remote&quot;);</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;</span>
</span>
</p>
<p class="MsoNormal"><span lang="EN-US">Tip: </span>
<span style="font-family: 宋体;">除了上面通过硬编码设置环境属性的方式外，还可以在应用的</span>
<span lang="EN-US">classpath </span>
<span style="font-family: 宋体;">下放置一个</span>
<span lang="EN-US">jndi.properties </span>
<span style="font-family: 宋体;">文件</span>
<span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;</span>
</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">注意：在单独的</span>
<span lang="EN-US">tomcat</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">J2SE</span>
<span style="font-family: 宋体;">里不能调用</span>
<span lang="EN-US">EJB </span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">Local </span>
<span style="font-family: 宋体;">接口，因为他与</span>
<span lang="EN-US">JBOSS </span>
<span style="font-family: 宋体;">不在同一个</span>
<span lang="EN-US">VM </span>
<span style="font-family: 宋体;">中。</span>
<span lang="EN-US">J2se</span>
<span style="font-family: 宋体;">中调用</span>
<span lang="EN-US">EJB3 </span>
<span style="font-family: 宋体;">同样需要把上述</span>
<span lang="EN-US">jar </span>
<span style="font-family: 宋体;">及</span>
<span lang="EN-US">EJB </span>
<span style="font-family: 宋体;">接口放置在应用的类路径下。</span>
</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/215397#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jul 2008 13:50:08 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/215397</link>
        <guid>http://johnnyhg.javaeye.com/blog/215397</guid>
      </item>
      <item>
        <title>Tomcat5.0乱码全解决方案</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/214799" style="color:red;">http://johnnyhg.javaeye.com/blog/214799</a>&nbsp;
          发表时间: 2008年07月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>首先，说说JSP/Servlet中的几个编码的作用。<br />
<br />
在JSP/Servlet中主要有以下几个地方可以设置编码，pageEncoding=&quot;UTF-8&quot;、contentType=&quot;text/html;charset=UTF-8&quot;、request.setCharacterEncoding(&quot;UTF-8&quot;)和response.setCharacterEncoding(&quot;UTF-8&quot;)，其中前两个只能用于JSP中，而后两个可以用于JSP和Servlet中。<br />
<br />
1、pageEncoding=&quot;UTF-8&quot;的作用是设置JSP编译成Servlet时使用的编码。<br />
　　众所周知，JSP在服务器上是要先被编译成Servlet的。pageEncoding=&quot;UTF-8&quot;的作用就是告诉JSP编译器在将JSP文件编译成Servlet时使用的编码。通常，在JSP内部定义的字符串（直接在JSP中定义，而不是从浏览器提交的数据）出现乱码时，很多都是由于该参数设置错误引起的。例如，你的JSP文件是以GBK为编码保存的，而在JSP中却指定pageEncoding=&quot;UTF-8&quot;，就会引起JSP内部定义的字符串为乱码。<br />
　　另外，该参数还有一个功能，就是在JSP中不指定contentType参数，也不使用response.setCharacterEncoding方法时，指定对服务器响应进行重新编码的编码。</p>
<p><br />
2、contentType=&quot;text/html;charset=UTF-8&quot;的作用是指定对服务器响应进行重新编码的编码。<br />
　　在不使用response.setCharacterEncoding方法时，用该参数指定对服务器响应进行重新编码的编码。服务器在将数据发送到浏览器前，对数据进行重新编码时，使用的就是该编码。<br />
3、request.setCharacterEncoding(&quot;UTF-8&quot;)的作用是设置对客户端请求进行重新编码的编码。<br />
　　该方法用来指定对浏览器发送来的数据进行重新编码（或者称为解码）时，使用的编码。<br />
4、 response.setCharacterEncoding(&quot;UTF-8&quot;)的作用是指定对服务器响应进行重新编码的编码。<br />
　&nbsp;&nbsp; 服务器在将数据发送到浏览器前，对数据进行重新编码时，使用的就是该编码。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
其次，要说一说浏览器是怎么样对接收和发送的数据进行编码的<br />
　&nbsp;&nbsp; response.setCharacterEncoding(&quot;UTF-8&quot;)的作用是指定对服务器响应进行重新编码的编码。同时，浏览器也是根据这个参数来对其接收到的数据进行重新编码（或者称为解码）。所以在无论你在JSP中设置response.setCharacterEncoding(&quot;UTF-8&quot;)或者response.setCharacterEncoding(&quot;GBK&quot;)，浏览器均能正确显示中文（前提是你发送到浏览器的数据编码是正确的，比如正确设置了pageEncoding参数等）。读者可以做个实验，在JSP中设置response.setCharacterEncoding(&quot;UTF-8&quot;)，在IE中显示该页面时，在IE的菜单中选择&quot;查看(V)&quot;&agrave;&quot;编码<br />
(D)&quot;中可以查看到是&quot; Unicode（UTF-8）&quot;，而在在JSP中设置response.setCharacterEncoding(&quot;GBK&quot;)，在IE中显示该页面时，在IE的菜单中选择&quot;查看(V)&quot;&agrave;&quot;编码(D)&quot;中可以查看到是&quot;简体中文（GB2312）&quot;。<br />
　　浏览器在发送数据时，对URL和参数会进行URL编码，对参数中的中文，浏览器也是使用response.setCharacterEncoding参数来进行URL编码的。以百度和GOOGLE为例，如果你在百度中搜索&quot;汉字&quot;，百度会将其编码为&quot;%BA%BA%D7%D6&quot;。而在GOOGLE中搜索 &quot;汉字&quot;，GOOGLE会将其编码为&quot;%E6%B1%89%E5%AD%97&quot;，这是因为百度的response.setCharacterEncoding参数为GBK，而GOOGLE的response.setCharacterEncoding参数为UTF-8。<br />
<br />
　　浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的，默认情况下均为JSP页面的<br />
response.setCharacterEncoding参数（或者contentType和<br />
pageEncoding参数），我们称其为浏览器编码。当然，在IE中可以修改浏览器编码（在IE的菜单中选择&quot;查看(V)&quot;&agrave;&quot;编码(D)&quot;中修改），但通常情况下，修改该参数会使原本正确的页面中出现乱码。一个有趣的例子是，在IE中浏览GOOGLE的主页时，将浏览器编码修改为&quot;简体中文（GB2312）&quot;，此时，页面上的中文会变成乱码，不理它，在文本框中输入&quot;汉字&quot;，提交，GOOGLE会将其编码为&quot;%BA%BA%D7%D6&quot;，可见，浏览器在对中文进行URL编码时，使用的就是浏览器编码。<br />
　　弄清了浏览器是在接收和发送数据时，是如何对数据进行编码的了，我们再来看看服务器是在接收和发送数据时，是如何对数据进行编码的。<br />
　　对于发送数据，服务器按照response.setCharacterEncoding&mdash;contentType&mdash;pageEncoding的优先顺序，对要发送的数据进行编码。<br />
　　对于接收数据，要分三种情况。一种是浏览器直接用URL提交的数据，另外两种是用表单的GET和POST方式提交的数据。<br />
　　因为各种WEB服务器对这三种方式的处理也不相同，所以我们以Tomcat5.0为例。<br />
　　无论使用那种方式提交，如果参数中包含中文，浏览器都会使用当前浏览器编码对其进行URL编码。<br />
　　对于表单中POST方式提交的数据，只要在接收数据的JSP中正确request.setCharacterEncoding参数，即将对客户端请求进行重新编码的编码设置成浏览器编码，就可以保证得到的参数编码正确。有写读者可能会问，那如何得到浏览器编码呢？上面我们提过了，在默认请情况下，浏览器编码就是你在响应该请求的JSP页面response.setCharacterEncoding设置的值。所以对于POST表单提交的数据，在获得数据的JSP页面中request.setCharacterEncoding要和生成提交该表单的JSP页面的response.setCharacterEncoding设置成相同的值。<br />
<br />
　　对于URL提交的数据和表单中GET方式提交的数据，在接收数据的JSP中设置request.setCharacterEncoding参数是不行的，因为在Tomcat5.0中，默认情况下使用ISO-8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码（解码），而不使用该参数对URL提交的数据和表单中GET方式提交的数据进行<br />
重新编码（解码）。要解决该问题，应该在Tomcat的配置文件的Connector标签中设置useBodyEncodingForURI或者<br />
URIEncoding属性，其中useBodyEncodingForURI参数表示是否用request.setCharacterEncoding<br />
参数对URL提交的数据和表单中GET方式提交的数据进行重新编码，在默认情况下，该参数为false（Tomcat4.0中该参数默认为true）；URIEncoding参数指定对所有GET方式请求（包括URL提交的数据和表单中GET方式提交的数据）进行统一的重新编码（解码）的编码。URIEncoding和useBodyEncodingForURI区别是，URIEncoding是对所有GET方式的请求的数据进行统一的重新编码（解码），而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码（解码），不同的页面可以有不同的重新编码（解码）的编码。所以对于URL提交的数据和表单中GET方式提交的数据，可以修改URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true，并且在获得数据的JSP页面中request.setCharacterEncoding参数设置成浏览器编码。<br />
<br />
　　下面总结下，以Tomcat5.0为WEB服务器时，如何防止中文乱码。<br />
<br />
1、  对于同一个应用，最好统一编码，推荐为UTF-8，当然GBK也可以。<br />
2、  正确设置JSP的pageEncoding参数<br />
3、  在所有的JSP/Servlet中设置contentType=&quot;text/html;charset=UTF-8&quot;或response.setCharacterEncoding(&quot;UTF-8&quot;)，从而间接实现对浏览器编码的设置。<br />
4、 对于请求，可以使用过滤器或者在每个JSP/Servlet中设置request.setCharacterEncoding(&quot;UTF-8&quot;)。同<br />
时，要修改Tomcat的默认配置，推荐将useBodyEncodingForURI参数设置为true，也可以将URIEncoding参数设置为<br />
UTF-8（有可能影响其他应用，所以不推荐）。<br />
<br />
总结：<br />
<br />
1、做一个编码过滤器,类似于：</p>
<pre name="code" class="java">public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
throws IOException,ServletException {
        String strRequestURI = ((HttpServletRequest) request).getRequestURI();
        String encoding = selectEncoding(request);
        request.setCharacterEncoding(“UTF-8”);
        chain.doFilter(request, response);
    }</pre>
<p>
<br />
2、在JSP页面中加上：<br />
   &lt;%@ page contentType=&quot;text/html;charset=UTF-8&quot; %&gt;<br />
   &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;<br />
3、修改Tomcat5.0的D:\jakarta-tomcat-5.0.30\conf\server.xml<br />
   找到connector部分<br />
   加上useBodyEncodingForURI=&quot;true&quot; URIEncoding=&quot;UTF-8&quot;<br />
比如： </p>
<pre name="code" class="xml">&lt;Connector 
           port=&quot;8080&quot;
           maxThreads=&quot;150&quot; minSpareThreads=&quot;25&quot; maxSpareThreads=&quot;75&quot;
           enableLookups=&quot;false&quot; redirectPort=&quot;8443&quot; acceptCount=&quot;100&quot;
           debug=&quot;0&quot; connectionTimeout=&quot;20000&quot; 
           disableUploadTimeout=&quot;true&quot; useBodyEncodingForURI=&quot;true&quot; URIEncoding=&quot;UTF-8&quot; /&gt;</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/214799#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Jul 2008 09:59:38 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/214799</link>
        <guid>http://johnnyhg.javaeye.com/blog/214799</guid>
      </item>
      <item>
        <title>Web 前端优化最佳实践之 Mobile(iPhone) 篇</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/214705" style="color:red;">http://johnnyhg.javaeye.com/blog/214705</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Web 前端优化最佳实践最后一部分是针对移动应用的，其实只是针对 iPhone 的，目前只有两条规则。</p>
<h4>1. 单个数据对象小于 25K (Keep Components under 25K)</h4>
<p>这个似乎只是<a href="http://yuiblog.com/blog/2008/02/06/iphone-cacheability/">针对 iPhone 研究</a>
的。建议保持单个 Web 数据对象在 25 K 以下。为什么是 25K? Apple 官方信息指出可缓存到内存中的 Web 对象最大支持到 10M，但经过测试，发现也就是 25K 左右。</p>
<p>iPhone 在市场上的优异表现，让 Web 人员不得不考虑如何针对其进行优化。相信这部分内容也在不断变化中。</p>
<h4>2. Pack Components into a Multipart Document</h4>
<p>把Web 页面组件打包成一个多部分组成的文档。其目的是减少 <acronym title="HyperText Transfer Protocol">HTTP</acronym>
 请求。对这部分语焉不详，等待后续更新吧。</p>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/214705#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 20:51:29 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/214705</link>
        <guid>http://johnnyhg.javaeye.com/blog/214705</guid>
      </item>
      <item>
        <title>Web 前端优化最佳实践之图象篇</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/214702" style="color:red;">http://johnnyhg.javaeye.com/blog/214702</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Web 前端优化最佳实践第六部分面向 图片(Image)，这部分目前有 4 条规则。在最近的 Velocity 2008 技术大会上，Yahoo! 的 Stoyan Stefanov 做的 <a href="http://en.oreilly.com/velocity2008/public/schedule/detail/2405">Image Optimization: How Many of These 7 Mistakes Are You Making</a>
 也非常有参考价值。结合一起说一下。</p>
<h4> 1. 优化图片 (Optimize Images)</h4>
<p>使用 <acronym title="Graphics Interchange Format">GIF</acronym>
 、JPG 还是 <acronym title="Portable Network Graphics">PNG</acronym>
 格式的图片? 尽可能的使用 <acronym title="Portable Network Graphics">PNG</acronym>
 格式的图片，更多的功能，更小的尺寸(与 <acronym title="Graphics Interchange Format">GIF</acronym>
 相比)。</p>
<p>对于 <acronym title="Portable Network Graphics">PNG</acronym>
 图片，考虑用 <a href="http://pmt.sourceforge.net/pngcrush/">Pngcrush</a>
 或类似的工具进行优化。常见的工具如下表: </p>
<ul>
<li><strong><a href="http://pmt.sourceforge.net/pngcrush/">pngcrush</a>
</strong>
 http://pmt.sourceforge.net/pngcrush/ </li>
<li><strong><a href="http://www.pobox.com/%7Ejason1/pngrewrite/">pngrewrite</a>
</strong>
 http://www.pobox.com/~jason1/pngrewrite/ </li>
<li><strong><a href="http://www.cs.toronto.edu/%7Ecosmin/pngtech/optipng/">OptiPNG</a>
</strong>
 http://www.cs.toronto.edu/~cosmin/pngtech/optipng/</li>
<li><strong><a href="http://advsys.net/ken/utils.htm">PNGOut </a>
</strong>
<a href="http://advsys.net/ken/utils.htm" target="_blank">http://advsys.net/ken/utils.htm</a></li>
</ul>
<p>对 <acronym title="Joint Photographics Experts Group">JPEG</acronym>
 图片的优化工具：</p>
<ul>
<li><a href="http://jpegclub.org/">jpegtran</a>
 (http://jpegclub.org/)</li>
</ul>
<p>必需要强调的是，图片设计的同学啊，请考虑设计<strong>面向 Web 的图片</strong>
，不要动不动就设计超过可接受尺寸之外大家伙，这应该是一种习惯，而不是什么高超的技能，只需要记住就成了。</p>
<h4> 2. 使用 <acronym title="Cascading Style Sheets">CSS</acronym>
 Sprites 技巧对图片优化 (Optimize <acronym title="Cascading Style Sheets">CSS</acronym>
 Sprites)</h4>
<p>之前提到过，简单的说就是&quot;利用 <acronym title="Cascading Style Sheets">CSS</acronym>
 background 相关元素进行背景图绝对定位&quot;，把多次 <acronym title="HyperText Transfer Protocol">HTTP</acronym>
 调用变为一次调用，更多参考：<a href="http://alistapart.com/articles/sprites">CSS Sprites: Image Slicing's Kiss of Death</a>
</p>
<h4> 3. 不要在 <acronym title="HyperText Markup Language">HTML</acronym>
 中使用缩放图片 (Don't Scale Images in <acronym title="HyperText Markup Language">HTML</acronym>
)</h4>
<p>更多的时候，可能是因为偷懒而没有制作合适大小的图片，如果是批量处理图片的话，可能一条 <a href="http://www.imagemagick.org/">ImageMagic</a>
 命令（convert ）就能搞定 。必须提及的是，看到太多的对图片拉伸很难看的页面，救救这些页面!</p>
<h4> 4. 用更小的并且可缓存的 favicon.ico  (Make favicon.ico Small and Cacheable)</h4>
<p>更小，可缓存，这两条可能都不是问题。问题是，<strong>太多站点根本没有 favicon.ico</strong>
 。有的时候，判断独立域名的 Blog 是否专业，基本看一下是否有 favicon.ico 就差不多了。</p>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/214702#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 20:50:18 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/214702</link>
        <guid>http://johnnyhg.javaeye.com/blog/214702</guid>
      </item>
      <item>
        <title>Web 前端优化最佳实践之 JavaScript 篇</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/214698" style="color:red;">http://johnnyhg.javaeye.com/blog/214698</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="asset-content">
<div class="asset-body">
<p>Web 前端优化最佳实践之 JavaScript 篇，这部分有 6 条规则，和  <acronym title="Cascading Style Sheets">CSS</acronym>
 篇 重复的有几条。前端优化最佳实践，最重要的还是&quot;实践&quot;，要理解这东西容易得很，关键是要去&quot;实践&quot;，去&quot;执行&quot;，去&quot;反馈&quot;，去获取受益。</p>
<h4>1. 脚本放到 <acronym title="HyperText Markup Language">HTML</acronym>
 代码页底部 (Put Scripts at the Bottom)</h4>
<p>当一个脚本在下载的时候，浏览器干不了其它的事儿(串行了)。所以，把它扔到最后面去处理。对于一些功能性的脚本，可能实现起来有些两难。不过对于
国内网站来说，有很多使用 Google Analytics 服务进行网站数据分析的。这这一点来说，绝对可行的建议，放到页面最底下。</p>
<h4>2. Make JavaScript and <acronym title="Cascading Style Sheets">CSS</acronym>
 External</h4>
<p>参见 <a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_css.html">CSS 篇</a>
的描述</p>
<h4>3. 精简 JavaScript 与 <acronym title="Cascading Style Sheets">CSS</acronym>
 (Minify JavaScript and <acronym title="Cascading Style Sheets">CSS</acronym>
)</h4>
<p>参见 <a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_css.html">CSS 篇</a>
的描述</p>
<h4>4. 移除重复脚本 (Remove Duplicate Scripts)</h4>
<p>对于一些历史遗留站点或是论坛类的网站来说，这倒是比较常见的。接手维护人前后变化过多，每个人都有自己的一套。这就会带来一些潜在的麻烦。</p>
<h4>5. 减少 <acronym title="Document Object Model">DOM</acronym>
 访问 (Minimize <acronym title="Document Object Model">DOM</acronym>
 Access)</h4>
有三条指导建议:
<ul>
<li>缓存已经访问过的元素 (Cache references to accessed elements)</li>
<li>&quot;离线&quot;更新节点, 再将它们添加到树中 (Update nodes &quot;offline&quot; and then add them to the tree)</li>
<li>避免使用 JavaScript 输出页面布局--应该是 <acronym title="Cascading Style Sheets">CSS</acronym>
 的事儿 (Avoid fixing layout with JavaScript)</li>
</ul>
<h4>6. Develop Smart Event Handlers</h4>
<p>除了英文解释外，这里也提醒一下注意关于 <strong>Java Script 内存泄漏</strong>
的问题。</p>
<p>另外推荐一篇<a href="http://shiningray.cn/improve-javascript-performance.html">《如何优化 JavaScript 脚本的性能》</a>
，关于 Ajax 优化指导原则，可以参见 <a href="http://www.ibm.com/developerworks/cn/web/wa-aj-speed.html">提高 Ajax 应用程序性能，避开 Web 服务漏洞</a>
。</p>
<p><strong>后记1)</strong>
 ：整理得差不多之后，发现网络上已经有一篇 《Yahoo!网站性能最佳体验的34条黄金守则》，是翻译稿。看来我做了一部分重复劳动。</p>
<p><strong>后记 2)</strong>
：CSS / JavaScript 都有优化规则。但似乎缺少了对 Flash 的优化实践。</p>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/214698#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 20:48:41 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/214698</link>
        <guid>http://johnnyhg.javaeye.com/blog/214698</guid>
      </item>
      <item>
        <title>Web 前端优化最佳实践之 CSS 篇</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/214695" style="color:red;">http://johnnyhg.javaeye.com/blog/214695</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="asset-content">
<div class="asset-body">
<p>Web 前端优化最佳实践第四部分面向 CSS。目前共计有 6 条实践规则。另请参见 Mozilla 开发者中心的文章：<a href="http://developer.mozilla.org/en/docs/Writing_Efficient_CSS">Writing Efficient CSS</a>
</p>
<h4>1. 把 <acronym title="Cascading Style Sheets">CSS</acronym>
 放到代码页上端 (Put Stylesheets at the Top)</h4>
<p>官方的解释我觉得多少有点语焉不详。这一条其实和<strong>用户访问期望</strong>
有关。CSS 放到最顶部，浏览器能够有针对性的对 <acronym title="HyperText Markup Language">HTML</acronym>
 页面从顶到下进行解析和渲染。没有人喜欢等待，而浏览器已经考虑到了这一点。</p>
<h4>2. 避免 <acronym title="Cascading Style Sheets">CSS</acronym>
 表达式 (Avoid <acronym title="Cascading Style Sheets">CSS</acronym>
 Expressions)</h4>
<p>个人认为通过 <acronym title="Cascading Style Sheets">CSS</acronym>
 表达式能做到的事情，通过其它手段也同样能做到而且风险更小一些。</p>
<h4>3. 从页面中剥离 JavaScript 与 <acronym title="Cascading Style Sheets">CSS</acronym>
 (Make JavaScript and <acronym title="Cascading Style Sheets">CSS</acronym>
 External)</h4>
<p>剥离后，能够有针对性的对其进行单独的处理策略，比如压缩或者缓存策略。</p>
<h4>4. 精简 JavaScript 与 <acronym title="Cascading Style Sheets">CSS</acronym>
 (Minify JavaScript and <acronym title="Cascading Style Sheets">CSS</acronym>
)</h4>
<p>如果没有 JavaScript 与 <acronym title="Cascading Style Sheets">CSS</acronym>
 可能更好。但，这是不可能的，SO，尽量小点吧。语法能简写的简写。</p>
<h4>5. 使用 &lt;link&gt; 而不是@importChoose &lt;link&gt; over @import</h4>
<p>在 <acronym title="Internet Explorer">IE</acronym>
 中 @import 指令等同于把 link 标记写在 <acronym title="HyperText Markup Language">HTML</acronym>
 的底部。而这与第一条相违背。</p>
<h4>6. 避免使用Filter (Avoid Filters)</h4>
<p>--EOF--</p>
<p>延伸阅读：</p>
<ul>
<li><a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_content.html">《Web 前端最佳实践之内容篇》</a>
</li>
<li><a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_server.html">《Web 前端最佳实践之Server篇》</a>
</li>
<li><a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_cookie.html">《Web 前端最佳实践之Cookie篇》</a>
</li>
</ul>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/214695#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 20:47:46 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/214695</link>
        <guid>http://johnnyhg.javaeye.com/blog/214695</guid>
      </item>
      <item>
        <title>Web 前端优化最佳实践之 Cookie 篇</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/214690" style="color:red;">http://johnnyhg.javaeye.com/blog/214690</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Web 前端优化最佳实践第三部分面向 Cookie 。目前只有 2 条实践规则。</p>
<h4>1. 缩小 Cookie  (Reduce Cookie Size)</h4>
<p>Cookie 是个很有趣的话题。根据 <a href="http://www.ietf.org/rfc/rfc2109.txt">RFC 2109</a>
的描述，每个客户端最多保持 300 个 Cookie，针对每个域名最多 20 个 Cookie (实际上多数浏览器现在都比这个多，比如
Firefox 是 50 个) ，每个 Cookie 最多 4K，注意这里的 4K 根据不同的浏览器可能不是严格的 4096 。别扯远了，对于
Cookie 最重要的就是，尽量控制 Cookie 的大小，不要塞入一些无用的信息。</p>
<h4>2. 针对 Web 组件使用域名无关性的 Cookie (Use Cookie-free Domains for Components)</h4>
<p>这个话题在此前针对 <a href="http://www.dbanotes.net/web/web_image_server.html">Web 图片服务器</a>
的讨论中曾经提及。这里说的 Web 组件(Component)，多指静态文件，比如图片 <acronym title="Cascading Style Sheets">CSS</acronym>
 等，Yahoo! 的静态文件都在 yimg.com 上，客户端请求静态文件的时候，减少了 Cookie 的反复传输对主域名 (yahoo.com) 的影响。</p>
<p>从这篇 <a href="http://yuiblog.com/blog/2007/03/01/performance-research-part-3/">When the Cookie Crumbles</a>
 能看出，MySpace 和 eBay 的 Cookie 都不小的，想必是对用户行为比较关心。<a href="http://www.dbanotes.net/database/ebay_personalization_platform_mysql.html">eBay 前不久构造了 Personalization Platform</a>
 ，就是从 Cookie 的限制中跳出来。 </p>
<p>延伸阅读：</p>
<ul>
<li><a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_content.html">《Web 前端最佳实践之内容篇》</a>
</li>
<li><a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_server.html">《Web 前端最佳实践之Server篇》</a>
</li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/214690#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 20:44:02 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/214690</link>
        <guid>http://johnnyhg.javaeye.com/blog/214690</guid>
      </item>
      <item>
        <title>Web 前端优化最佳实践之 Server 篇</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/214689" style="color:red;">http://johnnyhg.javaeye.com/blog/214689</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Web 前端优化最佳实践第二部分面向 Server 。目前共计有 6 条实践规则。【注，这最多算技术笔记，查看最原始内容，还请访问：<a href="http://developer.yahoo.com/performance/rules.html">Exceptional Performance : Best Practices for Speeding Up Your Web Site</a>
 】</p>
<h4>1. 使用 <acronym title="Content Delivery Network">CDN</acronym>
 (Use a Content Delivery Network)</h4>
<p>国内 <acronym title="Content Delivery Network">CDN</acronym>
 的普及还不够。不过我们有<strong>独特的电信、网通之间的问题</strong>
，如果针对这个作优化，基本上也算能收到 <acronym title="Content Delivery Network">CDN</acronym>
 或类似的效果吧(假装如此)。【Tin 说国内 <acronym title="Content Delivery Network">CDN</acronym>
 用的挺多，看看 <acronym title="Content Delivery Network">CDN</acronym>
 厂商的市场就知道了，还没走入寻常百姓家】</p>
<h4>2. 添加 Expires 或 Cache-Control 信息头 (Add an Expires or a Cache-Control Header)</h4>
<p>
各个浏览器都有针对的方案, Apache 例子【注意：下面的说明例子还不够精细，具体的环境上还要加一些调整】: 
</p>
<pre>ExpiresActive On
ExpiresByType image/gif &quot;modification plus 1 weeks&quot;</pre>
<p>Lighttpd 启用 mod_expire 模块 后：</p>
<pre>$HTTP[&quot;url&quot;] =~ &quot;\.(jpg|gif|png)$&quot; {
     expire.url = ( &quot;&quot; =&gt; &quot;access 1 years&quot; )
}</pre>
<p>Nginx 例子参考:</p>
<pre>location ~* \.(jpg|gif|png)$ {
  if (-f $request_filename) {
        expires      max;
    break; 
  }        
}</pre>
<p>&nbsp;</p>
<h4>3. 压缩内容 (Gzip Components)</h4>
<p>对于绝大多数站点，这都是必要的一步，能有效减轻网络流量压力。或许有人担心对 <acronym title="Central Processing Unit">CPU</acronym>
 压缩对于 <acronym title="Central Processing Unit">CPU</acronym>
 的影响，放心大胆的整吧，没事儿。Nginx 例子：</p>
<pre>gzip            on;
gzip_types      text/plain text/html text/css ext/javascript;</pre>
<p>另外参见：</p>
<ul>
<a href="http://www.dbanotes.net/web/iis_gzip_compression.html">IIS 如何启用 Gzip 压缩? </a>
</ul>
<h4>4. 设置 Etags (Configure ETags)</h4>
<p>对于 <a href="http://www.dbanotes.net/web/http_11_etag_lastmodified.html">Etag</a>
，可能是多数网站维护者都会忽略的地方。在这一系列优化规则出现之前，可能互联网上绝大多数站点都对这个问题忽略了。当然，Etag 对多数站点性能的影响并不是很大。除非是面向 <acronym title="Rich Site Summary">RSS</acronym>
 的网站。【看到有朋友批评说写的简略，并且说 <acronym title="Internet Explorer">IE</acronym>
 不支持 ETag。明确说一下：IE 支持 ETag，倒是使用 <acronym title="Internet Information Services">IIS</acronym>
 要注意相关 Etag Bug。】</p>
<p>补充：我的意思是&quot;很多网站在不注意的情况下都是打开 Etag 的，而没有网站关心如何用，消耗资源而不知。并不是说 Etag 不好，合理利用 Etag ，绝对能取得很好的收益.</p>
<h4>5. 尽早刷新 Buffer (Flush the Buffer Early)</h4>
<p>对这一条，琢磨了半天，貌似还是<strong>异步</strong>
的思路。能更好的提升用户体验? </p>
<h4>6. 对 <acronym title="Asynchronous JavaScript and Xml">AJAX</acronym>
 请求使用 GET 方法 (Use GET for <acronym title="Asynchronous JavaScript and Xml">AJAX</acronym>
 Requests)</h4>
<p>XMLHttpRequest POST 要两步，而 GET 只需要一步。但要注意的是在 <acronym title="Internet Explorer">IE</acronym>
 上 GET 最大能处理的 <acronym title="Unified Resource Locator">URL</acronym>
 长度是 2K。 </p>
<p>前一篇：</p>
<ul>
<li><a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_content.html">《Web 前端优化最佳实践之内容篇》</a>
</li>
</ul>
<p>下一篇分析一下 Cookie 。</p>
<p>--EOF--</p>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/214689#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 20:42:20 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/214689</link>
        <guid>http://johnnyhg.javaeye.com/blog/214689</guid>
      </item>
      <item>
        <title>Web 前端优化最佳实践之内容篇</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/214688" style="color:red;">http://johnnyhg.javaeye.com/blog/214688</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Yahoo! 的 Exceptional Performance team 在 Web 前端方面作出了卓越的贡献。广为人知的<a href="http://developer.yahoo.com/performance/rules.html">优化规则</a>
也由 13 条到 14 条，再到 20 条，乃至现在的 <a href="http://developer.yahoo.com/performance/">34 条</a>
--真是与时俱进啊。最新的 34 条也针对不同的角度做了分类。</p>
<p>面向内容的优化规则目前有 10 条。</p>
<h4>1. 尽量减少 <acronym title="HyperText Transfer Protocol">HTTP</acronym>
 请求 (Make Fewer <acronym title="HyperText Transfer Protocol">HTTP</acronym>
 Requests) </h4>
<p>作为第一条，可能也是最重要的一条。根据 Yahoo! 研究团队的数据分析，有很大一部分用户访问会因为这一条而取得最大受益。有几种常见的方法能切实减少 <acronym title="HyperText Transfer Protocol">HTTP</acronym>
 请求：</p>
<ul>
<li>1) <strong>合并文件</strong>
，比如把多个 <acronym title="Cascading Style Sheets">CSS</acronym>
 文件合成一个；</li>
<li>2) <strong><acronym title="Cascading Style Sheets">CSS</acronym>
 Sprites</strong>
 利用 <acronym title="Cascading Style Sheets">CSS</acronym>
 background 相关元素进行背景图<strong>绝对</strong>
定位；参见：<a href="http://alistapart.com/articles/sprites">CSS Sprites: Image Slicing's Kiss of Death</a>
</li>
<li>3) <strong>图像地图</strong>
 </li>
<li>4) <strong>内联图象</strong>
 使用 <a href="http://tools.ietf.org/html/rfc2397">data: URL scheme</a>
 在实际的页面嵌入图像数据.</li>
</ul>
<h4>2. 减少 <acronym title="Domain Name System">DNS</acronym>
 查找 (Reduce <acronym title="Domain Name System">DNS</acronym>
 Lookups)</h4>
<p>必须明确的一点，DNS 查找的开销是很大的。另外，我倒是觉得这是 Yahoo! 所有站点的通病，Yahoo！主站点可能还不够明显，一些分站点，存在明显的类似问题。对于国内站点来说，如果过多的使用了站外的 Widget ，也很容易引起过多的 <acronym title="Domain Name System">DNS</acronym>
 查找问题。</p>
<h4>3. 避免重定向 (Avoid Redirects)</h4>
<p>不是绝对的避免，尽量减少。另外，应该注意一些不必要的重定向。比如对 Web 站点子目录的后面添加个 / (Slash)
，就能有效避免一次重定向。http://www.dbanotes.net/arch 与 http://www.dbanotes.net/arch<strong>/</strong>
 二者之间是有差异的。如果是 Apache 服务器，通过配置 Alias 或mod_rewrite 或是 DirectorySlash 能够消除这个问题。</p>
<h4>4. 使得 Ajax 可缓存 (Make Ajax Cacheable)</h4>
<p>响应时间对 Ajax 来说至关重要，否则用户体验绝对好不到哪里去。提高响应时间的有效手段就是 Cache 。其它的一些优化规则对这一条也是有效的。 </p>
<h4>5. 延迟载入组件 (Post-load Components)</h4>
<h4>6. 预载入组件 (Preload Components)</h4>
<p>上面两条严格说来，都是属于<strong>异步</strong>
这个思想灵活运用的事儿。</p>
<h4>7. 减少 <acronym title="Document Object Model">DOM</acronym>
 元素数量 (Reduce the Number of <acronym title="Document Object Model">DOM</acronym>
 Elements)</h4>
<h4>8. 切分组件到多个域 (Split Components Across Domains)</h4>
<p>主要的目的是提高页面组件并行下载能力。但不要跨太多域名，否则就和第二条有些冲突了。</p>
<h4>9. 最小化 iframe 的数量 (Minimize the Number of iframes)</h4>
<p>熟悉 <acronym title="Search Engine Optimization">SEO</acronym>
 的朋友知道 iframe 是  <acronym title="Search Engine Optimization">SEO</acronym>
 的大忌。针对前端优化来说 iframe 有其好处，也有其弊端，一分为二看问题吧。</p>
<h4>10. 杜绝 http 404 错误 (No 404s)</h4>
<p>对页面链接的充分测试加上对 Web 服务器 error 日志的不断跟踪能有效减少 404 错误，亦能提升用户体验。值得一提的是，CSS 与 Java Script 引起的 404 错误因为定位稍稍&quot;难&quot;一点而往往容易被忽略。</p>
<p>这是内容篇的 10 条。应该说具体引导性的内容还不够详细。逐渐会根据自己的理解补充上来。</p>
<p>&nbsp;</p>
<p>转载地址：</p>
<p><a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_content.html" target="_blank">http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_content.html</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/214688#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 20:40:51 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/214688</link>
        <guid>http://johnnyhg.javaeye.com/blog/214688</guid>
      </item>
      <item>
        <title>DW制作地图</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/207671" style="color:red;">http://johnnyhg.javaeye.com/blog/207671</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在浏览网页时，经常能看到一些图片上的特殊超链接，即在一张图片上有多个局部区域与不同的网页链接，比如地图链接。 <br />
<br />
　　<strong>效果说明：</strong>
地图中标示出了中国的各个省市和直辖市，当在地图上单击某个特定区域时，就会跳转到相应地图区的说明页面。
</p>
<p>　　<strong>创作思想：</strong>
本实例将利用 Dreamweaver 的图像热点功能完成地图链接实例。</p>
<p>　　<strong>操作步骤</strong>
 </p>
<p>　　（ 1 ）新建一个HTML文件取名为 map.htm 文件，在页面中插入一幅中国地图，如图&nbsp;1 所示。</p>
<p align="center"><img src="http://images.photoshopcn.com/h000/h71/img200604071150370.jpg" alt="" />
</p>
<p>　　提示：本实例所用到的中国地图china.jpg。 </p>
<p>　　（ 2 ）绘制热点区域。单击页面上的中国地图，然后利用属性栏中的【矩形热点】工具在地图上绘制热点区域，如图&nbsp;2 所示。&nbsp;</p>
<p align="center"><img src="http://images.photoshopcn.com/h000/h71/img200604071150371.jpg" alt="" />
</p>
<p>&nbsp; （ 3 ）当绘制完矩形热点区域后，图像属性面板将变成热点属性面板，如图&nbsp;3 所示。在链接栏处选择热点区域所要链接的目标网页，在【替代】框中填入相关的提示说明，并使链接的网页在新窗口中打开。 </p>
<p><img src="http://images.photoshopcn.com/h000/h71/img200604071150382.jpg" alt="" />
</p>
<p>　　提示：在这里将【目标】设置为 _blank 代表在新
的浏览器窗口中打开被链接的文档，并保持当前窗口可用。【目标】框中其他各选项的含义是， _parent 代表在链接所在的父框架集中打开链接文档；
_self 代表在当前框架中打开链接文档，替换该框架中的内容； _top 代表在当前文档的最外层框架集中打开链接文档，替换所有框架中的内容。 </p>
<p>　　（ 4
）绘制其他热点区域。使用属性面板中的另外两个热点工具【椭圆形热点】工具和【多边形热点】工具同样可以在地图上绘制热点并设置相关的热点属性，其使用方
法和【矩形热点】工具相同。大家可利用这 3 个热点工具在地图上继续绘制其他热点区域并设置链接，最终效果如图&nbsp;4 所示。&nbsp;</p>
<p align="center"><img src="http://images.photoshopcn.com/h000/h71/img200604071150383.jpg" alt="" />
</p>
<p>　　（ 5 ）保存页面文件并按 F12 键进行预览。至此，本实例操作完毕。 </p>
<p>　　在这里我只给大家绘制了３个省的区域！目的教给大家如何做这种网页，通过学习这个实例，是不是觉得很简单呢？当然你要想把整个地图都设置连接可是非常麻烦了啊！主要是浪费时间！这个教程就写到这了。</p>
<p>　　本实例的操作相对简单，但在制作过程中，必须细心的绘制各个区域；各个区域间最好留有一点空隙，以免在选择时出现错误。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/207671#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Jun 2008 22:33:54 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/207671</link>
        <guid>http://johnnyhg.javaeye.com/blog/207671</guid>
      </item>
      <item>
        <title>国内的调查网站</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/202571" style="color:red;">http://johnnyhg.javaeye.com/blog/202571</a>&nbsp;
          发表时间: 2008年06月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          零投入，零风险，免费注册，做问卷，累积积分兑换现金或礼品<br /><br />积沙成塔http://www.jisha.cn/index.php?MyPage=member_add&invl=hnhnhm<br /><br /><br /><br />益派调查网，中央电视台旗下网站http://www.epanel.com.cn:80/epanelweb/regist/xieyou/page909.do?method=show&para1=T8KXKjwnnx<br /><br /><br />题客http://www.QTick.com/JoinPanelist.aspx?ID=293315<br />EZYPOINT信息调查网http://www.ezypoint.com/register.html?inviterid=user45fb84b995785<br /><br />100调查网http://www.data100.com.cn/user/register.htm?recommenduser=hnhnhm<br />中文调查网http://www.1diaocha.com/reg.asp?user=hnhnhm<br />第一调查网http://www.1diaocha.com/reg.asp?user=hnhnhm<br />中智库码http://www.51poll.com/member/welcome.asp?fd_id=230953<br />新秦调查http://www.searchina.net.cn/member/reg.asp?MbPNo=L0004VPQ14<br />乐调调查http://www.lediao.com.cn/5isurvey/jsp/introduce_friends.jsp?id=800007058<br /><br />Ciao网上调查(全球第2大调查公司）www.ciao-surveys.cn/reg.php?FriendId=380916<br /><br />mySurveyAsia调查http://online.tns-global.com/wix/p126529506.aspx?US=referral<br /><br />大家说网调http://www.DaJiaShuo.com/Register.aspx?From=hnhnhm<br /><br />清研调查http://netinsight.cn/NetInsightPro/Setup.ashx?intro=ibcbzcbab5cb<br /><br />PC蛋蛋：http://www.pceggs.com/PgQCoinRush.aspx?pcd=7147105&cd=adb08b62<br />分分乐http://www.fefele.com/index.aspx?invite=hnhnhm<br />同学网,基于同学关系的真实社区<br />http://www.tongxue.com.php?linkid=26140<br />51Money调查 http://www.51money.com/zmindex.jsp?emailfrom=hnhnhm@126.com<br /><br />点击网http://www.g2ck.com/user/register.php?hnhnhm<br /><br />国内信誉好,调查多的基本上就是这几个了
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/202571#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jun 2008 17:42:49 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/202571</link>
        <guid>http://johnnyhg.javaeye.com/blog/202571</guid>
      </item>
      <item>
        <title>如何将网站登录到各大搜索引擎</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/202224" style="color:red;">http://johnnyhg.javaeye.com/blog/202224</a>&nbsp;
          发表时间: 2008年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>［各大搜索引擎登录入口］</strong>
</p>
<p>　Google　　<a href="http://www.google.com/intl/zh-CN/add_url.html" target="_blank">http://www.google.com/intl/zh-CN/add_url.html</a>
</p>
<p>　百度　　　<a href="http://www.baidu.com/search/url_submit.htm" target="_blank">http://www.baidu.com/search/url_submit.htm</a>
</p>
<p>　雅虎　　　<a href="http://search.help.cn.yahoo.com/h4_4.html" target="_blank">http://search.help.cn.yahoo.com/h4_4.html</a>
</p>
<p>　搜狐搜狗　<a href="http://db.sohu.com/regurl/regform.asp" target="_blank">http://db.sohu.com/regurl/regform.asp</a>
</p>
<p>　中搜　　　<a href="http://ads.zhongsou.com/register/page.jsp" target="_blank">http://ads.zhongsou.com/register/page.jsp</a>
</p>
<p>　提交时只需输入网站的首页地址即可，无需重复提交，也无需提交其它页面。</p>
<p>　一般情况下，您提交的网站需要数周到数月的时间才能被搜索引擎收录，而且搜索引擎并不保证一定收录，也不保证收录效果。</p>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/202224#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jun 2008 16:57:53 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/202224</link>
        <guid>http://johnnyhg.javaeye.com/blog/202224</guid>
      </item>
      <item>
        <title>(转)用httpClient获取hotmail联系人列表</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/195469" style="color:red;">http://johnnyhg.javaeye.com/blog/195469</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://blog.jiexoo.com/2008/05/21/%e7%94%a8httpclient%e8%8e%b7%e5%8f%96hotmail%e8%81%94%e7%b3%bb%e4%ba%ba%e5%88%97%e8%a1%a8/" target="_blank">http://blog.jiexoo.com/2008/05/21/%e7%94%a8httpclient%e8%8e%b7%e5%8f%96hotmail%e8%81%94%e7%b3%bb%e4%ba%ba%e5%88%97%e8%a1%a8/</a><br />第一步，用HttpClient访问http://login.live.com/login.srf?id=2，这个页面会返回一个登录表单<br /><br />第二步，解析出form中所有的隐含变量和form的action，这些变量是你必须要通过httpClient Post回去,hotmail服务器会验证这些参数，另外，你还必须传递一个PwdPad变量，它的值是IfYouAreReadingThisYouHaveTooMuchFreeTime  从后面截取登录密码长度的值，比如你的密码是123,则PwdPad的值是IfYouAreReadingThisYouHaveTooMuchFreeT  <br /><br />第三、为了知道你接下来导向的地址，你必须解析服务器给你返回的脚本，其中relpace(”***”)中的***即为重定向的地址<br /><br />第四、得到上一步重定向后的真实的主机地址，联系人列表页面的具体地址就是http://+ hostAddress + /mail/GetContacts.aspx<br /><br />第五、用正则表达式解析此页面即可<br /><br />具体代码如下:<br /><pre name="code" class="java">  import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.Cookie;
    import org.apache.commons.httpclient.NameValuePair;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.httpclient.methods.PostMethod;
    import org.apache.commons.httpclient.cookie.CookiePolicy;
    import org.apache.commons.lang.StringUtils;

    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.io.InputStream;
    import java.io.IOException;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;

    /**
     * User: cjp
     * Date: 2008-4-30
     * Time: 9:26:58
     */
    public class HotmailImporter {
        public static String[] parseContact(String loginname, String password) throws Exception {
            HttpClient client = new HttpClient();
            client.getParams().setCookiePolicy(
                    CookiePolicy.BROWSER_COMPATIBILITY);

            //获取登录页面html
            String hotmailUrl = “http://login.live.com/login.srf?id=2“;
            GetMethod hotmailGet = new GetMethod(hotmailUrl);
            hotmailGet.setRequestHeader(”Accept”, “image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*”);
            hotmailGet.setRequestHeader(”Accept-Language”, “zh-cn”);
            hotmailGet.setRequestHeader(”User-Agent”, “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 2.0.50727)”);
            hotmailGet.setRequestHeader(”Host”, “www.hotmail.com“);
            hotmailGet.setRequestHeader(”Connection”, “Keep-Alive”);
            client.executeMethod(hotmailGet);

            String responseStr = hotmailGet.getResponseBodyAsString();

            hotmailGet.releaseConnection();

            //传递所有的cookie
            Cookie[] cookies = client.getState().getCookies();
            String cookieStr = “”;
            for (Cookie cookie : cookies) {
                cookieStr += cookie.getName() + “=” + cookie.getValue() + “;”;
            }

            //分析登录页面的HTML，获取action,ppsx,ppft
            String actionUrl = getFormUrl(responseStr);

            NameValuePair loginPair = new NameValuePair(”login”, loginname);
            NameValuePair loginOptionsPair = new NameValuePair(”LoginOptions”, “2″);
            NameValuePair passwdPair = new NameValuePair(”passwd”, password);
            NameValuePair ppsxPair = new NameValuePair(”PPSX”, getInputValue(”ppsx”, responseStr));
            NameValuePair ppftPair = new NameValuePair(”PPFT”, getInputValue(”ppft”, responseStr));

            //算出pwdpad
            String pwdpad = “IfYouAreReadingThisYouHaveTooMuchFreeTime”;
            pwdpad = StringUtils.substring(pwdpad, 0, pwdpad.length() - password.length());
            NameValuePair pwdpadPair = new NameValuePair(”PwdPad”, pwdpad);
            PostMethod loginPost = new PostMethod(actionUrl);
            loginPost.setRequestBody(new NameValuePair[]{loginPair, passwdPair, ppsxPair, ppftPair, loginOptionsPair, pwdpadPair});

            loginPost.setRequestHeader(”Accept”, “image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*”);
            loginPost.setRequestHeader(”Referer”, hotmailGet.getURI().toString());
            loginPost.setRequestHeader(”Accept-Language”, “zh-cn”);
            loginPost.setRequestHeader(”User-Agent”, “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 2.0.50727)”);
            loginPost.setRequestHeader(”Host”, “login.live.com”);
            loginPost.setRequestHeader(”Connection”, “Keep-Alive”);
            loginPost.setRequestHeader(”Cache-Control”, “no-cache”);

            loginPost.setRequestHeader(”Cookie”, cookieStr);

            client.executeMethod(loginPost);

            String str = loginPost.getResponseBodyAsString();
            loginPost.releaseConnection();

            String toUrl = StringUtils.substringBetween(str, “replace(\”", “\”);}function OnBack()”);

            //获取登录后的跳转页面
            GetMethod getMethod = new GetMethod(toUrl);
            client.executeMethod(getMethod);

            //获取联系人列表
            GetMethod contactMethod = new GetMethod(”http://” + getMethod.getURI().getHost() + “/mail/GetContacts.aspx”);
            getMethod.releaseConnection();

            client.executeMethod(contactMethod);
            List&lt;String> contacts = parseContacts(contactMethod.getResponseBodyAsStream());
            contactMethod.releaseConnection();
            //noinspection ToArrayCallWithZeroLengthArrayArgument
            return contacts.toArray(new String[]{});
        }
        private static List&lt;String> parseContacts(InputStream contactsContent) throws IOException {
            List&lt;String> contacts = new ArrayList&lt;String>();
            BufferedReader in = new BufferedReader(new InputStreamReader(contactsContent));
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
                String[] values = line.split(”,”);
                if (values.length &lt; 47) continue;
                String email = parseValue(values[46]);
                if (email.length() == 0) continue;
                email = email.toLowerCase();

                if (isEmailAddress(email)) {
                    contacts.add(email);
                }
            }
            return contacts;
        }

        private static String parseValue(String value) {
            if (value.length() > 0 && value.charAt(0) == ‘”‘) {
                value = value.substring(1, value.length() - 1);
            }
            return value;
        }

        private static String getFormUrl(String content) throws Exception {
            content = content.substring(content.indexOf(”&lt;form”) + 5);
            String actionAttribute = content.split(”\\s+”)[5];
            Pattern p = Pattern.compile(”\”(.*?)\”");
            Matcher matcher = p.matcher(actionAttribute);
            if (!matcher.find()) {
                throw new Exception(”hotmail登录界面已改变，无法正常解析”);
            }
            return matcher.group(1);
        }

        private static String getInputValue(String name, String content) throws Exception {
            Pattern p = Pattern.compile(”^.+value=\”([^\\s\"]+)\”");
            int index = content.indexOf(name.toUpperCase()) + name.length() + 2;
            content = content.substring(index, index + 200 > content.length() ? content.length() : index + 200);

            Matcher matcher = p.matcher(content);
            if (!matcher.find()) {
                throw new Exception(”hotmail登录界面已改变，无法正常解析”);
            }
            return matcher.group(1);
        }

        public static boolean isEmailAddress(String email) {
            Pattern emailPattern = Pattern.compile(
                    “^[0-9a-z]([-_.~]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$”
            );
            return emailPattern.matcher(email).matches();
        }

        public static void main(String[] args) {
            try {
                String[] contacts = parseContact(”test@live.cn“, “test”);
                System.out.println(Arrays.toString(contacts));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }</pre>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/195469#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 May 2008 00:41:57 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/195469</link>
        <guid>http://johnnyhg.javaeye.com/blog/195469</guid>
      </item>
      <item>
        <title>简单实现三种清除cache时的排序策略</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/195218" style="color:red;">http://johnnyhg.javaeye.com/blog/195218</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CacheManager类<br />使用一个HashMap来缓存从数据库中查询出的Object,并提供获取，存放，清除的方法<br /><pre name="code" class="java">
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

class CostComparator implements Comparator {
public int compare(Object o1, Object o2) {
return ((Double) o1).compareTo((Double) o2);
}

public boolean equals(Object o) {
return super.equals(o);
}
}

public class CacheManager {
//三种清除cache时的排序策略
public static int LRU = 0;

public static int LFU = 1;

public static int MIX = 2;

//使用一个HashMap来存储Object
private HashMap cacheHashMap = new HashMap();

private int CACHE_CAPACITY = 100;

private int TRESHOLD = 90;

private int purgeAlgorithm;

private long hitCount = 0;

private long missCount = 0;

public CacheManager(int purgeAlgorithm, int cacheCapacity, int treshold) {
this.purgeAlgorithm = purgeAlgorithm;
CACHE_CAPACITY = cacheCapacity;
TRESHOLD = treshold;
}

public CacheManager(int purgeAlgorithm) {
this.purgeAlgorithm = purgeAlgorithm;
}

/**
*根据字符串identifier从cacheHashMap容器中获取cachedObject对象
*如果cacheHashMap中没有identifier键，或cachedObject已经过时，则返回null,
*同时missCount值加1
*否则获取对应的cachedObject对象，并使hitCount加1
*/
public synchronized Object getCache(String identifier) {
CachedObject cachedObject = (CachedObject) cacheHashMap.get(identifier);
Object obj = null;

if (cachedObject == null) {
missCount++;
} else if (cachedObject.isExpired()) {
cacheHashMap.remove(identifier);
missCount++;
} else {
cachedObject.incNumAccess();
cachedObject.setLastAccessTime(new Date());
hitCount++;
obj = cachedObject.getObject();
}
return obj;
}

public synchronized void invalidate(String identifier) {
cacheHashMap.remove(identifier);
}

public long getHitCount() {
return hitCount;
}

public long getMissCount() {
return missCount;
}

public long getCurrentCacheSize() {
return cacheHashMap.size();
}

public synchronized void putCache(Object object, String id,
int minutesToLive) {
CachedObject cachedObject = new CachedObject(object, id, minutesToLive);
if (cacheHashMap.size() == CACHE_CAPACITY) {
sweep();
}
cacheHashMap.put(id, cachedObject);
}

/**
*cacheHashMap容器的整理
*先将超时的cachedObject清除，
*当cachedObject数量大于TRESHOLD时，将访问频率小（次数小）的cachedObject清除
*/
public synchronized void sweep() {
TreeMap costTreeMap = new TreeMap(new CostComparator());
for (Iterator i = cacheHashMap.entrySet().iterator(); i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
CachedObject cachedObject = (CachedObject) entry.getValue();
if (cachedObject.isExpired()) {
cacheHashMap.remove(entry.getKey());
} else {
double cost = 0.0;
switch (purgeAlgorithm) {
case 0:
cost = cachedObject.getLFUCost();
break;
case 1:
cost = cachedObject.getLRUCost();
break;
default:
cost = cachedObject.getMixCost();
}
costTreeMap.put(new Double(cost), entry.getKey());
}
}

// delete to treshold
for (int i = cacheHashMap.size(); i > TRESHOLD; i--) {
Object kk = costTreeMap.firstKey();
Object k = costTreeMap.get(kk);
cacheHashMap.remove(k);
costTreeMap.remove(kk);
}
}

public void clearCache() {
hitCount = 0;
missCount = 0;
cacheHashMap.clear();
}

/**
*将字符数组生成形如:"keys1/keys2/keys3"的字符串
*/
public static String createKey(String[] keys) {
StringBuffer newKey = new StringBuffer("");
for (int i = 0; i &lt; keys.length; i++)
newKey.append(keys[i]).append("/");
return newKey.toString();
}
}

//==============================
//DAOCacheManager类
//持有一个静态的CacheManager类对象，提供对其的操作方法
//业务方法都要通过他来使用cacheManager
//---------------------------------------------------------
// Application: Company Applcation
// Author : Cao guangxin
// File : DAOCacheManager.java
//
// Copyright 2006 RelationInfo Software
// Writed at Wed Apr 12 08:58:55 CST 2006
// writed by Eclipse SDK
// Visit http://www.37signals.cn
//---------------------------------------------------------

package net.cn37signals.company.dao;

import java.text.MessageFormat;

import net.cn37signals.company.util.CacheManager;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class DAOCacheManager {
private static Log log = LogFactory.getFactory().getInstance("DAOCacheManager");
//cacheManager是静态的，供多个线程公用
private static CacheManager cacheManager = new CacheManager(CacheManager.MIX);

/**
*从cache中获取对象
*/
public static Object getCache(String identifier) {
if (log.isInfoEnabled()) {
Object[] o = {new Long(cacheManager.getHitCount()), new Long(cacheManager.getMissCount())};
log.info(MessageFormat.format(" [DAOCacheManager] getCache: {0} hits, {1} misses", o));
}
return cacheManager.getCache(identifier);
}

/**
*将对象放入cache中
*/
public static void putCache(Object object, String id, int minutesToLive) {
if (log.isInfoEnabled()) {
log.info(" [DAOCacheManager] putCache");
}
cacheManager.putCache(object, id, minutesToLive);
}

public static void invalidate(String id) {
cacheManager.invalidate(id);
}

}
//=====================
CachedObject类
对要放入cache的对象进行包装
//---------------------------------------------------------
// Application: Company Applcation
// Author : Cao guangxin
// File : CachedObject.java
//
// Copyright 2006 RelationInfo Software
// Writed at Wed Apr 12 08:58:55 CST 2006
// writed by Eclipse SDK
// Visit http://www.37signals.cn
//---------------------------------------------------------

package net.cn37signals.company.util;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class CachedObject {

public Object object = null;
private Date dateofExpiration = null;
private String identifier = null;
private Date lastAccessTime = new Date();
private long numAccess = 1;
private int size;

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

public CachedObject(Object obj, String id, int minutesToLive) {
this.object = obj;
this.identifier = id;

size = objectSize(obj);
lastAccessTime = new Date();
// minutesToLive of 0 means it lives on indefinitely.
if (minutesToLive != 0) {
Calendar cal = Calendar.getInstance();
cal.setTime(lastAccessTime);
cal.add(cal.MINUTE, minutesToLive);
dateofExpiration = cal.getTime();
}
}

public void setLastAccessTime(Date lastAccessTime) {
this.lastAccessTime = lastAccessTime;
}

public boolean isExpired() {
// Remember if the minutes to live is zero then it lives forever!
if (dateofExpiration != null && dateofExpiration.before(new Date())) {
return true;
}
return false;
}

public String getIdentifier() {
return identifier;
}

public Object getObject() {
return object;
}

public Date getDateofExpiration() {
return (this.dateofExpiration);
}

public Date getLastAccessTime() {
return (this.lastAccessTime);
}

public long getNumAccess() {
return (this.numAccess);
}

public long getSize() {
return (this.size);
}

public double getMixCost() {
long milis = new Date().getTime() - lastAccessTime.getTime();
if(milis == 0) {
milis = 1;
}
return (double)numAccess / (double)milis / (double)size;
}

public double getLRUCost() {
long milis = new Date().getTime() - lastAccessTime.getTime();
if(milis == 0) {
milis = 1;
}
return 1.0/(double)milis;
}

public double getLFUCost() {
return (double) numAccess;
}

public void incNumAccess() {
numAccess++;
}

public boolean equals(Object o2) {
try {
String key2 = ((CachedObject) o2).getIdentifier();
return identifier.equals(key2);
} catch (Exception e) {
return false;
}
}

private static int objectSize(Object o) {
try {
int size = ((List) o).size();
return size + 1;
} catch (Exception e) {
return 1;
}
}

}
//==============================
//使用方法
public List list(int offset, int limit) throws SQLException {
String[] objKeys = {"Users", "list", String.valueOf(offset), String.valueOf(limit)};
String objKey = CacheManager.createKey(objKeys);
ArrayList list = (ArrayList) DAOCacheManager.getCache(objKey);
//如果cache的hashmap中有，直接取出，没有则从数据库中查询，并放入hashmap中
if (list != null)
return list;
//--
//从数据库中查询(略)
//--
//将查询结果放入cache
DAOCacheManager.putCache(list, objKey, 1);
return list;
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/195218#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 May 2008 13:01:25 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/195218</link>
        <guid>http://johnnyhg.javaeye.com/blog/195218</guid>
      </item>
      <item>
        <title>类似于&lt;a name=&quot;p_156572&quot;&gt;的方法</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/195068" style="color:red;">http://johnnyhg.javaeye.com/blog/195068</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="js">    var scroll_to = $("p_156572");
    if(scroll_to) {
      document.observe("dom:loaded", function() {Element.scrollTo(scroll_to);});
    }</pre>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/195068#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 May 2008 02:15:57 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/195068</link>
        <guid>http://johnnyhg.javaeye.com/blog/195068</guid>
      </item>
      <item>
        <title>Hibernate3.1插入中文乱码解决办法</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/194652" style="color:red;">http://johnnyhg.javaeye.com/blog/194652</a>&nbsp;
          发表时间: 2008年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>又碰到Hibernate3.1插入中文乱码的问题了，好在瞎掰几下弄好了。<br />
记下来，没准下次还遇上。<br />
<br />
我的开发环境：Hibernate3.1+mysql5.0+jdk5.0<br />
<br />
1、先检查my.ini，修改default-character-set=utf-8（urf-8大小写均可）<br />
2、检查hibernate.cfg.xml中的connection.url属性。应该为：</p>
<pre name="code" class="xml">&lt;property name=&quot;connection.url&quot;&gt;
     jdbc:mysql://localhost:3306/izou?useUnicode=true&amp;amp;characterEncoding=UTF-8
&lt;/property&gt;</pre>
<p>
<br />
3、写段程序试试：</p>
<pre name="code" class="java">		Session session = HibernateSessionFactory.getSession();
		Transaction tx = session.beginTransaction();

		UserDAO udao = new UserDAO();
		String name = &quot;中国人&quot;;
		User user = new User();
		user.setUsrName(name);
		udao.save(user);

		tx.commit();
		HibernateSessionFactory.closeSession();
</pre>
<p>
<br /></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/194652#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 19 May 2008 23:14:39 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/194652</link>
        <guid>http://johnnyhg.javaeye.com/blog/194652</guid>
      </item>
      <item>
        <title>什么是软件工程？</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/177959" style="color:red;">http://johnnyhg.javaeye.com/blog/177959</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我现在最怕的是别人跟我讲软件工程了，说起来头头是道，做起来另外一套。<br />我觉得软件工程的目的就是使开发过程性价比最大化。<br />所以，在中国，客户是上帝。销售把上帝忽悠好了，程序员可以省去非常多的麻烦。送点钱，吃吃喝喝也是软件工程中非常重要的一部分。<br />所以，软件公司的销售人员永远都比程序员受到重视！
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/177959#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 31 Mar 2008 11:29:48 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/177959</link>
        <guid>http://johnnyhg.javaeye.com/blog/177959</guid>
      </item>
      <item>
        <title>Oracle的导入导出命令</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/177344" style="color:red;">http://johnnyhg.javaeye.com/blog/177344</a>&nbsp;
          发表时间: 2008年03月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件，imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 利用这个功能可以构建两个相同的数据库，一个用来测试，一个用来正式使用。<br /> <br />执行环境：可以在SQLPLUS.EXE或者DOS（命令行）中执行，<br /> DOS中可以执行时由于 在oracle 8i 中  安装目录ora81BIN被设置为全局路径，<br /> 该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。<br /> oracle用java编写，SQLPLUS.EXE、EXP.EXE、IMP.EXE这两个文件有可能是被包装后的类文件。<br /> SQLPLUS.EXE调用EXP.EXE、IMP.EXE所包裹的类，完成导入导出功能。<br /> <br />下面介绍的是导入导出的实例。<br />数据导出：<br /> 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:daochu.dmp中<br />   exp system/manager@TEST file=d:daochu.dmp full=y<br /> 2 将数据库中system用户与sys用户的表导出<br />   exp system/manager@TEST file=d:daochu.dmp owner=(system,sys)<br /> 3 将数据库中的表inner_notify、notify_staff_relat导出<br />    exp aichannel/aichannel@TESTDB2 file= d:datanewsmgnt.dmp tables=(inner_notify,notify_staff_relat)<br /><br /> 4 将数据库中的表table1中的字段filed1以"00"打头的数据导出<br />   exp system/manager@TEST file=d:daochu.dmp tables=(table1) query=" where filed1 like '00%'"<br /> <br />  上面是常用的导出，对于压缩，既用winzip把dmp文件可以很好的压缩。<br />  也可以在上面命令后面 加上 compress=y 来实现。<br /><br />数据的导入<br /> 1 将D:daochu.dmp 中的数据导入 TEST数据库中。<br />   imp system/manager@TEST  file=d:daochu.dmp<br />   imp aichannel/aichannel@HUST full=y  file=d:datanewsmgnt.dmp ignore=y<br />   上面可能有点问题，因为有的表已经存在，然后它就报错，对该表就不进行导入。<br />   在后面加上 ignore=y 就可以了。<br /> 2 将d:daochu.dmp中的表table1 导入<br /> imp system/manager@TEST  file=d:daochu.dmp  tables=(table1)<br /> <br /> 基本上上面的导入导出够用了。不少情况要先是将表彻底删除，然后导入。<br /> <br />注意：<br /> 操作者要有足够的权限，权限不够它会提示。<br /> 数据库时可以连上的。可以用tnsping TEST 来获得数据库TEST能否连上。<br /><br />附录一：<br /> 给用户增加导入数据权限的操作<br /> 第一,启动sql*puls<br /> 第二，以system/manager登陆<br /> 第三，create user 用户名 IDENTIFIED BY 密码 （如果已经创建过用户，这步可以省略）<br /> 第四，GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,<br />   DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,<br />      DBA,CONNECT,RESOURCE,CREATE SESSION  TO 用户名字<br /> 第五, 运行-cmd-进入dmp文件所在的目录,<br />      imp userid=system/manager full=y file=*.dmp<br />      或者 imp userid=system/manager full=y file=filename.dmp<br /><br /> 执行示例:<br /> F:WorkOracle_Databackup>imp userid=test/test full=y file=inner_notify.dmp<br /><br />屏幕显示<br />Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006<br />(c) Copyright 2000 Oracle Corporation.  All rights reserved.<br /><br />连接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production<br />With the Partitioning option<br />JServer Release 8.1.7.0.0 - Production<br /><br />经由常规路径导出由EXPORT:V08.01.07创建的文件<br />已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入<br />导出服务器使用UTF8 NCHAR 字符集 (可能的ncharset转换)<br />. 正在将AICHANNEL的对象导入到 AICHANNEL<br />. . 正在导入表                  "INNER_NOTIFY"          4行被导入<br />准备启用约束条件...<br />成功终止导入，但出现警告。<br /><br /> <br />附录二：<br /> Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.<br />  先建立import9.par,<br />  然后，使用时命令如下：imp parfile=/filepath/import9.par<br />  例 import9.par 内容如下：<br />        FROMUSER=TGPMS      <br />        TOUSER=TGPMS2     （注：把表的拥有者由FROMUSER改为TOUSER，FROMUSER和TOUSER的用户可以不同）         <br />        ROWS=Y<br />        INDEXES=Y<br />        GRANTS=Y<br />        CONSTRAINTS=Y<br />        BUFFER=409600<br />        file==/backup/ctgpc_20030623.dmp<br />        log==/backup/import_20030623.log
          <br/>
          <span style="color:red;">
            <a href="http://johnnyhg.javaeye.com/blog/177344#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Mar 2008 16:31:27 +0800</pubDate>
        <link>http://johnnyhg.javaeye.com/blog/177344</link>
        <guid>http://johnnyhg.javaeye.com/blog/177344</guid>
      </item>
      <item>
        <title>搜索引擎优化基础，第 4 部分: 改进大型站点的搜索营销</title>
        <author>johnnyhg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johnnyhg.javaeye.com">johnnyhg</a>&nbsp;
          链接：<a href="http://johnnyhg.javaeye.com/blog/175808" style="color:red;">http://johnnyhg.javaeye.com/blog/175808</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <blockquote>作为一名 Web 站点开发人员，使您的 Web
站点得到搜索引擎的关注是获得成功的关键因素之一。在这个共分四部分的系列中，您将学习对 Web
站点进行有机优化所需的基础知识。在这个系列的最后一部分中，您将学习专门针对大型 Web 站点或具有许多动态页面的站点的技术。</blockquote><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->

<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
			<p>您的 Web 站点有多大？数千个页面？数百万个页面？如果页面数量超过几千个，那么在搜索引擎优化方面就会遇到在小型站点中没有的特殊问题。我们来谈谈如何对大型站点进行成功的 SEO。</p>
			<p>大型 Web 站点对 SEO 提出了一些新挑战。如果您能够将整个 Web 团队集合在一间会议室中，那么您的站点还不算大。您或许拥有一家非常成功的企业，但是您的问题不同于我们这个四部分的 SEO 系列所探讨的问题。</p>
			<p>在 <a href="http://www.ibm.com/developerworks/cn/web/wa-seo1.html">第 1 部分</a> 和 <a href="http://www.ibm.com/developerworks/cn/web/wa-seo2/">第 2 部分</a> 中，Jennette Banks 概述了搜索营销以及关键词规划和优化的基础知识。在 <a href="http://www.ibm.com/developerworks/cn/web/wa-seo3.html">第 3 部分</a>
中，我们集中介绍了如何让页面进入搜索索引。在这三篇文章中，您看到了所有 Web 站点（无论规模如何）必须如何做才能吸引 Google
等互联网搜索引擎的关注。但是，大型 Web 站点确实有所不同。如果您的 Web 站点由数千甚至数百万页面组成，就会遇到这些特殊的 SEO 挑战。</p>
			<p>在第 4 部分中，我们要解决<em>大型</em> Web 站点特有的问题。我们将讨论维护大型 Web 站点的大型 Web 团队为什么会给搜索营销造成问题，还将探讨全球化 Web 站点和具有许多动态 Web 页面的站点的技术挑战。 </p>
			<p><a name="N1008E"></a><span class="atitle">说服大型组织关注搜索问题</span></p>
			<p>大型站点的 SEO 之所以问题多多，是因为需要许多不同的小组都采取适当的措施，SEO 才能获得成功（参见 <a href="http://www.ibm.com/developerworks/cn/web/wa-seo4.html#resources">参考资料</a>）。无论怎样对 Web 站点和 Web 团队进行组织，它们都会被划分为小组，这些小组就会造成问题。根据站点的不同，您可能会遇到下面这些问题或其中一部分问题：</p>
			<ul><li>
					<em>多个专家团队</em>。开发人员和信息架构师之间没有交流，营销人员和 Web 管理员之间也缺乏协作。</li><li>
					<em>多个产品站点</em>。您销售的每种产品都由单独的团队负责，他们都会从头开始设计站点的 Web 体验。</li><li>
					<em>多种受众</em>。每个营销团队都针对一个或多个目标市场对单独的 Web 站点进行设计。</li><li>
					<em>多个国家和多种语言</em>。玻利维亚站点和巴西站点由不同的团队负责。</li><li>
					<em>多种技术</em>。营销页面使用门户服务器，产品目录使用电子商务服务器 &mdash;&mdash; 而且这些技术来自不同的厂商。</li></ul>
			<p>尽
管看似令人畏缩，但可以将整个 Web 站点上的多个 Web
小组组织起来，让他们表现得就像一个搜索营销团队一样。可以让各个小组采取一致的行动，这样就不会分散力量。正如在本系列前面的文章中所介绍的，每个
Web 站点的所有者都必须采取一些重要的措施，以确保搜索营销能够获得成功，但是大型站点需要采用更有组织的方式：</p>
			<ul><li>
					<em>对 Web 团队进行培训</em>。
程序员必须恰当地使用 JavaScript 代码。文字编写人员必须在文本中使用目标关键词。如果不进行培训，Web
团队就不知道应该做什么。对于大型 Web
站点，这些低层任务在本质上没有特殊之处，但是在大型组织中需要掌握这种技能的人很多。全面的有组织的培训计划对于大型站点的成功非常重要。</li><li>
					<em>设置标准</em>。
为编写 robots.txt 文件的方式建立一个标准。修改现有的内容标准以确保每个页面都有页面标题。简单地说，要确保所有标准都反映 SEO
最佳实践。提供了标准之后，每位专家都要完成搜索营销所需的任务，因为服从这些标准已经成了他们的工作。小型站点和大型站点之间的差异是，大型站点是过程
驱动的。将适当的 SEO 实践添加进标准中之后，就可以使用这些过程来实现 SEO。</li><li>
					<em>实施标准</em>。
尽可能检查完成的工作是否符合现有的过程（比如页面和代码复查）和其他项目规则。还可能需要实现一些新的检查方法。如果 Web
管理员忽视了关于重定向的标准，那么使用一个爬行器来检查重定向并标出不适当的重定向。如果文字编写人员忽视了在页面标题中包含关键词的要求，那么让您的
爬行器检查站点上的每个页面，并报告没有适当页面标题的页面。要尽可能强制要求所有人遵守现有过程或刚建立的新过程。</li><li>
					<em>衡量站点的进展</em>。
要不断关注针对重要关键词的搜索排名。度量 Web 站点的每个部分的流量并观察其变化趋势。统计符合重定向和内容标准的页面数量。然后，定期与
Web 站点每个部分的负责人分享这些结果。对每个业务单位的表现进行评分，这会督促各位负责人，他们进而会督促其下属完成所需的任务。</li></ul>
			<p>当
然，这种组织性的变化会给人造成一定的压力。但是，如果将整个 Web
团队组织在一起并采用正确的实践，那么您的大型站点会由于好名声（使搜索者愿意点击您的页面）、高质量的内容（使其他站点愿意链接您的站点）和更高的营销
预算（允许投资于更好的设计和技术）而获益。关于将团队组织在一起的更多信息，请参见 <a href="http://www.ibm.com/developerworks/cn/web/wa-seo4.html#resources">参考资料</a>。</p>
			<p>成功的关键是<em>说服</em>。
计算增加的站点流量会带来多大的好处，从而说明搜索改进的价值。告诉大家竞争对手在搜索结果中的排名比您的公司高多少，让他们有急迫感。要求团队作为搜索
者亲自体验一下，从而让他们理解为什么搜索改进那么重要。请记住，没有人存心破坏您的搜索改进计划 &mdash;&mdash;
他们只是没有意识到这些工作的意义。越充分地向他们解释这些工作的作用，让他们融入其中，就会越快地看到成果。</p>
			<p><a name="N100E8"></a><span class="smalltitle">说服团队</span></p>
			<p>在
这个方面要多加努力。您知道什么方式最适合在公司中推广新思想吗？您的组织可以发布电子邮件新闻通告吗？召开会议？Blog？Podcast？Web
研究会？还是需要更个性化的接触方式？如果需要，可以为每个地区办公室制作 PowerPoint
幻灯片。要确保消息被可靠地发出和接收，从而改变团队的工作方式。</p>
			<p>得到了团队成员的理解，他们在工作时已经考虑到了 SEO 原则，在此之后还可能要面对两个大挑战：如何跨全球范围进行搜索营销以及如何处理动态 Web 站点。</p>
			<br /><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td></tr></tbody></table><table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br /><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/web/wa-seo4.html#main" class="fbox"><strong>回页首</strong></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N100F4"></a><span class="atitle">接触全球的受众</span></p>
			<p>在一个国家用一种语言进行搜索营销有一定难度，随着 Web 站点涉及的国家和语言的增加，问题会成倍增加。我们先讨论国家问题，然后讨论语言问题。</p>
			<p>搜索者常常希望将搜索结果限制于某一国家，尤其是在打算进行网上购物时：他们希望在自己的国家中找到一家使用本国货币进行交易的厂商。这很简单，不是吗？不完全是。为了进行有机搜索，判断每个页面的正确国家不能仅仅依靠搜索引擎的猜测。</p>
			<p>那么，Google 和其他搜索引擎如何猜测页面的国家呢？它们使用站点域名（&ldquo;mydomain.com&rdquo;）的 IP 地址来判断站点的 Web 服务器所在的国家（参见 <a href="http://www.ibm.com/developerworks/cn/web/wa-seo4.html#resources">参考资料</a>）。如果泰国页面实际上就在泰国，那么没问题。如果为了节约经费，针对东南亚的所有页面都放在中国，搜索引擎就会误认为这些泰国页面是属于中国的。</p>
			<p>实
际上，搜索引擎比这要聪明一点儿，但只是一点儿。除了查看服务器所在的国家之外，它们还会查看顶级域名（.com、.de
等等）来判断国家。无论页面驻留在哪里，在 URL 中使用国家顶级域名（比如 &ldquo;de&rdquo; 表示德国）的页面（比如
&ldquo;www.deutschefirma.de&rdquo;）会被认为是属于那个国家的页面。</p>
			<p>遗憾的是，大多数全球化 Web
站点对每个页面都使用 &ldquo;.com&rdquo; 顶级域名。例如，IBM 的德国主页是
&ldquo;www.ibm.com/de&rdquo;，除非这个页面放在德国，否则搜索引擎不会意识到这个页面来自德国。这个问题很重要，因为如果搜索者将结果限制为来自德
国的页面，他们就找不到这个来自 IBM 的页面。</p>
			<p>幸运的是，有经验的搜索者已经习惯了搜索引擎的这一缺陷，所以他们常常会搜索用<em>德语</em> 编写（而不是来自<em>德国</em>）的页面，从而找到想要的页面。从长远来看，搜索引擎可能会变得更聪明，可以认出 IBM 的德国主页属于德国，到那时，搜索者就不需要这么有经验了。</p>
			<p><a name="N10117"></a><span class="smalltitle">语言问题</span></p>
			<p>Google 和 Yahoo!&trade; 都是美国的大型搜索引擎，但是对于世界的其他地方，怎么样呢？Google 实际上在许多国家都占据第一位，但是也要注意在一两个国家市场上占优势的本地搜索引擎（参见 <a href="http://www.ibm.com/developerworks/cn/web/wa-seo4.html#resources">参考资料</a>）。一定要参阅 Search Engine Watch 报告（参见 <a href="http://www.ibm.com/developerworks/cn/web/wa-seo4.html#resources">参考资料</a>），了解各国市场上搜索引擎的份额分布，这样就可以针对适当的搜索引擎进行 SEO 工作，并度量来自适当搜索引擎的流量。</p>
			<p>搜索引擎不容易判断出页面的国家，但是它们在探测页面的语言方面要出色得多。搜索引擎一般会通过三方面的迹象来判断页面的语言：它的语言元标记，比如 &lt;meta http-equiv=&quot;content-language&quot; content=&quot;ja&quot;&gt; 表示日语；它的字符编码，比如 &lt;meta http-equiv=&quot;content-type&quot; content= &quot;text/html; charset=shift-jis&quot;&gt;；以及<em>对内容进行分析</em>。因为页面上编写的语言和字符编码常常不正确，所以只有在搜索引擎无法通过分析页面上的单词模式识别出语言的情况下，才会使用这些信息（参见 <a href="http://www.ibm.com/developerworks/cn/web/wa-seo4.html#resources">参考资料</a>）。</p>
			<p>在大多数情况下，搜索引擎会正确地探测出页面的语言，而不需要您采取任何措施。但是，对于单词非常少的页面，在页面上正确地编写语言和字符集元标记就很重要了；否则的话，当搜索者寻找用特定语言编写的页面时，搜索引擎就不会包含您的页面。</p>
			<p>但
是，让搜索引擎正确地探测出页面的语言只是个开始。如果您用英语执行所有 SEO
任务，并简单地将结果翻译成其他语言，就会遇到问题。假设您为产品选择了最流行的英语关键词，然后将它们翻译成德语：这不能保证您选择了最流行的德语单
词。翻译出的单词在语言学上是正确的，但对于搜索不一定是最优的。如果在德国 SEO 工作中选择了意思正确但不常用的关键词，效果就会大打折扣（参见
<a href="http://www.ibm.com/developerworks/cn/web/wa-seo4.html#resources">参考资料</a>）。</p>
			<p>即使对页面的英语版本进行了精心的处理，使其包含正确的关键词，而且在每个页面上都使用适当数量的关键词，也不要指望标准的翻译过程会保持英语优化的成果。必须按照与英语页面相同的方式对德语页面进行优化，以求获得相似的 SEO 效果。</p>
			<p>在进行全球化搜索营销活动时，要记住这些关于语言和国家的提示，这样才能在竞争中领先。</p>
			<br /><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td></tr></tbody></table><table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br /><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/web/wa-seo4.html#main" class="fbox"><strong>回页首</strong></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N1014C"></a><span class="atitle">如何处理动态站点？</span></p>
			<p>大型 Web 站点通常用动态页面进行装载 &mdash;&mdash; 它们使大型站点更容易保持新颖的内容和设计。但是，对于动态页面进行优化更困难。</p>
			<p>Google 用同样的方式对待动态页面和静态页面的内容，所以本系列前面的文章中讨论的所有内容优化技术也适用于动态页面。</p>
			<p>对于静态页面，文字编写人员只需编辑包含页面内容的 HTML 文件 &mdash;&mdash; 例如，在页面标题中添加关键词。动态页面就没这么简单了。因为动态页面是由程序动态地生成的，所以页面的内容来自两种不同类型的来源：</p>
			<ul><li>
					<em>数据库</em>。页面上变化的信息（动态部分）常常来自某种关系数据库或其他数据库。例如，产品描述页面可能会从电子商务目录数据库中提取信息。实际上，动态页面可以从许多来源提取信息，甚至是那些不称为数据库的来源，比如内容管理系统。</li><li>
					<em>模板</em>。页面上保持不变的信息（比如每个产品页面上都有的公司名称和 &ldquo;添加到购物车&rdquo; 按钮）常常保存在一个模板文件中，这个文件还指定使用哪些 HTML 标记来生成页面。</li></ul>
			<p>为了对动态页面上的内容进行优化，首先必须查明内容来自哪里，然后才能修改它。内容由负责更新数据库的小组来管理 &mdash;&mdash; 可能是内容管理系统的文字编写人员，或者是产品目录的数据输入员。</p>
			<p>另一方面，模板常常由 Web 开发人员控制。在某些情况下，模板是一个容易更新的单独的文件 &mdash;&mdash; 大多数内容管理系统就采用这种方式。在其他时候，HTML 存储在软件本身中，所以程序员必须修改软件才能改变 HTML。</p>
			<p>与
修改静态页面相比，修改动态页面往往要花费更多精力和时间来说服团队。这是坏消息。好消息是，如果说服了团队修改一个动态页面，他们常常会修改所有动态页
面。对于静态页面，修改一个页面时仅影响这一个页面。使用来自数据库的内容通常还会简化质量控制，因为与用 HTML
编辑器检查静态页面相比，数据输入程序可以更容易地检查输入。</p>
			<br /><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td></tr></tbody></table><table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br /><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br /></td><td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/web/wa-seo4.html#main" class="fbox"><strong>回页首</strong></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N10174"></a><span class="atitle">结束语</span></p>
			<p>SEO 很有挑战性，而在大型站点上挑战会成倍增加。有许多团队同时参与站点的管理，很难让他们向着同一方向努力。而且，多个国家和动态页面也会增加复杂性。</p>
			<p>但是，如果您以前认为 SEO 在大型站点上是不可行的，现在应该知道，这是可行的，也应该知道该怎么去做了。</p>
		<br /><br /><p><a name="resources"></a><span class="atitle">参考资料 </span></p><strong>学习</strong><br /><ul><li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/library/wa-seo4.html?S_TACT=105AGX52&amp;S_CMP=cn-a-wa" target="_blank">英文原文</a> 。<br /></li><li>
				<a href="http://www.mikemoran.com/biznology/Aug2005.htm">Search marketing for large sites</a>：阅读 Mike Moran 在 2005 年 8 月 Biznology Newsletter 中的文章。<br /></li><li>
				<a href="http://www.mikemoran.com/search/workingtogether.htm">Working Together</a>：Mike
Moran 的这篇文章讨论了团队协作的重要性。（这里的概念在 2005 年 3 月的 Search Engine Strategies
会议中的 &ldquo;Big Company and Big Site Search Marketing&rdquo; 研讨会上得到了进一步发展）。<br /></li><li>
				<a href="http://www.linuxjournal.com/article/7856">Geolocation by IP Address</a>：通过 <em>Linux Journal</em> 中 Andrew Turner 的文章了解地理定位的好处和应用它的技术。<br /></li><li>
				<a href="http://www.philb.com/countryse.htm">Country-based search engines</a>：这个站点列出了本地和区域性搜索引擎，当前包含超过 2,600 个搜索引擎和 200 多个国家和地区。<br /></li><li>
				<a href="http://searchenginewatch.com/reports/">Search Engine Watch</a>：这里有大量的 SEO 参考资料，包括在各国市场上搜索引擎的份额分布，可以帮助您针对适当的搜索引擎进行 SEO。<br /></li><li>
				<a href="http://www.submitcorner.com/Guide/Meta/language.shtml">语言元标记</a> 和 <a href="http://www.w3.org/International/O-charset.html">字符编码</a>：用元标记和字符集确保搜索引擎能够正确地识别页面的语言。<br /></li><li>
				<a href="http://www.webworldindex.com/articles/Multilingual-SEO-for-world-markets-Part-1.html">Multilingual SEO for world markets, Part 1</a>：阅