??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品蜜芽亚洲国产AV,国产v亚洲v天堂a无,亚洲色大成网站WWW久久九九http://www.tkk7.com/ltc603/archive/2007/04/09/109492.html阿成阿成Mon, 09 Apr 2007 12:52:00 GMThttp://www.tkk7.com/ltc603/archive/2007/04/09/109492.htmlhttp://www.tkk7.com/ltc603/comments/109492.htmlhttp://www.tkk7.com/ltc603/archive/2007/04/09/109492.html#Feedback1http://www.tkk7.com/ltc603/comments/commentRss/109492.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/109492.html cL悄悄地出现在 Java q_版本 1.2 中的。虽然支持线E局部变量早是许多U程工具Q例?Posix 工具Q的一部分Q但 Java Threads API 的最初设计却没有q项有用的功能。而且Q最初的实现也相当低效。由于这些原因, 极少受到xQ但对简化线E安全ƈ发程序的开发来_它却是很方便的。在 L使用U程的第 3 部分QJava 软gN Brian Goetz 研究? q提供了一些用技巧?

参加 Brian ?多线E?Java ~程讨论论坛以获得您工程中的U程和ƈ发问题的帮助?

~写U程安全cL困难的。它不但要求仔细分析在什么条件可以对变量q行dQ而且要求仔细分析其它c能如何使用某个cR?有时Q要在不影响cȝ功能、易用性或性能的情况下使类成ؓU程安全的是很困隄。有些类保留从一个方法调用到下一个方法调用的状态信息,要在实践中ɘq样的类成ؓU程安全的是困难的?/p>

理非线E安全类的用比试图使类成ؓU程安全的要更容易些。非U程安全c通常可以安全地在多线E程序中使用Q只要您能确保一个线E所用的cȝ实例不被其它U程使用。例如,JDBC cL非线E安全的 ?两个U程不能在小_度U上安全地共享一? ?但如果每个线E都有它自己? Q那么多个线E就可以同时安全地进行数据库操作?

不? 为每个线E维护一个单独的 JDBC q接Q或M其它对象Q当然是可能的;Thread API l了我们把对象和U程联系h所需的所有工兗?ThreadLocal 则我们能更Ҏ地把U程和它的每U程Qper-threadQ数据成功地联系h?

什么是U程局部变量(thread-local variableQ?

U程局部变?/em>高效Cؓ每个使用它的U程提供单独的线E局部变量值的副本。每个线E只能看C自己相联pȝ|而不知道别的U程可能正在使用或修改它们自q副本。一些编译器Q例?Microsoft Visual C++ ~译器或 IBM XL FORTRAN ~译器)用存储类别修饰符Q像 ? Q把对线E局部变量的支持集成C其语a中。Java ~译器对U程局部变量不提供特别的语a支持Q相反地Q它? cd现这些支持, cM有这个类的特别支持?

因ؓU程局部变量是通过一个类来实现的Q而不是作?Java 语言本n的一部分Q所?Java 语言U程局部变量的使用语法比内建线E局部变量语a的用语法要W拙一些。要创徏一个线E局部变量,请实例化c? 的一个对象? cȝ行ؓ? 中的各种 cȝ行ؓ很相| cd当存储或索一个值时的间接句柄。清?1 昄? 接口?


清单 1. ThreadLocal 接口

            public class ThreadLocal {
            public Object get();
            public void set(Object newValue);
            public Object initialValue();
            }
            

讉K器检索变量的当前U程的| 讉K器修改当前线E的倹{? Ҏ是可选的Q如果线E未使用q某个变量,那么您可以用q个Ҏ来设|这个变量的初始|它允许gq初始化。用一个示例实现来说明 ThreadLocal 的工作方式是最好的Ҏ。清?2 昄? 的一个实现方式。它不是一个特别好的实玎ͼ虽然它与最初实现非常相|Q所以很可能性能不佳Q但它清楚地说明?ThreadLocal 的工作方式?


清单 2. ThreadLocal 的糟p实?/font>

            public class ThreadLocal {
            private Map values = Collections.synchronizedMap(new HashMap());
            public Object get() {
            Thread curThread = Thread.currentThread();
            Object o = values.get(curThread);
            if (o == null && !values.containsKey(curThread)) {
            o = initialValue();
            values.put(curThread, o);
            }
            return o;
            }
            public void set(Object newValue) {
            values.put(Thread.currentThread(), newValue);
            }
            public Object initialValue() {
            return null;
            }
            }
            

q个实现的性能不会很好Q因为每? ? 操作都需? 映射表上的同步,而且如果多个U程同时讉K同一? Q那么将发生争用。此外,q个实现也是不切实际的,因ؓ? 对象? 映射表中的关键字导致无法在U程退出后? q行垃圾回收Q而且也无法对ȝE的 的特定于U程的D行垃圑֛收?





回页?/u>


?ThreadLocal 实现每线E?Singleton

U程局部变量常被用来描l有状?#8220;单子”QSingletonQ?或线E安全的׃n对象Q或者是通过把不安全的整个变量封装进 Q或者是通过把对象的特定于线E的状态封装进 。例如,在与数据库有紧密联系的应用程序中Q程序的很多Ҏ可能都需要访问数据库。在pȝ的每个方法中都包含一? 作ؓ参数是不方便???#8220;单子”来访问连接可能是一个虽然更_糙Q但却方便得多的技术。然而,多个U程不能安全地共享一?JDBC 。如清单 3 所C,通过使用“单子”中的 Q我们就能让我们的程序中的Q何类Ҏ地获取每U程 的一个引用。这P我们可以认ؓ 允许我们创徏 每线E单?/em>?


清单 3. 把一?JDBC q接存储C个每U程 Singleton ?/font>

            public class ConnectionDispenser {
            private static class ThreadLocalConnection extends ThreadLocal {
            public Object initialValue() {
            return DriverManager.getConnection(ConfigurationSingleton.getDbUrl());
            }
            }
            private ThreadLocalConnection conn = new ThreadLocalConnection();
            public static Connection getConnection() {
            return (Connection) conn.get();
            }
            }
            

M创徏的花Ҏ使用的花费相Ҏ贵些的有状态或非线E安全的对象Q例?JDBC 或正则表辑ּ匚w器,都是可以使用每线E单子(singletonQ技术的好地斏V当Ӟ在类DL地方Q您可以使用其它技术,例如用池Q来安全地管理共享访问。然而,从可伸羃性角度看Q即使是用池也存在一些潜在缺陗因为池实现必须使用同步Q以l护池数据结构的完整性,如果所有线E用同一个池Q那么在有很多线E频J地Ҏq行讉K的系l中Q程序性能因争用而降低?





回页?/u>


?ThreadLocal 化调试日志纪?/font>

其它适合使用 但用池却不能成ؓ很好的替代技术的应用E序包括存储或篏U每U程上下文信息以备稍后检索之用这L应用E序。例如,假设您想创徏一个用于管理多U程应用E序调试信息的工兗您可以用如清单 4 所C的 cM为线E局部容器来累积调试信息。在一个工作单元的开_您清I容器,而当一个错误出现时Q您查询该容器以索这个工作单元迄今ؓ止生成的所有调试信息?


清单 4. ?ThreadLocal 理每线E调试日?/font>

            public class DebugLogger {
            private static class ThreadLocalList extends ThreadLocal {
            public Object initialValue() {
            return new ArrayList();
            }
            public List getList() {
            return (List) super.get();
            }
            }
            private ThreadLocalList list = new ThreadLocalList();
            private static String[] stringArray = new String[0];
            public void clear() {
            list.getList().clear();
            }
            public void put(String text) {
            list.getList().add(text);
            }
            public String[] get() {
            return list.getList().toArray(stringArray);
            }
            }
            

在您的代码中Q您可以调用 来保存您的程序正在做什么的信息Q而且Q稍后如果有必要Q例如发生了一个错误)Q您能够Ҏ地检索与某个特定U程相关的调试信息?与简单地把所有信息{储到一个日志文Ӟ然后努力扑և哪个日志记录来自哪个U程Q还要担心线E争用日志纪录对象)相比Q这U技术简便得多,也有效得多?

在基?servlet 的应用程序或工作单元是一个整体请求的M多线E应用程序服务器中也是很有用的,因ؓ在处理请求的整个q程中将要用到单个线E。您可以通过前面讲述的每U程单子技术用 变量来存储各U每hQper-requestQ上下文信息?





回页?/u>


ThreadLocal 的线E安全性稍差的堂兄弟,InheritableThreadLocal

ThreadLocal cL一个亲戚,InheritableThreadLocalQ它以相似的方式工作Q但适用于种cd全不同的应用E序。创Z个线E时如果保存了所? 对象的|那么q些g自动传递给子线E。如果一个子U程调用 ? Q那么它与它的父线E看到同一个对象。ؓ保护U程安全性,您应该只对不可变对象Q一旦创建,其状态就永远不会被改变的对象Q? Q因为对象被多个U程׃n? 很合适用于把数据从父U程传到子线E,例如用户标识Quser idQ或事务标识Qtransaction idQ,但不能是有状态对象,例如 JDBC ?





回页?/u>


ThreadLocal 的性能

虽然U程局部变量早已赫赫有名ƈ被包?Posix 规范在内的很多线E框架支持,但最初的 Java U程设计中却省略了它Q只是在 Java q_的版?1.2 中才d上去。在很多斚wQ? 仍在发展之中Q在版本 1.3 中它被重写,版本 1.4 中又重写了一ơ,两次都专门是Z性能问题?

?JDK 1.2 中, 的实现方式与清单 2 中的方式非常怼Q除了用同步 代替 来存?values 之外。(以一些额外的性能开销ZP使用 WeakHashMap 解决了无法对 Thread 对象q行垃圾回收的问题。)不用_ 的性能是相当差的?

Java q_版本 1.3 提供? 版本已经量更好了;它不使用M同步Q从而不存在可׾~性问题,而且它也不用弱引用。相反地Qh们通过l? d一个实例变量(该变量用于保存当前线E的从线E局部变量到它的值的映射? Q来修改 cM支持 。因为检索或讄一个线E局部变量的q程不涉及对可能被另一个线E读写的数据的读写操作,所以您可以不用M同步实? ? 。而且Q因为每U程值的引用被存储在自已? 对象中,所以当? q行垃圾回收Ӟ也能对该 的每U程D行垃圑֛收?

不幸的是Q即使有了这些改q,Java 1.3 中的 的性能仍然出奇地慢。据我的_略量Q在双处理器 Linux pȝ上的 Sun 1.3 JDK 中进? 操作Q所耗费的时间大U是无争用同步的两倍。性能q么差的原因? Ҏ的花贚w常大Q占? q行旉的三分之二还多。虽然有q些~点QJDK 1.3 仍然比争用同步快得多Q所以如果在M存在严重争用的地方(可能是有非常多的U程Q或者同步块被频J地执行Q或者同步块很大Q, 可能仍然要高效得多?

?Java q_的最新版本,即版?1.4b2 中, ? 的性能都有了很大提高。有了这些提高, 应该比其它技术,如用池,更快。由于它比其它技术更单,也更不易出错Qh们最l将发现它是避免U程间出C希望的交互的有效途径?





回页?/u>


ThreadLocal 的好?/font>

能带来很多好处。它常常是把有状态类描绘成线E安全的Q或者封装非U程安全cM使它们能够在多线E环境中安全C用的最Ҏ的方式。? 使我们可以绕qؓ实现U程安全而对何时需要同步进行判断的复杂q程Q而且因ؓ它不需要Q何同步,所以也改善了可伸羃性。除单之外,? 存储每线E单子或每线E上下文信息在归档方面还有一个颇有h值好??通过使用 Q存储在 中的对象都是 ?/em>被线E共享的是清晰的Q从而简化了判断一个类是否U程安全的工作?

我希望您从这个系列中得到了乐,也学C知识Q我也鼓励您到我?讨论论坛中来深入研究多线E问题?



阿成 2007-04-09 20:52 发表评论
]]>
Web服务器开发环境下的线E安全问?/title><link>http://www.tkk7.com/ltc603/archive/2007/04/09/109490.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Mon, 09 Apr 2007 12:31:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2007/04/09/109490.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/109490.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2007/04/09/109490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/109490.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/109490.html</trackback:ping><description><![CDATA[<p>Servlet是在多线E环境下的。即可能有多个请求发l一个servelt实例Q每个请求是一个线E?<br>struts下的action也类|同样在多U程环境下。可以参考struts user guide: http://struts.apache.org/struts-action/userGuide/building_controller.html 中的Action Class Design Guidelines一? Write code for a multi-threaded environment - Our controller servlet creates only one instance of your Action class, and uses this one instance to service all requests. Thus, you need to write thread-safe Action classes. Follow the same guidelines you would use to write thread-safe Servlets. <br>?为多U程环境~写代码。我们的controller servlet指挥创徏你的Action cȝ一个实例,用此实例来服务所有的h。因此,你必ȝ写线E安全的ActioncR遵循与写线E安全的servlet同样的方针?<br><br>1.什么是U程安全的代?<br>在多U程环境下能正确执行的代码就是线E安全的?<br>安全的意思是能正执行,否则后果是程序执行错误,可能出现各种异常情况?/p> <p>2.如何~写U程安全的代?<br>很多书籍里都详细讲解了如何这斚w的问题,他们主要讲解的是如何同步U程对共享资源的使用的问题。主要是对synchronized关键字的各种用法Q以及锁的概c?<br>Java1.5中也提供了如d锁这cȝ工具cR这些都需要较高的技巧,而且相对难于调试?<br><br>但是Q线E同步是不得以的Ҏ,是比较复杂的,而且会带来性能的损失。等效的代码中,不需要同步在~写Ҏ度和性能上会更好些?<br>我这里强调的是什么代码是始终为线E安全的、是不需要同步的。如? <br>1)帔R始终是线E安全的Q因为只存在L作?<br>2)Ҏ造器的访?new 操作)是线E安全的Q因为每ơ都新徏一个实例,不会讉K׃n的资源?<br>3)最重要的是:局部变量是U程安全的。因为每执行一个方法,都会在独立的I间创徏局部变量,它不是共享的资源。局部变量包括方法的参数变量?<br>struts user guide里有Q?<br>Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class. <br>?只用用局部变量?-~写U程安全的代码最重要的原则就是,在ActioncM只用局部变量,不用实例变量?/p> <p><br>ȝQ?<br>在Java的Web服务器环境下开发,要注意线E安全的问题。最单的实现方式是在Servlet和Struts Action里不要用类变量、实例变量,但可以用类帔R和实例常量?<br>如果有这些变量,可以它们{换ؓҎ的参C入,以消除它们?<br>注意一个容易؜淆的地方Q被Servlet或Action调用的类?如值对象、领域模型类)中是否可以安全的使用实例变量Q如果你在每ơ方法调用时 <br>新徏一个对象,再调用它们的ҎQ则不存在同步问?--因ؓ它们不是多个U程׃n的资源,只有׃n的资源才需要同?--而Servlet和Action的实例对于多个线E是׃n的?<br>换句话说QServlet和Action的实例会被多个线E同时调用,而过了这一?如果在你自己的代码中没有另外启动U程Q且每次调用后箋业务对象旉是先新徏一个实例再调用Q则都是U程安全的?</p> <img src ="http://www.tkk7.com/ltc603/aggbug/109490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2007-04-09 20:31 <a href="http://www.tkk7.com/ltc603/archive/2007/04/09/109490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ActionServlet深入探讨http://www.tkk7.com/ltc603/archive/2007/04/06/108859.html阿成阿成Fri, 06 Apr 2007 01:48:00 GMThttp://www.tkk7.com/ltc603/archive/2007/04/06/108859.htmlhttp://www.tkk7.com/ltc603/comments/108859.htmlhttp://www.tkk7.com/ltc603/archive/2007/04/06/108859.html#Feedback0http://www.tkk7.com/ltc603/comments/commentRss/108859.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/108859.htmljava.lang.Object
  |
  +--javax.servlet.GenericServlet
        |
        +--javax.servlet.http.HttpServlet
              |
              +--org.apache.struts.action.ActionServlet

Struts提供了一个缺省版本的ActionServletc,你可以承这个类Q覆盖其中的一些方法来辑ֈ你的Ҏ处理的需要。ActionServletl承与javax.servlet.http.HttpServletQ所以在本质上它和一个普通的servlet没有区别Q你完全可以把它当做一个servlet来看待,只是在其中完成的功能不同|了。ActionServlet主要完成如下功能Q?br>
一个来自客L的URI映射C个相应的Actionc?br>
  • 如果是这个ActioncLW一ơ被调用Q那么实例化一个ƈ攑օ~存
  • 如果在配|文?struts-config.xml)中指定了相应的ActionFormQ那么从Request中抓取数据填充FormBean
  • 调用q个Actioncȝperform()ҎQ传入ActionMapping的一个引用,对应的ActionForm、以及由容器传给ActionServlet的HttpServletRequest、HttpServletResponse对象?/li>


省版本的ActionServlet会从配置文gweb.xml中读取如下初始化参数Q?br>
  • application
    应用使用的资源包(resources bundle)的基c?br>
  • factory
    用于创徏应用的MessageResources对象的MessageResourcesFactory的类名。确省是org.apache.struts.util.PropertyMessageResourcesFactory?br>
  • config
    Struts的配|文Ӟ省?WEB-INF/struts-config.xml。注意这儿是与应用Context兌的相对\径?br>
  • content
    定义了确省的内容cd和编码格式,它会被自动地被设|到每个response中,如果JSP/Servlet中没有明的讄。确省是text/html?br>
  • debug
    调试信息的别。默认ؓ0Q比当前U别高的调试信息会被log到日志文件中?br>
  • detail
    与debug的作用类|只是q个detail是initMapping()时专用的。调试信息会被打印到System.outQ而不是日志文件?br>
  • formBean
    ActionFormBean的实现类Q确省ؓorg.apache.struts.action.ActionFormBean
  • forward
    应用中用的ActionForwardc,省是org.apache.struts.action.ActionForward?br>
  • locale
    指定了确省用的Locale对象。设为trueQ当得到一个sessionӞ会自动在session中存储一个以Action.LOCALE_KEY标示的Locale对象Q如果session中还没有与Action.LOCALE_KEYl定的Locale对象?br>
  • mapping
    应用中用的ActionMappingc,省是org.apache.struts.action.ActionMapping?br>
  • multipartClass
    文g上传使用的MutipartRequestHandler的实现类。确省ؓorg.apache.struts.upload.DiskMultipartRequestHandler
  • nocache
    如果设ؓtrueQ那么ActionServlet会自动在每个到客L的响应中dnocache的HTML_q样客户端就不会对应用中的页面进行缓存。确省ؓfalse
  • null
    如果讄为trueQ那么应用在得到一个未定义的message资源Ӟ会返回nullQ而不是返回一个错误信息。确省是true?br>
  • maxFileSize
    文g上传的大上限,省?50M
  • bufferSize
    文g上传时的~冲区的大小Q确省ؓ4M
  • tempDir
    讄用于上传时的临时目录。工作目录会作ؓ一个Servlet环境QContextQ的属性提供?br>
  • validate
    Are we using the new configuration file format?省为true?br>
  • validating

在解析配|XML文g是是否进行有效性的验证。确省ؓtrue

ActionServlet中应用了命o设计模式?br>
一个Servlet在由容器生成Ӟ首先会调用init()Ҏq行初始化,在接C个HTTPhӞ调用相应的方法进行处理;比如GETh调用doGet()ҎQPOSTh调用doPost()Ҏ。所以首先看看ActionServlet的init()ҎQ你׃很清楚ؓ什么ActionServlet可以完成q些功能了?br>

init()


在它的init()Ҏ中,ActionServlet依次调用如下protected的方法完成初始化Q?br>
  • initActions() Q?nbsp;    大家可能q曾有这个疑问:StrutsZ么可以找C个请求URI对应的actioncdQ答案就在这儿,ActionServlet有一个actions属性,cd为org.apache.struts.util.FastHashMapQ用于存储以cȝ全名为key的已实例化的ActioncR在init()旉先调用的是initActions()ҎQ在q个Ҏ中只是简单的清除map中的所有的名值对Q?br>
    1.         synchronized (actions) {
    2.             actions.setFast(false);
    3.             actions.clear();
    4.             actions.setFast(true);
    5.         }

    首先把actions设ؓslow模式Q这时对FastHashMap的访问是U程同步的,然后清除actions中的所有的已存在的?值对Q最后再把actions的模式设为fast。由于FastHashMap是struts在java.util.HashMap的基上的一个扩展类Q是Z适应多线E、ƈ且对HashMap的访问大部分是只ȝҎ环境的需要。大家知道java.util.HashMap是非U程安全的,所以HashMap一般适用于单U程环境下。org.apache.struts.FastHashMap是l承于java.util.HashMapQ在其中d多线E的支持产生的。在fast模式下的工作方式是这LQ读取是非线E同步的Q写入时首先克隆当前mapQ然后在q个克隆上做写入操做Q完成后用这个修改后的克隆版本替换原来的map。那么在什么时候会把ActionscL加到q个map中呢Q我们已l提Cstruts是动态的生成Actioncȝ实例的,在每ơActionServlet接收C个GET或POST的HTTPhӞ会在q个map中查扑֯应的Actioncȝ实例Q如果不存在Q那么就实例化一个,q放入map中。可见这个actions属性vC对Actioncd例的~存的作用?br>
  • initInternal() Q?nbsp;    初始化ActionServlet内部使用的资源包MessageResourcesQ用MessageResources.getMessageResources(internalName)得到    internalName?org.apache.struts.action.ActionResources"对应的ActionResources.properties文g。这个资源包主要用于ActionServlet处理q程中的用到的提CZ息,q儿不展开讨论?br>
  • initDebug() Q?nbsp;    从web.xml中读取本应用的debugU别参数getServletConfig().getInitParameter("debug")Q然后赋ldebug属性?br>
  • initApplication()Q?nbsp;   初始化应用资源包Qƈ攄入ServletContext中?br>
    1.         String factory =getServletConfig().getInitParameter(“factory”);    
    2.         String oldFacory = MessageResourcesFactory.getFactoryClass();
    3.         if (factory !=null)
    4.                 MessageResourcesFactory.setFactoryClass(factory);
    5.         String value = getServletConfig().getInitParameter("application");
    6.         MessageResourcesFactory factoryObject =
    7.                 MessageResourcesFactory.createFactory();
    8.         application = factoryObject.createResources(value);
    9.         MessageResourcesFactory.setFactory(oldFactory); 
    10.         getServletContext().setAttribute(Action.MESSAGES_KEY, application);

    说明Q文中引用的代码片断可能会省略了一些例外检查等非主U的内容Q敬h意?br>
    首先从配|文件中dfactory参数Q如果这个参C为空Q那么就在MessageResourcesFactory中用这个指定的Factoryc;否则Q用默认的工厂corg.apche.struts.util.PropertyMessageResourceFactory。然后调用MessageResourcesFactory的静态createFactory()ҎQ生成一个具体的MessageResourceFactory对象Q注意:MessageResourcesFactory是抽象类Q。这样就可以调用q个具体的MessageResourceFactory的createResource()Ҏ得到配置文g(web.xml)中定义的资源文g了?br>上面的application对象cd为MessageResources。在web.xml中在配置ActionServlet时可以指定一个特定的工厂cR不能直接MessageResourcesFactory的createResources()ҎQ因个方法是abstract的。创建factoryObject的过E如下:
    1.     
    2.         MessageResourceFactory factoryObject=
    3.                 MessageResourcesFactory.createFactory();
    4.         application = factoryObject.createResources(value);

    <li>initMapping() Q?nbsp;   为应用初始化mapping信息ActionServlet有一个protected的属性:mappingQ封装了一个ActionMapping的对象集合,以便于管理、查找ActionMapping。mappings是org.apache.struts.action.ActionMappingscȝ实例。主要有两个ҎQaddMapping(ActionMapping mapping)和findMapping(String path)。ActionMapping也是使用上面提到的org.apache.struts.util.FastHashMapcL存储所有的ActionMapping对象?br>
    1.         mappings.setServlet(this);
    2.         ……
    3.         // Initialize the name of our ActionFormBean implementation class
    4.         value = getServletConfig().getInitParameter("formBean");
    5.         if (value != null)
    6.             formBeanClass = value;
    7.     
    8.         // Initialize the name of our ActionForward implementation class
    9.         value = getServletConfig().getInitParameter("forward");
    10.         if (value != null)
    11.                 forwardClass = value;
    12.         // Initialize the name of our ActionMapping implementation class
    13.         value = getServletConfig().getInitParameter("mapping");
    14.         if (value != null)
    15.                 mappingClass = value;

    在initMapping()中,首先链接mappings对象到本servlet实例。其实这句话的作用很单,在ActionMappings中会有一个ActionServletcd的属性,q个属性就界定了这个ActionMappings对象所属的ActionServlet。Struts的实现比较灵z,其中的ActionFormBean、ActionForward、ActionMappingcM完全可以使用自己实现的子c,来定制Struts的工作方式。上面的代码׃配置文gQweb.xmlQ中dformBean、forward、mapping参数Q这些参数就是你定制的ActionFormBean、ActionForward、ActionMappingcd?br>
    1.         // Initialize the context-relative path to our configuration resources
    2.         value = getServletConfig().getInitParameter("config");
    3.         if (value != null)
    4.                 config = value;
    5.                 // Acquire an input stream to our configuration resource
    6.         InputStream input = getServletContext().getResourceAsStream(config);
    7.         Digester digester = null;
    8.                 digester = initDigester(detail);
    9.         try {
    10.                 formBeans.setFast(false);
    11.                 forwards.setFast(false);
    12.                 mappings.setFast(false);
    13.                 digester.parse(input);
    14.                 mappings.setFast(true);
    15.                 forwards.setFast(true);
    16.                 formBeans.setFast(true);
    17.         } catch (SAXException e) {
    18.                 throw new ServletException
    19.         (internal.getMessage("configParse", config), e);
    20.         } finally {
    21.                 input.close();
    22.         }

    从web.xmldStruts的配|文件的位置。用org.apache.struts.digester.Digester解析config参数标示的配|文Ӟ通常?#8220;/WEB-INF/struts-config.xml”Q解析出所有的data-source、form-bean、action-mapping、forward。从上面的程序片断看刎ͼDigester仅仅调用了一个parse()ҎQ那么,Digester是怎样把解析struts-config.xml文gq把解析的结果form-bean{信息存储到属性变量formBeans{中的呢Q你可以注意到在调用digester.parse(InputStream)之前Q首先调用了initDigester()ҎQ?br>
    1.         Digester digester = new Digester();
    2.         digester.push(this);
    3.         digester.addObjectCreate("struts-config/action-mappings/action",
    4.                                  mappingClass, "className");
    5.         digester.addSetProperties("struts-config/action-mappings/action");
    6.         digester.addSetNext("struts-config/action-mappings/action",
    7.                             "addMapping",
    8.                             "org.apache.struts.action.ActionMapping");
    9.         digester.addSetProperty
    10.             ("struts-config/action-mappings/action/set-property",
    11.              "property""value");

    在这个方法中首先生成一个Digester对象Q然后设|解析的规则和回调,如果你对XML、SAX不是很熟Q这儿不必纠~太深。要注意的是addSetNext()ҎQ设|了每一个要解析元素的Set Next回调ҎQ而这个方法就是由digester解析器的父提供的。上面的片断中的“addMapping”是ActionServlet本n定义的一个方法,由Digester回调。Digester是c此把解析出的每一个FormBean、ActionForward、ActionMapping{存储到属性变量formBeans、forwards、mappings{中的?br>
  • initUpload() Q?nbsp;   初始化有关Upload的一些参敎ͼ比如QbufferSize、tempDir?br>
  • initDataSource() Q取出在initMapping()中从配置文g中读取的每一个DataSourceQ设|LogWriterQ如果ؓGenericDataSource的实例,则打开数据源。然后,把每个dataSource攑օContext中?br>dataSource.setLogWriter(scw)Q?br>((GenericDataSource)dataSource).open();
    getServletContext().setAttribute(key,dataSource);
  • initOther() Q?nbsp;       讄其它未初始化的的参敎ͼcontent、locale、nocacheQ,q发布formBeans、forwards、mappings到ContextQ?br>getServletContext().setAttribute(Action.FORM_BEANS_KEY, formBeans);
    getServletContext().setAttribute(Action.FORWARDS_KEY, forwards);
    getServletContext().setAttribute(Action.MAPPINGS_KEY, mappings);
  • initServlet() Q?nbsp;   初始化Controller Servlet的Servlet Mapping。这儿也使用了Digester工具Q扫描web.xml所有的<web-app/servlet-mapping>Q寻找servlet-name与当前Servlet相同的mappingQ置入Context。代码如下;
    1.         Digester digester = new Digester();
    2.         digester.push(this);
    3.         digester.setDebug(debug);
    4.         digester.setValidating(validating);
    5.         digester.addCallMethod(“web-appservlet-mapping”,“addServletMapping”, 2);
    6.         digester.addCallParm(“web-appservlet-mappingservlet-name”, 0);
    7.         digester.addCallParm(“web-appservlet-mappingurl-pattern”, 1);
    8.         InputStream is = getServletContext().getResourceAsStream(“/WEB-INFweb.xml”);
    9.         digester.parse(is); 
    10.         getServletContext().setAttribute(Action.SERVLET_KEY,servletMapping);


阿成 2007-04-06 09:48 发表评论
]]>
CSS全攻略-?/title><link>http://www.tkk7.com/ltc603/archive/2006/10/25/77265.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Wed, 25 Oct 2006 11:11:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/10/25/77265.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/77265.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/10/25/77265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/77265.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/77265.html</trackback:ping><description><![CDATA[ <div style="MARGIN-TOP: 5px; MARGIN-LEFT: 15px"> <b>关键?</b>   转脓     </div> <div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px"> <table width="100%"> <tbody> <tr> <td> <p>CSS全称Cascading Style Sheet。层叠式样式表。从三年前就开始用CSS了,但一直以来都看了它。CSS的出现其实是一ơ革命,它试囑ְ|站的内容与表现分开?<br />一、CSS的四U实现方式: <br />1.内嵌式:</p> <p>2.外链式:</p> <p>3.导入?/p> <p>3.属性式Q?<br />?CSS的定义: <br />选择对象{属?:?;属?:?;属?:?;属性n:值n……} <br />如: <br />td{font-size:12px;color:#FFFF00} <br />.myname{font-size:12px;color:#FFFF00} <br />a:hover{font-size:12px;color:#FFFF00;text-decoration: underline;} <br />?四种选择对象 <br />1.HTML selector (TagName) <br />2.class selector (.NAME) <br />3.ID selector (#IDname) <br />4.Ҏ对象 (a:hover a:link a:visited a:active) <br />1.HTML selector <br />HTML selector是HTML的置标符Q如QDIV、TD、H1。HTML selector的作用范围是应用了该样式的所有页面中的所有该|标W?<br />例: <br />td <br />{ color: #FF0000; <br />} <br />--> <br />注意Q在中没有应用什么,其中文字自动变红艌Ӏ?<br />2.class selector <br />定义class selector需要往其名U其加一个点?”。如?classname”。class selector的作用范围是所有包含“class="classname"”的|标W?<br />例: <br />.fontRed <br />{ color: #FF0000; <br />} --> <br />注意Q在W二个中没有“class="fontRed"”,所以文字没有变U色?<br />3.ID selector <br />定义ID selector需要往其名U其加一个点?”。如?IDname”。ID selector的作用范围是所有包含“ID="classname"”的|标W?<br />例:</p> <p>#fontRed <br />{ color: #FF0000; <br />} --> <br />注意Q在W二个中没有“ID="fontRed"”,所以文字没有变U色?<br />4.Ҏ对象 <br />Ҏ对象包括四种Q是针对链接对象讄? <br />a:hover 鼠标UM时的链?<br />a:link 常规Q非讉K链?<br />a:visited 讉Kq的链?<br />a:active 鼠标点击时的链?<br />Ҏ对象的作用范围是所有置标符Q这句话有待商榷Q因Z面很快就有一U方法可以把“所有”两个字推翻Q?<br />例: <br />a:hover <br />{ color: #0000FF; <br />text-decoration: underline; <br />} --> <br />注意下面Q很有用Q!Q?<br />a.classname:hover <br />a#IDname:hover <br />q两U写法,是分别配?classname?IDname使用的。它的作用范围变成了所有包含“class="classname"”或“ID="IDname"”的|标W。这U写法,可以帮助你在同一面中实现多Ua:hover效果Q可以看一下艺|的主页上导航栏文字与普通文章标题在鼠标时的区别?<br />?应用Q?<br />1.|标W 自动应用 <br />2.特制cRclass="NAME" <br />3.ID ID="IDname" <br />4.Ҏ对象 自动应用 <br />?CSS属?<br />CSS的属性有很多Q像上文中用到最多的colorQ表C文字的颜色。background-color表示背景艌Ӏ这个是最主要的,但是因ؓ没有什么难度,参考一下相x册就可以了?/p> <p>注明两点 <br />W一点:css的方式现在一般都采用外部q接Q这个用h方便Q编译v来也方便 <br />W二点:我用的是frontpage2003Q很多css的参数都会自动提C,g好像以前我没有用到过~~dw有的</p> <p>CSS 标签属?属性参?<br />q里列出了目前支持的样式?CSS)标签属性。标有星?*)的标{ֱ性可?Microsoft] Internet Explorer 5 中用。标有两个星?**)的标{ֱ性可?Internet Explorer 5.5 中用。带有两个加?++)的标{ֱ性可?Internet Explorer 6 中用。如果某个标{ֱ性或属性已l提交给万维|协?W3C)但尚未作为标准发布,则标有“已提交”。若某个标签属性或属性既未提交给 W3C 也不是标准,标有“扩展”?/p> <p>CSS 标签属?属?/p> <p>行ؓ属?behavior</p> <p>字体和文本属?direction* </p> <p>direction <br />font <br />font-family <br />font-size <br />font-style <br />font-variant <br />font-weight <br />ime-mode <br />layout-grid <br />layout-grid-char <br />layout-grid-line <br />layout-grid-mode <br />layout-grid-type <br />letter-spacing <br />line-break <br />line-height <br />min-height ++ <br />ruby-align <br />ruby-overhang <br />ruby-position <br />text-align <br />text-autospace <br />text-decoration <br />text-indent <br />text-justify <br />text-kashida-space <br />text-overflow ++ <br />text-transform <br />text-underline-position <br />unicode-bidi <br />vertical-align <br />white-space** <br />word-break <br />word-spacing ++(?Macintosh 版本 4.0 中可? <br />word-wrap <br />writing-mode</p> <p>颜色和背景属?background-attachment <br />background-color <br />background-image <br />background-position <br />background-position-x <br />background-position-y <br />background-repeat <br />color </p> <p>版面属?border <br />border-bottom <br />border-bottom-color <br />border-bottom-style <br />border-bottom-width <br />border-collapse* <br />border-color <br />border-left <br />border-left-color <br />border-left-style <br />border-left-width <br />border-right <br />border-right-color <br />border-right-style <br />border-right-width <br />border-style <br />border-top <br />border-top-color <br />border-top-style <br />border-top-width <br />border-width <br />clear <br />float <br />layout-flow <br />margin <br />margin-bottom <br />margin-left <br />margin-right <br />margin-top <br />padding <br />padding-bottom <br />padding-left <br />padding-right <br />padding-top <br />scrollbar-3dlight-color <br />scrollbar-arrow-color <br />scrollbar-base-color <br />scrollbar-darkshadow-color <br />scrollbar-face-color <br />scrollbar-highlight-color <br />scrollbar-shadow-color <br />table-layout* <br />zoom</p> <p>分类属?display </p> <p>list-style <br />list-style-image <br />list-style-position <br />list-style-type </p> <p>定位属?bottom* </p> <p>clip <br />height <br />left <br />overflow <br />overflow-x <br />overflow-y <br />position <br />right* <br />top <br />visibility <br />width <br />z-index </p> <p>打印属?page** </p> <p>pageBreakAfter <br />pageBreakBefore</p> <p>滤镜属?filter</p> <p>伪类和其它属?:active </p> <p>@charset <br />cursor <br />:first-letter** <br />:first-line** <br />@font-face <br />:hover <br />@import <br />!important <br />:link <br />@media* <br />@page** <br />:visited <br />有关表格Ҏ的css语法整理</p> <p>我们知道Dreamweaver在表格制作方面做得非常出Ԍ但是在某些时候还是必ȝ合css才能辑ֈ一些特定效果,下面我们先把有关表格Ҏ的css语法整理出来Q然后另外介l怎样用css化表格的边框?/p> <p>  有关表格Ҏ的css语法</p> <p>  具体内容包括Q上Ҏ宽度、右Ҏ宽度、下Ҏ宽度、左Ҏ宽度、边框宽度、边框颜艌Ӏ边框样式、上Ҏ、下Ҏ、左Ҏ、右Ҏ、边框、宽度、高度、有x{?/p> <p>   1.上边框宽?/p> <p>  语法: border-top-width: <?gt;</p> <p>  允许? thin | medium | thick | <长度></p> <p>  初始? medium</p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  上边框宽度属性用于指定一个元素上Ҏ的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在上边框、边框的宽度或边框的属性略写?/p> <p>  2.双框宽?/p> <p>  语法: border-right-width: <?gt;</p> <p>  允许? thin | medium | thick | <长度></p> <p>  初始? medium</p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  双框宽度属性用于指定元素的双框的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在双框、边框的宽度或边框的属性略写?/p> <p>   3.下边框宽?/p> <p>  语法: border-bottom-width: <?gt;</p> <p>  允许? thin | medium | thick | <长度></p> <p>  初始? medium</p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  下边框宽度属性用于指定元素的下边框的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在下边框、边框的宽度或边框的属性略写?/p> <p>   4.左边框宽?/p> <p>  语法: border-left-width: <?gt;</p> <p>  允许? thin | medium | thick | <长度></p> <p>  初始? medium</p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  左边框宽度属性用于指定元素的左边框的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在左边框、边框的宽度或边框的属性略写?/p> <p>  5.Ҏ宽度</p> <p>  语法: border-width: <?gt;</p> <p>  允许? [ thin | medium | thick | <长度> ]{1,4}</p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  Ҏ宽度属性用一到四个值来讄元素的边界,值是一个关键字或长度。不允许使用负值长度。如果四个值都l出了,它们分别应用于上、右、下和左Ҏ的式栗如果给Z个|它将被运用到各边上。如果两个或三个值给ZQ省略了的g对边相等?q个属性是上边框宽度、右Ҏ宽度、下Ҏ宽度和左Ҏ宽度属性的略写。也可以使用略写的边框属性?/p> <p>  6.Ҏ颜色</p> <p>  语法: border-color: <?gt;</p> <p>  允许? <颜色>{1,4}</p> <p>  初始? 颜色属性的?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  Ҏ颜色属性设|一个元素的Ҏ颜色。可以用一到四个关键字。如果四个值都l出了,它们分别应用于上、右、下和左Ҏ的式栗如果给Z个|它将被运用到各边上。如果两个或三个值给ZQ省略了的g对边相等。也可以使用略写的边框属性?/p> <p>  7.Ҏ样式</p> <p>  语法: border-style: <?gt;</p> <p>  允许? [ none | dotted | dashed | solid | double | groove | ridge | inset | outset ]{1,4}</p> <p>  初始? none</p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  Ҏ样式属性用于设|一个元素边框的样式。这个属性必ȝ于指定可见的Ҏ。可以用一到四个关键字。如果四个值都l出了,它们分别应用于上、右、下和左Ҏ的式栗如果给Z个|它将被运用到各边上。如果两个或三个值给ZQ省略了的g对边相等。也可以使用略写的边框属性?/p> <p>  noneQ无样式Q?<br />  dottedQ点U; <br />  dashedQ虚U; <br />  solidQ实U; <br />  doubleQ双U; <br />  grooveQ槽U; <br />  ridgeQ脊U; <br />  insetQ内凹; <br />  outsetQ外凸?<br />8.上边?/p> <p>  语法: border-top: <?gt;</p> <p>  允许? <上边框宽?gt; || <Ҏ式样> || <颜色></p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  上边框属性是一个用于设|一个元素上Ҏ的宽度、式样和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性?/p> <p>  9.双?/p> <p>  语法: border-right: <?gt;</p> <p>  允许? <双框宽?gt; || <Ҏ式样> || <颜色></p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  双框属性是一个用于设|一个元素右Ҏ的宽度、式栗和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性。   </p> <p>  10.下边?/p> <p>  语法: border-bottom: <?gt;</p> <p>  允许? <下边框宽?gt; || <Ҏ式样> || <颜色></p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  下边框属性是一个用于设|一个元素的下边框的宽度、式样和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性?/p> <p>  11.左边?/p> <p>  语法: border-left: <?gt;</p> <p>  允许? <左边框宽?gt; || <Ҏ式样> || <颜色></p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  左边框属性是一个用于设|一个元素左Ҏ的宽度、式样和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性?/p> <p>   12.Ҏ</p> <p>  语法: border: <?gt;</p> <p>  允许? <Ҏ宽度> || <Ҏ式样> || <颜色></p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  Ҏ属性是一个用于设|一个元素边框的宽度、式样和颜色的略写?/p> <p>  Ҏ声明的例子包括:</p> <p>  H2 { border: groove 3em } <br />  A:link { border: solid blue } <br />  A:visited { border: thin dotted #800080 } <br />  A:active { border: thick double red }</p> <p>  Ҏ属性只能设|四U边框;只能l出一l边框的宽度和式栗ؓ了给Z个元素的四种Ҏ的不同的||页制作者必ȝ一个或更多的属性,如:上边框、右Ҏ、下Ҏ、左Ҏ、边框颜艌Ӏ边框宽度、边框式栗上Ҏ宽度、右Ҏ宽度、下Ҏ宽度或左Ҏ宽度?</p> <p>  13.宽度</p> <p>  语法: width: <?gt;</p> <p>  允许? <长度> | <癑ֈ?gt; | auto</p> <p>  初始? auto</p> <p>  适用? 块和替换元?/p> <p>  向下兼容: ?/p> <p>  宽度属性的初始gؓ“auto”,即ؓ该元素的原有宽度(有就是元素自q宽度)。百分比参考上U元素的宽度。不允许使用负的长度倹{?/p> <p>  14.高度</p> <p>  语法: height: <?gt;</p> <p>  允许? <长度> | auto</p> <p>  初始? auto</p> <p>  适用? 块和替换元?/p> <p>  向下兼容: ?/p> <p>  高度属性的初始gؓ“auto”,即ؓ该元素的原有高度(有就是元素自q高度Q?。百分比参考上U元素的宽度。不允许使用负的长度倹{?/p> <p>  15.有关标签</p> <p>  tableQ表格标{,Ҏ个表格样式的定义要放在table中; <br />  tdQ单元格标签Q对单元格样式的定义要放在td中?</p> <p>css滤镜</p> <p>随着|页设计技术的发展Qh们已l不满于原有的一些HTML标记Q而是希望能够为页面添加一些多媒体属性,例如滤镜的和渐变的效果。CSS技术的飞快发展使这些需求成Z现实。从现在开始我要ؓ大家介绍一个新的CSS扩展部分QCSS滤镜属性(Filter Properties)。用这U技术可以把可视化的滤镜和{换效果添加到一个标准的HTML元素上,例如囄、文本容器、以及其他一些对象。对于o镜和渐变效果Q前者是基础Q因为后者就是o镜效果的不断变化和演C更ѝ当滤镜和渐变效果结合到一个基本的SCRIPT程序中后,|页设计者就可以拥有一个徏立动态交互文档的强大工具。也是CSS FILTER+ SCRIPTQ?q就说明惌建立动态的文档q要一些SCRIPT Q脚本语aQ的基础?<br />可视化o镜属性只能用在HTML控g元素上。所谓的HTMLI间元素是它们在页面上定义了一个矩形空_览器的H口可以昄q些I间。下面列ZHTML合法的控件和它们的说明?/p> <p>备注Q可惜只有IE4.0以上支持Q如果是别的览器,那就.......</p> <p>元素 说明 <br />BODY |页文档的主体元素,所有的可见范围都在<BODY>元素?<br />BUTTON 表单域的按钮Q可以有“发?submit)”、“重|?reset)”等形式 <br />DIV 定义了网上的一个区域,q个区域的高度、宽度或者绝对位|都是以知的 <br />IMG 囄元素Q通过指定“src"属性来指定囄的来?<br />INPUT 输入表单?<br />MARQUEE Ud字幕效果 <br />SPAN 定义了网上的一个区域,q个区域的高度、宽度或者绝对位|都是以知的 <br />TABLE 表格 <br />TD 表格数据单元?<br />TEXTAREA 文本区域 <br />TFOOT 多行输入文本?<br />TH 表格标题单元?<br />THEAD 表格标题 <br />TR 表格?</p> <p> </p> <p>IE4.0以上支持的o镜属性表</p> <p>滤镜效果 描述 <br />Alpha 讄透明?<br />Blru 建立模糊效果 <br />Chroma 把指定的颜色讄为透明 <br />DropShadow 建立一U偏Uȝp轮廓Q即投射阴媄 <br />FlipH 水^反{ <br />FlipV 垂直反{ <br />Glow 为对象的外边界增加光?<br />Grayscale 降低囄的彩色度 <br />Invert 色彩、饱和度以及亮度值完全反转徏立底片效?<br />Light 在一个对象上q行灯光投媄 <br />Mask Z个对象徏立透明?<br />Shadow 建立一个对象的Z轮廓Q即阴媄效果 <br />Wave 在X轴和Y轴方向利用正弦LUҎ乱图?<br />Xray 只显C对象的轮廓 </p> <p>1、Alpha 滤镜 <br /></p> <p>语法Q{FILTERQALPHA(opacity=opacity,finishopacity=finishopacity,style=style,startx=startx, <br />starty=starty,finishx=finishx,finishy=finishy)}</p> <p>"Alpha"属性是把一个目标元素与背景混合。设计者可以指定数值来控制混合的程度。这U“与背景混合”通俗地说是一个元素的透明度。通过指定坐标Q可以指定点、线、面的透明度。他们的参数含义分别如下Q?<br />“opacity"代表透明度水准。默认的范围是从0 ?100Q他们其实是癑ֈ比的形式。也是_0代表完全透明Q?00代表完全不透明。”finishopacity"是一个可选参敎ͼ如果惌讄渐变的透明效果Q就可以使用他们来指定结束时的透明度。范围也? ?100。“style" 参数指定了透明区域的Ş状特征。其?代表l一形状?代表UŞ?代表攑ְ状?代表长方形。”STARTX“和”STARTY“代表渐变透明效果的开始X和Y坐标。”FINISHX“和”FINISHY“代表渐变透明效果l束X和Y 的坐标?/p> <p>效果如下Q?/p> <p>2、Blur 滤镜</p> <p>语法Q对于HTMLQ{ilter:blur(add=add,direction=direction,strength=strength)} <br />对于Script语言Q?[oblurfilter=] object.filters.blur <br />用手指在一q尚未干透的油画上迅速划q时Q画面就会变得模p。”Blur"是产生同样的模p效果?<br />“ADD”参数是一个布判断“TRUEQ默认)”或者“FALSE”。它指定囄是否被改变成印象z模糊效果。模p效果是按顺旉的方向进行的Q“DIRECTION”参数用来设|模p的方向。其?度代表垂直向上,然后?5度ؓ一个单位。它的默认值是向左?70度。“STRENGTH“值只能用整数来指定Q她代表有多像素的宽度受到模p媄响。默认是5个。对于网上的字体,如果讄他的模糊”ADD=1“,那么q些字体的效果会非常好看的。如下: <br />filter:blur(add=ture,direction=135,strength=10Q?/p> <p>3、FlipH, FlipV 滤镜</p> <p>语法Q{filter:filph} ,{filter:filpv} 分别是水q_转和垂直反{Q具体如下:</p> <p>4、Chroma 滤镜</p> <p>语法Q{filter:chroma(color=color)} <br />使用”Chroma"属性可以设|一个对象中指定的颜色ؓ透明Ԍ参数COLOR卌透明的颜艌Ӏ下面是兰色文字Q然后用Chroma 滤镜qo掉兰Ԍ成了下面的样子?<br />filter:chroma(color=blue)</p> <p>滴水檐坊</p> <p>5、DropShadow 滤镜</p> <p>语法Q{filter:dropshadow(color=color,offx=ofx,offy=offy,positive=positive)}</p> <p>“DropShaow"֐思义是d对象的阴影效果。其工作原理是徏立一个偏U量Q加上较深?Color"代表投射阴媄的颜Ԍ"offx"?offy"分别是X方向和Y方向阴媄的饿偏移量?Positive"参数是一个布|如果为“TRUEQ非0Q”,那么׃ؓM的非透明像素建立可见的投影。如果ؓ“FASLEQ?Q”,那么׃ؓ透明的像素部分徏立透明效果</p> <p>6、Glow 滤镜</p> <p>语法Q{filter:glow(color=color,strength)} <br />当对一个对象?glow"属性后Q这个对象的边缘׃产生cM发光的效果。“COLOR”是指定发光的颜Ԍ“STRENGTH”则是强度的表现Q可以从1?55之间的Q何整数来指定q个力度?<br />filter:glow(color=red,strength=10) 后的效果 </p> <p>7、Gray ,Invert,Xray 滤镜</p> <p>语法Q{filter:gray} ,{filter:invert},{filter:xray}</p> <p>Gray滤镜是把一张图片变成灰度图QInvert滤镜是把对象的可视化属性全部翻转,包括色彩、饱和度、和亮度|Xray滤镜是让对象反映出它的轮廓ƈ把这些轮廓加亮,也就是所谓的“X”光片?/p> <p>效果如下Q?/p> <p>、Light 滤镜</p> <p>语法QFilter{light}</p> <p>q个属性模拟光源的投射效果。一旦ؓ对象定义了“LIGHT"滤镜属性,那么可以调用它的“方?Method)"来设|或者改变属性。“LIGHT"可用的方法有Q?/p> <p>AddAmbient 加入包围的光?<br />AddCone 加入锥Ş光源 <br />AddPoint 加入点光?<br />Changcolor 改变光的颜色 <br />Changstrength 改变光源的强?<br />Clear 清除所有的光源 <br />MoveLight Ud光源 <br />可以定义光源的虚拟位|,以及通过调整X轴和Y轴的数值来控制光源焦点的位|,q可以调整光源的形式Q点光源或者锥形光源)指定光源是否模糊边界、光源的颜色、亮度等属性。如果动态的讄光源Q可能回产生一些意想不到的效果。后面几会有具体范例?/p> <p>9、Mask 滤镜</p> <p>语法Q{filter:mask(color=color)}</p> <p>使用"MASK"属性可以ؓ对象建立一个覆盖于表面的膜Q其效果p戴者有色眼镜看物体一栗?/p> <p>10、Shadow 滤镜</p> <p>语法Q{filter:shadow(color=color,direction=direction)}</p> <p>利用“Shadow”属性可以在指定的方向徏立物体的投媄QCOLOR是投pQDIRECTION是设|投q方向。其?度代表垂直向上,然后?5度ؓ一个单位。它的默认值是向左?70度?/p> <p>filter:shadow(color=red,direction=225) <br />filter:shadow(color=blue,direction=225) <br />filter:shadow(color=gray,direction=225) <br />效果分别如下Q?/p> <p>11、Wave 滤镜 语法Q{filter:wave(add=add,freq=freq,lightstrength=strength,phase=phase,strength=strength)} <br />"wave" 属性把对象按垂直的波Ş样式打ؕ。默认是“TRUEQ非0Q”, <br />“ADD”表C是否要把对象按照L形样式打乱,</p> <p>“FREQ”是波纹的频率,也就是指定在对象上一共需要生多个完整的LU,</p> <p>“LIGHTSTRENGTH”参数可以对于LU增强光q效果Q范?----100Q?/p> <p>“PHASE”参数用来设|正弦L的偏U量?/p> <p>“STRENGTH”代表振q大?/p> </td> </tr> </tbody> </table> </div> <img src ="http://www.tkk7.com/ltc603/aggbug/77265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-10-25 19:11 <a href="http://www.tkk7.com/ltc603/archive/2006/10/25/77265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java虚拟机的深入研究--?/title><link>http://www.tkk7.com/ltc603/archive/2006/10/15/75267.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Sun, 15 Oct 2006 07:39:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/10/15/75267.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/75267.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/10/15/75267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/75267.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/75267.html</trackback:ping><description><![CDATA[ <div align="left"> <p class="title" align="center">Java虚拟机的深入研究</p> <p align="center">作者:刘学?</p> <p> <b>1  Java技术与Java虚拟?/b> </p> <p class="normal">说vJavaQh们首先想到的是Java~程语言Q然而事实上QJava是一U技术,它由四方面组? Java~程语言、JavacL件格式、Java虚拟机和Java应用E序接口(Java API)。它们的关系如下图所C:</p> <p align="center"> <img height="397" alt="" src="http://gceclub.sun.com.cn/staticcontent/html/2004-04-09/jvm01.gif" width="529" border="0" /> </p> <p align="center">?  Java四个斚w的关p?/p> <p class="normal">q行期环境代表着Javaq_Q开发h员编写Java代码(.java文g)Q然后将之编译成字节?.class文g)。最后字节码被装入内存,一旦字节码q入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的{换成机器码执行。从上图也可以看出Javaq_由Java虚拟机和Java应用E序接口搭徏QJava语言则是q入q个q_的通道Q用Java语言~写q编译的E序可以q行在这个^C。这个^台的l构如下图所C:</p> <p align="center"> <img height="251" alt="" src="http://gceclub.sun.com.cn/staticcontent/html/2004-04-09/jvm02.gif" width="609" border="0" /> </p> <p class="normal">在Javaq_的结构中, 可以看出QJava虚拟?JVM) 处在核心的位|,是程序与底层操作pȝ和硬件无关的关键。它的下ҎUL接口Q移植接口由两部分组成:适配器和Java操作pȝ, 其中依赖于^台的部分UCؓ适配器;JVM 通过UL接口在具体的q_和操作系l上实现Q在JVM 的上ҎJava的基本类库和扩展cd以及它们的APIQ?利用Java API~写的应用程?application) 和小E序(Java applet) 可以在Q何Javaq_上运行而无需考虑底层q_, 是因ؓ有Java虚拟?JVM)实现了程序与操作pȝ的分,从而实CJava 的^台无x? </p> <p class="normal">那么到底什么是Java虚拟?JVM)呢?通常我们谈论JVMӞ我们的意思可能是Q? </p> <ol> <li>对JVM规范的的比较抽象的说明; </li> <li>对JVM的具体实玎ͼ </li> <li>在程序运行期间所生成的一个JVM实例?</li> </ol> <p class="normal">对JVM规范的的抽象说明是一些概늚集合Q它们已l在书《The Java Virtual Machine Specification》(《Java虚拟范》)中被详细地描qCQ对JVM的具体实现要么是软gQ要么是软g和硬件的l合Q它已经被许多生产厂商所实现Qƈ存在于多U^C上;q行JavaE序的Q务由JVM的运行期实例单个承担。在本文中我们所讨论的Java虚拟?JVM)主要针对W三U情况而言。它可以被看成一个想象中的机器,在实际的计算Z通过软g模拟来实玎ͼ有自己想象中的硬Ӟ如处理器、堆栈、寄存器{,q有自己相应的指令系l?/p> <p class="normal">JVM在它的生存周期中有一个明的dQ那是q行JavaE序Q因此当JavaE序启动的时候,׃生JVM的一个实例;当程序运行结束的时候,该实例也跟着消失了。下面我们从JVM的体pȝ构和它的q行q程q两个方面来对它q行比较深入的研I? </p> <p> <b>2  Java虚拟机的体系l构</b> </p> <p class="normal">刚才已经提到QJVM可以׃同的厂商来实现。由于厂商的不同必然DJVM在实C的一些不同,然而JVMq是可以实现跨^台的Ҏ,q就要归功于设计JVM时的体系l构了?/p> <p class="normal">我们知道Q一个JVM实例的行Z光是它自q事,q涉及到它的子系l、存储区域、数据类型和指oq些部分Q它们描qCJVM的一个抽象的内部体系l构Q其目的不光规定实现JVM时它内部的体pȝ构,更重要的是提供了一U方式,用于严格定义实现时的外部行ؓ。每个JVM都有两种机制Q一个是装蝲h合适名U的c?cL是接?Q叫做类装蝲子系l;另外的一个负责执行包含在已装载的cL接口中的指oQ叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈q五个部分,q几个部分和c装载机制与q行引擎机制一L成的体系l构图ؓQ?/p> <p align="center"> <img height="299" alt="" src="http://gceclub.sun.com.cn/staticcontent/html/2004-04-09/jvm03.gif" width="589" border="0" /> </p> <p align="center">?  JVM的体pȝ?/p> <p class="normal">JVM的每个实例都有一个它自己的方法域和一个堆Q运行于JVM内的所有的U程都共享这些区域;当虚拟机装蝲cL件的时候,它解析其中的二进制数据所包含的类信息Qƈ把它们放到方法域中;当程序运行的时候,JVM把程序初始化的所有对象置于堆上;而每个线E创建的时候,都会拥有自己的程序计数器和Java栈,其中E序计数器中的值指向下一条即被执行的指令,U程的Java栈则存储U程调用JavaҎ的状态;本地Ҏ调用的状态被存储在本地方法栈Q该Ҏ栈依赖于具体的实现?/p> <p class="normal">下面分别对这几个部分q行说明?/p> <p class="normal">执行引擎处于JVM的核心位|,在Java虚拟范中Q它的行为是由指令集所军_的。尽对于每条指令,规范很详l地说明了当JVM执行字节码遇到指令时Q它的实现应该做什么,但对于怎么做却a之甚。Java虚拟机支持大U?48个字节码。每个字节码执行一U基本的CPUq算,例如,把一个整数加到寄存器,子程序{Uȝ。Java指o集相当于JavaE序的汇~语a?/p> <p class="normal">Java指o集中的指令包含一个单字节的操作符,用于指定要执行的操作,q有0个或多个操作?提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成?/p> <pre>虚拟机的内层循环的执行过E如? do{ 取一个操作符字节; Ҏ操作W的值执行一个动? }while(E序未结? </pre> <p class="normal">׃指opȝ的简单?使得虚拟机执行的q程十分?从而有利于提高执行的效率。指令中操作数的数量和大是由操作符军_的。如果操作数比一个字节大,那么它存储的序是高位字节优先。例?一?6位的参数存放时占用两个字?其gؓ: </p> <p class="normal">W一个字?256+W二个字节字节码? </p> <p class="normal">指o一般只是字节对齐的。指令tableswitch和lookup是例?在这两条指o内部要求强制?字节边界寚w? </p> <p class="normal">对于本地Ҏ接口Q实现JVMq不要求一定要有它的支持,甚至可以完全没有。Sun公司实现Java本地接口(JNI)是出于可UL性的考虑Q当然我们也可以设计出其它的本地接口来代替Sun公司的JNI。但是这些设计与实现是比较复杂的事情Q需要确保垃圑֛收器不会那些正在被本地Ҏ调用的对象释放掉? </p> <p class="normal">Java的堆是一个运行时数据?cȝ实例(对象)从中分配I间Q它的管理是由垃圑֛收来负责?不给E序员显式释攑֯象的能力。Java不规定具体用的垃圾回收法,可以Ҏpȝ的需求用各U各L法? </p> <p class="normal">JavaҎZ传统语言中的~译后代码或是Unixq程中的正文D늱伹{它保存Ҏ代码(~译后的java代码)和符可。在当前的Java实现?Ҏ代码不包括在垃圾回收堆中,但计划在来的版本中实现。每个类文g包含了一个JavacL一个Java界面的编译后的代码。可以说cL件是Java语言的执行代码文件。ؓ了保证类文g的^台无x?Java虚拟范中对类文g的格式也作了详细的说明。其具体l节请参考Sun公司的Java虚拟范? </p> <p class="normal">Java虚拟机的寄存器用于保存机器的q行状?与微处理器中的某些专用寄存器cM。Java虚拟机的寄存器有四种: </p> <ol> <li>pc: JavaE序计数器; </li> <li>optop: 指向操作数栈端的指针; </li> <li>frame: 指向当前执行Ҏ的执行环境的指针Q? </li> <li>vars: 指向当前执行Ҏ的局部变量区W一个变量的指针?</li> </ol> <p class="normal">在上qCpȝ构图中,我们所说的是第一U,即程序计数器Q每个线E一旦被创徏拥有了自己的程序计数器。当U程执行JavaҎ的时候,它包含该U程正在被执行的指o的地址。但是若U程执行的是一个本地的ҎQ那么程序计数器的值就不会被定义? </p> <p class="normal">Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区?/p> <p> <b>局部变量区</b> </p> <p class="normal">每个JavaҎ使用一个固定大的局部变量集。它们按照与vars寄存器的字偏U量来寻址。局部变量都?2位的。长整数和双_ֺ点数占据了两个局部变量的I间,却按照第一个局部变量的索引来寻址?例如,一个具有烦引n的局部变?如果是一个双_ֺ点?那么它实际占据了索引n和n+1所代表的存储空?虚拟范ƈ不要求在局部变量中?4位的值是64位对齐的。虚拟机提供了把局部变量中的D载到操作数栈的指?也提供了把操作数栈中的值写入局部变量的指o?/p> <p> <b>q行环境?/b> </p> <p class="normal">在运行环境中包含的信息用于动态链?正常的方法返回以及异常捕捉? </p> <p class="normal"> <b>动态链?/b> </p> <p class="normal">q行环境包括Ҏ向当前类和当前方法的解释器符可的指?用于支持Ҏ代码的动态链接。方法的class文g代码在引用要调用的方法和要访问的变量时用符受动态链接把W号形式的方法调用翻译成实际Ҏ调用,装蝲必要的类以解释还没有定义的符?q把变量讉K译成与q些变量q行时的存储l构相应的偏Ud址。动态链接方法和变量使得Ҏ中用的其它cȝ变化不会影响到本E序的代码? </p> <p class="normal"> <b>正常的方法返?/b> </p> <p class="normal">如果当前Ҏ正常地结束了,在执行了一条具有正类型的q回指o?调用的方法会得到一个返回倹{执行环境在正常q回的情况下用于恢复调用者的寄存?q把调用者的E序计数器增加一个恰当的数?以蟩q已执行q的Ҏ调用指o,然后在调用者的执行环境中l执行下厅R? </p> <p class="normal"> <b>异常捕捉</b> </p> <p class="normal">异常情况在Java中被UCError(错误)或Exception(异常),是Throwablecȝ子类,在程序中的原因是:①动态链接错,如无法找到所需的class文g。②q行旉,如对一个空指针的引用。程序用了throw语句? </p> <p class="normal">当异常发生时,Java虚拟机采取如下措? </p> <ul> <li>查与当前Ҏ相联pȝcatch子句表。每个catch子句包含其有效指令范?能够处理的异常类?以及处理异常的代码块地址? </li> <li>与异常相匚w的catch子句应该W合下面的条?造成异常的指令在其指令范围之?发生的异常类型是其能处理的异常类型的子类型。如果找C匚w的catch子句,那么pȝ转移到指定的异常处理块处执行;如果没有扑ֈ异常处理?重复L匚w的catch子句的过E?直到当前Ҏ的所有嵌套的catch子句都被查过? </li> <li>׃虚拟ZW一个匹配的catch子句处l执?所以catch子句表中的顺序是很重要的。因为Java代码是结构化?因此d以把某个Ҏ的所有的异常处理器都按序排列C个表?对Q意可能的E序计数器的?都可以用U性的序扑ֈ合适的异常处理?以处理在该程序计数器g发生的异常情c? </li> <li>如果找不到匹配的catch子句,那么当前Ҏ得到一?未截获异?的结果ƈq回到当前方法的调用?好像异常刚刚在其调用者中发生一栗如果在调用者中仍然没有扑ֈ相应的异常处理块,那么q种错误被传播下去。如果错误被传播到最层,那么pȝ调用一个缺省的异常处理块?</li> </ul> <p> <b>操作数栈?/b> </p> <p class="normal">机器指o只从操作数栈中取操作?对它们进行操?q把l果q回到栈中。选择栈结构的原因?在只有少量寄存器或非通用寄存器的机器(如Intel486)?也能够高效地模拟虚拟机的行ؓ。操作数栈是32位的。它用于l方法传递参?q从Ҏ接收l果,也用于支持操作的参数,q保存操作的l果。例?iadd指o两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指o压进堆栈的。这两个整数从堆栈弹出、相?q把l果压回到操作数栈中? </p> <p class="normal">每个原始数据cd都有专门的指令对它们q行必须的操作。每个操作数在栈中需要一个存储位|?除了long和double?它们需要两个位|。操作数只能被适用于其cd的操作符所操作。例?压入两个intcd的数,如果把它们当作是一个longcd的数则是非法的。在Sun的虚拟机实现?q个限制由字节码验证器强制实行。但?有少数操?操作Wdupe和swap),用于对运行时数据行操作时是不考虑cd的? </p> <p class="normal">本地Ҏ栈,当一个线E调用本地方法时Q它׃再受到虚拟机关于l构和安全限制方面的U束Q它既可以访问虚拟机的运行期数据区,也可以用本地处理器以及Mcd的栈。例如,本地栈是一个C语言的栈Q那么当CE序调用C函数Ӟ函数的参C某种序被压入栈Q结果则q回l调用函数。在实现Java虚拟机时Q本地方法接口用的是C语言的模型栈Q那么它的本地方法栈的调度与使用则完全与C语言的栈相同?/p> <p> <b>3  Java虚拟机的q行q程</b> </p> <p class="normal">上面对虚拟机的各个部分进行了比较详细的说明,下面通过一个具体的例子来分析它的运行过E?/p> <p class="normal">虚拟机通过调用某个指定cȝҎmain启动Q传递给main一个字W串数组参数Q指定的类被装载,同时链接该类所使用的其它的cdQƈ且初始化它们。例如对于程序:</p> <pre>class HelloApp { public static void main(String[] args) { System.out.println("Hello World!"); for (int i = 0; i < args.length; i++ ) { System.out.println(args[i]); } } } </pre> <p class="normal">~译后在命o行模式下键入Q?java HelloApp run virtual machine </p> <p class="normal">通过调用HelloApp的方法main来启动java虚拟机,传递给main一个包含三个字W串"run"?virtual"?machine"的数l。现在我们略q虚拟机在执行HelloApp时可能采取的步骤? </p> <p class="normal">开始试图执行类HelloApp的mainҎQ发现该cdƈ没有被装载,也就是说虚拟机当前不包含该类的二q制代表Q于是虚拟机使用ClassLoader试图Lq样的二q制代表。如果这个进E失败,则抛Z个异常。类被装载后同时在mainҎ被调用之前,必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶D:验,准备和解析。检验检查被装蝲的主cȝW号和语义,准备则创建类或接口的静态域以及把这些域初始化ؓ标准的默认|解析负责查主cd其它cL接口的符号引用,在这一步它是可选的。类的初始化是对cM声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化。整个过E如下:</p> <p align="center"> <img height="610" alt="" src="http://gceclub.sun.com.cn/staticcontent/html/2004-04-09/jvm04.gif" width="702" border="0" /> </p> <p align="center">?Q虚拟机的运行过E?/p> <p> <b>4  l束?/b> </p> <p class="normal">本文通过对JVM的体pȝ构的深入研究以及一个JavaE序执行时虚拟机的运行过E的详细分析Q意在剖析清楚Java虚拟机的机理?/p> </div> <img src ="http://www.tkk7.com/ltc603/aggbug/75267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-10-15 15:39 <a href="http://www.tkk7.com/ltc603/archive/2006/10/15/75267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达?/title><link>http://www.tkk7.com/ltc603/archive/2006/10/13/74915.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Fri, 13 Oct 2006 01:36:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/10/13/74915.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/74915.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/10/13/74915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/74915.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/74915.html</trackback:ping><description><![CDATA[ <p>struts的validator资料见:<a >struts validator</a></p> <p>附一个正则表辑ּ的资料:</p> <h3 class="title" id="startcontent">正则表达?/h3> <p>  正则表达?regular expression)描述了一U字W串匚w的模式,可以用来查一个串是否含有某种子串、将匚w的子串做替换或者从某个串中取出W合某个条g的子串等?br />  列目录时Q dir *.txt或ls *.txt中的*.txt?/p> <ins>?/ins>是一个正则表辑ּ,因ؓq里*与正则式?的含义是不同的?a name="more"></a><p>  Z于理解和记忆Q先从一些概念入手,所有特D字W或字符l合有一个总表在后面,最后一些例子供理解相应的概c?/p><p></p><h3>正则表达?/h3><p><br />  是由普通字W(例如字符 a ?zQ以及特D字W(UCؓ元字W)l成的文字模式。正则表辑ּ作ؓ一个模板,某个字W模式与所搜烦的字W串q行匚w?br />  可以通过在一对分隔符之间攑օ表达式模式的各种lg来构造一个正则表辑ּQ即/expression/ </p><p></p><p></p><h3>普通字W?/h3><p><br />  由所有那些未昑ּ指定为元字符的打印和非打印字W组成。这包括所有的大写和小写字母字W,所有数字,所有标点符号以及一些符受?<br /></p><h3>非打印字W?/h3><p><br /></p><table border="1"><tbody><tr><td>字符 </td><td>含义</td></tr><tr><td>\cx </td><td>匚w由x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/td></tr><tr><td>\f </td><td>匚w一个换늬。等价于 \x0c ?\cL?/td></tr><tr><td>\n </td><td>匚w一个换行符。等价于 \x0a ?\cJ?/td></tr><tr><td>\r </td><td>匚w一个回车符。等价于 \x0d ?\cM?/td></tr><tr><td>\s </td><td>匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td></tr><tr><td>\S </td><td>匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td></tr><tr><td>\t </td><td>匚w一个制表符。等价于 \x09 ?\cI?/td></tr><tr><td>\v </td><td>匚w一个垂直制表符。等价于 \x0b ?\cK?/td></tr></tbody></table><br /><h3>Ҏ字符</h3><p><br />  所谓特D字W,是一些有Ҏ含义的字W,如上面说?*.txt"中的*Q简单的说就是表CZQ何字W串的意思。如果要查找文g名中有*的文Ӟ则需要对Q进行{义,卛_其前加一个\。ls \*.txt。正则表辑ּ有以下特D字W?br /></p><table border="1"><tbody><tr><td>特别字符</td><td>说明</td></tr><tr><td>$</td><td>匚w输入字符串的l尾位置。如果设|了 RegExp 对象?Multiline 属性,?$ 也匹?'\n' ?'\r'。要匚w $ 字符本nQ请使用 \$?/td></tr><tr><td>( )</td><td>标记一个子表达式的开始和l束位置。子表达式可以获取供以后使用。要匚wq些字符Q请使用 \( ?\)?/td></tr><tr><td>*</td><td>匚w前面的子表达式零ơ或多次。要匚w * 字符Q请使用 \*?/td></tr><tr><td>+</td><td>匚w前面的子表达式一ơ或多次。要匚w + 字符Q请使用 \+?/td></tr><tr><td>.</td><td>匚w除换行符 \n之外的Q何单字符。要匚w .Q请使用 \?/td></tr><tr><td>[ </td><td>标记一个中括号表达式的开始。要匚w [Q请使用 \[?/td></tr><tr><td>?</td><td>匚w前面的子表达式零ơ或一ơ,或指明一个非贪婪限定W。要匚w ? 字符Q请使用 \??/td></tr><tr><td>\</td><td>下一个字W标Cؓ或特D字W、或原义字符、或向后引用、或八进制{义符。例如, 'n' 匚w字符 'n'?\n' 匚w换行W。序?'\\' 匚w "\"Q?'\(' 则匹?"("?/td></tr><tr><td>^</td><td>匚w输入字符串的开始位|,除非在方括号表达式中使用Q此时它表示不接受该字符集合。要匚w ^ 字符本nQ请使用 \^?/td></tr><tr><td>{</td><td>标记限定W表辑ּ的开始。要匚w {Q请使用 \{?/td></tr><tr><td>|</td><td>指明两项之间的一个选择。要匚w |Q请使用 \|?/td></tr></tbody></table><p></p><p><br /><strong>  构造正则表辑ּ的方法和创徏数学表达式的Ҏ一栗也是用多U元字符与操作符小的表辑ּl合在一h创徏更大的表辑ּ。正则表辑ּ的组件可以是单个的字W、字W集合、字W范围、字W间的选择或者所有这些组件的Ll合?/strong></p><p><br /></p><h3>限定W?/h3><p><br />  限定W用来指定正则表辑ּ的一个给定组件必要出现多少ơ才能满_配。有*??或{n}或{n,}或{n,m}?U?br />*??限定W都是贪婪的Q因为它们会可能多的匹配文字,只有在它们的后面加上一?可以实现非贪婪或最匹配?br />  正则表达式的限定W有Q?br /></p><table border="1"><tbody><tr><td>字符 </td><td>描述</td></tr><tr><td>* </td><td>匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"? {h于{0,}?/td></tr><tr><td>+ </td><td>匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/td></tr><tr><td>? </td><td>匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?/td></tr><tr><td>{n} </td><td>n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td></tr><tr><td>{n,} </td><td>n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/td></tr><tr><td>{n,m} </td><td>m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/td></tr></tbody></table><p></p><p></p><h3>定位W?/h3><p><br />  用来描述字符串或单词的边界,^?分别指字W串的开始与l束Q\b描述单词的前或后边界Q\B表示非单词边界?/p><ins>不能对定位符使用限定W?/ins><p></p><p></p><h3>选择</h3><p><br />  用圆括号所有选择ҎhQ相ȝ选择之间用|分隔。但用圆括号会有一个副作用Q是相关的匹配会被缓存,此时可用?:攑֜W一个选项前来消除q种副作用?br />  其中?:是非捕获元之一Q还有两个非捕获元是?=?!Q这两个q有更多的含义,前者ؓ正向预查Q在M开始匹配圆括号内的正则表达式模式的位置来匹配搜索字W串Q后者ؓ负向预查Q在M开始不匚w该正则表辑ּ模式的位|来匚w搜烦字符丌Ӏ?</p><p></p><p></p><h3>后向引用</h3><p><br />  对一个正则表辑ּ模式或部分模式两Ҏ加圆括号导致相兛_配存储到一个时缓冲区中,所捕获的每个子匚w都按照在正则表达式模式中从左臛_所遇到的内容存储。存储子匚w的缓冲区~号?1 开始,q箋~号直至最?99 个子表达式。每个缓冲区都可以?'\n' 讉KQ其?n Z个标识特定缓冲区的一位或两位十进制数?br />  可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匚w的保存?</p><p></p><p></p><h3>各种操作W的q算优先U?/h3><p><br />  相同优先U的从左到右q行q算Q不同优先的运先高后低。各U操作符的优先从高C如下Q?br /></p><table border="1"><tbody><tr><td>操作W?</td><td>描述</td></tr><tr><td>\ </td><td>转义W?/td></tr><tr><td>(), (?:), (?=), [] </td><td>圆括号和Ҏ?/td></tr><tr><td>*, +, ?, {n}, {n,}, {n,m} </td><td>限定W?/td></tr><tr><td>^, $, \anymetacharacter </td><td>位置和顺?/td></tr><tr><td>| </td><td>“或”操?/td></tr></tbody></table><p></p><p></p><h3>全部W号解释</h3><p><br /></p><table border="1"><tbody><tr><td>字符 </td><td>描述</td></tr><tr><td>\ </td><td>下一个字W标Cؓ一个特D字W、或一个原义字W、或一?向后引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?/td></tr><tr><td>^ </td><td>匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?/td></tr><tr><td>$ </td><td>匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?/td></tr><tr><td>* </td><td>匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"? {h于{0,}?/td></tr><tr><td>+ </td><td>匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/td></tr><tr><td>? </td><td>匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?/td></tr><tr><td>{n} </td><td>n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td></tr><tr><td>{n,} </td><td>n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/td></tr><tr><td>{n,m} </td><td>m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/td></tr><tr><td>? </td><td>当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?/td></tr><tr><td>. </td><td>匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?/td></tr><tr><td>(pattern) </td><td>匚w pattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0?9 属性。要匚w圆括号字W,请?'\(' ?'\)'?/td></tr><tr><td>(?:pattern) </td><td>匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?/td></tr><tr><td>(?=pattern) </td><td>正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?/td></tr><tr><td>(?!pattern) </td><td>负向预查Q在M不匹?pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开?/td></tr><tr><td>x|y </td><td>匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?/td></tr><tr><td>[xyz] </td><td>字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?/td></tr><tr><td>[^xyz] </td><td>负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?/td></tr><tr><td>[a-z] </td><td>字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?/td></tr><tr><td>[^a-z] </td><td>负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?/td></tr><tr><td>\b </td><td>匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?/td></tr><tr><td>\B </td><td>匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?/td></tr><tr><td>\cx </td><td>匚w?x 指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/td></tr><tr><td>\d </td><td>匚w一个数字字W。等价于 [0-9]?/td></tr><tr><td>\D </td><td>匚w一个非数字字符。等价于 [^0-9]?/td></tr><tr><td>\f </td><td>匚w一个换늬。等价于 \x0c ?\cL?/td></tr><tr><td>\n </td><td>匚w一个换行符。等价于 \x0a ?\cJ?/td></tr><tr><td>\r </td><td>匚w一个回车符。等价于 \x0d ?\cM?/td></tr><tr><td>\s </td><td>匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td></tr><tr><td>\S </td><td>匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td></tr><tr><td>\t </td><td>匚w一个制表符。等价于 \x09 ?\cI?/td></tr><tr><td>\v </td><td>匚w一个垂直制表符。等价于 \x0b ?\cK?/td></tr><tr><td>\w </td><td>匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?/td></tr><tr><td>\W </td><td>匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?/td></tr><tr><td>\xn </td><td>匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ定的两个数字长。例如,'\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?</td></tr><tr><td>\num </td><td>匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W?/td></tr><tr><td>\n </td><td>标识一个八q制转义值或一个向后引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为向后引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?/td></tr><tr><td>\nm </td><td>标识一个八q制转义值或一个向后引用。如?\nm 之前臛_?nm 个获得子表达式,?nm 为向后引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的向后引用。如果前面的条g都不满Q若 n ?m 均ؓ八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?/td></tr><tr><td>\nml </td><td>如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ八进制数?(0-7)Q则匚w八进制{义?nml?/td></tr><tr><td>\un </td><td>匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (?)?/td></tr></tbody></table><p></p><p></p><h3>部分例子</h3><p><br /></p><table border="1"><tbody><tr><td>正则表达?/td><td>说明</td></tr><tr><td>/\b([a-z]+) \1\b/gi</td><td>一个单词连l出现的位置</td></tr><tr><td>/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ </td><td>一个URL解析为协议、域、端口及相对路径</td></tr><tr><td>/^(?:Chapter|Section) [1-9][0-9]{0,1}$/</td><td>定位章节的位|?/td></tr><tr><td>/[-a-z]/</td><td>A至z?6个字母再加一?受?/td></tr><tr><td>/ter\b/</td><td>可匹配chapterQ而不能terminal</td></tr><tr><td>/\Bapt/</td><td>可匹配chapterQ而不能aptitude</td></tr><tr><td>/Windows(?=95 |98 |NT )/</td><td>可匹配Windows95或Windows98或WindowsNT,当找C个匹配后Q从Windows后面开始进行下一ơ的索匹配?/td></tr></tbody></table><img src ="http://www.tkk7.com/ltc603/aggbug/74915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-10-13 09:36 <a href="http://www.tkk7.com/ltc603/archive/2006/10/13/74915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Z点R?/title><link>http://www.tkk7.com/ltc603/archive/2006/10/09/73942.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Mon, 09 Oct 2006 00:57:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/10/09/73942.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/73942.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/10/09/73942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/73942.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/73942.html</trackback:ping><description><![CDATA[前两天晚上在l过一个十字\口的时候,不知中了什么邪Q跑着横穿马\Q正好被一个出UR撞上Q?br /><br />撞的偶pp上,那叫一个险。幸亏是撞的pp上,而且车速不快。n上是些皮外伤?br /><br />所以奉劝大家宁{?时Q别?妙?br /><br />要是真有急事儿,非要抢那1妙,那就别犹豫,跑快炏V?img height="19" src="http://www.tkk7.com/Emoticons/emsmilep.gif" width="19" border="0" /><img src ="http://www.tkk7.com/ltc603/aggbug/73942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-10-09 08:57 <a href="http://www.tkk7.com/ltc603/archive/2006/10/09/73942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>101?/title><link>http://www.tkk7.com/ltc603/archive/2006/09/30/73076.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Sat, 30 Sep 2006 09:06:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/09/30/73076.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/73076.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/09/30/73076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/73076.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/73076.html</trackback:ping><description><![CDATA[真的很快Q工作了感觉旉q得太快了。真是time fly?img height="19" src="http://www.tkk7.com/Emoticons/emsmilep.gif" width="19" border="0" /><br /><br />明天?01了,感觉刚过?1?br /><br />回家修养几天?img height="19" src="http://www.tkk7.com/Emoticons/emteeth.gif" width="19" border="0" /><img src ="http://www.tkk7.com/ltc603/aggbug/73076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-09-30 17:06 <a href="http://www.tkk7.com/ltc603/archive/2006/09/30/73076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://www454yu.com" target="_blank">ѾþþƷƬ㽶</a>| <a href="http://jhc2go.com" target="_blank">޹ᆱƷԲ߹ۿ</a>| <a href="http://chuoche.com" target="_blank">þþþӰԺŮ </a>| <a href="http://qq367.com" target="_blank">޳˻ɫ߹ۿ</a>| <a href="http://wuiso.com" target="_blank">ƷƷŮѹۿ</a>| <a href="http://www5xsq.com" target="_blank">þһѲ</a>| <a href="http://jinguwj.com" target="_blank">޹Ӱ߹ۿ</a>| <a href="http://cao9999.com" target="_blank">ɫַ</a>| <a href="http://449892.com" target="_blank">ѵɫƵ</a>| <a href="http://chch12.com" target="_blank">ŮëƬƵƵһ </a>| <a href="http://yuduruizhi.com" target="_blank">91ƷѾþþþþ</a>| <a href="http://vvww-3499.com" target="_blank">þ޾Ʒ</a>| <a href="http://www-7607.com" target="_blank">VAĻëƬ</a>| <a href="http://hqwgg.com" target="_blank">ůůձ</a>| <a href="http://djqq520.com" target="_blank">¾þþþa</a>| <a href="http://bx85.com" target="_blank">ŷ޿l</a>| <a href="http://25v8.com" target="_blank">Ʒ޳aƬ߹ۿٸ</a>| <a href="http://wwwyy763.com" target="_blank">պƵһ</a>| <a href="http://badabg.com" target="_blank">þѵľƷV</a>| <a href="http://papapa97.com" target="_blank">޾Ʒ91ר </a>| <a href="http://kmyake.com" target="_blank">þù޸ۿ</a>| <a href="http://91haikala.com" target="_blank">Ƶ</a>| <a href="http://626632.com" target="_blank">˹ۿëƬ</a>| <a href="http://jx-dirui.com" target="_blank">jŮjڲվ</a>| <a href="http://xx9911.com" target="_blank">ëƬ߹ۿ </a>| <a href="http://klno1.com" target="_blank">޹պƵ</a>| <a href="http://www3ratcom.com" target="_blank">ŮѹۿƬ</a>| <a href="http://52099jy.com" target="_blank">ɫɫۺվ</a>| <a href="http://av-fantasy.com" target="_blank">AVպAAVӰ</a>| <a href="http://8hnbuk14.com" target="_blank">޴ɫ߹ۿ</a>| <a href="http://www6yg6yg.com" target="_blank">avɫӰ</a>| <a href="http://sdsupuchem.com" target="_blank">jlzzjlzz߲</a>| <a href="http://8xk7u9.com" target="_blank">ĻӰԺ߲</a>| <a href="http://gengyufood.com" target="_blank">ۺƵ</a>| <a href="http://www-774220.com" target="_blank">˳ɼƵ߹ۿ</a>| <a href="http://51caox.com" target="_blank">ŮվɫƵ</a>| <a href="http://yongfu-sh.com" target="_blank">ۺľƷ</a>| <a href="http://gisdn.com" target="_blank">ɫͼ߹ۿ</a>| <a href="http://1314xxx.com" target="_blank">AVպAV뵼</a>| <a href="http://www62hth.com" target="_blank">AVɫ</a>| <a href="http://sdzhly.com" target="_blank">ŷ޾ƷƵ߹ۿ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>