??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲视频2020,国产亚洲综合色就色,亚洲av成人无码久久精品http://www.tkk7.com/zhangrenquan/category/6863.htmlzh-cnThu, 15 Nov 2012 05:44:47 GMTThu, 15 Nov 2012 05:44:47 GMT60JBOSS5.0 配置详解(?http://www.tkk7.com/zhangrenquan/articles/366152.htmlkelvenkelvenMon, 12 Dec 2011 07:13:00 GMThttp://www.tkk7.com/zhangrenquan/articles/366152.htmlhttp://www.tkk7.com/zhangrenquan/comments/366152.htmlhttp://www.tkk7.com/zhangrenquan/articles/366152.html#Feedback0http://www.tkk7.com/zhangrenquan/comments/commentRss/366152.htmlhttp://www.tkk7.com/zhangrenquan/services/trackbacks/366152.html阅读全文

kelven 2011-12-12 15:13 发表评论
]]>
d各搜索引擎免费入?/title><link>http://www.tkk7.com/zhangrenquan/articles/365648.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 06 Dec 2011 02:35:00 GMT</pubDate><guid>http://www.tkk7.com/zhangrenquan/articles/365648.html</guid><wfw:comment>http://www.tkk7.com/zhangrenquan/comments/365648.html</wfw:comment><comments>http://www.tkk7.com/zhangrenquan/articles/365648.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.tkk7.com/zhangrenquan/comments/commentRss/365648.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhangrenquan/services/trackbacks/365648.html</trackback:ping><description><![CDATA[d搜烦引擎是推q网站很重要的一步。ؓ了方便大Ӟ整理了主要搜索引擎,希望对大家有帮助。以下地址都经q了试Q可以用,若您在用时发现死链接,请通知我们Q以便更好的为大家服务。同时也Ƣ迎大家推荐好的搜烦引擎Q在留言本中l我留言可以了。另外要指出的是QA献流量的主要是几个著名的搜烦引擎Q其它的Ҏ量A献微乎其微。如果您旉不多Q大可不必全部登录。当Ӟ如果旉充Q又没有很多推广l费Q登录一下也大有好处?<br /><br /><span>癑ֺ免费d入口 http://www.baidu.com/search/url_submit.htm <br />新浪免费d入口 http://bizsite.sina.com.cn/newbizsite/docc/index-2jifu-09.htm <br />搜狐免费d入口http://db.sohu.com/regurl/regform.asp?Step=REGFORM&class= <br />天网免费d入口 http://bingle.pku.edu.cn/submit.htm <br />雅虎免费d入口 http://cn.yahoo.com/docs/info/suggest.html <br />Google免费d入口 http://www.google.com/intl/zh-CN/add_url.html <br />慧聪行业免费d入口http://202.108.33.161/web/frontward/free/free_speedlogin.asp <br />搜v免费d入口 http://search.sobao.com/Computers_and_Internet/Personal/ <br />焦点|免费登录入?http://search.focus.com.cn/search/search_newurl_register.ecgi <br />协通免费登录入?http://www.net2asp.com.cn/search/regform.htm <br />银河免费d入口 http://search.inhe.net/navigate.asp <br />中国假日免费d入口 http://www.china-holiday.com/newterms/hall/it/sort.asp?sortid=259 <br />p互连|免费登录入?http://www.shanxi.net.cn/sxhulian/addcate.asp <br />|络奇兵登陆入口http://www.net7b.com/net7b_site/denglu/index.asp <br />6128搜烦引擎免费登陆入口http://www.6128.cn/add.htm <br />深圳|狐登陆入口 http://www.szfox.com/search/ <br />中国搜烦同盟免费d入口 http://service.chinasearch.com.cn/web/frontward/free/free_protocol.htm <br />北极星免费登录入?http://www.beijixing.com.cn/bjx01/search/regi_1.asp <br />亦凡信息׃|络Q亦凡搜?http://www.gotofind.com/opendir/ <br />法律|免费登录入?http://www.law-lib.com/lawseek/wzdl.asp <br />银河免费d入口 http://search.inhe.net/navigate.asp <br />温州信息港免费登录入?http://www.wzonline.com.cn/ <br />免费d入口http://www.cnjjl.com/other/ <br />孙悟I免费登录入?http://www.sunwukong.cn/add.php <br />猫头?http://www.owlchina.com/publish.asp?l=pub <br />凯希 http://www2d.biglobe.ne.jp/~kinryou/cgi/url.html <br />ebsee http://www.ebsee.com/cgi-bin/find/find.cgi?menu=add <br />focus http://search.focus.com.cn/search/search_newurl_register.ecgi <br />zhao5.com登陆入口 http://www.zhao5.com/deng_9.htm <br />三百六十行在U登陆入?http://www.360hang.com/ <br />中国168免费d入口 http://www.china168.com/chaoshi/it/regsta1.asp?sortid=242 <br />中国车网免费d入口 http://www.cncar.net/search/addsite.asp <br />l界免费d入口 http://ep.sunup.net/add.php <br />天上人间中文搜烦引擎 http://www.6mj.com/search/ <br />企业搜烦引擎 http://www.shengdarealestate.com.cn/search/sort.asp?sortid=37 <br />好东西网址登陆 http://dir.haodx.com/computer/internet/search/search_egines/ <br />中国搜烦登陆入口 http://service.chinasearch.com.cn/zhongsou/wzdl/free_protocol.htm <br />|讯快R http://www.ne163.com/ <br />q东x在线 http://www.gdyj.com/ <br />泰达搜烦引擎 http://www.tedanet.com/search/index.asp <br />Y28 Search http://www.y28.com/cgi-bin/link/join.pl <br /></span><img src ="http://www.tkk7.com/zhangrenquan/aggbug/365648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhangrenquan/" target="_blank">kelven</a> 2011-12-06 10:35 <a href="http://www.tkk7.com/zhangrenquan/articles/365648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse插g开?/title><link>http://www.tkk7.com/zhangrenquan/articles/89332.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 21 Dec 2006 09:34:00 GMT</pubDate><guid>http://www.tkk7.com/zhangrenquan/articles/89332.html</guid><wfw:comment>http://www.tkk7.com/zhangrenquan/comments/89332.html</wfw:comment><comments>http://www.tkk7.com/zhangrenquan/articles/89332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhangrenquan/comments/commentRss/89332.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhangrenquan/services/trackbacks/89332.html</trackback:ping><description><![CDATA[<p>一、新建项目。?<br />  按照上一的新徏插g目的方法,新徏一个名为myplugin2的插仉目,注意Q在最后一步选择“徏立白I插仉目”,除此Q其它都一栗截囑֦下:</p> <p> <img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-102058521.png" o:title="" /> <br />   <br />       附注Q发现又有上一的错误Q中文版的Eclipse在新建项目时Q比较容易有“由于类路径错误Q不完整或涉及@环)Q所以未构徏目。”这cȝ错误。好办,因ؓ中文包只是一些文本文Ӟ对开发没用,用前面一所说的Ҏ删除那些对中文包的引用(前面字符为ECLIPSE_HOME_LANGUAGE_LINK…?Q,如下图:  <br /><br />   <img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-102058523.png" o:title="" /><br />二、插件开发的几个x炏V?br />  a) 库引用。如上附注所说库引用是在建立插g初期要设|好的地方,不过一l设|基本不需要再改变。功能类gJDK的classpath或者Jbuilder里的库引用。?<br />  b) 插gJAVA源代码。今后主要的工作Q狂写代码吧。主要都是一?.JAVA文g。?<br />  c) 目根目录下的plugin.xml文g。这个文件是插g的入口文ӞEclipseҎq个文g中的讄来加载插件。代码写完了Q要让Eclipse加蝲你的代码p在这里面做些手脚了,q些手脚有个术语叫“设|扩展点”。象在Eclipse的加个主菜单、视图、按钮,都在q个文g里面做不同的扩展点,后面的教E会看到q个文g的用。要Z说那我开发一个系l会有很多的菜单和按钮,那是不是都要讄q个文g呢?回答Q不必,q里面只讄主要和Eclipse接壤的扩展点Q其它系l里的菜单按钮就没必要了Q今后会讲到。?<br />   <br />三、设|库引用。?<br />  在删除了上面附注所说的无用且出错的引用Q接下来我们要加入一些开发插件要用到的库。是那些呢?呵呵Q前面我们还是用向导建立了一个helloword插g吗,参考它的就行了。如下图Q?<br /><img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-102058525.png" o:title="" /></p> <p>   <br />  手工加可真篏Q这里有个好办法。把目录C:\eclipse2.1.3\eclipse\workspace\myplugin\下的.classpath文g拯到C:\eclipse2.1.3\eclipse\workspace\myplugin2目录p了。所有关于库引用的设|全保存在这个文件中。最后别忘记h一下项目,如下图所C:  </p> <p> <img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-102058527.png" o:title="" /> </p> <p> <br />附注说明Q?/p> <p>  有些文章在这里是用“文?gt;导入...>外部插g和段”来提供插g开发支持库的引用,本文不采用这U方法,因ؓq种会将支持库(也是一U插仉目)会新建很多相应项目,让开发界面显得很乱。还不如本文所用的建立库引用变量的Ҏ方便z。 ?br />   </p> <p>四、写源代码。?<br />  a) 新徏一个包。方法如下图所C。?<br />   <img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-102058529.png" o:title="" /></p> <p>  包名如下Q?</p> <p>   <img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-1020585211.png" o:title="" /><br />   <br />  l果如下Q?</p> <p>   <img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-1020585213.png" o:title="" /><br /><br />   <br />  b) 然后上一章的myplugin的SampleAction直接Ud本项目myplugin2中就可以了(Eclipse支持鼠标拖拉操做Q。?<br />  c)  本文SampleAction做了一些小修改Q删除了注释和构造函敎ͼ。代码如下:  <br /></p> <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"> <tbody> <tr> <td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">public class SampleAction implements IWorkbenchWindowActionDelegate {   <br />    private IWorkbenchWindow window;   <br />    public void run(IAction action) {   <br />        //q是打开一个提C窗口 ?<br />        MessageDialog.openInformation(window.getShell(), "myplugin 插g", "q是手工做的插g");   <br />    }   <br />    public void selectionChanged(IAction action, ISelection selection) {}   <br />    public void dispose() {}   <br />    public void init(IWorkbenchWindow window) {   <br />        this.window = window;   <br />    }   <br />}  </td> </tr> </tbody> </table> <p>   </p> <p>五、在plugin.xml文g中加入扩展点的代码。?<br />  库将本项目plugin.xml文g打开Qƈ转到其源代码视图。将如下代码加入到?lt;/runtime>”之后。(q些xmlq是从上一章的目搬过来的  <br /></p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"> <tbody> <tr> <td style="WORD-WRAP: break-word" bgcolor="#f3f3f3"><requires>   <br />      <import plugin="org.eclipse.core.resources"/>   <br />      <import plugin="org.eclipse.ui"/>   <br /></requires>   <br /><extension point="org.eclipse.ui.actionSets">   <br />      <actionSet label="h操作? visible="true" id="myplugin.actionSet">   <br />         <menu label="h菜单" id="sampleMenu">   <br />            <separator name="sampleGroup"> </separator>   <br />         </menu>   <br />         <action   <br />               label="h操作"   <br />               icon="icons/sample.gif"   <br />               class="com.glchengang.SampleAction"   <br />               tooltip="HelloQEclipse world"   <br />               menubarPath="sampleMenu/sampleGroup"   <br />               toolbarPath="sampleGroup"   <br />               id="com.glchengang.SampleAction">   <br />         </action>   <br />         <action   <br />               label="h操作Q?   <br />               icon="icons/sample.gif"   <br />               class="com.glchengang.SampleAction"   <br />               tooltip="HelloQEclipse worldQ?   <br />               menubarPath="sampleMenu/sampleGroup2"   <br />               toolbarPath="sampleGroup2"   <br />               id="com.glchengang.SampleAction2">   <br />         </action>   <br />      </actionSet>   <br />   </extension>  </td> </tr> </tbody> </table>   <br />说明Q ?br />  a) requires域中定义了该插g所要用的依赖插g,随着开发的不断深入,q里会填加更多的引?现在两项够了?<br />  b) 在extension中说明了要们要扩展org.eclipse.ui. actionSets扩展? <actionSet>?.</ actionSet >表示一个actionl?按钮、菜?。还有其它类型的扩展点,如org.eclipse.ui.views是视囄扩展点,org.eclipse.ui.editors是编辑器的扩展点Q各U扩展点在eclipse的帮助中有详l的说明。label是显C的名称。id是唯一标识W,只要保证在plugin.xml文g不存在重复的idp了,q里以包路径和类名的l合来做为id。?<br />  c) <menu>?</menu>表示菜单 separator标签是一个结束符Q它可以对菜单分l?<br />  d) <action>....</action>表示按钮。Icon是图片的路径Q绝对\径是什么大家实际对照就知道了,如果eclipse找不到这个图片,默认是一个红色实心小框。Class是这个按钮所对应的类Q注意把包名写全Q这h较规范些。menubarPath表示把这个action做成一个菜单放在上?lt;menu>?</menu>定义的主菜单下。toolbarPath表示把这个action做成一个工h按钮。在q里Z方便比较我将q个action的设|复制成了两份,大家可以自己Ҏ其中的设|,然后看看实际效果。?<br />  e) 各详l的plugin.xml大家可以参考eclipse自带的帮助文Ӟq里仅做一个入门性的说明。?<br />   <br />六、按钮前面一章所说的Ҏq行插gQ运行之前注意将原来那个向导做的myplugin目关闭掉,关闭ҎQ鼠标右键点L目Q>弹出菜单中选择关闭目Q。插件效果如下图  <br /><br />   <img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-1020585215.png" o:title="" /><br /><img src ="http://www.tkk7.com/zhangrenquan/aggbug/89332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhangrenquan/" target="_blank">kelven</a> 2006-12-21 17:34 <a href="http://www.tkk7.com/zhangrenquan/articles/89332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JSP 2.0开发Web应用E序http://www.tkk7.com/zhangrenquan/articles/85776.htmlkelvenkelvenWed, 06 Dec 2006 03:01:00 GMThttp://www.tkk7.com/zhangrenquan/articles/85776.htmlhttp://www.tkk7.com/zhangrenquan/comments/85776.htmlhttp://www.tkk7.com/zhangrenquan/articles/85776.html#Feedback0http://www.tkk7.com/zhangrenquan/comments/commentRss/85776.htmlhttp://www.tkk7.com/zhangrenquan/services/trackbacks/85776.html
  从机预订系l、银行系l到购物pȝQWeb上到处都在应用JSP技术。新发布?.0版是对JSP1.2的升U,增加了一些有的新特性。JSP2的目标是使动态网늚设计更加ҎQ而且无需学习Java~程语言?br />
  本文内容包括Q?br />
  提供h丰富CZ代码的教E来使你熟悉JSP2.0

  介绍JSP2.0的新Ҏ?

  提供利用JSP2.0开发应用程序的一些体会给Z一些示例代码,对这些代码稍加修改即可用于你自己的应用程序?

  如果你还不熟悉JSPQ那么直接从JSP2.0入手是一个不错的L。但是如果希望学习JSP1.2Q也怽需要从JSP教程开始学习?

  JSP 2.0

  JSP 2.0是对JSP 1.2的升U,增加了几个有的新特性,可以使Web应用E序设计人员和开发h员的工作更容易一些。JSP 2.0的目标是比以前更易于使用Q更重要的是无须学习Java语言本n可以用它。它增加了一U称为SimpleTag的新扩展机制来简化标{APIQTag APIQ?br />
  除了其他一些改q外QJSP 2.0引入的最主要的新Ҏ包括:

  一U简单的表达式语aQELQ,能够用来ҎCJSP面讉K数据Q这U表辑ּ语言化了ZJSP的不含脚本的应用E序的编写,不需要用Java Scriptlet或者Java表达式;

  用于直接使用JSP技术来定义可重用的自定义行为的新语法,该语法?tag?tagx文gQ这cL件可由开发h员或者网作者编写;
3XML语法得到了实质性的改进Q增加了新的标准文g扩展名(.tagx用于标签文gQ?jspx用于JSP文gQ?br />
  本文主要讨论表达式语a、简化的标签API和标{文件。相信目前的JSP开发h员将会发现这些重要的Ҏ不但有,而且非常有用?Z要从1.2跨越?.0Q?br />
  在Java规格hQJSR 152Q中版本h初定?.3。但是正如你在后面看到的那P׃q些新特性对JSP应用E序的开发模型生了如此深刻的媄响,专家l感到有必要把主版本号升U到2.0Q这h能充分反映这U媄响。此外,新的版本号也有助于把开发h员的注意力吸引到q些有趣的新Ҏ上来。o人欣慰的是,所有合法的JSP1.2面同时也是合法的JSP2.0面?br />
  JSP 2.0h

  在着手学习JSP 2.0之前Q你需要一个支持JSP2.0和Java Servlet 2.4规范的JSP环境。幸q的是,Jakarta Tomcat 5.0Qalpha试版)支持新的JSP2.0和Servlet 2.4规范Q可以从http://jakarta.apache.org/builds/jakarta-tomcat/release/v5.0.4-alpha/下蝲q安装Tomcat 5.0?

  JSP表达式语a

  向JSP|页传递信息是通过JSP scoped属性和h参数完成的。专门ؓ|页作者量w定做的一U表辑ּ语言QELQ把JSP scoped属性提升ؓ从业务逻辑向JSP面传递信息的标准方式。但是要注意Q尽这U表辑ּ语言是JSP的一个重要特性,它ƈ不是一U通用的程序语a。它仅仅是一U数据访问语aQ可以方便地讉K和处理应用程序数据,而无需使用scriptlet或者请求时Qrequest-timeQ表辑ּ的倹{?

  在JSP2.0之前Q网作者只能用表辑ּQ?= aName %Q访问系l的|比如下面的例子:

QsomeTags:aTag attribute="Q?= pageContext.getAttribute("aName") %Q?Q?
  或者用自定义JavaBeanslg的|

Q?= aCustomer.getAddress().getCountry() %Q?/font>
  表达式语a允许|页作者用简单的语法讉K对象。比如要讉K一个简单变量,可以像下面这样写Q?

QsomeTags:aTag attribute="${ aName}"Q?
  而访问嵌套的JavaBeans属性,则可以像下面q样写:

${ aCustomer.address.country}


  你可能会问,q不是JavaScript的语法吗Q完全正!如果你用过JavaScriptQ就会感到非常轻松,因ؓ表达式语a正是借用了访问结构化数据的JavaScript语法?

  --------------------------------------------------------------------------------

  注意Q?br />
  表达式语a最初是作ؓJSP标准标签库(JSTLQ?.0的一部分而开发的QJSTL是一U标准标{ֺQ它提供寚w用的、结构化的Q务的支持Q如q代和条件、XML文档处理、国际化和利用SQL讉K数据库等。JSTL规范是由JSR 52专家l开发的。关于JSTL的介l,请参见Faster Development with JSTLQ用JSTL加速开发).

          

【字体:?】?font color="#ff0000">报告错误】?font color="#ff0000">q入软g交流?/font>】【关闭?

讉K应用E序数据

  可以使用点号q算W(.Q访问作为对象属性的应用E序数据Q也可用方括号q算W[‘name’]讉K命名的数l元素?/font>

  表达?{ data}表示名ؓdata的scoped变量。可以用点P.Q或ҎP[]Q运符从集合中索属性|

  点号q算W用于访问命名的属性,比如表达?{ customer.name}表示scoped变量customer的name属性;Ҏ可符可用于检索命名的属性,比如?{ customer[“name”]}中。也可以通过${ customers[0]}的Ş式来讉K集合customers中的W一V?

  表达式语al一了对点号和方括号q算W的处理Q因?{ customer.name}?{ customer[“name”]}是等L。正如你看到的那P表达式必M?{ 和}包围h?/font>

  EL的标识符求值方式是使用PageContext.findAttribute(String)Q把标识W作Z个属性来查找它的倹{如果没有找到该属性,则返回null?/font>

  q算W?/font>

  表达式语a支持术q算W、关p运符和逻辑q算W,以完成大多数的数据处理操作。此外,它还提供了一个用于测试一个对象是否ؓI的Ҏq算W。运符如表1所C。你可以使用emptyq算W判断某个集合或字符串是否ؓI。比方说Q只有当要求的命名参数param没有l出Ӟ表达?{ empty param.name}才返回真。Emptyq算W可以与?”运符一起用,比如${ !empty param.name}当要求的命名参数param存在时返回真?/font>

  ?Q表辑ּ语言q算W?/font>


q算W?/font>
说明
+?/font>-?/font>*?/font>/ ?div?/font>% ?mod模(求余Q?/font>== ?={于!= ?!=不等?/font>Q??ltQ??gt大于Q? ?le于{于Q? ?ge大于{于&& ?and逻辑?/font>|| or or逻辑?/font>! ?not逻辑?/font>empty查是否ؓI?/font>a ? b : c条gq算W?/font>

  隐含对象

  除了q算W外Q表辑ּ语言q定义了一些隐含对象以支持|页作者访问需要的应用E序数据。表辑ּ语言定义的隐含对象如?所C,后面给Z用这些隐含对象的一个例子?br />
  ?Q表辑ּ语言中的隐含对象

隐含对象
内容
applicationScope应用E序范围内的scoped变量l成的集?/font>cookie所有cookiel成的集?/font>headerHTTPh头部Q字W串headerValuesHTTPh头部Q字W串集合initParam全部应用E序参数名组成的集合pageContext当前面的javax.servlet.jsp.PageContext对象pageScope面范围内所有对象的集合param所有请求参数字W串l成的集?/font>paramValues所有作为字W串集合的请求参?/font>requestScope所有请求范围的对象的集?/font>sessionScope所有会话范围的对象的集?/font>
  表达式语a的例?br />
  如你所aQ网作者无d习Java也能够用这U表辑ּ语言。示例代?昄了一些表辑ּ的例子和隐含对象的用?

  代码CZ1: ex1.jsp

  要运行这个例子,请参照以下步骤,q里我们假定Tomcat 5.0安装在c:\tomcat5.0下?br />
  切换目录?c:\Tomcat5.0\webapps\jsp-examples 创徏新目录,名字可以是Q意的Q比如jsp2-tutorial切换到jsp2-tutorialQ把ex1.jsp复制q保存到该目录下启动Tomcat 5服务器:指向“开始?Q“程序?Q“Apache Tomcat 5.0”,单击“Apache Tomcat 5.0”来启动Tomcat在浏览器中输入http://localhost:8080/jsp-examples/jsp2-tutorial/ex1.jsp你将看到cM?所C的画面。用表辑ּ语言p么简单!


?QJSP表达式语a和隐含对?/font>

  --------------------------------------------------------------------------------

  注意: 在本文中Q所有的JSP文g都保存在c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial目录下?

  --------------------------------------------------------------------------------

  填充表单例子

  隐含对象可用于读取填充表单的数据。代码示?l出了一个简单的表单Q该表单提示用户输入一个名字?

  代码CZ2: form.jsp

QHTMLQ?br />QHEADQ?br />QTITLEQForm ContentQ?TITLEQ?br />Q?HEADQ?br />
QBODYQ?br /> QH3QFill-out-formQ?H3Q?br /> QPQ?br /> QFORM action="form.jsp" method="GET"Q?Name = Qinput type="text" name="name" value="${
param['name']}"Q?Qinput type="submit" value="Submit Name"Q?br /> Q?FORMQ?
 QPQThe Name is: ${param.name}
Q?BODYQ</HTMLQ?/font>
  在本例中Q当用户输入名字q单几Z提交”按钮时Q输入的名字׃昄同一面中的“The Name is:”字样后面,如图2所C?br />
  同样Q运行这个例子只需要把form.jsp复制到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial下ƈ用浏览器打开它?br />

?Q表单处?/font>

           

【字体:?】?font color="#ff0000">报告错误】?font color="#ff0000">q入软g交流?/font>】【关闭?

定义和用函?br />
  表达式语a允许你定义可在表辑ּ中调用的函数。函数必M为publiccM的public staticҎ~写。函Cl定义,它的{֐QsignatureQ就映射到标{ֺ描述W(TLDQ中?br />
  Z说明函数的用,我们举一个简单的例子Q把两个数相加。首先要~写求两C和的JavaҎ代码Q如代码CZ3所C,q里定义了一个静态方法,它接收两个字W串参数Q把它们解析成整数ƈq回它们的和?br />
  代码CZ3: Compute.java

package jsp2.examples.el;
import java.util.*;
public class Compute {
 public static int add(String x, String y) {
  int a = 0;
  int b = 0;
  try {
   a = Integer.parseInt(x);
   b = Integer.parseInt(y);
  }catch(Exception e) {
  }
  return a + b;
 }
}

  用javac把这D代码编译成功后Q下一步就要把函数的签名映到标签库。代码示?说明了如何把add函数映射到包含函数实现和函数{֐的类。后面将说明把这D代码添加到哪儿?br />
  代码CZ4: 函数描述W?br />
QfunctionQ?br /> QdescriptionQadd x and yQ?descriptionQ?br /> QnameQaddQ?nameQ?br /> Qfunction-classQjsp2.examples.el.Compute Q?function-classQ?br /> Qfunction-signatureQint add(java.lang.String,java.lang.String) Q?function-signatureQ?br />Q?functionQ?/font>
  现在我们可以编写一个JSP面来用这个函数。代码示?是包含两个字D늚一个表单,用户输入两个数字q按下“求和”按钮,׃调用上面的函数ƈ把两个数相加Q结果在同一个页面中昄出来?br />
  代码CZ5: math.jsp

Q?@ taglib prefix="my" uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib %Q?br />QHEADQ<TITLEQFunctionsQ?TITLEQ</HEADQ?br />QBODYQ?br />QH3QAdd NumbersQ?H3Q?br />QPQ?br />QFORM action="math.jsp" method="GET"Q?X = Qinput type="text" name="x" value="${ param["x"]}"Q?br />QBRQ?br />Y = Qinput type="text" name="y" value="${param["y"]}"Q?br />Qinput type="submit" value="Add Numbers"Q?br />Q?FORMQ?br />QPQThe sum is: ${my:add(param["x"],param["y"])}
Q?BODYQ?br />Q?HTMLQ?/font>
  要运行这个例子:

  复制Compute.javaq保存到C:\Tomcat5.0\webapps\jsp-examples\WEB-INF\classes\jsp2\examples\el下;使用javac~译Compute.javaQ编辑文件C:\Tomcat5.0\webapps\jsp-examples\WEB-INF\jsp2\jsp2-example-taglib.tldQ把代码CZ4中的代码D|加到文g中最后一个</functionQ标{之后,Q?taglibQ标{之前;复制math.jspq保存到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial下;用浏览器打开该文件?

  如果一切正常,应该会看到类似如?所C的H口?


?Q用函?

  标签处理?/b>

  JSP 1.2中传l的标签处理API׃允许标签体中包含scriptlet而变得复杂,但是现在利用表达式语a可以~写不含scriptlet的JSP|页。最l,JSP 2.0引入了一U新的标{扩展机ӞUCؓ“简单标{扩展”,q种机制有两U用方式:

  Java开发h员可以定义实现接口javax.servlet.jsp.tagext.SimpleTag的类; 不懂Java的网늼写h员则可以使用标签文g?

  首先来看W一U方式,代码CZ6l出了一个简单的标签处理器,它的作用仅仅是打印“This is my first tag! ”?br />
  代码CZ6: HelloTag.java

package jsp2.examples.simpletag;
import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
/** * SimpleTag handler that prints "This is my first tag!" */ public class HelloTag extends SimpleTagSupport {
 public void doTag() throws JspException, IOException {
  getJspContext().getOut().write("This is my first tag!");
 }
}

  ~译成功后,下一步就要在TLD中定义一个标{描q符Q下面是标签描述W的例子?

  代码CZ7: 标签描述W?

QtagQ?br /> QdescriptionQPrints this is my first tagQ?descriptionQ?
 QnameQhelloQ?nameQ?br /> Qtag-classQjsp2.examples.simpletag.HelloTagQ?tag-classQ?br /> Qbody-contentQemptyQ?body-contentQ?br />Q?tagQ?/font>
  最后再~写一个用上q标{JSP面文gQ见代码CZ8?

  代码CZ8: helloworld.jsp

Q?@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %Q?br />QHTMLQ?br />QHEADQ?br />QTITLEQSimple Tag HandlerQ?TITLEQ?br />Q?HEADQ?br />QBODYQ?br />QH2QSimple Tag HandlerQ?H2Q?br />QPQ?br />QBQMy first tag printsQ?BQ? Qmytag:hello/Q?br />Q?BODYQ?br />Q?HTMLQ?/font>
  要运行这个例子:

  复制HelloTg.javaq保存到C:\Tomcat5.0\webapps\jsp-examples\WEB-INF\classes\jsp2\examples\simpletag下;使用javac~译HelloTag.javaQ把代码CZ7中的标签描述W添加到文gC:\Tomcat5.0\webapps\jsp-examples\WEB-INF\jsp2\jsp2-example-taglib.tld中的Q?taglibQ之前;复制helloworld.jspq保存到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial目录中;用浏览器打开helloworld.jsp?

  如果一切正常,应该会看到类似如?所C的画面?


?Q简单标{֤理器



标签文g

  使用单标{扩展机制的另一U方法是通过标签文g。标{文件是一U资源文Ӟ|页作者可以利用它抽取一DJSP代码Q通过定制功能来实C码的复用。换句话_标签文g允许JSP|页作者用JSP语法创徏可复用的标签库。标{文件的扩展名必L?tag”?br />
  明用标{文件是多么ҎQ考虑一下代码示?。没错,q就是一个标{文Ӟ

  代码CZ9: greetings.tag

Hello there. How are you doing?
  一旦定义了标签文gQ就可以在JSP|页的编写中使用q种定制的功能。比如代码示?0中的JSP|页?br />
  代码CZ10: chat.jsp

Q?@ taglib prefix="tags" tagdir="/WEB-INF/tags" %Q?br />QHTMLQ?br />QHEADQ?br />QTITLEQJSP 2.0 Examples - Hello World Using a Tag FileQ?TITLEQ?br />Q?HEADQ?br />QBODYQ?br />QH2QTag File ExampleQ?H2Q?br />QPQ?br />QBQThe output of my first tag file isQ?BQ? Qtags:greetings/Q?br />Q?BODYQ?br />Q?HTMLQ?/font>
  要运行这个例子:

  复制标签文ggreetings.tagsq保存在c:\Tomcat5.0\webapps\jsp-examples\WEB-INF\tags 目录下;复制JSP|页文gchar.jspq保存在c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial 目录下;用浏览器打开chat.jsp文g?

  如果一切正常,应该会看到类似如?所C的H口?


?Q简单的标签文g

  --------------------------------------------------------------------------------

  注意: 重要的是要注意到q里没有为问候标{写TLDQ而是创徏了一个标{文件ƈ攑֜Ҏ的目录中Q然后用taglib指o导入q直接用它?br />  --------------------------------------------------------------------------------

  另一个标{文件的例子

  标签文g可以作ؓ模板使用。考虑代码CZ11中的标签文gdisplay.tagQ这个例子是ҎTomcat 5.0中的面板的例子改写的。指令attributecM于TLD中的QattributeQ元素,允许声明自定义的动作属性?br />
  代码CZ11: display.tag

Q?@ attribute name="color" %Q<%@ attribute name="bgcolor" %Q<%@ attribute name="title" %Q?br />QTABLE border="0" bgcolor="${color}"Q?br />QTRQ?br />QTDQ<BQ?{title}Q?BQ?Q?TDQ?br />Q?TRQ?
QTRQ?
QTDQ?bgcolor="${ bgcolor}"Q?Qjsp:doBody/Q?Q?TDQ?br />Q?TRQ?br />Q?TABLEQ?/font>


  代码CZ12l出了用上q标{一个简单的JSP面?br />
  代码CZ12: newsportal.jsp

Q?@ taglib prefix="tags" tagdir="/WEB-INF/tags" %Q?br />QHTMLQ?br />QHEADQ?br />QTITLEQAnother Tag File ExampleQ?TITLEQ?br />Q?HEADQ?br />QBODYQ?br />QH2Q?News Portal: Another Tag File ExampleQ?H2Q?br />QTABLE border="0"Q?br />QTR valign="top"Q?br />QTDQ?br />Qtags:display color="#ff0000" bgcolor="#ffc0c0" title="Travel"Q?br />Last French Concorde Arrives in NY
Qbr/Q?Another Travel Headline
Qbr/Q?Yet Another Travel Headline
Qbr/Q?
Q?tags:displayQ?br />Q?TDQ?br />QTDQ?
Qtags:display color="#00fc00" bgcolor="#c0ffc0" title="Technology"Q?
Java for in-flight entertainment
QBRQ?
Another Technology Headline
QBRQ?br />Another Technology Headline
QBRQ?
Q?tags:displayQ?br />Q?TDQ?br />QTDQ?br />Qtags:display color="#ffcc11" bgcolor="#ffffcc" title="Sports"Q?br />American FootballQBR/Q?br />NBAQBR/Q?
SoccerQBR/Q?br />Q?tags:displayQ?
Q?TDQ?
Q?TRQ?br />Q?TABLEQ?br />Q?BODYQ?br />Q?HTMLQ?/font>
  要运行这个例子:

  复制文gdisplay.tagq保存在c:\Tomcat5.0\webapps\jsp-examples\WEB-INF\tag 下;复制文gnewsportal.jspq保存到c:\Tomcat5.0\webapps\jsp-examples\jsp2-tutorial下;用浏览器打开newsportal文g?

  l果应该会得C?cM的画面?


?Q把标签文g用作模板

  l论

  JSP 2.0使得快速开发和l护动态网|以前更加ҎQ尽“Java”一词出现在JSP中,但用JSP2.0Q网作者无d习JavaE序语言本nQ就能开发出全新的动态网c本文中的例子说明了使用JSP2.0的新Ҏ开发动态网|多么Ҏ?


kelven 2006-12-06 11:01 发表评论
]]>
tomcat5下设|EL(expression language)http://www.tkk7.com/zhangrenquan/articles/85773.htmlkelvenkelvenWed, 06 Dec 2006 02:53:00 GMThttp://www.tkk7.com/zhangrenquan/articles/85773.htmlhttp://www.tkk7.com/zhangrenquan/comments/85773.htmlhttp://www.tkk7.com/zhangrenquan/articles/85773.html#Feedback0http://www.tkk7.com/zhangrenquan/comments/commentRss/85773.htmlhttp://www.tkk7.com/zhangrenquan/services/trackbacks/85773.html
Ҏ一Q?br />            在每个jsp面d<%@ page isELIgnored="false" %>

Ҏ二:
            修改web.xml中的<web-app>标记?br />            <web-app xmlns="q样OK?img height="1" src="http://java.ccidnet.com/art/3741/20030705/down_info.asp?id=30991" width="1" border="0" />

kelven 2006-12-06 10:53 发表评论
]]>
Eclipse 插g安装http://www.tkk7.com/zhangrenquan/articles/83181.htmlkelvenkelvenFri, 24 Nov 2006 01:56:00 GMThttp://www.tkk7.com/zhangrenquan/articles/83181.htmlhttp://www.tkk7.com/zhangrenquan/comments/83181.htmlhttp://www.tkk7.com/zhangrenquan/articles/83181.html#Feedback0http://www.tkk7.com/zhangrenquan/comments/commentRss/83181.htmlhttp://www.tkk7.com/zhangrenquan/services/trackbacks/83181.htmle:eclipse_plugins
        |--vssplugin
             |--eclipse
                |-plugins(新徏Qeclipse会自动检查features和plugins文g夹下的内?
                    |---org.vssplugin_1.6.1
按上面示例,建好之后Q回到eclipse文g夹,新徏一个links目录Q在该目录下Q新Z个文件vss1_6_1.link(文g名Q?Q内容ؓ:path=e:/eclipse_plugins/vsspluginQ让eclipse自动查vssplugin下的features或plugins文g夹)打开eclipseQ即可看到菜单栏上多了vss选项。如果不成功Q删除configuration下,除config.ini的所有文件夹Q重启eclipse卛_?br />   e:eclipse
       |--links
         |---vss1_6_1.link(配置其它插gӞ新徏相应的link文g)



kelven 2006-11-24 09:56 发表评论
]]>
十大最ƺ骗眼睛的图?/title><link>http://www.tkk7.com/zhangrenquan/articles/81922.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Sat, 18 Nov 2006 06:15:00 GMT</pubDate><guid>http://www.tkk7.com/zhangrenquan/articles/81922.html</guid><wfw:comment>http://www.tkk7.com/zhangrenquan/comments/81922.html</wfw:comment><comments>http://www.tkk7.com/zhangrenquan/articles/81922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhangrenquan/comments/commentRss/81922.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhangrenquan/services/trackbacks/81922.html</trackback:ping><description><![CDATA[<p> <font color="#ff0000" size="4">1.柱子是圆的还是方的?不仔l看q真以ؓ是方的!<br /></font> </p> <p> <img alt="" src="http://yaosansi.com/blog/attachments/month_0610/120061030164152.jpg" /> </p> <p> <font color="#ff0000"><font style="FONT-SIZE: 18px">2.据说能看?张脸的智商有一癑օ十了 <br /><img alt="" src="http://yaosansi.com/blog/attachments/month_0610/q2006103016423.jpg" /><br /><font color="#000000"> </font><font style="FONT-SIZE: 18px"><font color="#ff0000">3.狮子在哪? </font></font><br /><img alt="" src="http://yaosansi.com/blog/attachments/month_0610/920061030164219.jpg" /><br />4.那个U衣女h是真实的q是拼图里的??? <br /><img alt="" src="http://yaosansi.com/blog/attachments/month_0610/p20061030164229.jpg" /><br />5. 十二个hq是十三个hQ?br /><img alt="" src="http://yaosansi.com/blog/attachments/month_0610/920061030164249.gif" /><br /><br /><br /><img alt="" src="http://yaosansi.com/blog/attachments/month_0610/j20061030164310.gif" /><br />6.有几个黑??? <br /><img alt="" src="http://yaosansi.com/blog/attachments/month_0610/w20061030164324.jpg" /><br />7.是静的还是动? <br /><a title="在新H口打开囄" target="_blank"><img alt="" src="http://yaosansi.com/blog/attachments/month_0610/9200610301642190458e.jpg" width="500" /></a><br />8.看得出图里有一张脸? <br /><br /><a title="在新H口打开囄" target="_blank"><img alt="" src="http://yaosansi.com/blog/attachments/month_0610/c2006103016479.jpg" width="500" /></a><br /><font color="#000000">  <br /></font><font style="FONT-SIZE: 18px"><font color="#ff0000">9.一张只要你能在图中扑և9颗心可以许个愿望而且它会马上实现的神奇图片!q且能和自己心爱的h在一P但是如果你看了这q图不回帖或半途而废,你将成ؓ天刹孤星 ,孤独l?.希望大家认真观察.能找出几颗算几颗.扄多.你将来越q福.千万别看了图不找...后果自负.信不信由?, 天国秘的照?预测你一生的q福 </font></font><br /><br /><img alt="" src="http://yaosansi.com/blog/attachments/month_0610/v20061030164723.jpg" /><br /><br />10. 看着黑点w体前后Ud,发现了什么?<font color="#000000"></font><br /></font></font></p> <p> </p> <!--NEWSZW_HZH_BEGIN--> <a title="在新H口打开囄" target="_blank"> <img alt="" src="http://yaosansi.com/blog/attachments/month_0610/h20061030164732.jpg" width="500" /> </a> <br clear="all" /> <br /><img src ="http://www.tkk7.com/zhangrenquan/aggbug/81922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhangrenquan/" target="_blank">kelven</a> 2006-11-18 14:15 <a href="http://www.tkk7.com/zhangrenquan/articles/81922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cvs权限讄http://www.tkk7.com/zhangrenquan/articles/54725.htmlkelvenkelvenFri, 23 Jun 2006 08:40:00 GMThttp://www.tkk7.com/zhangrenquan/articles/54725.htmlhttp://www.tkk7.com/zhangrenquan/comments/54725.htmlhttp://www.tkk7.com/zhangrenquan/articles/54725.html#Feedback0http://www.tkk7.com/zhangrenquan/comments/commentRss/54725.htmlhttp://www.tkk7.com/zhangrenquan/services/trackbacks/54725.html假设有用?Qlxw ;用户2Qzxh
有用?的模?:lxwdir;用户2的模?zxhdir
要求 lxw 只能讉Klxwdir;zxh只能讉Kzxhdir


W?步,讄CVS的库配置文gQ模块CVSROOTQ的讉K权限
ҎQ徏立超U用L工作目录 WINCVSADMIN
       a.以cvsnt服务器超U用户administrtor 登陆 wincvs
       b.CHECKOUT 库控制文?checkout moudel 'cvsroot',此目录下的文件ؓCVS的高U配|文Ӟ可以在本地进行修改,提交Q本w在版本控制之中
       c.修改CVSRoot的访问权限,在命令行输入如下命o  #之后明,不需要输?每行命o要单独执行,q是4条命?br />         cvs chacl default:n          #取消所有用L默认权限
         cvs chacl administrator:rcw  #讄Administrator拥有所有权?d;创徏和删?写入
         cvs chown administrator      #更改的拥有者Administrator
         cvs lsacl                   #察看权限的设|情?br />W?步,建立CVS的用?br />       正常可以用WINNT pȝ的用户作为CVS 的用P讉KCVS Q但是这U方式安全性太?br />       可以建立CVS 自己的用?br />       a.建立WINNTpȝ用户 CVSUSERQ权限设Z般用户就可以Q只要能讉KWINNT可?
       b.建立密码文gPASSWD,
           直接在服务端 CVSROOT 目录下徏立文件就可以 PASSWD
           Z安全考虑Q不要将 passwd列在 checkoutlist 文g里面?
       C.建立CVS用户
          在WINCVS 命o行下输入命o
          cvs passwd -a -r cvsuser zxh         #建立ZXH用户与系l用户cvsuser有一L权限,回R后提C入两ơ口?br />          cvs passwd -a -r cvsuser lxw         #建立lxw用户与系l用户cvsuser有一L权限,回R后提C入两ơ口?br />          cvs passwd -a -r administratro administrator #建立administrator用户与系l用户administrator有一L权限,回R后提C入两ơ口?br />          可以看到PASSWD 文g多了两行
          zxh:CUXQwLMdoZHNs:cvsuser     #中间为加密的密码,密码使用Unix标准的crypt()函数加密
          lxw:ZTUCMKUkZ6ap2:cvsuser    
          administrator:oN2Stm4NIf31Q:administrator
W?? 使用CVS用户登陆
       ׃CVS 在默认模式下,是采用系l用L陆的,q就要修攚w|文?CONFIG
       讄文gCONFIGZ改状?br />       加入如下一?br />       SystemAuth=no  #yes 默认?表示 如果用户在PASSWD文g中不存在,qpȝ用户查权限是否正?br />                      #no   表示用PASSWD查用户密码权限是否正?br />       之后提交
       Q在讄CONFIG 文gSystemAuth=no  之后
        需要在cvs 控制目录cvsroot\ 下徏立admin文g  
        q个文g是指定CVSNT的管理员列表的文ӞCVSNTҎq个文g来判断一个用h否是理员。文件的内容很是一个用户列表。如下:
user1
  user2
  user3
q些代表user1,user2,user3都是理?Q?br />在此之前 cvs服务器的管理员用户作ؓ自己的管理员用户的)



W??加入文g WRITERS ,READERS   控制用户的读写权?br />      在cvsroot目录下加入两个文本文ӞWRITERS ,READERS
      其每行内容ؓ  用户?回R
      只有加入WRITERS中的用户才能q行提交
      加入READERS中的用户只能d
      同时在两个文件中的用户只能读?br />      在writers文g中加入如?br />          zxh
          lxw  
          administrator      


W?步,    配置CVS库模块文件——modules
       a.MODUES文g设ؓ可编辑状?br />       b.在MOUDES 加入如下3?br />         CVSRoot            CVSRoot
         大狼的工作目?-a  lxwDIR
         开心的工作目录 -a  ZXHDIR
       c.保存,提交 COMMIT
W?? ?个用户分别上传工作目?br />       选中LXW的工作目?LXWDIR'       IMPORT MODULE  
       选中ZXH的工作目?ZXHDIR'       IMPORT MODULE          
       注意:上传的目录不能ؓI目?其下必须有文?啥文仉?
       上传成功?删除q?个目录OR 改名
(补充一下分l的使用ҎQ?br />分组Q将权限相同的用户划分到一l,q样方便l护。就是角色的意思,分组使用在对模块讉K权限的划分?br />ҎQ?br />a.在服务器?cvsroot 目录下新建文?group
b.建立分组 group1,group2 ,group文g内容如下
group1:user1 user2 user3
  group2:user5 user6 user7
c.之后对组q行权限划分Q和对单个用h式一P可以ɾl内用户和组h相同的权限,?选中模块Q执行如下命?br />   chacl -R default:n
      cvs chacl -R group1:rcw
      cvs lsacl  
可以使,用户 user1 user2 user3 同时h对该模块的读写和控制的权?/font>


W??下蝲目录目到本地做权限设|?CHECKOUT MODULE
       CHECKOUT MODULE        选择 大狼的工作目录 ?LXWDIR'
       CHECKOUT MODULE        选择 开心的工作目录  'ZXHDIR'
    做法是这L
      选择 菜单\remote\checkou moudule
            在打开H口?点击?..?按钮
      在打开H口中选择 大狼的工作目?
      ok 按钮
      定 按钮



W??分别讄2用户(LXW;ZXH)对各自目录的讉K权限
      选中模块 LXW ,在命令行输入如下3条命?
      cvs chacl -R default:n
      cvs chacl -R LXW:rcw
      cvs lsacl
      选中模块 ZXH ,在命令行输入如下3条命?
      cvs chacl -R default:n
      cvs chacl -R ZXH:rcw
      cvs lsacl
说明 ??R ’参数表C对模块的权限是递归的。解释一下:
如目录结构 ?dira
                               |---dira1
                               |---dira2
命oQcvs chacl default:n 只对 目录 dira 有效Q而对子目录无?br />      cvs chacl -R default:n    对目录dira及其下子目录都有?br />                              
W??已经完成了设| ?
      以用?LXW OR ZXH 登陆WINCVS 只能CHECKOU 各自的模?LXWDIR,ZXHDIR  
      q行相应的开发工作了


在执行命令cvs passwd -a -r cvsuser zxh         的时?br />在本地目?CVSROOT 目录下的PASSWD文g里没有生成相关的用户和密?br />而在服务?CVSROOT 目录下的PASSWD文g里生成了相关的用户和密码



如果是这P是一U正常现?br />原因是你没有把passwd 控制文g加入?cvs版本 控制之中—文件checkoutlist?/p>

kelven 2006-06-23 16:40 发表评论
]]>
CVS的常用命令速查手册http://www.tkk7.com/zhangrenquan/articles/53336.htmlkelvenkelvenFri, 16 Jun 2006 08:43:00 GMThttp://www.tkk7.com/zhangrenquan/articles/53336.htmlhttp://www.tkk7.com/zhangrenquan/comments/53336.htmlhttp://www.tkk7.com/zhangrenquan/articles/53336.html#Feedback0http://www.tkk7.com/zhangrenquan/comments/commentRss/53336.htmlhttp://www.tkk7.com/zhangrenquan/services/trackbacks/53336.html

CVS环境初始?br /> ============

环境讄Q指定CVS库的路径CVSROOT

tcsh
setenv CVSROOT /path/to/cvsroot
bash
CVSROOT=/path/to/cvsroot ; export CVSROOT

后面q提到远ECVS服务器的讄Q?/font>

CVSROOT=:ext:$USER@test.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSH

初始化:中心库版本库的初始化Q其实就是一个目?/font>

cvs init

目首次导入

cvs import -m "write some comments here" project_name vender_tag r_tag

目导出Q将代码从CVS库里导出

cvs checkout project_name

CVS的日怋?/font>   
=============

认修改Q确认自q修改q写入到CVS库里

cvs commit -m "write some comments here" file_name

注意QCVS的很多动作都是通过cvs commitq行最后确认ƈ修改的,在确认的前,q需要用户填写修Ҏ释,以帮助其他开发h员了解修改的原因。如果不用写-m "comments"而直接确认`cvs commit file_name` 的话Qcvs会自动调用系l缺省的文字~辑?一般是vi)要求你写入注释?br />注释的质量很重要Q所以不仅必要写,而且必须写一些比较有意义的内容:以方便其他开发h员能够很好的理解。不好的注释Q很难让其他的开发h员快速的理解Q比如: -m "bug fixed" 甚至 -m ""。好的注释,甚至可以用中? -m "在用h册过E中加入了Email地址校验"

同步最q修改:开始工作前和将自己的工作导入到CVS库里前都要做一ơ:先同?后修?/font>

cvs update -m "write some comments here" file_name

注意Q不要用项目首ơ导出后Q以后就要用cvs update在导出的目目录下进行同步了Q而不是每ơ重新cvs checkout来同步文件了。如果导出后修改了文Ӟ然后再次从导出的目目录的上一Ucvs checkout proj{于是删除了proj目录然后重新导出Q上ơ导出后的修改就全丢了?/font>

修改某个版本注释Q每ơ只认一个文件到CVS库里是一个很好的习惯Q但隑օ有时候忘了指定文件名Q把多个文g以同h释commit到CVS库里了,以下命o可以允许你修Ҏ个文件某个版本的注释Q?/font>

cvs admin -m 1.3:"write some comments here" file_name

删除文gQ?br />文g删除后,比如Q?/font>

rm file_name
cvs rm file_name
cvs ci -m "write some comments here"

以上面前2步合q的Ҏ为:

cvs rm -f file_name
cvs ci -m "why delete file"

注意Q很多cvs命o都有~写形式Qcommit=>ci; update=>up; checkout=>co; remove=>rm;

d文g 文gd后,比如Q?/font>

touch new_file
cvs add new_file
cvs ci -m "write some comments here"

d目录Q?/font>

cvs add dir_name

查看修改历史Q?/font>

cvs log file_name
cvs history file_name

查看当前文g不同版本的区?/font>

cvs diff -r1.3 -r1.5 file_name

查看当前文gQ可能已l修改了Q和库中相应文g的区?/font>

cvs diff file_name

cvs的web界面提供了更方便的定位文件修改和比较版本区别的方法,具体安装讄L后面的cvsweb使用

正确的通过CVS恢复旧版本的ҎQ?br />如果?/font>

cvs update -r1.2 file.name

q个命o是给file.name加一个STICK TAGQ?"1.2" Q虽然你的本意只是想它恢复?.2版本
正确的恢复版本的Ҏ?/font>

cvs update -p -r1.2 file_name >file_name

如果不小心已l加成STICK TAG的话Q用cvs update -A 解决

Ud文gQ文仉命名
cvs里没有cvs move或cvs renameQ因两个操作是先cvs remove old_file_nameQ然后cvs add new_file_name实现的?/font>

删除Q移动目录:
最方便的方法是让管理员直接UdQ删除CVSROOT里相应目录(因ؓCVS一个项目下的子目录都是独立的,Ud?CVSROOT目录下都可以作ؓ新的独立目Q好比一颗树Q其实砍下Q意一枝都能独立存z)Q对目录q行了修改后Q要求其开发h员重新导出项目cvs checkout project_name 或者用cvs update -dP同步?/font>

CVS BranchQ项目多分支同步开?br /> =============================

认版本里程:多个文g各自版本号不一P目C定阶D,可以l所有文件统一指定一个阶D里E碑版本P方便以后按照q个阶段里程版本号导出目Q同时也是项目的多个分支开发的基础?/font>

cvs tag release_1_0

开始一个新的里E碑Q?/font>

cvs commit -r 2

标记所有文件开始进?.x的开?/font>

注意QCVS里的revsion和Y件包的发布版本可以没有直接的关系。但所有文件用和发布版本一致的版本h较有助于l护?/font>

在开发项目的2.x版本的时候发?.x有问题,?.x又不敢用Q则从先前标记的里程:release_1_0导出一个分支release_1_0_patch

cvs rtag -b -r release_1_0 release_1_0_patch proj_dir

一些h先在另外一个目录下导出release_1_0_patchq个分支Q解?.0中的紧急问题,

cvs checkout -r release_1_0_patch

而其他h员仍旧在目的主q分?.x上开?/font>

在release_1_0_patch上修正错误后Q标C?.0的错误修正版本号

cvs tag release_1_0_patch_1

如果2.0认ؓq些错误修改?.0里也需要,也可以在2.0的开发目录下合ƈrelease_1_0_patch_1中的修改到当前代码中Q?/font>

cvs update -j release_1_0_patch_1

CVS的远E认证: 通过SSHq程讉KCVS
================================

使用cvs本n的远E认证很ȝ,需要定义服务器和用LQ用户名Q设|密码等Q而且不安全,因此和系l本地帐可证ƈ通过SSH传输是比较好的办法,通过在客h?etc/profile里设|一下内容:

CVSROOT=:ext:$USER@test.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSH

所有客h所有本地用户都可以映射到CVS服务器相应同名帐号了?/font>

如果CVS所在服务器的SSH端口不在~省?2Q或者和客户端与CVS服务器端SSH~省端口不一_有时候设|了Q?/font>

:ext:$USER@test.server.address#port:/path/to/cvsroot

仍然不行Q比如有以下错误信息Q?/font>

ssh: test.server.address#port: Name or service not known
cvs [checkout aborted]: end of file from server (consult above messages if any)

解决的方法是做一个脚本指定端口{向(不能使用aliasQ会出找不到文g错误Q:
创徏一?usr/bin/ssh_cvs文gQ?/font>

#!/usr/bin/sh
/path/to/ssh -p 34567 "$@"

然后Qchmod +x /usr/bin/ssh_cvs
qCVS_RSH=ssh_cvs; export CVS_RSH

注意Qport是指相应服务器SSH的端口,不是cvs pserver的端?/font>

CVSWEBQ提高程序员比较文g修改效率
================================

CVSWEB是CVS的WEB界面Q可以大大提高程序员定位修改的效?
使用的样例可以看Q?/font> http://www.freebsd.org/cgi/cvsweb.cgi

CVSWEB的下载:CVSWEB从最初的版本已经演化出很多功能界面更丰富的版本,q个是个人感觉觉得安装设|比较方便的Q?/font> http://www.spaghetti-code.de/software/linux/cvsweb/

下蝲解包Q?/font>

tar zxf cvsweb.tgz

把配|文件cvsweb.conf攑ֈ安全的地方(比如和apache的配|放在同一个目录下Q,
修改Qcvsweb.cgi让CGI扑ֈ配置文gQ?/font>

$config = $ENV{'CVSWEB_CONFIG'} || '/path/to/apache/conf/cvsweb.conf';

转到/path/to/apache/conf下ƈ修改cvsweb.confQ?/font>

  1. 修改CVSROOT路径讄Q?br />%CVSROOT = (
    'Development' => '/path/to/cvsroot', #<==修改指向本地的CVSROOT
    );
  2. ~省不显C已l删除的文档Q?br />"hideattic" => "1",#<==~省不显C已l删除的文档
  3. 在配|文件cvsweb.conf中还可以定制头的描qC息,你可以修?long_intro成你需要的文字

CVSWEB可不能随便开攄所有用P因此需要用WEB用户认证Q?br />先生?passwd:

/path/to/apache/bin/htpasswd -c cvsweb.passwd user

修改httpd.conf: 增加

<Directory "/path/to/apache/cgi-bin/cvsweb/">
AuthName "CVS Authorization"
AuthType Basic
AuthUserFile /path/to/cvsweb.passwd
require valid-user
</Directory>

CVS TAGS: who? when?
====================

?Id$ 加在E序文g开头的注释里是一个很好的习惯Qcvs能够自动更新其中的内ҎQfile_name version time user_name 的格式,比如Qcvs_card.txt,v 1.1 2002/04/05 04:24:12 chedong ExpQ可以这些信息了解文件的最后修改h和修Ҏ?/font>

几个常用的缺省文Ӟ
default.php

<?php
/*
* Copyright (c) 2002 Company Name.
* $Id$
*/

?>

Default.java: 注意文g头一般注释用 /* 开?JAVADOC注释?/** 开始的区别

/*
* Copyright (c) 2002 Company Name.
* $Id$
*/

package com.netease;

import java.io;

/**
* comments here
*/
public class Default {
    /**
    *
    * @param
    * @return
    */
    public toString() {

    }
}

default.pl:

#!/usr/bin/perl -w
# Copyright (c) 2002 Company Name.
# $Id$

# file comments here

use strict;

相关资源Q?/font>

CVS HOMEQ?br /> http://www.cvshome.org/

CVS FAQQ?br /> http://www.loria.fr/~molli/cvs-index.html

相关|站:
Google: CVS

CVS 免费?
http://cvsbook.red-bean.com/

CVS 命o的速查卡片Q?br /> http://www.refcards.com/about/cvs.html

了解更多详情Q参与讨论,误?b>GBUNIX论坛
Q?br />
http://www.gbunix.com/bbs/forums.html

kelven 2006-06-16 16:43 发表评论
]]>
Linux下CVS安装及配|?/title><link>http://www.tkk7.com/zhangrenquan/articles/53335.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 16 Jun 2006 08:38:00 GMT</pubDate><guid>http://www.tkk7.com/zhangrenquan/articles/53335.html</guid><wfw:comment>http://www.tkk7.com/zhangrenquan/comments/53335.html</wfw:comment><comments>http://www.tkk7.com/zhangrenquan/articles/53335.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/zhangrenquan/comments/commentRss/53335.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhangrenquan/services/trackbacks/53335.html</trackback:ping><description><![CDATA[ <p>[|上摘录Q不知道谁是真正的作者]<br />我的现在情况.<br />服务?U帽子企?(上已l安装了oracle)<br />cvs?cvsnt-2.5.03.2151-rh9-rpm.tar.gz ,?a >http://www.march-hare.com/cvspro/</a>,下蝲的是最新的</p> <p>版本</p> <p>我的安装q程:<br />认是否安装了老版本的cvs,如果有老版本的,ql删?br />[root@redhat /]# rpm -qa |grep cvs<br />libbonoboui-2.8.0.99cvs20040929-2<br />cvs-1.11.17-7.RHEL4<br />[root@redhat /]# rpm -e cvs-1.11.17-7.RHEL4<br />[root@redhat /]# rpm -qa | grep cvs<br />libbonoboui-2.8.0.99cvs20040929-2</p> <p>下载的cvs文g解压<br />[root@redhat cvs]# tar zxvf cvsnt-2.5.03.2151-rh9-rpm.tar.gz <br />cvsnt-2.5.03.2151-1.i386.rpm<br />cvsnt-database-mysql-2.5.03.2151-1.i386.rpm<br />cvsnt-database-odbc-2.5.03.2151-1.i386.rpm<br />cvsnt-database-sqlite-2.5.03.2151-1.i386.rpm<br />cvsnt-protocol-gserver-2.5.03.2151-1.i386.rpm<br />cvsnt-protocol-sserver-2.5.03.2151-1.i386.rpm<br />[root@redhat cvs]# ls<br />cvsnt-2.5.03.2151-1.i386.rpm cvsnt-database-sqlite-2.5.03.2151-1.i386.rpm<br />cvsnt-2.5.03.2151-rh9-rpm.tar.gz cvsnt-protocol-gserver-2.5.03.2151-1.i386.rpm<br />cvsnt-database-mysql-2.5.03.2151-1.i386.rpm cvsnt-protocol-sserver-2.5.03.2151-1.i386.rpm<br />cvsnt-database-odbc-2.5.03.2151-1.i386.rpm</p> <p>安装相关的rpm?之后立刻认安装)<br />[root@redhat cvs]# rpm -ivh cvsnt-2.5.03.2151-1.i386.rpm<br />Preparing... ########################################### [100%]<br />   1:cvsnt ########################################### [100%]<br />[root@redhat cvs]# rpm -qa |grep cvs<br />libbonoboui-2.8.0.99cvs20040929-2<br />cvsnt-2.5.03.2151-1</p> <p>[root@redhat src]# cvs -version</p> <p>Concurrent Versions System (CVSNT) 2.5.03 (Scorpio) Build 2151 (client/server)</p> <p>建立cvs用户l?br />[root@redhat /]# groupadd cvs<br />以上建立l的语句,不会?home中多ZQ何目录来.</p> <p>建立以后的存攄?br />[root@redhat /]# mkdir cvs<br />[root@redhat /]# cd cvs<br />[root@redhat cvs]# mkdir src<br />[root@redhat cvs]# cd src<br />[root@redhat src]# pwd<br />/cvs/src<br />[root@redhat src]# </p> <p>指定cvsl的cvsroot用户和所属的目录<br />[root@redhat src]# useradd -g cvs -G cvs -d/cvs cvsroot</p> <p>为cvsroot用户d密码<br />[root@redhat cvs]# passwd cvsroot<br />Changing password for user cvsroot.<br />New UNIX password: <br />BAD PASSWORD: it does not contain enough DIFFERENT characters<br />Retype new UNIX password: <br />passwd: all authentication tokens updated successfully.</p> <p>改变/cvs的目录属?br />[root@redhat /]# chmod 775 /cvs<br />drwxrwxr-x 4 root root 4096 Dec 7 14:14 cvs<br />[root@redhat cvs]# chmod 775 src<br />drwxrwxr-x 2 root root 4096 Dec 7 14:06 src</p> <p>对cvsq行相关的版本确?br />[root@redhat /]# cvs version<br />Concurrent Versions System (CVSNT) 2.5.03 (Scorpio) Build 2151 (client/server)</p> <p>启动cvs服务?br />[root@redhat /]# more /etc/services|grep cvspserver<br />cvspserver 2401/tcp # CVS client/server operations <br />cvspserver 2401/udp # CVS client/server operations</p> <p>如果上面没有q个内容?br />[root@redhat /]# vi /etc/services<br />来添加相关的内容</p> <p>[root@redhat /]# vi /etc/xinetd.d/cvspserver<br />service cvspserver<br />{<br />disable = no<br />flags = REUSE<br />port = 2401<br />socket_type = stream<br />protocol = tcp<br />wait = no<br />user = root<br />passenv = PATH<br />server = /usr/bin/cvs<br />server_args = -f --allow-root=/cvs pserver<br />log_on_failure += USERID<br />}</p> <p>shift+wq!<br />"/etc/xinetd.d/cvspserver" [New] 14L, 225C written<br />[root@redhat src]# ls /etc/xinetd.d/cvspserver<br />/etc/xinetd.d/cvspserver<br />[root@redhat src]# su cvsroot<br />[cvsroot@redhat src]$ pwd<br />/cvs/src<br />[root@redhat /]# service xinetd restart<br />Stopping xinetd: [ OK ]<br />Starting xinetd: [ OK ]<br />[root@redhat /]# netstat -l |grep cvspserver<br />tcp 0 0 *:cvspserver *:* LISTEN</p> <p>初始化cvs源码?新徏立一个Repository,此操作生成目?cvs/CVSROOT(或?cvs/src/CVSROOT),其下</p> <p>Z些初始化文g<br />[root@redhat src]# export CVSROOT=/cvs/src<br />[root@redhat src]# env | grep CVSROOT<br />CVSROOT=/cvs/src</p> <p>[root@redhat src]# cvs -d /cvs/src init</p> <p> </p> <p>在服务器端初|口令认?/p> <p>首先Q你可能需?<samp><span id="zvrprtz" class="file"><font face="新宋?>$CVSROOT</font></span></samp> ?<samp><span id="fnttjjr" class="file"><font face="新宋?>$CVSROOT/CVSROOT</font></span></samp> 上设定权限。见 <a >Password authentication security</a>?</p> <p> <a name="index-pserver-_0028subcommand_0029-163"> </a> <a name="index-Remote-repositories_002c-port-specification-164"> </a> <a name="index-Repositories_002c-remote_002c-port-specification-165"> </a> <a name="index-Client_002fServer-Operation_002c-port-specification-166"> </a> <a name="index-pserver-_0028client_002fserver-connection-method_0029_002c-port-specification-167"> </a> <a name="index-kserver-_0028client_002fserver-connection-method_0029_002c-port-specification-168"> </a> <a name="index-gserver-_0028client_002fserver-connection-method_0029_002c-port-specification-169"> </a> <a name="index-port_002c-specifying-for-remote-repositories-170"> </a> <a name="index-Password-server_002c-setting-up-171"> </a> <a name="index-Authenticating-server_002c-setting-up-172"> </a> <a name="index-inetd_002c-configuring-for-pserver-173"> </a> <a name="index-xinetd_002c-configuring-for-pserver-174"> </a> <!-- FIXME: this isn't quite right regarding port --> <!-- numbers; CVS looks up "cvspserver" in --> <!-- /etc/services (on unix, but what about non-unix?). -->在服务器端,需要编辑文?<samp><span id="lxvxndf" class="file"><font face="新宋?>/etc/inetd.conf</font></span></samp> ?<code><font face="新宋?>inetd</font></code> 它在正确的端口上收到一个连接的时候运?<code><font face="新宋?>cvs pserver</font></code> 命o。按照默认,端口h 2401Q当Ӟ如果客户端用 <code><font face="新宋?>CVS_AUTH_PORT</font></code> 重新~译了就会有一些不同。也可以?CVSROOT 变量(参阅 <a >Remote repositories</a>)指定或用 CVS_CLIENT_PORT 环境变量(参阅 <a >Environment variables</a>)跨越?</p> <p>如果你的 <code><font face="新宋?>inetd</font></code> ?<samp><span id="lvttphb" class="file"><font face="新宋?>/etc/inetd.conf</font></span></samp> 中允许原始的端口号定义,那么下面的命令就_了(所有命令在 <samp><span id="zjrvltn" class="file"><font face="新宋?>inetd.conf</font></span></samp> 中都是单行)Q?</p> <pre class="example"> 2401 stream tcp nowait root /usr/local/bin/cvs cvs -f --allow-root=/usr/cvsroot pserver </pre> <p class="noindent">Q你也可以?`<samp><span id="rfdrnnh" class="samp"><font face="新宋?>-T</font></span></samp>' 选项来指定一个时目录。) </p> <p>`<samp><span id="vfnjpfz" class="samp"><font face="新宋?>--allow-root</font></span></samp>' 选项指定一个允许的 <span id="pbzvltv" class="sc">cvsroot</span> 目录。试图用一个另外的 <span id="dzbtdp9" class="sc">cvsroot</span> 目录的客户将被拒l连接。如果你希望讄多个允许?<span id="jh3bv9v" class="sc">cvsroot</span> 目录Q重复设|这一选项p了。(不幸的是Q许多版本的 <code><font face="新宋?>inetd</font></code> 对参数的数量?或命令长度小有限制。通常解决Ҏ是在 <code><font face="新宋?>inetd</font></code> 中运行一?shell 脚本Q然后在脚本中调?<span id="vvxpz7x" class="sc">cvs</span> 所需的参数。) </p> <p>如果你希?<code><font face="新宋?>inetd</font></code> 使用W号服务名称来代替原始端口号Q那么把它放q?<samp><span id="lrhthvb" class="file"><font face="新宋?>/etc/services</font></span></samp> 里: </p> <pre class="example"> cvspserver 2401/tcp </pre> <p class="noindent">q且?<samp><span id="bhjrxtj" class="file"><font face="新宋?>inetd.conf</font></span></samp> 中?<code><font face="新宋?>cvspserver</font></code> 代替 <code><font face="新宋?>2401</font></code>?</p> <p>如果你的pȝ?<code><font face="新宋?>xinetd</font></code> 替代 <code><font face="新宋?>inetd</font></code>Q步骤有些不同。创Z个叫 <samp><span id="1ftl9vx" class="file"><font face="新宋?>/etc/xinetd.d/cvspserver</font></span></samp> 的文Ӟ包含下列内容Q?</p> <pre class="example"> service cvspserver { port = 2401 socket_type = stream protocol = tcp wait = no user = root passenv = PATH server = /usr/local/bin/cvs server_args = -f --allow-root=/usr/cvsroot pserver } </pre> <p class="noindent">Q如果已?<samp><span id="z7rrn7v" class="file"><font face="新宋?>/etc/services</font></span></samp> 中定?<code><font face="新宋?>cvspserver</font></code>Q可以省?<code><font face="新宋?>port</font></code> q一行。) </p> <p>做了上面的修改之后,需要重新启动你?<code><font face="新宋?>inetd</font></code>Q或者采取其它可以它重新读取初始化文g手段?</p> <p>如果讄q有ȝQ参?<a >Connection</a>?</p> <p> <a name="index-CVS-passwd-file-175"> </a> <a name="index-passwd-_0028admin-file_0029-176"> </a>因ؓ客户端以明文存储和传输口?几乎是—请?<a >Password authentication security</a>)Q通常使用了一个独立的 <span id="vfxzl9l" class="sc">cvs</span>CVS 口o文gQ这样h们访问仓库的时候不会危及定期口令的安全。这个文件是 <samp><span id="prfptzh" class="file"><font face="新宋?>$CVSROOT/CVSROOT/passwd</font></span></samp> (参阅 <a >Intro administrative files</a>)。除了只用较的域(<span id="rxnfdh7" class="sc">cvs</span> 用户名称Q可有可无的口o和服务器的用户名Uͼ以外Q它的格式和 Unix 上的 <samp><span id="vdrd7ht" class="file"><font face="新宋?>/etc/passwd</font></span></samp> 怼Q采用分号分隔。这里是个有五个表项的例?<samp><span id="rz7hxj7" class="file"><font face="新宋?>passwd</font></span></samp> 文gQ?</p> <pre class="example"> anonymous: bach:ULtgRLXo7NRxs spwang:1sOp854gDF3DY melissa:tGX1fS8sun6rY:pubcvs qproj:XR4EZcEs0szik:pubcvs </pre> <p class="noindent">Q口令?Unix 标准?<code><font face="新宋?>crypt()</font></code> 函数加密Q因此它可以直接从常?Unix <samp><span id="7ll9zhh" class="file"><font face="新宋?>/etc/passwd</font></span></samp> 文g_脓q来。) </p> <p>例子中第一行允怓Q?<span id="zdbvtxn" class="sc">cvs</span> 客户Z?<code><font face="新宋?>anonymous</font></code> 来访问,口o可以用Q意字W还可以用空口o。(q是一个站点允许匿名进行只读访问的典型用法Q“只读(read-onlyQ”部分信息的做法Q参?<a >Read-only access</a>。) </p> <p>如果他们提供各自的明文口令第二、三行允许对 <code><font face="新宋?>bach</font></code> ?<code><font face="新宋?>spwang</font></code> q行讉K?</p> <p> <a name="index-User-aliases-177"> </a>如果Ҏ供正的口oW四行允许对 <code><font face="新宋?>melissa</font></code> 讉KQ但她的 <span id="7rztxl9" class="sc">cvs</span> 操作实际运行在服务器侧?<code><font face="新宋?>pubcvs</font></code> 用户名下。虽然系l上不须?<code><font face="新宋?>melissa</font></code> 用户名,?<em>必须</em> 使用 <code><font face="新宋?>pubcvs</font></code>?</p> <p>W五行显C系l用h识可以共享:作ؓ <code><font face="新宋?>qproj</font></code> 成功认证的Q何客户实际将?<code><font face="新宋?>pubcvs</font></code> 来运行,?<code><font face="新宋?>melissa</font></code> 所做的一栗用q种Ҏ你可以在你的仓库中ؓ每个目创徏一单个׃n的系l用Pq且?<samp><span id="nnnztpx" class="file"><font face="新宋?>$CVSROOT/CVSROOT/passwd</font></span></samp> 文g中ؓ每个开发者设|一行。每行的 <span id="bzhp7lx" class="sc">cvs</span> 用户名应该不同,而系l用户名应该相同。用不同?<span id="hzblr7j" class="sc">cvs</span> 用户名目的是?<span id="dvvvjnn" class="sc">cvs</span> 在其名字下记录其动作: ?<code><font face="新宋?>melissa</font></code> 提交了项目中的一个修改,入被U录在项目历史中?<code><font face="新宋?>melissa</font></code> 名下Q而不?<code><font face="新宋?>pubcvs</font></code> 下。而共享一个系l用L原因是可以安排仓库中相关区域的权限,只有那个帐户有写权限?</p> <p>如果pȝ用户域存在的时候,全部口o鉴定 <span id="7bdf9df" class="sc">cvs</span> 命o按该用户q行Q如果没有指定系l用P<span id="dt7vdzp" class="sc">cvs</span> 单地?<span id="j7lfhfx" class="sc">cvs</span> 用户名作为系l用户名q且按此户名q行命o。无论哪U情况,如果pȝ上没有这L用户Q于?<span id="lvvx7zt" class="sc">cvs</span> 操作会失?不管客户机是否提供了正确的口??</p> <p>口o和系l用户字D都可以省略Q如果系l用户字D늜略,那么与口令分隔的冒号也省略)。例如,q将是有效的 <samp><span id="zjtntp9" class="file"><font face="新宋?>$CVSROOT/CVSROOT/passwd</font></span></samp> 文gQ?</p> <pre class="example"> anonymous::pubcvs fish:rKa5jzULzmhOo:kfogel sussman:1sOp854gDF3DY </pre> <p class="noindent">当口令字DؓI,客户的认证可以用包括I字W串在内的Q何口令。但 <span id="rtbn9f9" class="sc">cvs</span> 用户名后的分隔冒号必需存在Q即使口令ؓI?</p> <p> <span id="zrrjrnb" class="sc">cvs</span> q可借助于系l认证。认证口令的时候,服务器先?<samp><span id="fxhbhlr" class="file"><font face="新宋?>$CVSROOT/CVSROOT/passwd</font></span></samp> 文g中的用户。如果找到用P按上面说的Ҏ使用该项q行认证。如果没有找刎ͼ?<span id="rffh7j9" class="sc">cvs</span><samp><span id="7h9bhn7" class="file"><font face="新宋?>passwd</font></span></samp> 文g不存在,服务器将采用操作pȝ的用戯证机Ӟq种机制可以通过讄 <span id="jtblxl7" class="sc">cvs</span><samp><span id="7dlxrvx" class="file"><font face="新宋?>config</font></span></samp> 文g中的 <code><font face="新宋?>SystemAuth=no</font></code> 来禁止,参阅 <a >config</a>Q?</p> <p>除非pȝ中有 PAM(Pluggable Authentication Modules)Q或?<span id="dvnhtp9" class="sc">cvs</span> 服务器端~译的时候配|?(使用 <code><font face="新宋?>./configure --enable-pam</font></code> - 参?INSTALL 中的说明)Q否则默认的回调(callback)是查?<samp><span id="lvnx9n9" class="file"><font face="新宋?>/etc/passwd</font></span></samp> 中的口o。在此情况下Q将商?PAM 代替。这意味着可以配置 <span id="tr7t9ft" class="sc">cvs</span> 使用 PAM 提供的各U口令认证方?可能?UNIX passwordQNISQLDAPQ或其他)Q这取决?PAM 的全局配置文g(通常?<samp><span id="jl7tvbr" class="file"><font face="新宋?>/etc/pam.conf</font></span></samp> 或可能是 <samp><span id="zz7rjx9" class="file"><font face="新宋?>/etc/pam.d/cvs</font></span></samp>)。详l配|?PAM 的方法请参?PAM 的文档?</p> <p>注意QPAM ?<span id="pfprvj7" class="sc">cvs</span> 中用的实验Ҏ,鼓励反馈信息。如果你使用?PAM 支持Q请发邮件到 <span id="dtjb99d" class="sc">cvs</span> 的邮件列?<code><font face="新宋?>info-cvs@gnu.org</font></code> ?<code><font face="新宋?>bug-cvs@gnu.org</font></code>)?</p> <p> <strong>警告Q采?PAM 可以l系l管理员更多?</strong> <span id="p7pbhvt" class="sc">cvs</span> <strong>认证灉|性,但ƈ不比别的Ҏ有更高的安全性。详见下?/strong> </p> <p>CVS ?PAM 配置文g里需要“auth”,“account”和“session”模块。因此典型的 PAM 配置是在文g <samp><span id="l995rzr" class="file"><font face="新宋?>/etc/pam.conf</font></span></samp> 里模拟标准的 <span id="7fpzlr9" class="sc">cvs</span> pȝ <samp><span id="59nhd7v" class="file"><font face="新宋?>/etc/passwd</font></span></samp> 认证Q?</p> <pre class="example"> cvs auth required pam_unix.so cvs account required pam_unix.so cvs session required pam_unix.so </pre> <p>对等?<samp><span id="dhrlhv7" class="file"><font face="新宋?>/etc/pam.d/cvs</font></span></samp> 文g里包?</p> <pre class="example"> auth required pam_unix.so account required pam_unix.so session required pam_unix.so </pre> <p>一些系l要求给出模块的完整路径Q因?<samp><span id="vxv99vx" class="file"><font face="新宋?>pam_unix.so</font></span></samp> (Linux) 改ؓcM <samp><span id="dxfhdr7" class="file"><font face="新宋?>/usr/lib/security/$ISA/pam_unix.so.1</font></span></samp> (Sun Solaris)。参?<span id="f7jd7lf" class="sc">cvs</span> 源码发布子目?<samp><span id="r9f7jhn" class="file"><font face="新宋?>contrib/pam</font></span></samp> 中更多的配置例子?</p> <p>PAM 中指出的服务名“cvs”是默认配置中的服务名,也可以在~译前?<code><font face="新宋?>./configure --with-hardcoded-pam-service-name=&lt;pam-service-name&gt;</font></code> 重新讄?<span id="nrbdpll" class="sc">cvs</span> 也可以被讄成调用其他的名字 <code><font face="新宋?>./configure --without-hardcoded-pam-service-name</font></code>Q但q个Ҏ只有你有权控制 <span id="vxpr7nr" class="sc">cvs</span> 用什么名字时才有效?</p> <p>要知道,在用系l认证时会有安全漏洞Q?span class="sc">cvs</span> 操作时是使用pȝ中用L正规注册口oQ而该口o|络传输中是采用明码方式。见 <a >Password authentication security</a>。这点对使用 PAM 认证会有更多的问题,因ؓpȝ口o的源头是某些?LDAP 的中心服务,?LDAP 它还被用于认证别的服务?</p> <p>另一斚wQPAM 使得定期C改口令非常容易。如果对全部zdl用户一个口令系l的选项Q用L常定期改变他们的口o?</p> <p>在非 PAM 的配|中Q口令是保存?<samp><span id="79dnrvd" class="file"><font face="新宋?>CVSROOT/passwd</font></span></samp> 文g里面Q因为只有管理员用户(或有{同的权?才有此文件的修改讉K权限Q所以想用定期改变口令会很困难。可以采用设计的|页E序?set-uid E序来更新文Ӟ或者是提交h让管理员q行手动修改来更新。第一U情况下Q必记住去定期更新各自的口令可能是很困隄。第二种情况下,手工的本性将是只有绝对必要时才会M改口令?</p> <p>注意QPAM 理员应避免?<span id="vld7bhx" class="sc">cvs</span> 证明/授权(authentication/authorization)中采用配|一ơ性口?OTP。如果用 OTPQ管理员最好考虑其他?Client/Server 讉K方式。参?<a >Remote repositories</a> 获得其他Ҏ的列表?</p> <p>现在Q?span class="sc">cvs</span><samp><span id="bt79znd" class="file"><font face="新宋?>passwd</font></span></samp> 文g里加入口令的唯一Ҏ是从别处_脓而来。也许有一天,会有一条命?<code><font face="新宋?>cvs passwd</font></code>?</p> <p>不像其他?<samp><span id="75fptfv" class="file"><font face="新宋?>$CVSROOT/CVSROOT</font></span></samp> 目录下的文gQ可以在不是通过 <span id="ppptnfn" class="sc">cvs</span>来编?<samp><span id="t9lvzt9" class="file"><font face="新宋?>passwd</font></span></samp> 的地方进行编辑。这是因Z <samp><span id="7d9vf9h" class="file"><font face="新宋?>passwd</font></span></samp> 文gZؓZ的工作副本可能的安全风险。如果你的确需要将 <samp><span id="hbbdjdd" class="file"><font face="新宋?>$CVSROOT/CVSROOT</font></span></samp> 中的 <samp><span id="p9zbfld" class="file"><font face="新宋?>passwd</font></span></samp> 出,参看 <a >checkoutlist</a>?/p> <img src ="http://www.tkk7.com/zhangrenquan/aggbug/53335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhangrenquan/" target="_blank">kelven</a> 2006-06-16 16:38 <a href="http://www.tkk7.com/zhangrenquan/articles/53335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STV-p卫星|络电视(直播世界? V3.80 Build 0428 注册?/title><link>http://www.tkk7.com/zhangrenquan/articles/48926.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 30 May 2006 04:14:00 GMT</pubDate><guid>http://www.tkk7.com/zhangrenquan/articles/48926.html</guid><wfw:comment>http://www.tkk7.com/zhangrenquan/comments/48926.html</wfw:comment><comments>http://www.tkk7.com/zhangrenquan/articles/48926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhangrenquan/comments/commentRss/48926.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhangrenquan/services/trackbacks/48926.html</trackback:ping><description><![CDATA[STV-p卫星|络电视(直播世界? V3.80 Build 0428Q?006q?4?8日发布)<br />http://www.stvcn.net/download/STV.exe<br /><br />注册名:<a >www.cniso.org</a><br />注册码:個|vndYJ9-XQRJ@4-WSUG@5-XSOI@2<img src ="http://www.tkk7.com/zhangrenquan/aggbug/48926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhangrenquan/" target="_blank">kelven</a> 2006-05-30 12:14 <a href="http://www.tkk7.com/zhangrenquan/articles/48926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT十五大最佛_?(摘录)http://www.tkk7.com/zhangrenquan/articles/42394.htmlkelvenkelvenFri, 21 Apr 2006 10:35:00 GMThttp://www.tkk7.com/zhangrenquan/articles/42394.htmlhttp://www.tkk7.com/zhangrenquan/comments/42394.htmlhttp://www.tkk7.com/zhangrenquan/articles/42394.html#Feedback0http://www.tkk7.com/zhangrenquan/comments/commentRss/42394.htmlhttp://www.tkk7.com/zhangrenquan/services/trackbacks/42394.htmlAnt出现之前Q构建和部vJava应用需要用包括特定^台的脚本、Make文g、各U版本的IDE甚至手工操作的“大杂烩”。现在,几乎所有的开源Java目都在使用AntQ大多数公司的内部项目也在用Ant。Ant在这些项目中的广泛用自然导致了读者对一整套Ant最佛_늚q切需求?

本文ȝ了我喜爱的Ant技巧或最佛_践,多数是从我亲w经历的目错误或我听说的其他hl历?“恐怖”故事中得到灉|的。比如,有h告诉我有个项目把XDoclet 生成的代码放入带有锁定文件功能的版本控制工具中。当开发者修Ҏ代码Ӟ他必记住手工检出(Check outQƈ锁定所有将要重新生成的文g。然后,手工q行代码生成器,只到q时他才能够让Ant~译代码Q这一Ҏq存在如下一些问题:

  • 生成的代码无法存储在版本控制pȝ中?
  • AntQ本案例中是XdocletQ应该自动确定下一ơ构建涉及的源文Ӟ而不应由E序员手工确定?
  • Ant的构建文件应该定义好正确的Q务依赖关p,q样E序员就不必Z完成构徏而不得不按照特定序调用d?

当我开始一个新目Ӟ我首先编写Ant构徏文g。Ant文g明确地定义构建的q程Qƈ被团队中的每个程序员使用。本文所列的技巧基于这L假定QAnt构徏文g是一个必Ml编写的重要文gQ它应在版本控制pȝ中得到维护,q被定期q行重构。下面是我的十五大Ant最佛_c?/p>

1. 采用一致的~码规范

Ant用户有的喜欢有的痛恨其构建文件的XML语法。与其蟩q这一令hqh的争ZQ不如让我们先看一些能保持XML构徏文gz的Ҏ?/p>

首先也是最重要的,p旉格式化你的XML让它看上d清晰。不论XML是否观QAnt都可以工作。但是丑陋的XML很难令hL。倘若你在d之间留出IQ有规则的羃q,每行文字不超q?0列左叻I那么XML令h惊讶地易诅R再加上使用能够高亮XML语法的优U~辑器或IDE工具Q你׃会有阅读的麻烦?/p>

同样Q精选含意明、容易读懂的词汇来命名Q务和属性。比如,dir.reportsrpts?em>?/em>特定的编码规范ƈ不重要,只要拿出一套规范ƈ坚持使用p?/p>

2. ?em>build.xml攑֜目根目录中

Ant构徏文gbuild.xml可以攑֜M位置Q但是放在项目顶U目录中可以保持目z。这是最常用的规范,开发者能够在目录中找到预期的build.xml。把构徏文g攑֜根目录中Q也能够使hҎ了解目目录树中不同目录之间的逻辑关系。以下是一个典型的目目录层次Q?/p>

[root dir]
  | build.xml 
  +--src 
  +--lib (包含W三?JAR? 
  +--build (?buildd生成) 
  +--dist (?buildd生成)

?em>build.xml在顶U目录时Q假设你处于目某个子目录中Q只要输入:ant -find compile 命oQ不需要改变工作目录就能够以命令行方式~译代码。参?find告诉AntL存在于上U目录中?em>build.xmlq执行?/p>

3. 使用单一的构建文?/h3>

有h喜欢一个大目分解成几个小的构建文Ӟ每个构徏文g分担整个构徏q程的一部分工作。这实是看法不同的问题Q但是应该认识到Q将构徏文g分割会增加对整体构徏q程的理解难度。要注意在单一构徏文g能够清楚表现构徏层次的情况下不要q工E化(over-engineer)?/p>

即你把目划分为多个构建文Ӟ也应使程序员能够在项目根目录下找到核?em>build.xml。尽该文g只是实际构建工作委z下构徏文gQ也应保证该文g可用?/p>

4. 提供良好的帮助说?/h3>

应尽量构徏文g自文档化。增加Q务描q是最单的Ҏ。当你输入ant -projecthelpӞ你就可以看到带有描述的Q务清单。比如,你可以这样定义Q务:

<target name="compile"  
   description="Compiles code, output goes to the build dir.">

最单的规则是把所有你惌E序员通过命o行就可以调用的Q务都加上描述。对于一般用来执行中间处理过E的内部dQ比如生成代码或建立输出目录{,无法用描q属性?/p>

q时Q可以通过在构建文件中加入XML注释来处理。或者专门定义一个helpdQ当E序员输入ant help时来昄详细的用说明?/p><target name="help" description="Display detailed usage information">
  <echo>Detailed help...</echo></target>

5. 提供清除d

每个构徏文g都应包含一个清除Q务,用来删除所有生成的文g和目录,使系l回到构建文件执行前的初始状态。执行清IZQ务后q存在的文g都应处在版本控制pȝ的管理之下。比如:

<target name="clean"
    description="Destroys all generated files and dirs.">
  <delete dir="${dir.build}"/>
  <delete dir="${dir.dist}"/>
</target>

除非是在产生整个pȝ版本的特DQ务中Q否则不要自动调用cleand。当E序员仅仅执行编译Q务或其他dӞ他们不需要构建文件事先执行既令h讨厌又没有必要的清空d。要怿E序员能够确定何旉要清I所有文件?/p>

6. 使用ANT理d从属关系

假设你的应用由Swing GUIlg、Web界面、EJB层和公共应用代码l成。在大型pȝ中,你需要清晰地定义每个Java包属于系l的哪一层。否则Q何一点修攚w要被q重新编译成百上千个文g。糟p的d从属关系理会导致过度复杂而脆qpȝ。改变GUI面板的设计不应造成Servlet和EJB的重~译?/p>

当系l变得庞大后Q稍不注意就可能依赖于客户端的代码引入到服务端。这是因为典型的IDE目文g~译M文g都用单一的classpath。而Ant能让你更有效地控制构建活动?/p>

设计你的Ant构徏文g~译大型目的步骤:首先Q编译公共应用代码,编译结果打成JAR包文件。然后,~译上一层的目代码Q编译时依靠W一步生的JAR文g。不断重复这一q程Q直到最高层的代码编译完成?/p>

分步构徏强化了Q务从属关pȝ理。如果你工作在底层Java框架上,偶然引用到高层的GUI模板lgQ这时代码不需要编译。这是由于构建文件在~译底层框架时在源\径中没有包含高层GUI面板lg的代码?/p>

7. 定义q用文件\?/h3>

如果文g路径在一个地方一ơ性集中定义,q在整个构徏文g中得到重用,那么构徏文g更易于理解。以下是q样做的一个例子:

<project name="sample" default="compile" basedir=".">
  <path id="classpath.common">
    <pathelement location="${jdom.jar.withpath}"/>
    ...etc  </path>
  <path id="classpath.client">
    <pathelement location="${guistuff.jar.withpath}"/>
    <pathelement location="${another.jar.withpath}"/>
    <!-- reuse the common classpath -->
    <path refid="classpath.common"/>
  </path>
  <target name="compile.common" depends="prepare">
    <javac destdir="${dir.build}" srcdir="${dir.src}">
          <classpath refid="classpath.common"/>
          <include name="com/oreilly/common/**"/>
    </javac>
  </target>
</project>

当项目不断增长构建日益复杂时Q这一技术越发体现出其h倹{你可能需要ؓ~译不同层次的应用定义各自的文g路径Q比如运行单元测试的、运行应用程序的、运行Xdoclet的、生成JavaDocs的等{不同\径。这U组件化路径定义的方法比为每个Q务单独定义\径要优越得多。否则,很容易丢׃Q务从属关pȝ轨迹?/p>

8. 定义恰当的Q务从属关p?/h3>

假设distd从属于jardQ那么哪个Q务从属于compiled哪个d从属于prepared呢?Ant构徏文g最l定义了d的从属关pdQ它必须被仔l地定义和维护?/p>

应该定期查Q务的从属关系以保证构建工作得到正执行。大的构建文仉着旉推移向于增加更多的dQ所以到最后可能由于不必要的从属关pd致构建工作非常困难。比如,你可能发现在E序员只需~译一些没有用EJB的GUI代码时又重新生成了EJB代码?/p>

以“优化”的名义忽略d的从属关pL另一U常见的错误。这U错误迫使程序员Z得到恰当的结果必记住ƈ按照特定的顺序调用一串Q务。更好的做法是:提供描述清晰的公׃Q务,q些d包含正确的Q务从属关p;另外提供一套“专家”Q务让你能够手工执行个别的构徏步骤Q这些Q务不提供完整的构E,但是让那些专家用户在快速而恼人的~码期间能够跌某些步骤?/p>

9.使用属?/h3>

M需要配|或可能发生变化的信息都应作为Ant属性定义下来。对于在构徏文g中多ơ出现的g同样处理。属性既可以在构建文件头部定义,也可以ؓ了更好的灉|性而在单独的属性文件中定义。以下是在构建文件中定义属性的样式Q?/p><project name="sample" default="compile" basedir=".">
  <property name="dir.build" value="build"/>
  <property name="dir.src" value="src"/>
  <property name="jdom.home" value="../java-tools/jdom-b8"/>
  <property name="jdom.jar" value="jdom.jar"/>
  <property name="jdom.jar.withpath"
                    value="${jdom.home}/build/${jdom.jar}"/>
    etc...
</project>

或者你可以使用属性文Ӟ

<project name="sample" default="compile" basedir=".">
  <property file="sample.properties"/>
   etc...
</project>

在属性文?sample.properties?

dir.build=build
dir.src=src
jdom.home=../java-tools/jdom-b8
jdom.jar=jdom.jarjdom.jar.withpath=${jdom.home}/build/${jdom.jar}

用一个独立的文g定义属性是有好处的Q它可以清晰地定义构Z的可配置部分。另外,在开发者工作在不同操作pȝ的情况下Q你可以在不同的q_上提供该文g的不同版本?/p>

10. 保持构徏q程独立

Z最大限度的扩展性,不要应用外部路径和库文g。最重要的是不要依赖于程序员的CLASSPATH讄。取而代之的是,在构建文件中使用相对路径q定义自q路径。如果你引用了绝对\径如C:\java\toolsQ其他开发者未必用与你相同的目录l构Q所以就无法使用你的构徏文g?/p>

如果你部|开放源码项目,应该提供包含~译代码所需的所有JAR文g的发行版本。当Ӟq是在遵守许可协议的基础上。对于内部项目,相关的JAR文g都应在版本控制系l的理中,q捡出(check outQ到大家都知道的位置?/p>

当你必须引用外部路径Ӟ应将路径定义为属性。ɽE序员能够用适合他们自己的机器环境的参数重蝲q些属性。你也可以用以下语法引用环境变量:

<property environment="env"/>
<property name="dir.jboss" value="${env.JBOSS_HOME}"/>

11. 使用版本控制pȝ

构徏文g是一个重要的制品Q应该像代码一栯行版本控制。当你标C的代码时Q也应用同样的标{标记构建文件。这样当你需要回溯到旧版本ƈq行构徏Ӟ能够使用相应版本的构建文件?/p>

除构建文件之外,你还应在版本控制中维护第三方JAR文g。同Pq你能够重新构建旧版本的Y件。这也能够更Ҏ保证所有开发者拥有一致的JAR文gQ因Z们都是同构徏文g一起从版本控制pȝ中捡出的?/p>

通常应避免在版本控制pȝ中存放构建成果。倘若你的源代码很好地得到了版本控Ӟ那么通过构徏q程你能够重新生成Q何版本的产品?/p>

12. 把Ant作ؓ“最公分母?/h3>

假设你的开发团队用IDE工具Q当E序员通过点击图标p够构建整个应用时Z么还要ؓAnt而烦恼呢Q?/p>

IDE的问题是一个关于团队一致性和重现性的问题。几乎所有的IDE设计初衷都是Z提高E序员的个h生率,而不是开发团队的持箋构徏。典型的IDE要求每个E序员定义自q目文g。程序员可能拥有不同的目录结构,可能使用不同版本的库文gQ还可能工作在不同的q_上。这导致出现这U情况:在Bob那里q行良好的代码,到Sally那里无法运行?/p>

不管你的开发团队用何UIDEQ一定要建立所有程序员都能够用的Ant构徏文g。要建立一个程序员在将C码提交版本控制系l前必须执行Ant构徏文g的规则。这确保代码是l过同一个Ant构徏文g构徏的。当出现问题Ӟ要用项目标准的Ant构徏文gQ而不是通过某个IDE来执行一个干净的构建?/p>

E序员可以自由选择M他们习惯使用的IDE工具或编辑器。但是Ant应作为公共基U以保证代码永远是可构徏的?/p>

13. 使用zipfileset属?/h3>

Zl常使用Ant产生WAR、JAR、ZIP?EAR文g。这些文仉常都要求有一个特定的内部目录l构Q但其往往与你的源代码和编译环境的目录l构不匹配?/p>

一个最常用的方法是写一个AntdQ按照期望的目录l构把一大堆文g拯C时目录中Q然后生成压~文件。这不是最有效的方法。用zipfileset属性是更好的解x案。它让你从Q何位|选择文gQ然后把它们按照不同目录l构放进压羃文g中。以下是一个例子:

<ear earfile="${dir.dist.server}/payroll.ear"
    appxml="${dir.resources}/application.xml">
  <fileset dir="${dir.build}" includes="commonServer.jar"/>
  <fileset dir="${dir.build}">
    <include name="payroll-ejb.jar"/>
  </fileset>
  <zipfileset dir="${dir.build}" prefix="lib">
    <include name="hr.jar"/>
    <include name="billing.jar"/>
  </zipfileset>
  <fileset dir=".">
    <include name="lib/jdom.jar"/>
    <include name="lib/log4j.jar"/>
    <include name="lib/ojdbc14.jar"/>
  </fileset>
  <zipfileset dir="${dir.generated.src}" prefix="META-INF">
    <include name="jboss-app.xml"/>
  </zipfileset>
</ear>

在这个例子中Q所有JAR文g都放在EAR文g包的lib目录中。hr.jar和billing.jar是从构徏目录拯q来的。因此我们用zipfileset属性把它们Ud到EAR文g包内部的lib目录。prefix属性指定了其在EAR文g中的目标路径?/p>

14. 试Cleand

假设你的构徏文g中有clean和compile的Q务,执行以下的测试。第一步,执行ant cleanQ第二步Q执行ant compileQ第三步Q再执行ant compile。第三步应该不作M事情。如果文件再ơ被~译Q说明你的构建文件有问题?/p>

构徏文g应该只在与输出文件相兌的输入文件发生变化时执行d。一个构建文件在不必执行诸如~译、拷贝或其他工作d的时候执行这些Q务是低效的。当目规模增长Ӟ即是小的低效工作也会成为大的问题?/p>

15. 避免特定q_的Ant装

不管什么原因,有h喜欢用简单的、名U叫?em>compile之类的批文g或脚本装载他们的产品。当你去看脚本的内容你会发现以下内容Q?/p>

ant compile

其实开发h员都很熟悉AntQƈ且完全能够自己键入ant compile。请不要仅仅Z调用Ant而用特定^台的脚本。这只会使其他h在首ơ用你的脚本时增加学习和理解的烦扰。除此之外,你不可能提供适用于每个操作系l的脚本Q这是真正烦扰其他用L地方?/p>

ȝ

太多的公怾靠手工方法和特别E序来编译代码和生成软g发布版本。那些不使用Ant或类似工具定义构E的开发团队,p了太多的旉来捕捉代码编译过E中出现的问题:在某些开发者那里编译成功的代码Q到另一些开发者那里却p|了?/p>

生成q维护构本不是一富有魅力的工作Q但却是一必需的工作。一个好的Ant构徏文g你能够集中到更喜Ƣ的工作——写代码中去Q?/p>

kelven 2006-04-21 18:35 发表评论
]]>
Tomcat5的数据库q接池配|?/title><link>http://www.tkk7.com/zhangrenquan/articles/39378.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Wed, 05 Apr 2006 06:08:00 GMT</pubDate><guid>http://www.tkk7.com/zhangrenquan/articles/39378.html</guid><wfw:comment>http://www.tkk7.com/zhangrenquan/comments/39378.html</wfw:comment><comments>http://www.tkk7.com/zhangrenquan/articles/39378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhangrenquan/comments/commentRss/39378.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhangrenquan/services/trackbacks/39378.html</trackback:ping><description><![CDATA[本文主要介绍Tomcat5.0.25q个版本下数据库q接池的配置Q及E序对连接池的JNDI查找Qƈ提供相应试代码。最后指出配|及应用q程中的常见问题及解x法?br /><br />1 .该文的配|环境:Tomcat5.0.25 + jdk1.4+ Sql Server 2000+Win2000<br /><br />2.配置步骤Q?br /><br />W一步:<br /><br />启动TomcatQ打开IE在地址栏内输入<a href="http://localhost:8080/admin"><font color="#002c99">http://localhost:8080/admin</font></a>  q入Tomcat的管理界面;点击双的Data Sources 在右上角的下拉菜单中选择Create New Data Source 在下边的输入框中输入需要的配置信息?br /><br />JNDI Name:jdbc/XXXQXXX己所命的名字Q?br /><br />Data Source URLQjdbc:microsoft:sqlserver://localhost:1433;DatabaseName=tempdbQ连接的数据名)<br /><br />JDBC Driver Class: com.microsoft.jdbc.sqlserver.SQLServerDriver<br /><br />User Name:q接数据库的用户名?br /><br />Password: 数据库密?br /><br />Max. Active Connections: 最大连接数<br /><br />Max. Idle Connections: 是最大的I闲q接?br /><br />Max. Wait for Connection: 最大等待连接数<br /><br /> <br /><br />W二步:配置web.xml<br />打开webapps/ROOT/WEB-INF下web.xmlQ加入如下内容:   <br /><resource-ref><br />  <description>SqlServer Datasource example</description><br />  <res-ref-name>jdbc/SqlServerDB</res-ref-name><br />  <res-type>javax.sql.DataSource</res-type><br />  <res-auth>Container</res-auth><br />  </resource-ref><br /><br />W三步:配置tomcatQ添加类Q?br /><br />首先要下载安装sqlserver-jdbc-驱动Q然后将其lib下的三个jar文g攑ֈ<br /><br />tomcat/common/lib下?br /><br /> <br /><br />注意事项Q?br /><br />如果是单个JSP面我们它攑֜TOMCAT_HOME/webapps/ROOT下边Q同时还M改TOMCAT_HOME/conf/Catalina/localhost/下的ROOT.xml文gQ在<br /><br /><Resource auth="Container" description="SqlServer Datasource example" name="jdbc/SqlServerDB" type="javax.sql.DataSource"/>下边加入Q?br /><br /><ResourceLink global="jdbc/test" name="jdbc/test" type="javax.sql.DataSource"/><br /><br />来引用所配置的JNDI数据源。同时将<Resource auth="Container" description="SqlServer Datasource example" name="jdbc/SqlServerDB" type="javax.sql.DataSource"/>注释?br /><br />    如果我们要部|的是个WEB应用E序Q我们将该应用程序放在TOMCAT_HOME/webapps目录下,有两U方式可以引用我们所配置的JNDI数据源?br /><br />A:可以在TOMCAT_HOME/conf/Catalina/localhost下新建XXX.xml文gQXXX为所发布的WEB应用的名字,如我所发布的WEB应用是JndiTestQ?xml文g命名为JndiTest.xml在该文g内加Q?br /><br /><?xml version='1.0' encoding='utf-8'?><br /><br /><Context debug="1" docBase="E:/Tomcat 5.0/webapps/JndiTest" path="/JndiTest" reloadable="true" workDir="work\Catalina\localhost\JndiTest"><br /><br />  <Resource name="jdbc/test" type="javax.sql.DataSource"/><br /><br />  <ResourceParams name="jdbc/test"><br /><br />    <parameter><br /><br />      <name>factory</name><br /><br />      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value><br /><br />    </parameter><br /><br />    <parameter><br /><br />      <name>password</name><br /><br />      <value>jsjrj</value><br /><br />    </parameter><br /><br />    <parameter><br /><br />      <name>maxActive</name><br /><br />      <value>4</value><br /><br />    </parameter><br /><br />    <parameter><br /><br />      <name>maxWait</name><br /><br />      <value>5000</value><br /><br />    </parameter><br /><br />    <parameter><br /><br />      <name>url</name><br /><br />      <value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=tempdb</value><br /><br />    </parameter><br /><br />    <parameter><br /><br />      <name>driverClassName</name><br /><br />      <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value><br /><br />    </parameter><br /><br />    <parameter><br /><br />      <name>username</name><br /><br />      <value>sa</value><br /><br />    </parameter><br /><br />    <parameter><br /><br />      <name>maxIdle</name><br /><br />      <value>2</value><br /><br />    </parameter><br /><br />  </ResourceParams><br /><br /></Context><br /><br />其中E:/Tomcat 5.0/webapps/JndiTestZ所发布应用E序的目录,q样可以进行测试了?br /><br />q样做就是每个WEB应用E序都须创徏一个象JndiTest.xmlq样的文件?br /><br />B;Z避免每个WEB应用E序都创建XXX.xml文gQ我们可以修改TOMCAT_HOME/conf下的server.xml文gQ修改如下:<br /><br />?lt;Host></Host>之间加入Q?br /><br /><Context path="/JndiTest" docBase="E:/Tomcat 5.0/webapps/JndiTest" debug="1" reloadable="true"><br /><br />    <Resource name="jdbc/test" type="javax.sql.DataSource"/><br /><br />    <ResourceParams name="jdbc/test"><br /><br />      <parameter><br /><br />        <name>url</name><br /><br />        <value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=tempdb</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>driverClassName</name><br /><br />        <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>maxWait</name><br /><br />        <value>5000</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>maxActive</name><br /><br />        <value>4</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>password</name><br /><br />        <value>jsjrj</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>maxIdle</name><br /><br />        <value>2</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>username</name><br /><br />        <value>sa</value><br /><br />      </parameter><br /><br />      <parameter> <br /><br />        <name>factory</name> <br /><br />        <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> <br /><br />      </parameter> <br /><br />    </ResourceParams><br /><br />   </Context><br /><br /><Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" type="org.apache.catalina.UserDatabase"/>下的<br /><br /><Resource name="jdbc/test" type="javax.sql.DataSource"/><br /><br />同时Ud上边的这D:Q也可以不移去)<ResourceParams name="jdbc/test"><br /><br />      <parameter><br /><br />        <name>url</name><br /><br />        <value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=tempdb</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>driverClassName</name><br /><br />        <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>maxWait</name><br /><br />        <value>5000</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>maxActive</name><br /><br />        <value>4</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>password</name><br /><br />        <value>jsjrj</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>maxIdle</name><br /><br />        <value>2</value><br /><br />      </parameter><br /><br />      <parameter><br /><br />        <name>username</name><br /><br />        <value>sa</value><br /><br />      </parameter><br /><br />      <parameter> <br /><br />        <name>factory</name> <br /><br />        <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> <br /><br />      </parameter> <br /><br /></ResourceParams><br /><br />注意要在每个WEB应用E序的web.xml文g中都加入<br /><br /><resource-ref><br />  <description>SqlServer Datasource example</description><br />  <res-ref-name>jdbc/SqlServerDB</res-ref-name><br />  <res-type>javax.sql.DataSource</res-type><br />  <res-auth>Container</res-auth><br />  </resource-ref><br /><br />3Q测?br /><br />~写jsp文gQ?br /><br /><%@ page contentType="text/html;charset=gb2312"%> <br /><br /><%@ page import="java.sql.*"%><br /><br /><%@ page import="javax.sql.*"%>  <br /><br /><%@ page import="javax.naming.*"%>  <br /><br /><html> <br /><br /><body> <br /><br /><%<br /><br /> <br /><br />Context ctx = new InitialContext();<br /><br />Connection conn=null;<br /><br />          ctx = new InitialContext();<br /><br />          DataSource ds =(DataSource)ctx.lookup("java:comp/env/jdbc/test");<br /><br />          conn = ds.getConnection();<br /><br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br /><br />String sql="select * from T_Student"; <br /><br />ResultSet rs=stmt.executeQuery(sql); <br /><br />while(rs.next()) {%><br /><br /><% <br /><br />out.print(rs.getString(1));<br /><br />out.print(rs.getString(2));<br /><br />out.print(rs.getString(3));<br /><br />}%> <br /><br /><% <br /><br />out.print("数据库操作成功,恭喜?);<br /><br />rs.close(); <br /><br />stmt.close(); <br /><br />conn.close(); <br /><br />%> <br /><br /></body> <br /><br /></html><br /><img src ="http://www.tkk7.com/zhangrenquan/aggbug/39378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhangrenquan/" target="_blank">kelven</a> 2006-04-05 14:08 <a href="http://www.tkk7.com/zhangrenquan/articles/39378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用JSTL改进JSP来简化网늚实现q程http://www.tkk7.com/zhangrenquan/articles/27357.htmlkelvenkelvenTue, 10 Jan 2006 04:07:00 GMThttp://www.tkk7.com/zhangrenquan/articles/27357.htmlhttp://www.tkk7.com/zhangrenquan/comments/27357.htmlhttp://www.tkk7.com/zhangrenquan/articles/27357.html#Feedback0http://www.tkk7.com/zhangrenquan/comments/commentRss/27357.htmlhttp://www.tkk7.com/zhangrenquan/services/trackbacks/27357.html[摘录]:http://www.javafan.net/article/20051229115558915.html

概述
  Java Server Pages (JSP) 标准标记?(JSTL)的版本的发布对于JSP/servlet开发者来说是一个重大的q展。有了一个表达语aQELQ和一l四U强大的、易于学习的标准标记库,JSTL极有可能不久后成为实现动态的、基于Java的站点的主要Ҏ?
  1996q对JSP servlet的介l得Java成ؓ动态网开发的合理的选择。随后出现的Java服务器页(JSP)是走向快速的、可l护的Java|页实现q程的合理进化的一步,紧接着出CJSP标记的支持。但?002中期的JSTL(JSP标准标记?的发布才是进一步加速和化开发过E最大的一步?
  在本文中Q我解释了JSTL的功能,也涵盖了你启动JSTL所需的每件事情。假设你有了对Java、JSP、XML和安装一个Web容器的基本理解。如果你对这些主题感到陌生,你可以在ResourcesQ?A target=_blank>http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resourcesresourcesQ上览一下背景参考。在下面的阐qCQ假定你有XML和SQL的知识?
  安装JSTL支持
  对于我们的JSTL安装例子来说Q我们用Tomcat 4.1Q尽Q意支持Servlet 2.3和JSP1.2说明的servlet容器都应该能工作Q。首先,下蝲Tomcat 4.1q且按指C行安装(注意QJSTL需要一个JSP1.2 Web容器Q?

  用tomcat4 startE序启动TomcatQƈ且运行index.html|保Tomcat是激zȝ、且q行良好?

  接下来,安装JSTL支持Q你可以从Jakarta站点下蝲JSTL支持Q(http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resourcesresourcesQƈ按照下面步骤Q?

  1.从Jakarta站点下蝲JSTL索、解?脱档该文件。(http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl.html?#resourcesQ?

  2.复制你已l解压ؓcommon/lib的jar文gC的Tomcat安装路径中(管我们的项目不需要所有的jar文gQ;q得JSTL文g适用于你的Q意Web应用?

  3.对于L你想使用JSTL的Web应用来说Q复?tld文gC的Web应用的WEB-INF目录下?

  4.对于你的JSTL的Web应用Q编辑web.xmlq添加下列输入:

<taglib>
  <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
  <taglib-location>/WEB-INF/fmt.tld</taglib-location>
  </taglib>
  <taglib>
   <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
   <taglib-location>/WEB-INF/c.tld</taglib-location>
  </taglib>
  <taglib>
   <taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>
   <taglib-location>/WEB-INF/sql.tld</taglib-location>
  </taglib>
  <taglib>
   <taglib-uri>http://java.sun.com/jstl/x</taglib-uri>
   <taglib-location>/WEB-INF/x.tld</taglib-location>
  </taglib>

  q些输入让你的Web应用可用JSTL标记库的表达语言QELQ版本。这些输入的位置有关p!如果你不肯定他们输入到何处Q关于web.xml选项和顺序的权威性指导在文档cd定义QDTDQ中定义q:http://java.sun.com/j2ee/dtds/web-app_2_2.dtd?

  5.当你创徏了一个用JSTL的JSP|Q将他输入到你的Web应用的主目录下,像其它JSP和HTML一栗你可以Q意取名,但是它必L一?jsp的扩展名?

  基础原理
  首先Q所有的JSTL也是JSP,JSTL只是JSP功能的一个超集?

  同样Q所有的JSTL标记是有效的XML。这意味着Q如果你JSTL标记之外的内容当作时文本(通常是HTMLQ时Q剩下的JSTL标记必须当作合法的XML来解释。这里有一些隐含的规则Q它要求大部分XML语法都是正确的?

  JSTL提供一l四个标准标记库Qcore核心、internationalization/format国际标准?格式、XML和SQLQƈ支持EL。JSTL和EL的基本设计目的是化网开发和实现?

  在本文中Q我们遵循JSTL说明书的命名规则Qƈ且把JSTL标记当作动作。一个JSTL标记对应于某个动作;调用动作明确的提醒我们:他们d动态行为到一个另外的静态页上?

  JSTL标记库有两个版本Q一个用你以前用的ҎJSP表达式插入,?lt;%= . . . %>Q另一个用一个JSTL EL.我会在后面进一步讨论在JSTL中的EL支持?

  EL支持
  要理解当前JSTL对EL支持的状态,让我们检查相关的说明书是怎样处理的。Java说明书请求(JSRQ专家组成员军_Q由于某U原因,EL规范说明应该是JSP说明书的一部䆾Q而不是JSTL说明书的一部分。EL完整的说明书成ؓJSP2.0的一部分。因为JSTL1.0在JSP1.3之前已经完成QJSTL作者不得不对用于JSTL1.0的EL支持实现做一个合理的猜测Q结果可能是相当好的Q。一个JSTLl护版本与JSP1.3说明书保持一_qؓ了EL适合JSP1.3说明书,JSTLl护版本做了一些修正?

  本文描述的EL概要可能在即发布的JSTL版本中有一Ҏ动,但是M改动都是微小的?

  EL用于单的语法定义了一套功能强大的语言Q它很容易学习。它融合着JavaScript语言和Perl语言较好的部分的一些风根{EL表达式,集成了来自四U标准标记库的JSTL标记Q提供了一个巨大的、灵zȝ属性集?

  所有的EL表达式都?{}括v来。JSTL中的表达式LJSTL标记中的属性值的一部分。表辑ּ可以是属性的一部分或者合q和嵌入C个字W串直接量中。JSTL属性也可以包含单的字符串直接量。在接下来的JSTL中,我们在一个来自核心库的c:out动作中说明每U情况,q个核心库将它的value属性值送到JSP输出上:

<c:out value="${anExpression}"/>
<c:out value="literalText${anExpression}${anotherExpression}"/>
<c:out value="literalText"/>

  EL也定义了一套规则用于强制表辑ּ中的D{换ؓ上下文相对应的类型。我们在q里不详l讨些规则;然而,它的Ҏ与用Perl语言定义的方式非常相|像Perl语言中的做法一P该方法理所当然的运行良好,但是Q偶,也会出现可能不是你十分想要的那种l果Q但你可以接受)?

  EL问对象属性、集合元素、一l隐藏对象以及用相关的、逻辑的和术的操作符提供了支持。对于烦引的属性来_包括数组和java.util.Listcd内,元素可用下列语法讉KQ?

${alist[4]}
${aList[someVariable]}

  JavaBean属性和java.util.Map元素Q它代表一pd名字/值对Q都可以使用下列Ҏ的一个访问得到。在以下的开头两个表辑ּ里,我们可以讉KC个用JavaBean语言命名为aProperty的属性或者用关键字aProperty讉KC个Map实体。在W三个表辑ּ中(注意Q我已经省略了引PQ我们用保存在变量aVariableContainingPropertyName中的一个名字访问了在anObject之内的一个元?

${anObject.aProperty}
${anObject["aPropertyName"]}
${anObject[aVariableContainingPropertyName]}

  在EL中定义了许多隐藏变量Q?
  ?pageContextQ用于该|页的pageContext对象
  ?pageScope, requestScope, sessionScope, ?applicationScopeQ这些是映射q些范围的每一个变量到g的Map集?
  ?param ?paramValuesQ用访问传递的参数Q与在JSP中一?
  ?header ?headerValuesQ用请求传递的_与在JSP中一?
  ?cookieQMap映射cookieE序到特定的cookie对象?

  EL定义了全套与你在Java中非常熟悉的那些完全对应的操作符。算法操作符包括+?-?*?/ (?div)?? (?mod)。相关的操作W包?=、!=?lt;?gt;?lt;=?gt;=Q它分别对应于eq、ne、lt、gt、le、和ge。我不想详细阐述q些操作W,因ؓ他们都能自我说明?

  JSTL标记?/FONT>
  xQ我已经解释了一些基本原理ƈ且涵盖了EL语法。我要专门讨论四UJSTL标记库。我主要讨论核心库,因ؓ它是你一定要使用的;但是Q我也会详细的讨论其余几个,以便你能启动它?

  首先Q尽我应该更多地谈论JSTL标记库的两种风格Q我上面提到的每个JSTL标记库以两个版本出现Q一个支持用EL的表辑ּQ另一个支持标准JSP表达式。当你引入Q何标记库C个JSP|Q你要定义一个前~Q该前缀指定了与库中标记相对应的命名I间?

  四种标准标记库,和他们的JSTL规范定义的前~常规Q列表如下。记住:你可以定义自q前缀Q但是这l对没有什么好处?/P>

四种标准标记?BR>

  Z使用中的核心标记库Q?实际上,你你的对标记库的命名I间可见Q,在你的页首包含下列例子中的指令:
<%@ taglib prefix="c" uri=http://java.sun.com/jstl/core %>

  Z使用该标记库的标讎ͼ用你在你的包含语句中设计好的前缀Q在你的中l每个标记加上前~Q?

<c:out value="${anExpression}"/>

  核心数据?/FONT>

  让我们更详细的测试核心数据库Q先看看他最通用的功能?

  昄/讑֮值和异常处理

  核心库的最基本的标记是c:out标记Q它在页中显CZ个EL表达式的倹{一个用c:out的表辑ּ通常是这P

We have <c:out value="${applicationScope.product.inventoryCount}" 
escapeXml="true" default="0"  /> of those items in stock.

  上例中,value属性是我们送到输出的表达式。我也说明了选项escapeXml的属性和默认属性。escapeXml的属性指定了XML字符(<?gt;?&??.)是否应该转化为相应的字符实体代码Q这样他们可以让q些字符出现在一个HTML中Q;默认属性用于EL不能估算出数值或者数D出来ؓI的情况?

  注意Q当EL支持完全贯穿整个JSP2.0的时候,你不需要用c:out动作Q你可以仅嵌套JSP表达式直接在中?

  另一个普遍用的核心动作是c:setQ它在页中设定一个变量。你可以用两U方法用c:set动作Q第一U方法设定在var属性中定义的变量到在value属性中定义的gQ方法如下:

<c:set var="customerID" value="$param:customerNumber" scope="session" />

  上述的选择scope属性指定了我们要在会话期范围内讑֮变量customerIDQ如果范围没有制定,范围默认为页?

  c:set另一个强大的用途就是将c:set标记的体的内容赋l一个指定的变量Q?

<c:set var="cellContents">
<td>
<c:out value="${myCell}"/>
</td>
</c:set>

  在上例中Qc:set动作定义了名为cellContentsQ在늚范围内)的变量,该变量拥有在标记的体中定义的内容。在q种情况下,体定义了一个HTML表格单元格元素,计算体中的c:out动作Qƈ且该计算的结果包括在体中的字W串直接量倹{?

  像你预想的那样QJSTLq行异常处理有点早。在典型的JSP中Q你有两U异常处理的ҎQ试?捕捉直接嵌入到页中的脚本代码中的块Q或者用一个JSP errorPage指o。JSP errorPage指o提供一个良好的捕捉所有异常的Ҏ来处理页中Q何可能的异常。JSTL用一个c:catch动作提供一个好的可选择的方式。这个c:catch动作提供一个更l粒度的有效Ҏ来处理异常。而且没有嵌入Java代码到页中。一个c:catch动作是这LQ?

<c:catch>
 <!--. . . some set of nested JSTL tags below which would be hit on an exception-->
</c:catch>

  c:catch动作有一个可选的属性,即一个指向抛出异常的变量?

  你可能不怎么愿意使用c:remove标记。这个标记有用于变量名和范围的属性,q且可从指定的范围内删除指定的变量?

  程控制
  让我们{论JSTL的流E控制和条g标记。如果你已经用Q何一U语a使用了条件和程控制语句Q理Zq里没什么新鲜的东西?

  c:if动作处理单条件语句的试。计测试属性中的Boolean表达式的|如果表达式ؓ真的话,计算体的内容。在下面的动作中Q我们也说明了备选项var属性。ؓ了以后的使用Qvar属性保存测试结果在(如果没有指定其他scope属性的话)中?/P>

<c:if test="${status.totalVisits == 1000000}" var="visits">
   You are the millionth visitor to our site!  Congratulations!
</c:if>

  下面我们展示了用c:choose?c:when??c:otherwise交换逻辑的JSTL的支持。一lc:when动作可能包括在一个备选的标记内,如果在c:when块中M表达式计gؓ真的话,׃用计c:choose动作内的试。如果c:when块中没有一个测试计gؓ真的时候:如果出现c:otherwise动作内容Ӟ则计c:otherwise动作的内容:

<c:choose>
<c:when test="${item.type == 'book'}">
...
</c:when>
<c:when test="${item.type == 'electronics'}">
...
</c:when>
<c:when test="${item.type == 'toy'}">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>

  c:foreach动作提供一个容易的Ҏ来P代一个集合的元素。如果你惛_q代集合的一部分的话Q你可以分别用begin?end??step属性指定v炏V终点和一个递增倹{在下面的例子中Q我们在变量customerNames中P代一个集合的内容Q在每个循环中,下一个元素输入到变量名内q在c:foreach动作的体内计:

<table>
<c:forEach var="name" items="${customerNames}">
<tr><td><c:out value="${name}"/></td></tr>
</c:forEach>
</table>

   记得Java的StringTokenizercdQ有了c:forTokens动作Q你可以用JSTL获得cM的功能。这个程序片断可使用在delims属性中定义的定界符通过items String属性中的条目P代。注意,items 属性不必是一个字W直接量Q它可以是Q何有效的EL表达?

<table>
<c:forTokens items="47,52,53,55,46,22,16,2" delim="," var="dailyPrice">
<tr><td><c:out value="${dailyPrice}"/></td></tr>
</c:forTokens>
</table>

  在接下来的完整的JSTL中Q我列出了已l传递到该页的所有参数。param 和paramValues对象是映关键字C个或多个值的Java Map集。在本例中,我们扑և了用于集合的每个MapEntry的关键字卛_数名Qƈ且用关键字来查找所有与关键字关联的参数|

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<body>
<head>
<title>Parameter Listing Example</title>
</head>
<br>
<b>Parameter values passed to this page for each parameter: </b>
<table border="2">
<c:forEach var="current" items="${param}">
    <tr>
    <td>
    <b><c:out value="${current.key}" /></b>
    </td>
    <c:forEach var="aVal" items="${paramValues[current.key]}">
     <td>
     <c:out value="${aVal}" />
      </td>
   </c:forEach>
  </tr>
</c:forEach>
</table>
</body>
</html>

  其他动作
  我们也需要讨Z些其他重要的核心标记库动作。在|页实现中一个潜在的问题范围与URL~码有关。没有URL~码Q在|页中传递的URL的某个字W如I格Q可能会qhWeb服务器。URL~码保q些Ҏ的字W用不引赯惑的字符代替。下列例子在变量myUrl中定义了一个URL,该变量myUrl׃个URL和一pd参数l成。URL动作Q注意,q里只在JSTL意义上的动作Q保证所有字W都正确的编?

<c:url value="http://acme.com/exec/register" var="myUrl">
<c:param name="name" value="${param.name}"/>
<c:param name="country" value="${param.country}"/>
</c:url>
<a href='<c:out value="${myUrl}"/>'>Register</a>

  在上面的代码中,param动作单的定义了一l名值对?

  JSP允许设计者用 <JSP:INCLUDE></JSP:INCLUDE>

  <JSP:INCLUDE>指o包括其他늚内容。JSTL用JSTL c:import动作扩展了这个概cc:import的主要优势是Q你能指定一个Q意的URLQ也可以包含你的Web应用之外QW3C的Q何地方)的页的内Ҏ者你的服务器上的另一个Web应用内的늚内容?

  对于一l与HTTP相关的标记来_没有一个方法处理HTTP重定向是不完整的。JSTL用c:redirect动作支持它?

  国际化标记库

  在讨ZJSTL支持国际化中Q我假设你已l有了对下列主题的合理的理解Q?

  ●资源包和Java如何扑ֈ它们
  ●Localec?
  ●资源包查找和MessageFormatc?
  ●局部编码以及它与Java国际化的关系
  ●Java文本和数据格式化

  如果你需要这些主题的更多的信息,请阅读Resources (http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl-p4.html#resources#resources)上的参考部分与国际化有关的参考文章?

  我在下面的两个部分讨Z国际化标记库。在W一部分Q我包括了你可能使用的格式化和解释相关的动作Q它最初对应于java.text装包中的类Q,管你没有开发过完全的国际化应用E序Q可能你也要用到它。在W二部分Q我说明了更针对于国际化的动作?

  如果存在一个远E的可能性,你的应用E序会在你本国之外用。如果你从一开始就建立在国际化的支持上Q那么开发就会更加容易。无Z使用何种Ҏ来开发,即像JSTL一样容易用的ҎQ一开始徏立在国际化支持上也是十分有益的?

  格式标记库:格式动作
  如果你已l用了Java?DateFormat 和NumberFormatc,在下面的标记中用的Ҏ应该看v来眼熟,因ؓJSTL格式化动作是在这些类之上建立的。这些JavacL遍提供一个format( )函数Q它一个Javacd转化Z个格式化的String和创建对应于该String的Java对象?

  fmt:formatNumber动作有一个value属性和一个pattern属性。value属性是一个与我们看到的其它value属性类似的EL表达式或者变量。pattern属性与在NumberFormatcM定义的模式一栗下列动作发送一个格式化的String到JSP늚输出上:
<fmt:formatNumber value="1000.001" pattern="#,#00.0#"/>


  在这个fmt:formatNumber动作里,我们使用了type属性来指定Q格式化我们需要格式化的gؓ一个货币倹{我们保存格式化的结果在一个变量名为dollars中。在一个美国的localecMQ下面的E序生成一个字W串$3456.79Q注意,它将使用的货币值四舍五入了Q:

<fmt:formatNumber value="3456.789" type="currency" var="dollars"/>


  用于上面的type属性的可能值包括currency?number?和percent?

  在例中,我们使用了另一U方法——用了一个包括在value属性中的一个格式化的域QcurrencyQ每type属性)的一个文本字W串。ƈ且解析它来获取一个数字。结果储存在由var属性指定的一个变量内。尽这个属性是可选的Q还是会l常使用它。另外,解析的值送到输ZQ?/P>

<fmt:parseNumber value="${currencyInput}" type="currency"
 var="parsedNumber"/>
fmt:formatDate动作有一个value属性、一个format属性?
一个指向处理格式化的格式类的属性(典型的,如java.util.DateQ:
<jsp:useBean id="now" class="java.util.Date" />
<fmt:formatDate value="${now}" timeStyle="long"
dateStyle="long"/>

  像数字格式化一PJSTL|供一个机制来解析一个代表日期的、进入Date对象的字W串Q?

<fmt:parseDate value="${dateInput}" pattern="MM dd, YYYY" />

  查看java.util.DateFormatc,了解如何处理格式化和模式的更多详l的资料?

  格式标记库:国际化动?/FONT>
  Java本地化的一个关键点是ResourceBundlecRJSTL动作允许你用q个cȝ单的工作。这个例子用了fmt:bundle动作来得C当前Locale ?fmt:message动作对应的一个ResourceBundle动作Q从而查看该资源包中的本地化的字W串Q?

<fmt:bundle basename="myBundle">
<%-- Use values in myBundle --%>
<fmt:message key="Introduction">
   <fmt:param value="${loginName}"/>
   <fmt:param value="${loginCount}"/>
</fmt:message>
<fmt:formatDate value="${now}" var="parsedDate"/>
</fmt:bundle>

  l常Qfmt:message动作单的查看了对应于一个关键词的字W串。在上面的例子中Q在ResourceBundle中的字符串包含了取代两个值的占位W。这些值在fmt:param动作中定义过Q这像Java MessageFormatcM用的Ҏ?

  有一些类似的动作可指定一个时区,时区可应用到在标记的体中计算的Q何事上:

<fmt:timeZone value="someTimeZone">
<!-- actions in this context will be evaluated using someTimeZone  -->
</fmt:timeZone>

  上述的fmt:bundle ?fmt:timeZone动作有分别对应的fmt:setBundle和fmt:setTimeZone的动作。这些动作添加了可选的scope属性;因此Q你可以使用q些动作在Q何等同于应用范围的范围内讑֮一个资源捆l或者一个时区?

  如果你用非欧z的localecd作的话,你可能得担心~码的问题,JSTL支持用fmt:requestEncoding动作~码?

  SQL标记?/FONT>

  JSTL 允许Ҏ的数据库的集成。但是,值得注意的是Q沙׃外的JSTL的执行有一些限制。主要的问题与连接池有关。徏立ƈl护到数据库的连接是很消耗资源的。JSTL SQL动作使得许多数据库连接徏立v来,通常的,每个用户臛_有一个。因此,JSTL SQL标记对于原型开发的或低定w的、基于Web的应用程序意义重大。但是它不适合于大规模的应用程序。一个可~放的品应用程序一般是在一个页面内处理数据库访问如隐藏数据库访问和处理像连接池之类的细节。但是,q是有方法允怽实现q接池和用一点自定义码来使用JSTL SQL动作Q请看:"JSTL 1.0: What JSP Applications Need, Part 2" in Resources Qhttp://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl-p5.html#resources#resources).

  我们看一些简单的例子。这些例子用来自SQL库的JSTL标记。如果你熟悉SQL基础的话Q你应该能够改编q些例子用在你的应用E序上?

  在下面的E序片断中,我们建立了一条到一个数据库的连接,选择一l匹配一个订单ID的订单项目,q且在一个表g昄item属性:

<sql:setDataSource
      driver="com.cheapDrivers.jdbcDriver"
      url="jdbc:cheapDrivers:."
      user="guest"
      password="password"
      var="dataSource" />

<sql:query var="orderItems" dataSource="${dataSource}">
SELECT * FROM items
WHERE order_id = <cout value="${orderID}"/> 
ORDER BY price
</sql:query>
<table>
<c:forEach var="row" items="${orderItems.rows}">
<tr>
<td><c:out value="${row.itemName}"/></td>
<td><c:out value="${row.price}"/></td>
<td><c:out value="${row.weight}"/></td>
</tr>
</c:forEach>
</table>

  在下一个例子中Q我会说明JSTL是如何支持数据库事务的,在数据库中,许多包含对表格多个改动的操作必须是对所有的Q或者什么也不做Q如果出C个问题时Q改动必MؓI操作。在下面例子中,sql:update动作包含在一个sql:transaction动作内,如果在事务处理过E中Q存在Q何SQL错误的话Q在事务范围内执行的所有操作都得重来?

  sql:update动作的命名有一点误|除了SQL UPDATE外,sql:update也支持INSERT ?DELETEQ甚xSQL CREATE。实际上Q它支持不生结果的M一条SQL操作。在下面的例子中Qsql:update通过插入变量值到一个PreparedStatement中来执行一个UPDATE动作。在q个代码片断中,我们在两个̎户之间传送钱Q需要预先包装在一个事务中的某些东西的一个经典的例子Q:

<sql:transaction dataSource="${dataSource}">
<sql:update>
UPDATE account
SET account_balance =account_balance -?
WHERE accountNo = ?
<sql:param value="${transferAmount}"/>
<sql:param value="${sourceAccount}"/>
</sql:update>
<sql:update>
UPDATE account
SET account_balance =account_balance +?
WHERE accountNo = ?
<sql:param value="${transferAmount}"/>
<sql:param value="${destAccount}"/>
</sql:update>
</sql:transaction>

  XML标记?/FONT>
  使用标准的XML标记库,你所能做的完整的处理Q特别是可扩展性单一语言变换说明QXSLTQ的处理Q对于另一文章来说是一个很好的主题。下面我会涵盖够的让你开始的知识?

  在JSTL的XML支持遵@XPath规范。XPath的重要功能之一是ؓ讉KXML著名的分层的信息提供一个清晰的语法。也许看到每件是如何工作的最Ҏ的方法就是看看我们如何用来自于一个真实JSTL늚一个片断里的标讎ͼ

!-- Find and parse our XML document (somewhere on the WWW) -->
<c:import url="http://www.cheapstuff.com/orderStatus?id=2435" var="xml"/>
<x:parse xml="${xml}" var="doc"/>
<!-- access XML data via XPath expressions -->
<x:out select="$doc/name"/>
<x:out select="$doc/shippingAddress"/>
<x:out select="$doc/deliveryDate"/>
<!-- Set a scoped variable -->
<x:set var="custName" scope="request" select="$doc/name"/>

  在上面的输入和解析动作中Q我们装载和解析了一个指定的XML文档C个变量doc里。在上面的每个x:out动作中,我们使用了一个XPath表达式访问了解析的XML文档的元素,q且发送结果到JSP输Z?

  上面的设|表辑ּ计算了一个XPath表达式ƈ且将l果输入C个限定范围的变量里(在上qC子中Q它指在一个请求范围内Q?

  x:out 和x:set动作可以输出一个JspTagException。如果他们没有成功的话(极有可能因ؓXPath表达式指向ƈ不存在的标记Q,你的,像在所有其他情况下一P应该的处理这些异常(要么通过传统的JSP errorPage指oQ要么用JSTL的c:catch动作Q,

  JSTLҎ处理XSLT转换。在下面的示范页中,我们使用来自XML标记库中的x:transform动作Q用一个XSLT stylesheet创徏一个来自于XML源文档的一个格式化的页。x:transform动作最重要的属性是XML和XSLT属性,在下面的例子中,我们讄了一个来自于我们在同一初始化的变量的xslt属性;我们也在动作的体中设|了XML属性。该动作默认为x:transform动作?

  默认的,转换的结果送到输ZQ你也可以保存结果到一个带x:var属性的变量内:

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/xml" prefix="x" %>
<c:set var="xsltSource"> 
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
      <xsl:apply-templates/>
</xsl:template>
<xsl:template match="music">
<html>
<head></head>
<body marginheight="0" marginwidth="0" topmargin="0" leftmargin="0">
<table cellpadding="0" cellspacing="0" border="1" bgcolor="#ffffff">
      <tr>
      <td><STRONG>Artist</STRONG></td>
      <td><STRONG>Album</STRONG></td>
      <td><STRONG>Year</STRONG></td>
      <td><STRONG>Genre</STRONG></td>
      </tr>
      <!---Set up for loop to collect all the artist information //-->
      <!-- <xsl:for-each select="./*[name()='artists']"> -->
      <xsl:for-each select="artists">
        <tr>
          <td><xsl:value-of select="artist"/></td>
          <td><xsl:value-of select="album"/></td>
          <td><xsl:value-of select="year"/></td>
         <td><xsl:value-of select="genre"/></td>
        </tr>
     </xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
</c:set> 
<x:transform xslt="${xsltSource}" >
<music>
<artists>
    <artist>Jonny B</artist>
    <album>Feedback and Distortion</album>
    <year>2001</year>
     <genre>Rock</genre>
      </artists> 
     <artists>
      <artist>Harmony's Nieces</artist>
      <album>Sappy Pop Ballads</album>
      <year>2002</year>
      <genre>Pop</genre>
      </artists> 
</music>
</x:transform>

  你也能用c:import动作再定义一个额外的源文档和stylesheetQ就好像在这个示范的代码片断展示的一PQ?

<c:import var="${xmlSource}" url="${someDocumentURL}" />
<c:import var="${xsltSource}" url="${anotherDocumentURL}" />
<x:transform xml="${xmlSource}" xslt="${xsltSource}" >

  l束?/FONT>
  xQ你应该对JSTL、它的四U标准标记库、和它如何ɾ|页开发更为容?有了很好的理解。现在你开始写一些JSTL!



kelven 2006-01-10 12:07 发表评论
]]>
RMI一步一步来http://www.tkk7.com/zhangrenquan/articles/27354.htmlkelvenkelvenTue, 10 Jan 2006 03:51:00 GMThttp://www.tkk7.com/zhangrenquan/articles/27354.htmlhttp://www.tkk7.com/zhangrenquan/comments/27354.htmlhttp://www.tkk7.com/zhangrenquan/articles/27354.html#Feedback0http://www.tkk7.com/zhangrenquan/comments/commentRss/27354.htmlhttp://www.tkk7.com/zhangrenquan/services/trackbacks/27354.html
     RMIQ远E方法调用(Remote Method InvocationQ是Enterprise JavaBeans的支柱,是徏立分布式Java应用E序的方侉K径。RMI是非常容易用的Q但是它非常的强大?BR>  RMI的基是接口,RMI构架Z一个重要的原理Q定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的q程计算服务和用它的客L?BR>
  一个正常工作的RMIpȝ׃面几个部分组成:
  • q程服务的接口定?
  • q程服务接口的具体实?
  • 桩(StubQ和框架QSkeletonQ文?
  • 一个运行远E服务的服务?
  • 一个RMI命名服务Q它允许客户端去发现q个q程服务
  • cL件的提供者(一个HTTP或者FTP服务器)
  • 一个需要这个远E服务的客户端程?

  下面我们一步一步徏立一个简单的RMIpȝ。首先在你的机器里徏立一个新的文件夹Q以便放|我们创建的文gQؓ了简单v见,我们只用一个文件夹存放客户端和服务端代码,q且在同一个目录下q行服务端和客户端?BR>
  如果所有的RMI文g都已l设计好了,那么你需要下面的几个步骤ȝ成你的系l:

  1?nbsp; ~写q且~译接口的Java代码
  2?nbsp; ~写q且~译接口实现的Java代码
  3?nbsp; 从接口实现类中生成桩QStubQ和框架QSkeletonQ类文g
  4?nbsp; ~写q程服务的主q行E序
  5?nbsp; ~写RMI的客LE序
  6?nbsp; 安装q且q行RMIpȝ

  1?nbsp; 接口
  W一步就是徏立和~译服务接口的Java代码。这个接口定义了所有的提供q程服务的功能,下面是源E序Q?BR>
//Calculator.java
//define the interface
import java.rmi.Remote;

public interface Calculator extends Remote
{
    public long add(long a, long b)
        throws java.rmi.RemoteException;

    public long sub(long a, long b)
        throws java.rmi.RemoteException;

    public long mul(long a, long b)
        throws java.rmi.RemoteException;

    public long div(long a, long b)
        throws java.rmi.RemoteException;
}
  注意Q这个接口承自RemoteQ每一个定义的Ҏ都必LZ个RemoteException异常对象?BR>
  建立q个文gQ把它存攑֜刚才的目录下Qƈ且编译?BR>
  >javac Calculator.java

  2?nbsp; 接口的具体实?BR>
  下一步,我们p写远E服务的具体实现Q这是一个CalculatorImplcLӞ

//CalculatorImpl.java
//Implementation
import java.rmi.server.UnicastRemoteObject

public class CalculatorImpl extends UnicastRemoteObject implements Calculator
{

    // q个实现必须有一个显式的构造函敎ͼq且要抛Z个RemoteException异常
    public CalculatorImpl()
        throws java.rmi.RemoteException {
        super();
    }

    public long add(long a, long b)
        throws java.rmi.RemoteException {
        return a + b;
    }

    public long sub(long a, long b)
        throws java.rmi.RemoteException {
        return a - b;
    }

    public long mul(long a, long b)
        throws java.rmi.RemoteException {
        return a * b;
    }

    public long div(long a, long b)
        throws java.rmi.RemoteException {
        return a / b;
    }
}
  同样的,把这个文件保存在你的目录里然后编译他?BR>
  q个实现cM用了UnicastRemoteObject去联接RMIpȝ。在我们的例子中Q我们是直接的从UnicastRemoteObjectq个cMl承的,事实上ƈ不一定要q样做,如果一个类不是从UnicastRmeoteObject上承,那必M用它的exportObject()Ҏ去联接到RMI?BR>
  如果一个类l承自UnicastRemoteObjectQ那么它必须提供一个构造函数ƈ且声明抛Z个RemoteException对象。当q个构造函数调用了super()Q它久激zUnicastRemoteObject中的代码完成RMI的连接和q程对象的初始化?BR>
  3?nbsp; 桩(StubsQ和框架QSkeletonsQ?BR>
  下一步就是要使用RMI~译器rmic来生成桩和框架文Ӟq个~译q行在远E服务实现类文g上?BR>
  >rmic CalculatorImpl

  在你的目录下q行上面的命令,成功执行完上面的命o你可以发C个Calculator_stub.class文gQ如果你是用的Java2SDKQ那么你q可以发现Calculator_Skel.class文g?BR>
  4?nbsp; L服务?BR>
  q程RMI服务必须是在一个服务器中运行的。CalculatorServercL一个非常简单的服务器?BR>
//CalculatorServer.java
import java.rmi.Naming;

public class CalculatorServer {

   public CalculatorServer() {
     try {
       Calculator c = new CalculatorImpl();
       Naming.rebind("rmi://localhost:1099/CalculatorService", c);
     } catch (Exception e) {
       System.out.println("Trouble: " + e);
     }
   }

   public static void main(String args[]) {
     new CalculatorServer();
   }
}
  建立q个服务器程序,然后保存C的目录下Qƈ且编译它?BR>
  5?nbsp; 客户?BR>
  客户端源代码如下Q?BR>
//CalculatorClient.java

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

public class CalculatorClient {

    public static void main(String[] args) {
        try {
            Calculator c = (Calculator)
                           Naming.lookup(
                 "rmi://localhost
                        /CalculatorService");
            System.out.println( c.sub(4, 3) );
            System.out.println( c.add(4, 5) );
            System.out.println( c.mul(3, 6) );
            System.out.println( c.div(9, 3) );
        }
        catch (MalformedURLException murle) {
            System.out.println();
            System.out.println(
              "MalformedURLException");
            System.out.println(murle);
        }
        catch (RemoteException re) {
            System.out.println();
            System.out.println(
                        "RemoteException");
            System.out.println(re);
        }
        catch (NotBoundException nbe) {
            System.out.println();
            System.out.println(
                       "NotBoundException");
            System.out.println(nbe);
        }
        catch (
            java.lang.ArithmeticException
                                      ae) {
            System.out.println();
            System.out.println(
             "java.lang.ArithmeticException");
            System.out.println(ae);
        }
    }
}
  保存q个客户端程序到你的目录下(注意q个目录是一开始徏立那个,所有的我们的文仉在那个目录下Q,q且~译他?BR>
  6?nbsp; q行RMIpȝ

  现在我们建立了所有运行这个简单RMIpȝ所需的文Ӟ现在我们l于可以q行q个RMIpȝ啦!来n受吧?BR>
  我们是在命o控制Cq行q个pȝ的,你必d启三个控制台H口Q一个运行服务器Q一个运行客LQ还有一个运行RMIRegistry?BR>
  首先q行注册E序RMIRegistryQ你必须在包含你刚写的类的那么目录下q行q个注册E序?BR>
  >rmiregistry

  好,q个命o成功的话Q注册程序已l开始运行了Q不要管他,现在切换到另外一个控制台Q在W二个控制台里,我们q行服务器CalculatorServiceQ因为RMI的安全机制将在服务端发生作用,所以你必须增加一条安全策略。以下是对应安全{略的例?
grant {
permission java.security.AllPermission "", "";
};
  注意:q是一条最单的安全{略,它允怓Q何h做Q何事,对于你的更加关键性的应用,你必L定更加详l安全策略?BR>  现在Zq行服务端,你需要除客户c?CalculatorClient.class)之外的所有的cL件。确认安全策略在policy.txt文g之后,使用如下命o来运行服务器?/P>

  > java -Djava.security.policy=policy.txt CalculatorServer

  q个服务器就开始工作了Q把接口的实现加载到内存{待客户端的联接。好现在切换到第三个控制収ͼ启动我们的客L?BR>  Z在其他的机器q行客户端程序你需要一个远E接?Calculator.class) 和一个stub(CalculatorImpl_Stub.class)?使用如下命oq行客户?/P>

   prompt> java -Djava.security.policy=policy.txt CalculatorClient

如果所有的q些都成功运行,你应该看C面的输出Q?BR>  1
  9
  18
  3
  如果你看C上面的输出,恭喜你,你成功了Q你已经成功的创Z一个RMIpȝQƈ且他正工作了。即使你q行在同一个计机上,RMIq是使用了你的网l堆栈和TCP/IP去进行通讯Qƈ且是q行在三个不同的Java虚拟Z。这已经是一个完整的RMIpȝ?/P>

kelven 2006-01-10 11:51 发表评论
]]>
学习用Google做搜?/title><link>http://www.tkk7.com/zhangrenquan/articles/27302.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 09 Jan 2006 11:44:00 GMT</pubDate><guid>http://www.tkk7.com/zhangrenquan/articles/27302.html</guid><wfw:comment>http://www.tkk7.com/zhangrenquan/comments/27302.html</wfw:comment><comments>http://www.tkk7.com/zhangrenquan/articles/27302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhangrenquan/comments/commentRss/27302.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhangrenquan/services/trackbacks/27302.html</trackback:ping><description><![CDATA[[摘录于]: http://www.matrix.org.cn/thread.shtml?view_id=971&forum_id=19<BR><BR>1Q前a<BR>2Q摘?BR>3Q如何用本?BR>4QGoogle?BR>5Q搜索入?BR>6Q初阶搜?BR>  6.1Q搜索结果要求包含两个及两个以上关键?BR>  6.2Q搜索结果要求不包含某些特定信息<BR>  6.3Q搜索结果至包含多个关键字中的L一?BR>7Q杂语?BR>  7.1Q通配W问?BR>  7.2Q关键字的字母大写<BR>  7.3Q搜索整个短语或者句?BR>  7.4Q搜索引擎忽略的字符以及强制搜烦<BR>8Q进阶搜?BR>  8.1Q对搜烦的网站进行限?BR>  8.2Q查询某一cL?BR>  8.3Q搜索的关键字包含在URL链接?BR>  8.4Q搜索的关键字包含在|页标题?BR>  8.5Q搜索的关键字包含在|页“锚”内<BR>9Q其他罕用语?BR>  9.1Q搜索所有链接到某个URL地址的网?BR>  9.2Q查找与某个面l构内容怼的页?BR>  9.3Q从Google服务器上~存面中查询信?BR>10Q图片搜?BR>11Q目录检?BR>12Q新ȝ搜烦<BR>13QGoogle的其他杰出功?BR>  13.1Q网快?BR>  13.2Q集成化的工h<BR>  13.3Q单词英文解?BR>  13.4Q网늿?BR>  13.5Q单词纠?BR>  13.6Q搜索结果过?BR>14QGoogle未发布的一些新Ҏ和功能<BR>  14.1Q对|页更新日期做出限定<BR>  14.2Q新L?BR>  14.3Q分cd告搜?BR>  14.4Q其它Google的最新发展动?BR>  14.5Q一个有的地方<BR>15Q后?BR><BR>—————————————————————————————————?BR><BR>[B]1Q前a[/B]<BR><BR>  我是?000q上半年知道Google的。在q之前,我搜索英文信息通常用AltaVistaQ而搜索中文信息则常用Sina。但自用了Google之后Q它便成为我的Favorite Search engine了。这也得感谢新浪|友ҎQ因为当初正是因Z的大力推介,才我识得了Google?BR><BR>  记得1996q夏季的时候,当我W一ơ接触InternetQ便被扑面而来的魔力征服了。那U天涯咫的感觉Q真是妙不可a。在l历了疯狂的WWW冲浪和如痴如醉的BBS沉迷之后Q我意识到InternetҎ影响x的还是在于学习方式的变迁?BR><BR>  如何来描q这U变q呢Q以前的学习Q一般需要预先在肚子里存储下_的知识,必要Ӟ׃量的信息中提取所需的部分。这U学习方式造就了很多“才高八斗,学富五R”的大才子。但是,C信息领域大大出“四书五l”的新时期,预先无目的的吞下量信息的学习方式就有些不合时宜了。比方说Q我们到了大型的图书城,往往有一U不知所措的感觉。旧有的学习方式需要变更以适应q个信息爆炸的年代。目的明的d习,卛_知道要学什么,然后有目的的d扄案,q种方式看上L加有效率。我不妨把这UCؓ“即学式”,相应的,旧有的称为“预学式”?BR><BR>  不过Q“即学式”的实施是有前提的。首先,要求学习者拥有一个包|万象的信息库,以供随时抽取各种目的信息Q其ơ,是需要一个强劲的信息索工P以便高效率的从信息库中提取信息。很明显QInternet可以充当那个量的信息库Q而搜索引擎,则正是寻扑օ明之火的l好工具?BR><BR>  “公Ʋ善其事Q必先利其器”。Internet只有一个,而搜索引擎则有N多个。有搜烦高手_所谓搜索,是“在正确的地方用正的工具和正的ҎL正确的内容”。但是,对于普通h而言Q掌握诸多搜索引擎的可能性似乎不大。用一两个相对强劲的具代表性的工具辑ֈl大多数搜烦目的更ؓZ所q切希望。不同的时期Q涌现出不同的强者。就目前而言Q我们非常幸q的有了Q?*****Google******<BR><BR><BR>[B]2Q摘要[/B]<BR><BR>  本文要的介绍了Google的历史和特点QGoogle的基本搜索语法和高搜烦语法QGoogle的特色功能,包括囄搜烦、新ȝ搜烦和集成工h{。尽本文名为“Google搜烦从入门到_N”,但事实上Q本文只能算是对Google的一个ƈ不十分完全的介绍而已?)<BR><BR><BR><B>3Q如何用本?/B><BR><BR>  阅读本文最好具备一些最基本的布代数基Q如“与”、“或”、“非”等。不q,即便你没有这斚w的知识,也不必在意。对那些实例q行l习Q你的疑惑就会迎刃而解。对于刚刚接触网l搜索的读者而言Q也怽应该从头到尾的阅L文;但对于那些有一定搜索基的读者而言Q只需要蟩跃着L自己所需要的信息可以了。此外,你也可以参考中文Google大全Qhttp://www.Google.com/intl/zh-CN/about.htmlQ以及搜索帮助:http://www.google.com/intl/zh-CN/help.htmlQ那是官方Google使用手册以及问题解答中心?BR><BR><BR><B>4QGoogle?/B><BR><BR>  GoogleQwww.Google.comQ是一个搜索引擎,׃个斯坦福大学博士生Larry Page与Sergey Brin?998q?月发明,Google Inc. ?999q创立?000q?月䆾QGoogle替代Inktomi成ؓYahoo公司的搜索引擎,同年9月䆾QGoogle成ؓ中国|易公司的搜索引擎?8q至今,Google已经获得30多项业界大奖。到Google的新M心(http://www.Google.com/press/index.htmlQ,你可以找到关于一切关于Google的历史和新闻资料?BR><BR>  Google的成功得益于其强大的功能和独到的特点Q?BR><BR>Google索网|量达24亿,搜烦引擎中排名第一Q?BR>Google支持多达132U语aQ包括简体中文和J体中文Q?BR>Google|站只提供搜索引擎功能,没有花里胡哨的篏赘;<BR>Google速度极快Q年初时据说?5000多台服务器,200多条T3U宽带;<BR>Google的专利网别技术PageRank能够提供准确率极高的搜烦l果Q?<BR>Google化的“手气不错”功能,提供可能最W合要求的网站;<BR>Google的“网快照”功能,能从Google服务器里直接取出~存的网c?BR>Googleh独到的图片搜索功能;<BR>Googleh强大的新ȝ搜烦功能Q?BR>Googleh二进制文件搜索功能(PDFQDOCQSWF{)Q?BR>Googleq有很多在开发阶D늚令h吃惊的设惛_功能?BR>{等<BR><BR><BR><B>5Q搜索入?/B><BR><BR>  要用Google做搜索,当然首先要进Google|站--www.Google.comQ不q,163.com和yahoo.com.cn使用的实际上也是Google搜烦引擎Q只是对搜烦l果q行了编排,而且无法提供一些特色功能,如图片搜索等。因此,如果你要搜烦|页的话Q就直接使用Google.com吧?BR><BR>  W一ơ进入GoogleQ它会根据你的操作系l,定语言界面。需要提醒的是,Google是通过cookie来存储页面设定的Q所以,如果你的pȝ用cookieQ就无法对Google界面q行个h讑֮了?BR><BR>  Google的首很清爽QLOGO下面Q排列了四大功能模块Q网站、图像、新ȝ和目录服务。默认是|站搜烦。现在进行第一ơ搜索实践,假定你是个搜索新手,惌了解一下搜索引擎的来龙去脉和搜索技巧。在搜烦框内输入一个关键字“搜索引擎”, 选中“搜索中??|页”选项Q然后点M面的“Google搜烦”按钮(或者直接回车)Q结果就出来了?搜烦Q“搜索引擎?BR>l果Q已搜烦有关搜烦引擎的中??|页?q?07,000Ҏ询结果,q是W?-10??搜烦用时0.08U?BR><BR>  仔细看一下搜索结果的前十,׃发现l大部分链接是搜索引擎本w,而不是对搜烦引擎的或者搜索技巧方面的介绍?BR><BR>  注意Q文章中搜烦语法外面的引号仅起引用作用,不能带入搜烦栏内?BR><BR><BR><B>6Q初阶搜?/B><BR><BR>  上例是最基本的搜索,x询包含单个关键字的信息。但是,你可以发玎ͼ上例中,单个关键字“搜索引擎”,搜烦得的信息如烟vQ而且l大部分q不W合自己的要求,怎么办呢Q我们需要进一步羃搜索范围和l果?BR><BR><SPAN style="COLOR: limegreen">6.1Q搜索结果要求包含两个及两个以上关键?/SPAN><BR><BR>  一般搜索引擎需要在多个关键字之间加上?”,而Google无需用明文的?”来表示逻辑“与”操作,只要I格可以了。现在,我们需要了解一下搜索引擎的历史Q因此期望搜得的|页上有“搜索引擎”和“历叜y两个关键字?BR><BR>CZQ搜索所有包含关键词“搜索引擎”和“历叜y的中文|页<BR>搜烦Q“搜索引?历史?BR>l果Q已搜烦有关搜烦引擎 历史的中??|页?q?8,600Ҏ询结果,q是W?-10??搜烦用时0.36U?<BR><BR>  用了两个关键字,查询l果已经?0多万减到7万多V但查看一下搜索结果,发现前列的绝大部分结果还是不W合要求Q大部分|页涉及的“历叜y,q不是我们所需要的“搜索引擎的历史”?怎么办呢Q删除与搜烦引擎不相关的“历叜y。我们发玎ͼq部分无用的资讯QL和“文化”这个词相关的,另外一些常见词是“中国历叜y、“世界历叜y、“历史书c”等?BR><BR><SPAN style="COLOR: limegreen">6.2Q搜索结果要求不包含某些特定信息</SPAN><BR><BR>  Google用减号?”表C逻辑“非”操作。“A –B”表C搜索包含A但没有B的网c?BR><BR>CZQ搜索所有包含“搜索引擎”和“历叜y但不含“文化”、“中国历叜y和“世界历叜y的中文|页<BR>搜烦Q“搜索引?历史 -文化 -中国历史 -世界历史?BR>l果Q已搜烦有关搜烦引擎 历史 -文化 -中国历史 -世界历史的中??|页?q?6,800Ҏ询结果,q是W?-10??搜烦用时0.22U?<BR><BR>  我们看到Q通过L不相关信息,搜烦l果又减了近一半。第一个搜索结果是Q?BR><BR>搜烦引擎直通R≡搜索引擎发展历?BR>搜烦引擎直通R, ... 搜烦引擎专业介绍站点. ... <BR>www.se-express.com/about/about.htm - 14k - |页快照 - cM|页<BR><BR>非常W合搜烦要求。另外,W八Ҏ索结果:<BR><BR>463搜烦?BR>本站?整个|站 在此输入关键? 你的当前<BR>位置Q首?>> Internet搜烦手册 >> 搜烦引擎的历? ... <BR>www.cnco.net/search/history.htm - 21k - |页快照 - cM|页<BR><BR>  也符合搜索要求。但是,10个结果只有两个符合要求,未免太少了点。不q,在没有更好的{略之前Q不妨先点开一个结果看看。点开se-express.com的这个名为“搜索引擎发展历叜y的|页Q我们发玎ͼ搜烦引擎的历Ԍ是与互联|早期的文g索工具“Archie”息息相关的。此外,搜烦引擎g有个核心E序Q叫“蜘蛛”,而最早成型的搜烦引擎是“Lycos”,使搜索引擎深入h心的是“Yahoo”。了解了q些信息Q我们就可以q一步的让搜索结果符合要求了?BR><BR>  注意Q这里的?”和?”号Q是英文字符Q而不是中文字W的“+”和“-”。此外,操作W与作用的关键字之间Q不能有I格。比如“搜索引?- 文化”,搜烦引擎视为关键字为“搜索引擎”和“文化”的逻辑“与”操作,中间的?”被忽略?BR><BR><SPAN style="COLOR: teal">6.3Q搜索结果至包含多个关键字中的L一个?/SPAN><BR><BR>  Google用大写的“OR”表C逻辑“或”操作。搜索“A OR B”,意思就是说Q搜索的|页中,要么有AQ要么有BQ要么同时有A和B。在上例中,我们希望搜烦l果中最好含有“archie”、“lycos”、“蜘蛛”等关键字中的一个或者几个,q样可以q一步的_搜烦l果?BR><BR>CZQ搜索如下网,要求必须含有“搜索引擎”和“历叜y,没有“文化”,可以含有以下关键字中ZQ何一个或者多个:“Archie”、“蜘蛛”、“Lycos”、“Yahoo”?BR>搜烦Q“搜索引?历史 archie OR 蜘蛛 OR lycos OR yahoo -文化?BR>l果Q已搜烦有关搜烦引擎 历史 archie OR 蜘蛛 OR lycos OR yahoo -文化的中??|页?q?,400Ҏ询结果,q是W?-10??搜烦用时0.16U?BR><BR>  我们看到Q搜索结果羃到8千多,?0结果中Q大部分都符合搜索要求。如果你想了解一下解搜烦引擎的历史发展,׃妨研I一下现在搜索到的结果吧?注意Q“与”操作必ȝ大写的“OR”,而不是小写的“or”?BR><BR>  在上面的例子中,我介l了搜烦引擎最基本的语法“与”“非”和“或”,q三U搜索语法Google分别用?”(I格Q、?”和“OR”表C。顺着上例的思\Q你也可以了解到如何~小搜烦范围Q迅速找到目的资讯的一般方法:目标信息一定含有的关键字(用?”连hQ,目标信息不能含有的关键字Q用?”去掉)Q目标信息可能含有的关键字(用“OR”连hQ?BR><BR><BR><B>7Q杂语?/B><BR><BR><SPAN style="COLOR: limegreen">7.1Q通配W问?/SPAN><BR><BR>  很多搜烦引擎支持通配W号Q如?”代表一q串字符Q?”代表单个字W等。Google寚w配W支持有限。它目前只可以用?”来替代单个字符Q而且包含?”必ȝ""引v来。比如,??d"”,表示搜烦W一个ؓ“以”,末两个ؓ“治国”的四字短语Q中间的?”可以ؓM字符?BR><BR><SPAN style="COLOR: teal">7.2Q关键字的字母大写</SPAN><BR><BR>  Google对英文字W大写不敏感,“GOD”和“god”搜索的l果是一L?BR><BR><SPAN style="COLOR: limegreen">7.3Q搜索整个短语或者句?/SPAN><BR><BR>  Google的关键字可以是单词(中间没有I格Q,也可以是短语Q中间有I格Q。但是,用短语做关键字,必须加英文引P否则I格会被当作“与”操作符?BR><BR>CZQ搜索关于第一ơ世界大战的英文信息?<BR>搜烦Q?world war I"?BR>l果Q已向英特网搜烦"world war i". q?37,000Ҏ询结果,q是W?-10??搜烦用时0.06U?<BR><BR><SPAN style="COLOR: teal">7.4Q搜索引擎忽略的字符以及强制搜烦</SPAN><BR><BR>  Google对一些网路上出现频率极高的英文单词,如“i”、“com”、“www”等Q以及一些符号如?”、?”等Q作忽略处理?BR><BR>CZQ搜索关于wwwh的一些历史资料?BR>搜烦Q“www的历?internet?BR>l果Q以下的字词因ؓ使用q于频繁Q没有被列入搜烦范围: www ? 已搜索有关www的历?internet的中??|页?q?5,100Ҏ询结果,q是W?-10??搜烦用时0.22U?<BR><BR>  我们看到Q搜索“www的历?internet”,但搜索引擎把“www”和“的”都省略了。于是上q搜索只搜烦了“历叜y和“internet”。这昄不符合要求。这里我Z说一Ҏ索引擎分词的知识。当我们在搜索“www的历叜y的时候,搜烦引擎实际上把q个短语分成三部分,“www”、“的”和“历叜y分别来索,q就是搜索引擎的分词。所以尽你输入了连l的“www的历叜y,但搜索引擎还是把q个短语当成三个关键字分别检索?BR><BR>  如果要对忽略的关键字q行强制搜烦Q则需要在该关键字前加上明文的?”号?BR>搜烦Q?www +的历?internet?BR>l果Q已搜烦有关+www +的历?internet的中??|页?q?5,000Ҏ询结果,q是W?-10??搜烦用时0.05U?<BR><BR>  另一个强制搜索的Ҏ是把上述的关键字用英文双引号引v来。在上例“”world war I””中Q“I”其实也是忽略词Q但因ؓ被英文双引号引v来,搜烦引擎强制搜索这一特定短语?BR><BR>搜烦Q?www的历? internet?BR>l果Q已搜烦有关"www的历? internet的中??|页?q?Ҏ询结果,q是W?-6??搜烦用时0.26U?<BR><BR>  我们看到Q这一搜烦事实上把“www的历叜y作为完整的一个关键字。显Ӟ包含q样一个特定短语的|页q不是很多,不过Q每一w很符合要求?BR><BR>  注意Q大部分常用英文W号Q如问号Q句P逗号{)无法成ؓ搜烦关键字,加强制也不行?BR><BR><BR><B>8Q进阶搜?/B><BR><BR>  上面已经探讨了Google的一些最基础搜烦语法。通常而言Q这些简单的搜烦语法已经能解决绝大部分问题了。不q,如果xq速更贴切扑ֈ需要的信息Q你q需要了解更多的东西?BR><BR>8.1Q对搜烦的网站进行限?BR><BR>  “site”表C搜索结果局限于某个具体|站或者网站频道,如“www.sina.com.cn”、“edu.sina.com.cn”,或者是某个域名Q如“com.cn”、“com”等{。如果是要排除某|站或者域名范围内的页面,只需用?|站/域名”?BR><BR>CZQ搜索中文教育科研网站(edu.cnQ上关于搜烦引擎技巧的面?BR>搜烦Q“搜索引?技?site:edu.cn?BR>l果Q已搜烦有关搜烦引擎 技?site:edu.cn的中??|页?q?08Ҏ询结果,q是W?-10??搜烦用时0.05U?BR><BR>CZQ上著名IT门户|站ZDNET和CNET搜烦一下关于搜索引擎技巧方面的资讯?BR>搜烦Q?search engine" tips site:www.zdnet.com OR site:www.cnet.com?BR>l果Q已在www.zdnet.com内搜索有?search engine" tips OR site:www.cnet.com的网c?q?,040Ҏ询结果,q是W?-10??搜烦用时0.09U?BR><BR>  注意Q在q里Google有个BUG。“已在www.zdnet.com内搜索…”,其实应该表述成“已在www.zdnet.com和www.cnet.com内搜索…”?BR><BR>CZQ搜索新科技频道中关于搜索引擎技巧的信息?BR>搜烦Q“搜索引?技?site:tech.sina.com.cn?BR>l果Q已在tech.sina.com.cn搜烦有关搜烦引擎 技?的中??|页?q?63Ҏ询结果,q是W?-10??搜烦用时0.07U?<BR><BR>  注意Qsite后的冒号文字W,而且Q冒号后不能有空|否则Q“site:”将被作Z个搜索的关键字。此外,|站域名不能有“http://”前~Q也不能有Q何?”的目录后缀Q网站频道则只局限于“频道名.域名”方式,而不能是“域?频道名”方式?BR><BR><SPAN style="COLOR: teal">8.2Q在某一cL件中查找信息</SPAN><BR><BR>  “filetype:”是Google开发的非常强大实用的一个搜索语法。也是_Google不仅能搜索一般的文字面Q还能对某些二进制文档进行检索。目前,Google已经能检索微软的Office文档?xls?ppt?docQ?rtfQWordPerfect文档QLotus1-2-3文档QAdobe?pdf文档QShockWave?swf文档QFlash动画Q等。其中最实用的文档搜索是PDF搜烦。PDF是ADOBE公司开发的电子文档格式Q现在已l成Z联网的电子化出版标准。目前Google索的PDF文档大约?500万左叻I大约占所有烦引的二进制文档数量的80Q。PDF文档通常是一些图文ƈ茂的l合性文档,提供的资讯一般比较集中全面?BR><BR>CZQ搜索几个资产负的Office文档?BR>搜烦Q“资产负 filetype:doc OR filetype:xls OR filetype:ppt?BR>l果Q已搜烦有关资负 filetype:doc OR filetype:xls OR filetype:ppt的中??|页?q?81Ҏ询结果,q是W?-10??搜烦用时0.04U?<BR><BR>  注意Q下载的Office文g可能含有宏病毒,谨慎操作?BR><BR>CZQ搜索一些关于搜索引擎知识和技巧方面的PDF文档<BR>搜烦Q?quot;search engine" tips OR tutorial filetype:pdf?BR>l果Q已向英特网搜烦"search engine" tips OR tutorial filetype:pdf. q?2,600Ҏ询结果,q是W?-10??搜烦用时0.22U?BR><BR>  我们来看其中的一个结果:<BR><BR>[PDF]Search Engines Tips<BR>文档cd: PDF/Adobe Acrobat - HTML ?BR>... http://www.google.com/press/zeitgeist.html See what people are searching on at Google.com<BR>* Search Engine Watch http://searchenginewatch.com/ Some free tips ... <BR>www.allvertical.com/PromoKits/SearchEngineTips.pdf - cM|页<BR><BR>  可以看到QGoogle用[PDF]来标记这是一个PDF的文档检索,另外Q它q给Z该PDF文档的HTML版本Q该HTML版保留了文档的文字内容和l构Q但没有囄?BR><BR><SPAN style="COLOR: limegreen">8.3Q搜索的关键字包含在URL链接?/SPAN><BR><BR>  “inurl”语法返回的|页链接中包含第一个关键字Q后面的关键字则出现在链接中或者网|档中。有很多|站把某一cd有嗤?属性的资源名称昄在目录名U或者网名UCQ比如“MP3”、“GALLARY”等Q于是,可以用INURL语法扑ֈq些相关资源链接Q然后,用第二个关键词确定是否有某项具体资料。INURL语法和基本搜索语法的最大区别在于,前者通常能提供非常精的专题资料?CZQ查找MIDI曜y一声笑”?BR>搜烦Q“inurl:midi “一声笑”?BR>l果Q已搜烦有关inurl:midi "沧v一声笑"的中??|页?q?7Ҏ询结果,q是W?-10??搜烦用时0.34U?<BR><BR>  注意Q“inurl:”后面不能有I格QGoogle也不对URLW号如?”进行搜索。例如,Google会把“cgi-bin/phf”中的?”当成空格处理?BR><BR>  “allinurl”语法返回的|页的链接中包含所有作用关键字。这个查询的关键字只集中于网늚链接字符丌Ӏ?BR><BR>CZQ查扑֏能具有PHF安全漏洞的公司网站。通常q些|站的CGI-BIN目录中含有PHF脚本E序Q这个脚本是不安全的Q,表现在链接中是“域?cgi-bin/phf”?BR>搜烦Q“allinurl:"cgi-bin" phf +com?BR>l果Q已向英特网搜烦allinurl:"cgi-bin" phf +com. q?1Ҏ询结果,q是W?-10??搜烦用时0.11U?BR><BR><SPAN style="COLOR: teal">8.4Q搜索的关键字包含在|页标题?/SPAN><BR><BR>  “intitle”和“allintitle”的用法cM于上面的inurl和allinurlQ只是后者对URLq行查询Q而前者对|页的标题栏q行查询。网|题,是HTML标记语言title中之间的部分。网设计的一个原则就是要把主늚关键内容用简z的语言表示在网|题中。因此,只查询标题栏Q通常也可以找到高相关率的专题面?CZQ查找日本明星藤原纪香的照片集?BR>搜烦Q“intitle:藤原U香 "写真??BR>l果Q已搜烦有关intitle:藤原U香 "写真?的中??|页?q?15Ҏ询结果,q是W?-10??搜烦用时0.15U?BR><BR><SPAN style="COLOR: limegreen">8.5Q搜索的关键字包含在|页的“锚”(anchorQ链点内</SPAN><BR><BR>  所谓“锚”,是在同一个网中快速切换链接点。与URL和TITLEcMQGoogle提供了两U对anchor的检索,“inanchor”和“allincnchor”。对此不作详q?BR><BR><BR><B>9Q其他罕用语?/B><BR><BR><SPAN style="COLOR: limegreen">9.1Q搜索所有链接到某个URL地址的网?/SPAN><BR><BR>  如果你拥有一个个人网站,估计很想知道有多h对你的网站作了链接。而“link”语法就能让你迅速达到这个目的?BR><BR>CZQ搜索所有含指向华军软g园“www.newhua.com”链接的|页?BR>搜烦Q“link:www.newhua.com?BR>l果Q搜索有链接到www.newhua.com的网??q?20Ҏ询结果,q是W?-10??搜烦用时0.12U?BR><BR>  注意Q“link”不能与其他语法相؜合操作,所以“link:”后面即使有I格Q也被Google忽略。另外还要说明的是,link只列出Google索引链接很小一部分Q而非全部Q所以如果你用Google没有搜到铑ֈ你的主页的链接,也不必灰心气?BR><BR>  除了上述功能Qlink语法q有其它妙用。一般说来,做友情链接的|站都有怼地方。这P你可以通过q些友情链接Q找C大批h怼内容的网站。比如说Q你是个天文爱好者,你发现某|站非常不错Q那么,可以用link语法查一下与之做链接的网站,也许可以扑ֈ更多W合你兴的内容?BR><BR><SPAN style="COLOR: teal">9.2Q查找与某个面l构内容怼的页?/SPAN><BR><BR>  “related”用来搜索结构内Ҏ面相似的|页。例Q搜索所有与中文新浪|主늛似的面Q如|易首页Q搜狐首,中华|首늭Q,“related:wwwsina.com.cn/index.shtml”。我到现在也不明白这个语法有什么作用,如果有谁知道Q请不吝指教。预先感谢?)<BR><BR><SPAN style="COLOR: limegreen">9.3Q从Google服务器上~存面中查询信?/SPAN><BR><BR>  “cache”用来搜索Google服务器上某页面的~存Q通常用于查找某些已经被删除的死链接网,相当于用普通搜索结果页面中的“网快照”功能?BR><BR>  其它|用语法如info、stock{不一一介绍Q有兴趣的读者可以参阅Google大全?BR><BR><BR><B>10Q图片搜?/B><BR><BR>  Google自称可以?90,000,000张图片,q称自己为“互联网上最好用的图像搜索工具”。从使用l果来看QGoogle的图片搜索的不错,但个Z为比AltaVista的还是要差一些,主要体现在检索图片数量比不上AVQ匹配度比AV的图片搜索器也差了些。但AltaVista国内用户无法正常讉KQ因此对中国用户而言QGoogle的图片搜索引擎已l是最好的了?BR><BR>  Google首页点击“图像”链接就q入了Google的图像搜索界面“images.Google.com”。你可以在关键字栏位内输入描q图像内容的关键字,如“britney spears”,׃搜烦到大量的甜甜布兰妮的图片。我目前不是很清楚囄的排列标准,不过以观察来看,g囄文g名完全符合关键字的结果排列比较考前Q然后才按照普通的面搜烦时的标准排列?BR><BR>  Googlel出的搜索结果具有一个直观的~略图(THUMBNAILQ,以及对该~略囄单描qͼ如图像文件名Uͼ以及大小{。点ȝ略图Q页面分成两,上祯是图像之~略图,以及面链接Q而下,则是该图像所处的面。屏q右上角有一个“Remove Frame”的按钮Q可以把框架面q速切换到单祯的结果页面,非常方便?BR><BR>  Google囑փ搜烦目前支持的语法包括基本的搜烦语法如?”、?”、“OR”、“site”和 “filetype:”。其中“filetype:”的后缀只能是几U限定的囄cMQ如JPGQGIF{?BR><BR>CZQ查找新网上本拉登的图?BR>搜烦Q“拉?OR 拉丹 site:sina.com.cn?BR>l果Q搜索有?拉登 OR 拉丹 site:sina.com.cn 的图片?共有6Ҏ询结果,q是W?-6V?搜烦用时0.36U?BR><BR>  q里我想说明一点的是,images.google.com作ؓ专门的图片搜索引擎,实际上有其特D的用途?BR><BR>  举个例子Q互联网上本拉登的照片成千上万,但是Q它们都是分散的Q往往随机的分布于各种新闻报道中。如果用搜烦囄库的方式Q最Ҏ惛_的如“Ben Ladin photo”)Q来搜烦本拉ȝ照片Q显然是不恰当的Q因为很有Z门ؓ拉登Z个在U相册。在q个时候,images.google.com派上用Z?BR><BR>  但是Q如果查扄囄在网上有很多主题“gallary”,如诸多电q视明星的照片Q则明显׃适合用images.google.com来查找了?BR><BR>  images.google.com对于很多报纸杂志的编辑,l对是一个雪中送炭式的工具。比如要在某个版面上插一张专题图片,用google的图片搜索功能几U钟可以搞定?BR><BR>  lgQ可以有q样的一般性结论:如果要搜索的囄是分散的Q则用google囄搜烦Q如果要搜烦的图片通常是处于某个图片集合中的,则不适合用google囄搜烦?BR><BR><BR><B>11Q目录检?/B><BR><BR>  如果不想搜烦q泛的网,而是惛_找某些专题网站,可以讉KGoogle的分cȝ录“http://directory.Google.com/”,中文目录是“http://directory.Google.com/Top/World/Chinese_Simplified/”。分cȝ|站目录一般由专h负责Q分cL,信息集中。因此读者应该养成这L习惯Q首先考虑所需要的信息能否在一个专门主题的|站上找到。不q需要说明的是,用目录检索,往往需要用户对查询的领域很熟悉。否则,q查询的内容属于哪个cȝ都不知道Q目录浏览也无从谈及了?目前Google使用的分cȝ录采用了ODP的内宏V“Open Directory Project”是|景公司所L的一大型公q늛录。由全世界各地的义务~辑人员来审核挑选网,q依照网늚性质及内Ҏ分门别类。因此,在某一目录门类中进行搜索往往能有更高的命中率。另外,GoogleҎ其专业的“网别”(PageRankQ技术对目录中登录的|站q行了排序,可以让一般的索更具高效率?BR><BR>CZQ查找一下介l搜索引擎方面的中文|站<BR>搜烦Q先q入中文体分cȝ录,再进入“计机”目录,再进入“互联网l”子目录Q再q入“搜寠Z子目录。我们看到在“World > Chinese Simplified > 计算?> 互联|络 > 搜寻”下Q还有两个子目录“分cȝ?(33) 搜烦引擎 (10)”,以及6个相关网站。显Ӟq些都是我们所需要的信息?BR><BR>  除了用鼠标层层点入,也可以在目录中检索。比如,在上例的“互联网l”目录下Q选中“只在互联网l中搜烦”选项Q在搜烦栏内填入“搜索引擎”进行搜索?BR>l果Q在分类Google |页目录中搜烦搜烦引擎?q?87Ҏ询结果,q是W?1-20??搜烦用时0.09U?<BR><BR>  可以看到Q上q查询结果比普通的索更有效Q因为在分类“互联网l”下q行搜烦剔除了很多不相关的诸如新Mcȝ无效信息。不q,对于中文用户而言Q现在最大的问题是志愿的中文目录~辑太少Q导致收录站点太,因此搜烦l果范围昑־q于狭隘。但愿这个问题能随着Google以及ODP目在国内名声的响亮而能得到改观?BR><BR><BR><B>12Q新ȝ搜烦</B><BR><BR>  新闻l有详尽的分cM题,某些主题q有专h理和编辑,h大量的有价g息。由于新ȝ包含的信息实在是量Q因此不利用工具q行索是不大可能的。DEJA一直是新闻l搜索引擎中的佼D?001q?月䆾QGoogleDEJA收购q提供了所有DEJA的功能。现在,除了搜烦之外QGoogleq支持新ȝ的WEB方式览和张贴功能?BR><BR>  q入Google新闻l“http://groups.Google.com/”,你有两种信息查找方式。一U是一层层的点击进入特定主题讨论组Q另一U则是直接搜索。现在,我们q行一个最单的搜烦试验Q查找一下新ȝ中关于山洞人的讨论信息?BR><BR>搜烦Q“山洞人?BR>l果Q在各群l内搜烦 山顶zh q?,400Ҏ询结果,q是W?-10??搜烦用时0.94U?搜烦l果默认按照“留a内容”排列,但是你也可以点击“依照日期”按钮,让帖子按照发布日期排列?BR><BR>  因ؓ新闻l中的帖子实在是多,而且又涉及一些普通搜索所没有的语法,所以徏议用“高U群l搜寠Z进入高U搜索界面。新ȝ高搜烦提供留言内容、分cM题、标题、留a者、留a代码、语a和发布日期作为条件进行搜索。其中作者项指作者发帖所用的唯一识别L子信?BR><BR><BR><B>13QGoogle的其他杰出功?/B><BR><BR><SPAN style="COLOR: blue">13.1|页快照</SPAN><BR><BR>  |页快照是Google抓下来缓存在服务器上的网c它有三个作用:<BR><BR>W一Q?如果原地址打开很慢Q那么可以直接查看Google~存面Q因为Google服务器速度极快?BR><BR>W二Q?如果原链接已l死掉或者因为网l的原因暂时链接不通,那么可以通过Google快照看到该页面信息。当Ӟ快照内容不是该页最新页面?BR><BR>W三Q?如果打开的页面信息量巨大Q一下子找不到关键词所在位|,那么可以通过Google快照Q因为快照中Google用黄色表明关键字位置?BR><BR><SPAN style="COLOR: limegreen">13.2Q集成化的工h</SPAN><BR><BR>  Z方便搜烦者,Google提供了工hQ集成于览器中Q用h需打开Google主页可以在工具条内输入关键字进行搜索。此外,工具条还提供了其他许多功能,如显C页面PageRank{。最方便的一点在于用户可以快L在Google主页、目录服务、新ȝ搜烦、高U搜索和搜烦讑֮之间切换。欲安装Google的工hQ可以访问“http://toolbar.Google.com/”,按页面提C可以自动下载ƈ安装。不q,Google工具条目前只支持IE5.0以上版本?BR><BR>  对于l常q行|络搜烦者而言QGoogle工具条实在是必备的东西!Q?BR><BR><SPAN style="COLOR: teal">13.3Q单词英文解?/SPAN><BR><BR>  写英文文章的时候,最头疼的事情就是对某个英文单词的用法不定。现在有了GoogleQ一切就q刃而解了!无论你是x找某个生词的意思还是想了解某个单词的用法,均可使用在线词典?BR><BR>  q入英文GoogleQ输入你要查的单词。D个例子,我想查一下suggest的用法。结果如下:“Searched the web for suggest. Results 1 - 10 of about 8,000,000. Search took 0.08 seconds. ”注意看上面句子中,单词suggest下出C一个横U,点击q个链接Q就跌{到另外一个网站“http://www.dictionary.com/”,Google已经把单词提交给该网站的查询脚本。看看这个网站所提供的详解释吧?)<BR><BR><SPAN style="COLOR: limegreen">13.4Q网늿?/SPAN><BR><BR>  你懂英文Q但是你不见得就懂d文、法文、拉丁文。如果搜索出来的面是这些语a怎么办?呵呵QGoogle提供了网늿译功能!Q虽然目前只支持有限的拉丁语、法语、西班牙语、d语和葡萄牙文Q但是我不得不承认,q是个杰出功能?BR><BR>  试着做以下搜索:“big bang site:fr”。这个表C查扑օ于宇宙大爆炸的法文网c看W一条结果:<BR><BR>The Big Bang Website - [ Translate this page ]<BR>... A propos de Big Bang. Le dernier numéro en date. Les anciens numéros. Autres<BR>activités. Concerts progressifs en France. Emissions de radio. Liens. <BR>perso.club-internet.fr/calyx/bigbang/ - 3k - Cached - Similar pages<BR><BR>  有点晕。没关系Q点几ZTranslate this page”按钮。再看结果,嗯,大致能看明白Q这原来是个叫“big bang”的乐队的网站,与大爆炸无关...<BR><BR>  机器译是一个很前沿的h工智能课题,x望翻译出来的l果跟专门用p撰写的内Ҏ不可能的。但西文间的互相转译比中英文强得多得多了。至能看明白?BR><BR><SPAN style="COLOR: teal">13.5Q单词纠?/SPAN><BR><BR>  W者记忆力很差Q英文单词经常拼写错误。但Google有纠错功能。比如在写上文的时候,我要用到英文单词“tutorial”,我只是依E记得好像是“tatorial”的样子Q但不肯定,于是用Google查了一下,它马上提醒:“您要找的会不会是: tutorial ”,呵呵Q正是这个单词?BR><BR><SPAN style="COLOR: limegreen">13.6Q繁转换</SPAN><BR><BR>  对中文用戯言Q常希望能同时检索繁体和体信息。Google能做到这一炏VGoogle默认使用J简自动转换功能Q因此你输入的简体关键字也将被{换成J体做检索。这L了不力气。当Ӟ如果你不希望q样的话Q也可以在“用偏好”中把这个选项x?BR><BR><SPAN style="COLOR: teal">13.7Q搜索结果过?/SPAN><BR><BR>  |络上的成h内容如烟vQ而且很多站点hƺ骗或者其他不良企图,览者很Ҏ掉入其中的陷阱。ؓ此,Google新设立了成h内容qo功能Q见Google的设|页面,http://www.Google.com/preferencesQ最底下有一个选项SafeSearch Filtering。不q,中文状态下的Google没有这个功能?BR><BR><BR><B>14QGoogle未发布的一些新Ҏ和功能</B><BR><BR><SPAN style="COLOR: limegreen">14.1Q对|页更新日期做出限定“daterange:?/SPAN><BR><BR>  评h一个搜索引擎的好坏Q更新频率是一个很关键因素。通常情况下,我们d望能扑ֈ最新的|页。Google已经开发了Ҏ新日期做限定的搜索语法,但目前还未公布。而且比较ȝ的是QGoogle现在支持的日期格式ؓjulianQ凯撒日Q格式,把通用日期数值切换成julian格式需要借助W三方网站:http://www.tesre.bo.cnr.it/~mauro/JD/。不q,在下面这个自U是“Googlel极搜烦界面”的|页上,你已l可以利用Google的这ҎҎ了Q它自动提供日期转换功能?BR><BR>Google Ultimate InterfaceQhttp://www.faganfinder.com/google.html<BR><BR>  GoogleZ么要q样做呢Q也许是在测试阶D,不想让太多h使用吧?)<BR><BR><SPAN style="COLOR: teal">14.2Q新L索“http://news.google.com/?/SPAN><BR><BR>  Google的新L索尚在B试阶段Q但使用h已经非常不错了。新闻首|头条新闻Q各国新闻,以及不同领域做了分类。你可以通过Google搜烦各大门户和新ȝ站的新闻Q简单、快捗方ѝ遗憄是,目前Google新闻只检索英文信息?BR><BR><SPAN style="COLOR: limegreen">14.3Q分cd告搜索“http://catalogs.google.com/?/SPAN><BR><BR>  q也在B试阶段。主要是对电子分cd告做索。广告页为JPG囄格式?BR><BR><SPAN style="COLOR: teal">14.4Q其它Google的最新发展动?/SPAN><BR><BR>  想了解Google公司的工E师们都在忙些什么吗Q去看一下Google实验室(http://labs.google.com/Q吧。Google的最新设想都在这个地方向讉K者展现出来。现在处于发展和试验阶段的新功能有:术语查询、语x询、键盘查询等{?BR><BR>  |络工程师和E序员可以看看这个地方:http://www.google.com/apis/Q我惛_以让你喜出望外的?BR><BR><SPAN style="COLOR: limegreen">14.5Q一个有的地方</SPAN><BR><BR>  想看看世界各国网民都用Google搜烦什么信息么Q到http://www.google.com/press/zeitgeist.html看一下就知道了。从q些资讯中,你大致可以了解到世界热点和流行时走向?)<BR><BR><BR><B>15Q后?/B><BR><BR>  q个文章4.0版本?.0版本相比Q变更很大,主要把一些与Google无关的东西删除了Q另外随Google的变化作了一些修正,q增加了一些Google未发布的新功能。关于搜索技巧和搜烦实例Q是各个搜烦引擎共通的东西Q是搜烦者长期的l验U篏Q要写出来,是g工程很浩大的事情Q因此在q个文章中我就不献丑了?BR><BR>  随着旉的推U,我发现搜索已l成为网l生zȝ一部分。工作需要搜索技术文档、客户信息;购物需要搜索商品信息和指南Q娱乐需要搜索相兌景资料和囄。搜索已l变得无处不在,而Google则相应的成了工作和生zM的一个必备工兗套用雅虎的一句广告词Q我们也许应该这栯Q“今天你Google了吗Q?BR><img src ="http://www.tkk7.com/zhangrenquan/aggbug/27302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhangrenquan/" target="_blank">kelven</a> 2006-01-09 19:44 <a href="http://www.tkk7.com/zhangrenquan/articles/27302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://5656ys.com" target="_blank">ղһ</a>| <a href="http://zxbj0471.com" target="_blank">ɬɬɬƵ߹ۿ </a>| <a href="http://blblkj.com" target="_blank">ަv߾Ʒ</a>| <a href="http://www-yhty.com" target="_blank">һһëƬѲ</a>| <a href="http://8mav938.com" target="_blank">޾ƷƬ߹ۿ</a>| <a href="http://05942688.com" target="_blank">߳ëƬڵ</a>| <a href="http://fl6fe.com" target="_blank">޹ӰԺ</a>| <a href="http://znboxcdn304.com" target="_blank">ƯŮ </a>| <a href="http://cuitccol.com" target="_blank">avרߵӰ </a>| <a href="http://www-715111.com" target="_blank">ɫͼۺ</a>| <a href="http://llyysp.com" target="_blank">þerƷѹۿ8</a>| <a href="http://5shitou.com" target="_blank">Ů˾޸</a>| <a href="http://df8848.com" target="_blank">ůůձ</a>| <a href="http://szhszszy.com" target="_blank">þ޾Ʒavվ</a>| <a href="http://juytv.com" target="_blank">ƷŮٸaѾþ</a>| <a href="http://njjngs.com" target="_blank">޸һ</a>| <a href="http://55xxb.com" target="_blank">ŮƵվm</a>| <a href="http://adcaes.com" target="_blank">պƷAV</a>| <a href="http://mcsser.com" target="_blank">18վѹۿ</a>| <a href="http://aqd1987.com" target="_blank">һƵ</a>| <a href="http://chandou8.com" target="_blank">͵͵͵ɫ</a>| <a href="http://9xcb.com" target="_blank">AV߲Ų</a>| <a href="http://xyflash.com" target="_blank">޾Ʒ߹ۿ</a>| <a href="http://zgjzysfc.com" target="_blank">ӰԺֻ߹ۿ </a>| <a href="http://blzcn.com" target="_blank">˳ͼƬС˵վ</a>| <a href="http://88bgbg.com" target="_blank">þۺϸϾþù </a>| <a href="http://yy468.com" target="_blank">վþþ</a>| <a href="http://wwwaa875.com" target="_blank">޾ƷһƷƷƷ</a>| <a href="http://19520888.com" target="_blank">ɫAAVѲ</a>| <a href="http://zisewang.com" target="_blank">www77777</a>| <a href="http://www-741.com" target="_blank">޻ƻƻվ߹ۿ</a>| <a href="http://sczssc.com" target="_blank">һ</a>| <a href="http://gxshenquan.com" target="_blank">ĻСۺ</a>| <a href="http://lyjhjx.com" target="_blank">Ѹվ</a>| <a href="http://7778kk.com" target="_blank">aƷžžŴƬѿ</a>| <a href="http://yiqigxfc.com" target="_blank">һӰ߹ۿ</a>| <a href="http://6464k.com" target="_blank">һ϶</a>| <a href="http://www09191z.com" target="_blank">95˾Ѹ</a>| <a href="http://adcacs.com" target="_blank">þۺɫhezyo</a>| <a href="http://rseav.com" target="_blank">AVպƷþþþþ</a>| <a href="http://ri9999.com" target="_blank">ѿһëƬ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>