﻿<?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-cyantide-随笔分类-web</title><link>http://www.blogjava.net/cyantide/category/36407.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 04 Jul 2010 04:38:49 GMT</lastBuildDate><pubDate>Sun, 04 Jul 2010 04:38:49 GMT</pubDate><ttl>60</ttl><item><title>struts2 和 fckeditor 整合</title><link>http://www.blogjava.net/cyantide/archive/2010/06/28/324671.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Mon, 28 Jun 2010 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/06/28/324671.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/324671.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/06/28/324671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/324671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/324671.html</trackback:ping><description><![CDATA[1. 需重新编写filter,继承StrutsPrepareAndExecuteFilter<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.IOException;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.FilterChain;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletException;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletRequest;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletResponse;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletRequest;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;StrutsAndFckFilter&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;StrutsPrepareAndExecuteFilter&nbsp;{<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&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;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChain&nbsp;chain)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;IOException,&nbsp;ServletException&nbsp;{<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;httpRequest</span><span style="color: #000000;">=</span><span style="color: #000000;">(HttpServletRequest)request;<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">/fckeditor/editor/filemanager/connectors</span><span style="color: #000000;">"</span><span style="color: #000000;">.equals(httpRequest.getServletPath())){<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(request,&nbsp;response);<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.doFilter(request,&nbsp;response,&nbsp;chain);<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">27</span>&nbsp;</div>
2. 在classes目录添加 fckeditor.properties 文件<br />
&nbsp;&nbsp; 内容为 connector.userActionImpl=net.fckeditor.requestcycle.impl.EnabledUserAction<br />
<br />
3. 修改web.xml<br />
&nbsp;&nbsp; <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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">struts2</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">com.capinfo.cms.common.filter.StrutsAndFckFilter</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ConnectorServlet</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; net.fckeditor.connector.ConnectorServlet<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-on-startup</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">load-on-startup</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ConnectorServlet</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;Do&nbsp;not&nbsp;wrap&nbsp;this&nbsp;line&nbsp;otherwise&nbsp;Glassfish&nbsp;will&nbsp;fail&nbsp;to&nbsp;load&nbsp;this&nbsp;file&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/fckeditor/editor/filemanager/connectors/*</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">17</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span></div>
综上所述之后,整合完毕<br />
<br />
<img src ="http://www.blogjava.net/cyantide/aggbug/324671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-06-28 14:32 <a href="http://www.blogjava.net/cyantide/archive/2010/06/28/324671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SiteMesh页面布局组件 转载</title><link>http://www.blogjava.net/cyantide/archive/2010/05/18/321276.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 18 May 2010 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/05/18/321276.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/321276.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/05/18/321276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/321276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/321276.html</trackback:ping><description><![CDATA[<span><span lang="EN-US"><span> </span>SiteMesh</span><span>是一个用来在<span lang="EN-US">JSP</span>中实现页面布局和装饰（<span lang="EN-US">layout and decoration</span>）的框架组件，能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。提供了一种在网站中更有效的组织页面布局的方式。</span></span>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt;"><span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>SiteMesh</span><span>设计思想是，用户发送<span lang="EN-US">request</span>至服务器，服务器根据此<span lang="EN-US">request</span>生成动态数据，生成网页，准备返回给客户端。就在返回前，<span lang="EN-US">SiteMesh</span>进行拦截，对此网页进行解析，将<span lang="EN-US">title</span>、<span lang="EN-US">body</span>等部分拆解出来，套上模板后，再返回给客户端。由于<span lang="EN-US">SiteMesh</span>在返回客户端的最后一步工作，此时的网页已经具备了标准的<span lang="EN-US">html</span>网页格式，因此<span lang="EN-US">SiteMesh</span>只需解析标准的<span lang="EN-US">html</span>网页，无需考虑各个<span lang="EN-US">Web</span>应用是应用了<span lang="EN-US">JSP</span>、<span lang="EN-US">ASP</span>，还是<span lang="EN-US">Velocity</span>技术，相当灵活。</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt;"><span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>SiteMesh</span><span>使用了<span lang="EN-US">Decorator</span>的设计模式。</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span>&nbsp;</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span><span>本文为大家展示一个简单的<span lang="EN-US">SiteMesh</span>例子。</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>首先创建一个<span lang="EN-US">web</span>工程<span lang="EN-US">.</span>名字就叫做<span lang="EN-US">SitemeshSample.</span>将<span lang="EN-US">sitemesh-2.3.jar,</span></span><span lang="EN-US"><span style="font-size: small;"> </span></span><span lang="EN-US">commons-collections.jar</span><span>放到<span lang="EN-US">lib</span>目录下。</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left"><span><span>在<span lang="EN-US">web.xml</span>中加入如下片段<span lang="EN-US">:</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;filter&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-name&gt;sitemesh&lt;/filter-name&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-class&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>com.opensymphony.module.sitemesh.filter.PageFilter</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/filter-class&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;/filter&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;filter-mapping&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-name&gt;sitemesh&lt;/filter-name&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;/filter-mapping&gt;</span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: teal;"><span>这里定义了一个过滤器</span></span><span lang="EN-US">.</span><span style="font-size: 10pt; color: teal;"><span>所有的请求都交由</span></span><span lang="EN-US">sitemesh</span><span><span style="font-size: 10pt; color: teal;">来处理</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在<span lang="EN-US">WEB-INF</span>下创建一个<span lang="EN-US">decorators.xml</span>文件<span lang="EN-US">,</span>内容如下<span lang="EN-US">:</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;decorators defaultdir="/decorators"&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>&lt;decorator name="main" page="main.jsp"&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>&lt;pattern&gt;/*&lt;/pattern&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>&lt;/decorator&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;/decorators&gt;</span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span><span style="font-size: 10pt; color: teal;">这是定义了模板页，也就是所有页面在返回给客户端之前，先在这里加上装饰，套上模板。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">defaultdir</span><span lang="EN-US">=</span><span lang="EN-US">"/decorators"</span><span>说明了模板页的路径。</span><span lang="EN-US">&lt;</span><span lang="EN-US">decorator </span><span lang="EN-US">name</span><span lang="EN-US">=</span><span lang="EN-US">"main" </span><span lang="EN-US">page</span><span lang="EN-US">=</span><span lang="EN-US">"main.jsp"</span><span lang="EN-US">&gt;</span><span>模板页的名称。</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">pattern</span><span lang="EN-US">&gt;</span><span lang="EN-US">/*</span><span lang="EN-US">&lt;/</span><span lang="EN-US">pattern</span><span lang="EN-US">&gt;</span><span>表示对所有的</span><span lang="EN-US">response</span><span>进行处理</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span>在</span><span lang="EN-US">web</span><span>下面建一个文件夹取名</span><span lang="EN-US">decorators.</span><span>在</span><span lang="EN-US">decoratots</span><span>下面创建上面定义的模板页面</span><span lang="EN-US">main.jsp,</span><span>内容如下</span><span lang="EN-US">:</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;%@ </span><span lang="EN-US">page </span><span lang="EN-US">language</span><span lang="EN-US">=</span><span lang="EN-US">"java" </span><span lang="EN-US">import</span><span lang="EN-US">=</span><span lang="EN-US">"java.util.*" </span><span lang="EN-US">pageEncoding</span><span lang="EN-US">=</span><span lang="EN-US">"UTF-8"</span><span lang="EN-US">%&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;%@ </span><span lang="EN-US">taglib </span><span lang="EN-US">uri</span><span lang="EN-US">=</span><span lang="EN-US">"http://www.opensymphony.com/sitemesh/decorator" </span><span lang="EN-US">prefix</span><span lang="EN-US">=</span><span lang="EN-US">"decorator"</span><span lang="EN-US">%&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;!</span><span lang="EN-US">DOCTYPE </span><span lang="EN-US">HTML </span><span lang="EN-US">PUBLIC </span><span lang="EN-US">"-//W3C//DTD HTML 4.01 Transitional//EN"</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;</span><span lang="EN-US">html</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">head</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">title</span><span lang="EN-US">&gt;&lt;</span><span lang="EN-US">decorator:title </span><span lang="EN-US">/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;/</span><span lang="EN-US">title</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">body</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span><span lang="EN-US">Add head decorator...</span><span lang="EN-US">&lt;/</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">decorator:body </span><span lang="EN-US">/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span><span lang="EN-US">Add foot decorator...</span><span lang="EN-US">&lt;/</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;/</span><span lang="EN-US">body</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;/</span><span lang="EN-US">html</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>说明</span><span lang="EN-US">:</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;%@ </span><span lang="EN-US">taglib </span><span lang="EN-US">uri</span><span lang="EN-US">=</span><span lang="EN-US">"http://www.opensymphony.com/sitemesh/decorator" </span><span lang="EN-US">prefix</span><span lang="EN-US">=</span><span lang="EN-US">"decorator"</span><span lang="EN-US">%&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>此处为</span><span lang="EN-US">decorator</span><span>标签的声明。因为我们下面要使用到它</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;</span><span lang="EN-US">decorator:title </span><span lang="EN-US">/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>把请求的原始页面的</span><span lang="EN-US">title</span><span>内容插入到</span><span lang="EN-US">&lt;title&gt;&lt;/title&gt;,</span><span>比如我们要请求</span><span lang="EN-US">index.jsp</span><span>页面的时候。会把</span><span lang="EN-US">index.jsp</span><span>中的</span><span lang="EN-US">title</span><span>的内容放入到这里</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;</span><span lang="EN-US">decorator:body </span><span lang="EN-US">/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>把请求的原始页面的</span><span lang="EN-US">body</span><span>内容插入到</span><span lang="EN-US">&lt;body&gt;&lt;/body&gt;,</span><span>发现没有我们在这句的前面加上了</span><span lang="EN-US">&lt;</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span><span lang="EN-US">Add head decorator...</span><span lang="EN-US">&lt;/</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span><span>和</span><span lang="EN-US">&lt;</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span><span lang="EN-US">Add foot decorator...</span><span lang="EN-US">&lt;/</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>相当于给我们请求的页面的</span><span lang="EN-US">body</span><span>内容加上了头部和尾部</span><span lang="EN-US">.</span><span>实现了模板功能。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>在</span><span lang="EN-US">WEB-INF</span><span>下创建我们要请求访问的页面</span><span lang="EN-US">index.jsp</span><span>，内容如下</span><span lang="EN-US">:</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;%@ </span><span lang="EN-US">page </span><span lang="EN-US">language</span><span lang="EN-US">=</span><span lang="EN-US">"java" </span><span lang="EN-US">import</span><span lang="EN-US">=</span><span lang="EN-US">"java.util.*" </span><span lang="EN-US">pageEncoding</span><span lang="EN-US">=</span><span lang="EN-US">"UTF-8"</span><span lang="EN-US">%&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;!</span><span lang="EN-US">DOCTYPE </span><span lang="EN-US">HTML </span><span lang="EN-US">PUBLIC </span><span lang="EN-US">"-//W3C//DTD HTML 4.01 Transitional//EN"</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;</span><span lang="EN-US">html</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">head</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">title</span><span lang="EN-US">&gt;</span><span lang="EN-US">SiteMesh Sample Site</span><span lang="EN-US">&lt;/</span><span lang="EN-US">title</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;/</span><span lang="EN-US">head</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">body</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Welcome to the SiteMesh sample...</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;/</span><span lang="EN-US">body</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;/</span><span lang="EN-US">html</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>把</span><span lang="EN-US">web</span><span>工程部署到</span><span lang="EN-US">tomcat</span><span>容器中。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>输入</span><span lang="EN-US"><a href="http://localhost:8080/SitemeshSample/index.jsp"><span>http://localhost:8080/</span><span>SitemeshSample/index.jsp</span></a></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>页面效果如下：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">Add head decorator...</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">Welcome to the SiteMesh sample... </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">Add foot decorator...</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>不难发现，我们</span><span lang="EN-US">index.jsp</span><span>中只有</span><span lang="EN-US">Welcome to the SiteMesh sample... </span><span>一句。但是在返回给我们之前套上了</span><span lang="EN-US">main.jsp</span><span>模板页。在它的前面和后面分别加上了一句话。通过</span><span lang="EN-US">Sitemesh</span><span>我们可以很容易实现页面中动态内容和静态装饰外观的分离。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><em><span lang="EN-US">&nbsp;</span></em></p>
<img src ="http://www.blogjava.net/cyantide/aggbug/321276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-05-18 15:05 <a href="http://www.blogjava.net/cyantide/archive/2010/05/18/321276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>页面调用ocx控件时，客户端无法打开的解决办法</title><link>http://www.blogjava.net/cyantide/archive/2010/01/06/308446.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Wed, 06 Jan 2010 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/01/06/308446.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/308446.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/01/06/308446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/308446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/308446.html</trackback:ping><description><![CDATA[<p><br />
</p>
<p>调用ocx的网页在本地Ie可以打开,但把网页放到服务器上就不行了</p>
<p>解决：在客户端设置服务器网址为受信任的站点，在将受信任的站点的安全级别设置为最低。</p>
<img src ="http://www.blogjava.net/cyantide/aggbug/308446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-01-06 15:08 <a href="http://www.blogjava.net/cyantide/archive/2010/01/06/308446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查找被占用端口</title><link>http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Sat, 10 Jan 2009 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/250832.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/250832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/250832.html</trackback:ping><description><![CDATA[<span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">一、开始</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">-&gt;</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">运行</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">-&gt;cmd</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，输入</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">netstat -o -an</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">；</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><br />
</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">二、打开</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">windows</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">任务管理器，</span><span style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> </span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">查看</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">-&gt;</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">选择列</span><span style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> </span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">勾选</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">pid</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">；</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><br />
</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">三、找到那个进程占用了</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">80</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">端口的</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">pid</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，解决之。</span>
<img src ="http://www.blogjava.net/cyantide/aggbug/250832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-01-10 22:01 <a href="http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高网站速度的方法(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/12/02/243892.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 02 Dec 2008 04:15:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/12/02/243892.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/243892.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/12/02/243892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/243892.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/243892.html</trackback:ping><description><![CDATA[今天偶尔在网上看到了这篇文章，<a href="http://developer.yahoo.com/performance/rules.html">http://developer.yahoo.com/performance/rules.html</a>，是Yahoo 人写的《提高网站速度的最佳实践》共有 14 条，是英文的，本来想翻译一下，google 了一下，已经有翻译版了。贴出来分享一下！
<p style="color: red">原文来自：<a href="http://www.space007.com/post/129.html">http://www.space007.com/post/129.html</a><br />
</p>
<p>转帖来自: http://www.blogjava.net/Jack2007/archive/2008/05/30/204146.html<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相信互联网已经越来越成为人们生活中不可或缺的一部分。ajax，flex等等富客户端的应用使得人们越加&#8220;幸福&#8221;地体验着许多原先只能在C/S实现的功能。比如Google机会已经把最基本的office应用都搬到了互联网上。当然便利的同时毫无疑问的也使页面的速度越来越慢。自己是做前端开发的，在性能方面，根据yahoo的调查，后台只占5%，而前端高达95%之多，其中有88%的东西是可以优化的。</p>
<p><img title="" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.kuqin.com/upimg/allimg/080513/1745420.jpg" onload="ResizeImage(this,520)" />&nbsp;</p>
<p>以上是一张web2.0页面的生命周期图。工程师很形象地讲它分成了&#8220;怀孕，出生，毕业，结婚&#8221;四个阶段。如果在我们点击网页链接的时候能够意识到这个过程而不是简单的请求-响应的话，我们便可以挖掘出很多细节上可以提升性能的东西。今天听了淘宝小马哥的一个对yahoo开发团队对web性能研究的一个讲座，感觉收获很大，想在blog上做个分享。</p>
<p>相信很多人都听过优化网站性能的14条规则。更多的信息可见<a hideFocus style="hide-focus: true" href="http://developer.yahoo.com/performance/rules.html" target="_blank"><font color="#0000ff">developer.yahoo.com</font></a>
<table width="500" border="0">
    <tbody>
        <tr>
            <td>1. 尽可能的减少 HTTP 的请求数</td>
            <td align="right"><span style="color: #ff0000">[content]</span></td>
        </tr>
        <tr>
            <td>2. 使用 CDN（Content Delivery Network）</td>
            <td align="right"><span style="color: #3366ff">[server]</span></td>
        </tr>
        <tr>
            <td>3. 添加 Expires 头(或者 Cache-control )</td>
            <td align="right"><span style="color: #3366ff">[server]</span></td>
        </tr>
        <tr>
            <td>4. Gzip 组件</td>
            <td align="right"><span style="color: #3366ff">[server]</span></td>
        </tr>
        <tr>
            <td>5. 将 CSS 样式放在页面的上方</td>
            <td align="right"><span style="color: #339966">[css]</span></td>
        </tr>
        <tr>
            <td>6. 将脚本移动到底部（包括内联的）</td>
            <td align="right"><span style="color: #ff9900">[javascript]</span></td>
        </tr>
        <tr>
            <td>7. 避免使用 CSS 中的 Expressions</td>
            <td align="right"><span style="color: #339966">[css]</span></td>
        </tr>
        <tr>
            <td>8. 将 JavaScript 和 CSS 独立成外部文件</td>
            <td align="right"><span style="color: #ff9900">[javascript] </span><span style="color: #339966">[css]</span></td>
        </tr>
        <tr>
            <td>9. 减少 DNS 查询</td>
            <td align="right"><span style="color: #ff0000">[content]</span></td>
        </tr>
        <tr>
            <td>10. 压缩 JavaScript 和 CSS (包括内联的)</td>
            <td align="right"><span style="color: #ff9900">[javascript] </span><span style="color: #339966">[css]</span></td>
        </tr>
        <tr>
            <td>11. 避免重定向</td>
            <td align="right"><span style="color: #3366ff">[server]</span></td>
        </tr>
        <tr>
            <td>12. 移除重复的脚本</td>
            <td align="right"><span style="color: #ff9900">[javascript]</span></td>
        </tr>
        <tr>
            <td>13. 配置实体标签（ETags）</td>
            <td align="right"><span style="color: #339966">[css]</span></td>
        </tr>
        <tr>
            <td>14. 使 AJAX 缓存</td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;在firefox下有一个插件yslow，集成在firebug中，你可以用它很方便地来看看自己的网站在这几个方面的表现。</p>
<p><img title="" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.kuqin.com/upimg/allimg/080513/1745421.jpg" onload="ResizeImage(this,520)" /></p>
<p>这是对用yslow对我的网站<a hideFocus style="hide-focus: true" href="http://www.space007.com/" target="_blank">西风坊</a>测评的结果，很遗憾，只有51分。呵呵。中国各大网站的分值都不高，刚测了一下，新浪和网易都是31分。然后<a hideFocus style="hide-focus: true" href="http://www.yahoo.com/" target="_blank">yahoo</a>（美国）的分值确实97分！可见yahoo在这方面作出的努力。从他们总结的这14条规则，已经现在又新增加的20个点来看，有很多细节我们真得是怎么都不会去想，有些做法甚至是有些&#8220;变态&#8221;了。</p>
<p><strong><span style="color: #ff0000">第一条、尽可能的减少 HTTP 的请求数</span></strong> （<a hideFocus style="hide-focus: true" href="http://developer.yahoo.com/performance/rules.html#num_http">Make Fewer HTTP Requests</a> ）</p>
<p>http请求是要开销的，想办法减少请求数自然可以提高网页速度。常用的方法，合并css，js（将一个页面中的css和js文件分别合并）以及Image maps和css sprites等。当然或许将css，js文件拆分多个是因为css结构，共用等方面的考虑。阿里巴巴中文站当时的做法是开发时依然分开开发，然后在后台对js，css进行合并，这样对于浏览器来说依然是一个请求，但是开发时仍然能还原成多个，方便管理和重复引用。yahoo甚至建议将首页的css和js直接写在页面文件里面，而不是外部引用。因为首页的访问量太大了，这么做也可以减少两个请求数。而事实上国内的很多门户都是这么做的。</p>
<p>而css sprites是指只用将页面上的背景图合并成一张，然后通过css的background-position属性定义不过的值来取他的背景。淘宝和阿里巴巴中文站目前都是这样做的。有兴趣的可以看下淘宝和<a hideFocus style="hide-focus: true" href="http://img.china.alibaba.com/images/cn/home/071028/icon_sum.gif" target="_blank">阿里巴巴的背景图</a>。</p>
<p><a hideFocus style="hide-focus: true" href="http://www.csssprites.com/">http://www.csssprites.com/</a>&nbsp;这是个工具网站，它可以自动将你上传的图片合并并给出对应的background-position坐标。并将结果以png和gif的格式输出。</p>
<p><span style="color: #ff0000"><strong>第二条、使用CDN（内容分发网络）: </strong></span>Use a Content Delivery Network</p>
<p>说实话，对于CDN这一块自己并不是很了解，简单地讲，通过在现有的Internet中增加一层新的网络架构，将网站的内容发布到最接近用户的cache服务器内，通过DNS负载均衡的技术，判断用户来源就近访问cache服务器取得所需的内容，杭州的用户访问近杭州服务器上的内容，北京的访问近北京服务器上的内容。这样可以有效减少数据在网络上传输的时间，提高速度。更详细地内容大家可以参考百度百科上对于<a hideFocus style="hide-focus: true" href="http://baike.baidu.com/view/21895.htm" target="_blank">CDN</a>的解释。<span lang="EN-US">Yahoo!</span><span style="font-family: 宋体">把静态内容分布到</span><span lang="EN-US">CDN</span><span style="font-family: 宋体">减少了用户影响时间</span><span lang="EN-US">20%</span><span style="font-family: 宋体">或更多。</span></p>
<p>CDN技术示意图：</p>
<p><img title="" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.kuqin.com/upimg/allimg/080513/1745422.jpg" onload="ResizeImage(this,520)" /></p>
<p>CDN组网示意图：</p>
<p>&nbsp;<img title="" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.kuqin.com/upimg/allimg/080513/1745423.jpg" onload="ResizeImage(this,520)" /></p>
<p><span style="color: #ff0000"><strong>第三条、 添加Expire/Cache-Control 头</strong></span>：Add an Expires Header</p>
<p>现在越来越多的图片，脚本，css，flash被嵌入到页面中，当我们访问他们的时候势必会做许多次的http请求。其实我们可以通过设置<span lang="EN-US"><span class="hilite1">Expires</span> <span class="hilite2">header来缓存这些文件。Expire其实就是通过header报文来指定特定类型的文件在览器中的缓存时间。大多数的图片，flash在发布后都是不需要经常修改的，做了缓存以后这样浏览器以后就不需要再从服务器下载这些文件而是而直接从缓存中读取，这样再次访问页面的速度会大大加快。</span></span>一个典型的HTTP 1.1协议返回的头信息：<br />
HTTP/1.1 200 OK<br />
Date: Fri, 30 Oct 1998 13:19:41 GMT<br />
Server: Apache/1.3.3 (Unix)<br />
Cache-Control: max-age=3600, must-revalidate<br />
Expires: Fri, 30 Oct 1998 14:19:41 GMT<br />
Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT<br />
ETag: "3e86-410-3596fbbc"<br />
Content-Length: 1040<br />
Content-Type: text/html</p>
<p>其中通过服务器端脚本设置Cache-Control和Expires可以完成。</p>
<p>如，在php中设置30天后过期：<br />
</p>
<pre mergenum="0"><code class="php"><font face="NSimsun">&nbsp;&lt;!--pHeader(<span class="string2"><font color="#ff00ff">"Cache-Control:&nbsp;must-revalidate"</font></span>);<span class="keyword"><strong><font color="#000080">$</font></strong></span><span class="variable"><font color="#4040c2">offset</font></span>&nbsp;=&nbsp;<span class="number"><font color="#ff0000">60</font></span>&nbsp;*&nbsp;<span class="number"><font color="#ff0000">60</font></span>&nbsp;*&nbsp;<span class="number"><font color="#ff0000">24</font></span>&nbsp;*&nbsp;<span class="number"><font color="#ff0000">30</font></span>;<span class="keyword"><strong><font color="#000080">$</font></strong></span><span class="variable"><font color="#4040c2">ExpStr</font></span>&nbsp;=&nbsp;<span class="string2"><font color="#ff00ff">"Expires:&nbsp;"</font></span>&nbsp;.&nbsp;<span class="func"><font color="#e17100">gmdate</font></span>(<span class="string2"><font color="#ff00ff">"D,&nbsp;d&nbsp;M&nbsp;Y&nbsp;H:i:s"</font></span>,&nbsp;<span class="func"><font color="#e17100">time</font></span>()&nbsp;+&nbsp;<span class="keyword"><strong><font color="#000080">$</font></strong></span><span class="variable"><font color="#4040c2">offset</font></span>)&nbsp;.&nbsp;<span class="string2"><font color="#ff00ff">"&nbsp;GMT"</font></span>;Header(<span class="keyword"><strong><font color="#000080">$</font></strong></span><span class="variable"><font color="#4040c2">ExpStr</font></span>);--&gt;</font></code></pre>
<p><textarea style="display: none"> &lt;!--pHeader("Cache-Control: must-revalidate");$offset = 60 * 60 * 24 * 30;$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";Header($ExpStr);--&gt;</textarea> </p>
<p>&nbsp;</p>
<p>在asp中设置绝对时间过期：</p>
<p><span style="font-style: italic">&lt;% Response.ExpiresAbsolute=#May 31,2010 13:30:15 GMT# %&gt;</span><br />
&nbsp;</p>
<p>也可以通过配置服务器本身完成，这些偶就不是很清楚了，呵呵。想了解跟多的朋友可以参考<a hideFocus style="hide-focus: true" href="http://www.web-caching.com/">http://www.web-caching.com/</a>&nbsp;</p>
<p>据我了解，目前阿里巴巴中文站的Expires过期时间是30天。不过期间也有过问题，特别是对于脚本过期时间的设置还是应该仔细考虑下，不然相应的脚本功能更新后客户端可能要过很长一段时间才能&#8220;感知&#8221;到这样的变化。以前做[<a hideFocus style="hide-focus: true" href="http://www.kuqin.com/webpagedesign/20080513/8444.html" target="_blank">suggest项目</a>] 的时候就遇到过这个问题。所以，哪些应该缓存，哪些不该缓存还是应该仔细斟酌一番。</p>
<p><strong><span style="color: #ff0000">第四条、启用Gzip压缩：</span></strong>Gzip Components</p>
<p><font size="2">Gzip的思想就是把文件先在服务器端进行压缩，然后再传输。这样可以显著减少文件传输的大小。传输完毕后浏览器会重新对压缩过的内容进行解压缩，并执行。目前的浏览器都能&#8220;良好&#8221;地支持 gzip。不仅浏览器可以识别，而且各大&#8220;爬虫&#8221;也同样可以识别，各位seoer可以放下心了。而且gzip的压缩比例非常大，一般压缩率为85%，就是说服务器端100K的页面可以压缩到25K左右再发送到客户端。具体的Gzip压缩原理大家可以参考csdn上的《</font><a hideFocus style="hide-focus: true" href="http://www.kuqin.com/algorithm/20080513/8445.html" target="_blank"><font size="2">gzip压缩算法</font></a><font size="2">》</font>&nbsp;这篇文章。雅虎特别强调，&nbsp;<strong>所有的文本内容都应该被gzip压缩: html (php), js, css, xml, txt&#8230; </strong>这一点我们网站做得不错，是一个A。以前我们的首页也并不是A，因为首页上还有很多广告代码投放的js，这些广告代码拥有者的网站的js没有经过gzip压缩，也会拖累我们网站。</p>
<p>以上三点大多属于服务器端的内容，本人也是粗浅地了解而已。说得不对的地方有待各位指正。&nbsp;</p>
<p><span style="color: #ff0000"><strong>第五条、将css放在页面最上面 </strong></span><span style="color: #000000"><span>（ Put Stylesheets at the Top）</span></span></p>
<p><span><span style="color: #000000">将css放在页面最上面，这是为什么？因为ie，firefox等浏览器在css全部传输完全之前不会去渲染任何的东西。理由诚如小马哥说得那样很简单。css，全称Cascading Style Sheets&nbsp;(层叠样式表单)。层叠即意味这后面的css可以覆盖前面的css，级别高的css可以覆盖级别低的css。在[<a hideFocus style="hide-focus: true" href="http://www.kuqin.com/webpagedesign/20080513/8443.html" target="_blank">css之！important</a>] 这篇文章的最下面曾简单地提到过这层级关系，这里我们只需要知道css可以被覆盖的。既然前面的可以被覆盖，浏览器在他完全加载完毕之后再去渲染无疑也是合情合理的<font face="宋体">很多浏览器下，如</font><span lang="EN-US">IE</span><span style="font-family: 宋体">，把样式表放在</span><span lang="EN-US">页面</span><span style="font-family: 宋体">的底部的问题在于它禁止了网页内容的顺序显示。浏览器阻止显示以免重画页面元素，那用户只能看到空白页了。</span><span lang="EN-US">Firefox</span><span style="font-family: 宋体">不会阻止显示，但这意味着当样式表下载后，有些页面元素可能需要重画，这导致闪烁问题。所以我们应该尽快让css加载完毕</span></span></span></p>
<p><span style="color: #000000"><span>顺着这层意思，如果我们再细究的话，其实还有可以优化的地方。比如本站上面包含的两个css文件，&lt;<span class="start-tag">link</span><span class="attribute-name"> rel</span>=<span class="attribute-value">"stylesheet" </span><span class="attribute-name">rev</span>=<span class="attribute-value">"stylesheet" </span><span class="attribute-name">href</span>=<span class="attribute-value">"http://www.space007.com/themes/google/style/google.css" </span><span class="attribute-name">type</span>=<span class="attribute-value">"text/css" </span><span class="attribute-name">media</span>=<span class="attribute-value">"screen" </span><span class="error"><span class="attribute-name">/</span></span>&gt; 和&lt;<span class="start-tag">link</span><span class="attribute-name"> rel</span>=<span class="attribute-value">"stylesheet" </span><span class="attribute-name">rev</span>=<span class="attribute-value">"stylesheet" </span><span class="attribute-name">href</span>=<span class="attribute-value">"http://www.space007.com/css/print.css" </span><span class="attribute-name">type</span>=<span class="attribute-value">"text/css" </span><span class="attribute-name">media</span>=<span class="attribute-value">"print" </span><span class="error"><span class="attribute-name">/</span></span>&gt;。从media就可以看出第一个css是针对浏览器的，第二个css文件是针对打印样式的。从用户的行为习惯上来将，要打印页面的动作一定是发生在页面页面显示出来之后的。所以比较好的方法应该是在页面加载完毕之后再动态地为这张页面加上针对打印设备的css，这样又可以提高一点速度。（哈哈）</span></span></p>
<p>&nbsp;<span style="color: #000000"><span><span style="color: #ff0000"><strong>第六条、将script放在页面最下面 </strong><span style="color: #000000">（Put Scripts at the Bottom ）</span></span></span></span></p>
<p><span style="color: #ff0000"><span><span style="color: #000000">将脚本放在页面最下面的目的有那么两点：</span></span></span>&nbsp;1、因为防止script脚本的执行阻塞页面的下载。在页面loading的过程中，当浏览器读到js执行语句的时候一定会把它全部解释完毕后在会接下来读下面的内容。不信你可以写一个js死循环看看页面下面的东西还会不会出来。（setTimeout 和 setInterval的执行有点类似于多线程，在相应的响应时间之前也会继续下面的内容渲染。）浏览器这么做的逻辑是因为js随时可能执行&nbsp;location.href或是其他可能完全中断此页面过程的函数，即如此，当然得等他执行完毕之后再加载咯。所以放在页面最后，可以有效减少页面可视元素的加载时间。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、<span style="font-family: 宋体">脚本引起的第二个问题是它阻塞并行下载数量。<span lang="EN-US">HTTP/1.1<span lang="EN-US" style="font-family: 宋体"><span lang="EN-US">规范</span></span></span><span style="font-family: 宋体">建议浏览器每个主机的并行下载数不超过</span><span lang="EN-US">2</span><span style="font-family: 宋体">个（IE只能为2个，其他浏览器如ff等都是默认设置为2个，不过新出的ie8可以达6个）。因此如果您把图像文件分布到多台机器的话，您可以达到超过</span><span lang="EN-US">2</span><span style="font-family: 宋体">个的并行下载。但是当脚本文件下载时，浏览器不会启动其他的并行下载。</span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">当然对各个网站来说，把脚本都放到页面底部加载的可行性还是值得商榷的。就比如阿里巴巴中文站的页面。很多地方有内联的js，页面的显示严重依赖于此，我承认这和无侵入脚本的理念相差甚远，但是很多&#8220;历史遗留问题&#8221;却不是那么容易解决的。</span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial">&nbsp;<span style="color: #000000"><span><span style="color: #ff0000"><strong>第七条、<strong>避免在</strong><strong>CSS</strong><strong>中使用</strong><strong>Expressions </strong></strong><span style="color: #000000">（Avoid CSS Expressions ）</span></span></span></span></font></span></span></p>
<p>css表达是的执行次数是远远多于我们想象的，往往会严重地影响性能。而且，它只能在IE中执行。所以因尽量地避免它。这一条以前倒没想过，个人用这个就是在对ie使用max-width和min-width属性的时候。大家知道IE是不支持max-width和min-width属性的。有时候的页面（特别是自适应大小的页面）为了能在分辨率小到一定程度后还能显示要用到这个功能，怎么办。当时我的做法就是利用expressions:&nbsp;</p>
<p>&nbsp;</p>
<pre mergenum="3"><code class="css">&nbsp;<span class="attrib"><strong><font color="#000080">min-width</font></strong></span>:<span class="number"><font color="#ff0000">952px</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">width</font></strong></span>:expression((document.documentElement.clientWidth&nbsp;&amp;lt;<span class="number"><font color="#ff0000">952</font></span>&nbsp;)&nbsp;?&nbsp;&amp;quot;<span class="number"><font color="#ff0000">952</font></span>&amp;quot;:&amp;quot;<span class="value"><font color="#0000ff">auto</font></span>&amp;quot;)&nbsp;</code></pre>
<p><textarea style="display: none"> min-width:952px; width:expression((document.documentElement.clientWidth &lt;952 ) ? "952":"auto") </textarea> </p>
<p>&nbsp;</p>
<p>不过从今天应该寻找新的办法了。目前的解决办法是通过两层的嵌套：</p>
<p>css文件：</p>
<p>&nbsp;</p>
<pre mergenum="4"><code class="css">&nbsp;<span class="color"><font color="#008000">#main</font></span>_box{<span class="attrib"><strong><font color="#000080">width</font></strong></span>:<span class="number"><font color="#ff0000">70%</font></span>;<span class="attrib"><strong><font color="#000080">height</font></strong></span>:<span class="number"><font color="#ff0000">100px</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">background</font></strong></span>:<span class="color"><font color="#008000">#ffffcc</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">min-width</font></strong></span>:<span class="number"><font color="#ff0000">600px</font></span>;<span class="attrib"><strong><font color="#000080">margin</font></strong></span>:<span class="value"><font color="#0000ff">auto</font></span>;&nbsp;}&nbsp;#p_main_box{&nbsp;<span class="attrib"><strong><font color="#000080">border-left</font></strong></span>:<span class="number"><font color="#ff0000">600px</font></span>&nbsp;<span class="value"><font color="#0000ff">solid</font></span>&nbsp;<span class="color"><font color="#008000">#ffffcc</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">height</font></strong></span>:<span class="number"><font color="#ff0000">1px</font></span>;&nbsp;}&nbsp;#m_main_box{&nbsp;<span class="attrib"><strong><font color="#000080">margin-left</font></strong></span>:-<span class="number"><font color="#ff0000">600px</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">position</font></strong></span>:<span class="value"><font color="#0000ff">relative</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">height</font></strong></span>:<span class="number"><font color="#ff0000">1px</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">text-align</font></strong></span>:<span class="value"><font color="#0000ff">center</font></span>;&nbsp;}&nbsp;</code></pre>
<p><textarea style="display: none"> #main_box{width:70%;height:100px; background:#ffffcc; min-width:600px;margin:auto; } #p_main_box{ border-left:600px solid #ffffcc; height:1px; } #m_main_box{ margin-left:-600px; position:relative; height:1px; text-align:center; } </textarea> </p>
<p>&nbsp;</p>
<p>html文件：</p>
<p>&nbsp;</p>
<pre mergenum="2"><code class="html"><strong><font color="#000080"><span class="tag">&lt;/p&gt;</span><span class="tag">&lt;div</span></font></strong><span class="aname"><font color="#800080">&nbsp;id</font></span>=<span class="avalue"><font color="#ff00ff">"main_box"</font></span><strong><font color="#000080"><span class="tag">&gt;</span><span class="tag">&lt;div</span></font></strong><span class="aname"><font color="#800080">&nbsp;id</font></span>=<span class="avalue"><font color="#ff00ff">"p_main_box"</font></span><strong><font color="#000080"><span class="tag">&gt;</span><span class="tag">&lt;div</span></font></strong><span class="aname"><font color="#800080">&nbsp;id</font></span>=<span class="avalue"><font color="#ff00ff">"m_main_box"</font></span><span class="tag"><strong><font color="#000080">&gt;</font></strong></span>最小宽度600px；<font color="#000080"><span class="tag">&lt;/div&gt;</span><span class="tag">&lt;/div&gt;</span><span class="tag">&lt;/div&gt;</span><span class="tag">&lt;p</span></font><span class="tag">&gt;</span></code>
<p><input id="cloudream-runcode0" type="button" value="运行代码" /></p>
</pre>
<p><textarea id="cloudream-precode0" style="display: none" mergenum="1">&lt;/p&gt;&lt;div id="main_box"&gt;&lt;div id="p_main_box"&gt;&lt;div id="m_main_box"&gt;最小宽度600px；&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;</textarea> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>不过这样就多了两层无意义的嵌套，肯定不好。还需要一个更好的办法。<span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial">&nbsp;</font></span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第八条、<strong>把javascript和css都放到外部文件中</strong><strong> </strong></strong><span style="color: #000000">（Make JavaScript and CSS External ）</span></span></span></span></font></span></span></p>
<p>这点我想还是很容易理解的。不仅从性能优化上会这么做，用代码易于维护的角度看也应该这么做。把css和js写在页面内容可以减少2次请求，但也增大了页面的大小。如果已经对css和js做了缓存，那也就没有2次多余的http请求了。当然，我在前面中也说过，有些特殊的页面开发人员还是会选择内联的css和js文件。</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第九条、减少DNS查询 </strong><span style="color: #000000">(Reduce DNS Lookups) </span></span></span></span></font></span></span></p>
<p><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体">在Internet上域名与IP地址之间是一一对应的，域名（kuqin.com）很好记，但计算机不认识，计算机之间的&#8220;相认&#8221;还要转成ip地址。在网络上每台计算机都对应有一个独立的ip地址。在域名和ip地址之间的转换工作称为域名解析，也称DNS查询。一次DNS的解析过程会消耗20-120毫秒的时间,在dns查询结束之前，浏览器不会下载该域名下的任何东西。所以减少dns查询的时间可以加快页面的加载速度。yahoo的建议一个页面所包含的域名数尽量控制在2-4个。这就需要对页面整体有一个很好的规划。目前我们这点做的不好，很多打点的广告投放系统拖累了我们。</span></span></font></span></span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第十条、</strong><strong><span style="color: #ff0000">压缩 JavaScript 和 CSS&nbsp;</span></strong><strong> </strong><span style="color: #000000">(Minify JavaScript ) </span></span></span></span></font></span></span></span></span></span></font></span></span></p>
<p>压缩js和css的左右很显然，减少页面字节数。容量小页面加载速度自然也就快。而且压缩除了减少体积以外还可以起到一定的保护左右。这点我们做得不错。常用的压缩工具有JsMin、YUI compressor等。另外像<a hideFocus style="hide-focus: true" href="http://dean.edwards.name/packer/">http://dean.edwards.name/packer/</a>还给我们提供了一个非常方便的在线压缩工具。你可以在jQuery的网页看到压缩过的js文件和没有压缩过的js文件的容量差别：</p>
<p><img title="" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.kuqin.com/upimg/allimg/080513/1745424.jpg" onload="ResizeImage(this,520)" /></p>
<p>当然，压缩带来的一个弊端就是代码的可读性没了。相信很多做前端的朋友都遇到过这个问题：看Google的效果很酷，可是去看他的源代码却是一大堆挤在一起的字符，连函数名都是替换过的，汗死！自己的代码也这样岂不是对维护非常不方便。所有阿里巴巴中文站目前采用的做法是在js和css发布的时候在服务器端进行压缩。这样在我们很方便地维护自己的代码。</p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第十一条、</strong><strong><span style="color: #ff0000">避免重定向</span></strong><strong> </strong><span style="color: #000000">(Avoid Redirects ) </span></span></span></span></font></span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000">不久前在ieblog上看到过《<a hideFocus style="hide-focus: true" href="http://blogs.msdn.com/ie/archive/2005/04/11/407189.aspx" target="_blank">Internet Explorer and Connection Limits</a>》这篇文章，比如 当你输入<a href="http://www.kuqin.com/" target="_blank">http://www.ithao123.com</a> 的时候服务器会自动产生一个301服务器转向 <a href="http://www.kuqin.com/">http://www.kuqin.com/</a> ，你看浏览器的地址栏就能看出来。这种重定向自然也是需要消耗时间的。当然这只是一个例子，发生重定向的原因还有很多，但是不变的是每增加一次重定向就会增加一次web请求，所以因该尽量减少。</span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></font></span></span></span></span></p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第十二条、</strong><strong><span style="color: #ff0000">移除重复的脚本</span></strong><strong> </strong><span style="color: #000000">(Remove Duplicate Scripts ) </span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></font></span></span></span></span></p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000">这点我想不说也知道，不仅是从性能上考虑，代码规范上看也是这样。但是不得不承认，很多时候我们会因为图一时之快而加上一些或许是重复的代码。或许一个统一的css框架和js框架可以比较好的解决我们的问题。小猪的观点很对，不仅是要做到不重复，更是要做到可重用。</span></span></span></span></font></span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第十三条、</strong><strong><span style="color: #ff0000">配置</span><span style="color: #ff0000">实体标签（ETags）</span></strong><strong> </strong><span style="color: #000000">(Configure ETags ) </span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></p>
<p>这点我也不懂，呵呵。在inforQ上找到一篇解释得比较详细的说明《<a hideFocus style="hide-focus: true" href="http://www.kuqin.com/web/20080513/8442.html" target="_blank">使用ETags减少Web应用带宽和负载</a>》，有兴趣的同学可以去看看。</p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第十四条、</strong><strong><span style="color: #ff0000">使 AJAX 缓存 </span></strong><span style="color: #000000">(Make Ajax Cacheable ) </span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></p>
<p>ajax还要去缓存？做ajax请求的时候往往还要增加一个时间戳去避免他缓存。It's important to remember that "asynchronous" does not imply "instantaneous".（记住&#8220;异步&#8221;不是&#8220;瞬间&#8221;这一点很重要）。记住，即使AJAX是动态产生的而且只对一个用户起作用，他们依然可以被缓存。</p>
<p style="color: red"><a href="http://www.space007.com/post/129.html"></a>&nbsp;</p>
<br />
<br />
<p><span style="color: #999999; font-family: 宋体"><span style="font-size: 8pt"><span style="color: #cc99ff; font-family: 宋体"><span style="color: #999999; font-family: 宋体"><span style="font-size: 8pt"><span style="color: #cc99ff; font-family: 宋体"><span style="color: #ff0000"><span style="font-family: 宋体">
<hr style="color: red" />
<br />
本博客为学习交流用，凡未注明引用的均为本人作品，转载请注明出处，如有版权问题请及时通知。由于博客时间仓促，错误之处敬请谅解，有任何意见可给我留言，愿共同学习进步。</span></span></span></span></span></span></span></span> 
<img src ="http://www.blogjava.net/cyantide/aggbug/243892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-12-02 12:15 <a href="http://www.blogjava.net/cyantide/archive/2008/12/02/243892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet2.4 和servlet2.5中配置taglib的区别</title><link>http://www.blogjava.net/cyantide/archive/2008/08/15/222294.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Fri, 15 Aug 2008 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/08/15/222294.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/222294.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/08/15/222294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/222294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/222294.html</trackback:ping><description><![CDATA[servlet2.4 和servlet2.5中配置taglib的区别<br />
<br />
2.4写法:<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"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">jsp-config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib-url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib-url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib-location</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/WEB-INF/xxx.tld</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib-location</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">jsp-config</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
2.5写法<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib-url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib-url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib-location</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/WEB-INF/xxx.tld</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib-location</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
 <img src ="http://www.blogjava.net/cyantide/aggbug/222294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-08-15 16:32 <a href="http://www.blogjava.net/cyantide/archive/2008/08/15/222294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>