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

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

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

    小方的Java博客

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      27 隨筆 :: 17 文章 :: 115 評論 :: 0 Trackbacks

    2007年3月3日 #

    我在做公司某個(gè)框架時(shí)有這么一個(gè)需求。每次調(diào)用dwr的方法前要檢查用戶是否已經(jīng)登錄,否則就不能執(zhí)行并且退到首頁。

    當(dāng)然了,做攔截器有很多方式,但經(jīng)過研究發(fā)現(xiàn)DWR自帶很多插件,其中就有一個(gè)調(diào)用處理的插件。具體做法如下。

    在web.xml里的DWR配置中加入一個(gè)參數(shù):
    <init-param>
                
    <param-name>
                    org.directwebremoting.extend.Remoter
                
    </param-name>
                
    <param-value>com.xxx.base.framework.web.MyDWRRemoter</param-value>
            
    </init-param>

    然后自己創(chuàng)建這個(gè)實(shí)現(xiàn)類。
    public class MyDWRRemoter extends DefaultRemoter
    {

        
    public Replies execute( Calls calls )
        
    {
            HttpSession session 
    = WebContextFactory.get().getSession();
            ISessionContainer sc 
    = ( ISessionContainer ) session.getAttribute( ISessionContainer.SESSION_CONTAINER_KEY );

            
    //session檢查
            if ( sc == null || sc.getUserInfo() == null )
            
    {
                logOut();
                
    return super.execute( new Calls() );
            }

            
    else
            
    {
                IUserInfo userInfo 
    = sc.getUserInfo();
                
    if(!SecurityFactory.getInstance().isOnline( userInfo.getUserID(), session.getId() ))
                
    {
                    logOut();
                    
    return super.execute( new Calls() );
                }

            }

            
    return super.execute( calls );
        }


        
    private void logOut()
        
    {
            WebContext wct 
    = WebContextFactory.get();
            Util utilThis 
    = new Util(wct.getScriptSession());
            utilThis.addScript( 
    new ScriptBuffer("logOut()"));
        }

    }

    其中,檢查用戶是否登錄,如果沒有登錄就返回一個(gè)空的super.execute( new Calls());, 不能返回null否則會報(bào)錯。
    檢查通過就調(diào)用super.execute( calls );  其實(shí)calls里還能獲得很多信息。

    最后大家注意logOut方法,這里用到了DWR2.0新功能:DWR反向調(diào)用,就是DWR調(diào)用javascript,具體用法大家網(wǎng)上可以查到,需要配置的,我這里就不多說了。補(bǔ)充一下,addScript調(diào)用的是html里的function logOut().

    這樣的話,如果用戶session超時(shí),或被管理員踢掉,一旦他做任何dwr操作就會被強(qiáng)迫登出到首頁了。
    posted @ 2008-12-05 20:42 方佳瑋 閱讀(2902) | 評論 (3)編輯 收藏

    很久以前看某本書整理的,忘了哪本了,現(xiàn)在貢獻(xiàn)出來。

    1)在select語句中使用條件邏輯

    1select ename,sal,   
    2       case when sal <= 2000 then 'UNDERPAID'  
    3            when sal >= 4000 then 'OVERPAID'  
    4            else 'OK'  
    5       end as status   
    6from emp   


    ENAME SAL STATUS
    ---------- ---------- ---------
    SMITH 800 UNDERPAID
    ALLEN 1600 UNDERPAID
    WARD 1250 UNDERPAID
    JONES 2975 OK
    MARTIN 1250 UNDERPAID
    BLAKE 2850 OK
    CLARK 2450 OK
    SCOTT 3000 OK
    KING 5000 OVERPAID
    TURNER 1500 UNDERPAID
    ADAMS 1100 UNDERPAID
    JAMES 950 UNDERPAID

    FORD 3000 OK
    MILLER 1300 UNDERPAID

     

    2)從表中隨機(jī)返回n條記錄

    1select *   
    2  from (   
    3    select ename, job   
    4    from emp   
    5    order by dbms_random.value()   
    6  )   
    7  where rownum <= 5 

     

    3)按照子串排序

    比如要從EMP表中返回員工名字和職位,并且按照職位字段最后2個(gè)字符排序

    1select ename,job   
    2  from emp   
    3order by substr(job,length(job)-2

    ENAME JOB
    ---------- ---------
    KING PRESIDENT
    SMITH CLERK
    ADAMS CLERK
    JAMES CLERK
    MILLER CLERK
    JONES MANAGER
    CLARK MANAGER
    BLAKE MANAGER
    ALLEN SALESMAN
    MARTIN SALESMAN
    WARD SALESMAN
    TURNER SALESMAN
    SCOTT ANALYST
    FORD ANALYST

     

    4)處理空值排序

    當(dāng)被排序的列存在空值,如果希望空值不影響現(xiàn)有排序

    1select ename,sal,comm   
    2   from emp   
    3order by comm nulls last 

     

    ENAME SAL COMM
    ------ ----- ---------
    TURNER 1500 0
    ALLEN 1600 300
    WARD 1250 500
    MARTIN 1250 1400
    SMITH 800
    JONES 2975
    JAMES 950
    MILLER 1300
    FORD 3000
    ADAMS 1100
    BLAKE 2850
    CLARK 2450
    SCOTT 3000
    KING 5000

    1select ename,sal,comm   
    2  from emp   
    3order by comm desc nulls first 


    ENAME SAL COMM
    ------ ----- ----------
    SMITH 800
    JONES 2975
    CLARK 2450
    BLAKE 2850
    SCOTT 3000
    KING 5000
    JAMES 950
    MILLER 1300
    FORD 3000
    ADAMS 1100
    MARTIN 1250 1400
    WARD 1250 500
    ALLEN 1600 300
    TURNER 1500 0

    5)根據(jù)數(shù)據(jù)項(xiàng)的鍵排序

    比如如果job是“SALESMAN”,根據(jù)COMM排序,否則根據(jù)SAL排序

    1select ename,sal,job,comm   
    2  from emp   
    3 order by case when job = 'SALESMAN' then comm else sal end  


    ENAME SAL JOB COMM
    ---------- ---------- --------- ----------
    TURNER 1500 SALESMAN 0
    ALLEN 1600 SALESMAN 300
    WARD 1250 SALESMAN 500
    SMITH 800 CLERK
    JAMES 950 CLERK
    ADAMS 1100 CLERK
    MARTIN 1250 SALESMAN 1300
    MILLER 1300 CLERK
    CLARK 2450 MANAGER
    BLAKE 2850 MANAGER
    JONES 2975 MANAGER
    SCOTT 3000 ANALYST
    FORD 3000 ANALYST


     

    6)從一個(gè)表中查找另一個(gè)表中沒有的值

    比如要從DEPT中查找在表EMP中不存在數(shù)據(jù)的所有部門(數(shù)據(jù)中,DEPTNO值為40的記錄在表EMP中不存在)

    1select deptno from dept   
    2minus   
    3select deptno from emp 


     

    7)在運(yùn)算和比較時(shí)使用null值

    null不會等于和不等于任何值,null和自己都不等于。以下例子是當(dāng)comm有null的情況下列出比“WARD”提成低的員工。 (coalesce函數(shù)將null轉(zhuǎn)換為其他值)

    1select ename,comm,coalesce(comm,0)   
    2  from emp   
    3where coalesce(comm,0< ( select comm   
    4                                     from emp   
    5                                    where ename = 'WARD' )


    ENAME COMM COALESCE(COMM,0)
    ---------- ---------- ----------------
    SMITH 0
    ALLEN 300 300
    JONES 0
    BLAKE 0
    CLARK 0
    SCOTT 0
    KING 0
    TURNER 0 0
    ADAMS 0
    JAMES 0
    FORD 0
    MILLER 0

     

    8)刪除重復(fù)記錄

    對于名字重復(fù)的記錄,保留一個(gè)

    1delete from dupes   
    2 where id not in ( select min(id)   
    3                      from dupes   
    4                     group by name ) 

     

    9)合并記錄
    比如如下需求:
    如果表EMP_COMMISSION中的某員工也存在于EMP表,那么更新comm為1000
    如果以上員工已經(jīng)更新到1000的員工,如果他們SAL少于2000,刪除他們
    否則,從表中提取該員工插入表EMP_COMMISSION

    1merge into emp_commission ec   
    2using (select * from emp) emp   
    3    on (ec.empno=emp.empno)   
    4 when matched then  
    5       update set ec.comm = 1000   
    6       delete where (sal < 2000)   
    7 when not matched then  
    8        insert (ec.empno,ec.ename,ec.deptno,ec.comm)   
    9       values (emp.empno,emp.ename,emp.deptno,emp.comm)  

     

    10)用sql生成sql

    1select 'select count(*) from '||table_name||';' cnts   
    2  from user_tables;   


    (user_tables是oracle的元數(shù)據(jù)表之一)

    CNTS
    ----------------------------------------
    select count(*) from ANT;
    select count(*) from BONUS;
    select count(*) from DEMO1;
    select count(*) from DEMO2;
    select count(*) from DEPT;
    select count(*) from DUMMY;
    select count(*) from EMP;
    select count(*) from EMP_SALES;
    select count(*) from EMP_SCORE;
    select count(*) from PROFESSOR;
    select count(*) from T;
    select count(*) from T1;
    select count(*) from T2;
    select count(*) from T3;
    select count(*) from TEACH;
    select count(*) from TEST;
    select count(*) from TRX_LOG;
    select count(*) from X;

     

    11)計(jì)算字符在字符串里的出現(xiàn)次數(shù)

    判斷字符串里有多少個(gè)‘ , ’

    1select (length('10,CLARK,MANAGER')-   
    2  length(replace('10,CLARK,MANAGER',',','')))/length(',')   
    3  as cnt   
    4from t1   


    先計(jì)算原字符串長度,再減去去掉逗號的長度,這個(gè)差再除以‘,’的長度

     

    12)將數(shù)字和字母分離


    原數(shù)據(jù)是:

    DATA
    ---------------
    SMITH800
    ALLEN1600
    WARD1250
    JONES2975
    MARTIN1250
    BLAKE2850
    CLARK2450
    SCOTT3000
    KING5000
    TURNER1500
    ADAMS1100
    JAMES950
    FORD3000
    MILLER1300
     1select replace(   
     2  translate(data,'0123456789','0000000000'),'0') ename,   
     3  to_number(   
     4    replace(   
     5    translate(lower(data),   
     6      'abcdefghijklmnopqrstuvwxyz',   
     7      rpad('z',26,'z')),'z')) sal   
     8  from (   
     9    select ename||sal data from emp   
    10 )   

    ENAME SAL
    ---------- ----------
    SMITH 800
    ALLEN 1600
    WARD 1250
    JONES 2975
    MARTIN 1250
    BLAKE 2850
    CLARK 2450
    SCOTT 3000
    KING 5000
    TURNER 1500
    ADAMS 1100
    JAMES 950
    FORD 3000
    MILLER 1300

    思路是很復(fù)雜的,比如先去除數(shù)字,是先把所有數(shù)字翻譯為0,然后用replace去掉0.


     

    13)根據(jù)表中的行創(chuàng)建分割列表


    表中數(shù)據(jù):
    DEPTNO EMPS
    ------ ----------
    10 CLARK
    10 KING
    10 MILLER
    20 SMITH
    20 ADAMS
    20 FORD
    20 SCOTT
    20 JONES
    30 ALLEN
    30 BLAKE
    30 MARTIN
    30 JAMES
    30 TURNER
    30 WARD

     1select deptno,   
     2    ltrim(sys_connect_by_path(ename,','),',') emps   
     3  from (   
     4  select deptno,   
     5    ename,   
     6    row_number() over   
     7       (partition by deptno order by empno) rn,   
     8    count(*) over   
     9      (partition by deptno) cnt   
    10  from emp   
    11  )   
    12  where level = cnt   
    13  start with rn = 1   
    14    connect by prior deptno = deptno and prior rn = rn-1 


    查詢結(jié)果
    DEPTNO EMPS
    ------- ------------------------------------
    10 CLARK,KING,MILLER
    20 SMITH,JONES,SCOTT,ADAMS,FORD
    30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES

     

    14)按字母順序排序

     1select old_name, new_name   
     2  from (select old_name, replace(sys_connect_by_path(c, ' '), ' ') new_name   
     3          from (select e.ename old_name,   
     4                       row_number() over(partition by e.ename order by substr(e.ename, iter.pos, 1)) rn,   
     5                       substr(e.ename, iter.pos, 1) c   
     6                  from emp e, (select rownum pos from emp) iter   
     7                 where iter.pos <= length(e.ename)   
     8                 order by 1) x   
     9         start with rn = 1   
    10        connect by prior rn = rn - 1   
    11               and prior old_name = old_name)   
    12 where length(old_name) = length(new_name) 


    You would like the result to be:

    OLD_NAME NEW_NAME
    ---------- --------
    ADAMS AADMS
    ALLEN AELLN
    BLAKE ABEKL
    CLARK ACKLR
    FORD DFOR
    JAMES AEJMS
    JONES EJNOS
    KING GIKN
    MARTIN AIMNRT
    MILLER EILLMR
    SCOTT COSTT
    SMITH HIMST
    TURNER ENRRTU
    WARD ADRW

     

    posted @ 2008-08-07 14:41 方佳瑋 閱讀(2768) | 評論 (6)編輯 收藏

    答辯后,心理有很多話要說,真是很不爽,也為中國軟件業(yè)的未來捏一把汗。如果此文讓某些讀者感覺不爽,就當(dāng)沒看過,在此先向你道歉。
     
    本周5是我們計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)答辯日,我提前4天來到學(xué)校,帶著3月份早就完成的畢業(yè)設(shè)計(jì)。真是讓我大吃一驚,很多同學(xué)竟然都下載或者花錢買了畢業(yè)設(shè)計(jì)或者找人幫忙做來交差,這個(gè)數(shù)量我估計(jì)至少有5成。我的一個(gè)好友,更是夸張,什么都沒做,要我?guī)退?天內(nèi)搞定,我慌了,真把我當(dāng)超人了,不過還好,由于她那個(gè)東西確實(shí)沒什么內(nèi)容,我趕了一下還是幫她搞定了,實(shí)在是沒啥內(nèi)容的畢業(yè)設(shè)計(jì)。最搞笑的是還有些同學(xué)。。。,由于不是自己做的東西,而且連代碼也看不懂,運(yùn)行出錯都不知如何解決,只會找別人求助,還天真地說:奇怪,怎么不行呢?原來明明看到可以運(yùn)行的。。。。 我要他自己去debug一下,結(jié)果,連開發(fā)工具也沒用過,怎么在開發(fā)工具里跑一個(gè)工程debug也根本不會,我再次無話可說。
     
    同學(xué)們啊,你們不是高中生,你們是重點(diǎn)大學(xué)計(jì)算機(jī)專業(yè)應(yīng)屆畢業(yè)生啊,怎么就像沒讀過大學(xué)一樣,你們到底在4年里干了什么啊。
     
    然后更讓人心寒的是:答辯時(shí),很多老師都自己什么也不會,或者只會皮毛,看著同學(xué)的畢業(yè)設(shè)計(jì),除了問點(diǎn)需求問題,再也問不出任何技術(shù)問題了,最后就草草答辯完,給個(gè)分?jǐn)?shù)就算過了。我在答辯時(shí),也懶得把架構(gòu)和技術(shù)應(yīng)用來說了,實(shí)在是對牛彈琴。學(xué)生墮落,教師應(yīng)付,學(xué)校亂搞擴(kuò)招,公司高薪招不到人才,中國軟件業(yè)的未來有何希望!
     
    當(dāng)然,還是有10%左右的學(xué)生很優(yōu)秀,有些做了很不錯的java ee程序,有些自己研究做了簡易3D游戲引擎,還有些同學(xué)水平不怎么樣,但通過自己努力獨(dú)立完成了,雖然做得不怎么好,但學(xué)到很多東西,也是自己勞動汗水,但是這些同學(xué)太少太少。。。
    posted @ 2007-06-18 15:43 方佳瑋 閱讀(1614) | 評論 (6)編輯 收藏

    選自《Professional Javascript For Web Developers》

    其它方式:對象冒充,call(),apply(),原型鏈都有不少缺點(diǎn)這里就不一一介紹了,想了解的可以去看一下這本著作的第4章節(jié)。

    這種方法用對象冒充繼承屬性,用原型鏈繼承方法,代碼如下
    function ?ClassA(sColor){
    ????
    this .color? = ?sColor;
    }

    ClassA.prototype.sayColor?
    = ? function (){
    ????alert(
    this .color);
    }

    function ?ClassB(sColor,?sName){
    ????ClassA.call(
    this .?sColor);
    ????
    this .name? = ?sName;
    }

    ClassB.prototype?
    = ? new ?ClassA();

    ClassB.prototype.sayName?
    = ? function (){
    ????alert(
    this .name);
    }

    測試:
    var ?objA? = ? new ?ClassA( " red " );
    var ?objB? = ? new ?ClassB( " blue " ,? " Nicholas " );
    objA.sayColor();?
    // red
    objB.sayColor();? // blue
    objB.sayName();?? // Nicholas

    其它好方法,請參考zlnherit庫和xbObjects
    posted @ 2007-03-03 15:44 方佳瑋 閱讀(1366) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 国产av天堂亚洲国产av天堂| 国产又黄又爽胸又大免费视频| 亚洲成A人片在线观看无码不卡 | 国产精品亚洲精品日韩已方| 国产精品69白浆在线观看免费| 国产无遮挡无码视频免费软件 | 最近中文字幕无吗免费高清 | 久久精品国产亚洲av日韩| 又粗又硬又大又爽免费视频播放| 国产精品久久久久久久久久免费| 99免费观看视频| 欧洲人成在线免费| 91成人免费福利网站在线| 特级毛片全部免费播放| 亚洲国产精品无码久久九九大片 | 国产一级片免费看| 久久av免费天堂小草播放| 美女扒开尿口给男人爽免费视频| 亚洲一区在线观看视频| 亚洲综合在线成人一区| 亚洲欧洲日产国产综合网| 亚洲深深色噜噜狠狠爱网站| 精品国产香蕉伊思人在线在线亚洲一区二区| 免费无码黄动漫在线观看| 最近2019中文字幕mv免费看| 日本在线高清免费爱做网站| 亚洲免费人成视频观看| 亚洲无砖砖区免费| 国产成人yy免费视频| 114级毛片免费观看| h视频在线观看免费完整版| 88av免费观看| 97国产免费全部免费观看| 真人做A免费观看| 久久久久久国产精品免费免费| 免费看黄视频网站| 97无码免费人妻超级碰碰碰碰| 成年女人午夜毛片免费看| 免费无码又爽又刺激高潮| 四虎影视永久免费观看地址| 日本中文一区二区三区亚洲|