<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 15,  comments - 4,  trackbacks - 0
    -------------------------------------------------------------------
    @NotFound(action=NotFoundAction.IGNORE)

    使用hibernate
    注解配置實體類的關聯關系,在many-to-one,one-to-one關聯中,一邊引用自另一邊的屬性,如果屬性值為某某的數據在數據庫不存在了,hibernate默認會拋出異常。解決此問題,加上如下注解就可以了:
    @NotFound(action=NotFoundAction.IGNORE),意思是找不到引用的外鍵數據時忽略,NotFound默認是exception

    -------------------------------------------------------------------
    cascade = CascadeType.REFRESH,cascade=CascadeType.ALL

    cascade表示級聯操作  


       CascadeType.MERGE級聯更新:若items屬性修改了那么order對象保存時同時修改items里的對象。對應EntityManager的merge方法

     
       CascadeType.PERSIST級聯刷新:獲取order對象里也同時也重新獲取最新的items時的對象。對應EntityManager的refresh(object)方法有效。即會重新查詢數據庫里的最新數據  
      

      CascadeType.REFRESH級聯保存:對order對象保存時也對items里的對象也會保存。對應EntityManager的presist方法  
      

      CascadeType.REMOVE級聯刪除:對order對象刪除也對items里的對象也會刪除。對應EntityManager的remove方法  

    CascadeType.PERSIST只有A類新增時,會級聯B對象新增。若B對象在數據庫存(跟新)在則拋異常(讓B變為持久態)

    CascadeType.MERGE指A類新增或者變化,會級聯B對象(新增或者變化)

    CascadeType.REMOVE只有A類刪除時,會級聯刪除B類;

    CascadeType.ALL包含所有;

    CascadeType.REFRESH沒用過。

    綜上:大多數情況用CascadeType.MERGE就能達到級聯跟新又不報錯,用CascadeType.ALL時要斟酌下CascadeType.REMOVE

    @Fetch:

    定義了加載關聯關系的獲取策略. FetchMode 可以是

    SELECT (在需要加載關聯的時候觸發select操作),     SUBSELECT(只對集合有效,使用了子查詢策略,詳情參考Hibernate參考文檔)

    JOIN (在加載主實體(owner entity)的時候使用SQL JOIN來加載關聯關系).

    JOIN 將覆寫任何延遲屬性 (通過 JOIN策略加載的關聯將不再具有延遲性).



    -------------------------------------------------------------------
    fetch=FetchType.LAZY
    Hibernate的數據加載方式:
    1.即時加載 immediately loading

           實體加載完成后,立即加載其關聯的數據。
    2.延遲加載lazy loading

           實體相關聯的數據在第一次訪問時再進行讀取。
    3.預先加載 eager loading

            與immediately loading類似,但實體和相關聯的數據是通過一條sql同時讀取。
    4.批量加載 batch loading
            ?



    ------------------------------------------------------------------
    EntityManager 的API
    下面是EntityManager的一些主要的接口方法:
    void persist(Object entity)
          通過調用EntityManager的persist()方法,新實體實例將轉換為受控狀態。這意謂著當persist()方法所在的事務提交時,實體的數據將保存到數據庫中。如果實體已經被持久化,那么調用persist()操作不會發生任何事情。如果對一個已經刪除的實體調用persist()操作,刪除態的實體又轉變為受控態。如果對游離狀的實體執行persist()操作,將拋出IllegalArgumentException。 在一個實體上調用persist()操作,將廣播到和實體關聯的實體上,執行相應的級聯持久化操作;

    void remove(Object entity)
          通過調用remove()方法刪除一個受控的實體。如果實體聲明為級聯刪除(cascade=REMOVE 或者cascade=ALL ),被關聯的實體也會被刪除。在一個新建狀態的實體上調用remove()操作,將被忽略。如果在游離實體上調用remove()操作,將拋出IllegalArgumentException,相關的事務將回滾。如果在已經刪除的實體上執行remove()操作,也會被忽略;

    void flush()
          將受控態的實體數據同步到數據庫中;

    T merge(T entity)
          將一個游離態的實體持久化到數據庫中,并轉換為受控態的實體;

    T find(Class entityClass, Object primaryKey)
          以主鍵查詢實體對象,entityClass是實體的類,primaryKey是主鍵值,如以下的代碼查詢Topic實體: Topic t = em.find(Topic.class,1); Query createQuery(String qlString) 根據JPA的查詢語句創建一個查詢對象Query,如下面的代碼:
    Query q= em.createQuery(""SELECT t FROM Topic t WHERE t.topicTitle LIKE :topicTitle")"); Query createNativeQuery(String sqlString)
    使用本地數據庫的SQL語句創建一個Query對象,Query通過getResultList()方法執行查詢后,返回一個List結果集,每一行數據對應一個Vector。
    使用本地數據庫的SQL語句創建一個Query對象,Query通過getResultList()方法執行查詢后,返回一個List結果集,每一行數據對應一個Vector。
    看來要學習的東東還有好多啊~~努力吧!


     

    posted @ 2013-03-05 11:51 老天 閱讀(3893) | 評論 (1)編輯 收藏
    Struts2的下載地址:
    http://struts.apache.org/download.cgi
    目前建議下載版本:2.2.1GA版

    Hibernate下載地址:
    http://www.hibernate.org/downloads
    目前建議下載版本:3.6.0 Final版

    Spring的下載地址:
    http://www.springsource.org/download
    目前建議下載版本:穩定版3.0.5

     
     
     
    2013-1-15  
    1、struts2  top關鍵字理解。 
    1).top 指代當前迭代元素,可以為對象;
    2).這里的top可用[0].top替代,但不能使用[0];[0]代表整個棧對象。如果單純調用[0]將會調用其 toString()方法輸出對象信息;



    2、刪除信息時錯誤日志:
    java.lang.IllegalArgumentException: Removing a detached instance

     Detached - a detached instance is an object that has been persistent, but its Session has been closed. The reference to the

          object is still valid, of course, and the detached instance might even be modified in this state. A detached instance can be

          reattached to a new Session at a later point in time, making it (and all the modifications) persistent again

          現在應該明白了吧,在刪除之前把這個Detached instance綁定到當前的Sesssion,在用當前Sesssion刪除此instance。修改后的代碼如


    解決辦法:
    public void delete(SASVo  vo) {
                   entityManager.remove( entityManager.merge(vo));
            }
    posted @ 2013-01-15 16:54 老天 閱讀(384) | 評論 (1)編輯 收藏

    dom是解析xml的底層接口之一(另一種是sax)  
    而jdom和dom4j則是基于底層api的更高級封裝   
    dom是通用的,而jdom和dom4j則是面向java語言的 
      
        DOM 是用與平臺和語言無關的方式表示 XML 文檔的官方 W3C 標準。DOM 是以層次結構組織的節點或信息片斷的集合。這個層次結構允許開發人員在樹中尋找特定信息。分析該結構通常需要加載整個文檔和構造層次結構,然后才能做任何工作。由于它是基于信息層次的,因而 DOM 被認為是基于樹或基于對象的。DOM 以及廣義的基于樹的處理具有幾個優點。首先,由于樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單得多。
    XML的四種解析器(dom,sax,jdom,dom4j)原理及性能比較(轉自zsq)    
    1、DOM
        DOM 是用與平臺和語言無關的方式表示 XML 文檔的官方 W3C 標準。DOM 是以層次結構組織的節點或信息片斷的集合。這個層次結構允許開發人員在樹中尋找特定信息。分析該結構通常需要加載整個文檔和構造層次結構,然后才能做任何工作。由于它是基于信息層次的,因而 DOM 被認為是基于樹或基于對象的。DOM 以及廣義的基于樹的處理具有幾個優點。
        首先,由于樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單得多。
        另一方面,對于特別大的文檔,解析和加載整個文檔可能很慢且很耗資源,因此使用其他手段來處理這樣的數據會更好。這些基于事件的模型,比如 SAX。
    2、SAX 
        這種處理的優點非常類似于流媒體的優點。分析能夠立即開始,而不是等待所有的數據被處理。而且,由于應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中。這對于大型文檔來說是個巨大的優點。事實上,應用程序甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。一般來說,SAX 還比它的替代者 DOM 快許多。
    3、選擇 DOM 還是選擇 SAX ? 
        對于需要自己編寫代碼來處理 XML 文檔的開發人員來說,選擇 DOM 還是 SAX 解析模型是一個非常重要的設計決策。 
        DOM 采用建立樹形結構的方式訪問 XML 文檔,而 SAX 采用的事件模型。 
        DOM 解析器把 XML 文檔轉化為一個包含其內容的樹,并可以對樹進行遍歷。用 DOM 解析模型的優點是編程容易,開發人員只需要調用建樹的指令,然后利用navigation APIs訪問所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由于使用 DOM 解析器的時候需要處理整個 XML 文檔,所以對性能和內存的要求比較高,尤其是遇到很大的 XML 文件的時候。由于它的遍歷能力,DOM 解析器常用于 XML 文檔需要頻繁的改變的服務中。
        SAX 解析器采用了基于事件的模型,它在解析 XML 文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標簽已經找到。SAX 對內存的要求通常會比較低,因為它讓開發人員自己來決定所要處理的tag。特別是當開發人員只需要處理文檔中所包含的部分數據時,SAX 這種擴展能力得到了更好的體現。但用 SAX 解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同數據。
    4、JDOM 
        JDOM的目的是成為 Java 特定文檔模型,它簡化與 XML 的交互并且比使用 DOM 實現更快。由于是第一個 Java 特定模型,JDOM 一直得到大力推廣和促進。正在考慮通過“Java 規范請求 JSR-102”將它最終用作“Java 標準擴展”。從 2000 年初就已經開始了 JDOM 開發。
        JDOM 與 DOM 主要有兩方面不同。首先,JDOM 僅使用具體類而不使用接口。這在某些方面簡化了 API,但是也限制了靈活性。第二,API 大量使用了 Collections 類,簡化了那些已經熟悉這些類的 Java 開發者的使用。
        JDOM 文檔聲明其目的是“使用 20%(或更少)的精力解決 80%(或更多)Java/XML 問題”(根據學習曲線假定為 20%)。JDOM 對于大多數 Java/XML 應用程序來說當然是有用的,并且大多數開發者發現 API 比 DOM 容易理解得多。JDOM 還包括對程序行為的相當廣泛檢查以防止用戶做任何在 XML 中無意義的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作(或者甚至理解某些情況下的錯誤)。這也許是比學習 DOM 或 JDOM 接口都更有意義的工作。
        JDOM 自身不包含解析器。它通常使用 SAX2 解析器來解析和驗證輸入 XML 文檔(盡管它還可以將以前構造的 DOM 表示作為輸入)。它包含一些轉換器以將 JDOM 表示輸出成 SAX2 事件流、DOM 模型或 XML 文本文檔。JDOM 是在 Apache 許可證變體下發布的開放源碼。
    5、DOM4J 
        雖然 DOM4J 代表了完全獨立的開發結果,但最初,它是 JDOM 的一種智能分支。它合并了許多超出基本 XML 文檔表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文檔或流化文檔的基于事件的處理。它還提供了構建文檔表示的選項,它通過 DOM4J API 和標準 DOM 接口具有并行訪問功能。從 2000 下半年開始,它就一直處于開發之中。
        為支持所有這些功能,DOM4J 使用接口和抽象基本類方法。DOM4J 大量使用了 API 中的 Collections 類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然 DOM4J 付出了更復雜的 API 的代價,但是它提供了比 JDOM 大得多的靈活性。
        在添加靈活性、XPath 集成和對大文檔處理的目標時,DOM4J 的目標與 JDOM 是一樣的:針對 Java 開發者的易用性和直觀操作。它還致力于成為比 JDOM 更完整的解決方案,實現在本質上處理所有 Java/XML 問題的目標。在完成該目標時,它比 JDOM 更少強調防止不正確的應用程序行為。
        DOM4J 是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。如今你可以看到越來越多的 Java 軟件都在使用 DOM4J 來讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。
    6、總述 
        JDOM 和 DOM 在性能測試時表現不佳,在測試 10M 文檔時內存溢出。在小文檔情況下還值得考慮使用 DOM 和 JDOM。雖然 JDOM 的開發者已經說明他們期望在正式發行版前專注性能問題,但是從性能觀點來看,它確實沒有值得推薦之處。另外,DOM 仍是一個非常好的選擇。DOM 實現廣泛應用于多種編程語言。它還是許多其它與 XML 相關的標準的基礎,因為它正式獲得 W3C 推薦(與基于非標準的 Java 模型相對),所以在某些類型的項目中可能也需要它(如在 javascript 中使用 DOM)。
        SAX表現較好,這要依賴于它特定的解析方式。一個 SAX 檢測即將到來的XML流,但并沒有載入到內存(當然當XML流被讀入時,會有部分文檔暫時隱藏在內存中)。
        無疑,DOM4J是最好的,目前許多開源項目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置文件。如果不考慮可移植性,那就采用DOM4J吧!

    posted @ 2012-12-17 16:19 老天 閱讀(231) | 評論 (0)編輯 收藏
    第一步:加入log4j-1.2.8.jar到lib下。

    第二步:在CLASSPATH下建立log4j.properties。內容如下:

    1 log4j.rootCategory=INFO, stdout , R

    2

    3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

    6

    7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

    8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

    9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

    10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

    11

    12 log4j.logger.com.neusoft=DEBUG

    13 log4j.logger.com.opensymphony.oscache=ERROR

    14 log4j.logger.net.sf.navigator=ERROR

    15 log4j.logger.org.apache.commons=ERROR

    16 log4j.logger.org.apache.struts=WARN

    17 log4j.logger.org.displaytag=ERROR

    18 log4j.logger.org.springframework=DEBUG

    19 log4j.logger.com.ibatis.db=WARN

    20 log4j.logger.org.apache.velocity=FATAL

    21

    22 log4j.logger.com.canoo.webtest=WARN

    23

    24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

    25 log4j.logger.org.hibernate=DEBUG

    26 log4j.logger.org.logicalcobwebs=WARN

    第三步:相應的修改其中屬性,修改之前就必須知道這些都是干什么的,在第二部分講解。

    第四步:在要輸出日志的類中加入相關語句:

    定義屬性:protected final Log log = LogFactory.getLog(getClass());

    在相應的方法中:

    if (log.isDebugEnabled())

    {

    log.debug(“System …..”);

    }

    二、Log4j說明

    1 log4j.rootCategory=INFO, stdout , R

    此句為將等級為INFO的日志信息輸出到 stdout和R這兩個目的地,stdout和R的定義在下面的代碼,可以任意起名。等級可分為OFF、 FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF則不打出任何信息,如果配置為INFO這樣只顯示INFO, WARN, ERROR的log信息,而DEBUG信息不會被顯示,具體講解可參照第三部分定義配置文件中的logger。

    3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    此句為定義名為stdout的輸出端是哪種類型,可以是

    org.apache.log4j.ConsoleAppender(控制臺),

    org.apache.log4j.FileAppender(文件),

    org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),

    org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)

    org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

    具體講解可參照第三部分定義配置文件中的Appender。

    4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    此句為定義名為stdout的輸出端的layout是哪種類型,可以是

    org.apache.log4j.HTMLLayout(以HTML表格形式布局),

    org.apache.log4j.PatternLayout(可以靈活地指定布局模式),

    org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),

    org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

    具體講解可參照第三部分定義配置文件中的Layout。

    5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n

    如果使用pattern布局就要指定的打印信息的具體格式ConversionPattern,打印參數如下:

    %m 輸出代碼中指定的消息

    %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL

    %r 輸出自應用啟動到輸出該log信息耗費的毫秒數

    %c 輸出所屬的類目,通常就是所在類的全名

    %t 輸出產生該日志事件的線程名

    %n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”

    %d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921

    %l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。

    [QC]是log信息的開頭,可以為任意字符,一般為項目簡稱。

    輸出的信息

    [TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'

    具體講解可參照第三部分定義配置文件中的格式化日志信息。

    7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

    此句與第3行一樣。定義名為R的輸出端的類型為每天產生一個日志文件。

    8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

    此句為定義名為R的輸出端的文件名為D:\Tomcat 5.5\logs\qc.log

    可以自行修改。

    9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

    與第4行相同。

    10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

    與第5行相同。

    12 log4j.logger.com. neusoft =DEBUG

    指定com.neusoft包下的所有類的等級為DEBUG。

    可以把com.neusoft改為自己項目所用的包名。

    13 log4j.logger.com.opensymphony.oscache=ERROR

    14 log4j.logger.net.sf.navigator=ERROR

    這兩句是把這兩個包下出現的錯誤的等級設為ERROR,如果項目中沒有配置EHCache,則不需要這兩句。

    15 log4j.logger.org.apache.commons=ERROR

    16 log4j.logger.org.apache.struts=WARN

    這兩句是struts的包。

    17 log4j.logger.org.displaytag=ERROR

    這句是displaytag的包。(QC問題列表頁面所用)

    18 log4j.logger.org.springframework=DEBUG

    此句為Spring的包。

    24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

    25 log4j.logger.org.hibernate=DEBUG

    此兩句是hibernate的包。

    以上這些包的設置可根據項目的實際情況而自行定制。

    三、log4j詳解

    1、定義配置文件

    Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件log4j.properties(鍵=值)。下面將介紹使用log4j.properties文件作為配置文件的方法:

    、配置根Logger

    Logger 負責處理日志記錄的大部分操作。

    其語法為:

    log4j.rootLogger = [ level ] , appenderName, appenderName, …

    其中,level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別。Log4j建議只使用四個級別,優 先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。比如在這里定 義了INFO級別,只有等于及高于這個級別的才進行處理,則應用程序中所有DEBUG級別的日志信息將不被打印出來。ALL:打印所有的日志,OFF:關 閉所有的日志輸出。 appenderName就是指定日志信息輸出到哪個地方。可同時指定多個輸出目的地。

    、配置日志信息輸出目的地 Appender

    Appender 負責控制日志記錄操作的輸出。

    其語法為:

    log4j.appender.appenderName = fully.qualified.name.of.appender.class

    log4j.appender.appenderName.option1 = value1



    log4j.appender.appenderName.optionN = valueN

    這里的appenderName為在①里定義的,可任意起名。

    其中,Log4j提供的appender有以下幾種:

    org.apache.log4j.ConsoleAppender(控制臺),

    org.apache.log4j.FileAppender(文件),

    org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),

    org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),可通過 log4j.appender.R.MaxFileSize=100KB設置文件大小,還可通過 log4j.appender.R.MaxBackupIndex=1設置為保存一個備份文件。

    org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

    例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    定義一個名為stdout的輸出目的地,ConsoleAppender為控制臺。

    、配置日志信息的格式(布局)Layout

    Layout 負責格式化Appender的輸出。

    其語法為:

    log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

    log4j.appender.appenderName.layout.option1 = value1



    log4j.appender.appenderName.layout.optionN = valueN

    其中,Log4j提供的layout有以下幾種:

    org.apache.log4j.HTMLLayout(以HTML表格形式布局),

    org.apache.log4j.PatternLayout(可以靈活地指定布局模式),

    org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),

    org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

    2、格式化日志信息

    Log4J采用類似C語言中的printf函數的打印格式格式化日志信息,打印參數如下:

    %m 輸出代碼中指定的消息

    %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL

    %r 輸出自應用啟動到輸出該log信息耗費的毫秒數

    %c 輸出所屬的類目,通常就是所在類的全名

    %t 輸出產生該日志事件的線程名

    %n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”

    %d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921

    %l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。

    3、在代碼中使用Log4j

    我們在需要輸出日志信息的類中做如下的三個工作:

    1、導入所有需的commongs-logging類:

    import org.apache.commons.logging.Log;

    import org.apache.commons.logging.LogFactory;

    2、在自己的類中定義一個org.apache.commons.logging.Log類的私有靜態類成員:

    private final Log log = LogFactory.getLog(getClass());

    LogFactory.getLog()方法的參數使用的是當前類的class。

    3、使用org.apache.commons.logging.Log類的成員方法輸出日志信息:

    if (log.isDebugEnabled())
    {
    log.debug("111");
    }
    if (log.isInfoEnabled())
    {
    log.info("222");
    }
    if (log.isWarnEnabled())
    {
    log.warn("333");
    }
    if (log.isErrorEnabled())
    {
    log.error("444");
    }
    if (log.isFatalEnabled())
    {
    log.fatal("555")
    }
    posted @ 2012-12-05 17:00 老天 閱讀(216) | 評論 (0)編輯 收藏
    1、@Transient 
    使用場景:一般在模型中對應某一個字段的屬性中的set和get方法中。作用是數據與數據庫中不一一對應。如:
    /*@Transient
     public String getModulename() {
      return modulename;
     }
     public void setModulename(String modulename) {
      this.modulename = modulename;
     }*/

    2、@ManyToOne
    多對一。可以把另一個模型對應過來。在查詢時,無需要聯表查詢。
     @JoinColumn(name="moduleid",insertable=false,updatable=false)
     @NotFound(action=NotFoundAction.IGNORE)
     public CateModule getCateModule() {
      return cateModule;
     }
     public void setCateModule(CateModule cateModule) {
      this.cateModule = cateModule;
     }
    posted @ 2012-12-03 11:09 老天 閱讀(244) | 評論 (0)編輯 收藏
    private Object filterHTMLTag(Object obj) throws Exception{
      if(obj==null) return obj;
      Class objCls=obj.getClass();
      Field[] allFields=objCls.getDeclaredFields();
      if(allFields!=null && allFields.length!=0){
       HTMLFilter filter=new HTMLFilter();
       for(Field field: allFields){
        if(field!=null){
         if(field.getType().equals(String.class)){
          String getMethod="get"+upperCaseFirstChar(field.getName());
          String setMethod="set"+upperCaseFirstChar(field.getName());
          try {
           //String value=(String)objCls.getMethod(getMethod).invoke(obj);
           //value=filter.filter(value);
           //objCls.getMethod(setMethod, value.getClass()).invoke(obj, value);
          } catch (Exception e) {
           throw e;
          }
         }
        }
       }
      }
      return obj;
     }
    posted @ 2012-12-03 10:49 老天 閱讀(239) | 評論 (0)編輯 收藏

    ALTER TABLE "public"."base_contract"
    ADD COLUMN "isrejected" int2 DEFAULT 0 NOT NULL;

    ALTER TABLE "public"."base_contract"
    ADD COLUMN "userid" int8 DEFAULT 0 NOT NULL;

    ALTER TABLE "public"."base_user"
    ADD COLUMN "telphone" varchar(20) DEFAULT ''::character varying NOT NULL;


    INSERT INTO "base_role" VALUES ('21', '代理商', '只能查看對屬于自己的所有合同');

    update base_contract a set userid=(SELECT b.userid from base_user b where a.username=b.username LIMIT 1)

    delete from base_menu;

    BEGIN;
    INSERT INTO "base_menu" VALUES ('1', 'infoMenu', null, '公用菜單', null, null, null, null, 'Y', '0');
    INSERT INTO "base_menu" VALUES ('2', 'ediUser', 'infoMenu', '修改個人資料', 'Note', 'ediUser.jsp', 'top', '2', 'N', '0');
    COMMIT;

     

    posted @ 2012-11-28 18:21 老天 閱讀(368) | 評論 (1)編輯 收藏
    Resin是CAUCHO公司的產品,是一個非常流行的application server,對servlet和JSP提供了良好的支持,性能也比較優良,resin自身采用JAVA語言開發!

    一、安裝環境:
    系統版本:Centos 6.0 x86_64
    Nginx版本:1.0.11
    Jdk版本:1.7.0
    Resin版本:4.0.23
    首先下載需要安裝的軟件:【JDK可以去java官網下載】
    wget http://nginx.org/download/nginx-1.1.11.tar.gz 下載nginx
    wget http://www.caucho.com/download/resin-pro-4.0.23.tar.gz 下載resin
    下載到/usr/src 下
    二、安裝nginx
    useradd www ;yum install pcre-devel && tar -xzf nginx-1.0.10.tar.gz && cd nginx-1.0.11; sed -i -e ‘s/1.0.11//g’ -e ‘s/nginx\//TDWS/g’ -e ‘s/”NGINX”/”TDWS”/g’ src/core/nginx.h &&./configure –user=www –group=www –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module &&make &&make install

    三、安裝jdk并且配置resin
    下載jdk1.7.0,并且解壓到/usr/java/下:結果顯示為 /usr/java/jdk1.7.0
    cd /usr/src/ && tar xzf resin-pro-4.0.23.tar.gz &&cd resin-pro-4.0.23 &&./configure –with-java-home=/usr/java/jdk1.7.0 &&make &&make install 即可!
    安裝完后resin的日志目錄在 /var/log/resin/下
    啟動resin命令如下 /etc/init.d/resin start 即可,然后訪問http://ip:8080

    四、nginx整合resin的方式跟nginx整合tomcat一樣,再這里就不重復了!
    提供我上一篇文章地址:http://chinaapp.sinaapp.com/?p=1922

    五、resin配置優化:
    以下是我的配置文件:貼出一部分修改的,其他的保持不變,在回復下面!

    posted @ 2012-11-20 18:40 老天 閱讀(598) | 評論 (1)編輯 收藏

    一:if指令:
    <#if condition>...
    <#elseif condition2>...
    <#elseif condition3>...
    ...<#else>...
    </#if>

    二:switch
    <#switch value>
    <#case refValue1>...<#break>
    <#case refValue2>...<#break>...
    <#case refValueN>...<#break>
    <#default>...</#switch>

    三:list,break
    <#list sequence as item>
    ...
    </#list>
    兩個特殊的循環變量:
    item_index: 當前變量的索引值。
    item_has_next: 是否存在下一個對象。

    可以用<#break/>指令離開loop循環。

    四:include指令
    <#include filename>或者
    <#include filenameoptions>
    filename: 表達式轉換為字符串
    options: encoding=encoding, parse=parse encoding: 表達式轉換為字符串
    parse: 表達式轉換為邏輯值,是否作為ftl文件解析。
    <#include "/common/navbar.html" parse=false encoding="Shift_JIS">

    <#include "*/footer.ftl">表示當前目錄下以及所有父目錄下的文件。如果當前模版在/foo/bar/template.ftl ,那么查找footer.ftl的順序為:/foo/bar/footer.ftl
    /foo/footer.ftl/footer.ftl這種方式講允許設計者將通用的模版放在父文件夾里面。
    也可以只指定部分路徑:<#include "*/commons/footer.ftl">

    五:import指令<#import path as hash>
    六:noparse
    <#noparse>
    ...
    </#noparse>

    七:compress
    <#compress>
    ...
    </#compress>
    八:escape,noescape
    <#escape identifier as expression>
    ...
    <#noescape>...</#noescape>
    ...
    </#escape>

    escape指令body區的ftl的interpolations都會被自動加上escape表達式。但是不會影響字符串內的interpolations。而且也只會影響到body內出現的interpolations,比如不會影響到include的ftl的interpolations。
    <#escape x as x?html>
    First name: ${firstName}
    Last name: ${lastName}
    Maiden name: ${maidenName}</#escape>
    等同于:

    First name: ${firstName?html}
    Last name: ${lastName?html}
    Maiden name: ${maidenName?html}

    escape指令在解析模版時起作用,而不是運行時起作用。

    escape指令還能嵌套使用,子繼承父的escape規則。

    <#escape x as x?html>
    Customer Name: ${customerName}
    Items to ship:
    <#escape x as itemCodeToNameMap[x]>
    ${itemCode1}
    ${itemCode2}
    ${itemCode3}
    ${itemCode4}
    </#escape></#escape>
    等同于:Customer Name: ${customerName?html}
    Items to ship:
    ${itemCodeToNameMap[itemCode1]?html}
    ${itemCodeToNameMap[itemCode2]?html}
    ${itemCodeToNameMap[itemCode3]?html}
    ${itemCodeToNameMap[itemCode4]?html}

    九:assign指令
    <#assign name=value>or<#assign name1=value1name2=value2... nameN=valueN>or<#assign same as above... in namespacehash>or<#assign name> capture this</#assign>or<#assign name in namespacehash> capture this</#assign>創建或者替換一個已經存在的變量,只能作用于頂層變量。不好的做法:<#assign x>Hello ${user}!</#assign>更改為:<#assign x="Hello ${user}!">
    十:global指令
    <#global name=value>
    or
    <#global name1=value1name2=value2... nameN=valueN>or<#global name>
    capture this
    </#global>
    十一:local指令
    <#local name=value>
    or
    <#local name1=value1name2=value2... nameN=valueN>or<#local name>
    capture this
    </#local>只能用于macro的定義body中。


    十二:setting指令:

    <#setting name=value>
    name的取值范圍:
    local:number_format:
    boolean_format:缺省值為"true,false"
    date_format, time_format, datetime_format
    time_zone:url_escaping_charset
    classic_compatible

    十三:用戶自定義指令
    <@macro_or_transfparam1=val1param2=val2...paramN=valN/><@macro_or_transfparam1=val1param2=val2...paramN=valN ; lv1, lv2, ..., lvN/><@macro_or_transf...> ...</@macro_or_transf><@macro_or_transf...> ...</@><@macro_or_transfval1, val2, ..., valN/>
    十四:macro,nested,return
    <#macro nameparam1param2... paramN>
    ...
    <#nested loopvar1, loopvar2, ..., loopvarN>
    ...
    <#return>
    ...
    </#macro>

    十五:function, return
    <#function nameparam1param2... paramN>
    ... <#return returnValue>
    ...
    </#function>

    <#function avg x y>
    <#return (x + y) / 2>
    </#function>
    ${avg(10, 20)}

    十六:flush
    <#flush>

    十七:stop
    <#stop>
    or
    <#stop reason>取消處理模版。

    十八:ftl指令
    <#ftl param1=value1param2=value2...paramN=valueN>
    ftl指令必須放在ftl文件的最上面。

    參數范圍:
    encoding:
    strip_whitespace
    strip_text
    strict_syntax

    十九:t, lt, rt
    二十:attempt, recover
    <#attempt>
    attempt block<#recover>
    recover block
    </#attempt>

    <#attempt>
    Optional content: ${thisMayFails}
    <#recover>
    Ops! The optional content is not available.
    </#attempt>

    posted @ 2012-11-15 11:30 老天 閱讀(424) | 評論 (0)編輯 收藏
     

    <!-- http://www.iefans.net/ie8-filteralpha-png-touming/ 

    IE8里可以這樣寫 -ms-filter:”progid:DXImageTransform.Microsoft.Alpha(opacity=50)”;

    IE7里可以這樣寫 filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);

    IE6,IE7,IE8里都可以這樣寫 filter:alpha(opacity=50)

    -->

     

     

     

     

    from:http://unc0pyrightable.blog.163.com/blog/static/1313300602010021526561/

    今天推薦一個最完美讓ie6支持png透明的js,為什么說它最完美呢?

    只因為它支持background-position和background-repeat

    這是市面上的其它方法比不上的

    首先,要在網頁中引用js

    <!--[if IE 6]>
    <script src="http://www.dillerdesign.com/experiment/DD_belatedPNG/DD_belatedPNG_0.0.8a-min.js"></script>
    <script>
    DD_belatedPNG.fix('.png_bg');
    </script>
    <![endif]-->

    上面那個js路徑是絕對路徑,大家最好還是把它下下來,以防網站掛了.

    引用之后就是更改第二個<script>里的.png為你要實現效果的選擇器.

    就比如,你#header引用了一個background,那你上面就要改為:

    DD_belatedPNG.fix('#header');

    并且它還支持組選擇器,如:

    DD_belatedPNG.fix('#header,h1,h2,h3,#content');

    很簡單吧,只要把有透明png的標簽或選擇器寫在里面就行

    至于這里面能不能支持css3就不得而知了.

    官網:http://www.dillerdesign.com/experiment/DD_belatedPNG/

    這個JS內容(DD_belatedPNG_0.0.8a-min.js),備存:

    /**
    * DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.
    * Author: Drew Diller
    * Email: drew.diller@gmail.com
    * URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/
    * Version: 0.0.8a
    * Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license
    *
    * Example usage:
    * DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
    * DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
    **/
    var DD_belatedPNG={
    ns:"DD_belatedPNG",imgSize:{
    },delay:10,nodesFixed:0,createVmlNameSpace:function () {
       if(document.namespaces&&!document.namespaces[this.ns]) {
        document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")
       }
    },createVmlStyleSheet:function () {
       var b,a;
       b=document.createElement("style");
       b.setAttribute("media","screen");
       document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);
       if(b.styleSheet) {
        b=b.styleSheet;
        b.addRule(this.ns+"\\:*","{behavior:url(#default#VML)}");
        b.addRule(this.ns+"\\:shape","position:absolute;");
        b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");
        this.screenStyleSheet=b;
        a=document.createElement("style");
        a.setAttribute("media","print");
        document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);
        a=a.styleSheet;
        a.addRule(this.ns+"\\:*","{display: none !important;}");
        a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")
       }
    },readPropertyChange:function () {
       var b,c,a;
       b=event.srcElement;
       if(!b.vmlInitiated) {
        return
       }if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1) {
        DD_belatedPNG.applyVML(b)
       }if(event.propertyName=="style.display") {
        c=(b.currentStyle.display=="none")?"none":"block";
        for(a in b.vml) {
         if(b.vml.hasOwnProperty (a)) {
          b.vml[a].shape.style.display=c
         }
        }
       }if(event.propertyName.search("filter")!=-1) {
        DD_belatedPNG.vmlOpacity(b)
       }
    },vmlOpacity:function (b) {
       if(b.currentStyle.filter.search("lpha")!=-1) {
        var a=b.currentStyle.filter;
        a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;
        b.vml.color.shape.style.filter=b.currentStyle.filter;
        b.vml.image.fill.opacity=a
       }
    },handlePseudoHover:function (a) {
       setTimeout(function () {
        DD_belatedPNG.applyVML(a)
       },1)
    },fix:function (a) {
       if(this.screenStyleSheet) {
        var c,b;
        c=a.split(",");
        for(b=0;b<c.length;b++) {
         this.screenStyleSheet.addRule(c[b],"behavior:expression(DD_belatedPNG.fixPng(this))")
        }
       }
    },applyVML:function (a) {
       a.runtimeStyle.cssText="";
       this.vmlFill(a);
       this.vmlOffsets(a);
       this.vmlOpacity(a);
       if(a.isImg) {
        this.copyImageBorders(a)
       }
    },attachHandlers:function (i) {
       var d,c,g,e,b,f;
       d=this;
       c={
        resize:"vmlOffsets",move:"vmlOffsets"
       };
       if(i.nodeName=="A") {
        e={
         mouseleave:"handlePseudoHover",mouseenter:"handlePseudoHover",focus:"handlePseudoHover",blur:"handlePseudoHover"
        };
        for(b in e) {
         if(e.hasOwnProperty (b)) {
          c[b]=e[b]
         }
        }
       }for(f in c) {
        if(c.hasOwnProperty (f)) {
         g=function () {
          d[c[f]](i)
         };
         i.attachEvent("on"+f,g)
        }
       }i.attachEvent("onpropertychange",this.readPropertyChange)
    },giveLayout:function (a) {
       a.style.zoom=1;
       if(a.currentStyle.position=="static") {
        a.style.position="relative"
       }
    },copyImageBorders:function (b) {
       var c,a;
       c={
        borderStyle:true,borderWidth:true,borderColor:true
       };
       for(a in c) {
        if(c.hasOwnProperty (a)) {
         b.vml.color.shape.style[a]=b.currentStyle[a]
        }
       }
    },vmlFill:function (e) {
       if(!e.currentStyle) {
        return
       }else {
        var d,f,g,b,a,c;
        d=e.currentStyle
       }for(b in e.vml) {
        if(e.vml.hasOwnProperty (b)) {
         e.vml[b].shape.style.zIndex=d.zIndex
        }
       }e.runtimeStyle.backgroundColor="";
       e.runtimeStyle.backgroundImage="";
       f=true;
       if(d.backgroundImage!="none"||e.isImg) {
        if(!e.isImg) {
         e.vmlBg=d.backgroundImage;
         e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf('")')-5)
        }else {
         e.vmlBg=e.src
        }g=this;
        if(!g.imgSize[e.vmlBg]) {
         a=document.createElement("img");
         g.imgSize[e.vmlBg]=a;
         a.className=g.ns+"_sizeFinder";
         a.runtimeStyle.cssText="behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;";
         c=function () {
          this.width=this.offsetWidth;
          this.height=this.offsetHeight;
          g.vmlOffsets(e)
         };
         a.attachEvent("onload",c);
         a.src=e.vmlBg;
         a.removeAttribute("width");
         a.removeAttribute("height");
         document.body.insertBefore(a,document.body.firstChild)
        }e.vml.image.fill.src=e.vmlBg;
        f=false
       }e.vml.image.fill.on=!f;
       e.vml.image.fill.color="none";
       e.vml.color.shape.style.backgroundColor=d.backgroundColor;
       e.runtimeStyle.backgroundImage="none";
       e.runtimeStyle.backgroundColor="transparent"
    },vmlOffsets:function (d) {
       var h,n,a,e,g,m,f,l,j,i,k;
       h=d.currentStyle;
       n={
        W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop
       };
       a=(n.L+n.bLW==1)?1:0;
       e=function (b,p,q,c,s,u) {
        b.coordsize=c+","+s;
        b.coordorigin=u+","+u;
        b.path="m0,0l"+c+",0l"+c+","+s+"l0,"+s+" xe";
        b.style.width=c+"px";
        b.style.height=s+"px";
        b.style.left=p+"px";
        b.style.top=q+"px"
       };
       e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);
       e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);
       g={
        X:0,Y:0
       };
       if(d.isImg) {
        g.X=parseInt(h.paddingLeft,10)+1;
        g.Y=parseInt(h.paddingTop,10)+1
       }else {
        for(j in g) {
         if(g.hasOwnProperty (j)) {
          this.figurePercentage(g,n,j,h["backgroundPosition"+j])
         }
        }
       }d.vml.image.fill.position=(g.X/n.W)+","+(g.Y/n.H);
       m=h.backgroundRepeat;
       f={
        T:1,R:n.W+a,B:n.H,L:1+a
       };
       l={
        X:{
         b1:"L",b2:"R",d:"W"
        },Y:{
         b1:"T",b2:"B",d:"H"
        }
       };
       if(m!="repeat"||d.isImg) {
        i={
         T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)
        };
        if(m.search("repeat-")!=-1) {
         k=m.split("repeat-")[1].toUpperCase();
         i[l[k].b1]=1;
         i[l[k].b2]=n[l[k].d]
        }if(i.B>n.H) {
         i.B=n.H
        }d.vml.image.shape.style.clip="rect("+i.T+"px "+(i.R+a)+"px "+i.B+"px "+(i.L+a)+"px)"
       }else {
        d.vml.image.shape.style.clip="rect("+f.T+"px "+f.R+"px "+f.B+"px "+f.L+"px)"
       }
    },figurePercentage:function (d,c,f,a) {
       var b,e;
       e=true;
       b=(f=="X");
       switch(a) {
        case "left":case "top":d[f]=0;
        break;
        case "center":d[f]=0.5;
        break;
        case "right":case "bottom":d[f]=1;
        break;
        default:if(a.search("%")!=-1) {
         d[f]=parseInt(a,10)/100
        }else {
         e=false
        }
       }d[f]=Math.ceil(e?((c[b?"W":"H"]*d[f])-(c[b?"w":"h"]*d[f])):parseInt(a,10));
       if(d[f]%2===0) {
        d[f]++
       }return d[f]
    },fixPng:function (c) {
       c.style.behavior="none";
       var g,b,f,a,d;
       if(c.nodeName=="BODY"||c.nodeName=="TD"||c.nodeName=="TR") {
        return
       }c.isImg=false;
       if(c.nodeName=="IMG") {
        if(c.src.toLowerCase().search(/\.png$/)!=-1) {
         c.isImg=true;
         c.style.visibility="hidden"
        }else {
         return
        }
       }else {
        if(c.currentStyle.backgroundImage.toLowerCase().search(".png")==-1) {
         return
        }
       }g=DD_belatedPNG;
       c.vml={
        color:{
        },image:{
        }
       };
       b={
        shape:{
        },fill:{
        }
       };
       for(a in c.vml) {
        if(c.vml.hasOwnProperty (a)) {
         for(d in b) {
          if(b.hasOwnProperty (d)) {
           f=g.ns+":"+d;
           c.vml[a][d]=document.createElement(f)
          }
         }c.vml[a].shape.stroked=false;
         c.vml[a].shape.appendChild(c.vml[a].fill);
         c.parentNode.insertBefore(c.vml[a].shape,c)
        }
       }c.vml.image.shape.fillcolor="none";
       c.vml.image.fill.type="tile";
       c.vml.color.fill.on=false;
       g.attachHandlers(c);
       g.giveLayout(c);
       g.giveLayout(c.offsetParent);
       c.vmlInitiated=true;
       g.applyVML(c)
    }
    };
    try{
    document.execCommand("BackgroundImageCache",false,true)
    }catch(r) {
    }DD_belatedPNG.createVmlNameSpace();
    DD_belatedPNG.createVmlStyleSheet();

     

     

     

    或者:

    讓IE6支持PNG格式的圖片

    用法:

    先復制下面的代碼在記事本中,然后另存為pngbehavior.htc(名字可以任意):

    <public:componentlightWeight="true">
    <public:attach event="onpropertychange"onevent="propertyChanged()" />
    <public:attach event="onbeforeprint"onevent="beforePrint()" for="window"/>
    <public:attach event="onafterprint"onevent="afterPrint()" for="window"/>
    <script>



    var supported = /MSIE ((5\.5)|[6789])/.test(navigator.userAgent)&&
    navigator.platform== "Win32";

    var realSrc;
    var blankSrc = "blank.gif";
    var isPrinting = false;

    if (supported) fixImage();

    function propertyChanged() {
    if (!supported || isPrinting) return;

    var pName = event.propertyName;
    if (pName != "src") return;
    // if not set to blank
    if (!new RegExp(blankSrc).test(src))
    fixImage();
    };

    function fixImage() {
    // get src
    var src = element.src;

    // check for real change
    if (src == realSrc&& /\.png$/i.test(src)) {
    element.src =blankSrc;
    return;
    }

    if ( ! new RegExp(blankSrc).test(src)) {
    // backup old src
    realSrc = src;
    }

    // test for png
    if (/\.png$/i.test(realSrc)) {
    // set blank image
    element.src =blankSrc;
    // set filter
    element.runtimeStyle.filter= "progid:DXImageTransform.Microsoft." +
    "AlphaImageLoader(src='"+ src + "',sizingMethod='scale')";
    }
    else {
    // remove filter
    element.runtimeStyle.filter= "";
    }
    }

    function beforePrint() {
    isPrinting = true;
    element.src = realSrc;
    element.runtimeStyle.filter = "";
    realSrc = null;
    }

    function afterPrint() {
    isPrinting = false;
    fixImage();
    }

    </script>
    </public:component>


    最后在你的css文件里面加上這么一段代碼:

    img {
    behavior: url("pngbehavior.htc");
    }
    posted @ 2012-11-15 10:26 老天 閱讀(188) | 評論 (0)編輯 收藏
    僅列出標題  下一頁
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿

    隨筆檔案

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 皇色在线免费视频| 黄色视屏在线免费播放| 97无码免费人妻超级碰碰碰碰 | 午夜网站在线观看免费完整高清观看 | 久久精品免费一区二区三区| 亚洲一区二区三区影院| 国产综合免费精品久久久| 亚洲精品无码专区久久久| 久久国产免费观看精品| 亚洲狠狠狠一区二区三区| 免费观看的毛片大全| 在线观看日本亚洲一区| 日韩午夜免费视频| 青青草国产免费国产是公开| 久久国产成人亚洲精品影院| 国产精品免费看久久久| 亚洲国产精品一区二区久| 在线精品免费视频| jizz在线免费播放| 亚洲成人在线网站| 久久久久久国产精品免费免费| 亚洲国产精品99久久久久久 | 亚洲女久久久噜噜噜熟女| 国产成人久久AV免费| 激情综合亚洲色婷婷五月APP| 麻豆国产人免费人成免费视频| 人妖系列免费网站观看| 久久亚洲精品中文字幕无码| 国产一卡二卡3卡四卡免费| 亚洲av片在线观看| 亚洲男人的天堂www| 91频在线观看免费大全| 看一级毛片免费观看视频| 亚洲国产成人片在线观看| 18禁免费无码无遮挡不卡网站 | 亚洲av无码一区二区三区在线播放| 亚洲成a人片在线观看老师| 无码精品人妻一区二区三区免费看 | 亚洲一区二区三区久久久久| 亚洲AV中文无码乱人伦| 91精品国产免费入口|