<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Yoshow's Weblog</title><link>http://www.cnblogs.com/yoshow/</link><description>Concentrate on Javascript, C#, PHP,Ajax.Net, Web2.0 !</description><language>zh-cn</language><lastBuildDate>Wed, 19 Nov 2008 05:23:02 GMT</lastBuildDate><pubDate>Wed, 19 Nov 2008 05:23:02 GMT</pubDate><ttl>60</ttl><item><title>募开心网好友</title><link>http://www.cnblogs.com/yoshow/archive/2008/11/12/1331793.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Wed, 12 Nov 2008 01:45:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/11/12/1331793.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1331793.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/11/12/1331793.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1331793.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1331793.html</trackback:ping><description><![CDATA[ 

    
    
    
如果你有开心网id，搜ruanyu83@gmail.com加我好友, 大家一起玩 ^_^.<br>  <br> 如果你没开心网id，通过这个连接注册（你至少有1g免费网盘赚），有很多分 <br><br> http://www.kaixin001.com/reg/?uid=10486026&usercode=cfdb121f01ea7b3b3c693773c13c61e4_10486026__%E5%85%B6%E4%BB%96<br>  <br> 有任何问题，欢迎问，开心网主要就是玩小游戏的sns网站，你注册我每个游戏能加点钱。<br><img src ="http://www.cnblogs.com/yoshow/aggbug/1331793.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43606/" target="_blank">[新闻]李彦宏首次表态竞价排名问题:有错能改善莫大焉</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Collection of Emacs Development Environment Tools (CEDET) 的安装与使用</title><link>http://www.cnblogs.com/yoshow/archive/2008/10/31/1323375.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Thu, 30 Oct 2008 16:28:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/10/31/1323375.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1323375.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/10/31/1323375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1323375.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1323375.html</trackback:ping><description><![CDATA[

    
    
    


    
    
    
Collection of Emacs Development Environment Tools (CEDET) 的安装与使用 <br><br>ECB是emacs的增强工具，她可以提供更加完善的开发环境。 <br><br>一、下载 <br>ECB是CEDET工具包中的一项，可以从以下地址下载： <br>http://sourceforge.net/projects/ecb/ <br>他还需要其她几个软件包 <br>speedbar <br>eieio <br>semantic <br>下载地址： <br>http://sourceforge.net/projects/cedet/ <br><br>将这几个软件包解压到emacs的目录下，我的emacs配置目录为 <br>/usr/local/share/emacs/21.1/ <br>site-lisp/ <br>ecb <br>speedbar <br>eieio <br>semantic <br><br>然后进行配置，顺序为：speedbar eieio semantic ecb <br><br>二、配置 <br>1.speedbar配置 <br>在site-lisp/subdirs.el中加入 <br>(add-to-list 'load-path "/path/speedbar") <br>我的为: <br>(add-to-list 'load-path "/usr/local/share/emacs/speedbar") <br>然后加入: <br>(autoload 'speedbar-frame-mode "speedbar" "Popup a speedbar frame" t) <br>(autoload 'speedbar-get-focus "speedbar" "Jump to speedbar frame" t) <br><br>(global-set-key [(f4)] 'speedbar-get-focus) <br><br>如果你用Emacs,加入: <br>(define-key-after (lookup-key global-map [menu-bar tools]) <br>[speedbar] '("Speedbar" . speedbar-frame-mode) [calendar]) <br><br>如果你用XEmacs,加入： <br>(add-menu-button '("Tools") <br>["Speedbar" speedbar-frame-mode <br>:style toggle <br>:selected (and (boundp 'speedbar-frame) <br>(frame-live-p speedbar-frame) <br>(frame-visible-p speedbar-frame))] <br>"--") <br><br>;; Texinfo fancy chapter tags <br>(add-hook 'texinfo-mode-hook (lambda () (require 'sb-texinfo))) <br><br>;; HTML fancy chapter tags <br>(add-hook 'html-mode-hook (lambda () (require 'sb-html))) <br>(autoload 'rpm "sb-rpm" "Rpm package listing in speedbar.") <br>;; w3 link listings <br>(autoload 'w3-speedbar-buttons "sb-w3" "s3 specific speedbar button <br>generator.") <br><br>XEmacs Emacs 20.2版本以前的加入: <br>;; chapter listings <br>(autoload 'Info-speedbar-buttons "sb-info" "Info specific speedbar <br>button generator.") <br>;; folder listings <br>(autoload 'rmail-speedbar-buttons "sb-rmail" "Rmail specific speedbar <br>button generator.") <br>;; current stack display <br>(autoload 'gud-speedbar-buttons "sb-gud" "GUD specific speedbar button <br>generator.") <br>以后的加入 <br>(eval-after-load "info" '(require 'sb-info)) <br><br><br>2.eieio 配置 <br>在site-lisp/subdirs.el中加入 <br>(add-to-list 'load-path "/path/eieio") <br>我的为: <br>(add-to-list 'load-path "/usr/local/share/emacs/eieio") <br><br><br>3.semantic 配置 <br>在site-lisp/subdirs.el中加入 <br>(add-to-list 'load-path "/path/to/semantic") <br>(setq semantic-load-turn-everything-on t) <br>我的为: <br>(add-to-list 'load-path "/usr/local/share/emacs/semantic") <br>(setq semantic-load-turn-everything-on t) <br><br>4.ecb 配置 <br><br>在site-lisp/subdirs.el中加入 <br>(add-to-list 'load-path "/path/ecb") <br>我的为: <br>(add-to-list 'load-path "/usr/local/share/emacs/ecb") <br><br>在~/.emacs中加入 <br>(require 'ecb) <br><br>三、使用 <br><br>M-x ecb-activate 激活ECB <br>M-x ecb-show-help 查看帮助 <br><br><br>四、其它 <br><br>如果你想加速这些程序的执行，那么就要将EL文件编译成ELC文件。 <br>查看相应程序的Makefile文件，修改LOADPATH变量，然后make即可<br><img src ="http://www.cnblogs.com/yoshow/aggbug/1323375.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43605/" target="_blank">[新闻]杨致远发表博客解释辞职原因</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>MOSS的Log文件不断增长的解决办法</title><link>http://www.cnblogs.com/yoshow/archive/2008/08/10/1264526.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Sat, 09 Aug 2008 20:09:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/08/10/1264526.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1264526.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/08/10/1264526.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1264526.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1264526.html</trackback:ping><description><![CDATA[ 今天遇到个奇怪的问题，发现机子跑都跑不动, 最后发现C盘只剩下199MB了. 经过查找发现就是我的MOSS的的日志文件, 居然有一个文件有8G. -_-<br id="jwol"><br id="jwol0">最后只有把那个8G的文件先删除, 然后再网上查找此问题的解决方法, 发现遇到此问题的人不少..<br id="jipv2"><br id="zv3s">最后建议以下步骤：<br id="jipv3"><br id="jipv4">1. 打开 管理中心 > 操作 > 诊断日志记录<br id="jipv5"><br id="jipv6">2. 在事件限制部分做如下选择：<br id="jipv7"><br id="jipv8">选择类别: 全部<br id="jipv9">要报告给事件日志的关键程度最低的事件: 警告<br id="jipv10">要报告给跟踪日志的关键程度最低的事件: 意外<br id="jipv11"><br id="jipv12">这样可以有效地帮助我们减小日志文件的大小，但是错误仍然会被记录在日志文件中用做诊断问题的信息。<br id="jipv13"><br id="bdy2">(*)如果愿意 你还可以和我一样修改日志的路径到其他的盘, 日志文件数 默认96, 我改成了48.<br id="jx_y0"><br id="jipv14">3. 单击确定保存您的改动。<br id="jipv15"><br id="jwol1">参考的文章 http://bbs.winos.cn/thread-35075-1-1.html<br id="llz6">            <img src ="http://www.cnblogs.com/yoshow/aggbug/1264526.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43604/" target="_blank">[新闻]微软公布免费安全软件计划</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>OWSTIMER.EXE 导致CPU使用率过高</title><link>http://www.cnblogs.com/yoshow/archive/2008/07/26/1252278.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Sat, 26 Jul 2008 15:53:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/07/26/1252278.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1252278.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/07/26/1252278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1252278.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1252278.html</trackback:ping><description><![CDATA[OWSTIMER.EXE causes a high CPU usage<br id="h352"><br id="gfjr">原文 http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/03/08/owstimer-exe-causes-a-high-cpu-usage.aspx<br id="xx4j"><br id="x6yw">自从安装WSS3之后，不定时会发现OWSTIMER.EXE Process的CPU使用量忽然冲高，同时HD声不断闪烁的状况。前后不定时发生过好几次，今天终于忍不住用Process Monitor追了一下，发现有个写入C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12LOGSMahineName-yyyyMMdd-HHmm.log的动作，再一看Log，不得了! Log居然长大到近200MB的大小，检视的结果，里面有一大堆如下的Log，一秒钟就产生数十笔。<br id="x6yw0"><br id="x6yw1">03/08/2007 14:23:54.15 OWSTIMER.EXE (0x07A8) 0x07B4 Windows SharePoint Services Timer 5uuf Monitorable The previous instance of the timer job '设定重新整理', id '{7395AF13-764D-4745-8911-3F37C333DB18}' for service '{FC0283B2-109C-4FA5-B91E-5B7A01BE8426}' is still running, so the current instance will be skipped. Consider increasing the interval between jobs.<br id="x6yw2"><br id="x6yw3">这可以解释为什么CPU冲高，HD声大作，而且应该CPU愈快，情况愈严重吧! (我可怜的E6400)<br id="x6yw4"><br id="x6yw5">Google了一下，有不少同病相怜的人提问，但没有答案。换了一下关键词"owstimer config refresh"，找到这篇说明。由说明中看来，这类讯息属于Information等级，基于某种状况反复发生(非致命性)，大量写入Log反而形成问 题。依文章中的说明到"Sharepoint 3.0 管理中心/操作/诊断日志记录/事件限制"下调了"定时器"的"要报告给跟踪日志的关键程度最低的事件"为"意外"(Unexpected)，虽成效仍有待观察，但我想应该已经打到要害了。<br id="x6yw6"><br id="x6yw7">最后顺便示范一下Google解答的小技巧，一开始我用"OWSTIMER.EXE owstimer "The previous instance of the timer job"去找，只找到两笔没有答案的Post，但第二笔结果中出现了"the timer job 'Config Refresh'"的字样，我确定了"设定重新整理"的英文原来是Config Refresh，再用"owstimer config refesh"去找，就发现了我要的答案。当第一波查询没有答案时，可以利用相关的结果修正你的关键词，这个技巧非常有用，是我在这行混饭吃的重要密技 (惊! 我怎么说了出来?)，也证明了装英文版，查问题时可以少个七八个Click。<br id="v6ju9">            <img src ="http://www.cnblogs.com/yoshow/aggbug/1252278.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43603/" target="_blank">[新闻]《时代》：杨致远被Google玩弄于股掌之间？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>在C#中使用Nullable类型</title><link>http://www.cnblogs.com/yoshow/archive/2008/07/08/1238089.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Tue, 08 Jul 2008 04:48:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/07/08/1238089.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1238089.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/07/08/1238089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1238089.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1238089.html</trackback:ping><description><![CDATA[在C#1.x的版本中，一个值类型变量是不可以被赋予null值的，否则会产生异常。在C#2.0中，微软提供了Nullable类型，允许用它定义包含null值（即空值）的数据类型，这对处理数据库中包含可选字段以及很多方面都有很大帮助。<br id="n2w9"><br id="n2w90">定义Nullable类型<br id="n2w91"><br id="n2w92">定义一个nullable类型非常类似于定义一个非nullable类型。不同之处在于使用类型修饰符“？”。比如定义一个整型如下：<br id="n2w93"><br id="n2w94">int myInt = 1;<br id="n2w95"><br id="n2w96">要使一个整型变量可以存储一个null值，可以如下声明：<br id="n2w97"><br id="n2w98">int? myNullableInt = 1;<br id="n2w99"><br id="n2w910">这两个变量看起来似乎是一样的。但事实并非如此。实际上，Nullable类型是一个结构体，它有两个公开可读字段：HasValue和Value。HasValue是一个布尔值，当有值存储时它为真，当变量值为null时HasValue为假。当HavValue为真是时，可以取得变量的值；为假时，当尝试取得变量的值时会抛出一个异常。<br id="n2w911"><br id="n2w912">现在null是C#的一个关键字,它可以被赋给一个Nullable型变量。下面是对Nullable型变量赋值的两种有效方式。<br id="n2w913"><br id="n2w914">double? myDouble = 3.14159;<br id="n2w915"><br id="n2w916">double? myOtherDouble = null;<br id="n2w917"><br id="n2w918">可以看到，myDouble被赋给一个值，它也可以被赋以null。在第二个语句中，myOtherDouble被初始化为null——在一个非Nullable型变量中这样做会产生异常。<br id="n2w919"><br id="n2w920"> 使用nullable类型<br id="n2w921">    一个Nullable型变量可以像一般值类型那样使用。在编译过程中Nullable型变量和非Nullable型变量会进行隐式田转换。就是说我们可以把一个标准整型赋给一个整型Nullable变量，反之亦然。参考下面示例代码：<br id="n2w922"><br id="n2w923">int? nFirst = null;<br id="n2w924">int  Second = 2; <br id="n2w925"><br id="n2w926">nFirst = Second;    // 可以<br id="n2w927">nFirst = 123;       // 可以<br id="n2w928">Second = nFirst;    //也可以，因为此时nFirst==123 <br id="n2w929"><br id="n2w930">nFirst = null;      // 可以<br id="n2w931">Second = nFirst;    // 抛出异常, Second 是一个非nullable型变量。<br id="n2w932"><br id="n2w933">    可以看到，只要一个Nullable型变量的值不是null,它就可以和一个非Nullable型变量交换变量的值。如果包含null值，<br id="n2w934">就会抛出异常。为避免异常发生，可以利用Nullable型变量的HasValue属性。<br id="n2w935"><br id="n2w936"> if (nFirst.HasValue) Second = nFirst;<br id="n2w937"><br id="n2w938">如上所示，如果nFirst 含有一个值，这个赋值语句就会运行；否则，就会跳过。 <br id="n2w939"><br id="n2w940">在Nullable值中使用操作符：Lifed Operators【1】<br id="n2w941">    两个相同类型的Nullable型和非Nullable型变量除了可以相互自动转化之外，还可以通过操作符在它们中进行操作。参考下面代码：<br id="n2w942"><br id="n2w943">int ValA = 10;<br id="n2w944">int? ValB = 3;<br id="n2w945"><br id="n2w946">int? ValC = ValA * ValB;  //ValC==30 <br id="n2w947"><br id="n2w948">int ValA = 10;<br id="n2w949">int? ValB = null;<br id="n2w950"><br id="n2w951">int? ValC = ValA * ValB;  //ValC==null <br id="n2w952"><br id="n2w953">int ValA = 10;<br id="n2w954">int? ValB = null;<br id="n2w955"><br id="n2w956">int? ValC = ValA + ValB;  //ValC仍然是null;<br id="n2w957">    可以看到，两个操作数只要有任何一个是null，得到的结果也一定是null，不管是加减还是乘除。当然，如果操作数不是null ，则结果还是按原来操作符运算得到的结果。<br id="n2w958">在上面的代码中，如果ValC不是Nullable类型，情况会怎么样呢？如以下代码：<br id="n2w959"><br id="n2w960">int ValA = 10;<br id="n2w961">int? ValB = 3;<br id="n2w962"><br id="n2w963">int ValC = ValA * ValB;    // ValC 不是Nullable类型<br id="n2w964"><br id="n2w965">上面这段代码会抛出一个异常。ValA * ValB的结果是null，它不能被赋给一个非Nullable变量ValC。因为，会产生异常。<br id="n2w966"><br id="n2w967"> 关系运算<br id="n2w968">    两个都是null值的Nullable变量被认为是相等的，而一个值为null的变量和其它任何非null值的变量都是不相等的。如下面示例代码：<br id="n2w969"><br id="n2w970">int abc = 123;<br id="n2w971">int xyz = 890;<br id="n2w972"><br id="n2w973">int? def = null;<br id="n2w974">int? uvw = 123;<br id="n2w975"><br id="n2w976">Comparison     Result<br id="n2w977">abc == xyz     // false<br id="n2w978">abc == def     // false<br id="n2w979">def == null    // true<br id="n2w980"><br id="n2w981">abc == uvw     // true<br id="n2w982">uvw == null    // false<br id="n2w983">uvw != null    // true<br id="n2w984"><br id="n2w985">在其它关系运算中，如果其中一个或两个操作数为null，则结果一定是false。如下面示例代码（仍然使用上面定义的变量）：<br id="n2w986"><br id="n2w987"> Comparison    Result<br id="n2w988"><br id="n2w989">abc > uvw     // false, they are equal<br id="n2w990">abc < def     // false, def is null<br id="n2w991">uvw < def     // false, because def is null<br id="n2w992">def > null    // false, because right side is null<br id="n2w993">uvw > null    // false, because right side is null<br id="n2w994"><br id="n2w995">移除空值<br id="n2w996">     C#2.0同时也提供一个新操作符’??’用来合并空值。其语法格式如下：<br id="n2w997">returnValue = first ?? second;<br id="n2w998">在这个语句中，如果first为非null，则first的值会被赋给returnValue；如果first为null，则second会被赋给returnValue。<br id="n2w999"><br id="n2w9100">注：returnValue可以是Nullable类型也可以是非Nullable类型。 <br id="n2w9101"><br id="n2w9102">如果要将一个Nullable变量的值赋给一个非Nullable变量，可以用下面方法：<br id="n2w9103">int? ValA= 123;<br id="n2w9104">int? ValB = null;<br id="n2w9105"><br id="n2w9106">int NewVarA = ValA ?? -1;<br id="n2w9107">int NewVarB = ValB ?? -1;<br id="n2w9108">      上面这段代码运行完以后，NewVarA的值为123，因为ValA的值不是null。而NewVarB值变为 -1，因为ValB为null。这就允许我们利用一个null值将一个变量转变成一个默认值。在上面的代码中，这个默认值为 -1。<br id="xeus"><br id="xeus0">原文:http://nic.cnblogs.com/archive/2005/08/25/222277.html<br id="xeus1"><br id="xeus2"><img src ="http://www.cnblogs.com/yoshow/aggbug/1238089.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43602/" target="_blank">[新闻]Mozilla即将结束对FireFox 2的支持</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>让普通项目支持 Workflow Designer</title><link>http://www.cnblogs.com/yoshow/archive/2008/06/29/1231990.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Sun, 29 Jun 2008 05:49:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/06/29/1231990.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1231990.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/06/29/1231990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1231990.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1231990.html</trackback:ping><description><![CDATA[在普通的工程(比如Console项目)中添加WorkflowActivity类以后.<br id="jawx"><br id="jawx0">无法显示workflow designer的信息.<br id="ebut"><br id="ebut0">提示以下信息<br id="ebut1"><br id="vlj_">必须安装“System.Workflow.ComponentModel.Design.IIdentifierCreationService”服务，才能成功执行此操作。请确保此服务可用。<br id="m6t9"><br id="vlj_0">解决方法.<br id="vlj_1"><br id="m6t90">修改 .csproj 文件 添加加粗的文字到相关位置:<br id="m6t92">    <AssemblyName>ASEEMBLY_NAME_HERE__TYPICALLY _SAME_AS_PROJECT_FILE</AssemblyName><br id="m6t93"><b id="m6t94">    <ProjectTypeGuids>{14822709-B5A1-4724-98CA-57A101D1B079};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids></b><br id="m6t95"></PropertyGroup><br id="m6t96"><b id="m6t97"><Import Project="$(MSBuildExtensionsPath)MicrosoftWindows Workflow Foundationv3.0Workflow.Targets" /></b><br id="m6t98"><br id="m6t99"><img src ="http://www.cnblogs.com/yoshow/aggbug/1231990.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43601/" target="_blank">[新闻]IBM"走鹃"险胜"Cray Jaguar" 连任世界最快超级计算机</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>MOSS界面设计</title><link>http://www.cnblogs.com/yoshow/archive/2008/05/28/1209557.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Wed, 28 May 2008 15:34:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/05/28/1209557.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1209557.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/05/28/1209557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1209557.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1209557.html</trackback:ping><description><![CDATA[ MOSS界面设计<br id="bh3c2"><br id="bh3c3"><b id="te9l0">Microsoft Office SharePoint Server 2007的文件目录结构</b><br id="te9l1"><br id="bh3c4">安装了MOSS2007后，所有与SharePoint相关的文件都放在本地目录 <b id="ruf70">C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12</b> 下面。<br id="bh3c5"><br id="bh3c6">下面介绍一些主要的文件目录。<br id="bh3c7"><br id="bh3c8">1、 ISAPI目录<br id="bh3c9">此目录下面存放的是SharePoint自带的Web Services，我们也可以自定义Web Services封装在SharePoint里面。自定义Web Services方法见：<br id="gqu_0">Writing Custom Web Services for SharePoint Products and Technologies (<a title="http://msdn.microsoft.com/en-us/library/ms916810.aspx" href="http://msdn.microsoft.com/en-us/library/ms916810.aspx" id="fumh">http://msdn.microsoft.com/en-us/library/ms916810.aspx</a> )。<br id="bh3c10"><br id="bh3c11">2、 Resources目录<br id="bh3c12">SharePoint 有两个资源文件夹，目录分别为C:Program FilesCommon FilesMicrosoftSharedweb server extensions12CONFIGResources和C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12Resources，本地化工作主要是编写Resourses里的文件，网站如果显示的一些标题或描述不符合我们的要求，那么可以通过修改资源文件里的<br id="bh3c13"><Data Name="修改元素"><br id="bh3c14"><Value>网站显示的内容</Value><br id="bh3c15"></Data><br id="bh3c16">要引用资源文件里面的内容，一般通过$Resources:开头。<br id="bh3c17">例如：<%$Resources:sps,LayoutPageZone_TopZone%><br id="bh3c18">其中：sps表示资源文件名，与sps.zh-CN.resx相对应。LayoutPageZone_TopZone表示sps.zh-CN.resx文件中的<br id="bh3c19"><Data Name="LayoutPageZone_TopZone"><br id="bh3c20"><Value>顶部区域</Value><br id="bh3c21"></Data><br id="bh3c22">节点。<br id="bh3c23">注：一般不推荐修改所有C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12目录下的文件，因为这样将给版本升级带来问题。要加入我们自定义的内容通过增加文件到相应的目录下即可。比如这里我们可以增加一个资源文件，把我们要修改的元素放在里面。<br id="bh3c24"><br id="bh3c25">3、 TEMPLATE目录<br id="bh3c26">这是一个最主要的目录。子目录介绍如下：<br id="hzaz0"><br id="hzaz1">（1）、SiteTemplates目录<br id="bh3c28">放置各种网站定义模板。每个网站定义模板都会有一个ONET.XML文件，它位于 C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions12TEMPLATESiteTemplatesSite_Definition_NameXML folder<br id="bh3c29">ONET.XML有五个节：<br id="bh3c30">  1、NavBars：指定主页的顶部导航和左部导航<br id="g61o0">  2、ListTemplates：指定该站点可创建的各种列表（自定义列表、文档库、图片库等）<br id="g61o1">  3、DocumentTemplates：指定在创建文档库时可以创建的文档模板（Microsoft Office Word 文档、Microsoft Office FrontPage 网页、Microsoft Office Excel 电子表格等）<br id="g61o2">  4、Configurations：指定站点在创建时默认生成的各种列表和模块<br id="g61o3">  5、Modules：指定站点中默认包含的Web部件库  <br id="bh3c35">(*)注意：修改ONET.XML后需要重新启动IIS，才可生效<br id="bh3c36"><br id="bh3c37"><b id="oz6r0">实例：基于已有模板创建站点模板。<br id="bh3c38"></b><br id="oz6r1">步骤：<br id="bh3c39">1、打开C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATESiteTemplates目录<br id="bh3c40">2、复制粘贴一个SPS文件夹，改名为GASSPS<br id="bh3c41">3、找到C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATE2052XML目录<br id="bh3c42">4、在目录中创建一个名为WEBTEMPGASSPS.XML的文件，把下列XML粘贴到文件中<br id="bh3c43"><?xml version="1.0" encoding="utf-8"?><br id="bh3c44"><!-- _lcid="2052" _version="12.0.4518" _dal="1" --><br id="bh3c45"><!-- _LocalBinding --><br id="bh3c46"><Templates xmlns:ows="Microsoft SharePoint"><br id="bh3c47"><Template Name="GASSPS" ID="10001"><br id="bh3c48">   <Configuration ID="0" Title="浙江天然气模板" Hidden="FALSE" ImageUrl=""<br id="bh3c49">       Description="此模板用于初始化浙江天然气网站。" ><br id="bh3c50">   </Configuration><br id="bh3c51"></Template><br id="bh3c52"></Templates><br id="bh3c53">5、重启IIS(iisreset)<br id="bh3c54">6、打开创建站点页面，在“选择模板”节中多了一个“自定义”选项，下面就有我们刚添加的“浙江天然气模板”。<br id="bh3c55"><br id="bh3c56">（2）、THEMES目录<br id="bh3c57">放置各种网站主题。<br id="bh3c58"><br id="bh3c59"><b id="oz6r2">实例：创建自定义的主题<br id="bh3c60"></b>步骤：<br id="bh3c61">1、先找到 Theme 文件夹位置 C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATETHEMES<br id="bh3c62">2、复制一个 Theme 的文件夹如 CLASSIC 更改成自己要的名字如 GASTHEME<br id="bh3c63">3、在文件夹中，将CLASSIC.INF 改成与自己文件夹相同的名字如 GASTHEME.INF<br id="bh3c64">4、打开 GASTHEME.INF 将 title 改成与自己文件夹和文件名相同的名字如GASTHEME<br id="bh3c65">5、找到 C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATELAYOUTS2052SPTHEMES.XML 文件，复制并粘贴一个<Templates>元素，修改里面的内容如下：<br id="bh3c66"><Templates><br id="bh3c67">             <TemplateID>GASTHEME</TemplateID><br id="bh3c68">              <DisplayName>天然气主题</DisplayName><br id="bh3c69">              <Description>天然气主题将被应用</Description><br id="bh3c70">              <Thumbnail>images/thwheat.gif</Thumbnail><br id="bh3c71">              <Preview>images/thwheat.gif</Preview><br id="bh3c72"></Templates><br id="vlb30"><br id="bh3c73">上面两个图片是参考Wheat主题的图片，也可以改成自己的图片，图片存放位置 C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATEIMAGES文件夹下<br id="bh3c74">6、打开“网站设置”中“网站主题”，就可以找到我们刚刚添加的GASTHEME主題了。<br id="bh3c75"><br id="bh3c76">（3）、LAYOUTS目录<br id="bh3c77">网站所有的页面功能（网址后面有 _layouts的页面）都集中于此目录下面（除了模板中的Default.aspx以及某类型List相关页面）。可以添加自己的功能页面，方法：<br id="bh3c78"><br id="bh3c79">（4）、ADMIN目录<br id="bh3c80">管理中心的页面功能集中此目录下面。<br id="bh3c81"><br id="bh3c82">（5）、CONTROLTEMPLATES目录<br id="bh3c83">放置各种服务器控件。<br id="bh3c84"><br id="bh3c85">（6）、IMAGES目录<br id="bh3c86">放置网站用到的主要图片，如网站Logo等。<br id="bh3c87"><br id="bh3c88">（7）、FEATURES目录<br id="bh3c89">放置各种Feature，在MOSS 2007中feature功能之强大超乎想象，可以说对一个已有的网站功能性的增强最后多数都要通过feature来实现。包括母版页、内容页以及文档库等都是通过Feature来实现的。<br id="bh3c90"><br id="bh3c91"><b id="y9g20">实例1：使用Feature自定义母版页</b><br id="bh3c92">步骤：<br id="bh3c93">1、打开Feature目录C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATEFEATURES<br id="bh3c94">2、新建一个GASMASTERPAGES文件夹<br id="bh3c95">3、在GASMASTERPAGES文件夹下，新建Feature.xml文件，将下列内容粘贴到文件中<br id="bh3c96"><!-- _lcid="1033" _version="12.0.4518" _dal="1" --><br id="bh3c97"><!-- _LocalBinding --><br id="bh3c98"><Feature Id="cbdddc58-c0e1-4d64-99bc-071379a910f3"<br id="bh3c99">          Title="Gas Master"<br id="bh3c100">          Description=""<br id="bh3c101">          Version="12.0.0.0"<br id="bh3c102">          Scope="Site"<br id="bh3c103">          Hidden="False"<br id="bh3c104">          DefaultResourceFile="core"<br id="bh3c105">          xmlns="http://schemas.microsoft.com/sharepoint/"><br id="bh3c106">   <ElementManifests><br id="bh3c107">        <ElementManifest Location="ProvisionedFiles.xml"/><br id="bh3c108">   </ElementManifests><br id="bh3c109"></Feature><br id="bh3c110">在这个XML文件中，以下关于Featrue的metadata 包含在Featrue 元素中。（更详细的信息请参阅Feature.xml Files <a title="http://msdn.microsoft.com/en-us/library/ms475601.aspx" href="http://msdn.microsoft.com/en-us/library/ms475601.aspx" id="csgw">http://msdn.microsoft.com/en-us/library/ms475601.aspx</a> ）<br id="bh3c111">ID: 一个GUID，用于唯一标识这个Feature,可以通过VS生成<br id="bh3c112">Title：Feature 的名字，可以在网站内关于Site Featrues的页面中看到。<br id="bh3c113">Description:对description的描述。<br id="bh3c114">Version:Feature的版本；<br id="bh3c115">Scope:其值可以是Web或Site,它指明了这个Feature是应用于整个的Site Collection还是仅仅用于单独的一个子站点。<br id="bh3c116">Hidden:值可以是True或False.该设置指定了这个Feature是否在Site Feature页面上显示。<br id="bh3c117">DefaultResourceFile: 资源文件名字，Feature依赖它提供其它附加的配置信息。<br id="bh3c118">Feature.xml文件中的<ElementManifests>元素，这个元素包含了另一个XML文件的位置，而这个文件包含的<Elemnets>的内容是Feature要实现的。<br id="bh3c119"><ElementManifest>元素指明了要使用一个名为ProvisionedFiles.xml的文件，以下是该文件的<Elements>元素内容。<br id="dohp0"><br id="bh3c120">4、在GASMASTERPAGES文件夹下，新建ProvisionedFiles.xml文件，将下列内容粘贴到文件中<br id="bh3c121"><!-- _lcid="1033" _version="12.0.4518" _dal="1" --><br id="bh3c122"><!-- _LocalBinding --><br id="bh3c123"><Elements xmlns="http://schemas.microsoft.com/sharepoint/"><br id="bh3c124">    <Module Name="OSGMasterPages" Url="_catalogs/masterpage" Path="MasterPages" RootWebOnly="TRUE"><br id="bh3c125">        <File Url="Gasmaster.master" Type="GhostableInLibrary"><br id="bh3c126">           <Property Name="ContentType" Value="" /><br id="bh3c127">           <Property Name="PublishingPreviewImage" Value="~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/Gas.png, ~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/Gas.png" /><br id="bh3c128">           <Property Name="MasterPageDescription" Value="" /><br id="bh3c129">      </File><br id="bh3c130"> </Module><br id="bh3c131"> <Module Name="PublishingLayoutsPreviewImages" Url="_catalogs/masterpage" IncludeFolders="??-??" Path="" RootWebOnly="TRUE"><br id="bh3c132">       <File Url="Gas.png" Name="Preview Images/Gas.png" Type="GhostableInLibrary"><br id="bh3c133">       </File><br id="bh3c134">    </Module><br id="bh3c135"></Elements><br id="bh3c136">5、新建MasterPages和zh-cn文件夹，在MasterPages文件夹中新建Gasmaster.master文件，在zh-cn文件夹中放入一张模板页的图片Gas.png<br id="bh3c137">6、重启IIS(iisreset)<br id="bh3c138">7、在SharePoint服务器上运行CMD.exe，<br id="bh3c139">输入命令切换目录：cd C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12BIN<br id="bh3c140">安装Feature输入命令：stsadm -o installfeature -filename GASMASTERPAGES<br id="bh3c141">激活Feature输入命令：stsadm -o activatefeature -filename GASMASTERPAGESfeature.xml -url http://portal:8000<br id="bh3c142">8、打开“网站设置”中“母版页”，就可以看到我们刚刚添加的Gasmaster.master母版。<br id="bh3c143">参考连接：Create a Feature: Add Custom Master Pages to your Site Collections <font id="lq0g0" color="#666666"><a title="http://www.heathersolomon.com/blog/articles/servermstpageforsitecollect_feature.aspx" href="http://www.heathersolomon.com/blog/articles/servermstpageforsitecollect_feature.aspx" id="u9is">http://www.heathersolomon.com/blog/articles/servermstpageforsitecollect_feature.aspx</a> </font><br id="bh3c144"><br id="bh3c145"><b id="u4o_0">实例2：使用Feature定义站点中的菜单项</b><br id="bh3c146">包括其中第一个CustomAction在“网站设置”页面中的“外观”标题下创建了一个自定义链接.第二个CustomAction在页面的“网站操作” 菜单下增加了一个用户自定义菜单项.第三个CustomAction在文档库的“新建”下拉菜单下创建了一个自定义菜单项.第四个 CustomAction在文档库的“操作”下拉菜单下创建了一个自定义菜单项。<br id="bh3c147">步骤：<br id="bh3c148">1、创建一个Feature.xml文件<br id="bh3c149">在Features目录下创建一个目录例如MyMenu,在其中创建一个Feature.xml文件,文件内容如下:<br id="bh3c150"><?xml version="1.0" encoding="utf-8" ?><br id="bh3c151"><!-- _lcid="1033" _version="12.0.4017" _dal="1" --><br id="bh3c152"><!-- _LocalBinding --><br id="bh3c153"><Feature Id="6098EC11-8128-409A-8D2C-414E93F67DD4" <br id="bh3c154">            Title="$Resources:GasMenu,MenuTitle;" <br id="bh3c155">            Description="$Resources:GasMenu,MenuDescription;" <br id="bh3c156">            Version="12.0.0.0" <br id="bh3c157">            Scope="Web" <br id="bh3c158">           Hidden="FALSE" <br id="bh3c159">           DefaultResourceFile="customDocumentLibrary" <br id="bh3c160">            xmlns="http://schemas.microsoft.com/sharepoint/"><br id="bh3c161">            <ElementManifests><br id="bh3c162">                <ElementManifest Location="LightUp.xml" /> <br id="bh3c163">            </ElementManifests><br id="bh3c164"></Feature><br id="bh3c165">2、在C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12Resources文件夹中新建GasMenu.zh-CN.resx文件，输入以下内容<br id="bh3c166"><?xml version="1.0" encoding="utf-8"?><br id="bh3c167"><!-- _lcid="2052" _version="12.0.4518.1016" _dal="1" --><br id="bh3c168"><!-- _LocalBinding --><br id="bh3c169"><root><br id="bh3c170"><Data Name="MenuTitle"><br id="bh3c171"><Value>天然气菜单项</Value><br id="bh3c172"></Data><br id="bh3c173"><Data Name="MenuDescription"><br id="bh3c174">< Value>添加了四个菜单项，分别为在“网站设置”页面中的“外观”标题下创建了一个自定义链接、在页面的“网站操作”菜单下增加了一个用户自定义菜单项、在文档库的“新建”下拉菜单下创建了一个自定义菜单项和在文档库的“操作”下拉菜单下创建了一个自定义菜单项。</Value><br id="bh3c175"></Data><br id="bh3c176"></root><br id="bh3c177">3、创建Feature的描述文件LightUp.xml<br id="bh3c178">文档的内容如下:<br id="bh3c179"><?xml version="1.0" encoding="utf-8" ?><br id="bh3c180"><Elements xmlns="http://schemas.microsoft.com/sharepoint/"><br id="bh3c181"><!-- create command link site setting page --><br id="bh3c182"><CustomAction Id="SiteSettings" GroupId="Customization" <br id="bh3c183">                Location="Microsoft.SharePoint.SiteSettings"<br id="bh3c184">                            Sequence="106"<br id="bh3c185">                            Title="Custom Site Setting Command"><br id="bh3c186">                            <UrlAction Url=""/><br id="bh3c187">     </CustomAction><br id="bh3c188">     <!-- Add command to site action dropdow --><br id="bh3c189">        <CustomAction Id="SiteActionsToolbar"<br id="bh3c190">                       GroupId="SiteActions"<br id="bh3c191">                                   Location="Microsoft.SharePoint.StandardMenu"<br id="bh3c192">                                   Sequence="1000"<br id="bh3c193">                                   Title="Custom Action"<br id="bh3c194">                                   Description="custom site action"<br id="bh3c195">                                   ImageUrl="/_layouts/images/ACG16.GIF"><br id="bh3c196">                                   <UrlAction Url=""/><br id="bh3c197">    </CustomAction><br id="bh3c198">       <!-- Document Library Toolbar New Menu DropDown --><br id="bh3c199">       <CustomAction Id="DocLibNewToolbar"<br id="bh3c200">               RegistrationType="List"<br id="bh3c201">                     RegistrationId="101"<br id="bh3c202">                     GroupId="NewMenu"<br id="bh3c203">                     Rights="ManagePermissions"<br id="bh3c204">                     Location="Microsoft.SharePoint.StandardMenu"<br id="bh3c205">                     Sequence="1000"<br id="bh3c206">                     Title="Custom New Command"<br id="bh3c207">                     Description="custom new command "<br id="bh3c208">                     ImageUrl="/_layouts/images/ACG16.GIF"><br id="bh3c209">                     <UrlAction Url=""/><br id="bh3c210">    </CustomAction><br id="bh3c211">       <!-- Document library Toolbar Actions Menu Dropdown --><br id="bh3c212">       <CustomAction Id="DocLibActionsToolbar"<br id="bh3c213">               RegistrationType="List"<br id="bh3c214">                     RegistrationId="101"<br id="bh3c215">                     GroupId="ActionsMenu"<br id="bh3c216">                     Rights="ManagePermissions"<br id="bh3c217">                     Location="Microsoft.SharePoint.StandardMenu"<br id="bh3c218">                     Sequence="1000"<br id="bh3c219">                     Title="Command on Document Library"<br id="bh3c220">                     Description=" command on document library"<br id="bh3c221">                     ImageUrl="/_layouts/images/ACG16.GIF"><br id="bh3c222">                     <UrlAction Url=""/><br id="bh3c223">         </CustomAction><br id="bh3c224"></Elements><br id="bh3c225">4、重启IIS <b id="ke0y0">iisreset</b><br id="bh3c226">5、在SharePoint服务器上运行CMD.exe，<br id="bh3c227">输入命令切换目录：cd C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12BIN<br id="bh3c228">安装Feature输入命令：stsadm -o installfeature -filename MyMenu<br id="bh3c229">激活Feature输入命令：stsadm -o activatefeature -filename MyMenufeature.xml -url http://servername<br id="bh3c230">疑问：在Feature.xml中，虽然把编码方式改为encoding="GB2312"，但是使用汉字都不能识别出来，可是在LightUp.xml文件中虽然编方式为encoding="UTF-8",但是使用汉字都能识别出来，感觉很奇怪。<br id="bh3c232"><b id="ke0y1"><br id="bh3c233">实例3：使用Feature创建用户控件</b><br id="bh3c234">请看KaneBoy的 DelegateControl：SharePoint Server 2007内置的一个“用户控件包装器”<br id="bh3c235"><a title="http://blog.joycode.com/kaneboy/archive/2006/11/19/87192.aspx" href="http://blog.joycode.com/kaneboy/archive/2006/11/19/87192.aspx" id="t_ph">http://blog.joycode.com/kaneboy/archive/2006/11/19/87192.aspx</a> <br id="zbdp0"><br id="bh3c236"><b id="zbdp1">实例4：使用Feature创建自定义的文档库</b><br id="bh3c237">请看宋振乾的 如何在MOSS2007中创建一个定制的 Document Library Feature<br id="bh3c238"><a title="http://www.cnblogs.com/songzhenqian/archive/2006/07/06/443962.html" href="http://www.cnblogs.com/songzhenqian/archive/2006/07/06/443962.html" id="wem_">http://www.cnblogs.com/songzhenqian/archive/2006/07/06/443962.html</a> <br id="bh3c239"> <br id="bh3c240"><b id="ne2z0">Microsoft Office SharePoint Server 2007的母版页</b><br id="bh3c241"><br id="bh3c242">MOSS2007 中所有的页面都是由母版页（Master Pages）和内容页（Content Pages）组成, MOSS 2007中的Master Page和在ASP.net中使用的Master Page是一样的.它们定义了网站页面的基本布局. Page layout的概念类似于ASP.net 2.0中的Content Page,它指向一个Master Page并且实现Content Placeholders 的内容.下面是一篇介绍ASP.NET 2.0中母版页组成结构的很好的入门文章。<br id="bh3c243">Master Your Site Design with Visual Inheritance and Page Templates <a title="http://msdn.microsoft.com/en-us/magazine/cc163967.aspx" href="http://msdn.microsoft.com/en-us/magazine/cc163967.aspx" id="zc8o">http://msdn.microsoft.com/en-us/magazine/cc163967.aspx</a> <br id="bh3c244">母版页允许多级嵌套，所有在sharepoint中的站点默认都使用default.master这个母版页。这个文件位于<br id="bh3c245">C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATEGLOBAL这个目录下。default.master母版页是全局母版页，任何对该页面的修改将影响所有的sharepoint站点，而且会影响管理中心站点。<br id="bh3c246">sharepoint的母版页中定义了许多占位符（content placeholder）。这些占位符定义了页面的不同区域，开发人员可以定制占位符最<br id="bh3c247">显示给用户的内容。SharePoint中定义的占位符中多数并不允许用户重写其内容。多数的sharepoint页面都包括了 PlaceHolderMain这个占位符，它控制了页面的主要内容部分，典型情况下，该占位符将包括多个web部件区域，用来拖webpart进去。但对于开发人员来说，可以用来放置想要放的任何东西。<br id="bh3c248">下面列出了sharepoint的母版页中定义的所有占位符：（详细位置请对照default.master）<br id="bh3c249">1、<asp:ContentPlaceHolder ID="PlaceHolderGlobalNavigationSiteMap" runat="server" /><br id="bh3c250">放置连接到顶级站点的超连接<br id="bh3c251">2、<asp:ContentPlaceHolder ID="PlaceHolderGlobalNavigation" runat="server" /><br id="bh3c252">放置顶部一行内容。<br id="bh3c253">3、<asp:ContentPlaceHolder ID="PlaceHolderSiteName" runat="server" /><br id="bh3c254">放置站点名称<br id="bh3c255">4、<asp:ContentPlaceHolder ID="PlaceHolderSearchArea" runat="server" /><br id="bh3c256">放置搜索框<br id="bh3c257">5、<asp:ContentPlaceHolder ID="PlaceHolderHorizontalNav" runat="server" /><br id="bh3c258">放置水平导航栏<br id="bh3c259">6、<asp:ContentPlaceHolder ID="PlaceHolderTopNavBar" runat="server" /><br id="bh3c260">放置水平导航栏一行内容。<br id="bh3c261">7、<asp:ContentPlaceHolder ID="WSSDesignConsole" runat="server" /><br id="bh3c262">页面编辑控件，当页面进入编辑页面模式时使用(当我们点 Site Actions, Edit Page后)<br id="bh3c263">8、<asp:ContentPlaceHolder ID="SPNavigation" runat="server" /><br id="bh3c264">在 Windows SharePoint Services中默认为空，用于附加的页面编辑控件<br id="bh3c265">9、<asp:ContentPlaceHolder ID="PlaceHolderPageImage" runat="server" /><br id="bh3c266">左侧的图片<br id="bh3c267">10、<asp:ContentPlaceHolder ID="PlaceHolderTitleLeftBorder" runat="server" /><br id="bh3c268">Title区左侧边框<br id="bh3c269">11、<asp:ContentPlaceHolder ID="PlaceHolderTitleBreadcrumb" runat="server" /><br id="bh3c270">TitleBreadcrumb页面导航区<br id="bh3c271">12、<asp:ContentPlaceHolder ID="PlaceHolderPageTitleInTitleArea" runat="server" /><br id="bh3c272">Breadcrumb区下面的标题<br id="bh3c273">13、<asp:ContentPlaceHolder ID="PlaceHolderMiniConsole" runat="server" /><br id="bh3c274">一个放置页面级命令的地方，比如在WIKI站点里的Edit Page, History, Incoming Links<br id="bh3c275">14、<asp:ContentPlaceHolder ID="PlaceHolderTitleRightMargin" runat="server" /><br id="bh3c276">Title区右侧空白<br id="bh3c277">15、<asp:ContentPlaceHolder ID="PlaceHolderTitleAreaSeparator" runat="server" /><br id="bh3c278">TitleAreaSeparator区<br id="bh3c279">16、<asp:ContentPlaceHolder ID="PlaceHolderLeftNavBarDataSource" runat="server" /><br id="bh3c280">左侧导航区数据源<br id="bh3c281">17、<asp:ContentPlaceHolder ID="PlaceHolderCalendarNavigator" runat="server" /><br id="bh3c282">在页面中有日历时为其显示一个日期选择框<br id="bh3c283">18、<asp:ContentPlaceHolder ID="PlaceHolderLeftNavBarTop" runat="server" /><br id="bh3c284">左侧导航区上面的导航区<br id="bh3c285">19、<asp:ContentPlaceHolder ID="PlaceHolderLeftNavBar" runat="server" /><br id="bh3c286">左侧导航区<br id="bh3c287">20、<asp:ContentPlaceHolder ID="PlaceHolderLeftActions" runat="server" /><br id="bh3c288">左侧导航区下面的动作区<br id="bh3c289">21、<asp:ContentPlaceHolder ID="PlaceHolderNavSpacer" runat="server" /><br id="bh3c290">左侧导航区的宽度<br id="bh3c291">22、<asp:ContentPlaceHolder ID="PlaceHolderLeftNavBarBorder" runat="server" /><br id="bh3c292">左侧导航区的边框元素<br id="bh3c293">23、<asp:ContentPlaceHolder ID="PlaceHolderBodyLeftBorder" runat="server" /><br id="bh3c294">页面body的边框元素<br id="bh3c295">24、<asp:ContentPlaceHolder id="PlaceHolderPageDescription" runat="server" /><br id="bh3c296">页面描述区<br id="bh3c297">25、<asp:ContentPlaceHolder id="PlaceHolderMain" runat="server" /><br id="bh3c298">页面主体<br id="bh3c299">26、<asp:ContentPlaceHolder ID="PlaceHolderBodyRightMargin" runat="server" /><br id="bh3c300">页面body的右边空白<br id="bh3c301">27、<asp:ContentPlaceHolder ID="PlaceHolderFormDigest" runat="server"/><br id="bh3c302">这是页面中必备的 "form digest"安全组件。<br id="bh3c303">28、<asp:ContentPlaceHolder ID="PlaceHolderUtilityContent" runat="server" /><br id="bh3c304">页面底部需要的一块特殊内容<br id="bh3c305">29、<asp:ContentPlaceHolder ID="PlaceHolderBodyAreaClass" runat="server" /><br id="bh3c306">附加在页面顶部的body中的样式<br id="bh3c307">30、<asp:ContentPlaceHolder ID="PlaceHolderTitleAreaClass" runat="server" /><br id="bh3c308">TitleArea附加的样式<br id="bh3c309">31、<asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead" runat="server" /><br id="bh3c310">提供给内容页添加所有可以放在<head>区域的内容，如CSS、JS等。<br id="bh3c311"> <br id="bh3c312"><b id="o9jh0">Microsoft Office SharePoint Server 2007的CSS应用</b><br id="bh3c313"><br id="bh3c314">CSS在SharePoint页面中的应用顺序<br id="bh3c315">1、CORE.CSS<br id="bh3c316">2、  <br id="bh3c317"><a title="http://www.heathersolomon.com/blog/archive/2006/10/27/sp07cssoptions.aspx" href="http://www.heathersolomon.com/blog/archive/2006/10/27/sp07cssoptions.aspx" id="q9st">http://www.heathersolomon.com/blog/archive/2006/10/27/sp07cssoptions.aspx</a> <br id="bh3c318">对页面修改可以通过SharePoint Designer(简称SPD)打开整个站点进行修改，也可以使用其他一些文本编辑器直接对物理文件进行<br id="bh3c319">改。<br id="bh3c320">当我们打开一个Sharepoint页面时，Sharepoint将首先判断此页面（母版页和内容页）是否被破坏了结构（被SPD或其他工具修改过<br id="bh3c321">被修改了部分将保存在Sharepoint的数据库中），如果是就从数据库中找到该页面的将其显示出来，如果没有，则从Sharepoint服务<br id="bh3c322">的C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12目录中找到相应物理文件来显示页面，<br id="bh3c323"><br id="bh3c324">default.master及defaultlayout.aspx介绍<br id="bh3c325"> <br id="bh3c326">附：其他相关内容连接。<br id="bh3c327">创建一个精简的母版页 <a title="http://msdn.microsoft.com/en-us/library/aa660698.aspx" href="http://msdn.microsoft.com/en-us/library/aa660698.aspx" id="vl9s">http://msdn.microsoft.com/en-us/library/aa660698.aspx</a> <br id="bh3c328">关于MOSS 2007的Content Types <a title="http://www.cnblogs.com/songzhenqian/archive/2006/07/12/448853.html" href="http://www.cnblogs.com/songzhenqian/archive/2006/07/12/448853.html" id="qmd7">http://www.cnblogs.com/songzhenqian/archive/2006/07/12/448853.html</a> <br id="bh3c329">关于MOSS 2007 and WSS 3.0 Master Page <a title="http://www.cnblogs.com/songzhenqian/archive/2006/07/11/447745.html" href="http://www.cnblogs.com/songzhenqian/archive/2006/07/11/447745.html" id="s0ib">http://www.cnblogs.com/songzhenqian/archive/2006/07/11/447745.html</a> <br id="bh3c330">如何在MOSS 2007 中将一个Document Library 增加到站点定义中 <a title="http://www.cnblogs.com/songzhenqian/archive/2006/07/06/444387.html" href="http://www.cnblogs.com/songzhenqian/archive/2006/07/06/444387.html" id="o_d-">http://www.cnblogs.com/songzhenqian/archive/2006/07/06/444387.html</a> <br id="bh3c331">MOSS项目开发步骤 <a title="http://www.cnblogs.com/songzhenqian/archive/2006/10/22/536272.html" href="http://www.cnblogs.com/songzhenqian/archive/2006/10/22/536272.html" id="ijcb">http://www.cnblogs.com/songzhenqian/archive/2006/10/22/536272.html</a> <br id="bh3c332">站点定义和站点模板 <a title="http://www.cnblogs.com/wfconquer/archive/2006/12/08/585914.html" href="http://www.cnblogs.com/wfconquer/archive/2006/12/08/585914.html" id="n2mr">http://www.cnblogs.com/wfconquer/archive/2006/12/08/585914.html</a> <br id="bh3c333"><br id="lq0g1"><br id="u4o_1"><br id="zbdp2"><br id="zbdp3"><br id="rkp70"><br id="gkb70"><br id="wrll0"><br id="ht8i0"><br id="sqjf0"><br id="q0m70"><br id="tpi20"><br id="tpi21"><img src ="http://www.cnblogs.com/yoshow/aggbug/1209557.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43600/" target="_blank">[新闻]微软正式发布Exchange/SharePoint Online</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>MOSS Content Types 概述</title><link>http://www.cnblogs.com/yoshow/archive/2008/05/28/1209556.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Wed, 28 May 2008 15:33:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/05/28/1209556.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1209556.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/05/28/1209556.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1209556.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1209556.html</trackback:ping><description><![CDATA[            关于MOSS 2007的Content Types<br id="iqr60"><br id="uyus0"><b id="gkpb0">1.概述</b><br id="uyus1"><br id="uyus2">在WSS2.0中,一个List是由应用于List的每个列表项的一套所需字段定义的.拥有单一一套字段意味着每个列表项和它的位置紧密关联.在某个位置的所有列表项只能和那些为List或文档库所定义的列相关联.在WSS3.0中,List以content types的形式包含了多重的架构.Content Type提供了封装数据schema以及使之独立于在sharepoint 站点上的位置.Conent Type 帮助用户组织存储在SharePoint站点上的文档和其它资料.对于开发者,一个content type提供了一种定义和使用meatadata以使每个列表项目的类型彼此区分的方法.一个content type是一组meatadata和设置的集合,它们被应用到某一类的列表内容上.例如,一个称为Specifications的content type 可以包含这些列,比如Project ,Priority, Developer 和testLeader.一个称为contract的Content tye使用诸如Approver,Signed和Amount字段.即使有这些差别,specifications和contracts也可以在同一个List或文档库中列示出来.<br id="uyus3"><br id="uyus4">因为content type 独立于特定的List或文档库,一个content type可以在多个sharepoint 站点上的lists中使用.这样可以使存储在Site collection上的内容类型更集中的加以定义和管理.一个Content type可以通过定义类似workflow和自定义属性得到扩展.<br id="o3lg0"><br id="uyus5"><b id="gkpb1">2.File Formats:</b><br id="uyus6"><br id="uyus7">Content types独立于文件格式.在文档库中,可以为一个content type 指定一个文档模板.当用户创建这种类型的文档时,WSS会使用这个模板.用户仍可以上载一个基于不同模板的文档到文档库.<br id="uyus8"><br id="uyus9">例如,假定创建一个content type,它被应用于一个工程所需要的文档,.这个Project Content type可以应用于任何文件格式,包括含有工程规划信息的Word文档,含有工程预算的Excel文档,用于计划的Microsoft project 文档,以及存储工程队成员名称和角色的Sharepoint列表项.所有的这些文件和列表项都可以分配给Project content type.<br id="uyus10"><br id="o3lg1"><b id="gkpb2">3.Site and List Content Types</b><br id="uyus11"><br id="uyus12">在site level上创建的content type称为site content type.任何子站点可以继承一个content type.如果一个content tye是在site collection的根站点上创建的,那么其下的任何一个站点都可以继承这个content type.<br id="uyus13"><br id="uyus14">当一个content tye加入list后,WSS在list中存储这个content tye的一个本地拷贝.这个本地实例被称为一个list content type,它仅仅被应用于所拷贝到的那个列表.正因为如此一个list content type实例的改变可以不影响到site content type本身.<br id="uyus15"><br id="c2h20"><b id="llu_0">4.Creating Content Types Based on Other Content Types</b><br id="uyus16"><br id="uyus17">可以基于其它的content type 创建content types.利用这种关系,可以创建一个包含有其它不同的content type 属性的通用content type,然后再从这些通用的content type 继承产生更加具体的的content type.在site level下,可以创建基于其它site content type的 site content .在list level,可以创建基于其它site content type的list content.<br id="uyus18"><br id="uyus19">可以通过增,删,改列的方式编辑从另一个site content type继承的site content type的属性<br id="uyus20"><br id="uyus21">在WSS中base content type层次结构是与所创建的类型相对应的.当创建一个列表时,WSS就基于适当的base site content type的list content type.<br id="uyus22"> <br id="uyus23"><b id="w1tu0">5. Extending Content Types</b><br id="uyus24"><br id="uyus25">每个content type都有一个XML文件集合,第三方可以用来保存客户化的设置信息.开发者可以通过使用XML文件扩展content tye的定义和功能.在一个site content type 中包含的XML文件被拷贝到任何一个子类型中去.如果修改了一个XML文件然后执行下推操作,则在任何一个子content type中的整个XML文件将全部被覆盖.<br id="ecoh0"><br id="ecoh1">地址<br id="ecoh2">http://www.cnblogs.com/songzhenqian/archive/2006/07/12/448853.html<br id="uyus26"> <img src ="http://www.cnblogs.com/yoshow/aggbug/1209556.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43600/" target="_blank">[新闻]微软正式发布Exchange/SharePoint Online</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>XCOPY 命令格式</title><link>http://www.cnblogs.com/yoshow/archive/2008/05/19/1202346.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Mon, 19 May 2008 01:43:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/05/19/1202346.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1202346.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/05/19/1202346.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1202346.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1202346.html</trackback:ping><description><![CDATA[XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]<br id="vzmc0">　　　　　　　　　　　　　 [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]<br id="vzmc1">　　　　　　　　　　　　　 [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]<br id="vzmc2">　　　　　　　　　　　　　 [/EXCLUDE:file1[+file2][+file3]...]<br id="vzmc3"><br id="vzmc4">　source　　　 指定要复制的文件。<br id="vzmc5">　destination　指定新文件的位置和/或名称。<br id="vzmc6">　/A　　　　　 只复制有存档属性集的文件，但不改变属性。<br id="vzmc7">　/M　　　　　 只复制有存档属性集的文件，并关闭存档属性。<br id="vzmc8">　/D:m-d-y　　 复制在指定日期或指定日期以后改变的文件。<br id="vzmc9">　　　　　　　 如果没有提供日期，只复制那些源时间比目标时间新的文件。<br id="vzmc10">　/EXCLUDE:file1[+file2][+file3]...<br id="vzmc11">　　　　　　　 指定含有字符串的文件列表。如果有任何字符串与要被复制的文件<br id="vzmc12">　　　　　　　 的绝对路径相符，那个文件将不会得到复制。<br id="vzmc13">　　　　　　　 例如，指定如 obj 或 .obj 的字符串会排除目录 obj 下面的<br id="vzmc14">　　　　　　　 所有文件或带有 .obj 扩展名的文件。<br id="vzmc15">　/P　　　　　 创建每个目标文件前提示。<br id="vzmc16">　/S　　　　　 复制目录和子目录，除了空的。<br id="vzmc17">　/E　　　　　 复制目录和子目录，包括空的。与 /S /E 相同。可以用来修改 /T。<br id="vzmc18">　/V　　　　　 验证每个新文件的大小。<br id="vzmc19">　/W　　　　　 提示您在复制前按键。<br id="vzmc20">　/C　　　　　 即使有错误，也继续复制。<br id="vzmc21">　/I　　　　　 如果目标不存在，又在复制一个以上的文件，则假定目标一定是一<br id="vzmc22">　　　　　　　 个目录。<br id="vzmc23">　/Q　　　　　 复制时不显示文件名。<br id="vzmc24">　/F　　　　　 复制时显示完整的源和目标文件名。<br id="vzmc25">　/L　　　　　 显示要复制的文件。<br id="vzmc26">　/G　　　　　 允许将没有经过加密的文件复制到不支持加密的目标。<br id="vzmc27">　/H　　　　　 也复制隐藏和系统文件。<br id="vzmc28">　/R　　　　　 覆盖只读文件。<br id="vzmc29">　/T　　　　　 创建目录结构，但不复制文件。不包括空目录或子目录。/T /E 包<br id="vzmc30">　　　　　　　 括空目录和子目录。<br id="vzmc31">　/U　　　　　 只复制已经存在于目标中的文件。<br id="vzmc32">　/K　　　　　 复制属性。一般的 Xcopy 会重设只读属性。<br id="vzmc33">　/N　　　　　 用生成的短名复制。<br id="vzmc34">　/O　　　　　 复制文件所有权和 ACL 信息。<br id="vzmc35">　/X　　　　　 复制文件审核设置(隐含 /O)。<br id="vzmc36">　/Y　　　　　 禁止提示以确认覆盖一个现存目标文件。<br id="vzmc37">　/-Y　　　　　导致提示以确认覆盖一个现存目标文件。<br id="vzmc38">　/Z　　　　　 用重新启动模式复制网络文件。<br id="vzmc39"><br id="vzmc40">命令行开关 /Y 可以预先在 COPYCMD 环境变量中设置。这可能被命令行上的 /-Y<br id="vzmc41">覆盖。<br id="vzmc42"><br id="vzmc43">=========================================<br id="vzmc44"><br id="vzmc45">Xcopy<br id="vzmc46">复制文件和目录，包括子目录。<br id="vzmc47"><br id="vzmc48">语法<br id="vzmc49">xcopySource [Destination] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d[:MM-DD-YYYY]] [/u] [/i] [/s [/e]] [/t] [/k] [/r] [/h] [{/a | /m}] [/n] [/o] [/x] [/exclude:FileName1[+[FileName2]][+[FileName3]] [{/y | /-y}] [/z]<br id="vzmc50"><br id="vzmc51">参数<br id="vzmc52">Source<br id="vzmc53"><br id="vzmc54">必需。指定要复制的文件的位置和名称。该参数必须包含驱动器或路径。<br id="vzmc55"><br id="vzmc56">Destination<br id="vzmc57"><br id="vzmc58">指定要复制的文件的目标。该参数可以包含驱动器号和冒号、目录名、文件名或者它们的组合。<br id="vzmc59"><br id="vzmc60">/w<br id="vzmc61"><br id="vzmc62">在开始复制文件之前将显示以下消息并等待您的响应：<br id="vzmc63"><br id="vzmc64">Press any key to begin copying file(s) <br id="vzmc65"><br id="vzmc66">/p<br id="vzmc67"><br id="vzmc68">提示您确认是否要创建每个目标文件。<br id="vzmc69"><br id="vzmc70">/c<br id="vzmc71"><br id="vzmc72">忽略错误。<br id="vzmc73"><br id="vzmc74">/v <br id="vzmc75"><br id="vzmc76">在写入目标文件时验证每个文件，以确保目标文件与源文件完全相同。<br id="vzmc77"><br id="vzmc78">/q<br id="vzmc79"><br id="vzmc80">禁止显示"xcopy"的消息。<br id="vzmc81"><br id="vzmc82">/f<br id="vzmc83"><br id="vzmc84">复制时显示源文件名和目标文件名。<br id="vzmc85"><br id="vzmc86">/l<br id="vzmc87"><br id="vzmc88">显示要复制的文件列表。<br id="vzmc89"><br id="vzmc90">/g<br id="vzmc91"><br id="vzmc92">创建已解密的目标文件。<br id="vzmc93"><br id="vzmc94">/d [:MM-DD-YYYY] <br id="vzmc95"><br id="vzmc96">只复制那些在指定日期或指定日期之后更改过的源文件。如果不包括"MM-DD-YYYY"值，"xcopy"会复制比现有"Destination"文件新的所有"Source"文件。该命令行选项使您可以更新更改过的文件。<br id="vzmc97"><br id="vzmc98">/u<br id="vzmc99"><br id="vzmc100">只从"Source"复制"Destination"中已有的文件。<br id="vzmc101"><br id="vzmc102">/i<br id="vzmc103"><br id="vzmc104">如果"Source"是一个目录或包含通配符，而"Destination"不存在，"xcopy"会假定"destination"指定目录名并创建一个新目录。然后，"xcopy"会将所有指定文件复制到新目录中。默认情况下，"xcopy"将提示您指定"Destination"是文件还是目录。<br id="vzmc105"><br id="vzmc106">/s<br id="vzmc107"><br id="vzmc108">复制非空的目录和子目录。如果省略"/s"，则"xcopy"将在单个目录中工作。<br id="vzmc109"><br id="vzmc110">/e<br id="vzmc111"><br id="vzmc112">复制所有子目录，包括空目录。将"/e"与"/s"和"/t"命令行选项一起使用。<br id="vzmc113"><br id="vzmc114">/t<br id="vzmc115"><br id="vzmc116">只复制子目录结构（即目录树），不复制文件。要复制空目录，必须包含"/e"命令行选项。<br id="vzmc117"><br id="vzmc118">/k<br id="vzmc119"><br id="vzmc120">复制文件，如果源文件具有只读属性，则在目标文件中保留该属性。默认情况下，"xcopy"将删除只读属性。<br id="vzmc121"><br id="vzmc122">/r<br id="vzmc123"><br id="vzmc124">复制只读文件。<br id="vzmc125"><br id="vzmc126">/h<br id="vzmc127"><br id="vzmc128">复制具有隐藏和系统文件属性的文件。默认情况下，"xcopy"不复制隐藏或系统文件。<br id="vzmc129"><br id="vzmc130">/a<br id="vzmc131"><br id="vzmc132">只复制那些具有存档文件属性设置的源文件。"/a"不修改源文件的存档文件属性。有关如何通过使用"attrib"来设置存档文件属性的信息，请参阅"相关主题"。<br id="vzmc133"><br id="vzmc134">/m<br id="vzmc135"><br id="vzmc136">复制具有存档文件属性设置的源文件。与"/a"不同，"/m"关闭在源中指定的文件的存档文件属性。有关如何通过使用"attrib"来设置存档文件属性的信息，请参阅"相关主题"。<br id="vzmc137"><br id="vzmc138">/n<br id="vzmc139"><br id="vzmc140">使用 NTFS 短文件或目录名创建副本。将文件或目录从 NTFS 卷复制到 FAT 卷或者当目标文件系统需要 FAT 文件系统命名约定（即 8.3 字符）时，需要"/n"。目标文件系统可以是 FAT 或 NTFS。<br id="vzmc141"><br id="vzmc142">/o<br id="vzmc143"><br id="vzmc144">复制文件所有权与随机访问控制列表 (DACL) 信息。<br id="vzmc145"><br id="vzmc146">/x<br id="vzmc147"><br id="vzmc148">复制文件审核设置和系统访问控制列表 (SACL) 信息（包含"/o"）。<br id="vzmc149"><br id="vzmc150">/exclude:FileName1[+[ FileName2]][+[FileName3]] <br id="vzmc151"><br id="vzmc152">指定包含字符串的文件列表。<br id="vzmc153"><br id="vzmc154">/y<br id="vzmc155"><br id="vzmc156">禁止提示确认要覆盖已存在的目标文件。<br id="vzmc157"><br id="vzmc158">/-y<br id="vzmc159"><br id="vzmc160">提示您确认要覆盖已存在的目标文件。<br id="vzmc161"><br id="vzmc162">/z<br id="vzmc163"><br id="vzmc164">在可重启模式中通过网络复制。<br id="vzmc165"><br id="vzmc166">/?<br id="vzmc167"><br id="vzmc168">在命令提示符显示帮助。<br id="vzmc169"><br id="vzmc170">注释<br id="vzmc171"> 使用"/v"<br id="vzmc172"><br id="vzmc173">Windows XP 和 Windows Server 2003 家族产品不使用该命令。只为了与现有的 MS-DOS 文件保持兼容性才包含此命令，但是因为其功能是自动实现的，所以在命令行使用时不起作用。 <br id="vzmc174"><br id="vzmc175"> 使用"/exclude"<br id="vzmc176"><br id="vzmc177">在每个文件的单独一行中的列出每个字符串。如果列出的任何字符串与要复制的文件的绝对路径的任何部分匹配，就从复制进程排除该文件。例如，如果指定字符串 "Obj"，则会排除 Obj 目录下的所有文件。如果指定字符串 ".obj"，则排除具有 .obj 扩展名的所有文件。<br id="vzmc178"><br id="vzmc179"> 使用"/z"<br id="vzmc180"><br id="vzmc181">如果在复制过程中丢失连接（例如，如果用于连接的服务器脱机），复制过程将在重新建立连接后恢复。"/z"也显示每个文件完成的复制操作的百分比。<br id="vzmc182"><br id="vzmc183"> 在 COPYCMD 环境变量中使用"/y" <br id="vzmc184"><br id="vzmc185">可在 COPYCMD 环境变量中使用"/y"。在命令行上使用"/-y"可以覆盖该命令。默认情况下，会提示您覆盖，除非您从批处理脚本内运行"copy"。<br id="vzmc186"><br id="vzmc187"> 复制加密的文件 <br id="vzmc188"><br id="vzmc189">将加密文件复制到不支持 EFS 的卷会导致错误。应首先解密文件或将文件复制到支持 EFS 的卷中。<br id="vzmc190"><br id="vzmc191"> 追加文件 <br id="vzmc192"><br id="vzmc193">要追加文件，请指定单个目标文件，多个源文件（使用通配符或 file1+file2+file3 格式）。<br id="vzmc194"><br id="vzmc195"> "Destination"的默认值<br id="vzmc196"><br id="vzmc197">如果省略"Destination"，则"xcopy"命令将文件复制到当前目录。 <br id="vzmc198"><br id="vzmc199"> 指定"Destination"是文件还是目录 <br id="vzmc200"><br id="vzmc201">如果"Destination"不包含现有目录且不以反斜杠 () 结尾，会出现下列消息： <br id="vzmc202"><br id="vzmc203">Does destination specify a file name or directory name on the target (F = file, D = directory)?<br id="vzmc204">如果要将一个或多个文件复制到一个文件，请按 F。如果要将一个或多个文件复制到一个目录，请按 D。 <br id="vzmc205"><br id="vzmc206">使用"/i"命令行选项可禁止显示该消息，从而导致"xcopy"认定在源是多个文件或一个目录的情况下，目标是一个目录。<br id="vzmc207"><br id="vzmc208"> 使用"xcopy"命令设置"Destination"文件的存档属性 <br id="vzmc209"><br id="vzmc210">"xcopy"命令创建具有存档属性设置的文件，无论源文件中是否设定了此属性。有关文件属性和"attrib"的详细信息，请参阅"相关主题"。<br id="vzmc211"><br id="vzmc212"> 比较"xcopy"和"diskcopy"<br id="vzmc213"><br id="vzmc214">如果磁盘的子目录中包含文件，要将其复制到具有不同格式的磁盘中，请使用"xcopy"命令，而不要使用"diskcopy"。因为"diskcopy"命令是一个磁道接一个磁道地复制磁盘，所以需要源磁盘和目标磁盘的格式必须相同。"xcopy"命令没有这个要求。通常情况下请使用"xcopy"，除非您需要完整的磁盘映像副本。<br id="vzmc215"><br id="vzmc216"> "xcopy"的退出代码<br id="vzmc217"><br id="vzmc218">要处理"xcopy"返回的退出代码，请在批处理程序的"if"命令行上使用"ErrorLevel"参数。有关使用"if"处理退出码的批处理程序的示例，请参阅"相关主题"。下表列出每一个退出代码和描述。<br id="vzmc219"><br id="vzmc220"><br id="vzmc221">退出代码 描述 <br id="vzmc222">0<br id="vzmc223">文件复制没有错误。<br id="vzmc224"><br id="vzmc225">1<br id="vzmc226">没有找到要复制的文件。<br id="vzmc227"><br id="vzmc228">2<br id="vzmc229">用户按 Ctrl+C 终止了"xcopy"。<br id="vzmc230"><br id="vzmc231">4<br id="vzmc232">出现了初始化错误。没有足够的内存或磁盘空间，或命令行上输入了无效的驱动器名称或语法。<br id="vzmc233"><br id="vzmc234">5<br id="vzmc235">出现了磁盘写入错误。<br id="vzmc236"><br id="vzmc237"><br id="vzmc238"><br id="vzmc239">示例<br id="vzmc240">要从驱动器 A 将所有文件和子目录（包括所有空的子目录）复制到驱动器 B，请键入： <br id="vzmc241"><br id="vzmc242">xcopy a: b: /s /e <br id="vzmc243"><br id="vzmc244">要包含上一示例中的任何系统或隐藏文件，请按如下所示添加"/h"命令行选项：<br id="vzmc245"><br id="vzmc246">xcopy a: b: /s /e /h<br id="vzmc247"><br id="vzmc248">要使用 Rawdata 目录中 1993 年 12 月 29 日后更改的文件更新 Reports 目录中的文件，请键入： <br id="vzmc249"><br id="vzmc250">xcopy rawdata reports /d:12-29-1993<br id="vzmc251"><br id="vzmc252">要更新上例中 Reports 中存在的所有文件而不考虑日期，请键入：<br id="vzmc253"><br id="vzmc254">xcopy rawdata reports /u<br id="vzmc255"><br id="vzmc256">要获得前一个命令要复制的文件列表而不实际复制文件，请键入：<br id="vzmc257"><br id="vzmc258">xcopy rawdata reports /d:12-29-1993 /l > xcopy.out<br id="vzmc259"><br id="vzmc260">文件 Xcopy.out 列出了要复制的所有文件。<br id="vzmc261"><br id="vzmc262">要将 Customer 目录及其所有子目录复制到网络驱动器 H: 上的目录 \PublicAddress，保留只读属性，并在 H: 上创建新文件时对您做出提示，请键入：<br id="vzmc263"><br id="vzmc264">xcopy customer h:publicaddress /s /e /k /p<br id="vzmc265"><br id="vzmc266">要发出上一个命令，确保在 Address 目录不存在时"xcopy"会创建该目录，并禁止显示创建新目录时出现的消息，请按如下所示添加"/i"命令行选项：<br id="vzmc267"><br id="vzmc268">xcopy customer h:publicaddress /s /e /k /p /i<br id="vzmc269"><br id="vzmc270">可以创建批处理程序执行"xcopy"操作，并且使用"if"批处理命令在发生错误时处理退出代码。例如，以下的批处理程序使用了可替换的"xcopy"源和目标参数： <br id="vzmc271"><br id="vzmc272">@echo off rem COPYIT.BAT transfers all files in all subdirectories of rem the source drive or directory (%1) to the destinationrem drive or directory (%2)xcopy %1 %2 /s /eif errorlevel 4 goto lowmemory if errorlevel 2 goto abort if errorlevel 0 goto exit :lowmemory echo Insufficient memory to copy files or echo invalid drive or command-line syntax. goto exit:abort echo You pressed CTRL+C to end the copy operation. goto exit :exit <br id="vzmc273">要使用该批处理程序将 C:Prgmcode 目录及其子目录中的所有文件复制到驱动器 B 中，请键入： <br id="vzmc274"><br id="vzmc275">copyit c:prgmcode b:<br id="vzmc276"><br id="vzmc277">该命令解释程序将用"C:Prgmcode"替换"%1"，用"B:"替换"%2"，然后执行带"/e"和"/s"命令行选项的"xcopy"。如果 "xcopy"遇到错误，批处理程序将读取退出码并转到相应"IF ERRORLEVEL"语句中指示的标签，然后显示相应的消息并退出批处理程序。            <img src ="http://www.cnblogs.com/yoshow/aggbug/1202346.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43598/" target="_blank">[新闻]应用程序架构指导包2.0 Beta 2发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Google App Engine 入门指南</title><link>http://www.cnblogs.com/yoshow/archive/2008/05/11/1192172.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Sun, 11 May 2008 05:52:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/05/11/1192172.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1192172.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/05/11/1192172.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1192172.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1192172.html</trackback:ping><description><![CDATA[                        Google App Engine入门指南<br id="sdn70"><br id="sdn712">入门指南<br id="sdn713"><br id="sdn714">本教程描述了如何使用Google App Engine开发和部署一个简单的项目。<br id="sdn715">作为案例项目的“用户留言簿”演示如何使用各种App Engine服务，<br id="sdn716">这些服务包括数据存储和Google用户服务。<br id="sdn717"><br id="sdn718">本教程包括下列部分：<br id="sdn719">·介绍<br id="sdn720">·开发环境<br id="sdn721">·Hello, World!（译注：这个不用翻译吧）<br id="sdn722">·使用webapp框架<br id="sdn723">·使用用户服务<br id="sdn724">·使用webapp处理表单<br id="sdn725">·使用数据存储<br id="sdn726">·使用模板<br id="sdn727">·使用静态文件<br id="sdn728">·上传你的程序<br id="sdn729"><br id="sdn730">（译注：小节名会用“#”来标注，小小节名会用“##”来标注）<br id="sdn731"># 介绍<br id="sdn732"><br id="sdn733">欢迎使用Google App Engine！创建一个App Engine程序非常容易，<br id="sdn734">而且只需要花费很少的时间。它是免费的，只需要上传你的程序，<br id="sdn735">马上就能和使用者来分享，不需要任何费用和许可。<br id="sdn736"><br id="sdn737">在本教程中，会创建一个简单的用户留言簿程序，可以让用户发表<br id="sdn738">信息到一个公共的信息版。用户可以匿名发表，也可以使用他们的<br id="sdn739">Google帐户。<br id="sdn740">（译注：不知道是不是应该把Google翻译成谷歌？）<br id="sdn741"><br id="sdn742">用户留言簿程序会演示如何使用App Engine数据仓库，如何将App<br id="sdn743">Engine程序和Google帐户结合起来，以及演示如何使用一个简单的<br id="sdn744">Python Web框架。这个Web框架已经包含在App Engine中，即：webapp。<br id="sdn745">这个程序也会演示如何使用Django模板引擎。<br id="sdn746">（译注：原文在每个小节之后会有一个“Next”，有些承上启下的文字，未译）<br id="sdn747"><br id="sdn748"><span id="oj7e0"><b id="e82q0"># 开发环境</b></span><br id="sdn749"><br id="sdn750">使用Google App Engine开发和上传程序需要用到App Engine软件开发包（SDK）。<br id="sdn751"><br id="sdn752">SDK包括Web服务器程序，该程序用来模仿App Engine环境，包含一个本地的数据库、<br id="sdn753">Google帐户以及获取URL的能力和使用App Engine API来从你的电脑上直接发送Email。<br id="sdn754">SDK可以运行在任何安装Python 2.5的电脑上，提供的版本包括Windows、Mac OS X和<br id="sdn755">Linux。<br id="sdn756">（译注：不知道是不是应该把App Engine翻译成程序引擎？）<br id="sdn757"><br id="sdn758">如果没有安装Python 2.5，请从Python的官方网站（http://www.python.org/）下载<br id="sdn759">和安装对应操作系统的版本。Mac OS X 10.5 Leopard用户已经直接安装了Python 2.5。<br id="sdn760"><br id="sdn761">下载App Engine SDK（http://code.google.com/appengine/downloads.html）。<br id="sdn762">按照下载页面的提示来安装SDK到你的电脑上。<br id="sdn763"><br id="sdn764">对于本教程来说，你会使用到SDK中的两个命令：<br id="sdn765"><br id="sdn766">·dev_appserver.py，Web服务器开发<br id="sdn767">（http://code.google.com/appengine/docs/thedevwebserver.html）<br id="sdn768">·appcfg.py，用来上传你的程序到App Engine<br id="sdn769">（http://code.google.com/appengine/docs/appcfgpy.html）<br id="sdn770"><br id="sdn771">Windows和Mac OS X安装程序会把这些命令直接放到命令路径中。<br id="sdn772">安装完成之后，你可以直接从命令行窗口下运行这些命令。<br id="sdn773">（译注：在Windows下是命令提示符）<br id="sdn774"><br id="sdn775">如果你使用SDK的Zip文档版本，你会在google_appengine目录下发现这些命令。<br id="sdn776"><br id="sdn777"># Hello, World!<br id="sdn778">Google App Engine程序和Web服务器之间使用CGI标准进行交互。<br id="sdn779">（查看CGI标准：http://hoohoo.ncsa.uiuc.edu/cgi/interface.html）<br id="sdn780">当服务器收到你的程序的一个请求时，它使用请求的数据来运行程序<br id="sdn781">并处理标准输入流（对于POST数据来说）。作为相应，应用程序写响应到标准<br id="sdn782">输出流中，包括HTTP头和内容。<br id="sdn783">（译注：这一段翻译的不好）<br id="sdn784"><br id="sdn785">让我们来实现一个小小的程序：显示一段信息。<br id="sdn786"><br id="sdn787">## 创建一个简单的请求处理器<br id="sdn788"><br id="sdn789">创建一个名为helloworld的目录。本程序的所有文件都放置在这个目录中。<br id="sdn790"><br id="sdn791">进入到helloworld目录中，创建一个名为helloworld.py的文件，并添加如下代码：<br id="sdn792"><br id="sdn793">print 'Content-Type: text/plain'<br id="sdn794">print ''<br id="sdn795">print 'Hello, world!'<br id="sdn796"><br id="sdn797">这个Python脚本响应一个请求，这个响应包括描述内容类型的HTTP头、一个空行<br id="sdn798">以及信息“Hello world!”。<br id="sdn799"><br id="sdn7100">## 创建配置文件<br id="sdn7101"><br id="sdn7102">App Engine应用程序有一个名为app.yaml的配置文件。<br id="sdn7103">此文件描述了哪个处理器（handler）脚本对应哪个URL。<br id="sdn7104"><br id="sdn7105">在helloworld目录中，创建一个名为app.yaml的文件，并添加如下内容：<br id="sdn7106"><br id="sdn7107">application:<span id="muf_0"><b id="e82q1">helloworld</b></span><br id="sdn7108">version:1<br id="sdn7109">runtime:python<br id="sdn7110">api_version:1<br id="sdn7111"><br id="sdn7112">handlers:<br id="sdn7113">- url:/.*<br id="sdn7114">script:helloworld.py<br id="sdn7115"><br id="sdn7116">从上至下，配置文件依次说明了关于程序的下列信息：<br id="sdn7117">·应用程序的标识符是“helloworld”。当你使用App Engine注册你的应用程序时，<br id="sdn7118">在最后一步你会选择一个唯一的标识符，并更新这个值。这个值在开发阶段<br id="sdn7119">可以是任意值。从现在开始，将它设置为“helloworld”。<br id="sdn7120">·版本号“1”是这个应用程序的编号。如果程序更新到了新的版本，App Engine会<br id="sdn7121">保留前面的版本，可以用管理控制台回溯至前面的版本。<br id="sdn7122">·这个代码运行在“python”运行环境下。不久的将来会支持其他运行环境和语言。<br id="sdn7123">·每一个对URL的请求的路径会匹配正则表达式“/.*”（这个正则表达式表示所有的<br id="sdn7124">URL），这将会由“helloworld.py”脚本来处理。<br id="sdn7125">（译注：上面的小节中引号部分在原文中均为绿色，指代上上小节中的代码）<br id="sdn7126">（译注：第一行application后面不能加“_”，比如“hello_world”就不行）<br id="sdn7127"><br id="sdn7128">这个文件的语法是YAML<br id="sdn7129">（http://www.yaml.org/）。<br id="sdn7130">若要查看完整的配置选项列表，请查看app.yaml参考<br id="sdn7131">（http://code.google.com/appengine/docs/configuringanapp.html）。<br id="sdn7132"><br id="sdn7133">## 测试应用程序<br id="sdn7134">使用处理器脚本和配置文件会将每个URL映射至处理器，这样程序就算是完成了。<br id="sdn7135">现在你可以使用App Engine SDK中包含的Web服务器来测试这个程序了。<br id="sdn7136"><br id="sdn7137">使用下列命令启动Web服务器，路径为helloworld的目录：<br id="sdn7138"><br id="sdn7139"><span id="aj6f0"><b id="ga4d0">google_appengine/dev_appserver.py helloworld/</b></span><br id="sdn7140">（译注：注意目录名不能包含空格，比如放置在桌面就不行）<br id="sdn7141">（译注：我是在google_appengine目录下，输入：python dev_appserver.py hellworld，然后问是否更新，我看到最新版本是1.0.1了，但是我这里因为网络问题更新不了）<br id="sdn7143"><br id="sdn7144">这个Web服务器开始运行，可以监听8080端口的请求。<br id="sdn7145">通过在浏览器中访问下面的地址来测试这个程序。<br id="sdn7146"><br id="sdn7147">http://localhost:8080/<br id="sdn7148"><br id="sdn7149">想要了解更多关于运行开发Web服务器的信息，包括如何修改使用的端口，<br id="sdn7150">请查看Dev Web服务器参考<br id="sdn7151">（http://code.google.com/appengine/docs/thedevwebserver.html），<br id="sdn7152">或者运行命令时附加选项：--help。<br id="sdn7153"><br id="sdn7154">## 迭代开发<br id="sdn7155"><br id="sdn7156">你可以在开发程序的过程中保持Web服务器一直在运行。<br id="sdn7157">Web服务器会监视源程序的变化，并在适当的时候重载它们。<br id="sdn7158"><br id="sdn7159">试一下：保持Web服务器在运行中，编辑helloworld.py文件，将其中的Hello, world!<br id="sdn7160">改为其他语句。刷新http://localhost:8080/就可以看到变化。<br id="sdn7161"><br id="sdn7162">若要关闭Web服务器，在终端窗口激活的情况下，按下Control-C<br id="sdn7163">（或Control-Break）。<br id="sdn7164"><br id="sdn7165">你可以保持Web服务器一直运行，因为教程的后面还会用到。<br id="sdn7166">如果你需要停止它，你可以重启它通过运行上面的命令。<br id="sdn7167"><br id="sdn7168"># 使用webapp框架<br id="sdn7169"><br id="sdn7170">CGI标准非常简单，但是手写全部的代码还是非常笨重的。<br id="sdn7171">Web应用程序框架就会替你处理这些细节，这样你就可以只关注于你的应用程序功能。<br id="sdn7172">Google App Engine支持任何使用纯Python编写的支持CGI的框架<br id="sdn7173">（以及任何使用CGI适配器的WSGI框架），包括Django、CherryPy、Pylons和web.py。<br id="sdn7174">你可以选择你的程序代码绑定到一个框架，只需要将代码复制到程序目录中。<br id="sdn7175">（WSGI：http://www.python.org/dev/peps/pep-0333/）<br id="sdn7176">（Django：http://www.djangoproject.com/）<br id="sdn7177">（CherryPy：http://www.cherrypy.org/）<br id="sdn7178">（Pylons：http://pylonshq.com/）<br id="sdn7179">（web.py：http://webpy.org/）<br id="sdn7180"><br id="sdn7181">App Engine包括一个简单的Web程序框架，名为：webapp。<br id="sdn7182">webapp框架已经安装在App Engine环境和SDK中，所以你不需要绑定它，<br id="sdn7183">可以直接在应用程序代码中使用。在教程的后续部分中，我们会使用webapp。<br id="sdn7184"><br id="sdn7185">## Hello, webapp!<br id="sdn7186"><br id="sdn7187">一个webapp应用程序由三个部分组成：<br id="sdn7188">·一个或多RequestHandler类，用来处理请求和创建响应<br id="sdn7189">·一个WSGIApplication实例，用来将输入请求连到基于URL的处理器<br id="sdn7190">·使用CGI适应器运行WSGIApplication的主程序<br id="sdn7191"><br id="sdn7192">让我们重新写我们的“友好的问候”（译注：这里指Hello world，幽默一下），<br id="sdn7193">作为一个webapp程序。<br id="sdn7194">编辑Helloworld/helloworld.py，并用下面的内容来进行替换：<br id="sdn7195"><br id="sdn7196">import wsgiref.handlers<br id="sdn7197"><br id="sdn7198">from google.appengine.ext import webapp<br id="sdn7199"><br id="sdn7200">class MainPage(webapp.RequestHandler):<br id="sdn7201">def get(self):<br id="sdn7202">    self.response.headers['Content-Type'] = 'text/plain'<br id="sdn7203">    self.response.out.write('Hello, webapp World!')<br id="sdn7204"><br id="sdn7205">def main():<br id="sdn7206">application = webapp.WSGIApplication(<br id="sdn7207">                                       [('/', MainPage)],<br id="sdn7208">                                       debug=True)<br id="sdn7209">wsgiref.handlers.CGIHandler().run(application)<br id="sdn7210"><br id="sdn7211">if __name__ == "__main__":<br id="sdn7212">main()<br id="sdn7213">（译注：我第一次看有人用两个空格作为缩进）<br id="sdn7214"><br id="sdn7215">在浏览器中刷新http://localhost:8080/，可以看到新版本的运行结果。<br id="sdn7216">（如果你已经停止了你的Web服务器，请重新启动它，<br id="sdn7217">具体的命令在“Hello, World!”章节中有介绍）<br id="sdn7218"><br id="sdn7219">## webapp做了什么<br id="sdn7220"><br id="sdn7221">webapp模块在google.appengine.ext包中。<br id="sdn7222">这个模块在SDK中提供，也在生产运行环境中。<br id="sdn7223"><br id="sdn7224">代码定义了一个请求处理器“MainPage”，并映射到根URL（/）。<br id="sdn7225">当webapp接收到一个HTTP GET对URL“/”的请求时，它会实例化MainPage类，<br id="sdn7226">并调用这个实例的get方法。在这个方法中，关于请求的信息可以被self.request<br id="sdn7227">所调用。例如：这个方法为每个响应来设置self.response的变量，然后退出。<br id="sdn7228">webapp在MainPage实例的最后阶段发送一个响应。<br id="sdn7229"><br id="sdn7230">应用程序本身由webapp.WSGIApplication实例来呈现。<br id="sdn7231">参数debug=true传递到构造器，通知webapp打印出浏览器输出的栈跟踪，<br id="sdn7232">当然前提是如果处理器遇到错误或引发一个为捕捉的异常。<br id="sdn7233">在你的程序的最终版本中，你会去除这个选项。<br id="sdn7234"><br id="sdn7235">代码使用了来自Python标准库的wsgiref模块来运行WSGIApplication，即一个<br id="sdn7236">CGI适应器。想要了解这个模块更多的信息，请访问wsgiref模块文档<br id="sdn7237">（http://docs.python.org/lib/module-wsgiref.html）。<br id="sdn7238"><br id="sdn7239">在本教程的后面我们会用到webapp的一些其他功能。<br id="sdn7240">想要了解webapp的更多信息，请查看webapp参考<br id="sdn7241">（http://code.google.com/appengine/docs/webapp/）。<br id="sdn7242"><br id="sdn7243"># 使用用户服务<br id="sdn7244"><br id="sdn7245">Google App Engine提供很多有用的服务，这些服务都基于Google基础构造，<br id="sdn7246">（注：我将infrastructure翻译为基础构造，<br id="sdn7247">      但是我理解的是Google的一些基础服务及文件）<br id="sdn7248">可以通过SDK中包含的库来使得程序可以访问这些服务。<br id="sdn7249">其中的一个服务就是用户（User）服务，这个服务可以使你的程序和<br id="sdn7250">Google用户帐户进行整合。<br id="sdn7251">使用用户服务，你的用户可以使用他们已有的Google帐户来申请你的应用。<br id="sdn7252"><br id="sdn7253">让我们看看用户服务是如何定制应用程序的个性化问候。<br id="sdn7254"><br id="sdn7255">## 使用用户（Users）<br id="sdn7256"><br id="sdn7257">再次编辑helloworld/helloworld.py，<br id="sdn7258">使用下面的内容进行替换：<br id="sdn7259"><br id="sdn7260">import wsgiref.handlers<br id="sdn7261"><br id="sdn7262">from google.appengine.api import users<br id="sdn7263">from google.appengine.ext import webapp<br id="sdn7264"><br id="sdn7265">class MainPage(webapp.RequestHandler):<br id="sdn7266">def get(self):<br id="sdn7267">    user = users.get_current_user()<br id="sdn7268"><br id="sdn7269">    if user:<br id="sdn7270">      self.response.headers['Content-Type'] = 'text/plain'<br id="sdn7271">      self.response.out.write('Hello, ' + user.nickname())<br id="sdn7272">    else:<br id="sdn7273">      self.redirect(users.create_login_url(self.request.uri))<br id="sdn7274"><br id="sdn7275">def main():<br id="sdn7276">application = webapp.WSGIApplication(<br id="sdn7277">                                       [('/', MainPage)],<br id="sdn7278">                                       debug=True)<br id="sdn7279">wsgiref.handlers.CGIHandler().run(application)<br id="sdn7280"><br id="sdn7281">if __name__ == "__main__":<br id="sdn7282">main()<br id="sdn7283"><br id="sdn7284">在浏览器中重新加载页面。<br id="sdn7285">你的程序会重定向到一个本地版本的Google登陆页面，<br id="sdn7286">这个页面可以用来测试你的程序。<br id="sdn7287">你可以在屏幕上输入任何你喜欢的用户名，<br id="sdn7288">然后你的程序会发现一个基于这个用户名的伪造User对象。<br id="sdn7289"><br id="sdn7290">当你的程序运行在App Engine上时，用户会被导向到Google帐户<br id="sdn7291">的登陆页面，当登陆之后，或注册了一个新帐户之后，<br id="sdn7292">会重新返回到你的应用。<br id="sdn7293"><br id="sdn7294">## Users API<br id="sdn7295"><br id="sdn7296">让我们来仔细研究一下新的代码：<br id="sdn7297"><br id="sdn7298">user = users.get_current_user()<br id="sdn7299"><br id="sdn7300">如果用户已经注册了你的应用，get_current_user()返回用户的<br id="sdn7301">User对象。如果没有，那么返回None。<br id="sdn7302"><br id="sdn7303">if user:<br id="sdn7304">self.response.headers['Content-Type'] = 'text/plain'<br id="sdn7305">self.response.out.write('Hello, ' + user.nickname())<br id="sdn7306"><br id="sdn7307">如果用户已经登陆，显示一个个性化的信息，使用和用户帐户<br id="sdn7308">相关的昵称。<br id="sdn7309"><br id="sdn7310">else:<br id="sdn7311">self.redirect(users.create_login_url(self.request.uri))<br id="sdn7312"><br id="sdn7313">如果用户没有登陆，告诉webapp重定向用户的浏览器至Google帐户登陆页面。<br id="sdn7314">重定向中包含此页的网址（self.request.uri），这样Google帐户登陆机制<br id="sdn7315">才能在用户登陆完成或注册完成之后将用户返回来。<br id="sdn7316"><br id="sdn7317">想要了解更多Users API的信息，请参见用户参考<br id="sdn7318">（http://code.google.com/appengine/docs/users/）。<br id="sdn7319"><br id="sdn7320"># 使用webapp处理表单<br id="sdn7321"><br id="sdn7322">如果你想要用户提交他们自己的问候，我们就需要一个方法来处理<br id="sdn7323">用户通过Web表格提供的信息。<br id="sdn7324">webapp框架使得处理表格数据变得更容易。<br id="sdn7325"><br id="sdn7326">## 使用webapp处理Web表格<br id="sdn7327"><br id="sdn7328">使用下列内容替换helloworld/helloworld.py中的内容：<br id="sdn7329"><br id="sdn7330">import cgi<br id="sdn7331">import wsgiref.handlers<br id="sdn7332"><br id="sdn7333">from google.appengine.api import users<br id="sdn7334">from google.appengine.ext import webapp<br id="sdn7335"><br id="sdn7336">class MainPage(webapp.RequestHandler):<br id="sdn7337">def get(self):<br id="sdn7338">    self.response.out.write("""<br id="sdn7339">      <html><br id="sdn7340">        <body><br id="sdn7341">          <form action="/sign" method="post"><br id="sdn7342">            <div><textarea name="content" rows="3" cols="60"></textarea></div><br id="sdn7343">            <div><input type="submit" value="Sign Guestbook"></div><br id="sdn7344">          </form><br id="sdn7345">        </body><br id="sdn7346">      </html>""")<br id="sdn7347"><br id="sdn7348"><br id="sdn7349">class Guestbook(webapp.RequestHandler):<br id="sdn7350">def post(self):<br id="sdn7351">    self.response.out.write('<html><body>You wrote:<pre>')<br id="sdn7352">    self.response.out.write(cgi.escape(self.request.get('content')))<br id="sdn7353">    self.response.out.write('</pre></body></html>')<br id="sdn7354"><br id="sdn7355">def main():<br id="sdn7356">application = webapp.WSGIApplication(<br id="sdn7357">                                       [('/', MainPage),<br id="sdn7358">                                        ('/sign', Guestbook)],<br id="sdn7359">                                       debug=True)<br id="sdn7360">wsgiref.handlers.CGIHandler().run(application)<br id="sdn7361"><br id="sdn7362">if __name__ == "__main__":<br id="sdn7363">main()<br id="sdn7364"><br id="sdn7365">刷新页面就可看到此表格，然后试着提交一条信息。<br id="sdn7366"><br id="sdn7367">当前版本有两个处理器（handler）：<br id="sdn7368">MainPage，映射到地址“/”，显示一个Web表格。<br id="sdn7369">Guestbook，映射到地址“/sign”，显示Web表格提交的数据。<br id="sdn7370"><br id="sdn7371">Guestbook处理器有一个post()方法，而没有get()方法。<br id="sdn7372">这是因为MainPage显示的表格使用了HTTP POST方法（method="post"）<br id="sdn7373">来提交表格数据。<br id="sdn7374">如果因为某些原因你想要一个处理器可以对同一个网址进行GET和POST<br id="sdn7375">操作，你可以在相同类中为每个动作定义这样一个方法。<br id="sdn7376"><br id="sdn7377">post()方法中的代码获取来自self.request的表格信息。<br id="sdn7378">在显示给用户之前，它使用cgi.escape()来将HTML特定字符转换成<br id="sdn7379">这些字符的对应体。cgi是一个标准的Python库；查看cgi文档来获取<br id="sdn7380">更多信息（http://docs.python.org/lib/module-cgi.html）。<br id="sdn7381"><br id="sdn7382">注意：App Engine环境包含完整的Python 2.5标准库。<br id="sdn7383">      但是，不是所有的操作都被允许。<br id="sdn7384">      App Engine程序运行在一个受限的环境中，<br id="sdn7385">      只能允许App Engine安全的进行扩展。<br id="sdn7386">      例如：对操作系统的低层调用、网络操作以及一些文件系统操作<br id="sdn7387">      都是不允许的，当尝试这些操作时，会引起错误。<br id="sdn7388">      了解更多信息，查看Python运行环境<br id="sdn7389">      （http://code.google.com/appengine/docs/python/）。<br id="sdn7390"><br id="sdn7391"># 使用数据存储<br id="sdn7392"><br id="sdn7393">在可扩展的Web应用程序中，存储数据是非常困难的。<br id="sdn7394">用户在某段时间中会和多个Web服务器进行交流，<br id="sdn7395">用户的上一个请求是这个服务器进行处理的，<br id="sdn7396">但是下一个请求会跳至其他的服务器。<br id="sdn7397">所有的Web服务器会对数据进行沟通，<br id="sdn7398">这也许会扩展到数十个服务器，<br id="sdn7399">这些服务器有可能在不同的地方。<br id="sdn7400"><br id="sdn7401">但是依靠Google App Engine，你不用过多考虑上述的问题。<br id="sdn7402">App Engine的架构考虑到了数据的所有发布、分派和加载平衡，<br id="sdn7403">这些都在一个简单API后面，<br id="sdn7404">这就是一个强大的查询和处理引擎。<br id="sdn7405"><br id="sdn7406">## 保存提交的问候<br id="sdn7407"><br id="sdn7408">App Engine包括Python的数据模型API（data modelling API）。<br id="sdn7409">它和Django的数据模型API比较相似<br id="sdn7410">（http://www.djangoproject.com/documentation/model-api/）。<br id="sdn7411">但是在后端使用了App Engine的可扩展数据存储。<br id="sdn7412"><br id="sdn7413">对于留言簿应用程序来说，我们想要去存储用户提交的问候语。<br id="sdn7414">每个问候语包括作者的名字、信息的内容以及信息提交的日期和时间，<br id="sdn7415">日期和时间能确保我们按照时间顺序来显示这些信息。<br id="sdn7416"><br id="sdn7417">编辑helloworld/helloworld.py文件，<br id="sdn7418">并在顶部添加下列import语句：<br id="sdn7419"><br id="sdn7420">from google.appengine.ext import db<br id="sdn7421"><br id="sdn7422">在MainPage类上面添加下面这个类：<br id="sdn7423"><br id="sdn7424">class Greeting(db.Model):<br id="sdn7425">author = db.UserProperty()<br id="sdn7426">content = db.StringProperty(multiline=True)<br id="sdn7427">date = db.DateTimeProperty(auto_now_add=True)<br id="sdn7428"><br id="sdn7429">这个类定义了Greeting模型，该模型有3个属性：<br id="sdn7430">author，值为User对象<br id="sdn7431">content，值为一个字符串<br id="sdn7432">date，值为datetime.datetime<br id="sdn7433">（译注：datetime请参考python说明，import datetime; help(datetime)）<br id="sdn7434"><br id="sdn7435">带有参数的属性构造器可以进一步指定它们的行为。<br id="sdn7436">带有multiline=True参数的db.StringProperty构造器<br id="sdn7437">标明这个值可以包含多行字符。<br id="sdn7438">带有auto_now_add=True参数的db.DateTimeProperty构造器<br id="sdn7439">指定了当对象被创建时，如果应用程序没有赋予其他值，<br id="sdn7440">那么新的对象自动被赋予一个date的时间。<br id="sdn7441">查看万张的属性类型和选项列表，查看数据存储参考<br id="sdn7442">（http://code.google.com/appengine/docs/datastore/）。<br id="sdn7443"><br id="sdn7444">现在我们有了一个问候语的数据模型，应用程序可以用这个模型<br id="sdn7445">来创建一个新的Greeting对象，并将它们存进数据库中。<br id="sdn7446">编辑Guestbook处理器，代码如下：<br id="sdn7447"><br id="sdn7448">class Guestbook(webapp.RequestHandler):<br id="sdn7449">def post(self):<br id="sdn7450">    greeting = Greeting()<br id="sdn7451"><br id="sdn7452">    if users.get_current_user():<br id="sdn7453">      greeting.author = users.get_current_user()<br id="sdn7454"><br id="sdn7455">    greeting.content = self.request.get('content')<br id="sdn7456">    greeting.put()<br id="sdn7457">    self.redirect('/')<br id="sdn7458"><br id="sdn7459">新的Guestbook处理器创建一个新的Greeting对象，并将用户提交<br id="sdn7460">的数据来设置了它的author和content属性。<br id="sdn7461">如果没有设置date属性，那么date会被自动设置为“now”（当前），<br id="sdn7462">就像我们在模型中制定的那样。<br id="sdn7463"><br id="sdn7464">最后，greeting.put()保存我们的新对象到数据库中。<br id="sdn7465">如果我们获取到对象的查询，put()会坑新当前对象。<br id="sdn7466">因为我们使用模型构造器来创建对象，<br id="sdn7467">因此put()创建了一个新的对象到数据库中。<br id="sdn7468"><br id="sdn7469">## 使用GQL找回存储的问候语<br id="sdn7470"><br id="sdn7471">App Engine数据库有一个优秀的（sophisticated）的数据模型<br id="sdn7472">查询引擎。因为App Engine数据库不是传统关系数据库，因此查询<br id="sdn7473">不是用SQL来定义的。但是你可以使用一种类似SQL的查询语言，<br id="sdn7474">我们称之为GQL。GQL提供了访问App Engine数据库的查询引擎功能，<br id="sdn7475">语法与SQL十分相近。<br id="sdn7476"><br id="sdn7477">编辑MainPage处理器，代码如下：<br id="sdn7478"><br id="sdn7479">class MainPage(webapp.RequestHandler):<br id="sdn7480">def get(self):<br id="sdn7481">    self.response.out.write('<html><body>')<br id="sdn7482"><br id="sdn7483">    greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")<br id="sdn7484"><br id="sdn7485">    for greeting in greetings:<br id="sdn7486">      if greeting.author:<br id="sdn7487">        self.response.out.write('<b>%s</b> wrote:' % greeting.author.nickname())<br id="sdn7488">      else:<br id="sdn7489">        self.response.out.write('An anonymous person wrote:')<br id="sdn7490">      self.response.out.write('<blockquote>%s</blockquote>' %<br id="sdn7491">                              cgi.escape(greeting.content))<br id="sdn7492"><br id="sdn7493">    # Write the submission form and the footer of the page<br id="sdn7494">    self.response.out.write("""<br id="sdn7495">          <form action="/sign" method="post"><br id="sdn7496">            <div><textarea name="content" rows="3" cols="60"></textarea></div><br id="sdn7497">            <div><input type="submit" value="Sign Guestbook"></div><br id="sdn7498">          </form><br id="sdn7499">        </body><br id="sdn7500">      </html>""")<br id="sdn7501"><br id="sdn7502">在浏览器中刷新http://localhost:8080/，输入一些消息来确认消息可以被<br id="sdn7503">正常发送。<br id="sdn7504"><br id="sdn7505">查询代码如下所示：<br id="sdn7506"><br id="sdn7507">    greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")<br id="sdn7508">（译注：我看不出来这和SQL有什么区别）<br id="sdn7509"><br id="sdn7510">另外，你也可以调用Greeting类的gql(...)方法，<br id="sdn7511">省略查询中的“SELECT * FROM Greeting”：<br id="sdn7512"><br id="sdn7513">    greetings = Greeting.gql("ORDER BY date DESC LIMIT 10")<br id="sdn7514"><br id="sdn7515">和SQL一样，关键词（例如“SELECT”）是大小写不敏感的。<br id="sdn7516">但是，其他变量名是大小写敏感的。<br id="sdn7517">（译注：我感觉把SQL的关键词都大写是一种很好的习惯）<br id="sdn7518"><br id="sdn7519">因为查询返回全部数据对象，因此选择模型的特定属性没有什么意义。<br id="sdn7520">所有的GQL查询都是以“SELECT * FROM model”开头，<br id="sdn7521">（或应用模型的gql方法），<br id="sdn7522">或者与之类似的SQL等效语句。<br id="sdn7523">（译注：我其实发现了把model翻译成模型不是太合适，或者是模组？）<br id="sdn7524"><br id="sdn7525">（译注：其实greeting翻译成祝福语也挺不准确的，问候语？）<br id="sdn7526">一个有WHERE语句的GQL查询会依据一个或几个条件的属性值来过滤得到的结果。<br id="sdn7527">和SQL不同，GQL查询“不”包含常量：相反，GQL使用查询中所有值的绑定参数。<br id="sdn7528">例如，若只想获取当前用户的祝福语：<br id="sdn7529"><br id="sdn7530">    if users.get_current_user():<br id="sdn7531">      greetings = Greeting.gql("WHERE author = :1 ORDER BY date DESC",<br id="sdn7532">                               users.get_current_user())<br id="sdn7533"><br id="sdn7534">你也可以使用命名的参数代替位置参数：<br id="sdn7535"><br id="sdn7536">      greetings = Greeting.gql("WHERE author = :author ORDER BY date DESC",<br id="sdn7537">                               author=users.get_current_user())<br id="sdn7538"><br id="sdn7539">除GQL之外，数据存储API提供了使用方法创建查询对象的其他机制。<br id="sdn7540">上面的查询也可以修改为下面的代码：<br id="sdn7541"><br id="sdn7542">      greetings = Greeting.all()<br id="sdn7543">      greetings.filter("author =", users.get_current_user())<br id="sdn7544">      greetings.order("-date")<br id="sdn7545"><br id="sdn7546">查看完整的GQL及查询API描述，请参见数据存储参考<br id="sdn7547">（http://code.google.com/appengine/docs/datastore/）。<br id="sdn7548"><br id="sdn7549">## 清除开发服务器数据库<br id="sdn7550"><br id="sdn7551">开发Web服务器使用一个本地版本的数据库来测试你的应用程序，<br id="sdn7552">即使用临时文件。<br id="sdn7553">只要临时文件错在数据就会一直存在，Web服务器不会重置这些文件<br id="sdn7554">除非你要求这么做。<br id="sdn7555"><br id="sdn7556">如果你想要开发服务器在启动时预先清除数据库，请在启动服务器时<br id="sdn7557">添加--clear_datastore选项：<br id="sdn7558"><br id="sdn7559">dev_appserver.py --clear_datastore helloworld/<br id="sdn7560"><br id="sdn7561">（注：我最近在找工作，但是找不到。对不起，这和本文没什么关系，sorry）<br id="sdn7562"><br id="sdn7563"># 使用模板<br id="sdn7564"><br id="sdn7565">代码嵌套在HTML中是很杂乱和难以维护的，最好的办法是使用模板系统。<br id="sdn7566">在模板系统中，HTML被作为一个单独的文件，<br id="sdn7567">使用得定的语法来表明程序中的数据从何而来。<br id="sdn7568">有很多Python的模板系统：EZT、Cheetah、ClearSliver、Quixote和Django等等。<br id="sdn7569">你可以使用你的模板引擎，并将它绑定到你的应用程序代码中。<br id="sdn7570">（EZT：http://svn.webdav.org/repos/projects/ezt/trunk/ezt.py）<br id="sdn7571">（Cheetah：http://www.cheetahtemplate.org/）<br id="sdn7572">（ClearSliver：http://www.clearsilver.net/）<br id="sdn7573">（Quixote：http://www.mems-exchange.org/software/quixote/）<br id="sdn7574">（Django：http://www.djangoproject.com/documentation/templates/）<br id="sdn7575"><br id="sdn7576">为了更加方便，webapp模块包含了Django模板引擎。这也作为一个部分包含在<br id="sdn7577">SDK和App Engine中，所以你使用的时候不需要再去绑定它。<br id="sdn7578"><br id="sdn7579">## 使用Django模板<br id="sdn7580"><br id="sdn7581">添加下列import语句在helloworld/helloworld.py的顶部：<br id="sdn7582"><br id="sdn7583">import os<br id="sdn7584">from google.appengine.ext.webapp import template<br id="sdn7585"><br id="sdn7586">使用下面代码替换MainPage处理器：<br id="sdn7587"><br id="sdn7588">class MainPage(webapp.RequestHandler):<br id="sdn7589">def get(self):<br id="sdn7590">    greetings = Greeting.all().order('-date')<br id="sdn7591"><br id="sdn7592">    if users.get_current_user():<br id="sdn7593">      url = users.create_logout_url(self.request.uri)<br id="sdn7594">      url_linktext = 'Logout'<br id="sdn7595">    else:<br id="sdn7596">      url = users.create_login_url(self.request.uri)<br id="sdn7597">      url_linktext = 'Login'<br id="sdn7598"><br id="sdn7599">    template_values = {<br id="sdn7600">      'greetings': greetings,<br id="sdn7601">      'url': url,<br id="sdn7602">      'url_linktext': url_linktext,<br id="sdn7603">      }<br id="sdn7604"><br id="sdn7605">    path = os.path.join(os.path.dirname(__file__), 'index.html')<br id="sdn7606">    self.response.out.write(template.render(path, template_values))<br id="sdn7607"><br id="sdn7608">最后在helloworld目录中创建一个index.html文件，该文件的内容如下：<br id="sdn7609"><br id="sdn7610"><html><br id="sdn7611"><body><br id="sdn7612">    {% for greeting in greetings %}<br id="sdn7613">      {% if greeting.author %}<br id="sdn7614">        <b>{{ greeting.author.nickname }}</b> wrote:<br id="sdn7615">      {% else %}<br id="sdn7616">       An anonymous person wrote:<br id="sdn7617">      {% endif %}<br id="sdn7618">      <blockquote>{{ greeting.content|escape }}</blockquote><br id="sdn7619">    {% endfor %}<br id="sdn7620"><br id="sdn7621">    <form action="/sign" method="post"><br id="sdn7622">      <div><textarea name="content" rows="3" cols="60"></textarea></div><br id="sdn7623">      <div><input type="submit" value="Sign Guestbook"></div><br id="sdn7624">    </form><br id="sdn7625"><br id="sdn7626">    <a href="{{ url }}">{{ url_linktext }}</a><br id="sdn7627"><br id="sdn7628"></body><br id="sdn7629"></html><br id="sdn7630"><br id="sdn7631">刷新一下页面，然后看看。<br id="sdn7632"><br id="sdn7633">template.render(path, template_values)有两个参数：一个是模板文件的文件路径；<br id="sdn7634">一个是字典值。并返回递归文本。这个模板用了Django模板语法来访问和重申值，<br id="sdn7635">以及来引用这些值的属性。在许多情况下，你可以将数据存储模板对象直接作为值，<br id="sdn7636">并通过模板来访问他们的属性。<br id="sdn7637"><br id="sdn7638">提示：一个App Engine应用程序有对这个项目所有上传文件、库文件的只读权限，<br id="sdn7639">      但是不包括其他文件。当前工作路径就是程序的主目录，所有index.html<br id="sdn7640">      的路径就是简单的“index.html”。<br id="sdn7641"><br id="sdn7642">想要了解更多关于Django模板引擎的信息，请访问Django 0.96模板文档<br id="sdn7643">（http://www.djangoproject.com/documentation/0.96/templates/）。<br id="sdn7644"><br id="sdn7645"># 使用静态文件<br id="sdn7646"><br id="sdn7647">和传统的Web主机环境不同，Google App Engine不支持直接访问你的<br id="sdn7648">应用程序源代码目录下的文件，除非制定这样做。我们将我们的模板<br id="sdn7649">文件命名为index.html，但是不会自动使得文件可以通过URL/index.html<br id="sdn7650">来访问。<br id="sdn7651"><br id="sdn7652">当时，有很多情况下你希望直接通过Web浏览器访问静态文件。<br id="sdn7653">例如：图片、CSS文件、JavaScript代码、影片和Flash动画就会保存在应用<br id="sdn7654">程序目录下并直接通过浏览器访问。你可以告知App Engine来直接访问特定<br id="sdn7655">的文件，而不需要编辑处理器。<br id="sdn7656"><br id="sdn7657">## 使用静态文件<br id="sdn7658"><br id="sdn7659">编辑helloworld/app.yaml，并用下列内容进行替换：<br id="sdn7660"><br id="sdn7661">application: helloworld<br id="sdn7662">version: 1<br id="sdn7663">runtime: python<br id="sdn7664">api_version: 1<br id="sdn7665"><br id="sdn7666">handlers:<br id="sdn7667">- url: /stylesheets<br id="sdn7668">static_dir: stylesheets<br id="sdn7669"><br id="sdn7670">- url: /.*<br id="sdn7671">script: helloworld.py<br id="sdn7672"><br id="sdn7673">新的hanlers部分定义了两个用于URL的处理器。<br id="sdn7674">当App Engine接收到一个来自网址头部包含/stylesheets的请求时，<br id="sdn7675">它映射文件的剩余路径到stylesheets路径，如果找到对应的文件，<br id="sdn7676">该文件的内容会被返回到客户端。其他网址映射“/”路径，并由<br id="sdn7677">helloworld.py脚本来处理。<br id="sdn7678"><br id="sdn7679">默认情况下，App Engine使用基于文件名扩展的MIME类型来访问静态文件。<br id="sdn7680">例如一个文件名后缀为.csss的会被认为是text/css MIME类型。<br id="sdn7681">你可以通过额外的选项来制定准确的MIME类型。<br id="sdn7682"><br id="sdn7683">URL处理期路径参数会按照它们在app.yaml中的顺序从顶到底进行处理。<br id="sdn7684">在本例中，/stylesheets参数会在/.*参数映射之前找到相应路径。<br id="sdn7685">想了解更多URL映射的信息，以及可以制定app.yaml的参数信息，<br id="sdn7686">请查看app.yaml参考（http://code.google.com/appengine/docs/configuringanapp.html）。<br id="sdn7687"><br id="sdn7688">创建目录helloworld/stylesheets。<br id="sdn7689">在这个新目录中，创建一个新文件，名为main.css，内容如下：<br id="sdn7690"><br id="sdn7691">#body {<br id="sdn7692"># font-family: Verdana, Helvetica, sans-serif;<br id="sdn7693"># background-color: #DDDDDD;<br id="sdn7694">#}<br id="sdn7695">（注：css内容前面每一行我都加了“#”以免显示不正确）<br id="sdn7696">（注：在支持文字定义的blog中，css代码都不能正常显示）<br id="sdn7697">（otherrrr@gmail.com）<br id="sdn7698"><br id="sdn7699">最后，编辑helloworld/index.html文件，并插入下面的代码，<br id="sdn7700">在<html>行之后：<br id="sdn7701"><br id="sdn7702"># <head><br id="sdn7703">#    <link type="text/css" rel="stylesheet" href="/stylesheets/main.css" /><br id="sdn7704"># </head><br id="sdn7705">（注：每一行我都加了一个“#”）<br id="sdn7706"><br id="sdn7707">在浏览器中刷新页面，会看到使用层叠演示表的新的页面。<br id="sdn7708"><br id="sdn7709"># 上传你的程序<br id="sdn7710"><br id="sdn7711">你可以使用管理控制台来创建和管理App Engine的应用程序。<br id="sdn7712">如果你注册了你的应用程序ID，你可以使用SDK中的命令行工具<br id="sdn7713">来上传程序到网站上。这个工具是appcfg.py。<br id="sdn7714"><br id="sdn7715">注意：在写本文时，还没有办法来删除App Enginge上的程序。<br id="sdn7716">这个功能会很快添加。在预览版本中，你可以注册3个程序ID。<br id="sdn7717">如果你不想为本教程分配一个程序ID，你可只是简单看看这个<br id="sdn7718">部分，当你准备上传程序时在详细的了解。<br id="sdn7719"><br id="sdn7720">## 注册应用程序<br id="sdn7721"><br id="sdn7722">你可以通过App Engine管理平台创建和管理App Enginge的Web应用程序，<br id="sdn7723">网址如下：<br id="sdn7724">          http://appengine.google.com<br id="sdn7725"><br id="sdn7726">通过你的Google帐户登陆App Engine。<br id="sdn7727">如果你没有Google帐户，请可以通过一个E-mail地址和密码来创建一个<br id="sdn7728">Google帐户（https://www.google.com/accounts/）。<br id="sdn7729"><br id="sdn7730">单击“Create an Applicatio”按钮来创建一个新的应用u程序。<br id="sdn7731">根据指引来注册一个应用程序ID，即这个程序的唯一的名称。<br id="sdn7732">如果你选择使用免费的appspot.com域名，那么这个程序的完整网址<br id="sdn7733">就是：http://application-id.appspot.com/。<br id="sdn7734">你可以为你的应用购买一个顶级域名，也可以使用已经注册的域名。<br id="sdn7735"><br id="sdn7736">编辑app.yaml文件，然后修改application的对应值：设置helloworld对应<br id="sdn7737">你注册的应用程序ID。<br id="sdn7738">（注：我发现很多人都是因为这个问题结果上传后出错或无法浏览）<br id="sdn7739"><br id="sdn7740">## 上传程序<br id="sdn7741"><br id="sdn7742">使用下列命令上传完成的应用程序到Google App Engine：<br id="sdn7743"><br id="sdn7744">appcfg.py update helloworld/<br id="sdn7745"><br id="sdn7746">在命令行（或终端）下输入你的Google用户名和密码。<br id="sdn7747"><br id="sdn7748">现在你就可以看到你的程序已经运行在App Enginge上了。<br id="sdn7749">如果你设置使用免费的appspot域名，<br id="sdn7750">那么网址会是：<br id="sdn7751">  http://application-id.appspot.com<br id="sdn7753"><br id="sdn7754">## 祝贺你！<br id="sdn7755">你已经完成了本教程。<br id="h1hv0"><br id="sdn7758">参考地址<br id="clvm0">http://code.google.com/appengine/docs/<br id="clvm1"><br id="h1hv1">http://code.google.com/appengine/docs/gettingstarted/<br id="h1hv2"><br id="op-51">http://hi.baidu.com/otherrrr/blog/item/772eb07e43ff613d0cd7daa6.html<br id="sdn7761"><img src ="http://www.cnblogs.com/yoshow/aggbug/1192172.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43597/" target="_blank">[新闻]推波助澜 微软推出“I'm a PC”商店</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>MOSS 2007  功能概述 </title><link>http://www.cnblogs.com/yoshow/archive/2008/04/11/1149286.html</link><dc:creator>Yoshow</dc:creator><author>Yoshow</author><pubDate>Fri, 11 Apr 2008 15:54:00 GMT</pubDate><guid>http://www.cnblogs.com/yoshow/archive/2008/04/11/1149286.html</guid><wfw:comment>http://www.cnblogs.com/yoshow/comments/1149286.html</wfw:comment><comments>http://www.cnblogs.com/yoshow/archive/2008/04/11/1149286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yoshow/comments/commentRss/1149286.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yoshow/services/trackbacks/1149286.html</trackback:ping><description><![CDATA[<P id=kjfn><SPAN id=auyh>    Microsoft Office Sharepoint Server 2007(MOSS 2007) 是微软最新推出的服务器产品，由</SPAN><SPAN id=jnj5>熟悉微软Office产品线的人都知道，MOSS 2007的上一个版本SPS 2003的全称是 Office Sharepoint Portal Server，在新版本中，微软去掉了Portal一个词。从这个角度很清楚地看到微软对MOSS 2007的定位，是的，MOSS 已经不再仅仅是一个Portal Server了，虽然Portal仍然是其最主要的一块功能，同时MOSS是一个集成了内容管理(Content Management)、商务智能(BI)、工作流(Workflow)、企业搜索引擎(Enterprise Search Engine)、应用整合(EAI)在内的平台级服务器。</SPAN></P> <P id=ig-2> </P> <P id=wddr><SPAN id=e80m>   下面对MOSS 2007的新功能作一个简要概述。</SPAN></P> <P id=ulhz> </P> <P id=zlwb><SPAN id=apwg>    <b id=pagb>Portal </b></SPAN></P><SPAN id=lv2p> <P id=is6h><BR id=z8f->    上面提到过Portal仍然是MOSS 2007最主要的一项功能，照比SPS 2003功能有大幅度提升的同时，去掉了2k3中的让人容易混淆的一些概念，使得Portal在架构上更加清晰和明确。门户的概念本身就是为企业提供一个 内容管理、知识管理、工作协作的平台。在MOSS 2007中，可以使用全新的站点模板(Site Templet)和站点定义(Site Definitions)的功能定制个性化的门户，使得最终用户可以通过更改预先定义的站点模板和站点定义来更改网站的外观，当然这点在2k3中也可以实 现，只不过2k7提供了更加便于操作的一些新功能。MOSS 2007同样支持个人站点这个概念，可以通过两种方式实现个人站点，一种是用户自定义创建的形式，另外一种形式是通过管理员导入User Profile生成个人站点。同样支持最终用户设定一些个人的Web Part，例如我的同事、我的工作之类。User Profile是在MOSS 2007中的一个新功能，MOSS 2007提供了基于不同的形式用户机制，默认是基于AD或workgroup(单机版)的，可以通过更改UserProfileProvider连接到其 它的基于LDAP的用户数据库，同样也可以基于ASP.NET 2.0的MemberShip用户库，这点就为将MOSS 2007推广到Internet提供了一个很好的基础。User Profile实际上是将外部用户数据读入到MOSS中，形成针对用户的Profile，基于UserProfile可以授权用户对List或 Webpart的可见性(注意对于List列表的内容和Web part的用户功能并不能通过User Profile的授权来控制)。同样MOSS对于读入的User Profile进行存储之后可以进行定制化的扩展。让人感到兴奋的是MOSS终于提供了对移动设备的支持，所有的可以通过浏览器浏览的Web页面都有其移 动设备版本。</P> <P id=pvg5> </P></SPAN> <P id=pvg5> </P> <P id=e:nt><SPAN id=n5-l>   实际上MOSS中对SPS中的一些站点的概念作过调整，去掉了原来区域和门户这两个概念。在MOSS中，最顶级的一个概念是Web Application，基于Web Application可以建立Site Collocation，SiteCollocation下面是Site，当然了，每一个Site Collocation下面的第一个Site当然就是RootSite，其他的都是基于Root Site 的Child Site。Site实际上是MOSS中最重要的一个对象，在MOSS的概念体系中又一个句话:Everything is Site。实际上连MOSS 的管理站点和SSP管理站点(Shared Service Provider,这个概念很重要，后面会详细说明)都是一个Site。</SPAN></P> <P id=fa5y> </P> <P id=a10n><SPAN id=y_u_>   <b id=x2-q>Enterprise Content Management(企业内容管理)</b> </SPAN></P><SPAN id=ursu> <P id=t.h7><BR id=kk25>   MOSS 2007实际上是整合了Sharepoint Portal 2003和微软的另一个早期的服务器产品Content Management Server 2002两个服务器产品，所以Enterprise Content Management是MOSS 2007中最重要的一个服务之一。MOSS 2007的Enterprise Content Management主要包括三部分：文档管理(Document Management)，记录集管理(Records Management)和Web内容管理(Web Content Management)。</P> <P id=ddia> </P></SPAN> <P id=ddia> </P> <P id=v9ye><SPAN id=f7ol>   文档管理(Document Management)主要有几点值得兴奋的，InforPath Work Forms、Document Information Pannel和Document Converters.InforPath Work Forms实际上是通过Form Server实现的一个很实用的功能，基于Form Server可以大幅度提高原来InforPath的功能，实现完全基于Web的InforPath。Document Information Pannel这个功能显得更加实用，因为Office 2007的文件格式是完全开发的XML格式，实际上就在技术上允许了对Office Document进行扩展，使用Document Information Pannel可以对固定模板的文档进行格式化的信息收集和提取。Document Converters是提供了一个文档转换的功能。</SPAN></P> <P id=luw.> </P> <P id=w3m5><SPAN id=wp03>   记录集管理(Records Management)对于企业来说是一个极其实用的功能，多数企业在信息化建设中都希望实现企业内的数据、文档等内容进行版本控制、知识库建设等功能， MOSS 2007提供了对企业内文档和数据的版本管理、生命周期控制、内容类型控制、文档审核、与企业内部的RMS(Right Management Server)整合等多项功能，并且能实现基于文档和记录条目的授权机制。这里面另外一个比较有特点的机制就是基于站点的两层recycle bin机制防止文档的误删除。</SPAN></P> <P id=s3qk> </P> <P id=q5m1><SPAN id=sxdy>   Web内容管理(Web Content Management)实际上在SPS 2003中就已经很出色，多数企业选择SPS 2003就是因为其强大的Web内容管理功能。在MOSS 2007中在这方面也有很大的增强，用户可以订制站点的导航栏、MasterPage、页面的WebPart、页面搜索功能甚至是站点的内容模板、列表的 栏的类型等等，其中MasertPage的定义这个功能十分强大，Master Page是ASP.NET中管理站点页面统一布局的机制，在MOSS 2007中同样引入了这个机制，在后面我会单独抽出空间来介绍Masert Page的功能。另外，MOSS同样支持多语言站点，甚至在中文版中提供了一个已经开发好的Workflow专门处理多语言站点的建立。</SPAN></P> <P id=ir9e> </P> <P id=o-dz><SPAN id=zxh:>    <b id=im78>Search Engine(搜索引擎)</b> </SPAN></P> <P id=wtu-><SPAN id=zo5r><BR id=pxr_>    SPS 2003中的搜索引擎虽然可用，但是效果和准确程度让人很不满意，但是在MOSS 2007中提供了一个全新的Search Engine，熟悉2k3的人都知道，2k3的搜索是基于SQL Server的全文索引机制的，而在MOSS 2007中，Search完全是MOSS提供的一项服务，据说Search Service是微软重新开发的一套搜索引擎，效率和准确度方面比2k3有大幅的提升。因为在MOSS 2007中不仅可以对MOSS Sites进行搜索，同样可以对共享文件夹、其他web 站点甚至是自定义的文档类型进行搜索(对自定义文档类型搜索需要开发支持)，因此微软居然把MOSS 2007的Search单独拿出来作为一个产品来卖，企业可以仅买Search这一个功能。从这个角度看，微软对Search这个功能还是很有信心的。 Search Engine甚至可以透过BDC(Business Data Catalog,MOSS 中最重要的一个服务，后面单独介绍)对SAP、PS等其他企业应用的数据进行Search。</SPAN></P> <P id=zy.l> </P> <P id=r-x5><SPAN id=pxuh>     <b id=gs.:>InforPath Forms Services</b> </SPAN></P><SPAN id=lvmm> <P id=lvcv><BR id=hcyv>     <b id=l4bm>InforPath Forms Services </b>实际上实现了一个基于Web的Form Server，即使客户端没有安装InforPath同样可以