﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Natlive's blog</title><link>http://www.blogjava.net/natlive/</link><description>A long way and dream.</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 05:59:41 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 05:59:41 GMT</pubDate><ttl>60</ttl><item><title>Struts2 自定义标签的方法</title><link>http://www.blogjava.net/natlive/archive/2009/05/21/271890.html</link><dc:creator>狂龙</dc:creator><author>狂龙</author><pubDate>Thu, 21 May 2009 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/natlive/archive/2009/05/21/271890.html</guid><wfw:comment>http://www.blogjava.net/natlive/comments/271890.html</wfw:comment><comments>http://www.blogjava.net/natlive/archive/2009/05/21/271890.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/natlive/comments/commentRss/271890.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/natlive/services/trackbacks/271890.html</trackback:ping><description><![CDATA[又回锅弄Struts2&#8230;&#8230;<br />
<br />
看完uitag这部份，发现一个问题，就是如果我要一个pagebar这样的UITag怎么办？总不能每一页我都在JSP上写吧？就算是复制都很不聪明。于是开始研究怎么去写一个Tag，在网站找了N多文章，大都是用out.println(...)这样的方式，而没有使用template的方式，自己总觉得这样的方式不灵活而且麻烦，容易出错，于是查看struts2的源码，终于找出怎么去写Struts2 Tag的方法。<br />
<br />
Struts2 的UITag原理：<br />
Struts2 UITag分三部份组成，一部份用于定义Tag的内容与逻辑的UIBean，一部份用于定义JSP Tag，也就是平时我们定义的那种，最后就是Template，它存放在你的theme目录之下，是一个FreeMarker模板文件。<br />
<br />
我现在辑写一份MMTag，它主要是用于输出带链接的文字，比如像这样：<br />
&lt;cur:mm message="'I am a boy.'" /&gt;<br />
就会输出：<br />
&lt;a href="http://www.blogjava.net/natlive"&gt;I am boy.&lt;/a&gt;<br />
<br />
我们先写UIBean部份：我们把它定义为MM，它继承于org.apache.struts2.components.UIBean：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;limitstudy.corestruts2.tag;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.struts2.components.UIBean;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.struts2.views.annotations.StrutsTag;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.struts2.views.annotations.StrutsTagAttribute;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.opensymphony.xwork2.util.ValueStack;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletRequest;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletResponse;<br />
<br />
@StrutsTag(name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">mm</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;tldTagClass</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">limitstudy.corestruts2.tag.MMTag</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;description</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">MM</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MM&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;UIBean&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;message;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;MM(ValueStack&nbsp;stack,&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(stack,&nbsp;request,&nbsp;response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;String&nbsp;getDefaultTemplate()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">mm</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@StrutsTagAttribute(description</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">set&nbsp;message</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">String</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setMessage(String&nbsp;message)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.message&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;evaluateExtraParams()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.evaluateExtraParams();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;message)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">message</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;findString(message));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span style="color: #000000;"><br />
* strutsTag注解指明了该UIBean的名字和Tag类的类名。</span><br />
* <span style="color: #000000;">getDefaultTemplate()方法用于返回模板的名字，Struts2会自动在后面加入.ftl扩展名以找到特定的模板文件。</span><br />
* setXXX，设置UIBean的属性，一般Tag中有几个这样的属性，这里就有几个。<span style="color: #000000;">@StrutsTagAttribute(description</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">set&nbsp;message</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">String</span><span style="color: #000000;">"</span><span style="color: #000000;">)注解，说明该属性是字符串（也可以是其它），这一步很重要。</span><br />
* 覆写<span style="color: #000000;">evaluateExtraParams（）方法，在UIBean初始化后会调用这个方法来初始化设定参数，如addParameter方法，会在freemarker里的parameters里加入一个key value。这里要注意findString，还有相关的findxxxx方法，它们是已经封装好了的解释ognl语法的工具，具体是怎么样的，大家可以查看一下UIBean的api doc。<br />
<br />
然后是Tag部份：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;limitstudy.corestruts2.tag;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.struts2.views.jsp.ui.AbstractUITag;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.struts2.components.Component;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.opensymphony.xwork2.util.ValueStack;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletRequest;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletResponse;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MMTag&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;AbstractUITag&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;message;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Component&nbsp;getBean(ValueStack&nbsp;stack,&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MM(stack,&nbsp;request,&nbsp;response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;populateParams()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.populateParams();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MM&nbsp;mm&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(MM)component;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mm.setMessage(message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setMessage(String&nbsp;message)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.message&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
* <span style="color: #000000;">getBean（）返回该Tag中的UIBean。<br />
* </span><span style="color: #000000;">populateParams()初始化参数，一般用来初始化UIBean(Component)。<br />
* setXXXX设置属性，和jsp tag是一样的。<br />
<br />
在/WEB-INF/tlds/下建立current.tld文件（文名随你喜欢）：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">taglib&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000;">&nbsp;xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;">&nbsp;version</span><span style="color: #0000ff;">="2.0"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff;">="http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">description</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">test</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">description</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tlib-version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">2.0</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tlib-version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">short-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">cur</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">short-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">uri</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/cur</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">uri</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tag</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">mm</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tag-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">limitstudy.corestruts2.tag.MMTag</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tag-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body-content</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">JSP</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body-content</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">attribute</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">message</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">required</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">true</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">required</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">attribute</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tag</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">taglib</span><span style="color: #0000ff;">&gt;</span></div>
<br />
在源代码目录中建立template/simple目录（这个目录名和你的theme有关），然后在里面建一个mm.ftl文件：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a&nbsp;</span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="http://www.yinsha.com"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">${parameters.message?html}</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span></div>
<br />
建一个action测试一下，视图文件：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="background-color: #ffff00; color: #000000;">&lt;%</span><span style="background-color: #f5f5f5; color: #000000;">@&nbsp;page&nbsp;contentType</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">text/html;charset=UTF-8</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;language</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">java</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;</span><span style="background-color: #ffff00; color: #000000;">%&gt;</span><span style="color: #000000;"><br />
</span><span style="background-color: #ffff00; color: #000000;">&lt;%</span><span style="background-color: #f5f5f5; color: #000000;">@&nbsp;taglib&nbsp;prefix</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">s</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;uri</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">/struts-tags</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;</span><span style="background-color: #ffff00; color: #000000;">%&gt;</span><span style="color: #000000;"><br />
</span><span style="background-color: #ffff00; color: #000000;">&lt;%</span><span style="background-color: #f5f5f5; color: #000000;">@&nbsp;taglib&nbsp;prefix</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">cur</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;uri</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">/cur</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;</span><span style="background-color: #ffff00; color: #000000;">%&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">s:property&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="message"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">cur:mm&nbsp;</span><span style="color: #ff0000;">message</span><span style="color: #0000ff;">="haoahahhahaha"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span></div>
<br />
完。<br />
<br />
PS：写得有些粗鄙，所以，如有问题的，可以留言。<br />
<img src ="http://www.blogjava.net/natlive/aggbug/271890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/natlive/" target="_blank">狂龙</a> 2009-05-21 11:00 <a href="http://www.blogjava.net/natlive/archive/2009/05/21/271890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>努力，要勤写日志啊。</title><link>http://www.blogjava.net/natlive/archive/2009/05/05/269031.html</link><dc:creator>狂龙</dc:creator><author>狂龙</author><pubDate>Tue, 05 May 2009 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/natlive/archive/2009/05/05/269031.html</guid><wfw:comment>http://www.blogjava.net/natlive/comments/269031.html</wfw:comment><comments>http://www.blogjava.net/natlive/archive/2009/05/05/269031.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/natlive/comments/commentRss/269031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/natlive/services/trackbacks/269031.html</trackback:ping><description><![CDATA[有一年不在这里写日志了，虽然一直在学习，可是却没有养成写技术日志的习惯，所得甚少。<br />
<br />
所以要努力啊，不能再这么懒下去了！！！<br />
<br />
<img src ="http://www.blogjava.net/natlive/aggbug/269031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/natlive/" target="_blank">狂龙</a> 2009-05-05 17:43 <a href="http://www.blogjava.net/natlive/archive/2009/05/05/269031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>yum详解</title><link>http://www.blogjava.net/natlive/archive/2007/12/28/171149.html</link><dc:creator>狂龙</dc:creator><author>狂龙</author><pubDate>Fri, 28 Dec 2007 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/natlive/archive/2007/12/28/171149.html</guid><wfw:comment>http://www.blogjava.net/natlive/comments/171149.html</wfw:comment><comments>http://www.blogjava.net/natlive/archive/2007/12/28/171149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/natlive/comments/commentRss/171149.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/natlive/services/trackbacks/171149.html</trackback:ping><description><![CDATA[<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">使用redhat，fedora的linuxer肯定都为rpm著名的dependency hell而头疼(这也是所有基于rpm发行版都有的问题)。foo is needed by bar，bar is needed by foo。要装卸个软件，还得辛辛苦苦地梳理清楚所有依赖性问题，rpm的几个搜索站点成了时常光顾的场所，如果不幸碰到循环依赖，那就只有干瞪眼的分了。 有时加个--nodeps参数，倒是眼不见，心不烦，但这样装上的软件，你能保证正常使用吗，这样卸载软件，你能保证不影响其它软件工作吗，恐怕谁也不能 给出肯定的答案。每到这时，帽子们只有看着debian的apt暗自羡慕了。好在，这些都已经成为过去时了。基于rpm的发行版现在也有了像apt那样自 动解决依赖关系的包管理工具了。其中一个著名的就是apt4rpm,这基本上是debian系统apt的在rpm发行版的移植。但是使用Redhat和 Fedora的linuxer你们知道吗，还有一个与apt功能类似的rpm包管理系统，那就是yum。Fedora系统已经自带，Redhat也有相应 的rpm下载。与apt相比，yum的功能一点也不弱，甚至还有许多胜过apt 之处。比如说，yum是Fedora系统自带的，因此它能使用fedora官方的软件源，完成各种官方发布的各种升级。对于第三方软件源的支持，yum也 不差，大多数支持apt的repository，也能支持yum，比如说freshrpms,fedora.us,livna等等。此外yum有一个比较 详细的log，可以查看何时升级安装了什么软件包等。yum的代码较apt更为精简等。</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">一、YUM简介:<br />
yum，是Yellow dog Updater, Modified的简称，起初是由yellow dog这一发行版的开发者Terra Soft研发，用python写成，那时还叫做yup(yellow dog updater)，后经杜克大学的Linux@Duke开 发团队进行改进，遂有此名。yum的宗旨是自动化地升级，安装/移除rpm包，收集rpm包的相 关信息，检查依赖性并自动提示用户解决。yum的关键之处是要有可靠的repository，顾名思义，这是软件的仓库，它可以是http或ftp站点， 也可以是本地软件池，但必须包含rpm的header，header包括了rpm包的各种信息，包括描述，功能，提供的文件，依赖性等.正是收集了这些 header并加以分析，才能自动化地完成余下的任务。<br />
如果没有安装,先我们要到下面的地址下载与自己系统相对应的版本的 yum：<br />
http://ayo.freshrpms.net/<br />
比如我用的是Fedora core 4.0 就下载如下的包安装：</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[root@localhost beinan]# rpm -ivh freshrpms-release-1.1-1.fc.noarch.rpm<br />
warning: freshrpms-release-1.1-1.fc.noarch.rpm: Header V3 DSA signature: NOKEY, key ID e42d547b<br />
Preparing... ########################################### [100%]<br />
1:freshrpms-release ########################################### [100%]</span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">二、YUM的配置文件<br />
yum的一切配置信息都储存在一个叫yum.conf的配置文件中，通常位于/etc目 录下，这是整个yum系统的重中之重，所以有必要详细介绍。下面是一个从网上找来的yum.con文件，让我们以此为例，进行说明。 </span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[main] <br />
cachedir=/var/cache/yum <br />
debuglevel=2 <br />
logfile=/var/log/yum.log <br />
pkgpolicy=newest <br />
distroverpkg=redhat-release <br />
tolerant=1 <br />
exactarch=1 <br />
retries=1 </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[base] <br />
name=Fedora Core $releasever - $basearch - Base <br />
baseurl=http://download.atrpms.net/mirrors/fedoracore/$releasever/$basearch/os <br />
http://rpmfind.net/linux/fedora/cor...er/$basearch/os <br />
http://mirror.clarkson.edu/pub/dist...er/$basearch/os </span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[updates-released] <br />
name=Fedora Core $releasever - $basearch - Released Updates <br />
baseurl=http://download.atrpms.net/mirrors/fedoracore/updates/$releasever/$basearch <br />
http://redhat.linux.ee/pub/fedora/l...sever/$basearch <br />
http://fr2.rpmfind.net/linux/fedora...sever/$basearch </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[Fedora.us] <br />
name=Fedora.us - $basearch - Extras <br />
baseurl=http://fedora.linux.duke.edu/fedorax86_64/fedora.us/$releasever/$basearch/RPMS.stable </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[Dag Wieers] <br />
name=Dag RPM Repository for Fedora Core <br />
baseurl=http://apt.sw.be/fedora/$releasever/en/$basearch/dag </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[Livna] <br />
Name=Livna RPM, Fedora Core $releasever - $basearch <br />
baseurl=http://rpm.livna.org/fedora/$releasever/$basearch/RPMS.stable </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[freshrpms] <br />
name=FreshRPMs <br />
baseurl=http://ayo.freshrpms.net/fedora/linux/$releasever/$basearch/freshrpms/ <br />
http://ftp.us2.freshrpms.net/linux/...arch/freshrpms/ </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">第一部分（这是yum的全局性设置。默认一般不必改动。）<br />
[main] <br />
cachedir：yum缓存的目录，yum在此存储下载的rpm包和数据库，一般是/var/cache/yum。 <br />
debuglevel：除错级别，0──10,默认是2 <br />
logfile：yum的日志文件，默认是/var/log/yum.log。 <br />
pkgpolicy： 包的策略。一共有两个选项，newest和last，这个作用是如果你设置了多个repository，而同一软件在不同的repository中同时存 在，yum应该安装哪一个，如果是newest，则yum会安装最新的那个版本。如果是last，则yum会将服务器id以字母表排序，并选择最后的那个 服务器上的软件安装。一般都是选newest。 <br />
distroverpkg：指定一个软件包，yum会根据这个包判断你的发行版本，默认是redhat-release，也可以是安装的任何针对自己发行版的rpm包。 <br />
exactarch，有两个选项1和0,代表是否只升级和你安装软件包cpu体系一致的包，如果设为1，则如你安装了一个i386的rpm，则yum不会用1686的包来升级。 <br />
retries，网络连接发生错误后的重试次数，如果设为0，则会无限重试。 <br />
tolerent，也有1和0两个选项，表示yum是否容忍命令行发生与软件包有关的错误，比如你要安装1,2,3三个包，而其中3此前已经安装了，如果你设为1,则yum不会出现错误信息。默认是0。 <br />
除了上述之外，还有一些可以添加的选项，如 <br />
exclude=，排除某些软件在升级名单之外，可以用通配符，列表中各个项目要用空格隔开，这个对于安装了诸如美化包，中文补丁的朋友特别有用。 <br />
gpgchkeck= 有1和0两个选择，分别代表是否是否进行gpg校验，如果没有这一项，默认好像也是检查的。 </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">第二部分：<br />
配置repository服务器了，这是最令人激动的，有了好的repository，就如家门口开了大卖场，要什么东西稍微跑跑腿就行，对了这还是个免费的大卖场。 <br />
所有服务器设置都应该遵循如下格式： </span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[serverid] <br />
name=Some name for this server <br />
baseurl=url://path/to/repository/ </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">其中serverid是用于区别各个不同的repository，必须有一个独一无二的名称。 <br />
name，是对repository的描述，支持像$releasever $basearch这样的变量; <br />
baseurl是服务器设置中最重要的部分，只有设置正确，才能从上面获取软件。它的格式是： <br />
baseurl=url://server1/path/to/repository/ <br />
url://server2/path/to/repository/ <br />
url://server3/path/to/repository/ <br />
其中url支持的协议有 http:// ftp:// file://三种。baseurl后可以跟多个url，你可以自己改为速度比较快的镜像站，但baseurl只能有一个，也就是说不能像如下格式： <br />
baseurl=url://server1/path/to/repository/ <br />
baseurl=url://server2/path/to/repository/ <br />
baseurl=url://server3/path/to/repository/ <br />
其中url指向的目录必须是这个repository header目录的上一级，它也支持$releasever $basearch这样的变量。 <br />
url之后可以加上多个选项，如gpgcheck、exclude、failovermethod等，比如： </span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[updates-released] <br />
name=Fedora Core $releasever - $basearch - Released Updates <br />
baseurl=http://download.atrpms.net/mirrors/fedoracore/updates/$releasever/$basearch <br />
http://redhat.linux.ee/pub/fedora/linux/core/updates/$releasever/$basearch <br />
http://fr2.rpmfind.net/linux/fedora/core/updates/$releasever/$basearch <br />
gpgcheck=1 <br />
exclude=gaim <br />
failovermethod=priority </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">其中gpgcheck，exclude的含义和[main]部分相同，但只对此服务器起作用， <br />
failovermethode 有两个选项roundrobin和priority，意思分别是有多个url可供选择时，yum选择的次序，roundrobin是随机选择，如果连接失 败则使用下一个，依次循环，priority则根据url的次序从第一个开始。如果不指明，默认是roundrobin。 </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">几个变量 <br />
$releasever，发行版的版本，从[main]部分的distroverpkg获取，如果没有，则根据redhat-release包进行判断。 <br />
$arch，cpu体系，如i686,athlon等 <br />
$basearch，cpu的基本体系组，如i686和athlon同属i386，alpha和alphaev6同属alpha。 <br />
对yum.conf设定完成，我们就可以好好体验yum带来的方便了。</span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">对 了，万事具备，只欠东风。还有一件事没有做。那就是导入每个reposity的GPG key，前面说过，yum可以使用gpg对包进行校验，确保下载包的完整性，所以我们先要到各个repository站点找到gpg key，一般都会放在首页的醒目位置，一些名字诸如 RPM-GPG-KEY.txt之类的纯文本文件，把它们下载，然后用rpm --import xxx.txt命令将它们导入，最好把发行版自带GPG-KEY也导入，rpm --import /usr/share/doc/redhat-release-*/RPM-GPG-KEY 官方软件升级用的上。</span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">FC3:&nbsp;&nbsp; rpm --import /usr/share/doc/fedora-release-3/RPM-GPG-KEY-fedora</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">FC4:&nbsp;&nbsp; rpm --import /usr/share/doc/fedora-release-4/RPM-GPG-KEY-fedora</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">至此一切准备工作都已完毕。 </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">三、用YUM升级软件<br />
打开终端，切换到root用户，yum的操作大都须有超级用户的权限。<br />
首 先，yum update，这一步是必须的，yum会从服务器的header目录下载rpm的header，放在本地的缓存中，这可能会花费一定的时间，但比起yum 给我们带来方便，这些时间的花费又算的了什么呢？header下载完毕，yum会判断是否有可更新的软件包，如果有，它会询问你的意见，是否更新，还是说 y吧，把系统始终up to date总是不错的，这时yum开始下载软件包并使用调用rpm安装，这可能要一定时间，取决于要更新软件的数目和网络状况，万一网络断了，也没关系，再 进行一次就可以了。升级完毕，以后每天只要使用yum check-update检查一下有无跟新，如果有，就用yum update进行跟新，时刻保持系统为最新，堵住一切发现的漏洞。</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">用yum update packagename 对某个单独包进行升级。 <br />
yum还有一个升级指令，yum upgrade，它的初衷是更换废弃的包，但现在通常用来进行重大的升级，如把发行版整个升高一个版本，由于牵动太大，还不如安装新的系统。</span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">1.列出所有可更新的软件清单<br />
命令：yum check-update</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">2.安装所有更新软件<br />
命令：yum update</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">3.仅安装指定的软件<br />
命令：yum install &lt;package_name&gt;</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">4.仅更新指定的软件<br />
命令：yum update &lt;package_name&gt;</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">5.列出所有可安裝的软件清单<br />
命令：yum list</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">四、用YUM安装删除软件<br />
装了系统添加删除软件是常事，yum同样可以胜任这一任务，只要软件是rpm安装的。 <br />
安装的命令是，yum install xxx，yum会查询数据库，有无这一软件包，如果有，则检查其依赖冲突关系，如果没有依赖冲突，那么最好，下载安装;如果有，则会给出提示，询问是否要同时安装依赖，或删除冲突的包，你可以自己作出判断。 <br />
删除的命令是，yum remove xxx，同安装一样，yum也会查询数据库，给出解决依赖关系的提示。 </span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">1.用YUM安装软件包<br />
命令：yum install &lt;package_name&gt;</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">2.用YUM删除软件包<br />
命令：yum remove &lt;package_name&gt;</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">五、用YUM查询软件信息<br />
我 们常会碰到这样的情况，想要安装一个软件，只知道它和某方面有关，但又不能确切知道它的名字。这时yum的查询功能就起作用了。你可以用 yum search keyword这样的命令来进行搜索，比如我们要则安装一个Instant Messenger，但又不知到底有哪些，这时不妨用 yum search messenger这样的指令进行搜索，yum会搜索所有可用rpm的描述，列出所有描述中和messeger有关的rpm包，于 是我们可能得到gaim，kopete等等，并从中选择。 <br />
有时我们还会碰到安装了一个包，但又不知道其用途，我们可以用yum info packagename这个指令来获取信息。 </span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">1.使用YUM查找软件包<br />
命令：yum search &lt;keyword&gt;</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">2.列出所有可安装的软件包<br />
命令：yum list</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">3.列出所有可更新的软件包<br />
命令：yum list updates</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">4.列出所有已安装的软件包<br />
命令：yum list installed</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">5.列出所有已安装但不在 Yum Repository 內的软件包<br />
命令：yum list extras</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">6.列出所指定的软件包<br />
命令：yum list &lt;package_name&gt;</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">7.使用YUM获取软件包信息<br />
命令：yum info &lt;package_name&gt;</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">8.列出所有软件包的信息<br />
命令：yum info</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">9.列出所有可更新的软件包信息<br />
命令：yum info updates</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">10.列出所有已安裝的软件包信息<br />
命令：yum info installed</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">11.列出所有已安裝但不在 Yum Repository 內的软件包信息<br />
命令：yum info extras</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">12.列出软件包提供哪些文件<br />
命令：yum provides &lt;package_name&gt;</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">六、清除YUM缓存<br />
yum 会把下载的软件包和header存储在cache中，而不会自动删除。如果我们觉得它们占用了磁盘空间，可以使用yum clean指令进行清除，更精确 的用法是yum clean headers清除header，yum clean packages清除下载的rpm包，yum clean all一 股脑儿端 </span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">1.清除缓存目录(/var/cache/yum)下的软件包<br />
命令：yum clean packages</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">2.清除缓存目录(/var/cache/yum)下的 headers<br />
命令：yum clean headers</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">3.清除缓存目录(/var/cache/yum)下旧的 headers<br />
命令：yum clean oldheaders</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">4.清除缓存目录(/var/cache/yum)下的软件包及旧的headers<br />
命令：yum clean, yum clean all (= yum clean packages; yum clean oldheaders) </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">附：</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">由于 Fedora 的 yum<br />
预设的更新主机在外国，也就是 Fedora 的官方更新主机<br />
连线到国外下载，速度之慢，可想而知....</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">在这里，我们可以修改 yum 的配置文件<br />
把连线主机，改成国内各大学的 Linux 更新主机，如此速度就会比较快<br />
------------------------<br />
/etc/yum.conf<br />
-----------------------</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[base]<br />
name=Fedora Core $releasever - $basearch - Base baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/$releasever/$basearch/os/ </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">[updates-released]<br />
name=Fedora Core $releasever - $basearch - Released Updates baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/$releasever/$basearch/</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">注意红色的地方，就是 yum 会去连接的更新主机网址<br />
改成以下，可自由选择搭配<br />
base 主机：<br />
(大小写有差别，请先实际连接测试，看看服务器是否仍存在)</span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">http://ftp.isu.edu.tw/pub/Linux/Fed...core/1/i386/os/<br />
http://linux.nctu.edu.tw/ftp/dists/...core/1/i386/os/<br />
ftp://ftp.isu.edu.tw/pub/Linux/Fedo...core/1/i386/os/ <br />
ftp://linux.nctu.edu.tw/dists/fedora/core/1/i386/os/<br />
ftp://linux.sinica.edu.tw/fedora/linux/core/1/i386/os/</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">updates 主机：<br />
(大小写有差别，请先实际测试连接，看看服务器是否仍存在)</span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">http://ftp.isu.edu.tw/pub/Linux/Fed...updates/1/i386/<br />
http://linux.nctu.edu.tw/ftp/dists/...updates/1/i386/<br />
ftp://ftp.isu.edu.tw/pub/Linux/Fedo...updates/1/i386/<br />
ftp://linux.nctu.edu.tw/dists/fedor...updates/1/i386/<br />
ftp://linux.sinica.edu.tw/fedora/li...updates/1/i386/</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">路径中的 /1/ 是代表 core 1<br />
如是使用core 2，请自行改成 /2/<br />
改完后保存，不必重启服务，立刻生效<br />
然后 yum 的更新速度就會飞快了</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">Fedora core 3 和 4 的 yum base 配置设定法：<br />
FC3 和 FC4 的 yum base 配置设定，有别于之前 FC2<br />
并不是在 /etc/yum.conf 中设定<br />
设定方法如下:<br />
cd /etc/yum.repos.d/<br />
vi fedora.repo (设定 base 主机，仅列出需要修改处)</span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">baseurl=http://ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/$releasever/$basearch/os/ <br />
#mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-core-$releasever</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">vi fedora-updates.repo (设定 update 主机，仅列出需要修改处)</span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">baseurl=http://ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/updates/$releasever/$basearch/ <br />
#mirrorlist=http://fedora.redhat.com/download/mirrors/updates-released-fc$releasever</span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">说明：<br />
1.义守大学是 Fedora 官方认可的台湾区mirror 站，所以这里设定义守大学的主机。</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">2.主要的Repository，大多数也提供apt支持。 </span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">http://www.fedora.us <br />
http://rpm.livna.org <br />
http://dag.wieers.com ;#Dag的apt/yum repository <br />
http://freshrpms.net/ <br />
http://rpms.xcyb.org/ ;#k3b <br />
http://apt.kde-redhat.org/ ;kde-redhat <br />
http://atrpms.net/ ;#ATrpms <br />
http://dries.studentenweb.org/ayo/index.html ;#Dries APT/YUM RPM Repository <br />
http://newrpms.sunsite.dk/ ;#NewRPMS <br />
http://www.fedoralegacy.org ;#Redhat和Fedora遗产项目支持，Core 1也已经进入遗产了，汗。</span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">注意多个repository共存可能带来的冲突。 </span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;</span></span></span></p>
<img src ="http://www.blogjava.net/natlive/aggbug/171149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/natlive/" target="_blank">狂龙</a> 2007-12-28 12:52 <a href="http://www.blogjava.net/natlive/archive/2007/12/28/171149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最完整的sysctl.conf优化方案[转]</title><link>http://www.blogjava.net/natlive/archive/2007/12/26/170510.html</link><dc:creator>狂龙</dc:creator><author>狂龙</author><pubDate>Wed, 26 Dec 2007 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/natlive/archive/2007/12/26/170510.html</guid><wfw:comment>http://www.blogjava.net/natlive/comments/170510.html</wfw:comment><comments>http://www.blogjava.net/natlive/archive/2007/12/26/170510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/natlive/comments/commentRss/170510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/natlive/services/trackbacks/170510.html</trackback:ping><description><![CDATA[<div class="t_msgfont" id="message7725139">网上关于sysctl.conf的优化方案有各种版本，大多都是抄来抄去的，让新人看了很迷茫。为解决此问题，经过两天的整理，查了N多资料，将大家常用的总结如下，很多默认的不需要修改的暂未涉及，今后将逐步把所有的项目都有个翻译、讲解、修改建议，如有修改，将以此文为准，其他地方的内容，本人不负责更新。因此转载请注明链接地址：<a href="http://www.bsdlover.cn/security/2007/1216/article_8.html" target="_blank">http://www.bsdlover.cn/security/2007/1216/article_8.html</a>如果您有补充或修订意见，请于本文后评论或邮件联系<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#117;&#106;&#120;&#116;&#109;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">cujxtm@gmail.com</a>，万分感谢！<br />
<br />
###################<br />
所有rfc相关的选项都是默认启用的，因此网上的那些还自己写rfc支持的都可以扔掉了:)<br />
###############################<br />
<br />
net.inet.ip.sourceroute=0<br />
net.inet.ip.accept_sourceroute=0<br />
#############################<br />
通过源路由，攻击者可以尝试到达内部IP地址 --包括RFC1918中的地址，所以<br />
不接受源路由信息包可以防止你的内部网络被探测。<br />
#################################<br />
<br />
net.inet.tcp.drop_synfin=1<br />
###################################<br />
安全参数，编译内核的时候加了options TCP_DROP_SYNFIN才可以用，可以阻止某些OS探测。<br />
##################################<br />
<br />
kern.maxvnodes=8446<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
vnode 是对文件或目录的一种内部表达。 因此， 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。<br />
一般而言， 这是由操作系统自行完成的，也不需要加以修改。但在某些时候磁盘 I/O 会成为瓶颈，<br />
而系统的 vnode 不足， 则这一配置应被增加。此时需要考虑是非活跃和空闲内存的数量。<br />
要查看当前在用的 vnode 数量：<br />
# sysctl vfs.numvnodes<br />
vfs.numvnodes: 91349<br />
要查看最大可用的 vnode 数量：<br />
# sysctl kern.maxvnodes<br />
kern.maxvnodes: 100000<br />
如果当前的 vnode 用量接近最大值，则将 kern.maxvnodes 值增大 1,000 可能是个好主意。<br />
您应继续查看 vfs.numvnodes 的数值， 如果它再次攀升到接近最大值的程度，<br />
仍需继续提高 kern.maxvnodes。 在 top(1) 中显示的内存用量应有显著变化，<br />
更多内存会处于活跃 (active) 状态。<br />
####################################<br />
<br />
<br />
kern.maxproc: 964<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
Maximum number of processes<br />
####################################<br />
kern.maxprocperuid: 867<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
Maximum processes allowed per userid<br />
####################################<br />
因为我的maxusers设置的是256，20+16*maxusers＝4116。<br />
maxprocperuid至少要比maxproc少1，因为init(8) 这个系统程序绝对要保持在运作状态。<br />
我给它设置的2068。<br />
<br />
<br />
kern.maxfiles: 1928<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
系统中支持最多同时开启的文件数量，如果你在运行数据库或大的很吃描述符的进程，那么应该设置在20000以上，<br />
比如kde这样的桌面环境，它同时要用的文件非常多。<br />
一般推荐设置为32768或者65536。<br />
####################################<br />
<br />
kern.argmax: 262144<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
maximum number of bytes (or characters) in an argument list.<br />
命令行下最多支持的参数，比如你在用find命令来批量删除一些文件的时候<br />
find . -name "*.old" -delete，如果文件数超过了这个数字，那么会提示你数字太多的。<br />
可以利用find . -name "*.old" -ok rm {} \;来删除。<br />
默认的参数已经足够多了，因此不建议再做修改。<br />
####################################<br />
<br />
kern.securelevel: -1<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
-1：这是系统默认级别，没有提供任何内核的保护错误； <br />
0：基本上作用不多，当你的系统刚启动就是0级别的，当进入多用户模式的时候就自动变成1级了。 <br />
1：在这个级别上，有如下几个限制： <br />
　　a. 不能通过kldload或者kldunload加载或者卸载可加载内核模块； <br />
　　b. 应用程序不能通过/dev/mem或者/dev/kmem直接写内存； <br />
　　c. 不能直接往已经装在(mounted)的磁盘写东西，也就是不能格式化磁盘，但是可以通过标准的内核接口执行写操作； <br />
　　d. 不能启动X-windows，同时不能使用chflags来修改文件属性； <br />
2：在 1 级别的基础上还不能写没装载的磁盘，而且不能在1秒之内制造多次警告，这个是防止DoS控制台的； <br />
3：在 2 级别的级别上不允许修改IPFW防火墙的规则。 <br />
　　如果你已经装了防火墙，并且把规则设好了，不轻易改动，那么建议使用3级别，如果你没有装防火墙，而且还准备装防火墙的话，不建议使用。<br />
我们这里推荐使用 2 级别，能够避免比较多对内核攻击。<br />
####################################<br />
<br />
kern.maxfilesperproc: 1735<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
每个进程能够同时打开的最大文件数量，网上很多资料写的是32768<br />
除非用异步I/O或大量线程，打开这么多的文件恐怕是不太正常的。<br />
我个人建议不做修改，保留默认。<br />
####################################<br />
<br />
<br />
kern.ipc.maxsockbuf: 262144<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
最大的套接字缓冲区，网上有建议设置为2097152（2M）、8388608（8M）的。<br />
我个人倒是建议不做修改，保持默认的256K即可，缓冲区大了可能造成碎片、阻塞或者丢包。<br />
####################################<br />
<br />
<br />
kern.ipc.somaxconn: 128<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
最大的等待连接完成的套接字队列大小，即并发连接数。<br />
高负载服务器和受到Dos攻击的系统也许会因为这个队列被塞满而不能提供正常服务。<br />
默认为128，推荐在1024-4096之间，根据机器和实际情况需要改动，数字越大占用内存也越大。<br />
####################################<br />
<br />
<br />
kern.ipc.nmbclusters: 4800<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
这个值用来调整系统在开机后所要分配给网络 mbufs 的 cluster 数量，<br />
由于每个 cluster 大小为 2K，所以当这个值为 1024 时，也是会用到 2MB 的核心内存空间。<br />
假设我们的网页同时约有 1000 个联机，而 TCP 传送及接收的暂存区大小都是 16K，<br />
则最糟的情况下，我们会需要 (16K+16K) * 1024，也就是 32MB 的空间，<br />
然而所需的 mbufs 大概是这个空间的二倍，也就是 64MB，所以所需的 cluster 数量为 64MB/2K，也就是 32768。<br />
对于内存有限的机器，建议值是 1024 到 4096 之间，而当拥有海量存储器空间时，我们可以将它设定为 4096 到 32768 之间。<br />
我们可以使用 netstat 这个指令并加上参数 -m 来查看目前所使用的 mbufs 数量。<br />
要修改这个值必须在一开机就修改，所以只能在 /boot/loader.conf 中加入修改的设定<br />
kern.ipc.nmbclusters=32768<br />
####################################<br />
<br />
<br />
kern.ipc.shmmax: 33554432<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
共享内存和信号灯("System VIPC")如果这些过小的话，有些大型的软件将无法启动<br />
安装xine和mplayer提示的设置为67108864，即64M，<br />
如果内存多的话，可以设置为134217728，即128M<br />
####################################<br />
<br />
<br />
kern.ipc.shmall: 8192<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
共享内存和信号灯("System VIPC")如果这些过小的话，有些大型的软件将无法启动<br />
安装xine和mplayer提示的设置为32768<br />
####################################<br />
<br />
kern.ipc.shm_use_phys: 0<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
如果我们将它设成 1，则所有 System V 共享内存 (share memory，一种程序间沟通的方式)部份都会被留在实体的内存 (physical memory) 中，<br />
而不会被放到硬盘上的 swap 空间。我们知道物理内存的存取速度比硬盘快许多，而当物理内存空间不足时，<br />
部份数据会被放到虚拟的内存上，从物理内存和虚拟内存之间移转的动作就叫作 swap。如果时常做 swap 的动作，<br />
则需要一直对硬盘作 I/O，速度会很慢。因此，如果我们有大量的程序 (数百个) 需要共同分享一个小的共享内存空间，<br />
或者是共享内存空间很大时，我们可以将这个值打开。<br />
这一项，我个人建议不做修改，除非你的内存非常大。<br />
####################################<br />
<br />
<br />
kern.ipc.shm_allow_removed: 0<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
共享内存是否允许移除？这项似乎是在fb下装vmware需要设置为1的，否则会有加载SVGA出错的提示<br />
作为服务器，这项不动也罢。<br />
####################################<br />
<br />
kern.ipc.numopensockets: 12<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
已经开启的socket数目，可以在最繁忙的时候看看它是多少，然后就可以知道maxsockets应该设置成多少了。<br />
####################################<br />
<br />
kern.ipc.maxsockets: 1928<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
这是用来设定系统最大可以开启的 socket 数目。如果您的服务器会提供大量的 FTP 服务，<br />
而且常快速的传输一些小档案，您也许会发现常传输到一半就中断。因为 FTP 在传输档案时，<br />
每一个档案都必须开启一个 socket 来传输，但关闭 socket 需要一段时间，如果传输速度很快，<br />
而档案又多，则同一时间所开启的 socket 会超过原本系统所许可的值，这时我们就必须把这个值调大一点。<br />
除了 FTP 外，也许有其它网络程序也会有这种问题。<br />
然而，这个值必须在系统一开机就设定好，所以如果要修改这项设定，我们必须修改 /boot/loader.conf 才行<br />
kern.ipc.maxsockets="16424"<br />
####################################<br />
<br />
kern.ipc.nsfbufs: 1456<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
经常使用 sendfile(2) 系统调用的繁忙的服务器， <br />
有必要通过 NSFBUFS 内核选项或者在 /boot/loader.conf (查看 loader(8) 以获得更多细节) 中设置它的值来调节 sendfile(2) 缓存数量。<br />
这个参数需要调节的普通原因是在进程中看到 sfbufa 状态。sysctl kern.ipc.nsfbufs 变量在内核配置变量中是只读的。 <br />
这个参数是由 kern.maxusers 决定的，然而它可能有必要因此而调整。<br />
在/boot/loader.conf里加入<br />
kern.ipc.nsfbufs="2496"<br />
####################################<br />
<br />
<br />
kern.maxusers: 59<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
maxusers 的值决定了处理程序所容许的最大值，20+16*maxusers 就是你将得到的所容许处理程序。<br />
系统一开机就必须要有 18 个处理程序 (process)，即便是简单的执行指令 man 又会产生 9 个 process，<br />
所以将这个值设为 64 应该是一个合理的数目。<br />
如果你的系统会出现 proc table full 的讯息的话，可以就把它设大一点，例如 128。<br />
除非您的系统会需要同时开启很多档案，否则请不要设定超过 256。<br />
<br />
可以在 /boot/loader.conf 中加入该选项的设定，<br />
kern.maxusers=256<br />
####################################<br />
<br />
kern.coredump: 1<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
如果设置为0，则程序异常退出时不会生成core文件，作为服务器，不建议这样。<br />
####################################<br />
<br />
kern.corefile: %N.core<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
可设置为kern.corefile="/data/coredump/%U-%P-%N.core"<br />
其中 %U是UID，%P是进程ID，%N是进程名，当然/data/coredump必须是一个实际存在的目录<br />
####################################<br />
<br />
<br />
vm.swap_idle_enabled: 0<br />
vm.swap_idle_threshold1: 2<br />
vm.swap_idle_threshold2: 10<br />
#########################<br />
在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。<br />
可以让进程更快地进入内存，但它会吃掉更多的交换和磁盘带宽。<br />
系统默认的页面调度算法已经很好了，最好不要更改。<br />
########################<br />
<br />
<br />
vfs.ufs.dirhash_maxmem: 2097152<br />
#########################<br />
默认的dirhash最大内存,默认2M<br />
增加它有助于改善单目录超过100K个文件时的反复读目录时的性能<br />
建议修改为33554432（32M）<br />
#############################<br />
<br />
<br />
vfs.vmiodirenable: 1<br />
#################<br />
这个变量控制目录是否被系统缓存。大多数目录是小的，在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小 (典型的是512字节)。<br />
当这个变量设置为关闭 (0) 时，缓存器仅仅缓存固定数量的目录，即使您有很大的内存。 <br />
而将其开启 (设置为1) 时，则允许缓存器用 VM 页面缓存来缓存这些目录，让所有可用内存来缓存目录。<br />
不利的是最小的用来缓存目录的核心内存是大于 512 字节的物理页面大小(通常是 4k)。<br />
我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。 <br />
这些服务包括 web 缓存，大容量邮件系统和新闻系统。<br />
尽管可能会浪费一些内存，但打开这个选项通常不会降低性能。但还是应该检验一下。<br />
####################<br />
<br />
<br />
vfs.hirunningspace: 1048576<br />
############################<br />
这个值决定了系统可以将多少数据放在写入储存设备的等候区。通常使用默认值即可，<br />
但当我们有多颗硬盘时，我们可以将它调大为 4MB 或 5MB。<br />
注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。<br />
不要盲目的把它设置太高！高的数值会导致同时发生的读操作的迟延。<br />
#############################<br />
<br />
<br />
vfs.write_behind: 1<br />
#########################<br />
这个选项预设为 1，也就是打开的状态。在打开时，在系统需要写入数据在硬盘或其它储存设备上时，<br />
它会等到收集了一个 cluster 单位的数据后再一次写入，否则会在一个暂存区空间有写入需求时就立即写到硬盘上。<br />
这个选项打开时，对于一个大的连续的文件写入速度非常有帮助。但如果您遇到有很多行程延滞在等待写入动作时，您可能必须关闭这个功能。<br />
############################<br />
<br />
net.local.stream.sendspace: 8192<br />
##################################<br />
本地套接字连接的数据发送空间<br />
建议设置为65536<br />
###################################<br />
net.local.stream.recvspace: 8192<br />
##################################<br />
本地套接字连接的数据接收空间<br />
建议设置为65536<br />
###################################<br />
<br />
<br />
net.inet.ip.portrange.lowfirst: 1023<br />
net.inet.ip.portrange.lowlast: 600<br />
net.inet.ip.portrange.first: 49152<br />
net.inet.ip.portrange.last: 65535<br />
net.inet.ip.portrange.hifirst: 49152<br />
net.inet.ip.portrange.hilast: 65535<br />
###################<br />
以上六项是用来控制TCP及UDP所使用的port范围，这个范围被分成三个部份，低范围、预设范围、及高范围。<br />
这些是你的服务器主动发起连接时的临时端口的范围，预设的已经1万多了，一般的应用就足够了。<br />
如果是比较忙碌的FTP server，一般也不会同时提供给1万多人访问的，<br />
当然如果很不幸，你的服务器就要提供很多，那么可以修改first的值，比如直接用1024开始<br />
#########################<br />
<br />
<br />
net.inet.ip.redirect: 1<br />
#########################<br />
设置为0，屏蔽ip重定向功能<br />
###########################<br />
<br />
net.inet.ip.rtexpire: 3600<br />
net.inet.ip.rtminexpire: 10<br />
########################<br />
很多apache产生的CLOSE_WAIT状态，这种状态是等待客户端关闭，但是客户端那边并没有正常的关闭，于是留下很多这样的东东。<br />
建议都修改为2<br />
#########################<br />
<br />
<br />
net.inet.ip.intr_queue_maxlen: 50<br />
########################<br />
Maximum size of the IP input queue，如果下面的net.inet.ip.intr_queue_drops一直在增加，<br />
那就说明你的队列空间不足了，那么可以考虑增加该值。<br />
##########################<br />
net.inet.ip.intr_queue_drops: 0<br />
####################<br />
Number of packets dropped from the IP input queue,如果你sysctl它一直在增加，<br />
那么增加net.inet.ip.intr_queue_maxlen的值。<br />
#######################<br />
<br />
<br />
net.inet.ip.fastforwarding: 0<br />
#############################<br />
如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表，节约路由的计算时间<br />
但会需要大量的内核内存空间来保存路由表。<br />
如果内存够大，打开吧，呵呵<br />
#############################<br />
<br />
<br />
net.inet.ip.random_id: 0<br />
#####################<br />
默认情况下，ip包的id号是连续的，而这些可能会被攻击者利用，比如可以知道你nat后面带了多少主机。<br />
如果设置成1，则这个id号是随机的，嘿嘿。<br />
#####################<br />
<br />
net.inet.icmp.maskrepl: 0<br />
############################<br />
防止广播风暴，关闭其他广播探测的响应。默认即是，无须修改。<br />
###############################<br />
<br />
net.inet.icmp.icmplim: 200<br />
##############################<br />
限制系统发送ICMP速率，改为100吧，或者保留也可，并不会给系统带来太大的压力。<br />
###########################<br />
net.inet.icmp.icmplim_output: 1<br />
###################################<br />
如果设置成0，就不会看到提示说Limiting icmp unreach response from 214 to 200 packets per second 等等了<br />
不过禁止输出容易让我们忽视攻击的存在。这个自己看着办吧。<br />
######################################<br />
<br />
net.inet.icmp.drop_redirect: 0<br />
net.inet.icmp.log_redirect: 0<br />
###################################<br />
设置为1，屏蔽ICMP重定向功能<br />
###################################<br />
net.inet.icmp.bmcastecho: 0<br />
############################<br />
防止广播风暴，关闭广播ECHO响应，默认即是，无须修改。<br />
###############################<br />
<br />
<br />
net.inet.tcp.mssdflt: 512<br />
net.inet.tcp.minmss: 216<br />
###############################<br />
数据包数据段最小值，以上两个选项最好不动！或者只修改mssdflt为1460，minmss不动。<br />
原因详见<a href="http://www.bsdlover.cn/security/2007/1211/article_4.html" target="_blank">http://www.bsdlover.cn/security/2007/1211/article_4.html</a><br />
#############################<br />
<br />
<br />
net.inet.tcp.keepidle: 7200000<br />
######################<br />
TCP的套接字的空闲时间，默认时间太长，可以改为600000（10分钟）。<br />
##########################<br />
<br />
net.inet.tcp.sendspace: 32768<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
最大的待发送TCP数据缓冲区空间，应用程序将数据放到这里就认为发送成功了，系统TCP堆栈保证数据的正常发送。<br />
####################################<br />
net.inet.tcp.recvspace: 65536<br />
###################################<br />
最大的接受TCP缓冲区空间，系统从这里将数据分发给不同的套接字，增大该空间可提高系统瞬间接受数据的能力以提高性能。<br />
###################################<br />
这二个选项分别控制了网络 TCP 联机所使用的传送及接收暂存区的大小。预设的传送暂存区为 32K，而接收暂存区为 64K。<br />
如果需要加速 TCP 的传输，可以将这二个值调大一点，但缺点是太大的值会造成系统核心占用太多的内存。<br />
如果我们的机器会同时服务数百或数千个网络联机，那么这二个选项最好维持默认值，否则会造成系统核心内存不足。<br />
但如果我们使用的是 gigabite 的网络，将这二个值调大会有明显效能的提升。<br />
传送及接收的暂存区大小可以分开调整，<br />
例如，假设我们的系统主要做为网页服务器，我们可以将接收的暂存区调小一点，并将传送的暂存区调大，如此一来，我们就可以避免占去太多的核心内存空间。<br />
<br />
net.inet.udp.maxdgram: 9216<br />
#########################<br />
最大的发送UDP数据缓冲区大小，网上的资料大多都是65536，我个人认为没多大必要，<br />
如果要调整，可以试试24576。<br />
##############################<br />
net.inet.udp.recvspace: 42080<br />
##################<br />
最大的接受UDP缓冲区大小，网上的资料大多都是65536，我个人认为没多大必要，<br />
如果要调整，可以试试49152。<br />
#######################<br />
以上四项配置通常不会导致问题，一般说来网络流量是不对称的，因此应该根据实际情况调整，并观察其效果。<br />
如果我们将传送或接收的暂存区设为大于 65535，除非服务器本身及客户端所使用的操作系统都支持 TCP 协议的 windows scaling extension (请参考 RFC 1323 文件)。<br />
FreeBSD默认已支持 rfs1323 (即 sysctl 的 net.inet.tcp.rfc1323 选项)。<br />
###################################################<br />
<br />
<br />
net.inet.tcp.log_in_vain: 0<br />
##################<br />
记录下任何TCP连接，这个一般情况下不应该更改。<br />
####################<br />
<br />
net.inet.tcp.blackhole: 0<br />
##################################<br />
建议设置为2，接收到一个已经关闭的端口发来的所有包，直接drop，如果设置为1则是只针对TCP包<br />
#####################################<br />
<br />
net.inet.tcp.delayed_ack: 1<br />
###########################<br />
当一台计算机发起TCP连接请求时，系统会回应ACK应答数据包。<br />
该选项设置是否延迟ACK应答数据包，把它和包含数据的数据包一起发送。<br />
在高速网络和低负载的情况下会略微提高性能，但在网络连接较差的时候，<br />
对方计算机得不到应答会持续发起连接请求，反而会让网络更加拥堵，降低性能。<br />
因此这个值我建议您看情况而定，如果您的网速不是问题，可以将封包数量减少一半<br />
如果网络不是特别好，那么就设置为0，有请求就先回应，这样其实浪费的网通、电信的带宽速率而不是你的处理时间:)<br />
############################<br />
<br />
<br />
net.inet.tcp.inflight.enable: 1<br />
net.inet.tcp.inflight.debug: 0<br />
net.inet.tcp.inflight.rttthresh: 10<br />
net.inet.tcp.inflight.min: 6144<br />
net.inet.tcp.inflight.max: 1073725440<br />
net.inet.tcp.inflight.stab: 20<br />
###########################<br />
限制 TCP 带宽延迟积和 NetBSD 的 TCP/Vegas 类似。 <br />
它可以通过将 sysctl 变量 net.inet.tcp.inflight.enable 设置成 1 来启用。 <br />
系统将尝试计算每一个连接的带宽延迟积，并将排队的数据量限制在恰好能保持最优吞吐量的水平上。<br />
这一特性在您的服务器同时向使用普通调制解调器，千兆以太网，乃至更高速度的光与网络连接 (或其他带宽延迟积很大的连接) 的时候尤为重要，<br />
特别是当您同时使用滑动窗缩放，或使用了大的发送窗口的时候。 <br />
如果启用了这个选项，您还应该把 net.inet.tcp.inflight.debug 设置为 0 (禁用调试)，<br />
对于生产环境而言， 将 net.inet.tcp.inflight.min 设置成至少 6144 会很有好处。 <br />
然而， 需要注意的是，这个值设置过大事实上相当于禁用了连接带宽延迟积限制功能。<br />
这个限制特性减少了在路由和交换包队列的堵塞数据数量，也减少了在本地主机接口队列阻塞的数据的数量。<br />
在少数的等候队列中、交互式连接，尤其是通过慢速的调制解调器，也能用低的 往返时间操作。<br />
但是，注意这只影响到数据发送 (上载/服务端)。对数据接收(下载)没有效果。<br />
调整 net.inet.tcp.inflight.stab 是 不 推荐的。<br />
这个参数的默认值是 20，表示把 2 个最大包加入到带宽延迟积窗口的计算中。 <br />
额外的窗口似的算法更为稳定，并改善对于多变网络环境的相应能力， <br />
但也会导致慢速连接下的 ping 时间增长 (尽管还是会比没有使用 inflight 算法低许多)。 <br />
对于这些情形， 您可能会希望把这个参数减少到 15， 10， 或 5； <br />
并可能因此而不得不减少 net.inet.tcp.inflight.min (比如说， 3500) 来得到希望的效果。<br />
减少这些参数的值， 只应作为最后不得已时的手段来使用。<br />
############################<br />
<br />
net.inet.tcp.syncookies: 1<br />
#########################<br />
SYN cookies是一种用于通过选择加密的初始化TCP序列号，可以对回应的包做验证来降低SYN'洪水'攻击的影响的技术。<br />
默认即是，不需修改<br />
########################<br />
<br />
<br />
net.inet.tcp.msl: 30000<br />
#######################<br />
这个值网上很多文章都推荐的7500，<br />
还可以改的更小一些(如2000或2500)，这样可以加快不正常连接的释放过程(三次握手2秒、FIN_WAIT4秒)。<br />
#########################<br />
net.inet.tcp.always_keepalive: 1<br />
###########################<br />
帮助系统清除没有正常断开的TCP连接，这增加了一些网络带宽的使用，但是一些死掉的连接最终能被识别并清除。<br />
死的TCP连接是被拨号用户存取的系统的一个特别的问题，因为用户经常断开modem而不正确的关闭活动的连接。<br />
#############################<br />
<br />
net.inet.udp.checksum: 1<br />
#########################<br />
防止不正确的udp包的攻击，默认即是，不需修改<br />
##############################<br />
<br />
net.inet.udp.log_in_vain: 0<br />
#######################<br />
记录下任何UDP连接,这个一般情况下不应该修改。<br />
#######################<br />
<br />
net.inet.udp.blackhole: 0<br />
####################<br />
建议设置为1，接收到一个已经关闭的端口发来的所有UDP包直接drop<br />
#######################<br />
<br />
<br />
net.inet.raw.maxdgram: 8192<br />
#########################<br />
Maximum outgoing raw IP datagram size<br />
很多文章建议设置为65536，好像没多大必要。<br />
######################################<br />
net.inet.raw.recvspace: 8192<br />
######################<br />
Maximum incoming raw IP datagram size<br />
很多文章建议设置为65536，好像没多大必要。<br />
#######################<br />
<br />
net.link.ether.inet.max_age: 1200<br />
####################<br />
调整ARP清理的时间，通过向IP路由缓冲填充伪造的ARP条目可以让恶意用户产生资源耗竭和性能减低攻击。<br />
这项似乎大家都未做改动，我建议不动或者稍微减少，比如300（HP-UX默认的5分钟）<br />
#######################<br />
<br />
net.inet6.ip6.redirect: 1<br />
###############################<br />
设置为0，屏蔽ipv6重定向功能<br />
###########################<br />
<br />
<br />
net.isr.direct: 0<br />
#################<a href="http://www.bsdlover.cn/" target="_blank">http://www.bsdlover.cn</a>#########<br />
所有MPSAFE的网络ISR对包做立即响应,提高网卡性能，设置为1。<br />
####################################<br />
<br />
<br />
hw.ata.wc: 1<br />
#####################<br />
这个选项用来打开 IDE 硬盘快取。当打开时，如果有数据要写入硬盘时，硬盘会假装已完成写入，并将数据快取起来。<br />
这种作法会加速硬盘的存取速度，但当系统异常关机时，比较容易造成数据遗失。<br />
不过由于关闭这个功能所带来的速度差异实在太大，建议还是保留原本打开的状态吧，不做修改。<br />
###################<br />
<br />
<br />
security.bsd.see_other_uids: 1<br />
security.bsd.see_other_gids: 1<br />
#####################<br />
不允许用户看到其他用户的进程,因此应该改成0，<br />
#######################</div>
<br style="clear: both" />
<img src ="http://www.blogjava.net/natlive/aggbug/170510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/natlive/" target="_blank">狂龙</a> 2007-12-26 10:34 <a href="http://www.blogjava.net/natlive/archive/2007/12/26/170510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一切皆是工具，创造皆由自己</title><link>http://www.blogjava.net/natlive/archive/2007/09/30/149896.html</link><dc:creator>狂龙</dc:creator><author>狂龙</author><pubDate>Sun, 30 Sep 2007 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/natlive/archive/2007/09/30/149896.html</guid><wfw:comment>http://www.blogjava.net/natlive/comments/149896.html</wfw:comment><comments>http://www.blogjava.net/natlive/archive/2007/09/30/149896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/natlive/comments/commentRss/149896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/natlive/services/trackbacks/149896.html</trackback:ping><description><![CDATA[无论是Spring也好，Hibernate、iBatis也好，什么Struts2、Struts1等等等，其实都只是工具，你要做的是利用这些工具，为你设计的软件架构服务。<br />
<br />
要记着，你的业务需求分析和业务逻辑才是重点，一切都是为了解决这些商业业务问题而进行的活动。
<img src ="http://www.blogjava.net/natlive/aggbug/149896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/natlive/" target="_blank">狂龙</a> 2007-09-30 14:34 <a href="http://www.blogjava.net/natlive/archive/2007/09/30/149896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Service层的约定</title><link>http://www.blogjava.net/natlive/archive/2007/09/24/147768.html</link><dc:creator>狂龙</dc:creator><author>狂龙</author><pubDate>Mon, 24 Sep 2007 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/natlive/archive/2007/09/24/147768.html</guid><wfw:comment>http://www.blogjava.net/natlive/comments/147768.html</wfw:comment><comments>http://www.blogjava.net/natlive/archive/2007/09/24/147768.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/natlive/comments/commentRss/147768.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/natlive/services/trackbacks/147768.html</trackback:ping><description><![CDATA[业务逻辑层是业务逻辑层，而Service层则就是Service层，Service提供系统调用的接口，表示一次完整的操作。<br />
<br />
Service层和控制层使用DTO进行数据交换，但属性为DTO的DTO，我们约定把这个属性做为Service接口方法的一个参数，以明确意义。<br />
<br />
因为Service层每个操作都是单一意义的，那些被参数(上面所说的DTO的属性为DTO的情况）了的DTO则应该不做为Service可修改之列，这样可以更明确Service的任务。
<img src ="http://www.blogjava.net/natlive/aggbug/147768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/natlive/" target="_blank">狂龙</a> 2007-09-24 13:11 <a href="http://www.blogjava.net/natlive/archive/2007/09/24/147768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2 配置Hibernate3 thread事务注意事项</title><link>http://www.blogjava.net/natlive/archive/2007/09/21/146979.html</link><dc:creator>狂龙</dc:creator><author>狂龙</author><pubDate>Fri, 21 Sep 2007 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/natlive/archive/2007/09/21/146979.html</guid><wfw:comment>http://www.blogjava.net/natlive/comments/146979.html</wfw:comment><comments>http://www.blogjava.net/natlive/archive/2007/09/21/146979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/natlive/comments/commentRss/146979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/natlive/services/trackbacks/146979.html</trackback:ping><description><![CDATA[最容易出错的地方就是配置切入点的时候，配置表达式错误，导致不能正确地绑定事务，会出现提示当前线程未绑定事务和不支持非事务操作错误等。<br />
<br />
最好还是用hibernate.cfg.xml，这样就可以以最通用的方式配置hibernate，不置于在Spring使用默生的参数。<br />
&nbsp;<br />
配置事务时不使用注解，这样就算是要改一些事务配置也不致于要重新编译一遍源码。
<img src ="http://www.blogjava.net/natlive/aggbug/146979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/natlive/" target="_blank">狂龙</a> 2007-09-21 09:54 <a href="http://www.blogjava.net/natlive/archive/2007/09/21/146979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 中把AroundInterceptor去掉了。</title><link>http://www.blogjava.net/natlive/archive/2007/08/21/138330.html</link><dc:creator>狂龙</dc:creator><author>狂龙</author><pubDate>Tue, 21 Aug 2007 04:01:00 GMT</pubDate><guid>http://www.blogjava.net/natlive/archive/2007/08/21/138330.html</guid><wfw:comment>http://www.blogjava.net/natlive/comments/138330.html</wfw:comment><comments>http://www.blogjava.net/natlive/archive/2007/08/21/138330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/natlive/comments/commentRss/138330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/natlive/services/trackbacks/138330.html</trackback:ping><description><![CDATA[在看《WW in action》中关于Interceptor的时候发现AroundInterceptor类在Struts2中已经去除，我觉得也是，before和after两个方法无法共用数据，这个类真的没什么用，很多时候都是实现Interceptor接口更为实际。在Strtus2中，实现AbtractInterceptor更为有用，因为可以不用实现init和destory方法，直接实现intercept方法就可以了。<br><br>------------<br><br>这段时间心情很不好，也有点忙，疏于写文章了。<br><br>不过还要努力，加油。
<img src ="http://www.blogjava.net/natlive/aggbug/138330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/natlive/" target="_blank">狂龙</a> 2007-08-21 12:01 <a href="http://www.blogjava.net/natlive/archive/2007/08/21/138330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant 学习笔记（一）</title><link>http://www.blogjava.net/natlive/archive/2007/08/13/136336.html</link><dc:creator>狂龙</dc:creator><author>狂龙</author><pubDate>Mon, 13 Aug 2007 04:19:00 GMT</pubDate><guid>http://www.blogjava.net/natlive/archive/2007/08/13/136336.html</guid><wfw:comment>http://www.blogjava.net/natlive/comments/136336.html</wfw:comment><comments>http://www.blogjava.net/natlive/archive/2007/08/13/136336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/natlive/comments/commentRss/136336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/natlive/services/trackbacks/136336.html</trackback:ping><description><![CDATA[<p>一、定义目标任务。<br>Ant是由若干目标任务组成的，由这些任务组合完成一系统的操作。所有的任务必须在&lt;project&gt;标签下，project表示一个项目，而且必须指定一个默认的目标任务，执行默认的操作，用default属性指定：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">project&nbsp;</span><span style="COLOR: #ff0000">default</span><span style="COLOR: #0000ff">="init"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">target&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="init"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;一些操作&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">target</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">target&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="otherTargets"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;一些操作&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">target</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">project</span><span style="COLOR: #0000ff">&gt;</span></div>
<p><br><br>二、定义属性。<br>其实就是等于预定义环境变量，而且这些变量一旦定义就不能改变。定义这些属性的意义在于统一操作和重用这些属性。而这种功能主要用于定义目录位置：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="src.dir"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="src"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="dest.dir"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="bin"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="config.dir"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="config"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span></div>
<br>文件系统路径的定义：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="test.dir"</span><span style="COLOR: #ff0000">&nbsp;location</span><span style="COLOR: #0000ff">="the/test/directory"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span></div>
<br>使用这些变量的方法是：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">javac&nbsp;</span><span style="COLOR: #ff0000">srcdir</span><span style="COLOR: #0000ff">="${src.dir}"</span><span style="COLOR: #ff0000">&nbsp;destdir</span><span style="COLOR: #0000ff">="${dest.dir}"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span></div>
<br>三、编译操作。<br>使用javac标签，srcdir属性指定源码目录，destdir属性指定目标文件目录，debug指定生成目标代码是否带有调试信息，fork表示是否新开一个jvm来编译，classpath指定CLASSPATH。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">javac&nbsp;</span><span style="COLOR: #ff0000">srcdir</span><span style="COLOR: #0000ff">="${src.dir}"</span><span style="COLOR: #ff0000">&nbsp;destdir</span><span style="COLOR: #0000ff">="${dest.dir}"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span></div>
<br>四、打包jar。<br>使用jar标签，destfile属性指定目标文件路径，basedir指定要打包的那个目录的路径。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">jar&nbsp;</span><span style="COLOR: #ff0000">destfile</span><span style="COLOR: #0000ff">="parkage.jar"</span><span style="COLOR: #ff0000">&nbsp;basedir</span><span style="COLOR: #0000ff">="dest.dir"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span></div>
<br>五、设置时间。<br>在有需要使用到时间时就要用到这一步。设置时间必须是在第一个会被运行的target(init)中定义，使用的标签是：tstamp，不需要任何标签属性设置，它会预设置三个属性变量：TSTAMP,DSTAMP,TODAY，表示格式是：HHMM，YYYYMMDD，日期的英文表示：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">target&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="init"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">tstamp&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">target</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">target&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="other&nbsp;action"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">jar&nbsp;</span><span style="COLOR: #ff0000">destfile</span><span style="COLOR: #0000ff">="${DSTAMP}${TSTAMP}${TODAY}.jar"</span><span style="COLOR: #ff0000">&nbsp;basedir</span><span style="COLOR: #0000ff">="${dest.dir}"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">target</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>可以自定义时间格式，方法是在定义&lt;tstamp&gt;中加入&lt;format&gt;，&lt;format&gt;的property属性指定属性变量名，可以为以后调用，而pattern属性指定格式，其方式是SimpleDateFormat类的工作方式一样：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">target&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="init"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">tstamp</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">format&nbsp;</span><span style="COLOR: #ff0000">property</span><span style="COLOR: #0000ff">="NORMAL"</span><span style="COLOR: #ff0000">&nbsp;pattern</span><span style="COLOR: #0000ff">="yyyy-mm-dd(HH_mm_ss)"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">tstamp</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">target</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">target&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="other&nbsp;actions"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">jar&nbsp;</span><span style="COLOR: #ff0000">destfile</span><span style="COLOR: #0000ff">="${NORMAL}.jar"</span><span style="COLOR: #ff0000">&nbsp;basedir</span><span style="COLOR: #0000ff">="${dest.dir}"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">target</span><span style="COLOR: #0000ff">&gt;</span></div>
<img src ="http://www.blogjava.net/natlive/aggbug/136336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/natlive/" target="_blank">狂龙</a> 2007-08-13 12:19 <a href="http://www.blogjava.net/natlive/archive/2007/08/13/136336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自翻译·Freemarker 文档（一）</title><link>http://www.blogjava.net/natlive/archive/2007/08/13/136286.html</link><dc:creator>狂龙</dc:creator><author>狂龙</author><pubDate>Mon, 13 Aug 2007 01:51:00 GMT</pubDate><guid>http://www.blogjava.net/natlive/archive/2007/08/13/136286.html</guid><wfw:comment>http://www.blogjava.net/natlive/comments/136286.html</wfw:comment><comments>http://www.blogjava.net/natlive/archive/2007/08/13/136286.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/natlive/comments/commentRss/136286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/natlive/services/trackbacks/136286.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: Courier">自己的英语水平只有一级半，为了努力学好英语，现在一天一个翻译，先从Freemarker文档开始，有不对的地方多谢指正抛砖。<br><br>Create a configuration instance<br>建立一个配置实例</p>
<p style="FONT-FAMILY: Courier">First you have to create a freemarker.template.Configuration instance and adjust its settings. A Configuration instance is a central place to store the appliction level setting of FreeMarker. Also, it deals with the creation and caching of pre-parsed templates.<br>首先你必须建立一个freemarker.template.Configuration类的实例并调整它的设置. 一个Configuration类实例是保存Freemarker应用程序设置的中心首要. 同样, 它决定着预编译模版的建立和缓冲.</p>
<p>Probably you will do it only once at the beginning of the application(possibly servlet) life-cycle:<br>也许你只需要在程序开始时,仅仅只需调用一次下面的代码,并且在程序的整个生命周期都可用:<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Configuration&nbsp;cfg&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Configuration();<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Specify&nbsp;the&nbsp;data&nbsp;source&nbsp;where&nbsp;the&nbsp;template&nbsp;files&nbsp;come&nbsp;from.<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;指定模板的数据源<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Here&nbsp;I&nbsp;set&nbsp;a&nbsp;file&nbsp;directory&nbsp;for&nbsp;it:<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;在这里我设置为一个目录</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">cfg.setDirectoryForTemplateLoading(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Fil(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/where/you/store/templates</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Specify&nbsp;how&nbsp;templates&nbsp;will&nbsp;see&nbsp;the&nbsp;data&nbsp;model.&nbsp;This&nbsp;is&nbsp;an&nbsp;advanced&nbsp;topic<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;指定模板怎么读取数据模型(data&nbsp;model).&nbsp;这是一个需要专门讨论的话题<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;but&nbsp;just&nbsp;use&nbsp;this:<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;不过现在你可以这样做</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">cfg.setObjectWrapper(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DefaultObjectWrapper());&nbsp;&nbsp;<br></span></div>
<p><span style="FONT-FAMILY: Courier">From now you should use this single configuration instance. Note however that if a system has multiple independent components that use FreeMarker, then of course they will use their own private Configuration instance.<br>现在开始,你就可以使用这个Configuration实例了. 如果一个系统有多个模块使用Freemarker的话, 毫无意外的, 它们最后使用它们各自私有的Configuration实例.</span> </p>
<img src ="http://www.blogjava.net/natlive/aggbug/136286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/natlive/" target="_blank">狂龙</a> 2007-08-13 09:51 <a href="http://www.blogjava.net/natlive/archive/2007/08/13/136286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>