MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          tomcat5中,為了保證get數據采用UTF8編碼,在server.xml中進行了如下設置:

          <Connector port="8080" maxThreads="150" minSpareThreads="25"
          maxSpareThreads="75" enableLookups="false" redirectPort="8443"
          acceptCount="100" debug="99" connectionTimeout="20000"
          disableUploadTimeout="true" URIEncoding="UTF-8"/>

          這里指定了get時候的數據編碼。但是,當使用IIS作為webserver轉發servlet/jsp請求給Tomcat時候,這個設置卻失效了。其實原因很簡單:IIS是通過AJP協議,把請求轉發到Tomcat監聽的8009端口上的,所以這里針對8080的設置自然就無效了。正確的方法是進行下面的設置:

          <Connector port="8009" enableLookups="false" redirectPort="8443"
          debug="0" protocol="AJP/1.3" URIEncoding="UTF-8"/>

          posted @ 2007-10-17 21:47 leekiang 閱讀(36639) | 評論 (3)編輯 收藏

              進入管理工具 >本地安全策略,把 IP 安全策略 策略已指派 設置為否

          posted @ 2007-10-12 00:42 leekiang 閱讀(574) | 評論 (0)編輯 收藏

          1,ActionForm中setter和getter的類型必須對應。
          ?? struts把post的所有參數放到一個map里,再通過beanutil的populate方法填充到ActionForm,在populate時有一些隱含邏輯,出現一些意想不到的行為,而且不同的BeanUtils版本可能還不一樣。如果ActionForm的某個setter方法的參數是Long類型,而post的對應的參數的值為空,則會自動設置為0.另外ActionForm中setter和getter的類型必須對應,這個沒搞明白,有空看populate()方法的源碼。
          2, 在ActionForm中many to one的one方可這樣設置
          ?? public String getParentid() {
          ??? ??? return son.getParent().getParentid().toString();
          ??? }
          ???
          ??? public void setParentid(String parentid) {
          ??? ??? if (parentid!= null && !"".equals(parentid)) {
          ??? ??? ??? son.setParent(new Parent(new Long(parentid)));
          ??? ??? }
          ??? }
          3,contextRelative
          如果該值被設置為 true,那么路徑就被認為是相對于整個 Web 應用的相對路徑。
          如果該值被設置為 false,那么路徑就被認為是相對于一個模塊化應用程序的這個模塊的相對路徑。默認為false。

          4,<bean:write>輸入網頁時必須加filter=false

          5,struts1.x可以利用spring提供的RequestUtil.populate(bean)方法自動的將請求參數封裝進一個POJO
          見http://yuanke.javaeye.com/blog/433370

          posted @ 2007-10-09 11:38 leekiang 閱讀(338) | 評論 (0)編輯 收藏

          1,從Hibernate 3.0.x/3.1.x升級到最新的3.2版,一定要注意,3.2版的很多sql函數如count(), sum()的唯一返回值已經從Integer變為Long,如果不升級代碼,會得到一個ClassCastException。

          這個變化主要是為了兼容JPA,可以在hibernate.org的最新文檔中找到說明。

          Hibernate Team也提供了一個與原來兼容的解決方案:

          ? Configuration classicCfg = new Configuration();
          ? classicCfg.addSqlFunction( "count", new ClassicCountFunction());
          ? classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
          ? classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
          ? SessionFactory classicSf = classicCfg.buildSessionFactory();

          int?count?=?((Integer)q.uniqueResult()).intValue();

          改成?int?count?=?((Number)q.uniqueResult()).intValue();?這樣就可以兩個版本同時兼容.

          2,hibernate3.2要求ehcache1.2

          3,session.createSQLQuery(sql).executeUpdate();這個hibernate3.0.5不支持,而hibernate3.2支持

          ? session.createSQLQuery(fsql).addScalar("singlevalue",
          ??? ??? ??? ??? ??? ??? Hibernate.DOUBLE).uniqueResult();這個到了3.2就不需要addScalar了.

          4,session.createSQLQuery(sql).addEntity(Class class);hibernate3.0.5不支持,單個參數的addEntity方法

          5,hibernate3.2可以對原生sql 查詢使用ResultTransformer。這會返回不受Hibernate管理的實體。
          sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
          ??????? .setResultTransformer(Transformers.aliasToBean(CatDTO.class))

          或setResultTransformer(new AliasToBeanResultTransformer(CatDTO.class))
          上面的查詢將會返回CatDTO的列表,它將被實例化并且將NAME和BIRTHDAY的值注射入對應的屬性或者字段。
          http://bbs.xml.org.cn/blog/more.asp?name=lhwork&id=15351

          但必須注意,對每一個列都必須addScalar("列名")

          6,setResultTransformer與addEntity的一個區別是前者支持查任意的列,后者必須用select * from users的形式或select {a.*},{b.*} from a,b where ....。

          7,Map vs. Object[]

          Since you can also use a transformer that return a Map from alias to value/entity (e.g. Transformers.ALIAS_TO_MAP), you are no longer required to mess with index based Object arrays when working with a result.

          List iter = s.createQuery(
          "select e.student.name as studentName," +
          " e.course.description as courseDescription" +
          "from Enrolment as e")
          .setResultTransformer( Transformers.ALIAS_TO_MAP )
          .iterate();

          String name = (Map)(iter.next()).get("studentName");

          Again, this works equally well for Criteria, HQL and native SQL.

          ?

          posted @ 2007-10-09 02:03 leekiang 閱讀(994) | 評論 (0)編輯 收藏

          1,get一個對象并打算修改這個對象時,hibernate會判斷該對象的屬性值是否有變動,如果沒有任何變動,hibernate不會執行update語句。在同時修改頁面上的多條記錄時可發現這一點。

          2,執行以下語句時hibernate3.0.5會報錯,而3.2不會
          sql="select 1+1 from dual";
          session.createSQLQuery(sql).uniqueResult()
          報錯:addScalar() or addEntity()?must be called on a sql query before executing the query.

          3,<many-to-one> 的lazy設置為true時,get子對象不會把該父對象抓過來,但可以手動寫代碼抓取父對象
          如 Son son =(Son)this.getHibernateTemplate().get(Son.class, id);
          ??? ?? 然后執行 son.getParent().getName();
          ?? 這樣不僅僅會抓取到name,其他所有的屬性如age,sex等都會取到,即用p.getParent().getAge()達到了同樣的效果,后臺都執行了select * from parent where id=??? 注意用p.getParent()僅能得到parent的id.
          ?? 這時debug查看parent對象的內存快照,看到的是一個用cglib實現的代理對象,
          Hibernate通過使用CGLIB,來實現動態構造一個目標對象的代理類對象,并且在代理類對象中包含目標對象的所有屬性和方法,而且所有屬性均被賦值為null。通過調試器顯示的內存快照,我們可以看出此時真正的User對象,是包含在代理對象的CGLIB$CALBACK_0.target屬性中,當調用son.getName()方法,這時通過CGLIB賦予的回調機制,實際上調用CGLIB$CALBACK_0.getName()方法,當調用該方法時,Hibernate會首先檢查CGLIB$CALBACK_0.target屬性是否為null,如果不為空,則調用目標對象的getName方法,如果為空,則會發起數據庫查詢,生成類似這樣的SQL語句:select * from parent where id=’1’;來查詢數據,并構造目標對象,并且將它賦值到CGLIB$CALBACK_0.target屬性中。
          這樣,通過一個中間代理對象,Hibernate實現了實體的延遲加載,只有當用戶真正發起獲得實體對象屬性的動作時,才真正會發起數據庫查詢操作。
          ??? <many-to-one> 的lazy設置為false時,抓取父對象沒有采用代理機制。

          4,用session.close(),執行多次查詢后報session is closed的錯誤,而hibernateSessionFactory.closeSession()沒有這個問題,這是什么原因?

          5,ORA-01466: 無法讀數據 - 表定義已更改
          原因是系統時間修改造成的,其他原因詳見
          http://www.orafaq.com/usenet/comp.databases.oracle.server/2007/03/31/1586.htm

          6,
          spring的一個方法上有事務,先用hibernate加載一個對象,接著改變對象的某個屬性的值,
          再用sql去數據庫查對應的記錄,然后才提交。
          用sql去查時發現對應的字段也改變了,這是怎么回事?


          ??

          posted @ 2007-09-28 03:51 leekiang 閱讀(643) | 評論 (0)編輯 收藏

          在做大批量處理時,容易出現outofmemory的情況,分析及解決如下
          (1)原因
          ?當首次作Insertupdatedeleteselect時,新產生的object在session關閉之前將自動裝載到session級別的緩存區,如果,AP使用了二級緩存,同樣也會裝入到二級緩存。所以當數據量大時,就會出現outofmemory情況。
          ?
          (2)解決方法
          ?
          (A)批量插入(Batch inserts)/批量更新(Batch updates)
          必須通過經常的調用 flush() 以及稍后調用 clear() 來控制第一級緩存的大小
          如:
          Session session = sessionFactory.openSession();
          Transaction tx = session.beginTransaction();
          ??
          for ( int i=0; i<100000; i++ ) {
          ??? Customer customer = new Customer(.....);
          ??? session.save(customer);
          ??? if ( i % 20 == 0 ) {
          //20, same as the JDBC batch size //20,與JDBC批量設置相同
          ??????? //flush a batch of inserts and release memory:
          ??????? //將本批插入的對象立即寫入數據庫并釋放內存
          ??????? session.flush();
          ??????? session.clear();
          ??? }
          }
          ??
          tx.commit();
          session.close();
          ?
          (B)大批量更新/刪除(Bulk update/delete)
          使用HQL語言
          ?
          Session session = sessionFactory.openSession();
                  Transaction tx = session.beginTransaction();
          
                  String hqlUpdate = "update Customer set name = :newName where name = :oldName";
                  int updatedEntities = s.createQuery( hqlUpdate )
                                      .setString( "newName", newName )
                                      .setString( "oldName", oldName )
                                      .executeUpdate();
                  tx.commit();
                  session.close();

          執行一個HQL DELETE,同樣使用 Query.executeUpdate() 方法 (此方法是為 那些熟悉JDBC PreparedStatement.executeUpdate() 的人們而設定的)
          Session session = sessionFactory.openSession();
                  Transaction tx = session.beginTransaction();
          
                  String hqlDelete = "delete Customer where name = :oldName";
                  int deletedEntities = s.createQuery( hqlDelete )
                                      .setString( "oldName", oldName )
                                      .executeUpdate();
                  tx.commit();
                  session.close();

          posted @ 2007-09-27 14:22 leekiang 閱讀(1468) | 評論 (0)編輯 收藏

          用一個div將table 套住,把層的寬和高都設為定長,
          <div style="overflow-y:scroll;width:100%;height:100%">
          ?<table>???
          ?</table>
          </div>
          overflow-y不要設置為visible

          posted @ 2007-09-24 16:57 leekiang 閱讀(7877) | 評論 (1)編輯 收藏

           1public String double2String(double d, int fNumber) {
           2        if (fNumber < 0)
           3            fNumber = 0;
           4
           5        String pattern = null;
           6        switch (fNumber) {
           7        case 0:
           8            pattern = "#0"//$NON-NLS-1$
           9            break;
          10        default:
          11            pattern = "#0."//$NON-NLS-1$
          12            StringBuffer b = new StringBuffer(pattern);
          13            for (int i = 0; i < fNumber; i++{
          14                b.append('#');
          15            }

          16            pattern = b.toString();
          17            break;
          18
          19        }

          20        DecimalFormat formatter = new DecimalFormat();
          21        formatter.applyPattern(pattern);
          22        String value = formatter.format(d);
          23        return value;
          24    }
          double直接輸出時,如果小數點后位數太長會出現字母e,采用本方法轉換為string再輸出

          posted @ 2007-09-16 23:25 leekiang 閱讀(6205) | 評論 (1)編輯 收藏

          1,logic:empty與logic:present的區別
          相同點:對于沒有在page,request,session,application中定義或者是沒有分配內存空間(null值)的變量,這兩個標記處理的方法是一致的.
          區別:空字符串""值,他們的處理就不一樣了,logic:present 標記認為空字符串仍然是存在的,也就是說,只要是引用了一塊內存空間的變量,logic:present 就會返回present ;而logic:empty則認為空字符串仍然為空,由此得出,在logic:empty看來,變量不僅僅要引用一塊內存空間,而且該地址空間的值不能為空字符串,否則都認為該變量為空,都會返回empty

          2,logic iterate輸出map
          ?
          iterate標簽處理map時好像只能做到以遍歷的方式輸出key和value,而不能指定輸出某個key
          ? 以下來源:http://www.aygfsteel.com/msmary/articles/153560.html
          ????? 標簽本身不直接支持迭代輸出輸出步驟:
          Map-->Set-->Iterator-->Map.Entry-->key
          value

          ??????? Map m = new HashMap();

          ??????? m.put("name","yourname");

          ??????? m.put("pass","yourpass");

          ??????? request.setAttribute("map",m);

          <logic:iterate id="str" name="map" scope="request">

          ????? <h2><bean:write name="str" property="key"/></h2>

          ????? <h2><bean:write name="str" property="value"/></h2>

          ??? </logic:iterate>

          ?? <%

          ??????? /**

          ????????? Map中保存多個Collection集合,該如何進行了輸出?

          ??????? */

          ??????? List all = null;

          ??????? Map m = new HashMap();

          ???????

          ??????? all = new ArrayList();

          ??????? all.add("msdn");

          ??????? all.add("url");

          ??????? m.put("name",all);

          ???????

          ??????? all = new ArrayList();

          ??????? all.add("mole");

          ??????? all.add("msistri");

          ??????? m.put("info",all);

          ??????? //在一個Map中保存了多個集合,每個集合又包含了多個內容

          ??????? request.setAttribute("list",m);

          ??? %>

          ??? <logic:iterate id="src" name="list" scope="request" >

          ????? <h2><bean:write name="src" property="key"/></h2>

          ??????? <logic:iterate id="ins" name="src" scope="page" property="value">

          ?????????? <bean:write name="ins"/>

          ??????? </logic:iterate>

          ??? </logic:iterate>

          http://www.aygfsteel.com/ftqiuqiu/articles/205631.html
          http://zengbo0710.javaeye.com/blog/79405
          http://blog.csdn.net/daryl715/archive/2007/03/12/1527098.aspx

          posted @ 2007-09-14 15:03 leekiang 閱讀(1002) | 評論 (0)編輯 收藏

          不考慮極端的情況,通常組織機構有個10幾個層次就是頂天了。 所有,可以用一個字段存儲下所有祖先的信息,例如varchar2(300),其中可以用 '.'隔開。 我的設想是這樣的:
          id name Nodecode
          1 a 1
          2 b 1.2
          3 c 1.3
          4 d 1.2.4
          5 e 1.2.5
          6 f 1.2.5.6

          從6可以直接看到它的上級脈絡是6.5.2.1 。當然這里考慮的是級別不多的。但是除非你是很極端的應用,我想還是可以滿足的。在插入和更新的時候注意維護nodecode即可。
          如果要照到祖先,則只要解析一下nodecode即可。
          同理如果要照后代,例如2的后代,則馬上可以通過Like的方式獲得.

          另一篇:
          因為TreeKey是個字符串,而1.10會排到1.2, 1.3之前,很顯然,這不是我們要的結果。要解決其實也很簡單,在編號前面補0,比如,1.10就寫成0001.0010,1.2就寫成0001.0002,這樣排序就不會有問題了。

          這讓我想起很早前看的微軟的一個有關樹的軟件代碼,就看到他們是以000x.000x這種方式進行處理的,當時我還感覺他們怎么這么麻煩,現在想來,才發現是自己無知了,呵呵。


          posted @ 2007-09-12 13:37 leekiang 閱讀(237) | 評論 (0)編輯 收藏

          僅列出標題
          共54頁: First 上一頁 45 46 47 48 49 50 51 52 53 下一頁 Last 
          主站蜘蛛池模板: 镇沅| 浙江省| 屏东市| 陵川县| 涞水县| 广南县| 海城市| 莱西市| 江阴市| 察隅县| 土默特右旗| 江永县| 图们市| 武山县| 兴隆县| 五原县| 汾西县| 新昌县| 定远县| 保定市| 阳原县| 通州区| 根河市| 雅安市| 荣成市| 宁海县| 淅川县| 卫辉市| 遂宁市| 石台县| 米脂县| 宜城市| 库尔勒市| 喜德县| 白城市| 临武县| 博湖县| 淄博市| 陆河县| 都匀市| 微博|