<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[李飞虎 java,j2ee,ajax,oracle,sqlserver,ssh,soa]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[李飞虎 java,j2ee,ajax,oracle,sqlserver,ssh,soa]]></description>
<link>http://hi.baidu.com/annleecn</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[MySQL语法 合并查询结果 UNION]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/55508d19b25a01be4aedbc12.html]]></link>
        <description><![CDATA[
		
		<p>union是一个不错的合并查询结果的关键字，能把同一个表或者不同的表多个select查询结果合并<br>
<br>
下面演示同一个数据表把select命令的结果合并在一起，当然不同数据表查询也可以合并，但是需要保证各次查询结果的数据列表个数和数据类型上都是一样的。否则mysql会把最终的结果全部转换为第一条select 命令的数据类型<br>
<strong>select</strong> * <strong>from</strong> authors <strong>where</strong> authname <strong>like</strong> 'b%'<br>
<strong>union</strong><br>
<strong>select</strong> * <strong>from</strong> authors <strong>where</strong> authname <strong>like</strong> 'a%'<br>
<br>
一般来说，重复的记录将从最终结果里被自动消除。mysql只有在使用union all 的时候才会把最终结果里重复记录保留下来。<br>
<br>
还可以把个别的select命令用圆括号，这样，可以对每次查询以及最终结果做出limit和order by 设置。<br>
(<strong>select</strong> * <strong>from</strong> tbl1 <strong>order by</strong> colA <strong>limit</strong> 10)<br>
<strong>union<br>
</strong>(<strong>select</strong> * <strong>from</strong> tbl2 <strong>order by</strong> colA <strong>limit</strong> 10)<br>
<strong>order by</strong> coltimestamp limit 5</p>
<p>union关键字在SQLSERVER中同样可以使用</p> <a href="http://hi.baidu.com/annleecn/blog/item/55508d19b25a01be4aedbc12.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Mysql">Mysql</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/55508d19b25a01be4aedbc12.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-30  15:09</pubDate>
        <category><![CDATA[Mysql]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/55508d19b25a01be4aedbc12.html</guid>
</item>

<item>
        <title><![CDATA[Java调用Win32 API控制鼠标活动范围]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/79632335edf3ce315bb5f5da.html]]></link>
        <description><![CDATA[
		
		<p>今天学习Java看到Jni部分, 终于看到Java如何调用其他语言写的函数(我期待已久了…. :P)<br>
下面把过程写下来,免得以后忘了又要是处找资料.<br>
 <br>
首先是Java写的测试类<br>
public class TestJni<br>
{<br>
 <br>
&nbsp;&nbsp;  native void SetMouseRangle(int left, int right, int top, int bottom);<br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  static{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  System.loadLibrary(&quot;TestJni&quot;);<br>
&nbsp;&nbsp;  }<br>
 <br>
&nbsp;&nbsp;  public static void main(String []args){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TestJni test = new TestJni();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test.SetMouseRangle(0,0,0,0);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test.SetMouseRangle(100,100,200,200);<br>
&nbsp;&nbsp;  }<br>
 <br>
}<br>
 <br>
SetMouseRangle用它来代替同名的本地函数,它的前面必须要有native关键字,而且它不能有函数体.这个函数是为了指定一个矩形的范围,把鼠标限定在这个矩形里面5秒钟.<br>
 <br>
&nbsp;&nbsp;  static{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  System.loadLibrary(&quot;TestJni&quot;);<br>
&nbsp;&nbsp;  }<br>
是为了加载TestJni.dll的(在其他平台上动态库的后缀名不为dll,这里由系统自己判断后缀名是dll还是os等),本地的SetMouseRangle就放在这个动态库中.<br>
 <br>
然后用javac生成class文件.用,javah生成c语言的头文件.<br>
 <br>
然后打开C++编译器,新建一个win32动态链接库项目.把生成的TestJni.h头文件包含进去就行了.<br>
 <br>
然后 #include&quot;TestJni.h&quot; <br>
创建一个导出函数<br>
 <br>
JNIEXPORT void JNICALL Java_TestJni_SetMouseRangle<br>
 (JNIEnv *, jobject, jint left, jint right, jint top, jint bottom)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  RECT rect;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  rect.left = left;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  rect.right = right;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  rect.top = top;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  rect.bottom = bottom;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ClipCursor(&amp;rect);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Sleep(5000);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ClipCursor(0);<br>
}<br>
ClipCursor为一个Win32 API函数,作用是把鼠标限定在传入的矩形范围内.最后要调用ClipCursor(0);<br>
否则鼠标将一直被限定在那个矩形范围内.<br>
 <br>
然后编译,在这里处了点问题,提示找不到Jni.h,想到一个笨办法,把Jni.h的目录附加进来.我的<br>
Jni.h所在目录为C:\Program Files\Java\jdk1.6.0\include,还要把一个目录附加进来,因为还会用到C:\Program Files\Java\jdk1.6.0\include\win32这个目录中的头文件<br>
 <br>
然后编译,将生成的dll拷贝到class所在目录,如果名字不为TestJni.dll就把它改为这个名字,就可以运行了.<br>
 </p>
<p> </p> <a href="http://hi.baidu.com/annleecn/blog/item/79632335edf3ce315bb5f5da.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/java%BB%F9%B4%A1">java基础</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/79632335edf3ce315bb5f5da.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-25  16:46</pubDate>
        <category><![CDATA[java基础]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/79632335edf3ce315bb5f5da.html</guid>
</item>

<item>
        <title><![CDATA[应用架构设计“防火”经验分享（转）]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/5b4a788c251ff418b31bbada.html]]></link>
        <description><![CDATA[
		
		<div class="blog_content">刚从阿软到淘宝不久，现在主要负责TOP平台的技术框架设计，同时要肩负&ldquo;救火&rdquo;和&ldquo;防火&rdquo;的工作，也需要培养团队的同学能够有&ldquo;防火&rdquo;意识，减少&ldquo;救火&rdquo;次数，因此今天下午花了一点时间，也没于写任何的PPT，就直接将自己想的起来的一些自己认为应用架构设计&ldquo;防火&rdquo;知识做了一下事例分享，这里也想记录下来给更多的同学分享一下，当然很多都是老生常谈的常识，但是有时候不经意就会忘记一些血的教训。 <br>
<br>
<br>
<br>
资源是有限的 <br>
<br>
着火点： <br>
<br>
系统设计的时候总是估摸不到会有大数据量从远端传输过来（例如处理Http请求时，对于大附件内容的处理，全部装载到内存，结果资源耗尽。从搜索引擎或者DB或者缓存里面拉数据，没有分页，结果内存被吃尽。Socket无限建立连接，结果linux的文件句柄被耗尽。） <br>
<br>
防火点： <br>
<br>
对业务场景中资源的分配与申请需要做到上限控制，以及达到上限以后的逻辑处理（排队，丢弃，告警）。可以采取一些滑动窗口设计来将不需要过多处理的内容分段直接送入下一个处理管道中。 <br>
<br>
<br>
<br>
依赖是未知的 <br>
<br>
着火点： <br>
<br>
事务中嵌入对于第三方系统的请求（例如在数据库操作时去发送邮件或者缓存获取内容，结果连接池资源被Hold，导致系统不可用）。默认依赖系统会给出结果，如果出现异常就反复重试，结果对方被压垮，自己也牺牲。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  对于第三方系统的依赖能够异步的就采用异步方式，能够从主流程中剥离的就剥离。同时设计好容错的机制，采用本地时效性缓存减少对对方的压力和依赖。最重要的就是注意系统间的死锁，申请了一套资源处理业务逻辑，结果由于远端系统的不可用，导致本地资源的无法释放，最后击垮自己系统。 <br>
<br>
<br>
<br>
线程安全与性能 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  对于线程不安全的对象处理一定要小心，否则业务出现异常的地方其实已经离设计出现问题的地方十万八千里，问题时常成为灵异问题，解决只有靠经验。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  首先对于自己设计的类和方法需要注释是否是线程安全的。同时明确类的使用场景，对线程安全及高性能作判断，因为采用线程安全的对象一定会有性能损耗。最近给同学写的一个Http消息的Lazy获取参数，就是线程不安全的类，但是这个类只会保存在ThreadLocal中，因此不存在问题。很直观的一点判断是否线程安全，就看看你设计的类里面的成员变量在多线程操作时候是否会有并发问题，例如一个普通的Map，多个线程操作就会导致结果的不可估量性。 <br>
<br>
<br>
<br>
资源释放 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  正常逻辑都会将IO流关闭，Socket关闭，但是异常抛出时候，没有走到资源释放的流程中，产生了资源泄露问题。另外，资源中可能会有内嵌资源，当内部资源被外部的对象引用，则释放将不成功，内部资源依然会泄露。一些需要显式回收的资源（例如ThreadLocal），如果不回收，那么下次线程被操作系统重用，则会出现莫名其妙的问题（Java的线程创建和使用依赖于操作系统的实现）。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Finally的处理。需要释放的资源要做深度检查。需要显式回收的资源要确保使用完毕以后被回收（异常情况也需要考虑）。 <br>
<br>
<br>
<br>
创建与复用 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在以前设计Cache客户端的时候，有同学给我建议说我对于字节数组利用可以采取复用的方式，这样可以减少对象的申请。但是做了一下测试，这样的重复利用其实效果不像想象的那么好，甚至还不如直接创建。 <br>
<br>
防火点： <br>
<br>
Java的垃圾收集器已经在性能上有了很大的提高，同时对于对象的复用需要考虑对象复用前的初始化或者是内容重置，这些得成本及复杂度可能远远要高于复用带来的优势，因此需要根据具体的业务场景选择复用和创建。当然对于稀缺资源采用池的方式是最好的。 <br>
<br>
<br>
<br>
字符串处理，日志级别的选择 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  这两个是小问题，但是会带来大麻烦。首先字符串的累加是老生常谈的问题，但是很多新手不以为然，当你是一个高速运转的系统时，你就会发现1ms的延时在上千万次调用下回被无限放大，10byte的申请，在上千万次的请求下会带来GC多次的操作（带来的短暂处理停滞直接影响系统的可用性）。日志级别的随意性会导致线上环境日志迅速膨胀，出错难以查找，影响系统的效率。（log4j优化的再好也是要写文件的，虽然是异步刷页） <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  谨慎处理字符串拼接，选择线程安全或者不安全的两个StringBuilder和StringBuffer。日志尽量区分清楚，debug和Info，前者纯粹调试，可以有海量信息，Info一般用于系统或者模块的状况报告。Warn通常不建议使用了。Error就把你需要的关键信息都打出来。附带这里说一下对于日期对象的处理，在传输和保存的过程中，建议都还是采用long型，可以很好的提高性能及满足国际化的需求。 <br>
<br>
<br>
<br>
原子操作与并发控制 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  对于本地的对象操作通常情况下通过锁机制保证并发的一致性，当在设计一个对于资源访问控制的策略时，例如集群应用处理某人每天发送短信1000条，这时候计数器保存在远端的集中式缓存中，采用get和put方式就会有并发问题，因为在应用获得到999这个计数器值的时候，也许正有10000个请求也获得了这个值，这样原有的控制就失效了。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  其实就是一个原子操作的支持，本地数据可以通过锁来达到原子操作，远程依赖就需要对方系统提供原子操作接口来实现高并发下的业务处理，例如Memcached Cache提供的incr 和decr。结合黑名单策略，计数器可以发挥很多用途，包括及时监控告警等。 <br>
<br>
<br>
<br>
接口实现与松耦合 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点: <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  没有接口提供，团队间合作困难，无法Mock，相互之间进度影响很大。同时业务实现的修改直接影响业务调用方，使得双方耦合性很强，系统不稳定性被放大。 <br>
<br>
防火点： <br>
<br>
对外提供的服务，或者模块间交互的服务都需要接口化。框架性代码需要在模块载入时考虑是否需要接口化定义，以便在不同环境可以切换不同实现提供对特殊场景的支持，同时也可以将具体实现延后交给使用者实现，使得框架更加灵活。Jdk对于xml的解析就是最好的范例。 <br>
<br>
<br>
<br>
灵活性和性能和可维护性的折中 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  最近看了一些同学的代码，看到大量的使用了反射，拦截器等。但是在线上环境运行过程中就发现对于一些拦截器的配置疏漏导致系统性能大幅度降低。对于几十个spring文件，有谁能够很清楚和直观的了解到这些看似灵活和无侵入性的设计。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  对于业务逻辑不复杂，同时场景不多变的流程采用简单的实现，不要追求花哨的灵活性，带来的只会是可读性，可维护性，可用性的降低。 <br>
<br>
<br>
<br>
<br>
<br>
要有分布式和并发的观念，但是不要本末倒置 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  有些同学在做设计的时候考虑的很清晰，但是就是没有考虑集群部署的情况，结果系统上线以后出现了无法集群部署的问题。并发情况的设计也一样，仅仅在满足业务需求以后，对于多用户并发操作的考虑缺失，导致系统流程错误。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  设计的时候需要适度考虑这些问题，但是是在满足现有业务逻辑的前提下，不要为了追求分布式而分布式。 <br>
<br>
<br>
<br>
便利性的函数与性能的冲突 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  首先申明的是这点适用范围有限（高速运转的模块）。对于String,Date等对象的便利性函数，例如正则匹配，分割，Format等等其实都会有不少的性能损耗。例如你只是需要判断文件名最后的后缀是否满足需求，采用了正则匹配，结果发现性能在高速运转的情况下大大下降。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  高速运转的模块尽量采用原始方式或者半原始方式。例如上面说到的文件后缀，就用string的endwith来判断。对于一些字符串的替换，能够用字符串拼接就拼接。对于一些字节流的处理也可以自己根据需求来订制的写。总的一句话，能够满足的就用最低成本的方法。 <br>
<br>
<br>
<br>
防止系统设计的完备性成为攻击或者压力的瓶颈 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在很多设计的时候，对于一些系统设计讲究比较完美。例如对于对象的查询会分本地缓存，集中缓存，DB三个阶段。当对方攻击采用不存在的资源名称时候，这种分阶段的设计反而会增加系统负荷。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  简化流程的分支和层次，对于消耗性资源的访问尽量减少或者没有（采用黑名单本地缓存或者集中缓存的方式），同时改Pull为Push方式，通过控制数据变更点来通知相关系统，而非轮询获取更新状态。 <br>
<br>
<br>
<br>
多级缓存和异步缓解异构系统的瓶颈 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  有时候设计系统时，服务提供方向我们许诺说对方系统如何高效和健壮，但是当频繁访问产生网络风暴的时候，我们发现原来带宽和网络IO本身都会成为瓶颈。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
对于第三方系统的依赖，要做到松耦合就要从流程的异步化来实现。同时通过缓存的使用来达到，系统的高效性和降低对于第三方系统的依赖程度。这样可以大大降低系统的瓶颈。 <br>
<br>
<br>
<br>
运行期白盒化，模块可重置 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  系统运行起来以后就无法在知道内部的状态，也无法对问题组件进行单独处理，造成线上环境的不可知性和无法部分修复。不得不停机重起和看日志。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  模块设计过程中考虑运行期可观测和可重置，提高系统的模块化程度及健壮性。 <br>
<br>
<br>
<br>
站在用户角度设计接口，提升系统可用性 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  总是从自身业务体系和架构去考虑如何设计对外接口，但是发现最后用户使用的很别扭，同时由于需求不能直接被满足，会多次反复调用接口，导致自身系统的压力增大。例如对于一个状态的检查接口，是否提供一个状态变更通知接口就会极大降低轮询的压力 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  需要从客户角度考虑问题，设计接口，防止需求和实现脱节，导致系统压力增加。 <br>
<br>
<br>
<br>
懒惰有时候是件好事 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点: <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  业务流程中很多耗时的操作在流程编排方面没有考虑清楚，当耗时工作做完以后，发现不符合最基本的交验，这样就会导致系统无谓的增加了开销。对于需要申请的资源，考虑处理流程的阶段，阶段性申请要优于一次申请（不过需要注意死锁）。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点: <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  流程编排需要合理性，尽量将耗时的工作放到合理的位置，同时做好基础的防攻击轻量前端屏障逻辑，提高系统的健壮性。 <br>
<br>
<br>
<br>
主流程和副流程隔离 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SIP早先的日志分析模块中有分析日志，备份，发邮件，更新系统缓存，操作数据库等多种操作，但是一股脑儿都被放到一个流程中，结果当邮件没有发成功导致整个流程的失败。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  把真正的主流程梳理出来，同时对于一些副流程可以考虑采用后台异步方式完成，提高系统稳定性。 <br>
<br>
<br>
<br>
模块间接口交互，控制资源直接操作入口 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  对于数据库中的资源任何模块不区分范围都可以访问，最后导致数据结构变更困难，业务对象管理混乱，模块无法剥离独立。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  模块化设计的基本思想，模块间通过接口交互获得其他模块管辖的数据，接口方式屏蔽了对于后端实现及业务对象的依赖。 <br>
<br>
<br>
<br>
学习份外的事情，配置决定成败 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  没有SA就高不定环境，也无法了解操作系统的配置与Web容器的配置对于应用的影响。没有DBA就无法确定如何写SQL避免一些简单的耗时查询。没有测试同学就无法作压力测试，无法了解当前系统性能。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  多学多问，多了解一些其他岗位的内容，才能够更加全面的掌握好架构设计。 <br>
<br>
<br>
<br>
不要迷信 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  着火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  总是看到新技术如何有优点，但是看不到它的成熟度。总是听到很多经验之谈，但是从来没有真的比较过。结果就是别人说什么就是什么，系统地稳定性和可用性基于Google出来的结果。 <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  防火点： <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  需要听取各种意见和经验，同时用测试结果说明问题的结果，看代码说明结果背后的问题。这样才会走得更加踏实，学的更加实际。其实技术发展来说，真正的基础性内容还是有限的，而且各种技术都是触类旁通。分布式，不论是文件系统，DB，缓存都会遇到分布式的共性问题（负载均摊，容错，数据复制，动态扩容等等），在结合一些文件系统，DB，缓存的自身特质。因此扎扎实实学好基础，了解Http协议，了解七层通信协议，了解文件系统设计，了解MapReduce思路，了解结构化，半结构化（bigmap），非结构化存储的要点，就会不会让自己迷失在技术宣传中。 <br>
<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  明天晚上去北京参加系统架构师会议，到时候会和大家分享一下TOP的一些商业和技术上的心得，准备得很仓促，但是个人觉得分享就在于自己将自己知道的说出来，时间不长，45分钟，能讲的也不多，但是如果对于淘宝开放平台有兴趣的同学可以来听一下。这里也算是做个广告，不过不要期望过高，免得失望也大^_^。五年没有来北京了，首都应该也变化不小了。</div> <a href="http://hi.baidu.com/annleecn/blog/item/5b4a788c251ff418b31bbada.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/java%BB%F9%B4%A1">java基础</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/5b4a788c251ff418b31bbada.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-25  16:45</pubDate>
        <category><![CDATA[java基础]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/5b4a788c251ff418b31bbada.html</guid>
</item>

<item>
        <title><![CDATA[JavaScript String 对象参考手册]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/708d5adbef1784d1b7fd4855.html]]></link>
        <description><![CDATA[
		
		<div>
<h2>String 对象</h2>
<p>String 对象用于处理文本（字符串）。</p>
<h3>创建 String 对象的语法：</h3>
<pre>new String(<em>s</em>);
String(<em>s</em>);</pre>
<h3>参数</h3>
<p>参数 <em>s</em> 是要存储在 String 对象中或转换成原始字符串的值。</p>
<h3>返回值</h3>
<p>当 String() 和运算符 new 一起作为构造函数使用时，它返回一个新创建的 String 对象，存放的是字符串 <em>s</em> 或 <em>s</em> 的字符串表示。</p>
<p>当不用 new 运算符调用 String() 时，它只把 <em>s</em> 转换成原始的字符串，并返回转换后的值。</p>
</div>
<div>
<h2>String 对象属性</h2>
<p>FF: Firefox, IE: Internet Explorer</p>
<table class="dataintable FCK__ShowTableBorders">
    <tbody>
        <tr>
            <th style="width: 25%">属性</th>
            <th style="width: 61%">描述</th>
            <th style="width: 7%">FF</th>
            <th style="width: 7%">IE</th>
        </tr>
        <tr>
            <td>constructor</td>
            <td>对创建该对象的函数的引用</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_length_string.asp">length</a></td>
            <td>字符串的长度</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td>prototype</td>
            <td>允许您向对象添加属性和方法</td>
            <td>1</td>
            <td>4</td>
        </tr>
    </tbody>
</table>
</div>
<div>
<h2>String 对象方法</h2>
<p>FF: Firefox, IE: Internet Explorer</p>
<table class="dataintable FCK__ShowTableBorders">
    <tbody>
        <tr>
            <th style="width: 25%">方法</th>
            <th style="width: 61%">描述</th>
            <th style="width: 7%">FF</th>
            <th style="width: 7%">IE</th>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_anchor.asp">anchor()</a></td>
            <td>创建 HTML 锚。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_big.asp">big()</a></td>
            <td>用大号字体显示字符串。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_blink.asp">blink()</a></td>
            <td>显示闪动字符串。</td>
            <td>1</td>
            <td> </td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_bold.asp">bold()</a></td>
            <td>使用粗体显示字符串。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_charAt.asp">charAt()</a></td>
            <td>返回在指定位置的字符。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_charCodeAt.asp">charCodeAt()</a></td>
            <td>返回在指定的位置的字符的 Unicode 编码。</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_concat_string.asp">concat()</a></td>
            <td>连接字符串。</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_fixed.asp">fixed()</a></td>
            <td>以打字机文本显示字符串。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_fontcolor.asp">fontcolor()</a></td>
            <td>使用指定的颜色来显示字符串。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_fontsize.asp">fontsize()</a></td>
            <td>使用指定的尺寸来显示字符串。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td class="no_wrap"><a href="http://www.w3school.com.cn/js/jsref_fromCharCode.asp">fromCharCode()</a></td>
            <td>从字符编码创建一个字符串。</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_indexOf.asp">indexOf()</a></td>
            <td>检索字符串。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_italics.asp">italics()</a></td>
            <td>使用斜体显示字符串。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_lastIndexOf.asp">lastIndexOf()</a></td>
            <td>从后向前搜索字符串。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_link.asp">link()</a></td>
            <td>将字符串显示为链接。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_localeCompare.asp">localeCompare()</a></td>
            <td>用本地特定的顺序来比较两个字符串。</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_match.asp">match()</a></td>
            <td>找到一个或多个正在表达式的匹配。</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_replace.asp">replace()</a></td>
            <td>替换与正则表达式匹配的子串。</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_search.asp">search()</a></td>
            <td>检索与正则表达式相匹配的值。</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_slice_string.asp">slice()</a></td>
            <td>提取字符串的片断，并在新的字符串中返回被提取的部分。</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_small.asp">small()</a></td>
            <td>使用小字号来显示字符串。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_split.asp">split()</a></td>
            <td>把字符串分割为字符串数组。</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_strike.asp">strike()</a></td>
            <td>使用删除线来显示字符串。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_sub.asp">sub()</a></td>
            <td>把字符串显示为下标。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_substr.asp">substr()</a></td>
            <td>从起始索引号提取字符串中指定数目的字符。</td>
            <td>1</td>
            <td>4</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_substring.asp">substring()</a></td>
            <td>提取字符串中两个指定的索引号之间的字符。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_sup.asp">sup()</a></td>
            <td>把字符串显示为上标。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td class="no_wrap"><a href="http://www.w3school.com.cn/js/jsref_toLocaleLowerCase.asp">toLocaleLowerCase()</a></td>
            <td>把字符串转换为小写。</td>
            <td>-</td>
            <td>-</td>
        </tr>
        <tr>
            <td class="no_wrap"><a href="http://www.w3school.com.cn/js/jsref_toLocaleUpperCase.asp">toLocaleUpperCase()</a></td>
            <td>把字符串转换为大写。</td>
            <td>-</td>
            <td>-</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_toLowerCase.asp">toLowerCase()</a></td>
            <td>把字符串转换为小写。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_toUpperCase.asp">toUpperCase()</a></td>
            <td>把字符串转换为大写。</td>
            <td>1</td>
            <td>3</td>
        </tr>
        <tr>
            <td>toSource()</td>
            <td>代表对象的源代码。</td>
            <td>1</td>
            <td>-</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_toString_string.asp">toString()</a></td>
            <td>返回字符串。</td>
            <td>-</td>
            <td>-</td>
        </tr>
        <tr>
            <td><a href="http://www.w3school.com.cn/js/jsref_valueOf_string.asp">valueOf()</a></td>
            <td>返回某个字符串对象的原始值。</td>
            <td>1</td>
            <td>4</td>
        </tr>
    </tbody>
</table>
</div>
<div>
<h2>String 对象描述</h2>
<p>字符串是 JavaScript 的一种基本的数据类型。</p>
<p>String 对象的 length 属性声明了该字符串中的字符数。</p>
<p>String 类定义了大量操作字符串的方法，例如从字符串中提取字符或子串，或者检索字符或子串。</p>
<p>需要注意的是，JavaScript 的字符串是不可变的（immutable），String 类定义的方法都不能改变字符串的内容。像 String.toUpperCase() 这样的方法，返回的是全新的字符串，而不是修改原始字符串。</p>
<p>在较早的 Netscape 代码基的 JavaScript 实现中（例如 Firefox 实现中），字符串的行为就像只读的字符数组。例如，从字符串 s 中提取第三个字符，可以用 s[2] 代替更加标准的 s.charAt(2)。此外，对字符串应用 for/in 循环时，它将枚举字符串中每个字符的数组下标（但要注意，ECMAScript 标准规定，不能枚举 length 属性）。因为字符串的数组行为不标准，所以应该避免使用它。</p>
</div> <a href="http://hi.baidu.com/annleecn/blog/item/708d5adbef1784d1b7fd4855.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Javascript">Javascript</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/708d5adbef1784d1b7fd4855.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-20  12:02</pubDate>
        <category><![CDATA[Javascript]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/708d5adbef1784d1b7fd4855.html</guid>
</item>

<item>
        <title><![CDATA[JavaScript 中 substr 和 substring的区别]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/3cc6abedcd21ec3727979155.html]]></link>
        <description><![CDATA[
		
		String.substr(N1,N2)  这个就是我们常用的从指定的位置(N1)截取指定长度(N2)的字符串;<br>
String.substring(N1,N2) 这个就有点特别了，它是先从N1，N2里找出一个较小的值，然后从字符串的开始位置算起，截取较小值位置和较大值位置之间的字符串,截取出来的字符串的长度为较大值与较小值之间的差。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Javascript">Javascript</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/3cc6abedcd21ec3727979155.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-20  12:01</pubDate>
        <category><![CDATA[Javascript]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/3cc6abedcd21ec3727979155.html</guid>
</item>

<item>
        <title><![CDATA[2009最新最全提交网站到google,百度,yahoo,alexa,]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/945bb81a148d40138718bf56.html]]></link>
        <description><![CDATA[
		
		2009最新最全提交网站到google,百度,yahoo,雅虎,中搜,搜狗等各大搜索引擎<br>
<br>
<font size="3"><font color="#000000"><font face="Verdana">以下是目前所有站点的登录入口：（流量高了，或者有.com或.cn等顶级域名后再登录，被收录的可能性才大）<br>
Google：登录您的网站<br>
</font><a href="http://www.google.com/intl/zh-CN/add_url.html" target="_blank"><font face="Verdana" color="#0000ff">http://www.google.com/intl/zh-CN/add_url.html</font></a> <font face="Verdana"><br>
<br>
百度搜索帮助中心-网站登录<br>
</font><a href="http://www.baidu.com/search/url_submit.html" target="_blank"><font face="Verdana" color="#0000ff">http://www.baidu.com/search/url_submit.html</font></a> <font face="Verdana"><br>
<br>
雅虎网址大全_网站登录<br>
</font><a href="http://site.yahoo.com.cn/feedback.html" target="_blank"><font face="Verdana" color="#0000ff">http://site.yahoo.com.cn/feedback.html</font></a> <font face="Verdana"><br>
<br>
蜜蜂导航搜索-网站提交<br>
</font><a href="http://www.mifeng.cc/login.asp" target="_blank"><font face="Verdana" color="#0000ff">http://www.mifeng.cc/login.asp</font></a> <font face="Verdana"><br>
<br>
如何向雅虎提交我的网<br>
</font><a href="http://search.help.cn.yahoo.com/h4_4.html" target="_blank"><font face="Verdana" color="#0000ff">http://search.help.cn.yahoo.com/h4_4.html</font></a> <font face="Verdana"><br>
<br>
alexa资料提交<br>
</font><a href="http://www.alexa.com/site/help/webmasters" target="_blank"><font face="Verdana" color="#800080">http://www.alexa.com/site/help/webmasters</font></a> <font face="Verdana"><br>
<br>
MSN提交URL<br>
</font><a href="http://search.msn.com.cn/docs/submit.aspx" target="_blank"><font face="Verdana" color="#0000ff">http://search.msn.com.cn/docs/submit.aspx</font></a> <font face="Verdana"><br>
<br>
SOHU（搜狐）网站登记-搜狗免费网站登录<br>
</font><a href="http://db.sohu.com/regurl/regform.asp" target="_blank"><font face="Verdana" color="#0000ff">http://db.sohu.com/regurl/regform.asp</font></a> <font face="Verdana"><br>
<br>
TOM搜索 &gt;&gt; 网站登录<br>
</font><a href="http://search.tom.com/tools/weblog/log.php" target="_blank"><font face="Verdana" color="#800080">http://search.tom.com/tools/weblog/log.php</font></a> <font face="Verdana"><br>
<br>
Google网页目录<br>
</font><a href="http://directory.google.com/Top/World/Chinese_Simplified/" target="_blank"><font face="Verdana" color="#0000ff">http://directory.google.com/Top/World/Chinese_Simplified/</font></a> <font face="Verdana"><br>
<br>
蜜蜂导航<br>
</font><a href="http://www.mifeng.cc/" target="_blank"><font face="Verdana" color="#0000ff">http://www.mifeng.cc</font></a> <font face="Verdana"><br>
<br>
hao123网址之家<br>
</font><a href="http://post.baidu.com/f?kw=hao123" target="_blank"><font face="Verdana" color="#0000ff">http://post.baidu.com/f?kw=hao123</font></a> <font face="Verdana"><br>
<br>
爱问搜索<br>
</font><a href="http://iask.com/guest/add_url.php" target="_blank"><font face="Verdana" color="#0000ff">http://iask.com/guest/add_url.php</font></a> <font face="Verdana"><br>
<br>
<span class="t_tag" href="tag.php?name=%D6%D0%B9%FA">中国</span>搜索<br>
</font><a href="http://ads.zhongsou.com/register/page.jsp" target="_blank"><font face="Verdana" color="#0000ff">http://ads.zhongsou.com/register/page.jsp</font></a> <font face="Verdana"><br>
<br>
天网搜索<br>
</font><a href="http://home.tianwang.com/denglu.htm" target="_blank"><font face="Verdana" color="#0000ff">http://home.tianwang.com/denglu.htm</font></a> <font face="Verdana"><br>
<br>
<br>
排名<br>
</font><a href="http://top.chinaz.com/" target="_blank"><font face="Verdana" color="#0000ff">http://top.chinaz.com</font></a> <font face="Verdana"><br>
</font></font></font> <a href="http://hi.baidu.com/annleecn/blog/item/945bb81a148d40138718bf56.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/%D3%AA%CF%FA%26%2347%3B%CD%F8%D5%BE">营销&#47;网站</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/945bb81a148d40138718bf56.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-18  14:00</pubDate>
        <category><![CDATA[营销&#47;网站]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/945bb81a148d40138718bf56.html</guid>
</item>

<item>
        <title><![CDATA[在Java的应用过程中获取系统属性]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/7a636b58ce366c202834f015.html]]></link>
        <description><![CDATA[
		
		<p style="text-indent: 2em">Java语言以其面向对象、跨平台、可移植性好、安全性高等优点，受到众多编程人员的青睐，越来越多的人将其作为应用软件开发语言的首选。</p>
<p style="text-indent: 2em">在Java应用程序运行时，特别是需要在跨平台工作环境下运行时，需要确定操作系统类型、用户JDK版本和用户工作目录等随工作平台变化的信息，来保证程序正确运行。一般情况下，可以利用JDK提供的系统属性类（Properties）中的方法，快速地获取工作环境信息。</p>
<p style="text-indent: 2em">另外，程序开发人员还可以定义与应用程序相关的系统属性文件，在用户程序执行过程中动态地加载程序员定义的属性文件来控制程序运行。</p>
<p style="text-indent: 2em">本文通过对系统属性类的分析，结合实际例子介绍如何定义系统属性文件，并讨论安全策略文件的定义。</p>
<p style="text-indent: 2em">在应用程序开始执行时，程序首先读取系统的默认属性。如果定义了用户属性文件，则应用程序加载该属性文件。程序运行过程中可以根据执行情况动态地修改属性定义，并在程序结束运行前，保存属性文件。</p>
<p style="text-indent: 2em">获取属性的方法：</p>
<p style="text-indent: 2em">contains(Object value)、containsKey(Object key)：如果给定的参数或属性关键字在属性表中有定义，该方法返回True，否则返回False；</p>
<p style="text-indent: 2em">●getProperty(String key)、getProperty(String key, String default)：根据给定的属性关键字获取关键字值；</p>
<p style="text-indent: 2em">●list(PrintStream s)、list(PrintWriter w)： 在输出流中输出属性表内容；</p>
<p style="text-indent: 2em">●size()：返回当前属性表中定义的属性关键字个数。</p>
<p style="text-indent: 2em">设置属性的方法：</p>
<p style="text-indent: 2em">●put(Object key, Object value) ：向属性表中追加属性关键字和关键字的值；</p>
<p style="text-indent: 2em">●remove(Object key) ：从属性表中删除关键字。</p>
<p style="text-indent: 2em">获取系统属性</p>
<p style="text-indent: 2em">系统属性是指与用户程序相关的操作系统配置信息以及软件信息。通常与用户程序相关的属性关键字包括：</p>
<p style="text-indent: 2em">●file.separator : 文件分隔符， Windows环境下为&ldquo;\&quot;，Unix环境下为&ldquo;/&rdquo;；</p>
<p style="text-indent: 2em">●user.home ：用户主目录；</p>
<p style="text-indent: 2em">●java.home ：Java实时运行环境的安装目录；</p>
<p style="text-indent: 2em">●java.ext.dirs ：JDK的安装目录；</p>
<p style="text-indent: 2em">●os.name ：操作系统名称；</p>
<p style="text-indent: 2em">●user.name ：用户登录名称；</p>
<p style="text-indent: 2em">●os.version ：操作系统版本；</p>
<p style="text-indent: 2em">●path.separator ：当前操作系统的路径分隔符；</p>
<p style="text-indent: 2em">●user.dir ：当前用户程序所在目录。</p>
<p style="text-indent: 2em">下面结合例子说明获取系统属性的方法:</p>
<p style="text-indent: 2em"> </p>
<center><ccid_nobr></ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code></ccid_code>/＊getSystemProperties.java＊/ 
import java.util.Properties;  
public class getSystemProperties 
{ 
public static void main(String args[]) 
{  
//通过获得系统属性构造属性类 prop 
Properties prop = new Properties(  
System.getProperties() ); 
//在标准输出中输出系统属性的内容 
prop.list(System.out); 
} 
//根据获取的系统属性确定程序执行流程 
…… 
}</pre>
            </td>
        </tr>
    </tbody>
</table>
</center>
<p style="text-indent: 2em">上述程序执行后，在Windows环境中产生类似如下的输出：</p>
<p style="text-indent: 2em"> </p>
<center><ccid_nobr></ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code></ccid_code>user.home=C:\WIN95 
java.home=D:\JDK1.2\JRE 
java.ext.dirs=D:\JDK1.2 
os.name=Windows 95 
user.name=Office 
java.vm.name=Classic VM 
os.version=4.10 
path.separator=; 
file.separator=\ 
user.dir=D:\JavaTest</pre>
            </td>
        </tr>
    </tbody>
</table>
</center>
<p style="text-indent: 2em">属性文件的操作方法</p>
<p style="text-indent: 2em">Java程序开发人员可以通过定义属性文件来设置程序运行的参数。属性文件是程序外部文件，在应用程序初始运行时，可以通过读取属性文件来获取有关程序运行的参数。例如，在程序运行时需要在程序外部控制程序的执行流程，这时可以通过定义属性文件的方法达到目的。下面结合例子说明属性文件的操作方法：</p>
<p style="text-indent: 2em"> </p>
<center><ccid_nobr></ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code></ccid_code>/＊PropertyFile.java＊/ 
//引入相关类 
import java.io.＊; 
import java.util.Properties; 
public class PropertyFile 
{ 
//定义文件输入和输出流 
static FileInputStream fis; 
static FileOutputStream fos; 
public static void main(String args[]) 
{  
//生成新的属性对象 
Properties prop = new Properties(); 
try 
{  
//生成文件输入和输出流，
输入流指向用户已经定义的属性文件，
输出流指向由应用程序新定义的属性文件 
fis = new FileInputStream 
(&ldquo;firstProp.txt&rdquo;); 
fos = new FileOutputStream 
(&ldquo;secondProp.txt&rdquo;); 
} 
catch(FileNotFoundException e) 
{ 
System.out.println
(&ldquo;Cannot create the file stream&rdquo;); 
} 
try 
{ 
//从输入文件加载系统属性 
prop.load(fis); 
//根据程序执行情况更改属性关键字的值 
prop.put(&ldquo;Switch&rdquo;,&ldquo;1&rdquo;); 
//输出新属性文件secondProp.txt 
prop .save 
( fos ,&ldquo;－－ a new properties file－&rdquo;); 
} 
catch(IOException e) 
{ 
System.out.println
(&ldquo;Exception in repleace the keyword&rdquo;); 
} 
} 
}</pre>
            </td>
        </tr>
    </tbody>
</table>
</center>
<p style="text-indent: 2em">在程序执行之前，用户必须首先定义属性文件firstProp.txt，该文件内容如下：</p>
<p style="text-indent: 2em">Switch= 0</p>
<p style="text-indent: 2em">Version= 1.0</p>
<p style="text-indent: 2em">Directory= JavaTest</p>
<p style="text-indent: 2em">程序运行后，输出新的属性文件secondProp.txt，该文件内容如下（注意观察两个文件关键字Switch内容的区别）：</p>
<p style="text-indent: 2em">＃－－a new properties file－－</p>
<p style="text-indent: 2em">＃Sun Mar 11 21:22:40 CST 2001</p>
<p style="text-indent: 2em">Switch= 1</p>
<p style="text-indent: 2em">Version= 1.0</p>
<p style="text-indent: 2em">Directory= JavaTest</p>
<p style="text-indent: 2em">从上例可以看出，通过JDK提供的属性类Properties可以方便地在程序外部对应用程序的执行流程进行控制，从而简化了编程难度，使程序流程可控性更好。</p>
<p style="text-indent: 2em">安全策略文件</p>
<p style="text-indent: 2em">Java提供的应用程序环境的安全策略，使得不同的代码对系统资源拥有不同的访问许可。Java应用程序安全策略由Policy对象来表达，通过定义安全策略文件来实现。Java1.2的安全策略文件分为三级：系统安全策略文件、用户安全策略文件和缺省安全策略文件。</p>
<p style="text-indent: 2em">当Java应用程序启动后，按照先后顺序加载安全策略内容。下面结合典型的安全策略文件内容对安全策略文件的定义进行说明：</p>
<p style="text-indent: 2em"> </p>
<center><ccid_nobr></ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code></ccid_code>grant 
{  
//对系统和用户目录设置&ldquo;读&rdquo;的权限 
permission java.util.PropertyPermission
&ldquo;user.dir&rdquo;, 
&ldquo;read&rdquo;; 
permission java.util.PropertyPermission
&ldquo;user.home&rdquo;,&ldquo;read&rdquo;; 
permission java.util.PropertyPermission
&ldquo;java.home&rdquo;,&ldquo;read&rdquo;; 
permission java.util.PropertyPermission
&ldquo;java.class. 
path&rdquo;,&ldquo;read&rdquo;; 
permission java.util.PropertyPermission
&ldquo;user.name&rdquo;,&ldquo;read&rdquo;; 
//其他安全策略内容 
};</pre>
            </td>
        </tr>
    </tbody>
</table>
</center>
<p style="text-indent: 2em">上述安全策略文件定义了应用程序对用户目录、用户登录目录、JDK安装目录、用户名称等系统内容具有读的权限</p> <a href="http://hi.baidu.com/annleecn/blog/item/7a636b58ce366c202834f015.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/java%BB%F9%B4%A1">java基础</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/7a636b58ce366c202834f015.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-18  09:22</pubDate>
        <category><![CDATA[java基础]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/7a636b58ce366c202834f015.html</guid>
</item>

<item>
        <title><![CDATA[JQuery获取和设置Select选项方法]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/b491b73fe9509bf0828b13de.html]]></link>
        <description><![CDATA[
		
		<p>JQuery获取和设置Select选项</p>
<p>获取Select ：</p>
<p> 获取select 选中的 text:</p>
<p>&nbsp;&nbsp;  $(&quot;#ddlRegType&quot;).find(&quot;option:selected&quot;).text();</p>
<p> 获取select选中的 value:</p>
<p>&nbsp;&nbsp;  $(&quot;#ddlRegType &quot;).val();</p>
<p> 获取select选中的索引:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  $(&quot;#ddlRegType &quot;).get(0).selectedIndex;</p>
<p>设置select:</p>
<p> 设置select 选中的索引：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  $(&quot;#ddlRegType &quot;).get(0).selectedIndex=index;//index为索引值</p>
<p>  设置select 选中的value：</p>
<p>&nbsp;&nbsp;&nbsp;  $(&quot;#ddlRegType &quot;).attr(&quot;value&quot;,&quot;Normal&ldquo;);</p>
<p>&nbsp;&nbsp;&nbsp;  $(&quot;#ddlRegType &quot;).val(&quot;Normal&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;  $(&quot;#ddlRegType &quot;).get(0).value = value;</p>
<p>  设置select 选中的text:</p>
<p>var count=$(&quot;#ddlRegType &quot;).size();</p>
<p>  for(var i=0;i&lt;count;i++)  <br>
&nbsp;&nbsp;&nbsp;&nbsp;  {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if($(&quot;#ddlRegType &quot;).get(0).options[i].text == text)  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  $(&quot;#ddlRegType &quot;).get(0).options[i].selected = true;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }  <br>
&nbsp;&nbsp;&nbsp;  }</p>
<p>清空 Select:</p>
<p>$(&quot;#ddlRegType &quot;).empty();</p>
<p> </p>
<p> </p> <a href="http://hi.baidu.com/annleecn/blog/item/b491b73fe9509bf0828b13de.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Jquery">Jquery</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/b491b73fe9509bf0828b13de.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-12  17:20</pubDate>
        <category><![CDATA[Jquery]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/b491b73fe9509bf0828b13de.html</guid>
</item>

<item>
        <title><![CDATA[SVN如何恢复已删除文件或文件夹]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/3f0cdd89af19219ea4c2721f.html]]></link>
        <description><![CDATA[
		
		用<span class="t_tag" href="tag.php?name=TortoiseSVN">TortoiseSVN</span>:<br>
1.在本地working copy中，用TortoiseSVN-&gt;Show log查看<span class="t_tag" href="tag.php?name=%E7%89%88%E6%9C%AC%E5%BA%93">版本库</span>的历史记录。可以用search。<br>
2.找到<span class="t_tag" href="tag.php?name=%E5%88%A0%E9%99%A4">删除</span>该<span class="t_tag" href="tag.php?name=%E6%96%87%E4%BB%B6">文件</span>或者文件夹的版本，在<span class="t_tag" href="tag.php?name=Log">Log</span> message里右键Revert the changes from this revision。<br>
3.该文件或文件夹就被恢复到本地的working copy中了。如果是误删除的，<span class="t_tag" href="tag.php?name=commit">commit</span>到<span class="t_tag" href="tag.php?name=Repository">Repository</span>里就行了。<br>
<br>
用Eclipse的Subclipse<span class="t_tag" href="tag.php?name=%E6%8F%92%E4%BB%B6">插件</span>：<br>
1.用Team-&gt;Show SVN Repository History查看版本库的历史记录。<br>
2. 找到删除该文件或者文件夹的版本，右键Revert to XX version.<br>
3.该文件或文件夹就被恢复到本地的working copy中了。如果是误删除的，commit到Repository里就行了。 <a href="http://hi.baidu.com/annleecn/blog/item/3f0cdd89af19219ea4c2721f.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Cvs%20Svn">Cvs Svn</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/3f0cdd89af19219ea4c2721f.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-11  21:18</pubDate>
        <category><![CDATA[Cvs Svn]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/3f0cdd89af19219ea4c2721f.html</guid>
</item>

<item>
        <title><![CDATA[freemarker 中文乱码问题解决办法]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/976026f4a52f3c2fbd310942.html]]></link>
        <description><![CDATA[
		
		<p>freemarker 中文乱码问题解决办法</p>
<p><span style="color: black">freemarker</span><span style="color: black">的</span><span style="color: black">Configurartion</span><span style="color: black">中有默认的编码为</span><span style="color: black">ISO-8859-1所以读取有中文的模板时就会变乱码。</span></p>
<p><span style="color: black">解决办法一：通过修改配置文件freemarker.properties，修改默认编码：</span></p>
<p><span style="color: black">locale=zh_CN<br>
<strong><font color="#ff0000">default_encoding=gbk</font></strong><br>
number_format=#<br>
date_format=yyyy-MM-dd<br>
time_format=HH:mm:Ss<br>
datetime_format=yyyy-MM-dd HH:mm:Ss</span></p>
<p><span style="color: black">解决办法二：通过spring或其他第三方工具配置：</span></p>
<span style="color: black">
<div align="left"><span style="color: black">&lt;bean id=&quot;freemakerCongfig&quot;</span></div>
<div align="left"><span style="color: black">&nbsp;&nbsp;&nbsp;  class=&quot;org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer&quot;&gt;</span></div>
<div align="left"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;property name=&quot;templateLoaderPath&quot;&gt;</span></div>
<div align="left"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;value&gt;/WEB-INF/web/&lt;/value&gt;</span></div>
<div align="left"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/property&gt;</span></div>
<div align="left"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;property name=&quot;freemarkerSettings&quot;&gt;</span></div>
<div align="left"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;props&gt;</span></div>
<div align="left"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;prop key=&quot;defaultEncoding&quot;&gt;gbk&lt;/prop&gt;</span></div>
<div align="left"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/props&gt;</span></div>
<div align="left"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/property&gt;</span></div>
<div align="left">
<p><span style="color: black">&nbsp;&nbsp;&nbsp;  &lt;/bean&gt;</span></p>
<p><span style="color: black">注：org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer在<strong><font color="#ff0000">spring-webmvc.jar</font><font color="#0000ff"> 包里面，项目要导入这个jar包才可以，或者会找不到类。</font></strong></span></p>
<p><span style="color: black"><strong>另外，页面编码和charset要跟上面配置的一致才可以，&lt;meta http-equiv=&quot;Content-type&quot; content=&quot;text/html; charset=gbk&quot;&gt;</strong></span></p>
<p>注意：还有一种常见的导致乱码问题：编辑器或文件保存的编码和页面设置的编码不一致会导致乱码，例如文件的编码(用记事本打开,另存为可以看到文件的编码)为UTF-8而页面的charset=gbk就会出现乱码，反之也一样。</p>
</div>
</span> <a href="http://hi.baidu.com/annleecn/blog/item/976026f4a52f3c2fbd310942.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Freemarker">Freemarker</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/976026f4a52f3c2fbd310942.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-11  19:27</pubDate>
        <category><![CDATA[Freemarker]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/976026f4a52f3c2fbd310942.html</guid>
</item>

<item>
        <title><![CDATA[关于Freemarker生成静态html文件及中文乱码的问题]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/9863cd5d1ee9f649faf2c042.html]]></link>
        <description><![CDATA[
		
		<p>先看生成静态html文件：</p>
<p>FreeMarker允许Java servlet保持图形设计同应用程序逻辑的分离，这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成 HTML。模板语言是强大的直观的，编译器速度快，输出接</p>
<p>近静态HTML页面的速度。</p>
<p><br>
　　FreeMarker是一个模板引擎，一个基于模板生成文本输出的通用工具，使用纯Java编写</p>
<p>　　FreeMarker被设计用来生成HTML Web页面，特别是基于MVC模式的应用程序</p>
<p>　　虽然FreeMarker具有一些编程的能力，但通常由Java程序准备要显示的数据，由FreeMarker生成页面，通过模板显示准备的数据</p>
<p>　　FreeMarker不是一个Web应用框架，而适合作为Web应用框架一个组件</p>
<p>　　FreeMarker与容器无关，因为它并不知道HTTP或Servlet；FreeMarker同样可以应用于非Web应用程序环境</p>
<p>　　FreeMarker更适合作为Model2框架（如Struts）的视图组件，你也可以在模板中使用JSP标记库</p>
<p>　　FreeMarker是免费的</p>
<p>模板:  <br>
　 <br>
&lt;html&gt;<br>
&lt;head&gt;</p>
<p>&lt;title&gt;查看文章: ${newsitem.title} &lt;/title&gt;<br>
&lt;/head&gt;</p>
<p>&lt;body&gt;<br>
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; bgcolor=&quot;#FFFFFF&quot;&gt;<br>
&lt;tr&gt;&lt;td&gt;<br>
&lt;table width=&quot;95%&quot; border=&quot;0&quot; align=&quot;center&quot; cellpadding=&quot;2&quot; cellspacing=&quot;6&quot; &gt;<br>
 &lt;tr&gt; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;td height=&quot;10&quot; align=&quot;left&quot; colspan=2 &gt;&lt;/td&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;/tr&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;tr&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  &lt;td align=&quot;left&quot; width=&quot;538&quot; &gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  &lt;strong&gt;${newsitem.title}&lt;/strong&gt; ( ${newsitem.addtime} )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/td&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;td align=&quot;right&quot;&gt;<br>
&nbsp;&nbsp;&nbsp; &lt;a href=&quot;index.jsp&quot;&gt;返回&lt;/a&gt;<br>
&nbsp;&nbsp;&nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/td&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;/tr&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;tr&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;td align=&quot;left&quot; valign=top colspan=2&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;hr align=&quot;left&quot;  width=&quot;95%&quot; size=&quot;1&quot; noshade color=&quot;#cc0000&quot; &gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/td&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;/tr&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;tr&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;td colspan=2&gt;${newsitem.showContent}<br>
&nbsp;&nbsp;  &lt;/td&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;/tr&gt;<br>
&lt;/table&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&lt;br&gt;<br>
&lt;/td&gt;&lt;/tr&gt;<br>
&lt;/table&gt;<br>
&lt;/body&gt;</p>
<p>&lt;/html&gt;<br>
　<br>
 </p>
<p><br>
代码:  <br>
  <br>
import java.io.*;<br>
import java.util.HashMap; <br>
import java.util.Map;</p>
<p>import org.apache.commons.logging.Log; <br>
import org.apache.commons.logging.LogFactory; <br>
import freemarker.template.*; <br>
/*<br>
* Created on 2005-4-7 <br>
 * <br>
 */ <br>
  <br>
/** <br>
 * 测试FreeMarker. <br>
 * <br>
 * @author scud <br>
 * <br>
 */ <br>
public class FreeMarkerTest <br>
{ <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  private final Log logger = LogFactory.getLog(getClass()); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  private Configuration freemarker_cfg = null; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  public static void main(String[] args) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <a>//@todo</a> 自己的一个类 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NewsItem aItem = null; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <a>//@todo</a> 装入新闻 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //NewsItem = loadNewsItem(1); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  FreeMarkerTest test = new FreeMarkerTest(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Map root = new HashMap(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  root.put(&quot;newsitem&quot;, aItem); <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  String sGeneFilePath = &quot;/tpxw/&quot;; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  String sFileName = &quot;1.htm&quot;; <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  boolean bOK = test.geneHtmlFile(&quot;/tpxw/view.ftl&quot;,root, sGeneFilePath,sFileName); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  /** <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * 获取freemarker的配置. freemarker本身支持classpath,目录和从ServletContext获取. <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  */ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  protected Configuration getFreeMarkerCFG() <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (null == freemarker_cfg) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // Initialize the FreeMarker configuration; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // - Create a configuration instance <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  freemarker_cfg = new Configuration(); <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // - FreeMarker支持多种模板装载方式,可以查看API文档,都很简单:路径,根据Servlet上下文,classpath等等 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //htmlskin是放在classpath下的一个目录 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  freemarker_cfg.setClassForTemplateLoading(this.getClass(), &quot;/htmlskin&quot;); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return freemarker_cfg; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  /** <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * 生成静态文件. <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * @param templateFileName 模板文件名,相对htmlskin路径,例如&quot;/tpxw/view.ftl&quot; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * @param propMap 用于处理模板的属性Object映射 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * @param htmlFilePath 要生成的静态文件的路径,相对设置中的根路径,例如 &quot;/tpxw/1/2005/4/&quot; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * @param htmlFileName 要生成的文件名,例如 &quot;1.htm&quot; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  */ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  public boolean geneHtmlFile(String templateFileName,Map propMap, String htmlFilePath,String htmlFileName ) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <a>//@todo</a> 从配置中取得要静态文件存放的根路径:需要改为自己的属性类调用 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  String sRootDir = &quot;e:/webtest/htmlfile&quot; ; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Template t = getFreeMarkerCFG().getTemplate(templateFileName); <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //如果根路径存在,则递归创建子目录 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  creatDirs(sRootDir,htmlFilePath); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  File afile = new File(sRootDir +&quot;/&quot; +htmlFilePath + &quot;/&quot; + htmlFileName); <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(afile))); <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  t.process(propMap, out); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  catch (TemplateException e) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.error(&quot;Error while processing FreeMarker template &quot; + templateFileName,e); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return false; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  catch (IOException e) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.error(&quot;Error while generate Static Html File &quot; + htmlFileName,e); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return false; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return true; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  /** <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * 创建多级目录 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * @param aParentDir String <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * @param aSubDir  以 / 开头 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  * @return boolean 是否成功 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  */ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  public static boolean creatDirs(String aParentDir, String aSubDir) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  File aFile = new File(aParentDir); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (aFile.exists()) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  File aSubFile = new File(aParentDir + aSubDir); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (!aSubFile.exists()) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return aSubFile.mkdirs(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  else <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return true; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  else <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return false; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;&nbsp;  <br>
  <br>
  <br>
&nbsp;&nbsp;&nbsp;  <br>
} <br>
 </p>
<p><br>
编码的问题</p>
<p>这里说的是编码的问题。项目使用的都是UTF-8编码，生成的文件在UTF-8编码下察看是乱码，而GBK正常(后来发现因为我用的中文操作系统所以用GBK查看正常)。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  当然我把Freemarker的配置都改成了UTF-8，我的模版文件也是UTF-8编码的。下面是原来的代码</p>
<p>&nbsp;&nbsp;&nbsp;  public void setTemplatePath(Resource templatePath) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  this.templatePath = templatePath;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //设置freemarker的参数<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  freemarkerCfg = new Configuration();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  freemarkerCfg.setDirectoryForTemplateLoading(this.templatePath.getFile());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  freemarkerCfg.setObjectWrapper(new DefaultObjectWrapper());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  freemarkerCfg.setDefaultEncoding(&quot;UTF-8&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (IOException ex) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  throw new SystemException(&quot;No Directory found,please check you config.&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;&nbsp;  /**<br>
&nbsp;&nbsp;&nbsp;&nbsp;  * 生成静态文件<br>
&nbsp;&nbsp;&nbsp;&nbsp;  * @param templateFileName 模版名称eg:(biz/order.ftl)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  * @param propMap 用于处理模板的属性Object映射 <br>
&nbsp;&nbsp;&nbsp;&nbsp;  * @param htmlFilePath 要生成的静态文件的路径,相对设置中的根路径,例如 &quot;/biz/2006/5/&quot; <br>
&nbsp;&nbsp;&nbsp;&nbsp;  * @param htmlFileName 要生成的文件名,例如 &quot;123.htm&quot; <br>
&nbsp;&nbsp;&nbsp;&nbsp;  * @return<br>
&nbsp;&nbsp;&nbsp;&nbsp;  */<br>
&nbsp;&nbsp;&nbsp;  private boolean buildHtml(String templateFileName,Map propMap, String htmlFilePath,String htmlFileName){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Template template = freemarkerCfg.getTemplate(templateFileName);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  template.setEncoding(&quot;UTF-8&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //创建生成文件目录<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  creatDirs(buildPath.getFilename(),htmlFilePath);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  File htmlFile = new File(buildPath + htmlFilePath + htmlFileName);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile)));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  template.process(propMap,out);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  out.flush();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return true;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (TemplateException ex){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  log.error(&quot;Build Error&quot;+templateFileName,ex);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return false;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (IOException e) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  log.error(&quot;Build Error&quot;+templateFileName,e);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return false;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  }<br>
下面是修改之后的代码</p>
<p>&nbsp;&nbsp;&nbsp;  /**<br>
&nbsp;&nbsp;&nbsp;&nbsp;  * 生成静态文件<br>
&nbsp;&nbsp;&nbsp;&nbsp;  * @param templateFileName 模版名称eg:(biz/order.ftl)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  * @param propMap 用于处理模板的属性Object映射 <br>
&nbsp;&nbsp;&nbsp;&nbsp;  * @param htmlFilePath 要生成的静态文件的路径,相对设置中的根路径,例如 &quot;/biz/2006/5/&quot; <br>
&nbsp;&nbsp;&nbsp;&nbsp;  * @param htmlFileName 要生成的文件名,例如 &quot;123.htm&quot; <br>
&nbsp;&nbsp;&nbsp;&nbsp;  * @return<br>
&nbsp;&nbsp;&nbsp;&nbsp;  */<br>
&nbsp;&nbsp;&nbsp;  private boolean buildHtml(String templateFileName,Map propMap, String htmlFilePath,String htmlFileName){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Template template = freemarkerCfg.getTemplate(templateFileName);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  template.setEncoding(&quot;UTF-8&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //创建生成文件目录<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  creatDirs(buildPath.getFilename(),htmlFilePath);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  File htmlFile = new File(buildPath + htmlFilePath + htmlFileName);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile),&quot;UTF-8&quot;));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  template.process(propMap,out);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  out.flush();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return true;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (TemplateException ex){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  log.error(&quot;Build Error&quot;+templateFileName,ex);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return false;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (IOException e) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  log.error(&quot;Build Error&quot;+templateFileName,e);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return false;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  }<br>
原因就在于OutputStreamWriter的不同构造方法</p>
<p>OutputStreamWriter(OutputStream out)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  创建使用默认字符编码的 OutputStreamWriter。<br>
OutputStreamWriter(OutputStream out, String charsetName)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  创建使用指定字符集的 OutputStreamWriter。</p>
<p> 这个是中文JDK的文档说明，刚开始我使用默认的构造函数，所以使用了系统默认的编码，GBK，所以在生成静态文件的时候把UTF-8内容用GBK编码写入了，所以在UTF-8下浏览就有问题。</p>
<p>还有关于修改模版文件同样也要注意这个问题。</p>
<p>&nbsp;&nbsp;&nbsp;  public String loadTemplate(String templateName) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  StringBuffer sb = new StringBuffer();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  File file = new File(templatePath+&quot;/&quot;+templateName);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),&quot;UTF-8&quot;));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  String line = reader.readLine();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  while(line != null)&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sb.append(line);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sb.append(&quot;\r\n&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  line = reader.readLine();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  reader.close();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (IOException e) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  throw new SystemException(&quot;Loading template Error:&quot;,e);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return sb.toString();<br>
&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;&nbsp;  public void saveTemplate(String templateName, String templateContent) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  File file = new File(templatePath + &quot;/&quot; + templateName);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),&quot;UTF-8&quot;));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  out.write(templateContent);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  out.flush();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //扔出templatesave事件<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TemplateSaveEvent evt = new TemplateSaveEvent();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  evt.setTemplateName(templateName);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  dispatchTemplateEvent(evt);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (IOException e) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  throw new SystemException(&quot;Write template Error&quot;,e);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  }</p> <a href="http://hi.baidu.com/annleecn/blog/item/9863cd5d1ee9f649faf2c042.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Freemarker">Freemarker</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/9863cd5d1ee9f649faf2c042.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-11  19:26</pubDate>
        <category><![CDATA[Freemarker]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/9863cd5d1ee9f649faf2c042.html</guid>
</item>

<item>
        <title><![CDATA[用href=&#34;javascript :;&#34;替换href=&#34;#&#34;]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/794e3efb7598d9839e5146ce.html]]></link>
        <description><![CDATA[
		
		有时候我们的href并不是想跳到一个链接，而是在onclick的javascript做些事情。<br>
通常我们用href=&quot;#&quot;的空链接，但是#回真正出现在浏览器的地址栏。而且当有<br>
多个空链接的需求时，还会影响visited能属性的效果。<br>
<br>
用href=&quot;javascript :;&quot;是一个很好的方案，成功的解决了上面的问题。<br> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Javascript">Javascript</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/794e3efb7598d9839e5146ce.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-10  16:27</pubDate>
        <category><![CDATA[Javascript]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/794e3efb7598d9839e5146ce.html</guid>
</item>

<item>
        <title><![CDATA[千万注意FreeMarker的数字转字符串问题]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/747ac3947ae83f41d0135e64.html]]></link>
        <description><![CDATA[
		
		在使用FreeMarker进行数字转字符串时，一旦数字超过1000后，就极易导致出现&ldquo;,&rdquo;分隔的情况。 <br>
如 1000，转换后变为：1,000。 <br>
此时，需要使用&ldquo;c&rdquo;函数转一下才行。 <br>
如； <br>
id={product.id?c} 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Freemarker">Freemarker</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/747ac3947ae83f41d0135e64.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-05  11:32</pubDate>
        <category><![CDATA[Freemarker]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/747ac3947ae83f41d0135e64.html</guid>
</item>

<item>
        <title><![CDATA[HTML固定表头Table 简单实现]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/f9ae3dd06be529329a502744.html]]></link>
        <description><![CDATA[
		
		IE:<br>
&lt;div style=&quot;height: 250px; overflow: auto;&quot;&gt;<br>
&lt;table border=1&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;tr  style=&quot;background-color:red;position:relative;top:expression(this.offsetParent.scrollTop);&quot;&gt;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &lt;th&gt;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  head<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &lt;/th&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;/tr&gt;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  。。。。。。。<br>
&lt;/table&gt;<br>
&lt;/div&gt;<br>
<br>
firefox:<br>
&lt;div style=&quot;height: 250px; overflow: auto;&quot;&gt;<br>
&lt;table border=1&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;tr  style=&quot;position:fixed;background-color:red;&quot;&gt;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &lt;th&gt;<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  head<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &lt;/th&gt;<br>
&nbsp;&nbsp;&nbsp;  &lt;/tr&gt;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  。。。。。。。<br>
&lt;/table&gt;<br>
&lt;/div&gt;<br>
<br>
如果有一些空隙&nbsp;&nbsp;  请使用padding 调节。在IE中也可以 top:expression(this.offsetParent.scrollTop-2)这样调节。<br> <a href="http://hi.baidu.com/annleecn/blog/item/f9ae3dd06be529329a502744.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Http%20Html">Http Html</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/f9ae3dd06be529329a502744.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-04  16:47</pubDate>
        <category><![CDATA[Http Html]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/f9ae3dd06be529329a502744.html</guid>
</item>

<item>
        <title><![CDATA[Apache mod_jk 的JkMount与JkUnMount差别]]></title>
        <link><![CDATA[http://hi.baidu.com/annleecn/blog/item/ea59b213594a49c4c2fd786f.html]]></link>
        <description><![CDATA[
		
		<p>用过Apache 与 tomcat 或Jboss集成的朋友都晓得mdo JK,这里我说说它配置JkMount与JkUnMount的差别.</p>
<p>JkMount把匹配的转发到指定服务器. <br>
JkUnMount把匹配的不转发到指定服务器. <br>
<strong>JkUnMount选项的级别高于JkMount</strong>. <br>
单独有JkMount规则有效,但<strong>单独有JkUnMount无效</strong>,JkUnMount与JkMount要成对出现.</p>
<p>例子: <br>
&nbsp;&nbsp;&nbsp;  JkMount /* worker1  #通过JkMount把页面都交给worker1  服务器 <br>
&nbsp;&nbsp;&nbsp;  JkUnMount /*.html worker1 #通过JkUnMount/*.html,表示所有*.html不交给worker1服务器处理 <br>
&nbsp;&nbsp;&nbsp;  JkUnMount /*.php worker1#通过JkUnMount/*.php,表示所有*.html不交给worker1服务器处理 <br>
&nbsp;&nbsp;&nbsp;  JkUnMount /*.gif worker1 <br>
&nbsp;&nbsp;&nbsp;  JkUnMount /*.swf worker1 <br>
&nbsp;&nbsp;&nbsp;  JkUnMount /*.bmp worker1 <br>
&nbsp;&nbsp;&nbsp;  JkUnMount /*.png worker1 <br>
&nbsp;&nbsp;&nbsp;  JkUnMount /*.css worker1</p> <a href="http://hi.baidu.com/annleecn/blog/item/ea59b213594a49c4c2fd786f.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/annleecn/blog/category/Apache%20Tomcat%20Jboss">Apache Tomcat Jboss</a>&nbsp;<a href="http://hi.baidu.com/annleecn/blog/item/ea59b213594a49c4c2fd786f.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-02  13:32</pubDate>
        <category><![CDATA[Apache Tomcat Jboss]]></category>
        <author><![CDATA[annleecn]]></author>
		<guid>http://hi.baidu.com/annleecn/blog/item/ea59b213594a49c4c2fd786f.html</guid>
</item>


</channel>
</rss>