@NotFound(action=NotFoundAction.IGNORE)
注解配置實(shí)體類(lèi)的關(guān)聯(lián)關(guān)系,在many-to-one,one-to-one關(guān)聯(lián)中,一邊引用自另一邊的屬性,如果屬性值為某某的數(shù)據(jù)在數(shù)據(jù)庫(kù)不存在了,hibernate默認(rèn)會(huì)拋出異常。解決此問(wèn)題,加上如下注解就可以了:
-------------------------------------------------------------------
cascade = CascadeType.REFRESH,cascade=CascadeType.ALL
cascade表示級(jí)聯(lián)操作
CascadeType.MERGE級(jí)聯(lián)更新:若items屬性修改了那么order對(duì)象保存時(shí)同時(shí)修改items里的對(duì)象。對(duì)應(yīng)EntityManager的merge方法
CascadeType.PERSIST級(jí)聯(lián)刷新:獲取order對(duì)象里也同時(shí)也重新獲取最新的items時(shí)的對(duì)象。對(duì)應(yīng)EntityManager的refresh(object)方法有效。即會(huì)重新查詢數(shù)據(jù)庫(kù)里的最新數(shù)據(jù)
CascadeType.REFRESH級(jí)聯(lián)保存:對(duì)order對(duì)象保存時(shí)也對(duì)items里的對(duì)象也會(huì)保存。對(duì)應(yīng)EntityManager的presist方法
CascadeType.REMOVE級(jí)聯(lián)刪除:對(duì)order對(duì)象刪除也對(duì)items里的對(duì)象也會(huì)刪除。對(duì)應(yīng)EntityManager的remove方法
CascadeType.PERSIST只有A類(lèi)新增時(shí),會(huì)級(jí)聯(lián)B對(duì)象新增。若B對(duì)象在數(shù)據(jù)庫(kù)存(跟新)在則拋異常(讓B變?yōu)槌志脩B(tài))CascadeType.MERGE指A類(lèi)新增或者變化,會(huì)級(jí)聯(lián)B對(duì)象(新增或者變化)
CascadeType.REMOVE只有A類(lèi)刪除時(shí),會(huì)級(jí)聯(lián)刪除B類(lèi);
CascadeType.ALL包含所有;
CascadeType.REFRESH沒(méi)用過(guò)。
綜上:大多數(shù)情況用CascadeType.MERGE就能達(dá)到級(jí)聯(lián)跟新又不報(bào)錯(cuò),用CascadeType.ALL時(shí)要斟酌下CascadeType.REMOVE
@Fetch:
定義了加載關(guān)聯(lián)關(guān)系的獲取策略. FetchMode 可以是
SELECT (在需要加載關(guān)聯(lián)的時(shí)候觸發(fā)select操作), SUBSELECT(只對(duì)集合有效,使用了子查詢策略,詳情參考Hibernate參考文檔)
JOIN (在加載主實(shí)體(owner entity)的時(shí)候使用SQL JOIN來(lái)加載關(guān)聯(lián)關(guān)系).
JOIN 將覆寫(xiě)任何延遲屬性 (通過(guò) JOIN策略加載的關(guān)聯(lián)將不再具有延遲性).
-------------------------------------------------------------------
fetch=FetchType.LAZY
Hibernate的數(shù)據(jù)加載方式:
1.即時(shí)加載 immediately loading
實(shí)體加載完成后,立即加載其關(guān)聯(lián)的數(shù)據(jù)。
2.延遲加載lazy loading
實(shí)體相關(guān)聯(lián)的數(shù)據(jù)在第一次訪問(wèn)時(shí)再進(jìn)行讀取。
3.預(yù)先加載 eager loading
與immediately loading類(lèi)似,但實(shí)體和相關(guān)聯(lián)的數(shù)據(jù)是通過(guò)一條sql同時(shí)讀取。
4.批量加載 batch loading
?
EntityManager 的API
下面是EntityManager的一些主要的接口方法:
void persist(Object entity)
通過(guò)調(diào)用EntityManager的persist()方法,新實(shí)體實(shí)例將轉(zhuǎn)換為受控狀態(tài)。這意謂著當(dāng)persist()方法所在的事務(wù)提交時(shí),實(shí)體的數(shù)據(jù)將保存到數(shù)據(jù)庫(kù)中。如果實(shí)體已經(jīng)被持久化,那么調(diào)用persist()操作不會(huì)發(fā)生任何事情。如果對(duì)一個(gè)已經(jīng)刪除的實(shí)體調(diào)用persist()操作,刪除態(tài)的實(shí)體又轉(zhuǎn)變?yōu)槭芸貞B(tài)。如果對(duì)游離狀的實(shí)體執(zhí)行persist()操作,將拋出IllegalArgumentException。 在一個(gè)實(shí)體上調(diào)用persist()操作,將廣播到和實(shí)體關(guān)聯(lián)的實(shí)體上,執(zhí)行相應(yīng)的級(jí)聯(lián)持久化操作;
void remove(Object entity)
通過(guò)調(diào)用remove()方法刪除一個(gè)受控的實(shí)體。如果實(shí)體聲明為級(jí)聯(lián)刪除(cascade=REMOVE 或者cascade=ALL ),被關(guān)聯(lián)的實(shí)體也會(huì)被刪除。在一個(gè)新建狀態(tài)的實(shí)體上調(diào)用remove()操作,將被忽略。如果在游離實(shí)體上調(diào)用remove()操作,將拋出IllegalArgumentException,相關(guān)的事務(wù)將回滾。如果在已經(jīng)刪除的實(shí)體上執(zhí)行remove()操作,也會(huì)被忽略;
void flush()
將受控態(tài)的實(shí)體數(shù)據(jù)同步到數(shù)據(jù)庫(kù)中;
T merge(T entity)
將一個(gè)游離態(tài)的實(shí)體持久化到數(shù)據(jù)庫(kù)中,并轉(zhuǎn)換為受控態(tài)的實(shí)體;
T find(Class entityClass, Object primaryKey)
以主鍵查詢實(shí)體對(duì)象,entityClass是實(shí)體的類(lèi),primaryKey是主鍵值,如以下的代碼查詢Topic實(shí)體: Topic t = em.find(Topic.class,1); Query createQuery(String qlString) 根據(jù)JPA的查詢語(yǔ)句創(chuàng)建一個(gè)查詢對(duì)象Query,如下面的代碼:
Query q= em.createQuery(""SELECT t FROM Topic t WHERE t.topicTitle LIKE :topicTitle")"); Query createNativeQuery(String sqlString)
使用本地?cái)?shù)據(jù)庫(kù)的SQL語(yǔ)句創(chuàng)建一個(gè)Query對(duì)象,Query通過(guò)getResultList()方法執(zhí)行查詢后,返回一個(gè)List結(jié)果集,每一行數(shù)據(jù)對(duì)應(yīng)一個(gè)Vector。
使用本地?cái)?shù)據(jù)庫(kù)的SQL語(yǔ)句創(chuàng)建一個(gè)Query對(duì)象,Query通過(guò)getResultList()方法執(zhí)行查詢后,返回一個(gè)List結(jié)果集,每一行數(shù)據(jù)對(duì)應(yīng)一個(gè)Vector。
看來(lái)要學(xué)習(xí)的東東還有好多啊~~努力吧!
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
目前建議下載版本:穩(wěn)定版3.0.5
1、struts2 top關(guān)鍵字理解。
1).top 指代當(dāng)前迭代元素,可以為對(duì)象;
2).這里的top可用[0].top替代,但不能使用[0];[0]代表整個(gè)棧對(duì)象。如果單純調(diào)用[0]將會(huì)調(diào)用其 toString()方法輸出對(duì)象信息;
2、刪除信息時(shí)錯(cuò)誤日志:
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
現(xiàn)在應(yīng)該明白了吧,在刪除之前把這個(gè)Detached instance綁定到當(dāng)前的Sesssion,在用當(dāng)前Sesssion刪除此instance。修改后的代碼如
解決辦法:
public void delete(SASVo vo) {
entityManager.remove( entityManager.merge(vo));
}
dom是解析xml的底層接口之一(另一種是sax)
而jdom和dom4j則是基于底層api的更高級(jí)封裝
dom是通用的,而jdom和dom4j則是面向java語(yǔ)言的
DOM 是用與平臺(tái)和語(yǔ)言無(wú)關(guān)的方式表示 XML 文檔的官方 W3C 標(biāo)準(zhǔn)。DOM 是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個(gè)層次結(jié)構(gòu)允許開(kāi)發(fā)人員在樹(shù)中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu),然后才能做任何工作。由于它是基于信息層次的,因而 DOM 被認(rèn)為是基于樹(shù)或基于對(duì)象的。DOM 以及廣義的基于樹(shù)的處理具有幾個(gè)優(yōu)點(diǎn)。首先,由于樹(shù)在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對(duì)數(shù)據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹(shù)中上下導(dǎo)航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來(lái)也要簡(jiǎn)單得多。
XML的四種解析器(dom,sax,jdom,dom4j)原理及性能比較(轉(zhuǎn)自zsq)
1、DOM
DOM 是用與平臺(tái)和語(yǔ)言無(wú)關(guān)的方式表示 XML 文檔的官方 W3C 標(biāo)準(zhǔn)。DOM 是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個(gè)層次結(jié)構(gòu)允許開(kāi)發(fā)人員在樹(shù)中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu),然后才能做任何工作。由于它是基于信息層次的,因而 DOM 被認(rèn)為是基于樹(shù)或基于對(duì)象的。DOM 以及廣義的基于樹(shù)的處理具有幾個(gè)優(yōu)點(diǎn)。
首先,由于樹(shù)在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對(duì)數(shù)據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹(shù)中上下導(dǎo)航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來(lái)也要簡(jiǎn)單得多。
另一方面,對(duì)于特別大的文檔,解析和加載整個(gè)文檔可能很慢且很耗資源,因此使用其他手段來(lái)處理這樣的數(shù)據(jù)會(huì)更好。這些基于事件的模型,比如 SAX。
2、SAX
這種處理的優(yōu)點(diǎn)非常類(lèi)似于流媒體的優(yōu)點(diǎn)。分析能夠立即開(kāi)始,而不是等待所有的數(shù)據(jù)被處理。而且,由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來(lái)說(shuō)是個(gè)巨大的優(yōu)點(diǎn)。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿足時(shí)停止解析。一般來(lái)說(shuō),SAX 還比它的替代者 DOM 快許多。
3、選擇 DOM 還是選擇 SAX ?
對(duì)于需要自己編寫(xiě)代碼來(lái)處理 XML 文檔的開(kāi)發(fā)人員來(lái)說(shuō),選擇 DOM 還是 SAX 解析模型是一個(gè)非常重要的設(shè)計(jì)決策。
DOM 采用建立樹(shù)形結(jié)構(gòu)的方式訪問(wèn) XML 文檔,而 SAX 采用的事件模型。
DOM 解析器把 XML 文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹(shù),并可以對(duì)樹(shù)進(jìn)行遍歷。用 DOM 解析模型的優(yōu)點(diǎn)是編程容易,開(kāi)發(fā)人員只需要調(diào)用建樹(shù)的指令,然后利用navigation APIs訪問(wèn)所需的樹(shù)節(jié)點(diǎn)來(lái)完成任務(wù)。可以很容易的添加和修改樹(shù)中的元素。然而由于使用 DOM 解析器的時(shí)候需要處理整個(gè) XML 文檔,所以對(duì)性能和內(nèi)存的要求比較高,尤其是遇到很大的 XML 文件的時(shí)候。由于它的遍歷能力,DOM 解析器常用于 XML 文檔需要頻繁的改變的服務(wù)中。
SAX 解析器采用了基于事件的模型,它在解析 XML 文檔的時(shí)候可以觸發(fā)一系列的事件,當(dāng)發(fā)現(xiàn)給定的tag的時(shí)候,它可以激活一個(gè)回調(diào)方法,告訴該方法制定的標(biāo)簽已經(jīng)找到。SAX 對(duì)內(nèi)存的要求通常會(huì)比較低,因?yàn)樗岄_(kāi)發(fā)人員自己來(lái)決定所要處理的tag。特別是當(dāng)開(kāi)發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX 這種擴(kuò)展能力得到了更好的體現(xiàn)。但用 SAX 解析器的時(shí)候編碼工作會(huì)比較困難,而且很難同時(shí)訪問(wèn)同一個(gè)文檔中的多處不同數(shù)據(jù)。
4、JDOM
JDOM的目的是成為 Java 特定文檔模型,它簡(jiǎn)化與 XML 的交互并且比使用 DOM 實(shí)現(xiàn)更快。由于是第一個(gè) Java 特定模型,JDOM 一直得到大力推廣和促進(jìn)。正在考慮通過(guò)“Java 規(guī)范請(qǐng)求 JSR-102”將它最終用作“Java 標(biāo)準(zhǔn)擴(kuò)展”。從 2000 年初就已經(jīng)開(kāi)始了 JDOM 開(kāi)發(fā)。
JDOM 與 DOM 主要有兩方面不同。首先,JDOM 僅使用具體類(lèi)而不使用接口。這在某些方面簡(jiǎn)化了 API,但是也限制了靈活性。第二,API 大量使用了 Collections 類(lèi),簡(jiǎn)化了那些已經(jīng)熟悉這些類(lèi)的 Java 開(kāi)發(fā)者的使用。
JDOM 文檔聲明其目的是“使用 20%(或更少)的精力解決 80%(或更多)Java/XML 問(wèn)題”(根據(jù)學(xué)習(xí)曲線假定為 20%)。JDOM 對(duì)于大多數(shù) Java/XML 應(yīng)用程序來(lái)說(shuō)當(dāng)然是有用的,并且大多數(shù)開(kāi)發(fā)者發(fā)現(xiàn) API 比 DOM 容易理解得多。JDOM 還包括對(duì)程序行為的相當(dāng)廣泛檢查以防止用戶做任何在 XML 中無(wú)意義的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作(或者甚至理解某些情況下的錯(cuò)誤)。這也許是比學(xué)習(xí) DOM 或 JDOM 接口都更有意義的工作。
JDOM 自身不包含解析器。它通常使用 SAX2 解析器來(lái)解析和驗(yàn)證輸入 XML 文檔(盡管它還可以將以前構(gòu)造的 DOM 表示作為輸入)。它包含一些轉(zhuǎn)換器以將 JDOM 表示輸出成 SAX2 事件流、DOM 模型或 XML 文本文檔。JDOM 是在 Apache 許可證變體下發(fā)布的開(kāi)放源碼。
5、DOM4J
雖然 DOM4J 代表了完全獨(dú)立的開(kāi)發(fā)結(jié)果,但最初,它是 JDOM 的一種智能分支。它合并了許多超出基本 XML 文檔表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文檔或流化文檔的基于事件的處理。它還提供了構(gòu)建文檔表示的選項(xiàng),它通過(guò) DOM4J API 和標(biāo)準(zhǔn) DOM 接口具有并行訪問(wèn)功能。從 2000 下半年開(kāi)始,它就一直處于開(kāi)發(fā)之中。
為支持所有這些功能,DOM4J 使用接口和抽象基本類(lèi)方法。DOM4J 大量使用了 API 中的 Collections 類(lèi),但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然 DOM4J 付出了更復(fù)雜的 API 的代價(jià),但是它提供了比 JDOM 大得多的靈活性。
在添加靈活性、XPath 集成和對(duì)大文檔處理的目標(biāo)時(shí),DOM4J 的目標(biāo)與 JDOM 是一樣的:針對(duì) Java 開(kāi)發(fā)者的易用性和直觀操作。它還致力于成為比 JDOM 更完整的解決方案,實(shí)現(xiàn)在本質(zhì)上處理所有 Java/XML 問(wèn)題的目標(biāo)。在完成該目標(biāo)時(shí),它比 JDOM 更少?gòu)?qiáng)調(diào)防止不正確的應(yīng)用程序行為。
DOM4J 是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開(kāi)放源代碼的軟件。如今你可以看到越來(lái)越多的 Java 軟件都在使用 DOM4J 來(lái)讀寫(xiě) XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。
6、總述
JDOM 和 DOM 在性能測(cè)試時(shí)表現(xiàn)不佳,在測(cè)試 10M 文檔時(shí)內(nèi)存溢出。在小文檔情況下還值得考慮使用 DOM 和 JDOM。雖然 JDOM 的開(kāi)發(fā)者已經(jīng)說(shuō)明他們期望在正式發(fā)行版前專注性能問(wèn)題,但是從性能觀點(diǎn)來(lái)看,它確實(shí)沒(méi)有值得推薦之處。另外,DOM 仍是一個(gè)非常好的選擇。DOM 實(shí)現(xiàn)廣泛應(yīng)用于多種編程語(yǔ)言。它還是許多其它與 XML 相關(guān)的標(biāo)準(zhǔn)的基礎(chǔ),因?yàn)樗将@得 W3C 推薦(與基于非標(biāo)準(zhǔn)的 Java 模型相對(duì)),所以在某些類(lèi)型的項(xiàng)目中可能也需要它(如在 javascript 中使用 DOM)。
SAX表現(xiàn)較好,這要依賴于它特定的解析方式。一個(gè) SAX 檢測(cè)即將到來(lái)的XML流,但并沒(méi)有載入到內(nèi)存(當(dāng)然當(dāng)XML流被讀入時(shí),會(huì)有部分文檔暫時(shí)隱藏在內(nèi)存中)。
無(wú)疑,DOM4J是最好的,目前許多開(kāi)源項(xiàng)目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來(lái)讀取 XML 配置文件。如果不考慮可移植性,那就采用DOM4J吧!
第二步:在CLASSPATH下建立log4j.properties。內(nèi)容如下:
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
第三步:相應(yīng)的修改其中屬性,修改之前就必須知道這些都是干什么的,在第二部分講解。
第四步:在要輸出日志的類(lèi)中加入相關(guān)語(yǔ)句:
定義屬性:protected final Log log = LogFactory.getLog(getClass());
在相應(yīng)的方法中:
if (log.isDebugEnabled())
{
log.debug(“System …..”);
}
二、Log4j說(shuō)明
1 log4j.rootCategory=INFO, stdout , R
此句為將等級(jí)為INFO的日志信息輸出到 stdout和R這兩個(gè)目的地,stdout和R的定義在下面的代碼,可以任意起名。等級(jí)可分為OFF、 FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF則不打出任何信息,如果配置為INFO這樣只顯示INFO, WARN, ERROR的log信息,而DEBUG信息不會(huì)被顯示,具體講解可參照第三部分定義配置文件中的logger。
3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
此句為定義名為stdout的輸出端是哪種類(lèi)型,可以是
org.apache.log4j.ConsoleAppender(控制臺(tái)),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件)
org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
具體講解可參照第三部分定義配置文件中的Appender。
4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
此句為定義名為stdout的輸出端的layout是哪種類(lèi)型,可以是
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類(lèi)別等等信息)
具體講解可參照第三部分定義配置文件中的Layout。
5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n
如果使用pattern布局就要指定的打印信息的具體格式ConversionPattern,打印參數(shù)如下:
%m 輸出代碼中指定的消息
%p 輸出優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
%r 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
%c 輸出所屬的類(lèi)目,通常就是所在類(lèi)的全名
%t 輸出產(chǎn)生該日志事件的線程名
%n 輸出一個(gè)回車(chē)換行符,Windows平臺(tái)為“rn”,Unix平臺(tái)為“n”
%d 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類(lèi)似:2002年10月18日 22:10:28,921
%l 輸出日志事件的發(fā)生位置,包括類(lèi)目名、發(fā)生的線程,以及在代碼中的行數(shù)。
[QC]是log信息的開(kāi)頭,可以為任意字符,一般為項(xiàng)目簡(jiǎn)稱。
輸出的信息
[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'
具體講解可參照第三部分定義配置文件中的格式化日志信息。
7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
此句與第3行一樣。定義名為R的輸出端的類(lèi)型為每天產(chǎn)生一個(gè)日志文件。
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包下的所有類(lèi)的等級(jí)為DEBUG。
可以把com.neusoft改為自己項(xiàng)目所用的包名。
13 log4j.logger.com.opensymphony.oscache=ERROR
14 log4j.logger.net.sf.navigator=ERROR
這兩句是把這兩個(gè)包下出現(xiàn)的錯(cuò)誤的等級(jí)設(shè)為ERROR,如果項(xiàng)目中沒(méi)有配置EHCache,則不需要這兩句。
15 log4j.logger.org.apache.commons=ERROR
16 log4j.logger.org.apache.struts=WARN
這兩句是struts的包。
17 log4j.logger.org.displaytag=ERROR
這句是displaytag的包。(QC問(wèn)題列表頁(yè)面所用)
18 log4j.logger.org.springframework=DEBUG
此句為Spring的包。
24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
25 log4j.logger.org.hibernate=DEBUG
此兩句是hibernate的包。
以上這些包的設(shè)置可根據(jù)項(xiàng)目的實(shí)際情況而自行定制。
三、log4j詳解
1、定義配置文件
Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件log4j.properties(鍵=值)。下面將介紹使用log4j.properties文件作為配置文件的方法:
①、配置根Logger
Logger 負(fù)責(zé)處理日志記錄的大部分操作。
其語(yǔ)法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志記錄的優(yōu)先級(jí),分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級(jí)別。Log4j建議只使用四個(gè)級(jí)別,優(yōu) 先級(jí)從高到低分別是ERROR、WARN、INFO、DEBUG。通過(guò)在這里定義的級(jí)別,您可以控制到應(yīng)用程序中相應(yīng)級(jí)別的日志信息的開(kāi)關(guān)。比如在這里定 義了INFO級(jí)別,只有等于及高于這個(gè)級(jí)別的才進(jìn)行處理,則應(yīng)用程序中所有DEBUG級(jí)別的日志信息將不被打印出來(lái)。ALL:打印所有的日志,OFF:關(guān) 閉所有的日志輸出。 appenderName就是指定日志信息輸出到哪個(gè)地方。可同時(shí)指定多個(gè)輸出目的地。
②、配置日志信息輸出目的地 Appender
Appender 負(fù)責(zé)控制日志記錄操作的輸出。
其語(yǔ)法為:
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(控制臺(tái)),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件),可通過(guò) log4j.appender.R.MaxFileSize=100KB設(shè)置文件大小,還可通過(guò) log4j.appender.R.MaxBackupIndex=1設(shè)置為保存一個(gè)備份文件。
org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
定義一個(gè)名為stdout的輸出目的地,ConsoleAppender為控制臺(tái)。
③、配置日志信息的格式(布局)Layout
Layout 負(fù)責(zé)格式化Appender的輸出。
其語(yǔ)法為:
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(包含日志信息的級(jí)別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類(lèi)別等等信息)
2、格式化日志信息
Log4J采用類(lèi)似C語(yǔ)言中的printf函數(shù)的打印格式格式化日志信息,打印參數(shù)如下:
%m 輸出代碼中指定的消息
%p 輸出優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
%r 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
%c 輸出所屬的類(lèi)目,通常就是所在類(lèi)的全名
%t 輸出產(chǎn)生該日志事件的線程名
%n 輸出一個(gè)回車(chē)換行符,Windows平臺(tái)為“rn”,Unix平臺(tái)為“n”
%d 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類(lèi)似:2002年10月18日 22:10:28,921
%l 輸出日志事件的發(fā)生位置,包括類(lèi)目名、發(fā)生的線程,以及在代碼中的行數(shù)。
3、在代碼中使用Log4j
我們?cè)谛枰敵鋈罩拘畔⒌念?lèi)中做如下的三個(gè)工作:
1、導(dǎo)入所有需的commongs-logging類(lèi):
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
2、在自己的類(lèi)中定義一個(gè)org.apache.commons.logging.Log類(lèi)的私有靜態(tài)類(lèi)成員:
private final Log log = LogFactory.getLog(getClass());
LogFactory.getLog()方法的參數(shù)使用的是當(dāng)前類(lèi)的class。
3、使用org.apache.commons.logging.Log類(lèi)的成員方法輸出日志信息:
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")
}
使用場(chǎng)景:一般在模型中對(duì)應(yīng)某一個(gè)字段的屬性中的set和get方法中。作用是數(shù)據(jù)與數(shù)據(jù)庫(kù)中不一一對(duì)應(yīng)。如:
/*@Transient
public String getModulename() {
return modulename;
}
public void setModulename(String modulename) {
this.modulename = modulename;
}*/
2、@ManyToOne
多對(duì)一。可以把另一個(gè)模型對(duì)應(yīng)過(guò)來(lái)。在查詢時(shí),無(wú)需要聯(lián)表查詢。
@JoinColumn(name="moduleid",insertable=false,updatable=false)
@NotFound(action=NotFoundAction.IGNORE)
public CateModule getCateModule() {
return cateModule;
}
public void setCateModule(CateModule cateModule) {
this.cateModule = cateModule;
} 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;
}
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', '代理商', '只能查看對(duì)屬于自己的所有合同');
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', '修改個(gè)人資料', 'Note', 'ediUser.jsp', 'top', '2', 'N', '0');
COMMIT;
Resin是CAUCHO公司的產(chǎn)品,是一個(gè)非常流行的application server,對(duì)servlet和JSP提供了良好的支持,性能也比較優(yōu)良,resin自身采用JAVA語(yǔ)言開(kāi)發(fā)!
一、安裝環(huán)境:
系統(tǒng)版本:Centos 6.0 x86_64
Nginx版本:1.0.11
Jdk版本:1.7.0
Resin版本:4.0.23
首先下載需要安裝的軟件:【JDK可以去java官網(wǎng)下載】
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/下:結(jié)果顯示為 /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/下
啟動(dòng)resin命令如下 /etc/init.d/resin start 即可,然后訪問(wèn)http://ip:8080
四、nginx整合resin的方式跟nginx整合tomcat一樣,再這里就不重復(fù)了!
提供我上一篇文章地址:http://chinaapp.sinaapp.com/?p=1922
五、resin配置優(yōu)化:
以下是我的配置文件:貼出一部分修改的,其他的保持不變,在回復(fù)下面!
一: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>
兩個(gè)特殊的循環(huán)變量:
item_index: 當(dāng)前變量的索引值。
item_has_next: 是否存在下一個(gè)對(duì)象。
可以用<#break/>指令離開(kāi)loop循環(huán)。
四:include指令
<#include filename>或者
<#include filenameoptions>
filename: 表達(dá)式轉(zhuǎn)換為字符串
options: encoding=encoding, parse=parse encoding: 表達(dá)式轉(zhuǎn)換為字符串
parse: 表達(dá)式轉(zhuǎn)換為邏輯值,是否作為ftl文件解析。
<#include "/common/navbar.html" parse=false encoding="Shift_JIS">
<#include "*/footer.ftl">表示當(dāng)前目錄下以及所有父目錄下的文件。如果當(dāng)前模版在/foo/bar/template.ftl ,那么查找footer.ftl的順序?yàn)椋?foo/bar/footer.ftl
/foo/footer.ftl/footer.ftl這種方式講允許設(shè)計(jì)者將通用的模版放在父文件夾里面。
也可以只指定部分路徑:<#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區(qū)的ftl的interpolations都會(huì)被自動(dòng)加上escape表達(dá)式。但是不會(huì)影響字符串內(nèi)的interpolations。而且也只會(huì)影響到body內(nèi)出現(xiàn)的interpolations,比如不會(huì)影響到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指令在解析模版時(shí)起作用,而不是運(yùn)行時(shí)起作用。
escape指令還能嵌套使用,子繼承父的escape規(guī)則。
<#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>創(chuàng)建或者替換一個(gè)已經(jīng)存在的變量,只能作用于頂層變量。不好的做法:<#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文件的最上面。
參數(shù)范圍:
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>
<!-- http://www.iefans.net/ie8-filteralpha-png-touming/
IE8里可以這樣寫(xiě) -ms-filter:”progid:DXImageTransform.Microsoft.Alpha(opacity=50)”;
IE7里可以這樣寫(xiě) filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);
IE6,IE7,IE8里都可以這樣寫(xiě) filter:alpha(opacity=50)
-->
from:http://unc0pyrightable.blog.163.com/blog/static/1313300602010021526561/
今天推薦一個(gè)最完美讓ie6支持png透明的js,為什么說(shuō)它最完美呢?
只因?yàn)樗?strong>支持background-position和background-repeat
這是市面上的其它方法比不上的
首先,要在網(wǎng)頁(yè)中引用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]-->
上面那個(gè)js路徑是絕對(duì)路徑,大家最好還是把它下下來(lái),以防網(wǎng)站掛了.
引用之后就是更改第二個(gè)<script>里的.png為你要實(shí)現(xiàn)效果的選擇器.
就比如,你#header引用了一個(gè)background,那你上面就要改為:
DD_belatedPNG.fix('#header');
并且它還支持組選擇器,如:
DD_belatedPNG.fix('#header,h1,h2,h3,#content');
很簡(jiǎn)單吧,只要把有透明png的標(biāo)簽或選擇器寫(xiě)在里面就行
至于這里面能不能支持css3就不得而知了.
官網(wǎng):http://www.dillerdesign.com/experiment/DD_belatedPNG/
這個(gè)JS內(nèi)容(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格式的圖片
用法:
先復(fù)制下面的代碼在記事本中,然后另存為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");
}
POI中可能會(huì)用到一些需要設(shè)置EXCEL單元格格式的操作小結(jié):
先獲取工作薄對(duì)象:
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFCellStyle setBorder = wb.createCellStyle();
一、設(shè)置背景色:
setBorder.setFillForegroundColor((short) 13);// 設(shè)置背景色
setBorder.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
二、設(shè)置邊框:
setBorder.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下邊框
setBorder.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左邊框
setBorder.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框
setBorder.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框
三、設(shè)置居中:
setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
四、設(shè)置字體:
HSSFFont font = wb.createFont();
font.setFontName("黑體");
font.setFontHeightInPoints((short) 16);//設(shè)置字體大小
HSSFFont font2 = wb.createFont();
font2.setFontName("仿宋_GB2312");
font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗體顯示
font2.setFontHeightInPoints((short) 12);
setBorder.setFont(font);//選擇需要用到的字體格式
五、設(shè)置列寬:
sheet.setColumnWidth(0, 3766); //第一個(gè)參數(shù)代表列id(從0開(kāi)始),第2個(gè)參數(shù)代表寬度值 參考 :"2012-08-10"的寬度為2500
六、設(shè)置自動(dòng)換行:
setBorder.setWrapText(true);//設(shè)置自動(dòng)換行
七、合并單元格:
Region region1 = new Region(0, (short) 0, 0, (short) 6);
//參數(shù)1:行號(hào) 參數(shù)2:起始列號(hào) 參數(shù)3:行號(hào) 參數(shù)4:終止列號(hào)
或者用
CellRangeAddress region1 = new CellRangeAddress(rowNumber, rowNumber, (short) 0, (short) 11);
但應(yīng)注意兩個(gè)構(gòu)造方法的參數(shù)不是一樣的,具體使用哪個(gè)取決于POI的不同版本。
sheet.addMergedRegion(region1);
目前用過(guò)的就這么多,后續(xù)有新的會(huì)繼續(xù)添加。
$('#queryPerformanceForm').attr("action","option2.action"); //修改form的action
$(“img”). removeAttr(“height”); //去除圖片高度
$("#infomore").hide();//隱藏
$("#infomore").show();//顯示
$("#infomore").css("display")=="none" //表達(dá)式,css屬性
$("#infomore").css("display","none"); //給特定ID,設(shè)置css屬性
$("#city").empty(); //判斷是否為空
$("#cityid").val(0); //設(shè)值
$("#discount").focus(); //獲得焦點(diǎn)
$("#costpre_error").html(""); //設(shè)置值
var obj = $("input[name='photo']"); //jquery name選擇器
//異步請(qǐng)求方式
$.ajax({
type: 'POST',
url:'url',
dataType:'json',
async:false,
data:{modulesign:selectedModule,id:id},
success:function(data){
$("#cate_div").html(data.html);
...
}
});
//頁(yè)面加載完執(zhí)行
$(document).ready(function() {
...
});
非標(biāo)準(zhǔn):<script type="text/jscript" src="js/img-change.js"></script>
測(cè)一個(gè)jQuery里的each方法,搞了半天,才發(fā)現(xiàn)上面的問(wèn)題!悲劇啊!
//子查詢
select * from site_product
where productid > '286585'
and state = '1'
and siteid <> '750473'
and image <> ''
and siteid in (SELECT siteid from site_company WHERE state=1)
order by productid desc
LIMIT 1 offset 0;
//左聯(lián)查詢
select * from (select companyid as tt from base_companymember order by random() Limit "+num+") as a LEFT JOIN base_company ON tt=companyid
//上一個(gè), 下一個(gè)
select mediaid,medianame,filepath
FROM (SELECT row_number() OVER (ORDER BY displayorder DESC,mediaid desc)as rowno,mediaid,medianame,displayorder,filepath FROM site_media WHERE state>=0 and siteid=3854719) as aaa
WHERE
aaa.rowno>(SELECT rowno FROM (SELECT row_number() OVER (ORDER BY displayorder DESC,mediaid desc)as rowno,mediaid,medianame,displayorder,filepath FROM site_media WHERE state>=0 and siteid=3854719) as bbb WHERE bbb.mediaid=899)
ORDER BY aaa.rowno
LIMIT 1;
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
28 | 29 | 30 | 31 | 1 | 2 | 3 | |||
4 | 5 | 6 | 7 | 8 | 9 | 10 | |||
11 | 12 | 13 | 14 | 15 | 16 | 17 | |||
18 | 19 | 20 | 21 | 22 | 23 | 24 | |||
25 | 26 | 27 | 28 | 29 | 30 | 1 | |||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
常用鏈接
留言簿
隨筆檔案
文章檔案
搜索
最新評(píng)論

- 1.?re: Centos6.0下Nginx+Resin配置
- 呵呵
- --ponychen
- 2.?re: JPA注解記錄[未登錄](méi)
- 內(nèi)容寫(xiě)錯(cuò)了吧,是不是再整理一下比較好,會(huì)誤導(dǎo)的。
- --rick
- 3.?re: ssh框架學(xué)習(xí)記錄
- 暈,還以為是linux 下的ssh呢-_-!
- --免費(fèi)網(wǎng)絡(luò)記事本
- 4.?re: SQL語(yǔ)句記錄
- 評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
- --老天