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

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

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

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

    tomcat5中,為了保證get數(shù)據(jù)采用UTF8編碼,在server.xml中進(jìn)行了如下設(shè)置:

    <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時(shí)候的數(shù)據(jù)編碼。但是,當(dāng)使用IIS作為webserver轉(zhuǎn)發(fā)servlet/jsp請(qǐng)求給Tomcat時(shí)候,這個(gè)設(shè)置卻失效了。其實(shí)原因很簡(jiǎn)單:IIS是通過(guò)AJP協(xié)議,把請(qǐng)求轉(zhuǎn)發(fā)到Tomcat監(jiān)聽的8009端口上的,所以這里針對(duì)8080的設(shè)置自然就無(wú)效了。正確的方法是進(jìn)行下面的設(shè)置:

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

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

        進(jìn)入管理工具 >本地安全策略,把 IP 安全策略 策略已指派 設(shè)置為否 。

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

    1,ActionForm中setter和getter的類型必須對(duì)應(yīng)。
    ?? struts把post的所有參數(shù)放到一個(gè)map里,再通過(guò)beanutil的populate方法填充到ActionForm,在populate時(shí)有一些隱含邏輯,出現(xiàn)一些意想不到的行為,而且不同的BeanUtils版本可能還不一樣。如果ActionForm的某個(gè)setter方法的參數(shù)是Long類型,而post的對(duì)應(yīng)的參數(shù)的值為空,則會(huì)自動(dòng)設(shè)置為0.另外ActionForm中setter和getter的類型必須對(duì)應(yīng),這個(gè)沒(méi)搞明白,有空看populate()方法的源碼。
    2, 在ActionForm中many to one的one方可這樣設(shè)置
    ?? 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
    如果該值被設(shè)置為 true,那么路徑就被認(rèn)為是相對(duì)于整個(gè) Web 應(yīng)用的相對(duì)路徑。
    如果該值被設(shè)置為 false,那么路徑就被認(rèn)為是相對(duì)于一個(gè)模塊化應(yīng)用程序的這個(gè)模塊的相對(duì)路徑。默認(rèn)為false。

    4,<bean:write>輸入網(wǎng)頁(yè)時(shí)必須加filter=false

    5,struts1.x可以利用spring提供的RequestUtil.populate(bean)方法自動(dòng)的將請(qǐng)求參數(shù)封裝進(jìn)一個(gè)POJO
    見http://yuanke.javaeye.com/blog/433370

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

    1,從Hibernate 3.0.x/3.1.x升級(jí)到最新的3.2版,一定要注意,3.2版的很多sql函數(shù)如count(), sum()的唯一返回值已經(jīng)從Integer變?yōu)長(zhǎng)ong,如果不升級(jí)代碼,會(huì)得到一個(gè)ClassCastException。

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

    Hibernate Team也提供了一個(gè)與原來(lái)兼容的解決方案:

    ? 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();?這樣就可以兩個(gè)版本同時(shí)兼容.

    2,hibernate3.2要求ehcache1.2

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

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

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

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

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

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

    6,setResultTransformer與addEntity的一個(gè)區(qū)別是前者支持查任意的列,后者必須用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 閱讀(992) | 評(píng)論 (0)編輯 收藏

    1,get一個(gè)對(duì)象并打算修改這個(gè)對(duì)象時(shí),hibernate會(huì)判斷該對(duì)象的屬性值是否有變動(dòng),如果沒(méi)有任何變動(dòng),hibernate不會(huì)執(zhí)行update語(yǔ)句。在同時(shí)修改頁(yè)面上的多條記錄時(shí)可發(fā)現(xiàn)這一點(diǎn)。

    2,執(zhí)行以下語(yǔ)句時(shí)hibernate3.0.5會(huì)報(bào)錯(cuò),而3.2不會(huì)
    sql="select 1+1 from dual";
    session.createSQLQuery(sql).uniqueResult()
    報(bào)錯(cuò):addScalar() or addEntity()?must be called on a sql query before executing the query.

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

    4,用session.close(),執(zhí)行多次查詢后報(bào)session is closed的錯(cuò)誤,而hibernateSessionFactory.closeSession()沒(méi)有這個(gè)問(wèn)題,這是什么原因?

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

    6,
    spring的一個(gè)方法上有事務(wù),先用hibernate加載一個(gè)對(duì)象,接著改變對(duì)象的某個(gè)屬性的值,
    再用sql去數(shù)據(jù)庫(kù)查對(duì)應(yīng)的記錄,然后才提交。
    用sql去查時(shí)發(fā)現(xiàn)對(duì)應(yīng)的字段也改變了,這是怎么回事?


    ??

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

    在做大批量處理時(shí),容易出現(xiàn)outofmemory的情況,分析及解決如下
    (1)原因
    ?當(dāng)首次作Insertupdatedeleteselect時(shí),新產(chǎn)生的object在session關(guān)閉之前將自動(dòng)裝載到session級(jí)別的緩存區(qū),如果,AP使用了二級(jí)緩存,同樣也會(huì)裝入到二級(jí)緩存。所以當(dāng)數(shù)據(jù)量大時(shí),就會(huì)出現(xiàn)outofmemory情況。
    ?
    (2)解決方法
    ?
    (A)批量插入(Batch inserts)/批量更新(Batch updates)
    必須通過(guò)經(jīng)常的調(diào)用 flush() 以及稍后調(diào)用 clear() 來(lái)控制第一級(jí)緩存的大小
    如:
    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批量設(shè)置相同
    ??????? //flush a batch of inserts and release memory:
    ??????? //將本批插入的對(duì)象立即寫入數(shù)據(jù)庫(kù)并釋放內(nèi)存
    ??????? session.flush();
    ??????? session.clear();
    ??? }
    }
    ??
    tx.commit();
    session.close();
    ?
    (B)大批量更新/刪除(Bulk update/delete)
    使用HQL語(yǔ)言
    ?
    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();

    執(zhí)行一個(gè)HQL DELETE,同樣使用 Query.executeUpdate() 方法 (此方法是為 那些熟悉JDBC PreparedStatement.executeUpdate() 的人們而設(shè)定的)
    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 閱讀(1464) | 評(píng)論 (0)編輯 收藏

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

    posted @ 2007-09-24 16:57 leekiang 閱讀(7873) | 評(píng)論 (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直接輸出時(shí),如果小數(shù)點(diǎn)后位數(shù)太長(zhǎng)會(huì)出現(xiàn)字母e,采用本方法轉(zhuǎn)換為string再輸出

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

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

    2,logic iterate輸出map
    ?
    iterate標(biāo)簽處理map時(shí)好像只能做到以遍歷的方式輸出key和value,而不能指定輸出某個(gè)key
    ? 以下來(lái)源:http://www.tkk7.com/msmary/articles/153560.html
    ????? 標(biāo)簽本身不直接支持迭代輸出,輸出步驟:
    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中保存多個(gè)Collection集合,該如何進(jìn)行了輸出?

    ??????? */

    ??????? 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);

    ??????? //在一個(gè)Map中保存了多個(gè)集合,每個(gè)集合又包含了多個(gè)內(nèi)容

    ??????? 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.tkk7.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 閱讀(1000) | 評(píng)論 (0)編輯 收藏

    不考慮極端的情況,通常組織機(jī)構(gòu)有個(gè)10幾個(gè)層次就是頂天了。 所有,可以用一個(gè)字段存儲(chǔ)下所有祖先的信息,例如varchar2(300),其中可以用 '.'隔開。 我的設(shè)想是這樣的:
    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可以直接看到它的上級(jí)脈絡(luò)是6.5.2.1 。當(dāng)然這里考慮的是級(jí)別不多的。但是除非你是很極端的應(yīng)用,我想還是可以滿足的。在插入和更新的時(shí)候注意維護(hù)nodecode即可。
    如果要照到祖先,則只要解析一下nodecode即可。
    同理如果要照后代,例如2的后代,則馬上可以通過(guò)Like的方式獲得.

    另一篇:
    因?yàn)門reeKey是個(gè)字符串,而1.10會(huì)排到1.2, 1.3之前,很顯然,這不是我們要的結(jié)果。要解決其實(shí)也很簡(jiǎn)單,在編號(hào)前面補(bǔ)0,比如,1.10就寫成0001.0010,1.2就寫成0001.0002,這樣排序就不會(huì)有問(wèn)題了。

    這讓我想起很早前看的微軟的一個(gè)有關(guān)樹的軟件代碼,就看到他們是以000x.000x這種方式進(jìn)行處理的,當(dāng)時(shí)我還感覺他們?cè)趺催@么麻煩,現(xiàn)在想來(lái),才發(fā)現(xiàn)是自己無(wú)知了,呵呵。


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

    僅列出標(biāo)題
    共54頁(yè): First 上一頁(yè) 45 46 47 48 49 50 51 52 53 下一頁(yè) Last 
    主站蜘蛛池模板: 久久精品国产亚洲香蕉| 亚洲а∨天堂久久精品| 在线观看免费毛片| 免费a级毛片视频| 精品亚洲综合在线第一区 | 日韩一级免费视频| 亚洲女人被黑人巨大进入| 久久国产精品亚洲综合| 亚洲综合中文字幕无线码| 免费精品久久久久久中文字幕| 99久久国产精品免费一区二区| 台湾一级毛片永久免费| 一本久久综合亚洲鲁鲁五月天| 亚洲国产日韩在线视频| 亚洲人xxx日本人18| 一级毛片试看60分钟免费播放| 88av免费观看入口在线| 国产成人免费a在线视频app | 亚洲AV电影院在线观看| 亚洲国产系列一区二区三区| aa午夜免费剧场| 人成午夜免费视频在线观看| 亚洲AⅤ视频一区二区三区| 亚洲国产综合专区在线电影| 亚洲国产欧美一区二区三区| 你好老叔电影观看免费| 成人黄动漫画免费网站视频| 亚洲国产另类久久久精品黑人| 亚洲 欧洲 日韩 综合在线| 久久成人永久免费播放| 无码国产精品久久一区免费| 中文字幕亚洲无线码| 性xxxx黑人与亚洲| a级毛片免费全部播放无码| 成人免费视频小说| 亚洲AV无码精品色午夜在线观看| 亚洲youwu永久无码精品| 久久国产色AV免费看| 亚洲性久久久影院| 亚洲日韩一区二区一无码| 日韩精品人妻系列无码专区免费|