隨筆 - 9  文章 - 1  trackbacks - 0
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          不以薪水論英雄,英雄從不爭薪水。

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

               摘要: 轉(zhuǎn)載:http://www.aygfsteel.com/liubijin/archive/2010/05/04/320008.html 1、Record   首先需要明確是,ExtJS中有一個(gè)名為Record的類,表格等控件中使用的數(shù)據(jù)是存放在Record對象中,一個(gè)Record可以理解為關(guān)系數(shù)據(jù)表中的一行,也可以稱為記錄。Record對象中即包含了記錄(行中各列)的定義信息(也就是該記錄包含哪...  閱讀全文
          posted @ 2011-04-14 11:20 稻草 閱讀(9262) | 評論 (1)編輯 收藏

          PROPAGATION_REQUIRED--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù)。這是最常見的選擇。
          PROPAGATION_SUPPORTS--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行。
          PROPAGATION_MANDATORY--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。
          PROPAGATION_REQUIRES_NEW--新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。
          PROPAGATION_NOT_SUPPORTED--以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
          PROPAGATION_NEVER--以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。
          PROPAGATION_NESTED--如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則進(jìn)行與PROPAGATION_REQUIRED類似的操作。

           

          如果出現(xiàn)<prop key="myMethod">PROPAGATION_REQUIRED,readOnly,-Exception </prop>

          其中:

          -Exception表示有Exception拋出時(shí),事務(wù)回滾. -代表回滾+就代表提交

          readonly 就是read only, 設(shè)置操作權(quán)限為只讀,一般用于查詢的方法,優(yōu)化作用.

          posted @ 2011-03-29 11:05 稻草 閱讀(259) | 評論 (0)編輯 收藏
          以前一直想要找尋過去的記憶,小學(xué)時(shí)玩伴,卻發(fā)現(xiàn)都被時(shí)間改變了。我們都不再單純,也不再是過去模樣。言談舉止如此陌生,我倍感失望。
          時(shí)隔N年,是我對他們的記憶都停留在年少。成長年間,我們沒有問候、沒有往來。對彼此生活環(huán)境、心靈不了解。 不是一個(gè)圈子了,淡了,算了,忘了。


          posted @ 2011-03-25 00:36 稻草 閱讀(188) | 評論 (0)編輯 收藏
          在中國現(xiàn)行的教育情況下,沒必要苛求專業(yè)與學(xué)歷。降低硬性條件,用三流的人才拿二流的工資,同樣可以做出一流的事來。而且這樣做十分有助于培養(yǎng)團(tuán)隊(duì)的穩(wěn)定性,基本上你培養(yǎng)出來的人都是你的,流失率不會很高。當(dāng)然,前提是你必須有個(gè)好的人事。
          posted @ 2011-03-15 17:32 稻草 閱讀(191) | 評論 (0)編輯 收藏

           

          http://hi.baidu.com/zhiqian528/blog/item/a56a3c0a7ae684850b7b823a.html
          posted @ 2011-02-24 00:22 稻草 閱讀(304) | 評論 (0)編輯 收藏
          hibernate.dialect Hibernate方言(Dialect)的類名 - 可以讓Hibernate使用某些特定的數(shù)據(jù)庫平臺的特性

          取值. full.classname.of.Dialect

          hibernate.default_schema 在生成的SQL中,scheml/tablespace的全限定名

          取值. SCHEMA_NAME

          hibernate.session_factory_name SessionFactory綁定到JNDI中去.

          取值. jndi/composite/name

          hibernate.use_outer_join 允許使用外連接抓取.

          取值. true | false

          hibernate.max_fetch_depth 設(shè)置外連接抓取樹的最大深度

          取值. 建議設(shè)置為03之間

          hibernate.jdbc.fetch_size 一個(gè)非零值,用來決定JDBC的獲取量大小。(會調(diào)用calls Statement.setFetchSize()).
          hibernate.jdbc.batch_size 一個(gè)非零值,會開啟Hibernate使用JDBC2的批量更新功能

          取值. 建議值在 530之間。

          hibernate.jdbc.use_scrollable_resultset 允許Hibernate使用JDBC2提供的可滾動結(jié)果集。只有在使用用戶自行提供的連接時(shí),這個(gè)參數(shù)才是必需的。否則Hibernate會使用連接的元數(shù)據(jù)(metadata)。

          取值. true | false

          hibernate.jdbc.use_streams_for_binary 在從JDBC讀寫binary(二進(jìn)制)或者serializable(可序列化)類型時(shí),是否使用stream(流). 這是一個(gè)系統(tǒng)級別的屬性。

          取值. true | false

          hibernate.cglib.use_reflection_optimizer 是否使用CGLIB來代替運(yùn)行時(shí)反射操作。(系統(tǒng)級別屬性,默認(rèn)為在可能時(shí)都使用CGLIB).在調(diào)試的時(shí)候有時(shí)候使用反射會有用。

          取值. true | false

          hibernate.jndi.<propertyName> propertyName這個(gè)屬性傳遞到JNDI InitialContextFactory (可選)
          hibernate.connection.isolation 事務(wù)隔離級別 (可選)

          取值. 1, 2, 4, 8

          hibernate.connection.<propertyName> propertyName這個(gè)JDBC 屬性傳遞到DriverManager.getConnection().
          hibernate.connection.provider_class 指定一個(gè)自定義的ConnectionProvider類名

          取值. classname.of.ConnectionProvider

          hibernate.cache.provider_class 指定一個(gè)自定義的CacheProvider緩存提供者的類名

          取值. classname.of.CacheProvider

          hibernate.transaction.factory_class 指定一個(gè)自定義的TransactionFactory類名,Hibernate Transaction API將會使用.

          取值. classname.of.TransactionFactory

          jta.UserTransaction JTATransactionFactory 用來獲取JTA UserTransaction的JNDI名.

          取值. jndi/composite/name

          hibernate.transaction.manager_lookup_class TransactionManagerLookup的類名 - 當(dāng)在JTA環(huán)境中,JVM級別的緩存被打開的時(shí)候使用.

          取值. classname.of.TransactionManagerLookup

          hibernate.query.substitutions 把Hibernate查詢中的一些短語映射為SQL短語。(比如說短語可能是函數(shù)或者字符) .

          取值. hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC

          hibernate.show_sql 把所有的SQL語句都輸出到控制臺(可以作為log功能的一個(gè)替代).

          取值. true | false

          hibernate.hbm2ddl.auto 自動輸出schema創(chuàng)建DDL語句.

          取值. update | create | create-drop

          posted @ 2011-02-19 21:39 稻草 閱讀(2524) | 評論 (0)編輯 收藏
          hibernate 延遲加載問題探討
          文章出處:http://fangyong2006.javaeye.com/blog/117555
          但就此說一下關(guān)于lazy機(jī)制
          延遲初始化錯誤是運(yùn)用Hibernate開發(fā)項(xiàng)目時(shí)最常見的錯誤。如果對一個(gè)類或者集合配置了延遲檢索策略,那么必須當(dāng)代理類實(shí)例或代理集合處于持久化狀態(tài)(即處于Session范圍內(nèi))時(shí),才能初始化它。如果在游離狀態(tài)時(shí)才初始化它,就會產(chǎn)生延遲初始化錯誤。

          下面把Customer.hbm.xml文件的<class>元素的lazy屬性設(shè)為true,表示使用延遲檢索策略:

          <class name="mypack.Customer" table="CUSTOMERS" lazy="true">

          當(dāng)執(zhí)行Session的load()方法時(shí),Hibernate不會立即執(zhí)行查詢CUSTOMERS表的select語句,僅僅返回Customer類的代理類的實(shí)例,這個(gè)代理類具由以下特征:

          (1) 由Hibernate在運(yùn)行時(shí)動態(tài)生成,它擴(kuò)展了Customer類,因此它繼承了Customer類的所有屬性和方法,但它的實(shí)現(xiàn)對于應(yīng)用程序是透明的。
          (2) 當(dāng)Hibernate創(chuàng)建Customer代理類實(shí)例時(shí),僅僅初始化了它的OID屬性,其他屬性都為null,因此這個(gè)代理類實(shí)例占用的內(nèi)存很少。
          (3)當(dāng)應(yīng)用程序第一次訪問Customer代理類實(shí)例時(shí)(例如調(diào)用customer.getXXX()或customer.setXXX()方法), Hibernate會初始化代理類實(shí)例,在初始化過程中執(zhí)行select語句,真正從數(shù)據(jù)庫中加載Customer對象的所有數(shù)據(jù)。但有個(gè)例外,那就是當(dāng)應(yīng)用程序訪問Customer代理類實(shí)例的getId()方法時(shí),Hibernate不會初始化代理類實(shí)例,因?yàn)樵趧?chuàng)建代理類實(shí)例時(shí)OID就存在了,不必到數(shù)據(jù)庫中去查詢。

          提示:Hibernate采用CGLIB工具來生成持久化類的代理類。CGLIB是一個(gè)功能強(qiáng)大的Java字節(jié)碼生成工具,它能夠在程序運(yùn)行時(shí)動態(tài)生成擴(kuò)展 Java類或者實(shí)現(xiàn)Java接口的代理類。關(guān)于CGLIB的更多知識,請參考:http://cglib.sourceforge.net/。

          以下代碼先通過Session的load()方法加載Customer對象,然后訪問它的name屬性:

          tx = session.beginTransaction();
          Customer customer=(Customer)session.load(Customer.class,new Long(1));
          customer.getName();
          tx.commit();

          在運(yùn)行session.load()方法時(shí)Hibernate不執(zhí)行任何select語句,僅僅返回Customer類的代理類的實(shí)例,它的OID為1,這是由load()方法的第二個(gè)參數(shù)指定的。當(dāng)應(yīng)用程序調(diào)用customer.getName()方法時(shí),Hibernate會初始化Customer代理類實(shí)例,從數(shù)據(jù)庫中加載Customer對象的數(shù)據(jù),執(zhí)行以下select語句:

          select * from CUSTOMERS where ID=1;
          select * from ORDERS where CUSTOMER_ID=1;

          當(dāng)<class>元素的lazy屬性為true,會影響Session的load()方法的各種運(yùn)行時(shí)行為,下面舉例說明。

          1.如果加載的Customer對象在數(shù)據(jù)庫中不存在,Session的load()方法不會拋出異常,只有當(dāng)運(yùn)行customer.getName()方法時(shí)才會拋出以下異常:

          ERROR LazyInitializer:63 - Exception initializing proxy
          net.sf.hibernate.ObjectNotFoundException: No row with the given identifier exists: 1, of class:
          mypack.Customer

          2.如果在整個(gè)Session范圍內(nèi),應(yīng)用程序沒有訪問過Customer對象,那么Customer代理類的實(shí)例一直不會被初始化,Hibernate不會執(zhí)行任何select語句。以下代碼試圖在關(guān)閉Session后訪問Customer游離對象:

          tx = session.beginTransaction();
          Customer customer=(Customer)session.load(Customer.class,new Long(1));
          tx.commit();
          session.close();
          customer.getName();

          由于引用變量customer引用的Customer代理類的實(shí)例在Session范圍內(nèi)始終沒有被初始化,因此在執(zhí)行customer.getName()方法時(shí),Hibernate會拋出以下異常:

          ERROR LazyInitializer:63 - Exception initializing proxy
          net.sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed

          由此可見,Customer代理類的實(shí)例只有在當(dāng)前Session范圍內(nèi)才能被初始化。

          3.net.sf.hibernate.Hibernate類的initialize()靜態(tài)方法用于在Session范圍內(nèi)顯式初始化代理類實(shí)例,isInitialized()方法用于判斷代理類實(shí)例是否已經(jīng)被初始化。例如:

          tx = session.beginTransaction();
          Customer customer=(Customer)session.load(Customer.class,new Long(1));
          if(!Hibernate.isInitialized(customer))
          Hibernate.initialize(customer);
          tx.commit();
          session.close();
          customer.getName();

          以上代碼在Session范圍內(nèi)通過Hibernate類的initialize()方法顯式初始化了Customer代理類實(shí)例,因此當(dāng)Session關(guān)閉后,可以正常訪問Customer游離對象。

          4.當(dāng)應(yīng)用程序訪問代理類實(shí)例的getId()方法時(shí),不會觸發(fā)Hibernate初始化代理類實(shí)例的行為,例如:

          tx = session.beginTransaction();
          Customer customer=(Customer)session.load(Customer.class,new Long(1));
          customer.getId();
          tx.commit();
          session.close();
          customer.getName();

          當(dāng)應(yīng)用程序訪問customer.getId()方法時(shí),該方法直接返回Customer代理類實(shí)例的OID值,無需查詢數(shù)據(jù)庫。由于引用變量 customer始終引用的是沒有被初始化的Customer代理類實(shí)例,因此當(dāng)Session關(guān)閉后再執(zhí)行customer.getName()方法, Hibernate會拋出以下異常:

          ERROR LazyInitializer:63 - Exception initializing proxy
          net.sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed


          解決方法:

          由于hibernate采用了lazy=true,這樣當(dāng)你用hibernate查詢時(shí),返回實(shí)際為利用cglib增強(qiáng)的代理類,但其并沒有實(shí)際填充;當(dāng)你在前端,利用它來取值(getXXX)時(shí),這時(shí)Hibernate才會到數(shù)據(jù)庫執(zhí)行查詢,并填充對象,但此時(shí)如果和這個(gè)代理類相關(guān)的session已關(guān)閉掉,就會產(chǎn)生種錯誤.
          在做一對多時(shí),有時(shí)會出現(xiàn)"could not initialize proxy - clothe owning Session was sed,這個(gè)好像是hibernate的緩存問題.問題解決:需要在<many-to-one>里設(shè)置lazy="false". 但有可能會引發(fā)另一個(gè)異常叫

          failed to lazily initialize a collection of role: XXXXXXXX, no session or session was closed


          解決方法:在web.xml中加入
          <filter>
            <filter-name>hibernateFilter</filter-name>
            <filter-class>
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
            </filter-class>
          </filter
          <filter-mapping>
            <filter-name>hibernateFilter</filter-name>
            <url-pattern>*.do</url-pattern>
          </filter-mapping>
          就可以了;

          參考了:
          Hibernate與延遲加載:

          Hibernate對象關(guān)系映射提供延遲的與非延遲的對象初始化。非延遲加載在讀取一個(gè)對象的時(shí)候會將與這個(gè)對象所有相關(guān)的其他對象一起讀取出來。這有時(shí)會導(dǎo)致成百的(如果不是成千的話)select語句在讀取對象的時(shí)候執(zhí)行。這個(gè)問題有時(shí)出現(xiàn)在使用雙向關(guān)系的時(shí)候,經(jīng)常會導(dǎo)致整個(gè)數(shù)據(jù)庫都在初始化的階段被讀出來了。當(dāng)然,你可以不厭其煩地檢查每一個(gè)對象與其他對象的關(guān)系,并把那些最昂貴的刪除,但是到最后,我們可能會因此失去了本想在ORM工具中獲得的便利。


          一個(gè)明顯的解決方法是使用Hibernate提供的延遲加載機(jī)制。這種初始化策略只在一個(gè)對象調(diào)用它的一對多或多對多關(guān)系時(shí)才將關(guān)系對象讀取出來。這個(gè)過程對開發(fā)者來說是透明的,而且只進(jìn)行了很少的數(shù)據(jù)庫操作請求,因此會得到比較明顯的性能提升。這項(xiàng)技術(shù)的一個(gè)缺陷是延遲加載技術(shù)要求一個(gè)Hibernate會話要在對象使用的時(shí)候一直開著。這會成為通過使用DAO模式將持久層抽象出來時(shí)的一個(gè)主要問題。為了將持久化機(jī)制完全地抽象出來,所有的數(shù)據(jù)庫邏輯,包括打開或關(guān)閉會話,都不能在應(yīng)用層出現(xiàn)。最常見的是,一些實(shí)現(xiàn)了簡單接口的DAO實(shí)現(xiàn)類將數(shù)據(jù)庫邏輯完全封裝起來了。一種快速但是笨拙的解決方法是放棄DAO模式,將數(shù)據(jù)庫連接邏輯加到應(yīng)用層中來。這可能對一些小的應(yīng)用程序有效,但是在大的系統(tǒng)中,這是一個(gè)嚴(yán)重的設(shè)計(jì)缺陷,妨礙了系統(tǒng)的可擴(kuò)展性。

          在Web層進(jìn)行延遲加載

          幸運(yùn)的是,Spring框架為Hibernate延遲加載與DAO模式的整合提供了一種方便的解決方法。對那些不熟悉Spring與Hibernate集成使用的人,我不會在這里討論過多的細(xì)節(jié),但是我建議你去了解Hibernate與Spring集成的數(shù)據(jù)訪問。以一個(gè)Web應(yīng)用為例,Spring提供了OpenSessionInViewFilter和OpenSessionInViewInterceptor。我們可以隨意選擇一個(gè)類來實(shí)現(xiàn)相同的功能。兩種方法唯一的不同就在于interceptor在Spring容器中運(yùn)行并被配置在web應(yīng)用的上下文中,而Filter在Spring之前運(yùn)行并被配置在web.xml中。不管用哪個(gè),他們都在請求將當(dāng)前會話與當(dāng)前(數(shù)據(jù)庫)線程綁定時(shí)打開Hibernate會話。一旦已綁定到線程,這個(gè)打開了的Hibernate會話可以在DAO實(shí)現(xiàn)類中透明地使用。這個(gè)會話會為延遲加載數(shù)據(jù)庫中值對象的視圖保持打開狀態(tài)。一旦這個(gè)邏輯視圖完成了,Hibernate會話會在Filter的doFilter方法或者Interceptor的postHandle方法中被關(guān)閉。下面是每個(gè)組件的配置示例:



          Interceptor的配置:


          <beans>
          <bean id="urlMapping"
          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          <property name="interceptors">
          <list>
          <ref bean="openSessionInViewInterceptor"/>
          </list>
          </property>
          <property name="mappings">

          </bean>

          <bean name="openSessionInViewInterceptor"
          class="org.springframework.orm.hibernate.support.OpenSessionInViewInterceptor">
          <property name="sessionFactory"><ref bean="sessionFactory"/></property>
          </bean>
          </beans>

          Filter的配置


          <web-app>

          <filter>
          <filter-name>hibernateFilter</filter-name>
          <filter-class>
          org.springframework.orm.hibernate.support.OpenSessionInViewFilter
          </filter-class>
          </filter>

          <filter-mapping>
          <filter-name>hibernateFilter</filter-name>
          <url-pattern>*. spring </url-pattern>
          </filter-mapping>

          </web-app>


          實(shí)現(xiàn)Hibernate的Dao接口來使用打開的會話是很容易的。事實(shí)上,如果你已經(jīng)使用了Spring框架來實(shí)現(xiàn)你的Hibernate Dao,很可能你不需要改變?nèi)魏螙|西。方便的HibernateTemplate公用組件使訪問數(shù)據(jù)庫變成小菜一碟,而DAO接口只有通過這個(gè)組件才可以訪問到數(shù)據(jù)庫。下面是一個(gè)示例的DAO:


          public class HibernateProductDAO extends HibernateDaoSupport implements ProductDAO {

          public Product getProduct(Integer productId) {
          return (Product)getHibernateTemplate().load(Product.class, productId);
          }

          public Integer saveProduct(Product product) {
          return (Integer) getHibernateTemplate().save(product);
          }

          public void updateProduct(Product product) {
          getHibernateTemplate().update(product);
          }
          }


          在業(yè)務(wù)邏輯層中使用延遲加載

          即使在視圖外面,Spring框架也通過使用AOP 攔截器 HibernateInterceptor來使得延遲加載變得很容易實(shí)現(xiàn)。這個(gè)Hibernate 攔截器透明地將調(diào)用配置在Spring應(yīng)用程序上下文中的業(yè)務(wù)對象中方法的請求攔截下來,在調(diào)用方法之前打開一個(gè)Hibernate會話,然后在方法執(zhí)行完之后將會話關(guān)閉。讓我們來看一個(gè)簡單的例子,假設(shè)我們有一個(gè)接口BussinessObject:


          public  interface  BusinessObject  {
          public  void  doSomethingThatInvolvesDaos();
          }
          類BusinessObjectImpl實(shí)現(xiàn)了BusinessObject接口:

          public  class  BusinessObjectImpl  implements  BusinessObject  {
          public  void  doSomethingThatInvolvesDaos()  {
          //  lots of logic that calls
          //  DAO classes Which access
          //  data objects lazily
          }
          }



          通過在Spring應(yīng)用程序上下文中的一些配置,我們可以讓將調(diào)用BusinessObject的方法攔截下來,再令它的方法支持延遲加載。看看下面的一個(gè)程序片段:



          <beans>
          <bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor">
          <property name="sessionFactory">
          <ref bean="sessionFactory"/>
          </property>
          </bean>
          <bean id="businessObjectTarget" class="com.acompany.BusinessObjectImpl">
          <property name="someDAO"><ref bean="someDAO"/></property>
          </bean>
          <bean id="businessObject" class="org.springframework.aop.framework.ProxyFactoryBean">
          <property name="target"><ref bean="businessObjectTarget"/></property>
          <property name="proxyInterfaces">
          <value>com.acompany.BusinessObject</value>
          </property>
          <property name="interceptorNames">
          <list>
          <value>hibernateInterceptor</value>
          </list>
          </property>
          </bean>
          </beans>

          當(dāng)businessObject被調(diào)用的時(shí)候,HibernateInterceptor打開一個(gè)Hibernate會話,并將調(diào)用請求傳遞給BusinessObjectImpl對象。當(dāng)BusinessObjectImpl執(zhí)行完成后,HibernateInterceptor透明地關(guān)閉了會話。應(yīng)用層的代碼不用了解任何持久層邏輯,還是實(shí)現(xiàn)了延遲加載。


          在單元測試中測試延遲加載

          最后,我們需要用J-Unit來測試我們的延遲加載程序。我們可以輕易地通過重寫TestCase類中的setUp和tearDown方法來實(shí)現(xiàn)這個(gè)要求。我比較喜歡用這個(gè)方便的抽象類作為我所有測試類的基類。


          public abstract class MyLazyTestCase extends TestCase {

          private SessionFactory sessionFactory;
          private Session session;

          public void setUp() throws Exception {
          super.setUp();
          SessionFactory sessionFactory = (SessionFactory) getBean("sessionFactory");
          session = SessionFactoryUtils.getSession(sessionFactory, true);
          Session s = sessionFactory.openSession();
          TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(s));

          }

          protected Object getBean(String beanName) {
          //Code to get objects from Spring application context
          }

          public void tearDown() throws Exception {
          super.tearDown();
          SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
          Session s = holder.getSession();
          s.flush();
          TransactionSynchronizationManager.unbindResource(sessionFactory);
          SessionFactoryUtils.closeSessionIfNecessary(s, sessionFactory);
          }
          }

          posted @ 2011-02-18 17:24 稻草 閱讀(251) | 評論 (0)編輯 收藏
          以Ajax傳遞的數(shù)據(jù)里面有 HTML代碼,HTML里面包含了 & 字符,自然是無法正常傳遞的。

          找了很久用 encodeURI 試了下不行,最后找到 encodeURIComponent 可以。

          原來:
              
             encodeURI不對下列字符進(jìn)行URL編碼:“:”、“/”、“;”'&'“?”等等。
             el:
                encodeURI('/?&神泥') ,   結(jié)果/?&%E7%A5%9E%E6%B3%A5


             encodeURIComponent方法將對所有字符URL編碼
             el:
               encodeURIComponent('/?&神泥')  , 結(jié)果%2F%3F%26%E7%A5%9E%E6%B3%A5

          posted @ 2011-02-16 12:13 稻草 閱讀(190) | 評論 (0)編輯 收藏

          轉(zhuǎn)載:http://www.aygfsteel.com/zhengtengfeng/archive/2007/04/20/zhtfeng.html

          Ant的概念
          可能有些讀者并不連接什么是Ant以及入可使用它,但只要使用通過Linux系統(tǒng)得讀者,應(yīng)該知道

          make這個(gè)命令。當(dāng)編譯Linux內(nèi)核及一些軟件的源程序時(shí),經(jīng)常要用這個(gè)命令。Make命令其實(shí)就

          是一個(gè)項(xiàng)目管理工具,而Ant所實(shí)現(xiàn)功能與此類似。像make,gnumake和nmake這些編譯工具都有

          一定的缺陷,但是Ant卻克服了這些工具的缺陷。最初Ant開發(fā)者在開發(fā)跨平臺的應(yīng)用時(shí),用樣也

          是基于這些缺陷對Ant做了更好的設(shè)計(jì)。

          Ant 與 makefile
          Makefile有一些不足之處,比如很多人都會碰到的煩人的Tab問題。最初的Ant開發(fā)者多次強(qiáng)調(diào)”

          只是我在Tab前面加了一個(gè)空格,所以我的命令就不能執(zhí)行”。有一些工具在一定程度上解決了

          這個(gè)問題,但還是有很多其他的問題。Ant則與一般基于命令的工具有所不同,它是Java類的擴(kuò)

          展。Ant運(yùn)行需要的XML格式的文件不是Shell命令文件。它是由一個(gè)Project組成的,而一個(gè)

          Project又可分成可多target,target再細(xì)分又分成很多task,每一個(gè)task都是通過一個(gè)實(shí)現(xiàn)特

          定接口的java類來完成的。

          Ant的優(yōu)點(diǎn)

          Ant是Apache軟件基金會JAKARTA目錄中的一個(gè)子項(xiàng)目,它有以下的優(yōu)點(diǎn)。
          跨平臺性。Ant是存Java語言編寫的,所示具有很好的跨平臺性。
          操作簡單。Ant是由一個(gè)內(nèi)置任務(wù)和可選任務(wù)組成的。Ant運(yùn)行時(shí)需要一個(gè)XML文件(構(gòu)建文件)。

          Ant通過調(diào)用target樹,就可以執(zhí)行各種task。每個(gè)task實(shí)現(xiàn)了特定接口對象。由于Ant構(gòu)建文件

          時(shí)XML格式的文件,所以和容易維護(hù)和書寫,而且結(jié)構(gòu)很清晰。
          Ant可以集成到開發(fā)環(huán)境中。由于Ant的跨平臺性和操作簡單的特點(diǎn),它很容易集成到一些開發(fā)環(huán)

          境中去。

          Ant 開發(fā)

          Ant的構(gòu)建文件
          當(dāng)開始一個(gè)新的項(xiàng)目時(shí),首先應(yīng)該編寫Ant構(gòu)建文件。構(gòu)建文件定義了構(gòu)建過程,并被團(tuán)隊(duì)開發(fā)

          中每個(gè)人使用。Ant構(gòu)建文件默認(rèn)命名為build.xml,也可以取其他的名字。只不過在運(yùn)行的時(shí)候

          把這個(gè)命名當(dāng)作參數(shù)傳給Ant。構(gòu)建文件可以放在任何的位置。一般做法是放在項(xiàng)目頂層目錄中

          ,這樣可以保持項(xiàng)目的簡潔和清晰。下面是一個(gè)典型的項(xiàng)目層次結(jié)構(gòu)。
          (1) src存放文件。
          (2) class存放編譯后的文件。
          (3) lib存放第三方JAR包。
          (4) dist存放打包,發(fā)布以后的代碼。
          Ant構(gòu)建文件是XML文件。每個(gè)構(gòu)建文件定義一個(gè)唯一的項(xiàng)目(Project元素)。每個(gè)項(xiàng)目下可以定

          義很多目標(biāo)(target元素),這些目標(biāo)之間可以有依賴關(guān)系。當(dāng)執(zhí)行這類目標(biāo)時(shí),需要執(zhí)行他們所

          依賴的目標(biāo)。
          每個(gè)目標(biāo)中可以定義多個(gè)任務(wù),目標(biāo)中還定義了所要執(zhí)行的任務(wù)序列。Ant在構(gòu)建目標(biāo)時(shí)必須調(diào)

          用所定義的任務(wù)。任務(wù)定義了Ant實(shí)際執(zhí)行的命令。Ant中的任務(wù)可以為3類。
          (1) 核心任務(wù)。核心任務(wù)是Ant自帶的任務(wù)。
          (2) 可選任務(wù)。可選任務(wù)實(shí)來自第三方的任務(wù),因此需要一個(gè)附加的JAR文件。
          (3) 用戶自定義的任務(wù)。用戶自定義的任務(wù)實(shí)用戶自己開發(fā)的任務(wù)。
          1.<project>標(biāo)簽
            每個(gè)構(gòu)建文件對應(yīng)一個(gè)項(xiàng)目。<project>標(biāo)簽時(shí)構(gòu)建文件的根標(biāo)簽。它可以有多個(gè)內(nèi)在屬性,

          就如代碼中所示,其各個(gè)屬性的含義分別如下。
          (1) default表示默認(rèn)的運(yùn)行目標(biāo),這個(gè)屬性是必須的。
          (2) basedir表示項(xiàng)目的基準(zhǔn)目錄。
          (3) name表示項(xiàng)目名。
          (4) description表示項(xiàng)目的描述。
          每個(gè)構(gòu)建文件都對應(yīng)于一個(gè)項(xiàng)目,但是大型項(xiàng)目經(jīng)常包含大量的子項(xiàng)目,每一個(gè)子項(xiàng)目都可以有

          自己的構(gòu)建文件。

          2.<target>標(biāo)簽
          一個(gè)項(xiàng)目標(biāo)簽下可以有一個(gè)或多個(gè)target標(biāo)簽。一個(gè)target標(biāo)簽可以依賴其他的target標(biāo)簽。例

          如,有一個(gè)target用于編譯程序,另一個(gè)target用于聲稱可執(zhí)行文件。在生成可執(zhí)行文件之前必

          須先編譯該文件,因策可執(zhí)行文件的target依賴于編譯程序的target。Target的所有屬性如下。
          (1).name表示標(biāo)明,這個(gè)屬性是必須的。
          (2).depends表示依賴的目標(biāo)。
          (3)if表示僅當(dāng)屬性設(shè)置時(shí)才執(zhí)行。
          (4)unless表示當(dāng)屬性沒有設(shè)置時(shí)才執(zhí)行。
          (5)description表示項(xiàng)目的描述。
          Ant的depends屬性指定了target的執(zhí)行順序。Ant會依照depends屬性中target出現(xiàn)順序依次執(zhí)行

          每個(gè)target。在執(zhí)行之前,首先需要執(zhí)行它所依賴的target。程序中的名為run的target的

          depends屬性compile,而名為compile的target的depends屬性是prepare,所以這幾個(gè)target執(zhí)

          行的順序是prepare->compile->run。
          一個(gè)target只能被執(zhí)行一次,即使有多個(gè)target依賴于它。如果沒有if或unless屬性,target總

          會被執(zhí)行。

          3.<mkdir>標(biāo)簽
          該標(biāo)簽用于創(chuàng)建一個(gè)目錄,它有一個(gè)屬性dir用來指定所創(chuàng)建的目錄名,其代碼如下:
          <mkdir dir=”${class.root}”/>
          通過以上代碼就創(chuàng)建了一個(gè)目錄,這個(gè)目錄已經(jīng)被前面的property標(biāo)簽所指定。

          4<jar>標(biāo)簽
          該標(biāo)簽用來生成一個(gè)JAR文件,其屬性如下。
          (1) destfile表示JAR文件名。
          (2) basedir表示被歸檔的文件名。
          (3) includes表示別歸檔的文件模式。
          (4) exchudes表示被排除的文件模式。

          5.<javac標(biāo)簽>
          該標(biāo)簽用于編譯一個(gè)或一組java文件,其屬性如下。
          (1).srcdir表示源程序的目錄。
          (2).destdir表示class文件的輸出目錄。
          (3).include表示被編譯的文件的模式。
          (4).excludes表示被排除的文件的模式。
          (5).classpath表示所使用的類路徑。
          (6).debug表示包含的調(diào)試信息。
          (7).optimize表示是否使用優(yōu)化。
          (8).verbose 表示提供詳細(xì)的輸出信息。
          (9).fileonerror表示當(dāng)碰到錯誤就自動停止。

          6.<java>標(biāo)簽
          該標(biāo)簽用來執(zhí)行編譯生成的.class文件,其屬性如下。
          (1).classname 表示將執(zhí)行的類名。
          (2).jar表示包含該類的JAR文件名。
          (3).classpath所表示用到的類路徑。
          (4).fork表示在一個(gè)新的虛擬機(jī)中運(yùn)行該類。
          (5).failonerror表示當(dāng)出現(xiàn)錯誤時(shí)自動停止。
          (6).output 表示輸出文件。
          (7).append表示追加或者覆蓋默認(rèn)文件。

          7.<delete>標(biāo)簽
          該標(biāo)簽用于刪除一個(gè)文件或一組文件,去屬性如下。
          (1)/file表示要刪除的文件。
          (2).dir表示要刪除的目錄。
          (3).includeEmptyDirs 表示指定是否要刪除空目錄,默認(rèn)值是刪除。
          (4).failonerror 表示指定當(dāng)碰到錯誤是否停止,默認(rèn)值是自動停止。
          (5).verbose表示指定是否列出所刪除的文件,默認(rèn)值為不列出。

          8.<copy>標(biāo)簽
          該標(biāo)簽用于文件或文件集的拷貝,其屬性如下。
          (1).file 表示源文件。
          (2).tofile 表示目標(biāo)文件。
          (3).todir 表示目標(biāo)目錄。
          (4).overwrite 表示指定是否覆蓋目標(biāo)文件,默認(rèn)值是不覆蓋。
          (5).includeEmptyDirs 表示制定是否拷貝空目錄,默認(rèn)值為拷貝。
          (6).failonerror 表示指定如目標(biāo)沒有發(fā)現(xiàn)是否自動停止,默認(rèn)值是停止。
          (7).verbose 表示制定是否顯示詳細(xì)信息,默認(rèn)值不顯示。

          Ant的數(shù)據(jù)類型
          在構(gòu)建文件中為了標(biāo)識文件或文件組,經(jīng)常需要使用數(shù)據(jù)類型。數(shù)據(jù)類型包含在

          org.apache.tool.ant.types包中。下面鏡簡單介紹構(gòu)建文件中一些常用的數(shù)據(jù)類型。

          1. argument 類型
           由Ant構(gòu)建文件調(diào)用的程序,可以通過<arg>元素向其傳遞命令行參數(shù),如apply,exec和java任

          務(wù)均可接受嵌套<arg>元素,可以為各自的過程調(diào)用指定參數(shù)。以下是<arg>的所有屬性。
          (1).values 是一個(gè)命令參數(shù)。如果參數(shù)種有空格,但又想將它作為單獨(dú)一個(gè)值,則使用此屬性


          (2).file表示一個(gè)參數(shù)的文件名。在構(gòu)建文件中,此文件名相對于當(dāng)前的工作目錄。
          (3).line表示用空格分隔的多個(gè)參數(shù)列表。
          (4).path表示路徑。

          2.ervironment 類型
            由Ant構(gòu)建文件調(diào)用的外部命令或程序,<env>元素制定了哪些環(huán)境變量要傳遞給正在執(zhí)行的系

          統(tǒng)命令,<env>元素可以接受以下屬性。
          (1).file表示環(huán)境變量值得文件名。此文件名要被轉(zhuǎn)換位一個(gè)絕對路徑。
          (2).path表示環(huán)境變量的路徑。Ant會將它轉(zhuǎn)換為一個(gè)本地約定。
          (3).value 表示環(huán)境變量的一個(gè)直接變量。
          (4).key 表示環(huán)境變量名。
          注意  file path 或 value只能取一個(gè)。

          3.filelist類型
           Filelist 是一個(gè)支持命名的文件列表的數(shù)據(jù)類型,包含在一個(gè)filelist類型中的文件不一定是

          存在的文件。以下是其所有的屬性。
          (1).dir是用于計(jì)算絕對文件名的目錄。
          (2).files 是用逗號分隔的文件名列表。
          (3).refid 是對某處定義的一個(gè)<filelist>的引用。
          注意  dir 和 files 都是必要的,除非指定了refid(這種情況下,dir和files都不允許使用)。

          4.fileset類型
          Fileset 數(shù)據(jù)類型定義了一組文件,并通常表示為<fileset>元素。不過,許多ant任務(wù)構(gòu)建成了

          隱式的fileset,這說明他們支持所有的fileset屬性和嵌套元素。以下為fileset 的屬性列表。
          (1).dir表示fileset 的基目錄。
          (2).casesensitive的值如果為false,那么匹配文件名時(shí),fileset不是區(qū)分大小寫的,其默認(rèn)

          值為true.
          (3).defaultexcludes 用來確定是否使用默認(rèn)的排除模式,默認(rèn)為true。
          (4).excludes 是用逗號分隔的需要派出的文件模式列表。
          (5).excludesfile 表示每行包含一個(gè)排除模式的文件的文件名。
          (6).includes 是用逗號分隔的,需要包含的文件模式列表。
          (7).includesfile 表示每行包括一個(gè)包含模式的文件名。

          5.patternset 類型
          Fileset 是對文件的分組,而patternset是對模式的分組,他們是緊密相關(guān)的概念。

          <patternset>支持4個(gè)屬性:includes excludex includexfile 和 excludesfile,與fileset相

          同。Patternset 還允許以下嵌套元素:include,exclude,includefile 和 excludesfile.

          6.filterset 類型
          Filterset定義了一組過濾器,這些過濾器將在文件移動或復(fù)制時(shí)完成文件的文本替換。
          主要屬性如下:
          (1).begintoken 表示嵌套過濾器所搜索的記號,這是標(biāo)識其開始的字符串。
          (2).endtoken表示嵌套過濾器所搜索的記號這是標(biāo)識其結(jié)束的字符串。
          (3).id是過濾器的唯一標(biāo)志符。
          (4).refid是對構(gòu)建文件中某處定義一個(gè)過濾器的引用。

          7.Path類型
          Path元素用來表示一個(gè)類路徑,不過它還可以用于表示其他的路徑。在用作揖個(gè)屬性時(shí),路經(jīng)中

          的各項(xiàng)用分號或冒號隔開。在構(gòu)建的時(shí)候,此分隔符將代替當(dāng)前平臺中所有的路徑分隔符,其擁

          有的屬性如下。
          (1).location 表示一個(gè)文件或目錄。Ant在內(nèi)部將此擴(kuò)展為一個(gè)絕對路徑。
          (2).refid 是對當(dāng)前構(gòu)建文件中某處定義的一個(gè)path的引用。
          (3).path表示一個(gè)文件或路徑名列表。

          8.mapper類型
          Mapper類型定義了一組輸入文件和一組輸出文件間的關(guān)系,其屬性如下。
          (1).classname 表示實(shí)現(xiàn)mapper類的類名。當(dāng)內(nèi)置mapper不滿足要求時(shí),用于創(chuàng)建定制mapper.
          (2).classpath表示查找一個(gè)定制mapper時(shí)所用的類型路徑。
          (3).classpathref是對某處定義的一個(gè)類路徑的引用。
          (4).from屬性的含義取決于所用的mapper.
          (5).to屬性的含義取決于所用的mapper.
          (6).type屬性的取值為identity,flatten glob merge  regexp  其中之一,它定義了要是用的

          內(nèi)置mapper的類型。


          Ant 的運(yùn)行
          安裝好Ant并且配置好路徑之后,在命令行中切換到構(gòu)建文件的目錄,輸入Ant命令就可以運(yùn)行

          Ant.若沒有指定任何參數(shù),Ant會在當(dāng)前目錄下查詢build.xml文件。如果找到了就用該文件作為

          構(gòu)建文件。如果使用了 –find 選項(xiàng),Ant 就會在上級目錄中找構(gòu)建文件,直至到達(dá)文件系統(tǒng)得

          跟目錄。如果構(gòu)建文件的名字不是build.xml ,則Ant運(yùn)行的時(shí)候就可以使用 –buildfile file

          ,這里file 指定了要使用的構(gòu)建文件的名稱,示例如下:
          Ant
          如下說明了表示當(dāng)前目錄的構(gòu)建文件為build.xml 運(yùn)行 ant 執(zhí)行默認(rèn)的目標(biāo)。

          Ant –buildfile  test.xml
          使用當(dāng)前目錄下的test.xml 文件運(yùn)行Ant ,執(zhí)行默認(rèn)的目標(biāo)

          posted @ 2011-02-16 11:41 稻草 閱讀(222) | 評論 (0)編輯 收藏
          僅列出標(biāo)題  
          主站蜘蛛池模板: 苗栗县| 卓资县| 民乐县| 盱眙县| 九江县| 高尔夫| 新津县| 柞水县| 海兴县| 乌海市| 龙里县| 延长县| 西城区| 高阳县| 中阳县| 高雄县| 阳曲县| 云林县| 恩平市| 金山区| 湾仔区| 定安县| 星子县| 博湖县| 南乐县| 银川市| 合山市| 大城县| 岑溪市| 酉阳| 吉安县| 天柱县| 昌江| 东台市| 钟祥市| 布拖县| 冕宁县| 温泉县| 区。| 格尔木市| 麻阳|