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

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

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

    Java蜘蛛人 歡迎大家

    歡迎大家 來到我的blog , 如果我身邊的朋友 有什么不懂可以直接來問我 我會(huì)細(xì)心的幫助你的. 如果網(wǎng)絡(luò)上的朋友有什么不懂的 可以加我Java蜘蛛人 QQ48187537
    posts - 54, comments - 192, trackbacks - 0, articles - 1

    2008年7月1日

    java 整合PHP 論壇。 最近公司有個(gè)項(xiàng)目需要整合一個(gè)論壇,于是就找到了PHP的discuz 論壇,但是以前沒整合過,所以網(wǎng)上找了很多資料,也走了不少彎路。 呵呵。自己改寫了一封之后 寫成了文檔,不懂問我.

    http://download.csdn.net/source/17351292


    DISCUZ  7    整合  java

    DISCUZ x1    整合   java

    目前也整合成功,并且是免激活的。   有需要幫忙的朋友聯(lián)系我。

    QQ48187537

    目前暫時(shí)不能錄制視頻,手頭項(xiàng)目緊啊,回家已經(jīng)很累了。   但是如果大家遇到小問題, 可以問我。 10分鐘能解決的就幫你們。

    posted @ 2009-10-11 12:00 Java蜘蛛人 --鄭成橋 閱讀(4258) | 評(píng)論 (40)編輯 收藏

          各位項(xiàng)目中應(yīng)該很多地方用到權(quán)限管理對(duì)吧??  那為什么不試試acegi。。  

     今天我錄制了一個(gè)視頻就是 Spring +Acegi的視頻,如果已經(jīng)會(huì)了的人 可以不用下載 因?yàn)楹艽螅笮?00MB。
                     
           下載地址:        http://ajava.org/video/spring/12425.html

     主講人: 鄭成橋

    posted @ 2009-07-21 11:02 Java蜘蛛人 --鄭成橋 閱讀(5661) | 評(píng)論 (14)編輯 收藏

      把所有的人頁面,以及數(shù)據(jù)庫設(shè)置成為utf-8  然后修改如下東西:

    打開 cmd

    輸入
      java -help "D:\ProgramFiles\MyEclipse 6.5\eclipse\eclipse.exe" -vm "d:\ProgramFiles\MyEclipse 6.5\jre\bin\javaw.exe" -Vmargs -Dfile.encoding=UTF-8 -Xms256m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=512M

    以上東西 根據(jù)自己目錄改變

    然后打開 D:\ProgramFiles\MyEclipse 6.5\eclipse\eclipse.ini    結(jié)尾加上
    -Vmargs -Dfile.encoding=UTF-8



    重啟下 就可以。


        順便告訴大家 我的JBPM 視頻已經(jīng)在錄制中了。。。  大家過段時(shí)間就可以再我的博客上下載了。 謝謝大家對(duì)我的支持



    大家如果想自學(xué)的話 可以看看:http://zhangym.javaeye.com/category/38399

    posted @ 2009-07-09 14:59 Java蜘蛛人 --鄭成橋 閱讀(2686) | 評(píng)論 (4)編輯 收藏

     

     利用spring的mock類進(jìn)行單元測(cè)試:
    spring框架提供了大量測(cè)試的mock類,包括與jndi,porlet,web應(yīng)用相關(guān)的mock類。尤其是web應(yīng)用相關(guān)的mock類,可以大大提高web組件測(cè)試的方便性。

    打開spring的下載包的mock文件夾(路徑...mock\org\springframework\mock\web),就發(fā)覺有如下幾個(gè)文件:

    MockHttpServletRequest:是HttpServletRequest接口的mock實(shí)現(xiàn),用來模擬客戶端的HTTP請(qǐng)求,很常用的一個(gè)類。

    MockHttpServletResponse:是HttpServletResponse接口的mock實(shí)現(xiàn),用于模擬服務(wù)器對(duì)客戶端的響應(yīng)。

    MockHttpSession:是對(duì)HttpSession接口的mock實(shí)現(xiàn)。

    DelegatingServletInputStream:是對(duì)ServletInputStream接口的mock實(shí)現(xiàn)。

    DelegatingServletOutputStream:ServletOutputStream的mock實(shí)現(xiàn)。需要攔截和分析服務(wù)器的輸出的流的內(nèi)容,可以使用該類。

    其他的,例如MockFilterConfig,MockPageContext(可以測(cè)試預(yù)編譯的JSP),MockRequestDispatcher,MockServletConfig看名稱就知道大概是mock什么的。
    舉一個(gè)例子:
        MockHttpServletRequest request =  new MockHttpServletRequest("POST","/index.do");  
        request.addParameter("username","name");  
        request.addParameter("password","word"); 

    利用spring來進(jìn)行集成測(cè)試
    1、AbstractSpringContextTests類[1],該類全部方法是protected的,通常不使用這個(gè)類,而使用它的子類們

    2、AbstractDependencyInjectionSpringContextTests類[2]:繼承于類[1]:名字N長的。如果僅僅使用Spring依賴注入功能可以讓測(cè)試用例繼承該類

    3、AbstractTransactionalSpringContextTests類[3]:繼承于類[2],繼承該類的測(cè)試用例在spring管理的事務(wù)中進(jìn)行,測(cè)試完后對(duì)數(shù)據(jù)庫的記錄不會(huì)造成任何影響你對(duì)數(shù)據(jù)庫進(jìn)行一些操作后,它會(huì)自動(dòng)把數(shù)據(jù)庫回滾,這樣就保證了你的測(cè)試對(duì)于環(huán)境沒有任何影響

    4、AbstractTransactionalDataSourceSpringContextTests繼承于類[3],功能更強(qiáng)大,用于測(cè)試持久層組件,看其源代碼,有一行"protected JdbcTemplate jdbcTemplate;",提供了一個(gè)JdbcTemplate的變量,通過該對(duì)象可以直接操作數(shù)據(jù)庫。

    http://lighter.javaeye.com/blog/41733 還提供了兩個(gè)用spring來進(jìn)行集成測(cè)試(對(duì)數(shù)據(jù)庫操作進(jìn)行測(cè)試),業(yè)務(wù)測(cè)試(對(duì)業(yè)務(wù)層進(jìn)行測(cè)試)的例子供下載。

    ***如何在你的TestCase Class里取得spring context (注意路徑問題)?***

    你的TestCase Class必須繼承的是上述四個(gè)AbstractXXXSpringContextTests中的其中一個(gè),那么就必須實(shí)現(xiàn)下面這個(gè)方法來取得spring context

       protected abstract String[] getConfigLocations();

    例如:

     public String[] getConfigLocations() {
        String[] configLocations = { "applicationContext.xml","hibernate-context.xml" };
        return configLocations;
     }


    請(qǐng) 注意要加載的context xml file的路徑問題:上述的代碼是基于classpath,因此applicationContext.xml和hibernate- context.xml必須放在classpath里(方法一是把xml files放到WEB-INF/classes目錄下,另一種方法就是在project properties里把xml files的路徑加到classpath里)

    那么如果你一定要把context xml files放到WEB-INF目錄下,也是可以的,那么應(yīng)該基于file(基于file的相對(duì)路徑是相對(duì)于project root folder),代碼如下:

     public String[] getConfigLocations() {
        String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml"};
        return configLocations;
     }

    AbstractXXXSpringContextTests就會(huì)根據(jù)根據(jù)getConfigLocations方法返回的context xml位置的數(shù)組來加載并且對(duì)加載的Context提供緩存。 這是非常重要的,因?yàn)槿绻阍趶氖乱粋€(gè)大項(xiàng)目時(shí),啟動(dòng)時(shí)間可能成為一個(gè)問題--這不是Spring自身的開銷,而是被Spring容器實(shí)例化的對(duì)象在實(shí)例 化自身時(shí)所需要的時(shí)間。例如,一個(gè)包括50-100個(gè)Hibernate映射文件的項(xiàng)目可能需要10-20秒的時(shí)間來加載上述的映射文件,如果在運(yùn)行每個(gè) 測(cè)試fixture里的每個(gè)測(cè)試案例前都有這樣的開銷,將導(dǎo)致整個(gè)測(cè)試工作的延時(shí),最終有可能(實(shí)際上很可能)降低效率。

    在某種極偶然的情況下,某個(gè)測(cè)試可能“弄臟”了配置場(chǎng)所,并要求重新加載--例如改變一個(gè)bean的定義或者一個(gè)應(yīng)用對(duì)象的狀態(tài)--你可以調(diào)用 AbstractDependencyInjectionSpringContextTests 上的 setDirty() 方法來重新加載配置并在執(zhí)行下一個(gè)測(cè)試案例前重建application context

     

    當(dāng)類 AbstractDependencyInjectionSpringContextTests(及其子類)裝載你的Application Context時(shí),你可以通過Setter方法來注入你想要的來自context的bean,而不需要顯式的調(diào)用applicationContext.getBean(XXX)。因?yàn)锳bstractDependencyInjectionSpringContextTests會(huì)從getConfigLocations()方法指定的配置文件中幫你自動(dòng)注入

    下面的例子就是通過setter方法來獲得context里的ProductManager bean:

    public class MyTest extends AbstractDependencyInjectionSpringContextTests {
        ProductManager productManager;

        public String[] getConfigLocations() {
            String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };
            return configLocations;
        }

        public void testGetProduct() {
           assertEquals("tomson",productManager.getProductByName("tomson").getName());
        }
       

        //通過setter方法自動(dòng)從context里注入productManager bean,而不用顯示調(diào)用applicationContext.getBean(XXX)
        public void setProductManager(ProductManager productManager) {
           this.productManager = productManager;
        }
    }

    但是如 果context里有多個(gè)bean都定義為一個(gè)類型(例如有多個(gè)bean都是ProductManager class類型的),那么對(duì)這些bean就無法通過setter方法來自動(dòng)依賴注入(因?yàn)橛卸鄠€(gè)bean同一個(gè)類型,不知要自動(dòng)注入哪個(gè))。在這種情況下 你需要顯示的調(diào)用applicationContext.getBean(XXX)來注入。如:

    public class MyTest extends AbstractDependencyInjectionSpringContextTests {
       ProductManager productManager;

       public String[] getConfigLocations() {
          String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };
          return configLocations;
       }

       public void onSetUp() {
           productManager = (ProductManager) applicationContext.getBean("productManager");
       }

       public void testGetProduct() {
           assertEquals("tomson",productManager.getProductByName("tomson").getName());
       }
     
    }

    如果你的TestCase不使用依賴注入,只要不定義任何setters方法即可或者你可以繼承 AbstractSpringContextTests --這個(gè) org.springframework.test 包中的根類,而不是繼承AbstractDependencyInjectionSpringContextTests(及其子類)。這是因?yàn)锳bstractSpringContextTests 只包括用來加載Spring Context的便利方法但沒有自動(dòng)依賴注入的功能。

    posted @ 2009-06-04 16:39 Java蜘蛛人 --鄭成橋 閱讀(4477) | 評(píng)論 (2)編輯 收藏

    webservice 視頻教程 Spring+xfire 整合

     載地址:   http://ajava.org/video/other/8030.html

    馬上會(huì)推出 webservice 第二講。


       謝謝大家對(duì)我的支持   

      有什么問題聯(lián)系 zhengchengqiaobusiness@gmail.com





    -------------------  2009.08.31 修改這篇文章。(以上是原文) 我暫時(shí)不打算講第二期。 因?yàn)閣ebservice 該入門講的 我都講了。如果要深入點(diǎn)就請(qǐng)看書。查資料。 第二期 等我們項(xiàng)目做完了 我直接講 webservice實(shí)戰(zhàn)一點(diǎn)的東西。

    posted @ 2009-05-28 17:26 Java蜘蛛人 --鄭成橋 閱讀(6864) | 評(píng)論 (23)編輯 收藏

    Struts2+JPA+Spring視頻教程(上) 主講人:鄭成橋
    http://ajava.org/video/SSH/6193.html
     

    Struts2+JPA+Spring視頻教程(下) 主講人:鄭成橋
    http://ajava.org/video/SSH/6194.html
    這個(gè)網(wǎng)站的標(biāo)題弄錯(cuò)了,反正進(jìn)去記住2集都下下來就可以了。


     

    posted @ 2009-05-13 23:41 Java蜘蛛人 --鄭成橋 閱讀(2373) | 評(píng)論 (2)編輯 收藏

    你做過博客系統(tǒng)嗎? 如果沒有做過,我今天錄制了一個(gè)視頻是講博客怎么實(shí)現(xiàn)的


    視頻講座地址:
    http://www.qupan.com/down/zcq87642231_3259021.html


    posted @ 2009-05-06 21:45 Java蜘蛛人 --鄭成橋 閱讀(1393) | 評(píng)論 (1)編輯 收藏

         摘要: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 ...  閱讀全文

    posted @ 2009-04-22 15:49 Java蜘蛛人 --鄭成橋 閱讀(4110) | 評(píng)論 (8)編輯 收藏

    各位這是我今天講的視頻  Freemarker  已經(jīng)發(fā)到網(wǎng)站上去了。大家可以放心下載了


    下載地址:http://ajava.org/video/other/4684.html
     



    Email:zhengchengqiaobusiness@gmail.com

    群號(hào)
    AJava-IBM核心技術(shù)㈠ 24969552
    AJava-IBM核心技術(shù)㈡ 83070128
    AJava-IBM核心技術(shù)㈢ 23063942
    AJava-IBM核心技術(shù)㈣ 24276855
    AJava-IBM核心技術(shù)㈤ 29066658
    AJava-IBM核心技術(shù)㈥ 39301145


                                                _你們的群主:鄭成橋

    posted @ 2009-04-06 23:03 Java蜘蛛人 --鄭成橋 閱讀(2825) | 評(píng)論 (4)編輯 收藏

    這個(gè)是我今天講的Ext視頻 下載地址
    Ext 視(上)
    http://ajava.org/video/ajax/4330.html
    Ext視頻(中)
    http://ajava.org/video/ajax/4331.html
    Ext視頻(下)
    http://ajava.org/video/ajax/4332.html
    視頻代碼:
    http://ajava.org/video/ajax/4333.html

    轉(zhuǎn)載說明出處


    謝謝大家。 如果視頻下載不了 或者,解壓的問題。  請(qǐng)聯(lián)系我。zhengchengqiaobusiness@gmail.com

    posted @ 2009-03-22 19:44 Java蜘蛛人 --鄭成橋 閱讀(2830) | 評(píng)論 (14)編輯 收藏

    test.js
    Ext.onReady(function(){
        
        Person 
    = function(name)
        {
            
    this.name= name;
            
    this.addEvents("walk","eat","sleep");
        }
        
        
        
        Person2 
    = function(name)
        {
            
    this.name= name;
            
    this.addEvents("aa","bb","cc");
        }
        
        
        
            
        Ext.extend(Person2,Ext.util.Observable,{
            info:
    function(event)
            {
                
    return this.name+"is"+event+"ing.";
            }
        });
        
        
        
        Ext.extend(Person,Ext.util.Observable,{
            info:
    function(event)
            {
                
    return this.name+"is"+event+"ing.";
            }
        });
        
        
        
        
            
    var person2 = new Person2("鄭成橋");
        
            person2.on('aa',
    function (){
                Ext.Msg.alert(
    "event",this.name+"哈哈");            
            });
            
            person2.on(
    "bb",function(frunt,shuiguo){
                Ext.Msg.alert(
    "event",this.name+"面包:"+frunt+"葡萄"+shuiguo);
            });
            person2.on(
    "cc",function(time){
                Ext.Msg.alert(
    "event",this.name+"老子要從"+time.format("h")+"呵呵");
            });
        
        
        
        
        
    var person = new Person("zcq");
        
            person.on('walk',
    function (){
                Ext.Msg.alert(
    "event",this.name+"走撒");            
            });
            
            person.on(
    "eat",function(frunt,shuiguo){
                Ext.Msg.alert(
    "event",this.name+"要吃:"+frunt+""+shuiguo);
            });
            person.on(
    "sleep",function(time){
                Ext.Msg.alert(
    "event",this.name+"要從"+time.format("h")+"開始睡覺");
            });
            
        
            
            
            
            Ext.get(
    "walk").on("click",function(){
        
            person2.fireEvent(
    "aa");
        });
        
        Ext.get(
    "eat").on("click",function(){
            person2.fireEvent(
    "bb","蘋果","woman");
        });
        
        Ext.get(
    "sleep").on("click",function(){
            person2.fireEvent(
    "cc",new Date());
        });
            
            
            
            
        Ext.get(
    "walk").on("click",function(){
        
            person.fireEvent(
    "walk");
        });
        
        Ext.get(
    "eat").on("click",function(){
            person.fireEvent(
    "eat","蘋果","女人");
        });
        
        Ext.get(
    "sleep").on("click",function(){
            person.fireEvent(
    "sleep",new Date());
        });
        
        
         
        
        Ext.get(
    "capture1").on("click",function(){
              Ext.util.Observable.releaseCapture(person);
        });
        
        Ext.get(
    "capture2").on("click",function(){
            Ext.util.Observable.capture(person,
    function(){
                
    return false;
            });
        });
          
    });

    index1.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      
    <head>
        
        
    <title>My JSP 'index.jsp' starting page</title>
        
    <meta http-equiv="pragma" content="no-cache">
        
    <meta http-equiv="cache-control" content="no-cache">
        
    <meta http-equiv="expires" content="0">    
        
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        
    <meta http-equiv="description" content="This is my page">
        
    <!--
        
    <link rel="stylesheet" type="text/css" href="styles.css">
        
    -->
        
         
    <script type="text/javascript" src="js/adapter/ext/ext-base.js"></script>  
        
    <script type="text/javascript" src="js/ext-all.js"></script>  
         
    <link rel="stylesheet" type="text/css" href="js/resources/css/ext-all.css" />  
          
    <script type="text/javascript" src="js/js.js" ></script>
          
    <script type="text/javascript" src="js/test1.js" ></script>
            
    <link rel="stylesheet" type="text/css" href="js/examples.css" />
            
    <script type="text/javascript" src="js/examples.js" ></script>
      
    </head>
         
    <style type="text/css">
            .x
    -window-dlg .ext-mb-download {
                background:transparent url(images
    /download.gif) no-repeat top left;
                height:46px;
            }
        
    </style>
      
      
    <body>
        
    <input type="button" id="walk"  value="walk" />
        
    <input type="button" id="eat"  value="eat" />
        
    <input type="button" id="sleep"  value="sleep" />
        
    <br>
         
    <button id="capture1">事件切換1</button>
         
    <button id="capture2">事件切換2</button>
      
    </body>
    </html>


    posted @ 2009-03-14 15:33 Java蜘蛛人 --鄭成橋 閱讀(753) | 評(píng)論 (0)編輯 收藏

    Eclipse開發(fā)Javascript環(huán)境配置,有三種Javascript編輯器可供選擇:

    1. JSDT, JavaScript Development Toolkit 
    WPT(Web Tools Platform)自帶的插件,只要裝了WTP就不用單獨(dú)安裝JSDT。

    2. JSEclipse,可以通過Eclipse自動(dòng)更新功能從 http://download.macromedia.com/pub/labs/jseclipse/autoinstall 安裝JSEclipse。

    3. Spket,通過Eclipse自動(dòng)更新從 http://www.spket.com/update/ 安裝插件。


    Eclipse開發(fā)JQuery環(huán)境設(shè)置(Spket):

    首先需要安裝Spket,如上。 之后進(jìn)行JQuery的配置:

    1.從JQuery.com下載開發(fā)用的Javascript文件,如下圖,一定要選擇紅框里面的選項(xiàng)



    2.配置Eclipse里面的Spket Javascript Profiles,如下圖:
     

    1) 從window->Preferences...進(jìn)去

    2) 如上圖選擇Spket -> Javascript Profiles

    3) 點(diǎn)擊New...輸入JQuery建立新的profile

    4) 點(diǎn)擊Add Library,并選擇JQuery,建立新的Library

    5) 點(diǎn)擊Add File, 選擇剛下載的JQuery文件

    6) 如果想讓JQuery成為缺省的Javascript Profile,則點(diǎn)擊Default。

    然后新建Js文件,就可以使用JQuery的代碼提示功能了:



    --------------------------------------------------------------------------------------------------------------------------------------
    另:

    Aptana是一個(gè)非常強(qiáng)大,開源,專注于JavaScript的Ajax開發(fā)IDE。它的特性包括: *JavaScript,JavaScript函數(shù),HTML,CSS語言的Code Assist功能。 *Outliner(大綱):顯示JavaScript,HTML和CSS的代碼結(jié)構(gòu)。
    *支持JavaScript,HTML,CSS代碼提示,包括JavaScript 自定函數(shù)
    *代碼語法錯(cuò)誤提示。
    *支持Aptana UI自定義和擴(kuò)展。
    *支持跨平臺(tái)。
    *支持FTP/SFTP
    *調(diào)試JavaScript
    *支持流行AJAX框架的Code Assist功能:
    AFLAX,Dojo,JQuery,MochiKit,Prototype,Rico,script.aculo.us,Yahoo UI,Ext。
    *Adobe AIR與iPhone開發(fā)工具

    Aptana 也可以通過Eclipse自動(dòng)更新從 http://update.aptana.com/update/3.2安裝插件。

    Aptana還可以知道瀏覽器是否支持對(duì)象的某個(gè)屬性/方法,很強(qiáng)。。!如下圖:

     

    posted @ 2009-02-19 21:19 Java蜘蛛人 --鄭成橋 閱讀(5327) | 評(píng)論 (0)編輯 收藏


    很很常用的before ,After ........等等


    返回參數(shù)的通知全套代碼:
    package com.zcq.dao;

    public interface Person {
        
        
    public String getName(String name,String pass);

    }



    package com.zcq.dao;

    public class PersonImp implements Person {

        
    public String getName(String name, String pass) {
            System.out.println(
    "hehe");
            String bb 
    ="aa";
            
            
    return bb;
        }


    }



    package com.zcq.dao;

    import org.aspectj.lang.JoinPoint;

    public class AspectClass {
        
        
        
    public String getName(JoinPoint joinPoint,String bb)
        
    {
             
            System.out.println(bb);
            
    return  null;
        }


    }



    <?xml version="1.0" encoding="UTF-8"?>
     
    <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:aop
    ="http://www.springframework.org/schema/aop"
            xmlns:tx
    ="http://www.springframework.org/schema/tx"
            xsi:schemaLocation
    ="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
                
                
                
    <bean id="aspectClass" class="com.zcq.dao.AspectClass"></bean>
                
    <bean  id="personimp" class="com.zcq.dao.PersonImp"></bean>
                
                
    <aop:config>
                  
    <aop:aspect id="addAllMethod" ref="aspectClass">
                    
    <aop:pointcut id="addpointcut" expression="execution(public * get*(..))" />
                  
    <aop:after-returning  pointcut-ref="addpointcut" method="getName"  returning="bb" />
                   
    <!--    <aop:after-throwing pointcut-ref="addpointcut" method="getName" throwing="tx"  />  --> 
                  
    </aop:aspect>            
                
    </aop:config>
    </beans>


    package com.zcq.dao;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class Test {

        
    /**
         * 
    @param args
         
    */

        
    public static void main(String[] args) {
            
            
            ApplicationContext ctx
    = null;
            
            ctx
    = new ClassPathXmlApplicationContext("applicationContext.xml");
            
            Person p  
    = (Person)ctx.getBean("personimp");
            
            p.getName(
    "name""pass");

             
        }


    }

    posted @ 2009-02-13 12:25 Java蜘蛛人 --鄭成橋 閱讀(1123) | 評(píng)論 (0)編輯 收藏

         摘要:   關(guān)鍵字: spring 事務(wù) (1)配置:     Spring的事務(wù)管理是通過AOP代理實(shí)現(xiàn)的,其中的事務(wù)通知由元數(shù)據(jù)驅(qū)動(dòng)。代理對(duì)象與事務(wù)元數(shù)據(jù)結(jié)合產(chǎn)生一個(gè)AOP代理,它使用一個(gè)PlatformTransactionManager實(shí)現(xiàn),配合TransactionInterceptor,在方法調(diào)用前后實(shí)施事務(wù)。 Java代碼 ...  閱讀全文

    posted @ 2009-02-12 15:30 Java蜘蛛人 --鄭成橋 閱讀(1000) | 評(píng)論 (0)編輯 收藏

      Log4j是Apache的一個(gè)開放源代碼項(xiàng)目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺(tái)、文件、GUI組件、甚至是套接口服務(wù)器、NT的事件記錄器、UNIX Syslog守護(hù)進(jìn)程等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級(jí)別,我們能夠更加細(xì)致地控制日志的生成過程。最令人感興趣的就是,這些可以通過一個(gè)配置文件來靈活地進(jìn)行配置,而不需要修改應(yīng)用的代碼。

         如此強(qiáng)大的優(yōu)越性,實(shí)際上手并不難,尤其在spring框架下,使用log4j更是容易,下面介紹一下spring下的log4j應(yīng)用。
        當(dāng)然先要下載相應(yīng)的jar包(log4j.jar)
    首先是web.xml的配置,在web.xml中加入如下配置
       <context-param>
          <param-name>log4jConfigLocation</param-name>
          <param-value>/WEB-INF/props/log4j.properties</param-value>
       </context-param>
       <context-param>
          <param-name>log4jRefreshInterval</param-name>
          <param-value>6000</param-value>
       </context-param>
        <listener>
          <listener-class>
            org.springframework.web.util.Log4jConfigListener
          </listener-class>
       </listener>

    說明:在上文的配置里,在上文的配置里,Log4jConfigListener會(huì)去WEB-INF/props/log4j.propeties 讀取配置文件;開一條watchdog線程每60秒掃描一下配置文件的變化(這樣在web服務(wù)啟動(dòng)后再去修改配置文件也不用重新啟動(dòng)web服務(wù)了);并把web目錄的路徑壓入一個(gè)叫webapp.root的系統(tǒng)變量(webapp.root將在log4j.properties文件中使用)。

    接下來是log4j.properties配置文件了,把它放在WEB-INF/props下,具體配置如下:

    #log4j.rootLogger = [ level ] , appenderName, appenderName, ...
    log4j.rootLogger = INFO, console, R
    #level=INFO,all can be output
    #console is set to be a ConsoleAppender
    log4j.appender.console = org.apache.log4j.ConsoleAppender
    #console have four patterns
    #org.apache.log4j.HTMLLayout
    #org.apache.log4j.PatternLayout
    #org.apache.log4j.SimpleLayout
    #org.apache.log4j.TTCCLayout

    log4j.appender.console.layout = org.apache.log4j.PatternLayout
    #define the output type
    log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
    #file is set to output to a extra file
    log4j.appender.R = org.apache.log4j.RollingFileAppender
    #the absolute route of the log4j file
    log4j.appender.R.File = /log.txt
    #the size
    log4j.appender.R.MaxFileSize = 500KB
    #back up a file
    log4j.appender.R.MaxBackupIndex = 1
    log4j.appender.R.layout = org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n

    上面的配置文件說明log信息將以兩種方式輸出(文件和控制臺(tái)),表示應(yīng)用的根目錄下(例如本應(yīng)用名稱為ABC,則log.txt的位置為tomact\webapp\ABC下)

    最后在程序中想要輸出log的地方加入log4j的支持

    (1)引入   import org.apache.log4j.Logger

    (2)聲明一個(gè)logger

    private static Logger logger = Logger.getLogger(ClassName.class);

    (3)在程序中的相應(yīng)位置加入輸出信息

    logger.info("用戶登錄:"+user.getAccount());

    ok,完成了,當(dāng)有登錄時(shí)會(huì)在控制臺(tái)和文件中同時(shí)輸出log信息如下

    2007-01-10 16:02:54 [com.my.web.UserAction]-[INFO] 用戶登錄:yangsq

    附注(轉(zhuǎn)):
    以下是配置文件(log4j.properties)的一些重要的語法
    定義配置文件

    其實(shí)您也可以完全不使用配置文件,而是在代碼中配置Log4j環(huán)境。但是,使用配置文件將使您的應(yīng)用程序更加靈活。

    Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)。下面我們介紹使用Java特性文件做為配置文件的方法:

    配置根Logger,其語法為:

    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。通過在這里定義的級(jí)別,您可以控制到應(yīng)用程序中相應(yīng)級(jí)別的日志信息的開關(guān)。比如在這里定義了INFO級(jí)別,則應(yīng)用程序中所有DEBUG級(jí)別的日志信息將不被打印出來。
    appenderName就是指定日志信息輸出到哪個(gè)地方。您可以同時(shí)指定多個(gè)輸出目的地。

    配置日志信息輸出目的地Appender,其語法為

    log4j.appender.appenderName = fully.qualified.name.of.appender.class
    log4j.appender.appenderName.option1 = value1

    log4j.appender.appenderName.option = valueN
    其中,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è)新的文件),
    org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)

    配置日志信息的格式(布局),其語法為:

    log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
    log4j.appender.appenderName.layout.option1 = value1

    log4j.appender.appenderName.layout.option = valueN
    其中,Log4j提供的layout有以下幾種:
    org.apache.log4j.HTMLLayout(以HTML表格形式布局),
    org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
    org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
    org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)

    posted @ 2009-02-12 15:16 Java蜘蛛人 --鄭成橋 閱讀(21002) | 評(píng)論 (0)編輯 收藏

     

        <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

            abstract="true">

           <property name="transactionManager" ref="transactionManager"/>

           <property name="transactionAttributes">

               <props>

                  <prop key="insert*">PROPAGATION_REQUIRED</prop>

                  <prop key="update*">PROPAGATION_REQUIRED</prop>

                  <prop key="delete*">PROPAGATION_REQUIRED</prop>

                  <prop key="change*">PROPAGATION_REQUIRED</prop>

                  <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

               </props>

           </property>

        </bean>

    1

    一旦你決定要用 AOP 來做 SERVICE 內(nèi)部每個(gè)方法的事務(wù)處理,那么在 DAO 層內(nèi)部最好不要從自己去 catch 異常,因?yàn)樵?/span> SERVICE 里面可能多次調(diào)用 DAO ,一旦多次調(diào)用,你其中一個(gè)方法捕獲了異常就沒有辦法保證事務(wù)回滾,所以即使你捕獲異常為了調(diào)試,一定要在 CATCH 方法中一定還要拋出一個(gè)異常來,否則無法保證事務(wù)

    2

    一旦決定要用 spring aop 方式來處理事務(wù),一定要不采用 JDOtemplate ,或者 HIBERNATE TEMPALATE 內(nèi)部類的方式,因?yàn)槟菢铀麄冏约喝ス芾硎聞?wù),一旦在內(nèi)部類中事務(wù)回滾,無法保證其他的 DAO 中事務(wù)回滾

    3

    1、 PROPAGATION_REQUIRED -- 支持當(dāng)前的事務(wù),如果不存在就創(chuàng)建一個(gè)新的。這是最常用的選擇。
    2 PROPAGATION_SUPPORTS -- 支持當(dāng)前的事務(wù),如果不存在就不使用事務(wù)。
    3 PROPAGATION_MANDATORY -- 支持當(dāng)前的事務(wù),如果不存在就拋出異常。
    4 PROPAGATION_REQUIRES_NEW -- 創(chuàng)建一個(gè)新的事務(wù),并暫停當(dāng)前的事務(wù)(如果存在)。
    5 PROPAGATION_NOT_SUPPORTED -- 不使用事務(wù),并暫停當(dāng)前的事務(wù)(如果存在)。
    6 PROPAGATION_NEVER -- 不使用事務(wù),如果當(dāng)前存在事務(wù)就拋出異常。
    7 PROPAGATION_NESTED -- 如果當(dāng)前存在事務(wù)就作為嵌入事務(wù)執(zhí)行,否則與 PROPAGATION_REQUIRED 類似。

    4 < prop key="change*">PROPAGATION_REQUIRED</prop>

      你可以在 PROPAGATION_REQUIRE 之后指定拋出什么樣的異常事務(wù)才回滾,或者事務(wù)的隔離方式是什么等等都可以配置如 <prop key="change*">PROPAGATION_REQUIRED,readOnly,-PetClinicException</prop>

    posted @ 2009-02-12 11:44 Java蜘蛛人 --鄭成橋 閱讀(668) | 評(píng)論 (0)編輯 收藏

    1、使用JdbcTemplate的execute()方法執(zhí)行SQL語句

    代碼
    1. jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");  

    2、如果是UPDATE或INSERT,可以用update()方法。
    代碼
    1. jdbcTemplate.update("INSERT INTO USER VALUES('"  
    2.             + user.getId() + "', '"  
    3.             + user.getName() + "', '"  
    4.             + user.getSex() + "', '"  
    5.             + user.getAge() + "')");   

    3、帶參數(shù)的更新
    代碼
    1. jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});  

    代碼
    1. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});   

    4、使用JdbcTemplate進(jìn)行查詢時(shí),使用queryForXXX()等方法
    代碼
    1. int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");  

     

     

    代碼
    1. String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", new Object[] {id}, java.lang.String.class);  

     

     

    代碼
    1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");  

     

     

    代碼
    1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");   
    2. Iterator it = rows.iterator();   
    3. while(it.hasNext()) {   
    4.      Map userMap = (Map) it.next();   
    5.      System.out.print(userMap.get("user_id") + "\t");   
    6.      System.out.print(userMap.get("name") + "\t");   
    7.      System.out.print(userMap.get("sex") + "\t");   
    8.      System.out.println(userMap.get("age") + "\t");   
    9. }   

     

    JdbcTemplate將我們使用的JDBC的流程封裝起來,包括了異常的捕捉、SQL的執(zhí)行、查詢結(jié)果的轉(zhuǎn)換等等。spring大量使用Template Method模式來封裝固定流程的動(dòng)作,XXXTemplate等類別都是基于這種方式的實(shí)現(xiàn)。
    除了大量使用Template Method來封裝一些底層的操作細(xì)節(jié),spring也大量使用callback方式類回調(diào)相關(guān)類別的方法以提供JDBC相關(guān)類別的功能,使傳統(tǒng)的JDBC的使用者也能清楚了解spring所提供的相關(guān)封裝類別方法的使用。

    JDBC的PreparedStatement

    代碼
    1. final String id = user.getId();   
    2. final String name = user.getName();   
    3. final String sex = user.getSex() + "";   
    4. final int age = user.getAge();   
    5.   
    6. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",   
    7.                      new PreparedStatementSetter() {   
    8.                          public void setValues(PreparedStatement ps) throws SQLException {   
    9.                               ps.setString(1, id);   
    10.                               ps.setString(2, name);             
    11.                               ps.setString(3, sex);   
    12.                               ps.setInt(4, age);   
    13.                           }   
    14.                       });   
    15.   

     

     

    代碼
    1. final User user = new User();   
    2. jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",   
    3.                     new Object[] {id},   
    4.                     new RowCallbackHandler() {   
    5.                         public void processRow(ResultSet rs) throws SQLException {   
    6.                              user.setId(rs.getString("user_id"));   
    7.                              user.setName(rs.getString("name"));   
    8.                              user.setSex(rs.getString("sex").charAt(0));   
    9.                              user.setAge(rs.getInt("age"));   
    10.                          }   
    11.                      });   
    12.   

     

     

    代碼
    1. class UserRowMapper implements RowMapper {   
    2.     public Object mapRow(ResultSet rs, int index) throws SQLException {   
    3.          User user = new User();   
    4.   
    5.          user.setId(rs.getString("user_id"));   
    6.          user.setName(rs.getString("name"));   
    7.          user.setSex(rs.getString("sex").charAt(0));   
    8.          user.setAge(rs.getInt("age"));   
    9.   
    10.         return user;   
    11.      }   
    12. }   
    13.   
    14. public List findAllByRowMapperResultReader() {   
    15.      String sql = "SELECT * FROM USER";   
    16.     return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));   
    17. }   
    18.   

     

    在getUser(id)里面使用UserRowMapper

    代碼
    1. public User getUser(final String id) throws DataAccessException {   
    2.      String sql = "SELECT * FROM USER WHERE user_id=?";   
    3.     final Object[] params = new Object[] { id };   
    4.      List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));   
    5.   
    6.     return (User) list.get(0);   
    7. }   

     

    網(wǎng)上收集
    org.springframework.jdbc.core.PreparedStatementCreator 返回預(yù)編譯SQL 不能于Object[]一起用

    代碼
    1. public PreparedStatement createPreparedStatement(Connection con) throws SQLException {   
    2. return con.prepareStatement(sql);   
    3. }   

    1.增刪改
    org.springframework.jdbc.core.JdbcTemplate 類(必須指定數(shù)據(jù)源dataSource)
    代碼
    1. template.update("insert into web_person values(?,?,?)",Object[]);   


    代碼
    1. template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ 匿名內(nèi)部類 只能訪問外部最終局部變量   
    2.   
    3. public void setValues(PreparedStatement ps) throws SQLException {   
    4.    ps.setInt(index++,3);   
    5. });   

    org.springframework.jdbc.core.PreparedStatementSetter 接口 處理預(yù)編譯SQL
    代碼
    1. public void setValues(PreparedStatement ps) throws SQLException {   
    2. ps.setInt(index++,3);   
    3. }   

    2.查詢JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler)
    org.springframework.jdbc.core.RowMapper 記錄映射接口 處理結(jié)果集
    代碼
    1. public Object mapRow(ResultSet rs, int arg1) throws SQLException {   int表當(dāng)前行數(shù)   
    2.    person.setId(rs.getInt("id"));   
    3. }   
    4. List template.query("select * from web_person where id=?",Object[],RowMapper);   

    org.springframework.jdbc.core.RowCallbackHandler 記錄回調(diào)管理器接口 處理結(jié)果集
    代碼
    1. template.query("select * from web_person where id=?",Object[],new RowCallbackHandler(){   
    2. public void processRow(ResultSet rs) throws SQLException {   
    3.    person.setId(rs.getInt("id"));   
    4. });

    posted @ 2009-02-06 14:35 Java蜘蛛人 --鄭成橋 閱讀(689) | 評(píng)論 (0)編輯 收藏

    >>注意:請(qǐng)下載后面(9樓)的v1.1正式版。如果要優(yōu)先考慮IE7中的Native XHR,請(qǐng)自己把附件中bajax.js文件里的bajax_object函數(shù)替換一下(修改的代碼在9樓的頁面里——不想更新附件了)。

    前一段時(shí)間寫51ditu和動(dòng)易的集成,現(xiàn)在準(zhǔn)備改進(jìn)成Ajax的。很早以前就知道了Ajax,但一直沒有實(shí)際用過。
    網(wǎng)上Google了一番,看了Sajax.php……

    還是簡(jiǎn)單點(diǎn)好,自己寫了個(gè)很小的封裝,測(cè)試對(duì)瀏覽器的兼容性還不錯(cuò),并且回調(diào)函數(shù)的接口比較友好。

    另:經(jīng)測(cè)試,發(fā)現(xiàn)如果是對(duì)同一個(gè)XMLHttpReques對(duì)象進(jìn)行多次open、send等操作,IE會(huì)有Cache問題,F(xiàn)irefox正常。但如果是每一次都是重新new一個(gè)的話,IE就支持得很好了(Firefox自然不用說)。

    用這個(gè)庫(面向用戶的其實(shí)就一個(gè)函數(shù)),不用考慮XMLHttpRequest的任何細(xì)節(jié),就如同調(diào)用和定義普通的Js函數(shù)。

    <script language="javascript" src="bajax.js"></script>   
    <script language="javascript">   
    function callback(req, id) 
    {   
        
    if(req.readyState == 4 && req.status == 200{   
            
    if(id)document.getElementById(id).innerHTML = req.responseText;   
            
    //eval(req.responseText);   
        }
       
    }
       
    </script>   
    <div id="someid"></div>   
    <div onClick="bajax_send('http://xxx.net/yourscript.php?xxx', callback, 'someid')">點(diǎn)擊查看哦!</div>  

    var bajax_debug_enable = false;   
      
    // 主函數(shù):   
    //(URL,回調(diào)函數(shù),傳遞給回調(diào)函數(shù)的附加數(shù)據(jù),方法,POST數(shù)據(jù),是否異步)   
    function bajax_send(url, callback, fdata, method, sdata, asyn)   
    {   
        fdata 
    = (fdata === undefined)? null: fdata;   
        method 
    = method || "GET";   
        sdata 
    = (sdata === undefined)? null: sdata;   
        asyn 
    = (asyn === undefined)? true: asyn;   
      
        var X 
    = new bajax_object();   
        
    if(asyn)   
            X.onreadystatechange 
    = function(){ callback(X, fdata); };   
        X.open(method, url, asyn);   
      
        
    if(bajax_debug_enable)   
            bajax_debugger(callback);   
        X.send(sdata);   
      
        
    if(asyn) return X;   
        
    else callback(X, fdata);   
    }
       
      
    // 兼容IE與其它瀏覽器(From Sajax.php v0.12)   
    function bajax_object()   
    {   
        var A;   
        var _msxmlhttp 
    = new Array(   
            
    'Msxml2.XMLHTTP.5.0',   
            
    'Msxml2.XMLHTTP.4.0',   
            
    'Msxml2.XMLHTTP.3.0',   
            
    'Msxml2.XMLHTTP',   
            
    'Microsoft.XMLHTTP');   
        
    for(var i = 0; i < _msxmlhttp.length; i++{   
            
    try {   
                
    if(A = new ActiveXObject(_msxmlhttp[i])) break;   
            }
     catch (e) {   
                A 
    = null;   
            }
       
        }
       
        
    if(!&& typeof XMLHttpRequest != "undefined")   
            A 
    = new XMLHttpRequest();   
        
    if(!A)   
            alert(
    "Could not create connection object.");   
      
        
    return A;   
    }
       
      
    // Debug information   
    function bajax_debugger(func)   
    {   
        var S 
    = func.toString();   
        alert(
    '[Running] ' + S.slice(9, S.indexOf(')'10)) + ')');   
    }
      


    function callback(req, id)   
    {   
        
    if(req.readyState == 4{   
            
    if(req.status != 200{   
                
    // do some thing.   
                req.onreadystatechange = null;   
            }
    else{   
                var _node 
    = document.getElementById(id);   
                
    if(_node) _node.innerHTML = 'Hai ' + req.responseText;   
      
                
    // clear the reference   
                req.onreadystatechange = null;   
            }
       
        }
       
    }
      
    '


    function callback(req, id) {     
         
    if(req.readyState == 4 && req.status == 200{     
             var _node 
    = document.getElementById(id);     
             
    if(_node) _node.innerHTML = 'Hai ' + req.responseText;     
      
    // clear the reference   
             req.onreadystatechange = null;   
      
         }
         
     }
        

    posted @ 2008-10-23 11:47 Java蜘蛛人 --鄭成橋 閱讀(643) | 評(píng)論 (0)編輯 收藏

    首先 順序?qū)?spring hibernate struts

    配置applicationContet.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans
        xmlns
    ="http://www.springframework.org/schema/beans"
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation
    ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

        
    <bean id="datasource"
             
    class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            
    <property name="driverClass"
                value
    ="com.microsoft.jdbc.sqlserver.SQLServerDriver">
            
    </property>
            
    <property name="jdbcUrl"
                value
    ="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=blog;SelectMethod=cursor">
            
    </property>
            
    <property name="user" value="sa"></property>
            
    <property name="password" value="sa"></property>
            
    <property name="minPoolSize" value="5"></property>
            
    <property name="maxPoolSize" value="20"></property>
            
    <property name="acquireIncrement" value="5"></property>
        
    </bean>
        
    <bean id="sessionFactory"
            
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            
    <property name="dataSource">
                
    <ref bean="datasource" />
            
    </property>
            
    <property name="hibernateProperties">
                
    <props>
                    
    <prop key="hibernate.dialect">
                org.hibernate.dialect.SQLServerDialect 
                    
    </prop>
                    
    <prop key="hibernate.show_sql">true</prop>
                
    </props>
            
    </property>

            
    <property name="mappingDirectoryLocations">
                
    <list>
                   
    <value>classpath:/com/zcq/dao</value> 
                
    </list>
            
    </property>
        
    </bean> 
           
    <!--  hibernateTemplate 配置 -->
             
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
              
    <property name="sessionFactory">
                
    <ref bean="sessionFactory" />
              
    </property> 
             
    </bean>
          
    <!-- zcqbb datable -->
             
    <bean id="daoimp" class="com.zcq.dao.Test" >
               
    <property name="hibernateTemplate" ref="hibernateTemplate" /> 
             
    </bean> 
     
    </beans> 

    然后寫接口


    然后實(shí)現(xiàn)接口
    package com.zcq.job.dao;

    import org.springframework.context.ApplicationContext;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

    import com.zcq.job.I.Zcq_I;

    public class Zcq_Imp extends HibernateDaoSupport implements Zcq_I {

        
    public void show() {
          System.out.println(
    "sssssss");
        }

        
    public static Zcq_I getApplication(ApplicationContext ctx)
        
    {
            
    return (Zcq_I)ctx.getBean("daoimp");
        }

    }


    web.xml 里加入
      <context-param>
        
    <param-name>contextConfigLocation</param-name>
        
    <param-value>/WEB-INF/applicationContext.xml</param-value>
      
    </context-param>
      
    <listener>
        
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      
    </listener>
      
    <filter>
        
    <filter-name>CharacterEncodingFilter</filter-name>
        
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        
    <init-param>
          
    <param-name>encoding</param-name>
          
    <param-value>gbk</param-value>
        
    </init-param>
        
    <init-param>
          
    <param-name>forceEncoding</param-name>
          
    <param-value>true</param-value>
        
    </init-param>
      
    </filter>
      
    <filter-mapping>
        
    <filter-name>CharacterEncodingFilter</filter-name>
        
    <url-pattern>/*</url-pattern>
      </filter-mapping>

    posted @ 2008-08-14 14:52 Java蜘蛛人 --鄭成橋 閱讀(205) | 評(píng)論 (0)編輯 收藏

    import  java.io.*; 
     
    public  class  FileOperate  { 
       public  FileOperate()  { 
       } 
     
       /** 
         *  新建目錄 
         *  @param  folderPath  String  如  c:/fqf 
         *  @return  boolean 
         */ 
       public  void  newFolder(String  folderPath)  { 
           try  { 
               String  filePath  =  folderPath; 
               filePath  =  filePath.toString(); 
               java.io.File  myFilePath  =  new  java.io.File(filePath); 
               if  (!myFilePath.exists())  { 
                   myFilePath.mkdir(); 
               } 
           } 
           catch  (Exception  e)  { 
               System.out.println("新建目錄操作出錯(cuò)"); 
               e.printStackTrace(); 
           } 
       } 
     
       /** 
         *  新建文件 
         *  @param  filePathAndName  String  文件路徑及名稱  如c:/fqf.txt 
         *  @param  fileContent  String  文件內(nèi)容 
         *  @return  boolean 
         */ 
       public  void  newFile(String  filePathAndName,  String  fileContent)  { 
     
           try  { 
               String  filePath  =  filePathAndName; 
               filePath  =  filePath.toString(); 
               File  myFilePath  =  new  File(filePath); 
               if  (!myFilePath.exists())  { 
                   myFilePath.createNewFile(); 
               } 
               FileWriter  resultFile  =  new  FileWriter(myFilePath); 
               PrintWriter  myFile  =  new  PrintWriter(resultFile); 
               String  strContent  =  fileContent; 
               myFile.println(strContent); 
               resultFile.close(); 
     
           } 
           catch  (Exception  e)  { 
               System.out.println("新建目錄操作出錯(cuò)"); 
               e.printStackTrace(); 
     
           } 
     
       } 
     
       /** 
         *  刪除文件 
         *  @param  filePathAndName  String  文件路徑及名稱  如c:/fqf.txt 
         *  @param  fileContent  String 
         *  @return  boolean 
         */ 
       public  void  delFile(String  filePathAndName)  { 
           try  { 
               String  filePath  =  filePathAndName; 
               filePath  =  filePath.toString(); 
               java.io.File  myDelFile  =  new  java.io.File(filePath); 
               myDelFile.delete(); 
     
           } 
           catch  (Exception  e)  { 
               System.out.println("刪除文件操作出錯(cuò)"); 
               e.printStackTrace(); 
     
           } 
     
       } 
     
       /** 
         *  刪除文件夾 
         *  @param  filePathAndName  String  文件夾路徑及名稱  如c:/fqf 
         *  @param  fileContent  String 
         *  @return  boolean 
         */ 
       public  void  delFolder(String  folderPath)  { 
           try  { 
               delAllFile(folderPath);  //刪除完里面所有內(nèi)容 
               String  filePath  =  folderPath; 
               filePath  =  filePath.toString(); 
               java.io.File  myFilePath  =  new  java.io.File(filePath); 
               myFilePath.delete();  //刪除空文件夾 
     
           } 
           catch  (Exception  e)  { 
               System.out.println("刪除文件夾操作出錯(cuò)"); 
               e.printStackTrace(); 
     
           } 
     
       } 
     
       /** 
         *  刪除文件夾里面的所有文件 
         *  @param  path  String  文件夾路徑  如  c:/fqf 
         */ 
       public  void  delAllFile(String  path)  { 
           File  file  =  new  File(path); 
           if  (!file.exists())  { 
               return; 
           } 
           if  (!file.isDirectory())  { 
               return; 
           } 
           String[]  tempList  =  file.list(); 
           File  temp  =  null; 
           for  (int  i  =  0;  i  <  tempList.length;  i++)  { 
               if  (path.endsWith(File.separator))  { 
                   temp  =  new  File(path  +  tempList[i]); 
               } 
               else  { 
                   temp  =  new  File(path  +  File.separator  +  tempList[i]); 
               } 
               if  (temp.isFile())  { 
                   temp.delete(); 
               } 
               if  (temp.isDirectory())  { 
                   delAllFile(path+"/"+  tempList[i]);//先刪除文件夾里面的文件 
                   delFolder(path+"/"+  tempList[i]);//再刪除空文件夾 
               } 
           } 
       } 
     
       /** 
         *  復(fù)制單個(gè)文件 
         *  @param  oldPath  String  原文件路徑  如:c:/fqf.txt 
         *  @param  newPath  String  復(fù)制后路徑  如:f:/fqf.txt 
         *  @return  boolean 
         */ 
       public  void  copyFile(String  oldPath,  String  newPath)  { 
           try  { 
               int  bytesum  =  0; 
               int  byteread  =  0; 
               File  oldfile  =  new  File(oldPath); 
               if  (oldfile.exists())  {  //文件存在時(shí) 
                   InputStream  inStream  =  new  FileInputStream(oldPath);  //讀入原文件 
                   FileOutputStream  fs  =  new  FileOutputStream(newPath); 
                   byte[]  buffer  =  new  byte[1444]; 
                   int  length; 
                   while  (  (byteread  =  inStream.read(buffer))  !=  -1)  { 
                       bytesum  +=  byteread;  //字節(jié)數(shù)  文件大小 
                       System.out.println(bytesum); 
                       fs.write(buffer,  0,  byteread); 
                   } 
                   inStream.close(); 
               } 
           } 
           catch  (Exception  e)  { 
               System.out.println("復(fù)制單個(gè)文件操作出錯(cuò)"); 
               e.printStackTrace(); 
     
           } 
     
       } 
     
       /** 
         *  復(fù)制整個(gè)文件夾內(nèi)容 
         *  @param  oldPath  String  原文件路徑  如:c:/fqf 
         *  @param  newPath  String  復(fù)制后路徑  如:f:/fqf/ff 
         *  @return  boolean 
         */ 
       public  void  copyFolder(String  oldPath,  String  newPath)  { 
     
           try  { 
               (new  File(newPath)).mkdirs();  //如果文件夾不存在  則建立新文件夾 
               File  a=new  File(oldPath); 
               String[]  file=a.list(); 
               File  temp=null; 
               for  (int  i  =  0;  i  <  file.length;  i++)  { 
                   if(oldPath.endsWith(File.separator)){ 
                       temp=new  File(oldPath+file[i]); 
                   } 
                   else{ 
                       temp=new  File(oldPath+File.separator+file[i]); 
                   } 
     
                   if(temp.isFile()){ 
                       FileInputStream  input  =  new  FileInputStream(temp); 
                       FileOutputStream  output  =  new  FileOutputStream(newPath  +  "/"  + 
                               (temp.getName()).toString()); 
                       byte[]  b  =  new  byte[1024  *  5]; 
                       int  len; 
                       while  (  (len  =  input.read(b))  !=  -1)  { 
                           output.write(b,  0,  len); 
                       } 
                       output.flush(); 
                       output.close(); 
                       input.close(); 
                   } 
                   if(temp.isDirectory()){//如果是子文件夾 
                       copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]); 
                   } 
               } 
           } 
           catch  (Exception  e)  { 
               System.out.println("復(fù)制整個(gè)文件夾內(nèi)容操作出錯(cuò)"); 
               e.printStackTrace(); 
     
           } 
     
       } 
     
       /** 
         *  移動(dòng)文件到指定目錄 
         *  @param  oldPath  String  如:c:/fqf.txt 
         *  @param  newPath  String  如:d:/fqf.txt 
         */ 
       public  void  moveFile(String  oldPath,  String  newPath)  { 
           copyFile(oldPath,  newPath); 
           delFile(oldPath); 
     
       } 
     
       /** 
         *  移動(dòng)文件到指定目錄 
         *  @param  oldPath  String  如:c:/fqf.txt 
         *  @param  newPath  String  如:d:/fqf.txt 
         */ 
       public  void  moveFolder(String  oldPath,  String  newPath)  { 
           copyFolder(oldPath,  newPath); 
           delFolder(oldPath); 
     
       } 
    }

    posted @ 2008-07-01 16:51 Java蜘蛛人 --鄭成橋 閱讀(2781) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 美景之屋4在线未删减免费 | 四只虎免费永久观看| 精品久久久久久无码免费| 亚洲性色精品一区二区在线| 亚洲国产精品一区第二页| 免费又黄又硬又爽大片| 毛片基地免费观看| 久久一区二区三区免费播放 | 又粗又硬又黄又爽的免费视频 | 亚洲AV无码国产精品色午友在线| 四虎永久免费影院在线| 最近中文字幕mv免费高清视频7| 久久国产精品免费视频| 大地资源中文在线观看免费版 | 亚洲人成无码www久久久| 精品国产免费一区二区| 免费看韩国黄a片在线观看| 69影院毛片免费观看视频在线 | 亚洲资源在线观看| 亚洲VA中文字幕无码毛片| 久久亚洲欧洲国产综合| 亚洲精品无码99在线观看 | 亚洲色大成网站www尤物| 亚洲一区动漫卡通在线播放| 2022年亚洲午夜一区二区福利| 亚洲图片在线观看| 亚洲精品国产成人专区| 亚洲四虎永久在线播放| 久久水蜜桃亚洲av无码精品麻豆| 亚洲av中文无码乱人伦在线r▽| 亚洲精品乱码久久久久久自慰| 老司机亚洲精品影视www| 国产亚洲精品a在线观看| 国产av无码专区亚洲国产精品| 亚洲午夜精品第一区二区8050| 亚洲国产精品激情在线观看| 亚洲日本韩国在线| 亚洲情综合五月天| 亚洲网站在线观看| 91亚洲性爱在线视频| 中文字幕亚洲情99在线|