<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>yefeng</title>
    <description>程序员---&gt;高级程序员---&gt;分析师---&gt;架构师</description>
    <link>http://yefeng.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>php5 简单配置</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/213855" style="color:red;">http://yefeng.javaeye.com/blog/213855</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          第一步：把php-5.0.0-Win32.zip解压放到C:\php<br />第二步：php.ini-dist改名为php.ini,找到第438行改成 extension_dir = c:\php\ext<br />第三步：去掉565行;extension=php_mysql.dll前面的";"注释符号<br />第四步：复制php.ini到Winnt目录下,再复制php5ts.dll和libmysql.dll到WINNT\system32\中<br />第五步：打开IIS,添加一个php后缀. (指向c:\php\php5isapi.dll)  isapi筛选器里添加c:\php\php5isapi.dll<br />这是其中一种安装模式<br />（我就是在这里出现了错误：在筛选器那边用的是php.exe,但是在配置里面用的是：php5asapi.dll就发生错误）<br /><br />第六步：重新启动IIS<br />然后将 "php安装目录/libmysql.dll" 和 "php安装目录/ext/php_mysql.dll" 复制到 "c:/windows/system32/" 下<br /><br />测试<br /><br />&lt;?php<br />echo phpinfo();<br />?>
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/213855#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 11:44:46 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/213855</link>
        <guid>http://yefeng.javaeye.com/blog/213855</guid>
      </item>
      <item>
        <title>CAS指令与MESI缓存一致性协议</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/210067" style="color:red;">http://yefeng.javaeye.com/blog/210067</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转：<br /><br /><span style="color: red">CAS（Compare-And-Swap）指令是并行程序设计最基础的基石</span>，随着越来越多的本本都用上了双核，这个世界已经快速步入并行计算时代，CAS指令发挥的作用也就越来越大。CAS指令，在Intel CPU上称为CMPXCHG，的作用是将指定内存地址的内容与所给的某个值相比，如果相等，则将其内容替换为所给的另一个值，这一系列操作是原子的，不可能被中断。基本上所有的同步机制，与信号量、Java中的synchronized等的实现最终都要用到CAS指令，即使锁无关的数据结构也离不开CAS指令。<br /><br />关于CAS指令最著名的传闻是CAS需要锁总线，因此CAS指令不但慢而且会严重影响系统并发度，即使没有冲突是也一样。不过在较新的CPU中（对于Intel CPU来说是486之后），事实并非如此。目前的CPU一般都采用了很好的缓存一致性协议，在很多情况下能够防止锁总线的发生，这其中最著名的就是Intel CPU中使用的MESI缓存一致性协议。<br /><br />先来说说缓存一致性问题。为了提高数据访问效率，每个CPU上都有一个容量很小（现在一般是1M这个数量级），速度很快的缓存，用于缓存最常访问的那些数据。由于操作内存的速度实在太慢，数据被修改时也只更新缓存，并不直接写出到内存中去，这一来就造成了缓存中的数据与内存不一致。如果系统中只有一个CPU，所有线程看到的都是缓存中的最新数据，当然没问题。但如果系统中有多个CPU，同一份内存可能会被缓存到多个CPU中，如果在不同CPU中运行的不同线程看到同一份内存的缓存值不一样就麻烦了，因此有必要维护这多种缓存的一致性。当然要做到这一点只要一有修改操作，就通知所有CPU更新缓存，或者放弃缓存下次访问的时候再重新从内存中读取。但这会Stupid的实现显然不会有好的性能，为解决这一问题，产生了很多维护缓存一致性的协议，MESI就是其中一种。<br /><br />MESI协议的名称由来是指这一协议为缓存的每个数据单位（称为cache line，在Intel CPU上一般是64字节）维护两个状态位，使得每个数据单位可能处于M、E、S或I这四种状态之一。各种状态含义如下：<br /><br />M: 被修改的。处于这一状态的数据只在本CPU中有缓存，且其数据已被修改，没有更新到内存中<br />E: 独占的。处于这一状态的数据只在本CPU中有缓存，且其数据没有被修改，与内存一致<br />S: 共享的。处于这一状态的数据在多个CPU中有缓存<br />I: 无效的。本CPU中的这份缓存已经无效了。<br /><br />当CPU要读取数据时，只要缓存的状态不是I都可以从缓存中读，否则就要从主存中读。这一读操作可能会被某个处于M或E状态的CPU截获，该CPU将修改的数据写出到内存，并将自己设为S状态后这一读操作才继续进行。只有缓存状态是E或M时，CPU才可以修改其中的数据，修改后缓存即处于M状态。如果CPU要修改数据时发现其缓存不处于E或M状态，则需要发出特殊的RFO指令（Read For Ownership），将其它CPU的缓存设为I状态。<br /><br />因此，如果一个变量在某段时间内只被一个线程频繁修改，则对应的缓存早就处于M状态，这时CAS操作就不会涉及到总线操作。所以频繁的加锁并不一定会影响系统并发度，关键是看锁冲突的情况严重不严重，如果经常出现冲突，即缓存一会被这个CPU独占，一会被那个CPU独占，这时才会不断产生RFO，影响到并发性能。
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/210067#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 11:27:59 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/210067</link>
        <guid>http://yefeng.javaeye.com/blog/210067</guid>
      </item>
      <item>
        <title>基于xsl模板技术把ＸＭＬ转成ＪＳＯＮ</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/199650" style="color:red;">http://yefeng.javaeye.com/blog/199650</a>&nbsp;
          发表时间: 2008年06月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          XSL摸板　xml-2-json.xml<br />&lt;?xml version="1.0" encoding="UTF-8"?><br />&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" exclude-result-prefixes="ebl"><br />    &lt;!--====================================================================================<br />    Original version by : Holten Norris ( holtennorris at yahoo.com )<br />    Current version maintained  by: Alan Lewis (alanlewis at gmail.com)<br />    Thanks to Venu Reddy from eBay XSLT team for help with the array detection code<br />    Protected by CDDL open source license.  <br />    Transforms XML into JavaScript objects, using a JSON format.<br />    ===================================================================================== --><br />    &lt;xsl:output method="text" encoding="UTF-8"/><br />    &lt;xsl:template match="*"><br />        &lt;xsl:param name="recursionCnt">0&lt;/xsl:param><br />        &lt;xsl:param name="isLast">1&lt;/xsl:param><br />        &lt;xsl:param name="inArray">0&lt;/xsl:param><br />        &lt;xsl:if test="$recursionCnt=0"><br />            &lt;xsl:text>json = {&lt;/xsl:text><br />        &lt;/xsl:if><br />        &lt;!-- test what type of data to output  --><br />        &lt;xsl:variable name="elementDataType"><br />            &lt;xsl:value-of select="number(text())"/><br />        &lt;/xsl:variable><br />        &lt;xsl:variable name="elementData"><br />            &lt;!-- TEXT ( use quotes ) --><br />            &lt;xsl:if test="string($elementDataType) ='NaN'"><br />                &lt;xsl:if test="boolean(text())"><br />                &lt;xsl:if test="not(*)"><br />                "&lt;xsl:value-of select="text()"/>"<br />                &lt;/xsl:if><br />                &lt;/xsl:if><br />            &lt;/xsl:if><br />            &lt;!-- NUMBER (no quotes ) --><br />            &lt;xsl:if test="string($elementDataType) !='NaN'"><br />                &lt;xsl:value-of select="text()"/><br />            &lt;/xsl:if><br />            &lt;!-- NULL --><br />            &lt;xsl:if test="not(*)"><br />                &lt;xsl:if test="not(text())"><br />                    null<br />                &lt;/xsl:if><br />            &lt;/xsl:if><br />        &lt;/xsl:variable><br />        &lt;xsl:variable name="hasRepeatElements"><br />            &lt;xsl:for-each select="*"><br />                &lt;xsl:if test="name() = name(preceding-sibling::*) or name() = name(following-sibling::*)"><br />                    true<br />                &lt;/xsl:if><br />            &lt;/xsl:for-each><br />        &lt;/xsl:variable><br />        &lt;xsl:if test="not(count(@*) &gt; 0)"><br />         "&lt;xsl:value-of select="local-name()"/>": &lt;xsl:value-of select="$elementData"/><br />        &lt;/xsl:if><br />        &lt;xsl:if test="count(@*) &gt; 0"><br />        "&lt;xsl:value-of select="local-name()"/>": {<br />        "content": &lt;xsl:value-of select="$elementData"/><br />            &lt;xsl:for-each select="@*"><br />                &lt;xsl:if test="position()=1">,&lt;/xsl:if><br />                &lt;!-- test what type of data to output  --><br />                &lt;xsl:variable name="dataType"><br />                    &lt;xsl:value-of select="number(.)"/><br />                &lt;/xsl:variable><br />                &lt;xsl:variable name="data"><br />                    &lt;!-- TEXT ( use quotes ) --><br />                    &lt;xsl:if test="string($dataType) ='NaN'"><br />                "&lt;xsl:value-of select="current()"/>" &lt;/xsl:if><br />                    &lt;!-- NUMBER (no quotes ) --><br />                    &lt;xsl:if test="string($dataType) !='NaN'"><br />                        &lt;xsl:value-of select="current()"/><br />                    &lt;/xsl:if><br />                &lt;/xsl:variable><br />                &lt;xsl:value-of select="local-name()"/>:&lt;xsl:value-of select="$data"/><br />                &lt;xsl:if test="position() !=last()">, &lt;/xsl:if><br />            &lt;/xsl:for-each><br />        }<br />        &lt;/xsl:if><br />        &lt;xsl:if test="not($hasRepeatElements = '')"><br />                    [{<br />                &lt;/xsl:if><br />        &lt;xsl:for-each select="*"><br />            &lt;xsl:if test="position()=1"><br />                &lt;xsl:if test="$hasRepeatElements = ''"><br />                    &lt;xsl:text> { &lt;/xsl:text><br />                &lt;/xsl:if><br />            &lt;/xsl:if><br />            &lt;xsl:apply-templates select="current()"><br />                &lt;xsl:with-param name="recursionCnt" select="$recursionCnt+1"/><br />                &lt;xsl:with-param name="isLast" select="position()=last()"/><br />                &lt;xsl:with-param name="inArray" select="not($hasRepeatElements = '')"/><br />            &lt;/xsl:apply-templates><br />            &lt;xsl:if test="position()=last()"><br />                &lt;xsl:if test="$hasRepeatElements = ''"><br />                    &lt;xsl:text> } &lt;/xsl:text><br />                &lt;/xsl:if><br />            &lt;/xsl:if><br />        &lt;/xsl:for-each><br />        &lt;xsl:if test="not($hasRepeatElements = '')"><br />                    }]<br />                &lt;/xsl:if><br />        &lt;xsl:if test="not( $isLast )"><br />            &lt;xsl:if test="$inArray = 'true'"><br />                &lt;xsl:text> } &lt;/xsl:text><br />            &lt;/xsl:if><br />            , <br />            &lt;xsl:if test="$inArray = 'true'"><br />                &lt;xsl:text> { &lt;/xsl:text><br />            &lt;/xsl:if><br />        &lt;/xsl:if><br />        &lt;xsl:if test="$recursionCnt=0"> }; &lt;/xsl:if><br />    &lt;/xsl:template><br />&lt;/xsl:stylesheet><br /><br /><br />ＪＡＶＡ代码<br />public class XmlJson {<br />	public static  String process(String resrouce, String xslFile) {<br />		URL oUrl = XmlJson.class.getResource("/");<br />		File oFileurl = new File(oUrl.getFile());<br />		xslFile = oFileurl.getAbsolutePath() +"\\"+ xslFile;<br />		StringWriter out = new StringWriter();<br />		try {<br />			TransformerFactory transFactory = TransformerFactory.newInstance();<br />			StreamSource streamSourcexslt = new StreamSource(xslFile);<br />			StreamSource streamSourcexml = new StreamSource(new StringReader(<br />					resrouce));<br />			Transformer xsltTransformer = transFactory<br />					.newTransformer(streamSourcexslt);<br />			xsltTransformer.transform(streamSourcexml, new StreamResult(out));<br />		} catch (TransformerConfigurationException tce) {<br />			System.out.println("ERROR: TransformerConfigurationException "<br />					+ tce);<br />			tce.printStackTrace();<br /><br />		} catch (TransformerException te) {<br />			System.out.println("ERROR: TransformerException " + te);<br />			te.printStackTrace();<br /><br />		}<br /><br />		return out.toString();<br />	}<br />  <br />	public static String open(String url, String s) {<br />		URL oUrl = XmlJson.class.getResource("/");<br />		File oFileurl = new File(oUrl.getFile());<br />		url = oFileurl.getAbsolutePath()+"\\" + url;<br />		Document oDocument = null;<br />		if (url.length() > 0) {<br />			SAXReader reader = new SAXReader();<br />			try {<br />				oDocument = reader.read(url);<br />				<br />			} catch (DocumentException e) {<br />				try {<br />					if (null != s) {<br />						if (s.length() > 0) {<br />							oDocument = DocumentHelper.parseText(s);<br />						}<br />					}<br />					File oFile = new File(url);<br />					url = oFile.getParent();<br />					if (null != url)<br />						oFile = new File(url);<br />					oFile.mkdirs();<br />				} catch (Exception e1) {<br />					e1.printStackTrace();<br />				}<br />			}<br />		}<br />		return oDocument.asXML();<br />	}<br />	public static void main(String[] args){<br />	 String xml=XmlJson.open("rsp.xml","&lt;rsp/>");<br />	<br />  //   long end=System.currentTimeMillis()-begin;<br />	 System.out.println(XmlJson.process(xml, "xml-2-json.xml"));<br />     <br />	}<br />}<br /><br />改技术性能比较差，１００次需要７秒．用json-lib直接用对象转成xml会比较快，1W次1.5秒的
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/199650#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jun 2008 10:55:40 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/199650</link>
        <guid>http://yefeng.javaeye.com/blog/199650</guid>
      </item>
      <item>
        <title>针对JSON的基于java和js多种操作与格式转换方法</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/198758" style="color:red;">http://yefeng.javaeye.com/blog/198758</a>&nbsp;
          发表时间: 2008年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转<br /><br /><br />org.json包<br />http://www.json.org/java/index.html <br />&lt;!--[if !supportLists]-->1.      &lt;!--[endif]-->JSONObject，用一个HashMap来保存一个JSON对象的所有属性。<br />&lt;!--[if !supportLists]-->2.      &lt;!--[endif]-->JSONArray用ArrayList来保存数据。JSON来自javascript，javascript中Array也是Object，不知这里是如何保存这种关系的。<br />&lt;!--[if !supportLists]-->3.      &lt;!--[endif]-->一些跟字符串有关的类，以及异常类。<br />&lt;!--[if !supportLists]-->4.      &lt;!--[endif]-->一些工具类，比如xml和json转换的类，将http头和cookies转换为json的类，<br /> <br /> <br />基于org.json包的JSON-LIB：bean，map，collection，java array，xml与json间的转换。<br />http://json-lib.sourceforge.net/ <br />http://json-lib.sourceforge.net/usage.html<br /> <br />Stringtree JSON:JSON与java对象间的转换<br />http://www.stringtree.org/stringtree-json.html <br />三个关键类：<br />JSONReader.java <br />JSONWriter.java <br />JSONValidator.java <br />JSONValidator用来检查JSON的有效性。<br />JSONReader将一个正确形式的JSON字符串转换为一个java对象。<br />JSONWriter将一个java对象转换为一个JSON字符串。<br /> <br /> <br />JSONT：基于js和自定义规则，转换JSON为任意其他格式<br />http://goessner.net/articles/jsont/
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/198758#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 30 May 2008 17:22:44 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/198758</link>
        <guid>http://yefeng.javaeye.com/blog/198758</guid>
      </item>
      <item>
        <title>maven 学习</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/194251" style="color:red;">http://yefeng.javaeye.com/blog/194251</a>&nbsp;
          发表时间: 2008年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Maven2是类似Ant得java项目构建工具，能够帮助我们很好的构建项目。<br />　　首先，下载maven２：http://maven.apache.org<br />　　Maven2得使用：<br />　　１．将下载的Maven２得包解压到任意目录．配置环境变量．MAVEN_HOME:你得解压缩目录　PATH :%MAVEN_HOME%/bin<br />   ２．测试安装情况，在命令行输入：　mvn -v　出现 Maven version: 2.0.4　表示安装成功<br />    ３．修改配置文件：去ｍａｖｅｎ目录下得conf找到Setting.xml，修改其中的<br />  　　&lt;localRepository>D:\soft\LoaclRepository&lt;/localRepository><br />  　　这个路径表示本地资源库的位置。<br />    ４. 创建项目<br />  　　mvn archetype:create -DgroupId=org.zhyh -DartifactId=my-app<br />       项目创建前，会看到maven从网上下载多个项目用到的.jar文件, 项目创间完成后可以看到Maven２为我们创建的目录结构。<br />　　 ５.常用命令<br />　mvn compile　编译<br />　mvn test　执行所有的test用例 <br />　mvn test-compile　编译所有的test用例<br />　mvn package　　编译后打包<br />　mvn install　将编译和打包好的文件发布到本地repository<br />　mvn idea:idea<br />  mvn eclipse:eclipse 创建项目文件，如果要创建eclipse项目文件。用mvn eclipse:eclipse<br />　　６.设置项目的依赖项<br />　　在以前的java项目中，管理java依赖是非常复杂和繁琐的，现在可以通过Maven２管理依赖。<br />  &lt;dependencies><br />    &lt;dependency><br />      &lt;groupId>junit&lt;/groupId><br />      &lt;artifactId>junit&lt;/artifactId><br />      &lt;version>3.8.1&lt;/version><br />      &lt;scope>test&lt;/scope><br />    &lt;/dependency><br />  &lt;/dependencies><br />　　　配置了这个依赖项，运行项目前Maven２会自动下载junit得.jar包存于本地文件库中。<br />　　　scope参数，配置运行时参数，表明scope的参数表明。<br />     --compile：默认值。表明是所有任务所需的资源<br />    --test：运行所有的测试用例时所需资源<br />    --runtime：表明是运行时所需资源<br />   --provided：JDK部分或应用服务器的classpath所需的资源<br />　　　７.将多个项目构建于项目之中<br />　　　如何在一个主目录构件多个项目呢。Maven也为我们提供了简单的办法。<br />　　　&lt;project> <br />　　　&lt;modelVersion>4.0.0&lt;/modelVersion> <br />　　　&lt;groupId>org.zhyh&lt;/groupId><br />　　　&lt;version>1.0-SNAPSHOT&lt;/version><br />　　　&lt;artifactId>my-app&lt;/artifactId><br />　　　&lt;packaging>pom&lt;/packaging>  <br />　　　&lt;modules><br />　　　&lt;module>module&lt;/module><br />　　　&lt;module>dao&lt;/module><br />　　　&lt;module>service&lt;/module><br />　　　&lt;module>web&lt;/module><br />　　　&lt;/modules><br />　　　&lt;/project><br />      这里声明了子项目。<br />      我们来生命子项目的依赖项，<br />      DAO:的依赖项<br />      &lt;dependencies>  <br />      &lt;dependency> <br />      &lt;groupId>org.zhyh&lt;/groupId><br />      &lt;artifactId>module&lt;/artifactId> <br />      &lt;version>1.0-SNAPSHOT&lt;/version><br />      &lt;/dependency> <br />      &lt;/dependencies><br />      service：的依赖项<br />　　　&lt;dependencies>  <br />      &lt;dependency> <br />      &lt;groupId>org.zhyh&lt;/groupId><br />      &lt;artifactId>module&lt;/artifactId> <br />      &lt;version>1.0-SNAPSHOT&lt;/version><br />      &lt;/dependency> <br />      &lt;dependency> <br />      &lt;groupId>org.zhyh&lt;/groupId><br />      &lt;artifactId>dao&lt;/artifactId> <br />      &lt;version>1.0-SNAPSHOT&lt;/version><br />      &lt;/dependency> <br />      &lt;/dependencies><br />      web的依赖项：<br />　　　&lt;dependencies>  <br />      &lt;dependency> <br />      &lt;groupId>org.zhyh&lt;/groupId><br />      &lt;artifactId>module&lt;/artifactId> <br />      &lt;version>1.0-SNAPSHOT&lt;/version><br />      &lt;/dependency> <br />      &lt;dependency> <br />      &lt;groupId>org.zhyh&lt;/groupId><br />      &lt;artifactId>dao&lt;/artifactId> <br />      &lt;version>1.0-SNAPSHOT&lt;/version><br />      &lt;/dependency> <br />      &lt;dependency> <br />      &lt;groupId>org.zhyh&lt;/groupId><br />      &lt;artifactId>service&lt;/artifactId> <br />      &lt;version>1.0-SNAPSHOT&lt;/version><br />      &lt;/dependency> <br />      &lt;/dependencies><br />　　　我们还需要在每个子模块中配置,以表明这个子模块隶属于哪个项目<br />　　　&lt;parent><br />　　　&lt;groupId>org.zhyh&lt;/groupId><br />　　　&lt;artifactId>my-app&lt;/artifactId><br />　　　&lt;version>1.0-SNAPSHOT&lt;/version><br />　　　&lt;/parent>
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/194251#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 19 May 2008 10:09:09 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/194251</link>
        <guid>http://yefeng.javaeye.com/blog/194251</guid>
      </item>
      <item>
        <title>corba和soap区别</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/193720" style="color:red;">http://yefeng.javaeye.com/blog/193720</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CORBA(common object request broker architecture) 公共对象请求代理架构．corba是通过面向对象的ＲＰＣ通信的，它有很大的局限性，需要存根才能解码传递．过度依赖于厂家的实现方案<br />ＳＯＡＰ是开放的解决方案，也可以认为soap是corba的更强的版本，虽然两者没有多少可比性，不过soap修改了corba的局限
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/193720#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 16:34:16 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/193720</link>
        <guid>http://yefeng.javaeye.com/blog/193720</guid>
      </item>
      <item>
        <title>Spring中配置Velocity模板</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/184431" style="color:red;">http://yefeng.javaeye.com/blog/184431</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先需要配置的是Velocity引擎自己。要做到这点，可以通过以下方式在Spring配置文件中声明一个VelocityConfigurer Bean：<br /><br />  &lt;bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"><br /><br />    &lt;property name="resourceLoaderPath"><br /><br />      &lt;value>WEB-INF/velocity/&lt;/value><br /><br />    &lt;/property><br /><br />    &lt;/bean><br /><br />VelocityConfigurer负责在Spring中设置Velocity引擎。这里，我们通过属性resourceLoaderPath告诉Velocity到哪里寻找它的模板。我们建议将模板放到WEB-INF的某个子目录下面，这样可以保证这些模板不能被直接访问。也可以通过velocityProperties属性来设置其他Velocity的配置细节。例如下面的VelocityConfigurer配置：<br /><br />  &lt;bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"><br /><br />    &lt;property name="resourceLoaderPath"><br /><br />      &lt;value>WEB-INF/velocity/&lt;/value><br /><br />    &lt;/property><br /><br />    &lt;property name="velocityProperties"><br /><br />      &lt;props><br /><br />        &lt;prop key="directive.foreach.counter.name">loopCounter&lt;/prop><br /><br />        &lt;prop key="directive.foreach.counter.initial.value">0&lt;/prop><br /><br />      &lt;/props><br /><br />    &lt;/property><br /><br />  &lt;/bean><br /><br />可以注意到velocityProperties属性使用一个&lt;props>元素来设置多个属性。在这里可以设置的属性与一个典型的Velocity应用中通过“velocity.properties”文件设置的属性是一样的。缺省地，Velocity的#foreach循环维护一个名为$velocityCount的循环计数器，该计数器在第一轮循环开始时从1开始计数。但这里我们设置属性directive.foreach.counter.name为loopCounter，因此将使用$loopCounter来引用循环计数器。我们也通过设置属性directive.foreach.counter.initial.value为0使循环计数器由零开始计数。（想知道关于Velocity配置属性的信息，请参考Velocity开发者指南http://jakarta.apache.org/velocity/developer-guide.html。）<br />9.1.3  解析Velocity视图<br />要使用Velocity模板视图，你必须做的最后一件事情是配置一个视图解析器。具体地说，需要以如下方式在Spring上下文配置中声明一个VelocityViewResolver Bean：<br /><br />  &lt;bean id="viewResolver" class="org.springframework.<br /><br />          web.servlet.view.velocity.VelocityViewResolver"><br /><br />    &lt;property name="suffix">&lt;value>.vm&lt;/value>&lt;/property><br /><br />  &lt;/bean><br /><br />VelocityViewResolver和Velocity的关系与InternalResourceViewResolver和JSP的关系相似。正如InternalResourceViewResolver，它使用prefix属性和suffix属性由视图的逻辑名构造出模板文件的路径。这里我们仅仅设置suffix属性为“.vm”扩展名。由于模板目录的路径已经通过VelocityConfigurer的resourceLoaderPath属性配置好了，因此这里不需要设置前缀。<br /><br />注意：这里把Bean的ID设置为viewResolver。这一点很重要，因为我们并没有配置DispatcherServlet检测所有的视图解析器。如果要同时使用多个视图解析器，则你很可能需要将这个ID改成某个更合适的名字（并且是惟一的），比如velocityViewResolver。<br /><br />现在，你的应用系统已经可以渲染基于Velocity模板的视图了。你只需要在返回的ModelAndView对象中通过逻辑名引用所需的视图。以ListCourseController为例，不需要做其他事情，因为它已经返回如下的ModelAndView对象：<br /><br />  return new ModelAndView("courseList", "courses", allCourses);<br /><br />视图的逻辑名为“courseList”。当解析这个视图时，“courseList”加上后缀“.vm”构成了一个模板名“courseList.vm”。VelocityViewResolver会在WEB-INF/velocity路径下寻找这个模板。<br /><br />至于“courses”模型对象，它会作为一个Velocity属性暴露给Velocity模板使用。在程序清单9.1中，它就是在#foreach指令中使用的集合对象。
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/184431#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 15:51:43 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/184431</link>
        <guid>http://yefeng.javaeye.com/blog/184431</guid>
      </item>
      <item>
        <title>html页面的SEO</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/182524" style="color:red;">http://yefeng.javaeye.com/blog/182524</a>&nbsp;
          发表时间: 2008年04月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转载:<br /><br />您的个人网站即使做得再精彩，在“浩瀚如海”的网络空间中，也如一叶扁舟不易为人发现，如何推广<br />个人网站，人们首先想到的方法无外乎以下几种：<br />　　<br />　　●　在搜索引擎中登录自己的个人网站<br />　　<br />　　●　在知名网站加入你个人网站的链接 <br /><br /><br />　　●　在论坛中发帖子宣传你的个人网站 <br /><br /><br />　　很多人却忽视了HTML标签META的强大功效，一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性，有兴趣吗，谁我来重新认识一下META标签吧！ <br /><br />          META标签是HTML语言HEAD区的一个辅助性标签，它位于HTML文档头部的&lt;HEAD>标记和&lt;TITLE>标记之间，它提供用户不可见的信息。meta标签通常用来为搜索引擎robots定义页面主题，或者是定义用户浏览器上的cookie；它可以用于鉴别作者，设定页面格式，标注内容提要和关键字；还可以设置页面使其可以根据你定义的时间间隔刷新自己,以及设置RASC内容等级，等等。 <br /><br />  <br /><br />　　详细介绍 <br /><br /><br />　　下面介绍一些有关 标记的例子及解释。 <br /><br /><br />　　META标签分两大部分：HTTP标题信息(HTTP-EQUIV)和页面描述信息(NAME)。 <br /><br />  <br /><br />　　★HTTP-EQUIV <br /><br /><br />　　HTTP-EQUIV类似于HTTP的头部协议，它回应给浏览器一些有用的信息，以帮助正确和精确地显示网页内容。常用的HTTP-EQUIV类型有： <br /><br />  <br /><br />　　1、Content-Type和Content-Language (显示字符集的设定) <br /><br /><br />　　说明：设定页面使用的字符集，用以说明主页制作所使用的文字已经语言，浏览器会根据此来调用相应的字符集显示page内容。 <br /><br /><br />　　用法：&lt;Meta http-equiv="Content-Type" Content="text/html; Charset=gb2312"><br />　　　　　　&lt;Meta http-equiv="Content-Language" Content="zh-CN"> <br /><br /><br />　　注意：　该META标签定义了HTML页面所使用的字符集为GB2132，就是国标汉字码。如果将其中的“charset=GB2312”替换成“BIG5”，则该页面所用的字符集就是繁体中文Big5码。当你浏览一些国外的站点时，IE浏览器会提示你要正确显示该页面需要下载xx语支持。这个功能就是通过读取HTML页面META标签的Content-Type属性而得知需要使用哪种字符集显示该页面的。如果系统里没有装相应的字符集，则IE就提示下载。其他的语言也对应不同的charset，比如日文的字符集是“iso-2022-jp ”，韩文的是“ks_c_5601”。<br />　　　　　　<br />　　Content-Type的Content还可以是：text/xml等文档类型；<br />　　Charset选项：ISO-8859-1(英文)、BIG5、UTF-8、SHIFT-Jis、Euc、Koi8-2、us-ascii, x-mac-roman, iso-8859-2, x-mac-ce, iso-2022-jp, x-sjis, x-euc-jp,euc-kr, iso-2022-kr, gb2312, gb_2312-80, x-euc-tw, x-cns11643-1,x-cns11643-2等字符集；Content-Language的Content还可以是：EN、FR等语言代码。 <br /><br /><br />　　2、Refresh (刷新) <br /><br /><br />　　　说明：让网页多长时间（秒）刷新自己，或在多长时间后让网页自动链接到其它网页。<br />　　　用法：&lt;Meta http-equiv="Refresh" Content="30"><br />　　　　　　&lt;Meta http-equiv="Refresh" Content="5; Url=http://www.xia8.net"><br />　　　注意：其中的5是指停留5秒钟后自动刷新到URL网址。 <br /><br /><br />　　3、Expires (期限) <br /><br /><br />　　　说明：指定网页在缓存中的过期时间，一旦网页过期，必须到服务器上重新调阅。<br />　　　用法：&lt;Meta http-equiv="Expires" Content="0"><br />　　　　　　&lt;Meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT"><br />　　　注意：必须使用GMT的时间格式，或直接设为0(数字表示多少时间后过期)。 <br /><br /><br />　　4、Pragma (cach模式) <br /><br /><br />　　　说明：禁止浏览器从本地机的缓存中调阅页面内容。<br />　　　用法：&lt;Meta http-equiv="Pragma" Content="No-cach"><br />　　　注意：网页不保存在缓存中，每次访问都刷新页面。这样设定，访问者将无法脱机浏览。 <br /><br /><br />　　5、Set-Cookie (cookie设定) <br /><br /><br />　　说明：浏览器访问某个页面时会将它存在缓存中，下次再次访问时就可从缓存中读取，以提高速度。当你希望访问者每次都刷新你广告的图标，或每次都刷新你的计数器，就要禁用缓存了。通常HTML文件没有必要禁用缓存，对于ASP等页面，就可以使用禁用缓存，因为每次看到的页面都是在服务器动态生成的，缓存就失去意义。如果网页过期，那么存盘的cookie将被删除。<br />　　　用法：&lt;Meta http-equiv="Set-Cookie" Content="cookievalue=xxx; expires=Wednesday,<br />　　　　　　 21-Oct-98 16:14:21 GMT; path=/"><br />　　　注意：必须使用GMT的时间格式。 <br /><br /><br />　　6、Window-target (显示窗口的设定) <br /><br /><br />　　　说明：强制页面在当前窗口以独立页面显示。<br />　　　用法：&lt;Meta http-equiv="Widow-target" Content="_top"><br />　　　注意：这个属性是用来防止别人在框架里调用你的页面。Content选项：_blank、_top、_self、_parent。 <br /><br /><br />　　7、Pics-label (网页RSAC等级评定)<br />　　　说明：在IE的Internet选项中有一项内容设置，可以防止浏览一些受限制的网站，而网站的限制级<br />　　　　　　别就是通过该参数来设置的。<br />　　　用法：&lt;META http-equiv="Pics-label" Contect=<br />　　　　　　　　　　　　　　　"(PICS－1.1'http://www.rsac.org/ratingsv01.html'<br />　　　　　　 I gen comment 'RSACi North America Sever' by 'inet@microsoft.com' <br />　　　　　　　for 'http://www.microsoft.com' on '1997.06.30T14:21－0500' r(n0 s0 v0 l0))"> <br /><br /><br />　　　注意：不要将级别设置的太高。RSAC的评估系统提供了一种用来评价Web站点内容的标准。用户可以设置Microsoft Internet Explorer（IE3.0以上）来排除包含有色情和暴力内容的站点。上面这个例子中的HTML取自Microsoft的主页。代码中的（n 0 s 0 v 0 l 0）表示该站点不包含不健康内容。级别的评定是由RSAC，即美国娱乐委员会的评级机构评定的，如果你想进一步了解RSAC评估系统的等级内容，或者你需要评价自己的网站，可以访问RSAC的站点：http://www.rsac.org/。 <br /><br /><br />　　8、Page-Enter、Page-Exit (进入与退出) <br /><br /><br />　　　说明：这个是页面被载入和调出时的一些特效。<br />　　　用法：&lt;Meta http-equiv="Page-Enter" Content="blendTrans(Duration=0.5)"><br />　　　　　　&lt;Meta http-equiv="Page-Exit" Content="blendTrans(Duration=0.5)"><br />　　　注意：blendTrans是动态滤镜的一种，产生渐隐效果。另一种动态滤镜RevealTrans也可以用于页面进入与退出效果: <br /><br /><br />　　　　　　&lt;Meta http-equiv="Page-Enter" Content="revealTrans(duration=x, transition=y)"><br />　　　　　　&lt;Meta http-equiv="Page-Exit" Content="revealTrans(duration=x, transition=y)"> <br /><br /><br />　　　　　　　Duration　　表示滤镜特效的持续时间(单位：秒)<br />　　　　　　　Transition　滤镜类型。表示使用哪种特效，取值为0-23。 <br /><br /><br />　　　　　　　0 矩形缩小<br />　　　　　　　1 矩形扩大<br />　　　　　　　2 圆形缩小<br />　　　　　　　3 圆形扩大<br />　　　　　　　4 下到上刷新<br />　　　　　　　5 上到下刷新<br />　　　　　　　6 左到右刷新<br />　　　　　　　7 右到左刷新<br />　　　　　　　8 竖百叶窗<br />　　　　　　　9 横百叶窗<br />　　　　　　 10 错位横百叶窗<br />　　　　　　 11 错位竖百叶窗<br />　　　　　　 12 点扩散<br />　　　　　　 13 左右到中间刷新<br />　　　　　　 14 中间到左右刷新<br />　　　　　　 15 中间到上下<br />　　　　　　 16 上下到中间<br />　　　　　　 17 右下到左上<br />　　　　　　 18 右上到左下<br />　　　　　　 19 左上到右下<br />　　　　　　 20 左下到右上<br />　　　　　　 21 横条<br />　　　　　　 22 竖条<br />　　　　　　 23 以上22种随机选择一种 <br /><br /><br />　　9、MSThemeCompatible (XP主题)<br />　　　说明：是否在IE中关闭 xp 的主题<br />　　　用法：&lt;Meta http-equiv="MSThemeCompatible" Content="Yes"><br />　　　注意：关闭 xp 的蓝色立体按钮系统显示样式，从而和win2k 很象。 <br /><br /><br />　　10、IE6 (页面生成器)<br />　　　说明：页面生成器generator，是ie6<br />　　　用法：&lt;Meta http-equiv="IE6" Content="Generator"><br />　　　注意：用什么东西做的，类似商品出厂厂商。 <br /><br /><br />　　11、Content-Script-Type (脚本相关)<br />　　　说明：这是近来W3C的规范，指明页面中脚本的类型。<br />　　　用法：&lt;Meta http-equiv="Content-Script-Type" Content="text/javascript"><br />　　　注意： <br /><br /><br />　　★NAME变量 <br /><br /><br />　　name是描述网页的，对应于Content（网页内容），以便于搜索引擎机器人查找、分类（目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类）。<br />　　name的value值（name=""）指定所提供信息的类型。有些值是已经定义好的。例如description(说明)、keyword(关键字)、refresh(刷新)等。还可以指定其他任意值，如：creationdate(创建日期) 、<br />document ID(文档编号)和level(等级)等。<br />　　name的content指定实际内容。如：如果指定level(等级)为value(值)，则Content可能是beginner(初级)、intermediate(中级)、advanced(高级)。 <br /><br />  <br /><br />　　1、Keywords (关键字)<br />　　　说明：为搜索引擎提供的关键字列表<br />　　　用法：&lt;Meta name="Keywords" Content="关键词1,关键词2，关键词3,关键词4,……"><br />　　　注意：各关键词间用英文逗号“,”隔开。META的通常用处是指定搜索引擎用来提高搜索质量的关键词。当数个META元素提供文档语言从属信息时，搜索引擎会使用lang特性来过滤并通过用户的语言优先参照来显示搜索结果。例如：<br />　　　　　　&lt;Meta name="Kyewords" Lang="EN" Content="vacation,greece,sunshine"><br />　　　　　　&lt;Meta name="Kyewords" Lang="FR" Content="vacances,grè:ce,soleil"> <br /><br /><br />　　2、Description (简介)<br />　　　说明：Description用来告诉搜索引擎你的网站主要内容。<br />　　　用法：&lt;Meta name="Description" Content="你网页的简述"><br />　　　注意： <br /><br /><br />　　3、Robots (机器人向导)<br />　　　说明：Robots用来告诉搜索机器人哪些页面需要索引，哪些页面不需要索引。Content的参数有all、none、index、noindex、follow、nofollow。默认是all。<br />　　　用法：&lt;Meta name="Robots" Content="All|None|Index|Noindex|Follow|Nofollow"><br />　　　注意：许多搜索引擎都通过放出robot/spider搜索来登录网站，这些robot/spider就要用到meta元素的一些特性来决定怎样登录。 <br /><br /><br />　　　 all：文件将被检索，且页面上的链接可以被查询；<br />　　　 none：文件将不被检索，且页面上的链接不可以被查询；(和 "noindex, no follow" 起相同作用)<br />　　　 index：文件将被检索；（让robot/spider登录）<br />　　　 follow：页面上的链接可以被查询；<br />　　　 noindex：文件将不被检索，但页面上的链接可以被查询；(不让robot/spider登录)<br />　　　nofollow：文件将不被检索，页面上的链接可以被查询。(不让robot/spider顺着此页的连接往下探找) <br /><br /><br />　　4、Author (作者)<br />　　　说明：标注网页的作者或制作组<br />　　　用法：&lt;Meta name="Author" Content="张三，abc@sina.com"><br />　　　注意：Content可以是：你或你的制作组的名字,或Email <br /><br /><br />　　5、Copyright (版权)<br />　　　说明：标注版权<br />　　　用法：&lt;Meta name="Copyright" Content="本页版权归Zerospace所有。All Rights Reserved"><br />　　　注意： <br /><br /><br />　　6、Generator (编辑器)<br />　　　说明：编辑器的说明<br />　　　用法：&lt;Meta name="Generator" Content="PCDATA|FrontPage|"><br />　　　注意：Content="你所用编辑器" <br /><br /><br />　　7、revisit-after (重访)<br />　　　说明：<br />　　　用法：&lt;META name="revisit-after" CONTENT="7 days" ><br />　　　注意： <br /><br /><br />　　★Head中的其它一些用法 <br /><br />  <br /><br />　　1、scheme (方案)<br />　　　说明：scheme can be used when name is used to specify how the value of content should<br />　　　　　　be interpreted.<br />　　　用法：&lt;meta scheme="ISBN" name="identifier" content="0-14-043205-1" /><br />　　　注意： <br /><br /><br />　　2、Link (链接)<br />　　　说明：链接到文件<br />　　　用法：&lt;Link href="soim.ico" rel="Shortcut Icon"><br />　　　注意：很多网站如果你把她保存在收件夹中后，会发现它连带着一个小图标，如果再次点击进入之后还会发现地址栏中也有个小图标。现在只要在你的页头加上这段话，就能轻松实现这一功能。&lt;LINK> 用来将目前文件与其它 URL 作连结，但不会有连结按钮，用於 &lt;HEAD> 标记间， 格式如下： <br />　　　　　　　&lt;link href="URL" rel="relationship"> <br />　　　　　　　&lt;link href="URL" rev="relationship"> <br /><br /><br />　　3、Base (基链接)<br />　　　说明：插入网页基链接属性<br />　　　用法：&lt;Base href="http://www.xia8.net/" target="_blank"><br />　　　注意：你网页上的所有相对路径在链接时都将在前面加上“http://www.cn8cn.com/”。其中target="_blank"是链接文件在新的窗口中打开，你可以做其他设置。将“_blank”改为“_parent”是链接文件将在当前窗口的父级窗口中打开；改为“_self”链接文件在当前窗口（帧）中打开；改为“_top”链接文件全屏显示。 <br /><br />  <br /><br />　　以上是META标签的一些基本用法，其中最重要的就是：Keywords和Description的设定。为什么呢？道理很简单，这两个语句可以让搜索引擎能准确的发现你，吸引更多的人访问你的站点!根据现在流行搜索引擎(Google，Lycos，AltaVista等)的工作原理，搜索引擎先派机器人自动在WWW上搜索，当发现新的网站时，便于检索页面中的Keywords和Description，并将其加入到自己的数据库，然后再根据关键词的密度将网站排序。 <br /><br /><br />　　由此看来，我们必须记住添加Keywords和Description的META标签，并尽可能写好关键字和简介。否则，<br />后果就会是：<br />　　<br />　　●　如果你的页面中根本没有Keywords和Description的META标签，那么机器人是无法将你的站点加入数<br />　　　　据库，网友也就不可能搜索到你的站点。 <br /><br /><br />　　●　如果你的关键字选的不好，关键字的密度不高，被排列在几十甚至几百万个站点的后面被点击的可<br />　　　　能性也是非常小的。 <br /><br /><br />　　写好Keywords(关键字)要注意以下几点： <br /><br />  <br /><br />　　●　不要用常见词汇。例如www、homepage、net、web等。 <br /><br /><br />　　●　不要用形容词，副词。例如最好的，最大的等。 <br /><br /><br />　　●　不要用笼统的词汇，要尽量精确。例如“爱立信手机”，改用“T28SC”会更好。 <br /><br />  <br /><br />　　“三人之行，必有我师”，寻找合适关键词的技巧是：到Google、Lycos、Alta等著名搜索引擎，搜索与<br />你的网站内容相仿的网站，查看排名前十位的网站的META关键字，将它们用在你的网站上，效果可想而知了。 <br /><br /><br />　　★小窍门 <br /><br /><br />　　为了提高搜索点击率，这里还有一些“捷径”可以帮得到你： <br /><br /><br />　　●　为了增加关键词的密度，将关键字隐藏在页面里(将文字颜色定义成与背景颜色一样)。 <br /><br /><br />　　●　在图像的ALT注释语句中加入关键字。如：&lt;IMG SRC="xxx.gif" Alt="Keywords"> <br /><br /><br />　　●　利用HTML的注释语句，在页面代码里加入大量关键字。用法： &lt;!-- 这里插入关键字 --> <br /><br />  <br /><br />&lt;head>　　&lt;title>文件头，显示在浏览器标题区&lt;/title>　　&lt;meta http-equiv="Content-Language" content="zh-cn">　　&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312">　　&lt;meta name="GENERATOR" content="Microsoft FrontPage 4.0">　　&lt;meta name="ProgId" content="FrontPage.Editor.Document">　　&lt;meta name="制作人" content="唐蓉生">　　&lt;meta name="主题词" content="HTML 网页制作 课件">&lt;/head>
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/182524#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Apr 2008 11:49:33 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/182524</link>
        <guid>http://yefeng.javaeye.com/blog/182524</guid>
      </item>
      <item>
        <title>JMS API</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/181580" style="color:red;">http://yefeng.javaeye.com/blog/181580</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转<br /><br />JMS API<br />在进行系统设计之前我们先回头熟悉一下JMS的一些概念。JMS源于企业应用对于消息中间件的需求，使应用程序可以通过消息进行异步处理而互不影响。JMS应用程序有四个组成部分：JMS服务提供者、消息管理对象、消息的生产者消费者和消息本身。<br /><br />l JMS服务提供者实现消息队列和通知，同时实现消息管理的API。JMS已经是J2EE API的一部分，J2EE服务器都提供JMS服务。<br /><br />l 消息管理对象提供对消息进行操作的API。JMS API中有两个消息管理对象：ConnectionFactory和Destination，根据消息的消费方式的不同ConnectionFactory可以分为QueueConnectionFactory和TopicConnectionFactory，Destination可以分为Queue和Topic。用这两个管理对象可以建立到消息服务的会话。<br /><br />l 消息的生产者和消费者。它们可以毫不相干，只需要消息的消费者知道如何使用消息即可。根据消息消费者数目的不同，消息的消费者分为两类：subscriber 和receiver，同样消息发送者也分为两类：Publisher和Sender。<br /><br />l 消息。JMS API规定了五种消息：Message、MapMessage、TextMessage、ByteMessage、StreamMessage和ObjectMessage<br /><br />消费形式的不同造成JMS有两组平行的API，这就是JMS的PTP（point to point）模型和PUB/SUB（publisher和subscriber、出版和订阅）模型。PTP的消息应用中一个消息只有一个消费者，消费后该消息即不再有效。而PUB/SUB应用中一个消息可以有多个订阅者，而且每个订阅者不一定非要处理该消息。<br /><br />下面是JMS应用的基本模型：<br /><br /> <br /><br />（该图引自sun的在线文档 JMS Tutorial）<br /><br />根据该模型列出JMS中几个最长用的API：<br /><br />l QueueConnectionFactory和TopicConnectionFactory 连接工厂用来生成QueueConnection和TopicConnection的实例<br /><br />l QueueConnection和TopicConnection连接对象用来建立到JMS的连接并生成会话实例<br /><br />l QueueSession和TopicSession会话对象用来创建消息、消息的生产者和消息的消费者（解释一下消息的生产者：它并不代表生成消息实例的对象而是指将消息发送到JMS的对象）<br /><br />l QueueSender、TopicPublisher和QueueReciever、TopicSubscriber。消息的生产者和消费者，QueueSender的send方法和TopicPublisher的publish方法发送消息到Destination。QueueReciever和TopicSubscriber直接使用父接口MessageConsumer中定义的方法receive、recieveNoWait等方法来接收消息，setMessageListener方法来设置消息监听器。QueueReciever的getQueue方法得到Queue的引用，TopicSubscriber的getTopic方法得到Topic的引用。<br /><br />l MessageListener，消息监听器。改接口只有一个方法onMessage()，改方法只有一个Message类型的参数，通过MessageConsumer（QueueReciever和TopicSubscriber共同的父接口）的setMessageListener方法注册后，系统在收到消息后调用改方法。<br /><br />l Queue和Topic，消息Destination。主要的作用就是存储消息。<br /><br />设计<br />系统过于简单就不设计了，这里简单交代一下软件的运行环境和执行流程，这个MIS系统是B/S模式的，Web Browser在完成添加执行任务（保存到数据库）的工作后要发一个消息给计算程序，这个计算过程就实现成MDB，计算结束后将完成的消息发给生成任务的Web Browser，各位不要以为我真的能这样做，主动式的把消息发送给Web Browser笔者还没有这份功力，这里采用了一个取巧的方法：在Web页中使用一个Applet，该Applet本身也是一个一直运行的线程，并且每隔一段时间访问接收消息的Servlet，如果有收到消息则提示用户。这个Servlet就是一个MessageConsumer了，而MDB就是MessageProducer了。而在产生执行任务的时候，保存执行任务的jsp/servlet则是MessageProducer，而运行MDB的EJB Container则成了MessageCunsumer，MDB则成为一个消息监听器。由于有两种消息笔者偷懒就使用了两个Destination（跟上面图不谋而合，哈哈），一个用来存放执任务的消息，一个用于存放任务完成的消息。具体实现当然有消息内容的设计和实现，不过对于系统结构并不影响，这里就不废话了。<br /><br />开发工具是JBuilder和WebLogic。<br /><br />动手实现<br />1. 发送和接收消息。需要使用JMS API手动编码实现发送和接收消息的有三个地方：发送消息的Servlet、接收消息的Servlet和发送计算完成消息的MessageDrivenBean。对于发送和接收消息都需要的QueueConnectionFactory、QueueConnection、Queue和QueueSession等对象则利用Servlet和MDB的生命周期方法获得和释放，在Servlet的init方法和MDB的ejbCreate方法中获得资源并创建需要的对象，在Servlet的destroy和MDB的ejbRemove方法中释放资源。<br /><br />获得资源：<br /><br />public void init() throws ServletException {<br />try{<br />InputStream in = this.getClass().getClass().getClassLoader().<br />getResourceAsStream("jndi.properties");<br />Properties p = new Properties();<br />p.load(in);<br />ctx = new InitialContext(p);<br />}catch(Exception ex){<br />ex.printStackTrace();<br />}<br />try{<br />connectionFactory = (QueueConnectionFactory) ctx.lookup(<br />connectionFactoryName);<br />queue = (Queue) ctx.lookup(queueName);<br />connection = (javax.jms.QueueConnection) ( (QueueConnectionFactory) <br /><br />connectionFactory).<br />createQueueConnection();<br />queueSession = ( (javax.jms.QueueConnection) connection).<br />createQueueSession(false, Session.AUTO_ACKNOWLEDGE);<br />queueSender = queueSession.createSender(queue);<br />}catch(Exception ex){<br />ex.printStackTrace();<br />}<br /><br /><br />}<br /><br />发送消息：<br /><br />public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />String taskid = request.getParameter("taskid");<br />try{<br />String completedmsg = "任务" taskid "执行完成";<br />ObjectMessage om = queueSession.createObjectMessage(new CalculateCompleted(userid, taskid, completedmsg));<br />queueSender.send(om);<br />}catch(Exception ex){<br />ex.printStackTrace();<br />}<br /><br /><br />}<br /><br />接收消息。这里对消息在Servlet中作了转存，messages是一个Hashtable对象。<br /><br />public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />boolean rflag = true;<br />try {<br />messageConsumer = (QueueReceiver) queueSession.createReceiver(queue);<br />connection.start();<br />while (rflag) {<br />Message m = messageConsumer.receiveNoWait();<br />if (m != null) {<br />if (m instanceof ObjectMessage) {<br />ObjectMessage message = (ObjectMessage) m;<br />MessageBody mb = (MessageBody)message.getObject();<br />ArrayList a = (ArrayList)messages.get(mb.getUserID());<br />if(a == null){<br />a = new ArrayList();<br />a.add(mb);<br />messages.put(mb.getUserID(), a);<br />}else{<br />a.add(mb);<br />}<br />}<br />else {<br />rflag = false;<br />}<br />}<br />else {<br />rflag = false;<br />}<br />}<br />connection.stop();<br />}<br />catch (JMSException e) {<br />e.printStackTrace();<br />}<br /><br /><br />}<br /><br />释放资源：<br /><br />public void destroy() {<br />try{<br />if(connection != null)connection.close();<br />}catch(Exception ex){<br />ex.printStackTrace();<br />}<br /><br /><br />}<br /><br />MDB的jebCreate方法和上面init方法的内容一样，ejbRemove和上面destroy方法的内容相同。MDB的计算过程实现在onMessage()方法中，计算完成后发送一条消息，发送消息的过程上面已有，不再赘述。<br /><br />2. WebLogic的JMS服务配置。这里使用最简单的JMS配置，除了名字和JNDI名其余的均使用缺省值。<br /><br />a) 启动WebLogic，打开web console<br /><br />b) 展开左侧的JMS节点，新建一个JMS Server。名字随意。<br /><br /> <br /><br />c) 为刚建立的JMS Server建立两个Queue。JNDI名分别为:：jms/calculate和jms/completed。<br /><br /> <br /><br />d) 建立一个ConnectionFacotry。JNDI名：jms/conn_factory<br /><br />3. 配置MDB。这里除了要指定MDB监听的Queue外，因为MDB需要向另外的Queue发送计算成功的消息，还需要把上面WebLogic中配置的jms/conn_factory作为资源添加到MDB的resource-ref中，把jms/completed作为环境资源添加到MDB的resource-env-resource中。<br /><br />4. 部署执行。用JBuilder建立一个EAR然后部署，非常简单。如果各位想要测试只需要建立一个简单的客户端应用程序，然后将MDB的onMessage方法简单实现为消息转发就可以了。<br /><br />总结<br />笔者初学JMS，只能说说JMS最基本的应用。JMS是一组很强大的API，不仅可以在一个应用程序中实现异步通信，也常被用来在不同的应用程序间传递数据，同时JMS也支持分布式事务，达到了企业应用的要求，笔者相信随着学习和应用的不断深入，将会发现JMS更强大的功能。
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/181580#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Apr 2008 10:24:15 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/181580</link>
        <guid>http://yefeng.javaeye.com/blog/181580</guid>
      </item>
      <item>
        <title>到taobao的第四天</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/181439" style="color:red;">http://yefeng.javaeye.com/blog/181439</a>&nbsp;
          发表时间: 2008年04月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          第四天，今天刚好碰到，TAOBAO商城启动仪式，我也去凑了一下热闹，启动仪式上看见了马云，乔峰，药事等一些老大，TAOBAO商城的一些负责人讲了一写商城开发的历程，整整100天的努力和奋斗。最后马老大做了总结发言，以前整天看马云在“赢在中国”的做点评，这次看见真人感觉有点不一样，不过他的发言还是一样很有煽动性，让我心情澎湃！！！
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/181439#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Apr 2008 20:18:24 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/181439</link>
        <guid>http://yefeng.javaeye.com/blog/181439</guid>
      </item>
      <item>
        <title>dbcp配置--官方文档中文版本 </title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/181279" style="color:red;">http://yefeng.javaeye.com/blog/181279</a>&nbsp;
          发表时间: 2008年04月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          dbcp配置中文版本，翻译自apache 官方文档，原文请见http://commons.apache.org/dbcp/configuration.html。<br /><br />参数 描述 <br />username 传递给JDBC驱动的用于建立连接的用户名 <br />password 传递给JDBC驱动的用于建立连接的密码 <br />url 传递给JDBC驱动的用于建立连接的URL <br />driverClassName 使用的JDBC驱动的完整有效的java 类名 <br />connectionProperties 当建立新连接时被发送给JDBC驱动的连接参数，格式必须是 [propertyName=property;]*<br />注意：参数user/password将被明确传递，所以不需要包括在这里。 <br /><br /><br /><br />参数 默认值 描述 <br />defaultAutoCommit true 连接池创建的连接的默认的auto-commit状态 <br />defaultReadOnly driver default 连接池创建的连接的默认的read-only状态. 如果没有设置则setReadOnly方法将不会被调用. (某些驱动不支持只读模式,比如:Informix)  <br />defaultTransactionIsolation driver default 连接池创建的连接的默认的TransactionIsolation状态. 下面列表当中的某一个: (参考javadoc) <br />NONE <br />READ_COMMITTED <br />READ_UNCOMMITTED <br />REPEATABLE_READ <br />SERIALIZABLE <br /> <br />defaultCatalog 连接池创建的连接的默认的catalog <br /><br /><br /><br />参数 默认值 描述 <br />initialSize 0 初始化连接:连接池启动时创建的初始化连接数量,1.2版本后支持  <br />maxActive 8 最大活动连接:连接池在同一时间能够分配的最大活动连接的数量, 如果设置为非正数则表示不限制  <br />maxIdle 8 最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制  <br />minIdle 0 最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,如果设置为0则不创建  <br />maxWait 无限 最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,如果设置为-1表示无限等待 <br /><br /><br /><br />参数 默认值 描述 <br />validationQuery <br /> SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,则查询必须是一个SQL SELECT并且必须返回至少一行记录  <br />testOnBorrow true 指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.<br />注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串  <br />testOnReturn false 指明是否在归还到池中前进行检验 <br />注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串  <br />testWhileIdle false 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.<br />注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串  <br />timeBetweenEvictionRunsMillis -1 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. 如果设置为非正数,则不运行空闲连接回收器线程  <br />numTestsPerEvictionRun 3 在每次空闲连接回收器线程(如果有)运行时检查的连接数量  <br />minEvictableIdleTimeMillis 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值，单位毫秒<br /> <br /><br /><br /><br />参数 默认值 描述 <br />poolPreparedStatements false 开启池的prepared statement 池功能 <br />maxOpenPreparedStatements 不限制 statement池能够同时分配的打开的statements的最大数量, 如果设置为0表示不限制 <br /><br />这里可以开启PreparedStatements池. 当开启时, 将为每个连接创建一个statement池,并且被下面方法创建的PreparedStatements将被缓存起来:<br />    * public PreparedStatement prepareStatement(String sql)<br />    * public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)<br />注意: 确认连接还有剩余资源可以留给其他statement<br /><br /><br />参数 默认值 描述 <br />accessToUnderlyingConnectionAllowed false 控制PoolGuard是否容许获取底层连接 <br /><br />如果容许则可以使用下面的方式来获取底层连接:<br />    Connection conn = ds.getConnection();<br />    Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();<br />    ...<br />    conn.close();<br /><br />默认false不开启, 这是一个有潜在危险的功能, 不适当的编码会造成伤害.(关闭底层连接或者在守护连接已经关闭的情况下继续使用它).请谨慎使用,并且仅当需要直接访问驱动的特定功能时使用.<br />注意: 不要关闭底层连接, 只能关闭前面的那个.<br /><br /><br />参数 默认值 描述 <br />removeAbandoned false 标记是否删除泄露的连接,如果他们超过了removeAbandonedTimout的限制.如果设置为true, 连接被认为是被泄露并且可以被删除,如果空闲时间超过removeAbandonedTimeout. 设置为true可以为写法糟糕的没有关闭连接的程序修复数据库连接.  <br />removeAbandonedTimeout 300 泄露的连接可以被删除的超时值, 单位秒 <br />logAbandoned false 标记当Statement或连接被泄露时是否打印程序的stack traces日志。被泄露的Statements和连接的日志添加在每个连接打开或者生成新的Statement,因为需要生成stack trace。 <br /><br />如果开启"removeAbandoned",那么连接在被认为泄露时可能被池回收. 这个机制在(getNumIdle() &lt; 2) and (getNumActive() > getMaxActive() - 3)时被触发.<br />举例当maxActive=20, 活动连接为18,空闲连接为1时可以触发"removeAbandoned".但是活动连接只有在没有被使用的时间超过"removeAbandonedTimeout"时才被删除,默认300秒.在resultset中游历不被计算为被使用.
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/181279#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Apr 2008 14:32:13 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/181279</link>
        <guid>http://yefeng.javaeye.com/blog/181279</guid>
      </item>
      <item>
        <title>到taobao的第三天</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/180962" style="color:red;">http://yefeng.javaeye.com/blog/180962</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天是到TAOBAO的第三天,同事也渐渐熟识起来了，周围的同事有不少是开源组织的成员,还有一些出过书的,比起他们,自己深深的感觉到了差距,以后要努力了，有了努力的方向和学习的榜样总是好事<br /><br />路漫漫其修远兮 吾将上下而求索!!!<br /><br />跟大家一起共勉
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/180962#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Apr 2008 19:49:06 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/180962</link>
        <guid>http://yefeng.javaeye.com/blog/180962</guid>
      </item>
      <item>
        <title>OSGi规范</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/180961" style="color:red;">http://yefeng.javaeye.com/blog/180961</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          OSGi规范<br /><br />   OSGi规范为网络设备定义了一个标准的，面相对组件的计算环境。给一个设备添加一个OSGi服务平台，可以从网络上的任何地方管理这个设备上的软件的生命周期，可以安装、更新和删除这些组件而无需中断设备的工作。软件组件是一些可以动态发现和使用其他组件的库或应用程序。这些组件可以从市场上购买也可以自己开发。OSGi 联盟已经为一些通用的功能如HTTP服务、配置服务、日志记录服务、安全服务、用户管理服务、XML服务等，开发了很多标准组件接口。可以从不同的软件供应商得到这些兼容的插入是组件的不同优化以后的实现。<br /><br />  软件组件架构在软件开发过程中越来越成为一个难题：需要开发和维护大量的配置信息。标准化的OSGi组件架构显著简化了这个配置过程。<br /><br />   OSGi规范包括了构建开发的可交付网络服务的各方面，实际上主要是规定了一组API，OSGi规范又包括了以下子规范：<br /><br /><br />   1.  Framework规范<br /><br />       OSGi Framework 规范是OSGi规范的核心组成部分，它提供了一个通用的、安全可管理的Java framework。通过这个Framework 可以支持一种叫做Bundles的服务应用的部署和扩展。这个Framewrok可以分成如下几层：<br /><br />L0层：运行环境；L1层：模块；L2层：组件生命周期管理；L3：服务注册 L0运行环是Java运行环境的规范。Java2 的配置和Profiels ， 比如J2SE、CDC、CLDC、MIDP， 都是有效的运行环境。OSGi也为低配置的平台定义了运行环境。<br /><br />  L1：模块层定义了class装载策略。OSGi Framework是一个强大的严格的class 装载模块。它基于Java但是添加了模块化的概念。在Java里，通常只有一个Classpath， 里面包括了所有的策略class和资源。OSGi模块层为各个模块添加了四月才class的概念和一种受约束的模块间共享的CLASS模型。<br /><br />  L2：软件生命管理周期可以添加Bundle并且可以动态安装、启动、停止、更新和卸载这些Bundle。Bundle依赖于模块层的CLASS载入但是添加了为运行时管理的API。生命周期管理层引入了应用程序通常不具有的动态性。有扩展的依赖机制用来保证环境的正确运行。<br /><br />  L3：这一层添加了一个服务注册表。服务注册为动态Bundles表提供了一个合作模型。Bundle可以通过传统的Class共享来合作，但是Class共享和动态安装和卸载代码不是很协调，服务注册表为Bundle之间共享对象提供了一个合理的模型。定义了一些事件来处理服务的安装和卸载。服务就是可以用来表示任何东西的Java对象。很多服务是服务器对象，比如HTTP server， 其他服务表示了以现实世界中的对象，比如打印机等。<br /><br /><br />  安全机制是基于Java 和Java2的安全模型，这个语言的设计减少很多可能的安全漏洞，比如，病毒使用缓冲区溢出就不可能了。访问限制使得对其他程序员代码的可视性 受到了限制。OSGi通过私有的class扩从了这个模型。一个在标准Java环境里面无法达到的机制。Java2 安全模型提供了一种合理的模型来检查代码和资源的访问。OSGi 添加了完整的动态管理权限的机制。<br /><br />   OSGi兼容设备可以下载并安装OSGi bundle，也可当他们不再需要的时候删除。Bundle 安装后会注册一定数量的服务，并可以同一个Framework下的使用其它Bundles。<br /><br />  在一个动态扩展的OSGi环境中，Framework管理Bundle的安装和更新。同时也管理Bundles和服务之间的依赖关系。<br /><br />   在一个动态扩展的OSGi环境中，Framework管理Bundle的安装和更新。同时也管理Bundle 和服务之间的依赖关系。<br /><br />Framework提供给Bundle开发者必须的资源来在Java平台上开发，为开发Bundles提供了代码动态加载的功能，也使得开发者开发、部署一个大规模的服务变得很容易。<br /><br /> 其次，Framework为Java Bundle开发者提供了简明一致的编程模型。简化了开发部署的复杂性。这个编程模型允许开发者将自己的接口规范邦定到OSGi环境中的服务。服务的使用者可以使用这个接口，而其实现在运行时才决定。<br /><br /> 一个一致的编程模型帮助开发者可以应付一些可估计的危机错误。Framework将会运行在不同的硬件环境上，但一致的接口确保软件可以运行在一致的服务接口上。<br /><br /><br />  一个Bundle可能处于以下六个状态：<br /><br />  1)INSTALLED：安装完成，本地资源成功加载<br /><br />  2）RESOLVED：依赖关系满足，这个状态意味着这个Bundle要么已经准备好运行，要么是被停止了。<br /><br />3）STARTING：Bundle正在被启动，BundleActivator的start()方法已经被调用但是还没有返回。<br /><br />4）STOPPING：Bundle正在被停止，BundleActivator的stop()方法已经被调用但是还没有返回。<br /><br />5）ACTIVE：Bundle 被成功启动并且在运行。<br /><br />6）UNINSTALLED：bundle被卸载并且无法进入其他状态。<br /><br />Bundle接口定义了getState()方法来返回Bundle的状态。<br /><br /> 下面介绍Bundle的一些API：<br /><br />安装Bundle<br /><br />  BundleContext 定义了以下两个方法来安装bundle:<br /><br /> 1) installBundle (String)：从String（一般是URL）定义的位置安装一个Bundle。<br /><br /> 2）installBundle(String, InputStream)：从一个输入流对象中安装一个Bundle。<br /><br /> 每一个Bundle都是由一个Sting来唯一表识。如果一个已经安装的Bundle正在使用这个specificated  location , installBundle（）方法必须返回原来的Bundle对象，而不是安装一个新的Bundle。将要安装的Bundle必须是持久的并且安装时全自动的。<br /><br />   当安装一个Bundle时，Framework会去找出Bundle依赖的Nativecode 。如果不存在，bundle 不能被安装。<br /><br />  一旦一个Bundle安装成功，会创建一个Bundle对象。对Bundle的生命周期的操作都通过该对象完成。可以用来start , stop, update, ininstall 该Bundle。<br /><br /><br /> <br /><br />  解析Bundle <br /><br /> <br /><br />   当Framework成功查找完Bundle的代码依赖关系，bundle的状态就变为RESOLVED。依赖关系包括：<br /><br />Classpath  依赖关系，定义在manifest文件头的Bundle-Classpath处。<br /><br />Package 依赖关系，定义在manifest文件头的Export-Package和Import-Package处。<br /><br /> 启动Bundle<br /><br />   Bundle接口定义了start()方法来启动一个Bundle。 如果启动成功，bundle的状态变为ACTIVE并保持这个状态直到被停止。<br /><br />   Bundle为了被启动，首先必须先分析它的依赖关系。如果分析依赖关系失败，而去启动这个Bundle，start()方法会抛出一个BundleException异常。<br /><br />   如果bundle依赖关系分析成功，通过调用Bundle Activator对象来激活Bundle。BundleActivator接口定义了方法可供Framework 调用，来启动或者停止Bundle。<br /><br />   开发者可以在Bundle的manifest文件中定义一个Bundle-Activator manifest header, 来告诉OSGi environment 作为BundleActivator的类的文件全名。该类实现了BundleActivator接口。<br /><br />    对一个Bundle来说，提供一个Bundle Activator并不是必须的。但是只有通过这种方法才能得到Bundle的BundleContext对象。<br /><br />   当Framework成功查找完Bundle的代码依赖关系，bundle的状态就变为RESOLVED。依赖关系包括：<br /><br />Classpath  依赖关系，定义在manifest文件头的Bundle-Classpath处。<br /><br />Package 依赖关系，定义在manifest文件头的Export-Package和Import-Package处。 <br /><br /> 停止Bundle<br /><br />   Bundle interface 定义了stop()方法停止一个Bundle。该方法停止一个Bundle并将Bundlede状态改为RESOLVED。<br /><br />   BundleActivator 接口定义了stop(BundleContext)方法，由Framework调用来停止一个Bundle。该方法必须释放被激活的所有资源。所有的相关线成必须马上停止。线程代码不会再使用同Framework相关的对象。<br /><br />   更新Bundle  <br /><br />   Bundle  interface 定义了两个方法来update一个bundle:<br /><br />  1) update：更新一个bundle<br /><br />  2) update(InputStream) ：这个方法用来从一个输入流对象中更新一个Bundle<br /><br />  更新过程支持从一个版本的bundle迁移到一个新版本的bundle。<br /><br />  Framwork 必须确保在任何时刻只有一个版本的bundle的class是可用的。如果被更新的bundle导出的任何的package被其他的bundle使用，那么那些package将不能被更新。他们的老版本将会一直保留，直到org.osgi.service.admin.PackageAdmin.resfeshPackages方法被调用或者Framework 重启。<br /><br />  卸载Bundle<br /><br />  Bundle 接口定义了uninstall()方法来从Framework中卸载一个Bundle。这个方法会让Framework通知其他的Bundles 说一个bundle已经被uninstalled, 并且将这个Bundle的状态设为UNINSTALLED。<br /><br />  2. 标准服务规范<br /><br />      在Framework的上方，OSGi联盟定义了很多服务。服务是由一个Java interface 来定义的。Bundle可以实现这个接口并且把服务注册到服务注册表中去。这个服务的客户可以从注册表中找到这个服务，并且对这个服务的出现和消失做出反应。<br /><br />   下面简单介绍一下OSGi  Release3 的服务。每个服务只是被抽象地定义，具体由不同的厂商实现。<br /><br />  2.1  Framework服务<br /><br />     OSGi Framework提供了权限管理服务，包管理服务和最初加载系统服务。这些服务是Framewrok的一部分并且指导着Framework的操作，Framework服务包含如下：<br /><br />    1）Permission Admin Service：权限是指Bundle是否许可另外的Bundle的代码。当前的或者以后的Bundle的权限可以通过这个服务来操作。一旦被设定权限，马上就生效；<br /><br />   2）Package Admin Service：Bundle之间可以共享包内的class和资源，bundle的更新可能需要系统重新计算他们之间的依赖关系，这个服务提供了系统实际的包的共享状态信息并且可以更新共享的包。例如中断当前的依赖关系并重新计算依赖关系。当Bundle更新或反安装时判断是否有其他服务正在使用当前的bundle。<br /><br /> 3）Start Lever Service：Start Level是指一些在其他Bundle起来之前必须运行或者初始化的一系列 bundle. Start Lever Service 设置当前的Start Lever， 将一个bundle 指派给startlevel 并且询问当前的设置。<br /><br /> <br /><br /> <br /><br /> <br /><br /> <br /><br />  2. 标准服务规范<br /><br />      在Framework的上方，OSGi联盟定义了很多服务。服务是由一个Java interface 来定义的。Bundle可以实现这个接口并且把服务注册到服务注册表中去。这个服务的客户可以从注册表中找到这个服务，并且对这个服务的出现和消失做出反应。<br /><br />   下面简单介绍一下OSGi  Release3 的服务。每个服务只是被抽象地定义，具体由不同的厂商实现。<br /><br />  2.1  Framework服务<br /><br />     OSGi Framework提供了权限管理服务，包管理服务和最初加载系统服务。这些服务是Framewrok的一部分并且指导着Framework的操作，Framework服务包含如下：<br /><br />    1）Permission Admin Service：权限是指Bundle是否许可另外的Bundle的代码。当前的或者以后的Bundle的权限可以通过这个服务来操作。一旦被设定权限，马上就生效；<br /><br />   2）Package Admin Service：Bundle之间可以共享包内的class和资源，bundle的更新可能需要系统重新计算他们之间的依赖关系，这个服务提供了系统实际的包的共享状态信息并且可以更新共享的包。例如中断当前的依赖关系并重新计算依赖关系。当Bundle更新或反安装时判断是否有其他服务正在使用当前的bundle。<br /><br /> 3）Start Lever Service：Start Level是指一些在其他Bundle起来之前必须运行或者初始化的一系列 bundle. Start Lever Service 设置当前的Start Lever， 将一个bundle 指派给startlevel 并且询问当前的设置。
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/180961#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Apr 2008 19:39:14 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/180961</link>
        <guid>http://yefeng.javaeye.com/blog/180961</guid>
      </item>
      <item>
        <title>OO的基本原则</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/173294" style="color:red;">http://yefeng.javaeye.com/blog/173294</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转载<br />Single Choice Principle(SCP) <br />所有的判断只在一处进行.违反此原则的典型情况是不同的方法中充斥着相同的if ... else ...或类似的语句. <br /><br />Linguistic Modular Units <br /><br />Few Interfaces <br /><br />Small Interfaces <br /><br />Explicit Interfaces <br /><br />Behavioral Completeness <br />一个完整的类必须包含完整的方法.如果类没有完成它的职责,或者没有完成其父类需要完成的工作,那么它就是不完整的类. <br /><br />Law Of Demeter <br />只与直接协作的类交互. <br /><br />The Principle of Essential Representation(PER) <br />类应该包含而且只包含其本质的定义和表现,与SRP比较接近. <br /><br />Single Responsibility Principle(SRP) <br />一个类只承担一项职责,只能有一个发生变化的理由,那就是它的职责变化了. <br /><br />Open-Colse Principle(OCP) <br />类应该对扩展是开放的,对修改是封闭的. <br /><br />Liskov Substitution (LSP) <br />子类必须可以替换父类. <br /><br />Dependency-Inversion Principles(DIP) <br />高层应该不依赖于低层,双方都应该依赖于抽象.抽象不依赖于细节,细节应该依赖于抽象. <br /><br />Interface Segregation Principles(ISP) <br />接口属于客户程序. <br /><br />--------------------------------- <br />Reuse Release Equivalence Principle(REP) <br />重用的粒度等于发布的粒度. <br /><br />Common Reuse Principle(CRP) <br />包中的类应该是共同重用的. <br /><br />Common Closure Principle(CCP) <br />包中的类对同一类变化共同封闭的,一个类发生变化,可能所有的类都要发生变化. <br /><br />--------------------------------- <br />Acyclic Dependencies Principle(ADP) <br />包之间的依赖结构不应该存在环依赖. <br /><br />Stable Dependencies Principle (SDP) <br />包应该依赖于比它更稳定的包. <br /><br />Stable Abstractions Principle(SAP) <br />包的稳定程度与抽象程度成正比,越抽象的包越稳定. <br /><br />--------------------------------- <br />开发时应该避免的bad design smell: <br />僵化(Rigidity) 一处变化会影响系统中的很多地方. <br />脆弱(Fragility) 一处变化会影响系统中不应该被影响的地方. <br />牢固(Immobility) 很难被重用. <br /><br />还有一些原则可能被遗漏掉,如果你发现了,请及时提醒我.
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/173294#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 11:08:03 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/173294</link>
        <guid>http://yefeng.javaeye.com/blog/173294</guid>
      </item>
      <item>
        <title>etc rc.local 自动启动tomcat</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/151271" style="color:red;">http://yefeng.javaeye.com/blog/151271</a>&nbsp;
          发表时间: 2007年12月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          touch /var/lock/subsys/local<br /><br /><br />export JDK_HOME=/usr/java/j2sdk1.4.2_04<br /><br />export JAVA_HOME=/usr/java/j2sdk1.4.2_04<br /><br />/usr/local/jakarta-tomcat-5.0.28/bin/startup.sh
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/151271#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Dec 2007 15:53:11 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/151271</link>
        <guid>http://yefeng.javaeye.com/blog/151271</guid>
      </item>
      <item>
        <title>python  sqlalchemy数据库操作</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/146361" style="color:red;">http://yefeng.javaeye.com/blog/146361</a>&nbsp;
          发表时间: 2007年12月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先安装sqlalchemy<br />下载 SQLAlchemy-0.4.1  然后 打开cmd 在此文件夹下,python setup.py install<br />注意如果用的是mysql数据,还要安装MYSQLDB,这个下载以后双击安装<br /><br />from sqlalchemy import *<br />mysql_engine = create_engine("mysql://root:root@127.0.0.1/test") <br />connection = mysql_engine.connect()<br />result = connection.execute("select name from tname")<br />for row in result:<br />    print "name:", row['name']<br />connection.close()<br /><br />这样就成功了
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/146361#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 06 Dec 2007 11:15:01 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/146361</link>
        <guid>http://yefeng.javaeye.com/blog/146361</guid>
      </item>
      <item>
        <title>垂直搜索技术</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/134564" style="color:red;">http://yefeng.javaeye.com/blog/134564</a>&nbsp;
          发表时间: 2007年10月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>转载：<a href="http://www.fullsearcher.com/">http://www.FullSearcher.Com/</a></p>
<p>&nbsp;</p>
<p>垂直搜索技术主要分为两个层次：模板级和网页库级。模板级是针对网页进行模板设定或者自动生成模板的方式抽取数据，对网页的采集也是针对性的采集，适合规模比较小、信息源少且稳定的需求，优点是快速实施、成本低、灵活性强，缺点是后期维护成本高，信息源和信息量小。网页库级就是在信息源数量上、数据容量上<a href="http://www.fullsearcher.com/" target="_blank">检索</a>容量上、稳定性可靠性上都是网页库搜索引擎级别的要求，和模板方式最大的区别是对具体网页不依赖，可针对任意正常的网页进<a href="http://www.fullsearcher.com/n2004911142713735.asp" target="_blank">信息采集</a><a href="http://www.fullsearcher.com/n20051112144458735.asp" target="_blank">信息抽取</a>&hellip;&hellip;。这就导致这种方式数据容量上和模板方式有质的区别，但是其灵活性差、成本高。当然模板方式和网页库级的方式不是对立的，这两者对于垂直搜索引擎来说是相互补充的，因为技术只是手段，目的是切反用户之需。本文谈及的技术主要是指网页库级别<a href="http://www.xpue.net/" target="_blank">垂直搜索引擎技术</a>。<br />
搜索引擎的确是一项对技术要求比较高的应用，几年前相关的人才也比较少。现在搜索技术人才多了，相关的技术和技术的应用得相对以前而言更加成熟，但是竞争也更加激烈了。垂直搜索大致需要以下技术：<br />
1.&nbsp;信息采集技术<br />
2.&nbsp;网页信息抽取技术<br />
3.&nbsp;信息的处理技术，包括：重复识别、重复识别、聚类、比较、分析、语料分析等<br />
4. 语意相关性分析<br />
5.&nbsp;<a href="http://www.fullsearcher.com/n2004911134640735.asp" target="_blank">分词</a><br />
6.&nbsp;索引<br />
<strong>信息采集技术，</strong>垂直搜索引擎<a href="http://www.fullsearcher.com/n2004911142713735.asp" target="_blank">spider</a>和网页库的spider相比应该是更加专业，可定制化。可定向性的采集和垂直搜索范围相关的网页忽略不相关的网页和不必要的网页，选择内容相关的以及适合做进一步处理的网页深度优先采集、对页面有选择的调整更新频率&hellip;&hellip;，采集可通过人工设定网址和网页分析url方式共同进行。垂直搜索对信息的更新有着特别的要求，根据这些特点可以从以下几点考虑1.信息源的稳定性（不能让信息源网站感觉到spider的压力）2.抓取的成本问题3.对用户体验改善程度。根据以上几点制定一种比较好的策略，要做到恰到好处。策略上可以评估网站/网页更新的系数、网站/网页的重要系数、用户点击系数（或曝光系数）、网站稳定系数&hellip;&hellip;，根据这些系数来确定对这些网站/网页更新的频率。再由于新信息和更新了的信息list页面前面或者首页，所以对网页进行很好的分级可以以低成本很好的解决更新问题，系数比较低的网页一月update一次，稍微高点的一周update一次、中等的几天到一天一次、高的几小时到几分钟一次。类似搜索引擎的大库、周库、日库，小时库&hellip;&hellip;<br />
<strong>基于视觉</strong><a href="http://www.fullsearcher.com/n20051112145315735.asp" target="_blank"><strong>网页块分析</strong></a><strong>技术</strong>，模拟IE浏览器的显示方式，对网页进行解析。根据人类视觉原理，把网页解析处理的结果，进行分块，再根据需要，对这些块进行处理，如：采集定向、介绍抽取和一些必要的内容的抽取<a href="http://www.fullsearcher.com/n20051112145315735.asp" target="_blank">正文抽取</a>&hellip;&hellip;<br />
<strong>结构化信息抽取技术，</strong>将网页中的非结构化数据按照一定的需求抽取成结构化数据。有两种方式，简单的就是<a href="http://www.fullsearcher.com/n200631153058735.asp" target="_blank">模板方式</a>，另外就是对网页不依赖web<a href="http://www.fullsearcher.com/n20051112144458735.asp" target="_blank">结构化信息</a>抽取方式，这两种方式可以互取长处，以最简单最有效的办法满足需求。垂直搜索引擎和通用搜索引擎最大的区别就是对网页信息结构化抽取后再结构化数据进行深度的处理，提供专业的搜索服务。所以web结构化信息抽取的技术水平是决定垂直搜索引擎质量的重要技术指标。其实web结构化信息抽取在百度、google早已经广泛应用了，如：MP3、图片搜索、google的本地搜索就是从网页库抽取出企业信息，添加到其地图搜索中的，google通过这种技术正在颠覆做内容的方式。同样的技术应用还在qihoo、sogou购物、shopping等各种应用中体现。<br />
<strong>简单的语法分析，</strong>简单的语法分析在搜索引擎中非常重要，可以通过简单的语法分析来改善数据的质量，低成本的获得某类信息，改善排序，寻找需要的内容&hellip;&hellip;<br />
<strong>信息处理技术，</strong>信息处理包括的范围比较广，主要包括去重、聚类、分析&hellip;&hellip;，这根据需要相关的技术就非常多。<br />
<strong>数据挖掘，</strong>找出您的信息的关联性对于垂直搜索来说非常重要，有效，可以在这些相关性上为用户提供更细致的服务。<br />
<strong>分词技术，</strong>面向搜索的分词技术，建立和您的行业相关的词库。注意这是面向搜索的分词，不是面向识别和准确的分词。就这个工作安排十几个人不停的维护也不会嫌多。<br />
<strong>索引技术</strong>，索引技术对于垂直搜索非常关键，一个网页库级的搜索引擎必须要支持分布索引、分层建库、分布检索、灵活的更新、灵活的权值调整、灵活的索引和灵活的升级扩展、高可靠性稳定性冗余性。还需要支持各种技术的扩展，如偏移量计算等。<br />
<strong>其它技术，</strong>略。<br />
</p>
<p>垂直搜索引擎的技术评估应从以下几点来判断<br />
1.&nbsp;全面性<br />
2.&nbsp;更新性<br />
3.&nbsp;准确性<br />
4.&nbsp;功能性</p>
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/134564#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 22 Oct 2007 19:58:31 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/134564</link>
        <guid>http://yefeng.javaeye.com/blog/134564</guid>
      </item>
      <item>
        <title>搜索引擎优化策略?</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/133554" style="color:red;">http://yefeng.javaeye.com/blog/133554</a>&nbsp;
          发表时间: 2007年10月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span id="tasdf_1">&nbsp;
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span style="COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="2">一、目的：</font><font size="2"><span lang="EN-US"> <br />
</span>提高网站页面在<span lang="EN-US">google</span>、百度、雅虎等搜索引擎中的搜索结果排名，提升从搜索引擎获得的流量。 </font><span lang="EN-US"><br />
</span><font size="2">二、优化工作的几个方面</font><font size="2"><span lang="EN-US"> <br />
2.1</span>优化全站网页，按照底级页模板、专题模板、频道模板、首页模板顺序修改；</font><font size="2"><span lang="EN-US"> <br />
</span>由频道编辑和技术工程师共同完成 </font><span lang="EN-US"><br />
<font size="2">2.2</font></span><font size="2">优化站外合作（友情）连接；</font><font size="2"><span lang="EN-US"> <br />
</span>由频道编辑完成 </font><span lang="EN-US"><br />
<font size="2">2.3 </font></span><font size="2">优化和频道相关的搜索引擎热门关键词、时效性热门内容；</font><font size="2"><span lang="EN-US"> <br />
</span>由频道编辑完成 </font><span lang="EN-US"><br />
<font size="2">2.4 </font></span><font size="2">将动态页面<span lang="EN-US">URL</span>静态化（应用<span lang="EN-US">Apache</span>的<span lang="EN-US">mod_rewrite</span>模块）</font><font size="2"><span lang="EN-US"> <br />
</span>由技术工程师完成 </font><span lang="EN-US"><br />
<font size="2">2.5 </font></span><font size="2">定期跟踪观察优化效果</font><font size="2"><span lang="EN-US"> <br />
</span>由频道编辑完成 </font><span lang="EN-US"><br />
</span><font size="2">三、优化工作各方面工作的详细说明 </font><span lang="EN-US"><br />
<font size="2">3.1 </font></span><font size="2">优化全站网页模板： </font><span lang="EN-US"><br />
<font size="2"><st1:chsdate isrocdate="False" month="12" day="30" islunardate="False" w:st="on" year="1899">3.1.1</st1:chsdate> </font></span><font size="2">用<span lang="EN-US">Web</span>标准（<span lang="EN-US">DIV+CSS</span>）重构页面模板，</font><font size="2"><span lang="EN-US"> <br />
</span>不使用<span lang="EN-US">table</span>控制排版，不使用<span lang="EN-US">table</span>嵌套 </font><span lang="EN-US"><br />
<font size="2">3.1.2 </font></span><font size="2">网页文件大小越小越好，压缩和正文无关的代码，控制在<span lang="EN-US">75K</span>以内，</font><font size="2"><span lang="EN-US"> <br />
</span>用外部调用方式使用<span lang="EN-US">CSS</span>样式单和<span lang="EN-US">JS</span>，</font><font size="2"><span lang="EN-US"> <br />
</span>广告和与正文无关的内容尽量用<span lang="EN-US">iframe</span>、<span lang="EN-US">JS</span>等方式调用显示 </font><span lang="EN-US"><br />
<font size="2">3.1.3 </font></span><font size="2">为最终页加上标题，格式：，长度一般不超过<span lang="EN-US">30</span>个汉字，不要空着标题，避免太多页面使用同样的标题；</font><font size="2"><span lang="EN-US"> <br />
</span>例如： </font><span lang="EN-US"><br />
<font size="2">3.1.4 </font></span><font size="2">为网页加上内容简介标签，</font><font size="2"><span lang="EN-US"> <br />
</span>要清晰明了的写出网页内容，突出核心关键词。一般不超过<span lang="EN-US">100</span>个汉字，不写与网页内容不相干的内容。现阶段可以填充<span lang="EN-US">CMS</span>的新闻标题等相关变量。</font><font size="2"><span lang="EN-US"> <br />
</span>例如： 注意必须要有半角双引号 </font><span lang="EN-US"><br />
<font size="2">3.1.5 </font></span><font size="2">为网页加上关键词标签，</font><font size="2"><span lang="EN-US"> <br />
</span>多个关键词用半角逗号隔开；写与网页相关的关键词，并把最相关的关键词排到前面。一般不超过<span lang="EN-US">30</span>个汉字。</font><font size="2"><span lang="EN-US"> <br />
</span>例如：</font><font size="2"><span lang="EN-US"> <br />
3.1.6</span>为正文的配图加上<span lang="EN-US">alt</span>说明，</font><span lang="EN-US"><v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"><font size="2"> <v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></font></v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="说明" style="WIDTH: 24pt; HEIGHT: 24pt"></v:shape><br />
</span><font size="2">可用<span lang="EN-US">CMS</span>填充正文标题。</font><font size="2"><span lang="EN-US"> <br />
</span>例如：</font><span lang="EN-US"><v:shape id="_x0000_i1026" type="#_x0000_t75" alt="周杰伦弃蔡依林结新欢 与侯佩岑同游日本" style="WIDTH: 24pt; HEIGHT: 24pt"><font size="2"></font></v:shape><font size="2"> <br />
3.1.7 </font></span><font size="2">文章标题使用<span lang="EN-US"> <o:p></o:p></span></font></span></p>
<br />
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; mso-pagination: widow-orphan"><span style="COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="2">强调、加粗标记来强调主要内容。</font><font size="2"><span lang="EN-US"> <br />
</span>在<span lang="EN-US">W<st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="3" negative="False" numbertype="1" unitname="C" w:st="on">3C</st1:chmetcnv></span>的<span lang="EN-US">HTML</span>标准中，规定了使用<span lang="EN-US"> <o:p></o:p></span></font></span></p>
<br />
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; mso-pagination: widow-orphan"><span lang="EN-US" style="COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="2">&hellip; <o:p></o:p></font></span></p>
<br />
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 2"><span style="COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt; mso-bidi-font-family: 宋体; mso-bidi-font-weight: bold"><font size="2">中的标题是更重要的内容。</font><font size="2"><span lang="EN-US"> <br />
</span>例如：<span lang="EN-US"> <o:p></o:p></span></font></span></p>
<br />
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1"><span style="COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt; mso-bidi-font-family: 宋体; mso-bidi-font-weight: bold"><font size="2">新闻标题或者专题标题<span lang="EN-US"><o:p></o:p></span></font></span></p>
<br />
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 2"><span style="COLOR: black; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt; mso-bidi-font-family: 宋体; mso-bidi-font-weight: bold"><font size="2">关键词</font><font size="2"><span lang="EN-US"> <br />
</span>使用方法：可在<span lang="EN-US">CSS</span>样式单中定义<span lang="EN-US">h1</span>的字体大小，颜色，粗细等</font><font size="2"><span lang="EN-US"> <br />
<br />
<st1:chsdate isrocdate="False" month="12" day="30" islunardate="False" w:st="on" year="1899">3.1.8</st1:chsdate> </span>在底级页、专题页、栏目首页、频道首页放置 和 本页面主要内容相关的的新闻、搜索、论坛连接。</font><font size="2"><span lang="EN-US"> <br />
<br />
3.1.9 </span>保证底级页、专题页、栏目页中人工挑选的相关关键词的质量。</font><font size="2"><span lang="EN-US"> <br />
</span>请参考《关键词分析方法和技巧》</font><font size="2"><span lang="EN-US"> <br />
<br />
3.1.10 </span>底级页的搜索引擎文本输入框预置相关关键词</font><font size="2"><span lang="EN-US"> <br />
<br />
3.1.11 </span>注意导航设计（<span lang="EN-US">sitemap</span>）：所有的页面都能从频道首页用不超过<span lang="EN-US">5</span>次点击连接到，所有页面都能链回首页；避免连接错误，比如调用不存在的图片和连接到不存在的网页</font><font size="2"><span lang="EN-US"> <br />
<br />
3.1.12</span>避免用<span lang="EN-US">JS</span>、<span lang="EN-US">Flash</span>、大幅图片来制作整个页面；如果一定要，必须在页面中留下文本内容；</font><font size="2"><span lang="EN-US"> <br />
<br />
3.1.13</span>在之前用注释的方式重复正文标题和关键词</font><font size="2"><span lang="EN-US"> <br />
<br />
3.1.14 </span>专题、栏目等页面的<span lang="EN-US">URL</span>使用核心主题的汉语拼音（优先）或英文，但不要过长</font><font size="2"><span lang="EN-US"> <br />
<br />
3.1.15 </span>频道首页<span lang="EN-US">title</span>修改为<span lang="EN-US">&ldquo;</span>频道名<span lang="EN-US"> - </span>核心内容</font><font size="2"><span lang="EN-US">&rdquo; <br />
</span>例如：<span lang="EN-US">&ldquo;</span>房产<span lang="EN-US">&rdquo;</span>改为<span lang="EN-US">&ldquo;</span>房产<span lang="EN-US"> - </span>中国房地产最新报道</font><font size="2"><span lang="EN-US">&rdquo; <br />
<br />
3.1.16 </span>在页面模板头部添加</font><font size="2"><span lang="EN-US"> <br />
<br />
3.1.17 </span>为频道<span lang="EN-US">logo</span>增加<span lang="EN-US">alt</span>说明。</font><font size="2"><span lang="EN-US"> <br />
<br />
3.2</span>站外合作（友情）连接优化</font><font size="2"><span lang="EN-US"> <br />
<br />
3.2.1</span>多和优秀同类网站交换连接，使用文字或者图片连接形式</font><font size="2"><span lang="EN-US"> <br />
</span>保证合作网站、合作专题的首页有对应链向首页的连接</font><font size="2"><span lang="EN-US"> <br />
</span>争取合作网站每个网页都有对应链向首页的连接</font><font size="2"><span lang="EN-US"> <br />
<br />
3.2.2 </span>文字连接形式</font><font size="2"><span lang="EN-US"> <br />
</span>在连接文字中使用和连接页面内容相关的最热门相关关键字，比如<span lang="EN-US">&ldquo;</span>软件下载<span lang="EN-US">&rdquo;</span>比<span lang="EN-US">&ldquo;</span>软件<span lang="EN-US">&rdquo;</span>效果好</font><span lang="EN-US"><font size="2"> <br />
</font><a href="http://software.***.com/" target="_blank"><span lang="EN-US" style="COLOR: #004a9c; TEXT-DECORATION: none; text-underline: none"><span lang="EN-US"><font size="2">软件下载</font></span></span></a><font size="2"> <br />
<br />
3.2.3 </font></span><font size="2">图片连接形式，为图片加上<span lang="EN-US">alt</span>说明</font><font size="2"><span lang="EN-US"> <br />
</span>例如：</font><span lang="EN-US"><a href="http://ent.***.com/" target="_blank"><span style="COLOR: #004a9c; TEXT-DECORATION: none; text-underline: none"><v:shape href="http://ent.***.com/" id="_x0000_i1027" type="#_x0000_t75" o:button="t" target="_blank" alt="娱乐 - 电影、电视、音乐最新报道" style="WIDTH: 24pt; HEIGHT: 24pt"><font size="2"></font></v:shape></span></a><font size="2"> <br />
</font></span><font size="2">其中<span lang="EN-US">alt</span>是对图片的注释，加入和连接页面相关的热门的相关关键词</font><font size="2"><span lang="EN-US"> <br />
<br />
3.2.4 </span>相关关键词选取的依据</font><font size="2"><span lang="EN-US">: <br />
</span>频道名称、栏目名称、频道主要内容</font><font size="2"><span lang="EN-US"> <br />
</span>以及参考搜索引擎用户最常使用的关键词</font><font size="2"><span lang="EN-US"> <br />
<a href="http://top.baidu.com/" target="_blank">http://top.baidu.com/</a> <br />
<a href="http://www.sogou.com/top/index.html" target="_blank">http://www.sogou.com/top/index.html</a> <br />
<br />
3.3 </span>针对频道热门内容的优化</font><font size="2"><span lang="EN-US"> <br />
<br />
3.3.1 </span>每日更新热门栏目</font><font size="2"><span lang="EN-US"> <br />
<br />
3.3.2 </span>针对频道热门内容发布尽可能多的原创内容</font><font size="2"><span lang="EN-US"> <br />
<br />
3.4</span>将动态页面<span lang="EN-US">URL</span>静态化（应用<span lang="EN-US">Apache</span>的<span lang="EN-US">mod_rewrite</span>模块）</font><font size="2"><span lang="EN-US"> <br />
</span>例如：用户和搜索引擎<span lang="EN-US">spider</span>程序所访问的静态化</font><font size="2"><span lang="EN-US">URL <br />
<a href="http://app" target="_blank">http://app</a>.***.com/music/searchsong/singer/</span>周杰伦</font><font size="2"><span lang="EN-US"> <br />
</span>在后台重定向到</font><font size="2"><span lang="EN-US"> <br />
<a href="http://app" target="_blank">http://app</a>.***.com/music/searchsong.php?mod=singer&amp;keyword=</span>周杰伦</font><font size="2"><span lang="EN-US"> <br />
</span>这<span lang="EN-US">2</span>个<span lang="EN-US">URL</span>所显示的内容一样</font><font size="2"><span lang="EN-US"> <br />
<br />
3.5 </span>跟踪统计优化的效果</font><font size="2"><span lang="EN-US"> <br />
</span>根据日志统计包括每日从<span lang="EN-US">baidu,google,yahoo</span>等搜索引擎带来的流量。</font><font size="2"><span lang="EN-US"> <br />
<br />
<br />
</span>仔细看了一遍这份搜索引擎优化方案，发表下个人见解：</font><font size="2"><span lang="EN-US"> <br />
<br />
</span>从策略角度上可以说写的比较全面，这些策略的应用的确会提升一个网站在<span lang="EN-US">google</span>、<span lang="EN-US">baidu</span>、<span lang="EN-US">yahoo</span>等搜索引擎上的友好型，并有一些专门针对关键词的优化考虑，作为整站优化的<span lang="EN-US">SEO</span>教程是比较合适。</font><font size="2"><span lang="EN-US"> <br />
<br />
</span>但是，从应用角度来讲，对于流程复杂程度很高的大型门户网站来说，类似以上这种基础优化方案（个人称之为<span lang="EN-US">SEO</span>手册）还是不够的；对于门户网站的各位<span lang="EN-US">SEO</span>来说，要想凸现成绩，必须有针对特定目标的、准确的、执行方案。</font><font size="2"><span lang="EN-US"> <br />
<br />
</span>从<span lang="EN-US">SEO</span>技术角度讲，有几点还是值得探讨的，譬如：</font><font size="2"><span lang="EN-US"> <br />
<br />
1</span>、</font><font size="2"><span lang="EN-US"> <br />
</span>引用</font><font size="2"><span lang="EN-US"> <br />
</span>所有的页面都能从频道首页用不超过<span lang="EN-US">5</span>次点击连接到</font><font size="2"><span lang="EN-US"> <br />
<br />
</span>假如，某个频道的某篇文章页（即终极页）在该频道的相应栏目列表页的第<span lang="EN-US">31</span>页，同时，由于文章较老，无法在相关文章中匹配出来，而且翻页数量为<span lang="EN-US">10</span>（这个比较通用了），那点击行为是：首页》频道首页》该栏目文章列表页》第<span lang="EN-US">10</span>页》第<span lang="EN-US">20</span>页》第<span lang="EN-US">30</span>页》，点开文章就是第<span lang="EN-US">6</span>次点击。这个问题如何解决？？？</font><font size="2"><span lang="EN-US"> <br />
<br />
</span>不知道<span lang="EN-US">&ldquo;</span>不超过<span lang="EN-US">5</span>次点击<span lang="EN-US">&rdquo;</span>这个结论有何而来，有知道的朋友请评论告知下！</font><font size="2"><span lang="EN-US"> <br />
<br />
2</span>、</font><font size="2"><span lang="EN-US"> <br />
</span>引用</font><font size="2"><span lang="EN-US"> <br />
</span>所有页面都能链回首页</font><font size="2"><span lang="EN-US"> <br />
<br />
</span>这个要求本身是正确的，可是从策略上讲是不合理的；首页重要，但是首页能针对的关键词却是有限的，什么样的优化策略决定着要使用何种链接结构，一般而言，频道首页重要型大于网站首页，因为内容页的<span lang="EN-US">PR</span>是从频道首先向下传递的，所以不是什么样的网站都必须要求每个页面链回首页；对于门户网站来说，频道基本上都是开的二级域名，也就是说在<span lang="EN-US">SE</span>眼中是一个<span lang="EN-US">&ldquo;</span>新站点<span lang="EN-US">&rdquo;</span>，所以，针对这个<span lang="EN-US">&ldquo;</span>新站点<span lang="EN-US">&rdquo;</span>庞大链接系统的起点并不是从<span lang="EN-US">www.***.com</span>开始的。 </font><span lang="EN-US"><br />
<font size="2">3</font></span><font size="2">、 </font><span lang="EN-US"><br />
</span><font size="2">当然，这个方案的价值还是很高的，其中重要的几点的确提的好： </font><span lang="EN-US"><br />
<font size="2">1</font></span><font size="2">、避免连接错误，比如调用不存在的图片和连接到不存在的网页</font><font size="2"><span lang="EN-US"> <br />
</span>很多<span lang="EN-US">SEO</span>都知道这个的重要型，但是却在优化中没有提炼出来</font><font size="2"><span lang="EN-US"> <br />
2</span>、广告和与正文无关的内容尽量用<span lang="EN-US">iframe</span>、<span lang="EN-US">JS</span>等方式调用显示</font><font size="2"><span lang="EN-US"> <br />
</span>这句话应该改成<span lang="EN-US">&ldquo;</span>广告等和与正文无关的内容尽量用<span lang="EN-US">iframe</span>、<span lang="EN-US">JS</span>等方式调用显示<span lang="EN-US">&rdquo;</span>，这是搜索引擎网页净化中很重要的一个策略。<span lang="EN-US"><o:p></o:p></span></font></span></p>
</span>
          <br/>
          <span style="color:red;">
            <a href="http://yefeng.javaeye.com/blog/133554#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 20 Oct 2007 01:10:06 +0800</pubDate>
        <link>http://yefeng.javaeye.com/blog/133554</link>
        <guid>http://yefeng.javaeye.com/blog/133554</guid>
      </item>
      <item>
        <title>搜索引擎复制网页的算法</title>
        <author>yefeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yefeng.javaeye.com">yefeng</a>&nbsp;
          链接：<a href="http://yefeng.javaeye.com/blog/133480" style="color:red;">http://yefeng.javaeye.com/blog/133480</a>&nbsp;
          发表时间: 2007年10月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>转载</strong></p>
<p><strong>关键词：</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">搜索</strong>引擎，复制网页，<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">算法</strong>，信息指纹，Fingerprint，关键词</p>
<p><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">搜索</strong>引擎判断复制网页一般都基于这么一个思想：为每个网页计算出一组<strong>信息指纹（Fingerprint）</strong>，若两个网页有一定数量相同的信息指纹，则认为这两个网页的内容重叠性很高，也就是说两个网页是内容复制的。</p>
<p>很多<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">搜索</strong>引擎判断内容复制的方法都不太一样，主要是以下两点的不同：</p>
<p>1、计算<strong>信息指纹（Fingerprint）</strong>的<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">算法</strong>；<br />
2、判断信息指纹的相似程度的参数。</p>
<p><strong>在描述具体的<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">算法</strong>前，先说清楚两点：</strong><br />
<strong>1、什么是信息指纹？</strong>信息指纹就是把网页里面正文信息，提取一定的信息，可以是关键字、词、句子或者段落及其在网页里面的权重等，对它进行加密，如MD5加密，从而形成的一个字符串。信息指纹如同人的指纹，只要内容不相同，信息指纹就不一样。<br />
2、<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">算法</strong>提取的信息不是针对整张网页，而是把网站里面共同的部分如导航条、logo、版权等信息（这些称之为网页的&ldquo;噪音&rdquo;）过滤掉后剩下的文本。</p>
<p><strong>分段签名<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">算法</strong></strong></p>
<p>这种<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">算法</strong>是按照一定的规则把网页切成N段，对每一段进行签名，形成每一段的信息指纹。如果这N个信息指纹里面有M个相同时（m是系统定义的阙值），则认为两者是复制网页。</p>
<p>