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

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

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

    posts - 13,comments - 19,trackbacks - 0
    軟件界面設(shè)計(jì)盡量簡(jiǎn)潔明了,功能點(diǎn)擊盡量做到一次。
    普通的工作站的使用者,給功能提供盡量直接、方便的來(lái)回切換、跳轉(zhuǎn)、導(dǎo)航,應(yīng)當(dāng)顯眼、直接、簡(jiǎn)約,一步到位。
    manager的管理決策用戶,他們的時(shí)間寶貴,最好設(shè)計(jì)成傻瓜式的操作,同時(shí),將最關(guān)鍵、最重要的信息,組織、放置在一屏當(dāng)中。
    posted @ 2011-08-17 16:48 南山隱士 閱讀(193) | 評(píng)論 (0)編輯 收藏

    本原則是本人結(jié)合項(xiàng)目的實(shí)施開(kāi)發(fā)編寫(xiě)代碼情況,對(duì)多年以來(lái)帶領(lǐng)項(xiàng)目實(shí)施奮戰(zhàn)在開(kāi)發(fā)一線經(jīng)驗(yàn)的提煉與概括。這十條開(kāi)發(fā)指導(dǎo)原則,最基本的思想是“高效,高質(zhì)量的寫(xiě)出滿足業(yè)務(wù)功能目標(biāo)的代碼。”每人可以結(jié)合當(dāng)前項(xiàng)目的實(shí)際情況應(yīng)用,可以補(bǔ)充,修訂刪改進(jìn)一步總結(jié)提煉。
    1.先開(kāi)發(fā)簡(jiǎn)單明確的功能模塊,后開(kāi)發(fā)復(fù)雜的功能模塊。
    2.先做簡(jiǎn)單的子功能,再做稍微復(fù)雜的子功能,后開(kāi)發(fā)有難度邏輯復(fù)雜的子功能。
    3.以滿足業(yè)務(wù)功能要求為主要目標(biāo),不保留無(wú)用的垃圾代碼。寫(xiě)出高質(zhì)量滿足功能要求的代碼,是建立在對(duì)業(yè)務(wù)需求理解,明確業(yè)務(wù)目標(biāo),邏輯思路清晰的結(jié)果。有時(shí)往往需要反復(fù)多次修改精益求精才能最后實(shí)現(xiàn)客戶滿意的功能。
    4.每開(kāi)發(fā)一個(gè)功能模塊,都要頭腦清晰。(功能目的,界面表現(xiàn),程序邏輯思路,各層函數(shù)調(diào)用關(guān)系,數(shù)據(jù)存儲(chǔ)),全面系統(tǒng)考慮,力求每個(gè)細(xì)節(jié)都思考一遍,不使疏漏。在一般情況下比葫蘆畫(huà)瓢,充分借鑒一般常用的邏輯代碼,業(yè)界常用的一般方法,已有類庫(kù)函數(shù)。能夠迅速高效寫(xiě)出高質(zhì)量的一般性代碼,以便騰出精力解決關(guān)鍵問(wèn)題。力求避免功能函數(shù)重復(fù)開(kāi)發(fā),代碼隨意復(fù)制,邏輯思路混亂,代碼隨意修改,瞎寫(xiě)代碼。保證所寫(xiě)的每一個(gè)函數(shù),每行代碼,都有意義,都有目的,堅(jiān)決刪除無(wú)用的垃圾代碼。這樣就保證了,我們寫(xiě)出的代碼是簡(jiǎn)潔的,思路明確的。隨著時(shí)間的推移,我們寫(xiě)的代碼越來(lái)越多,就會(huì)積累出跟本項(xiàng)目相關(guān)的很多通用的類庫(kù),函數(shù)。通過(guò)對(duì)比,更能深入的理解業(yè)務(wù),抽象出公用的方法,邏輯規(guī)范。進(jìn)而提高整個(gè)團(tuán)隊(duì)的工作效率。通過(guò)循環(huán)迭代的思路,不斷地?cái)U(kuò)大成功經(jīng)驗(yàn)。
    5.我們開(kāi)發(fā)程序過(guò)程中,總有一些公用的函數(shù)類庫(kù),可以調(diào)用。每次都不是從零開(kāi)始,不是每行代碼都一行一行的手工輸入。要充分的利用工具,靈活應(yīng)用學(xué)過(guò)的方法。  
    6.發(fā)揚(yáng)團(tuán)隊(duì)協(xié)作精神,提高整體測(cè)試交叉測(cè)試意識(shí),積極總結(jié)開(kāi)發(fā)一般性類庫(kù)函數(shù),提供給大家調(diào)用。分享成功經(jīng)驗(yàn)。避免一個(gè)人孤軍開(kāi)發(fā),愁眉苦臉的編寫(xiě)程序。共同攻克業(yè)務(wù)技術(shù)難題,苦中有樂(lè)。
    7.力求高質(zhì)量高效的完成開(kāi)發(fā)模塊,不要鉆牛角尖,經(jīng)常交流,不懂就問(wèn)。注意不要把問(wèn)題復(fù)雜化,想當(dāng)然,自己跟自己制造困難。如果問(wèn)題越來(lái)越復(fù)雜,越開(kāi)發(fā)代碼越?jīng)]頭緒就立即停止編寫(xiě),回到問(wèn)題的原點(diǎn)重新考慮或跟大家交流聽(tīng)聽(tīng)別人的意見(jiàn)。
    8,在解決技術(shù)問(wèn)題上,如果是關(guān)鍵問(wèn)題,堅(jiān)決研究,要徹底搞明白。與項(xiàng)目相關(guān)不影響全局的問(wèn)題,可以根據(jù)實(shí)際情況優(yōu)先級(jí)放低一級(jí)。針對(duì)難點(diǎn)業(yè)務(wù)復(fù)雜的問(wèn)題,先做外圍知識(shí)技術(shù)準(zhǔn)備,找出關(guān)鍵點(diǎn),先易后難分步驟逐漸深入的去解決。最后將其貫穿成一個(gè)整體。
    9.經(jīng)常查看別人代碼,吸取別人的經(jīng)驗(yàn),充實(shí)自己。我們的知識(shí)積累主要來(lái)自別人,主要在當(dāng)前項(xiàng)目。取之于別人,受益于自己。受益于項(xiàng)目。
    10.善于利用零星時(shí)間,比較已經(jīng)做過(guò)的功能模塊。不斷的整理,優(yōu)化已經(jīng)開(kāi)發(fā)過(guò)的代碼。發(fā)現(xiàn)Bug及時(shí)修正,精益求精。

    本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/zhaoyu_1979/archive/2011/03/16/6254021.aspx

    posted @ 2011-03-23 16:45 南山隱士 閱讀(225) | 評(píng)論 (0)編輯 收藏
     一相關(guān)下載

    (1) java JDK下載:

    進(jìn)入該網(wǎng)頁(yè): http://java.sun.com/javase/downloads/index.jsp (或者直接點(diǎn)擊下載)如下圖:
    選擇 Download JDK 只下載JDK,無(wú)需下載jre.

    (2)eclipse下載

       進(jìn)入該網(wǎng)頁(yè): http://www.eclipse.org/downloads/ (或者直接點(diǎn)擊下載:BT下載    HTTP下載) 如下圖:


    我們選擇第一個(gè)(即eclipse IDE for java EE Developers)

    (3)下載Android SDK

       說(shuō)明: Android SDK兩種下載版本,一種是包含具體版本的SDK的,一種是只有升級(jí)工具,而不包含具體的SDK版本,后一種大概20多M,前一種70多M。

        完全版下載 (android sdk 2.1 r01)     升級(jí)版下載 (建議使用這個(gè),本例子就是使用這個(gè)這里面不包含具體版本,想要什么版本在Eclipse里面升級(jí)就行)

    二 軟件安裝

       (1)安裝jdk 6u19   安裝完成即可,無(wú)需配置環(huán)境變量

       (2)解壓eclipse       eclipse無(wú)需安裝,解壓后,直接打開(kāi)就行

       (3)解壓android sdk     這個(gè)也無(wú)需安裝,解壓后供后面使用

       (4)最終有三個(gè)文件夾,如下圖:

       

    三 Eclipse配置

       1 安裝android 開(kāi)發(fā)插件

         (1)打開(kāi)Eclipse, 在菜單欄上選擇 help->Install New SoftWare 出現(xiàn)如下界面:


        點(diǎn)擊 Add按鈕,出現(xiàn)如下界面


         輸入網(wǎng)址: https://dl-ssl.google.com/android/eclipse/    (如果出錯(cuò),請(qǐng)將https改成http)

         名稱: Android (這里可以自定義)

       點(diǎn)擊OK,將出現(xiàn)如下界面


    點(diǎn)擊 Next按鈕 ,出現(xiàn)如下界面:


      

    點(diǎn)擊Next按鈕,出現(xiàn)如下界面:


    選擇 I accept the terms of the license agreements   點(diǎn)擊Next,進(jìn)入安裝插件界面

    安裝完成后,出現(xiàn)如下界面


    點(diǎn)擊Yes按鈕,重啟Eclipse

    2 配置android sdk

         (1)點(diǎn)擊菜單window->preferences,進(jìn)入如下界面


       選擇你的android SDK解壓后的目錄,選錯(cuò)了就會(huì)報(bào)錯(cuò),這個(gè)是升級(jí)工具,目前還沒(méi)有一個(gè)版本的SDK

    (2)升級(jí)SDK版本,選擇菜單 window->Android sdk and avd manager 出現(xiàn)如下界面

          

       選擇update all按鈕,出現(xiàn)如下界面


    選擇左邊的某一項(xiàng),點(diǎn)擊accept表示安裝,點(diǎn)擊reject表示不安裝,我這里只選了SDK 2.1 和samples for api 7 , 自己可以任意自定義,確定后,選擇install按鈕,進(jìn)入安裝界面如下:

    安裝完成如下:

    (3)新建AVD(android vitural device)    和上面一樣,進(jìn)入android sdk and avd manager,選中Vitural Devices 在點(diǎn)擊New按鈕

    點(diǎn)擊New按鈕后,進(jìn)入如下界面:

    名稱可以隨便取,target選擇你需要的SDK版本,SD卡大小自定義,點(diǎn)擊 Create AVD,得到如下結(jié)果

    如上顯示創(chuàng)建AVD完畢





    3 新建Android項(xiàng)目

    (1)選擇菜單file->new->other 進(jìn)入如下界面:

    選擇新建Android Project項(xiàng)目,點(diǎn)擊Next按鈕,進(jìn)入如下界面


    名稱自定義,應(yīng)用程序名自定義,報(bào)名必須包含一個(gè)點(diǎn)以上,min SDK version里面必須輸入整數(shù)

    點(diǎn)擊Next出現(xiàn)如下界面:


    注: 若有錯(cuò)誤如: Project ... is missing required source folder: 'gen' ,則將gen->Android.Test->R.java這個(gè)文件刪掉,Eclipse會(huì)為我們重新生成這個(gè)文件,并且不會(huì)報(bào)錯(cuò)。

    (3)配置運(yùn)行

       右鍵項(xiàng)目->Run as -> Run Configuration 進(jìn)入如下界面:
    該界面,點(diǎn)擊Browse 按鈕,選擇你要運(yùn)行的項(xiàng)目

    選擇Target切換到以下界面


    該界面選擇運(yùn)行的AVD,將AVD前面的方框設(shè)置為選擇狀態(tài)。

    (4)測(cè)試項(xiàng)目運(yùn)行

       右鍵項(xiàng)目名稱->run as ->Android Application 即可啟動(dòng)運(yùn)行該Android程序,如下所示:


    正在進(jìn)入


    測(cè)試程序運(yùn)行結(jié)果

     

    四 結(jié)束語(yǔ)

           至此,android開(kāi)發(fā)環(huán)境搭建完畢,有問(wèn)題請(qǐng)留言。在這里要注意,我這里只是下載了android sdk r4升級(jí)工具,沒(méi)有下載具體的SDK,而是通過(guò)在Eclipse里面的Android Sdk管理工具升級(jí)的,你也可以直接下載具體的SDK版本,如: Android sdk 2.1 r1 上面有這個(gè)的下載鏈接,但我任務(wù)用升級(jí)工具更好。

    posted @ 2010-07-13 14:35 南山隱士 閱讀(632) | 評(píng)論 (0)編輯 收藏
    建立一個(gè)Silverlight項(xiàng)目,添加一個(gè)子窗口ChildWindow1.xaml.

    在子窗口設(shè)計(jì)中添加一個(gè)輸入框:<TextBox x:Name="txtUserInfor" Grid.Row="0" />
    添加子窗體的CS代碼:

     string testString;

            public string TestString
            {
                get { return testString; }
                set { testString = value; }
            }


    增加一個(gè)事件: public event EventHandler OkClicked;
    修改OKButton_Click方法:


            private void OKButton_Click(object sender, RoutedEventArgs e)
            {
                if (OkClicked != null)
                {
                    TestString = txtUserInfor.Text;
                    OkClicked(this,new EventArgs());
                }

                this.DialogResult = true;
            }

    子窗口修改完畢。

    父窗體:
    設(shè)計(jì)中添加一個(gè)輸入框和一個(gè)Button:

    <TextBox x:Name="tbInfo" Width="100" Height="50"></TextBox>
     <Button Click="Button_Click" Width="100" Height="60" Content="子窗口測(cè)試" HorizontalAlignment="Right"></Button>

     修改父窗體代碼:

       public FatherControl()
            {
                InitializeComponent();
                childWindowDemo.OkClicked += new EventHandler(childWindowDemo_OkClicked);
            }

            void childWindowDemo_OkClicked(object sender, EventArgs e)
            {
                tbInfo.Text = childWindowDemo.TestString;
            }

            private ChildWindow1 childWindowDemo = new ChildWindow1();

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                childWindowDemo.Show();
            }
    完畢。
    運(yùn)行,點(diǎn)擊父窗體按鈕,彈出子窗體。在子窗體的輸入框中輸入內(nèi)容,點(diǎn)擊確認(rèn)后關(guān)閉子窗體,同時(shí)子窗體的數(shù)據(jù)更新到父窗體的輸入框中。

    posted @ 2009-12-11 09:56 南山隱士 閱讀(1024) | 評(píng)論 (1)編輯 收藏
    可以總結(jié)為兩大關(guān)鍵點(diǎn):一是養(yǎng)成好的編程習(xí)慣,二是針對(duì)自已的工作提高自已的知識(shí)含量.

    一.    好的編程習(xí)慣

    1.       寫(xiě)程序前打個(gè)草稿可以在心里,最好在紙上:目的要從整體上考慮程序的實(shí)現(xiàn)。

    如果公司采用建模的方式,有建模工具(rose ,visio )那是最好不過(guò)的了。

     2.    注意休息,不要浪費(fèi)自已的休息時(shí)間,用去了自已的時(shí)間不但會(huì)寫(xiě)出的代碼因?yàn)樽⒁饬Σ患卸鴷?huì)常常出現(xiàn)代碼的質(zhì)量有問(wèn)題,邏輯常出錯(cuò)

    3.    要善于收集相關(guān)的專業(yè)開(kāi)發(fā)上的資料,以便以后能更快更好的解決問(wèn)題目。提倡公司能提供內(nèi)部知識(shí)勾通的工具(如知識(shí)論壇,內(nèi)部即時(shí)聊天器);提倡公司內(nèi)部有技術(shù)資料的共享庫(kù),提高解決問(wèn)題的能力.

    4.    提高對(duì)所寫(xiě)的模塊的相關(guān)全局把握能力,在寫(xiě)程序中要最好先詳細(xì)設(shè)計(jì)后再發(fā)布.

    5.    要學(xué)會(huì)與他人溝通如非工程師,學(xué)會(huì)溝通的不同方式,提高溝通的效率。

     二.    不同的目標(biāo)不同的知識(shí)重點(diǎn)

    (一)        目標(biāo):程序員

    職責(zé):根據(jù)詳細(xì)設(shè)計(jì)文檔,或根據(jù)高級(jí)程序員的設(shè)計(jì)進(jìn)行相關(guān)的開(kāi)發(fā)。

    1.    要學(xué)會(huì)看相關(guān)的需求文檔及詳細(xì)設(shè)計(jì)文檔。

    注意:你必須要通過(guò)閱讀這些文檔把握住其中的重點(diǎn),關(guān)鍵點(diǎn),相關(guān)易漏點(diǎn)

    2.    如果公司里會(huì)用UML來(lái)相互的溝通,這時(shí)你必須要深刻理解UML 的相關(guān)知識(shí),一定要注意千萬(wàn)不要對(duì)UML圖一知半解的情況下,就著寫(xiě)代碼,那樣會(huì)錯(cuò)的很慘。

    3.    學(xué)好對(duì)應(yīng)的計(jì)算機(jī)語(yǔ)言的基礎(chǔ)知識(shí),如:程序的語(yǔ)法,關(guān)鍵點(diǎn),易錯(cuò)點(diǎn),對(duì)應(yīng)的出錯(cuò)如何出理,如何才能把對(duì)就的程序?qū)懙逆I壯一些

    4.    如果用到數(shù)據(jù)庫(kù)的內(nèi)容,在學(xué)會(huì)sql的前提下,盡量學(xué)會(huì)數(shù)據(jù)庫(kù)原理中的相關(guān)sql內(nèi)容, 當(dāng)然為了提高查詢的能力也可以增加一點(diǎn)

    5.    如果用到面向?qū)ο竦恼Z(yǔ)言那最好學(xué)點(diǎn)相關(guān)的設(shè)計(jì)模式,這樣的可以增加代碼的擴(kuò)展性,及可維護(hù)性等,能夠理解詳細(xì)設(shè)計(jì)中的模塊間的設(shè)計(jì)原則這個(gè)也可以提高對(duì)模塊的內(nèi)容編寫(xiě)的正確性.

    6.    你一定要學(xué)會(huì)公司內(nèi)部的通用的編碼規(guī)范。

    7.    學(xué)習(xí)如何做單元測(cè)試比較好.必須要熟悉相關(guān)的單元測(cè)試工具.

    8.    要不斷的對(duì)相關(guān)知識(shí)進(jìn)行總結(jié),同時(shí)也要必須把相關(guān)的資料進(jìn)行整理和學(xué)習(xí),在學(xué)習(xí)過(guò)后的資料中你可以在遇到問(wèn)題時(shí)更快的找到問(wèn)題的答題。

    9.    在開(kāi)發(fā)你必須記錄下大家常出錯(cuò)的地方及大家的解決方法,這個(gè)對(duì)你以后錯(cuò)誤的避免有很大的作用.

    10.    在寫(xiě)代碼中時(shí)必須把上面寫(xiě)過(guò)代碼記在心里,這樣就可以養(yǎng)成習(xí)慣,提高代碼的速度

    11.    對(duì)數(shù)據(jù)庫(kù)操作時(shí),要盡量共用Connection,并小用以減少Connection的數(shù)量

    (二)    目標(biāo):高級(jí)程序員

    職責(zé):對(duì)需求文檔進(jìn)行系統(tǒng)相關(guān)模塊的詳細(xì)設(shè)計(jì),并負(fù)責(zé)對(duì)程序員的支持及指導(dǎo)和相關(guān)核心模塊的編寫(xiě)

    所以不但要學(xué)會(huì)相關(guān)程序員要的知識(shí),同時(shí)還要學(xué)會(huì)難度比較大的知識(shí)。

    1. 程序員的知識(shí),如設(shè)計(jì)模式你一定要不是簡(jiǎn)單的看要懂,你還要應(yīng)用設(shè)計(jì)模式對(duì)相應(yīng)的模塊進(jìn)行相關(guān)的詳細(xì)設(shè)計(jì)。

    2.  要學(xué)好相關(guān)詳細(xì)設(shè)計(jì)的工具做的有的放矢,這樣可以更好提高對(duì)自已的設(shè)計(jì)的表達(dá)

    3.  為了提高系統(tǒng)的運(yùn)行效率會(huì)運(yùn)用到

    a.         數(shù)據(jù)庫(kù)的表結(jié)構(gòu)如何建才能使應(yīng)用的要查詢sql 更快。這時(shí)可要認(rèn)真認(rèn)真的學(xué)習(xí)一樣數(shù)據(jù)庫(kù)原理,千萬(wàn)不要以為采用數(shù)據(jù)庫(kù)的范式越高系統(tǒng)的運(yùn)行效率會(huì)越好,有時(shí)候適當(dāng)?shù)谋砣哂嗫梢源蠓鹊奶岣呦到y(tǒng)的查詢效率.  同時(shí)適當(dāng)?shù)慕ㄋ饕?視圖,存儲(chǔ)過(guò)程也是提高系統(tǒng)對(duì)數(shù)據(jù)庫(kù)的查詢的效率之一。

    b.         學(xué)習(xí)多線程的編程,不過(guò)千萬(wàn)不要以為線程數(shù)越多運(yùn)行的速度會(huì)越快,一般線程的數(shù)量超過(guò)一定的數(shù)量后,系統(tǒng)的運(yùn)行速度反而會(huì)變慢。為了應(yīng)用好多線程,操作系統(tǒng)這本書(shū)也要關(guān)于同步及相關(guān)進(jìn)程和線程的知識(shí)必不可少。

    c.         設(shè)計(jì)好的一程序的好的算法,可要比起解一道同一復(fù)雜的數(shù)學(xué)題,要難的多,所以要在學(xué)好的相關(guān)數(shù)學(xué)的知識(shí)上(如線性代數(shù),離散數(shù)學(xué),概率論,數(shù)理統(tǒng)計(jì))。更要深入計(jì)算方法,及數(shù)據(jù)結(jié)構(gòu),讓數(shù)學(xué)問(wèn)題用計(jì)算機(jī)來(lái)解決。

             4.為了讓系統(tǒng)設(shè)計(jì)的更加的可擴(kuò)展性,穩(wěn)定性,設(shè)計(jì)模式和軟件工程可是不能少的東西。所以必須把設(shè)計(jì)模式用于模式級(jí)的設(shè)計(jì).

             5. 如果公司采用的是Rose (UML)進(jìn)行設(shè)計(jì)的話,你對(duì)于UML 的理解一定要非常的準(zhǔn)確,同時(shí)你要跟小組中的程序之間進(jìn)行充分的UML概念上及對(duì)應(yīng)用例圖,類型圖,對(duì)象圖,協(xié)作圖的意思多寫(xiě)一些注釋加深大家對(duì)你的設(shè)計(jì)上的理解。

    (三)         目標(biāo):系統(tǒng)分析員

    職責(zé):做好與客戶之間的關(guān)系,同時(shí)對(duì)客戶的需求要正確的理解,要選擇合適的開(kāi)發(fā)技術(shù),同時(shí)做好與客戶間溝通交流,學(xué)會(huì)說(shuō)服對(duì)方。

    1.  學(xué)會(huì)對(duì)客戶的溝通:要正確理解客戶的需求同時(shí)要保證相互之間的溝通順暢。

    2.  對(duì)了解來(lái)的需求要能用筆正確的描述下來(lái),并能很好的傳敘給其他人。這時(shí)要學(xué)會(huì)用如ROSE 等的軟件建模的工具。和powerdesign等的數(shù)據(jù)庫(kù)建模工具。和相關(guān)的UML,數(shù)據(jù)流程圖及相關(guān)的內(nèi)容的知識(shí)。

    3.  不但要全面的了解客戶的需求而且還要對(duì)需求進(jìn)行未來(lái)的可能的改變要有相當(dāng)多的了解。

    4.  全面的了解客戶的需求后,要選擇合適的相關(guān)技術(shù)用于開(kāi)發(fā),:

    這時(shí)要學(xué)習(xí)各種知識(shí)

    a.  先擇數(shù)據(jù)庫(kù):db2,infomix ,oracle ,sql server,mysql 的優(yōu)缺點(diǎn),可以從中選擇最適合的數(shù)據(jù)庫(kù)及理由。

    b. 設(shè)計(jì)數(shù)據(jù)庫(kù):要扎實(shí)在數(shù)據(jù)庫(kù)的理論(數(shù)據(jù)庫(kù)原理,數(shù)據(jù)庫(kù)系統(tǒng)設(shè)計(jì))及相關(guān)數(shù)據(jù)庫(kù)設(shè)計(jì)經(jīng)驗(yàn),要盡量多的分析過(guò)去數(shù)據(jù)庫(kù)設(shè)計(jì),分析這么設(shè)計(jì)數(shù)據(jù)庫(kù)的好處。這時(shí)可能要用到 powerdesign等工具。

    c. 寫(xiě)需求說(shuō)明文檔和概要設(shè)計(jì)文檔,同時(shí)要學(xué)會(huì)要分析相關(guān)需求說(shuō)明文檔的需要的內(nèi)容的相關(guān)知識(shí),如人員工時(shí)的計(jì)算方法, 一般會(huì)用 project 來(lái)分析相關(guān)的項(xiàng)目的內(nèi)容。

    d. 選擇合適的程序語(yǔ)言及相關(guān)的架構(gòu),一般主流的架構(gòu)是 J2EE和.net的相應(yīng)的優(yōu)點(diǎn)及它們之間的結(jié)合,如采用soap xml進(jìn)行相關(guān)的結(jié)合,或用java-com 橋 進(jìn)行相關(guān)的功能的調(diào)用。和它們之間的相關(guān)語(yǔ)言優(yōu)缺點(diǎn)

    e.  還要根據(jù)b/s,c/s 結(jié)構(gòu)對(duì)開(kāi)發(fā)的網(wǎng)絡(luò)影響的相關(guān)內(nèi)容采取選擇。

     5. 學(xué)會(huì)說(shuō)服對(duì)方,畢竟客戶都不是個(gè)個(gè)是軟件專家,他們的選擇有時(shí)未必是正確的所以學(xué)會(huì)說(shuō)服對(duì)方,是系統(tǒng)分析員必備的能力條件.                           

     三.    訓(xùn)練的方法:

    1.       計(jì)劃行事:

    (1 設(shè)定你的未來(lái)的學(xué)習(xí)目標(biāo)

    a.         未來(lái)要成為什么樣的人(主要是工作角色,如程序員,高級(jí)程序員,系統(tǒng)分析員)

    b.         你近期要成為什么樣的人(當(dāng)前的工作職責(zé)是什么,如果只寫(xiě)代碼是程序員等)

    c.         要完成近期的工作所必須要知識(shí)(如java 程序員,要學(xué)習(xí)java 基礎(chǔ)知識(shí),等),關(guān)鍵的知識(shí)(如java中關(guān)鍵要用到的知識(shí)有,面向?qū)ο蟮龋?易錯(cuò)的知識(shí)(比較原來(lái)的已有知識(shí)進(jìn)行合對(duì))

    (2      設(shè)定你的學(xué)習(xí)目標(biāo)后,并要有針對(duì)性的對(duì)應(yīng)目標(biāo)設(shè)定學(xué)習(xí)時(shí)間的按排及學(xué)習(xí)路線。并直觀的記錄在案,以便以后隨時(shí)核對(duì),

    (3      常常抽出一定的時(shí)間認(rèn)真核對(duì)計(jì)劃的完成情況,如果沒(méi)有按時(shí)完成計(jì)劃的內(nèi)容。分析原因,盡量想法趕上計(jì)劃內(nèi)容如果存認(rèn)是計(jì)劃有誤,要認(rèn)真總結(jié)計(jì)劃失敗出錯(cuò)的原因,對(duì)你的未來(lái)有很大的幫助。

    注意:不要對(duì)計(jì)劃的按排過(guò)于樂(lè)觀 要盡量的考慮實(shí)現(xiàn)中的各種情況,同時(shí)適當(dāng)按排一些緩沖時(shí)間,以便真正能按照計(jì)劃行事,以提高按計(jì)劃行事信心,同時(shí)這能有效避免出現(xiàn)計(jì)劃中途成沒(méi)有意義的東西。

    2.  針對(duì)工作角色對(duì)自已的能力進(jìn)行培養(yǎng)和知識(shí)進(jìn)行學(xué)習(xí)。

    關(guān)鍵的能力:

     (1. 記憶能力:要學(xué)會(huì)把自已的寫(xiě)的代碼和改的代碼記的清清楚楚。要能提高效率。

     (2. 邏輯思維能力:要多多的看別人的復(fù)雜邏輯的代碼,分析復(fù)雜邏輯的運(yùn)算。

     (3.全局能力: 不要再范改了東,卻西出錯(cuò)。(構(gòu)造軟件這個(gè)很重要)

     (4.學(xué)習(xí)能力: 并不是每個(gè)項(xiàng)目都你是所熟悉的項(xiàng)目的,并不是每個(gè)項(xiàng)目中的知識(shí)你都知道,要掌握最新的技術(shù)和最有用的知識(shí),是最關(guān)鍵的。要學(xué)會(huì),提高能力,這個(gè)東西是永遠(yuǎn)對(duì)自己有好處的。

     (5. 溝通能力; 學(xué)會(huì)幽默,學(xué)會(huì)講故事,學(xué)會(huì)交朋友,學(xué)會(huì)禮節(jié)。

     (6.自制能力:如果一個(gè)人不能自制那這個(gè)人以后,不會(huì)有很大成果,即使很大機(jī)會(huì)發(fā)展起了,可是因?yàn)闆](méi)有自制能力很容易被人利用,或自己明明知道怎么做,可是就是不能控制自己的欲望.而常做下無(wú)法挽回在錯(cuò)誤.

     四.    例:java 程序員的知識(shí)結(jié)構(gòu)及學(xué)習(xí)流程:

      (一) 學(xué)習(xí)相關(guān)工作必須的知識(shí)

       1.Java 語(yǔ)言的基礎(chǔ)(推薦書(shū):《 java 編程思想》)

    關(guān)鍵:

    (1.     java 面向?qū)ο蠹皩?duì)應(yīng)的程序現(xiàn)實(shí)

    (2.     java  多線程

    (3.     java  網(wǎng)絡(luò) socket

    (4.     應(yīng)用界面

       2.學(xué)會(huì)用智能集成開(kāi)發(fā)工具jbuilder,eclipse等一種,根據(jù)資料里的內(nèi)容,自已寫(xiě)與例程類似的代碼,但注意不要直接抄它,一定要自已寫(xiě)。同時(shí)最好寫(xiě)到一個(gè)工程中以便對(duì)比。

       3.如果用b/s結(jié)構(gòu)要學(xué)習(xí)jsp的知識(shí)(推薦書(shū):《 JSP 2.0技術(shù)手冊(cè) 》)

    關(guān)鍵:

    (1. 界面處理:

    a . HTML——超文本標(biāo)志語(yǔ)言:用于顯示頁(yè)面如:超文本鏈接, 表格,各種標(biāo)志等。

    b. CSS———層疊樣式表:控制正文外觀的一組格式.用于美化HTML頁(yè)面。

    c. javaScript—嵌入HTML頁(yè)面瀏覽器來(lái)執(zhí)行的腳本語(yǔ)言:讓頁(yè)面可以根據(jù)用戶的操作或事先設(shè)置等在客戶端進(jìn)行動(dòng)態(tài)變化,而且不需傳回服務(wù)器。比如: 對(duì)表單輸入的正確性做客戶端驗(yàn)證.

    (2.jsp元素:如java代碼寫(xiě)法,對(duì)應(yīng)標(biāo)志---jsp:include,jsp:useBean,jsp:setProperty,

    jsp:getProperty等.jsp的幾大對(duì)

     (3.  javaBean及其在jsp 中的調(diào)用和相關(guān)應(yīng)用.

     (4. 其他技術(shù):

      a. 如何操作數(shù)據(jù)庫(kù)—用jdbc(可能要補(bǔ)充一些數(shù)據(jù)庫(kù)的知識(shí),如oracle ,sql server,

    包括如何寫(xiě)高效率的查詢sql,存儲(chǔ)過(guò)程等) ,

    b. 如何發(fā)送email—用javaMail,

    c. 如何學(xué)習(xí)如何用實(shí)現(xiàn)文件的上傳下載,如果操作文件,

    d. 如何操作xml  --用jdom 及 jaxp(這時(shí)有必要學(xué)習(xí)一下xml 的語(yǔ)法如 dtd等)

    e. 如何遠(yuǎn)程方法調(diào)用—用 rmi

    f. 如何進(jìn)行消息服務(wù) ---用 jms

     5.再有些公司會(huì)用到 J2EE 的架構(gòu)如 EJB 作為業(yè)務(wù)邏輯.

    (1.EJB中要分清

    (2. struts  MVC

    (3. Hibernate 操作數(shù)據(jù)庫(kù)

     6.最好學(xué)習(xí)一下UML

    學(xué)用Rose建模

     五 忠告:

       1. 不要以為自已很差,要明白每個(gè)人都是這樣一步一個(gè)腳印的走過(guò)來(lái)的。(我們要有信心)

    告訴自已:比爾蓋次,也是同我們一樣,出生時(shí)也是巴掌大.

    我們只有多學(xué),多練才可能有出路.

       2. 不要以為自已學(xué)的多就很強(qiáng),世界上的高手多的是,問(wèn)問(wèn)自己,你每小時(shí)可以寫(xiě)幾行代碼,代碼一次寫(xiě)下來(lái)有多少錯(cuò)誤,如果你一次寫(xiě)下沒(méi)有錯(cuò)誤,一小時(shí)可以寫(xiě)1000代碼,那才是真正的高手.

       3 . 不要以為自已沒(méi)有項(xiàng)目做就會(huì)落后于他人,人家是參加了很多項(xiàng)目,可是人家只是項(xiàng)目中的一個(gè)小角色,如果我們?cè)诳諘r(shí)能都寫(xiě)一些開(kāi)源的項(xiàng)目,或自己開(kāi)發(fā)和設(shè)計(jì)一些有用的開(kāi)源的項(xiàng)目,水平及能力很快就上來(lái)了.

       4.   不要以為自己做過(guò)很多的項(xiàng)目就很了不起了。你能說(shuō)你做的項(xiàng)目中,你能體會(huì)整個(gè)項(xiàng)目為什么要這樣設(shè)計(jì),為什么要這樣開(kāi)發(fā)嗎?相信絕大多數(shù)是否定的回答。那還不如多學(xué)習(xí)一些已做的項(xiàng)目,了解他們?yōu)槭裁匆@么做,為什么這么開(kāi)發(fā),多看一下它們的項(xiàng)目的文檔,我們能明白很多,這樣把他們的經(jīng)驗(yàn)放于你未來(lái)可能要接手的項(xiàng)目,這樣不是更好嗎?

       5. 不要以為自己的學(xué)習(xí)能力很牛,你能快速閱讀一本書(shū)又能快速掌握它的內(nèi)容嗎

    posted @ 2008-12-11 19:12 南山隱士 閱讀(265) | 評(píng)論 (0)編輯 收藏
    安全永遠(yuǎn)是WEB應(yīng)用系統(tǒng)必須面對(duì)的頭等大事, 也是最頭疼的事, 其實(shí)安全系統(tǒng)就只包括兩個(gè)問(wèn)題: 認(rèn)證和授權(quán).    以前做些網(wǎng)站系統(tǒng), 安全檢測(cè)邏輯都在放在須要安全控制的代碼前面, 這樣做有很多不好的地方, 重復(fù)多次的編碼就不用說(shuō)了, 代碼移植性, 重用性都得不到體現(xiàn), 安全檢測(cè)邏輯要永遠(yuǎn)和業(yè)務(wù)邏輯放在一起.
        那么, 能不能夠在進(jìn)入方法前就調(diào)用一些安全檢測(cè)? 其實(shí)Spring AOP就是這個(gè)思想, 那么又如何實(shí)現(xiàn)安全檢測(cè)呢? Spring Acegi Security 框架就是做這個(gè)事情.
         本文主要是討論下在已有的SSH系統(tǒng)中, 如何使用Acegi作為安全框架實(shí)現(xiàn)基于角色的權(quán)限控制(Role Based Access Control RBAC) , 本文主要是以Java 5注解的形式來(lái)配置安全框架, 大大減化配置和操作.
        本文的主要參考資料: <Spring 2.0 核心技術(shù)與最佳實(shí)踐> 第10章 (Spring Acegi 安全框架)
                    <精通Spring 2.X -- 企業(yè)應(yīng)用開(kāi)發(fā)詳解> 第17章 (使用Acegi 實(shí)施應(yīng)用系統(tǒng)安全)
                    acegi-security-1.0.6 官方文檔
        說(shuō)明: 本文介紹的是RBAC, 在官方文檔的基礎(chǔ)上有所擴(kuò)展或改動(dòng), 以更適合WEB應(yīng)用系統(tǒng). 其實(shí)我覺(jué)得大多數(shù)的網(wǎng)站基于角色已經(jīng)足夠了, 一般都沒(méi)必要基于權(quán)限.
         文章開(kāi)始:
    一. 下載所要的軟件或JAR包:
        我的相關(guān)配置是: Java 5, Tomcat 5.5.26, Struts 2.0.11, Spring 2.5.1, Hibernate 3.2, Acegi 1.0.6
    二. 建立相關(guān)的數(shù)據(jù)庫(kù):
         數(shù)據(jù)表: 用戶信息表User: id, enable, user_name, user_pass, email_box
                     角色信息表RoleInfo: id, role_name, role_title, descp
                     用戶與角色關(guān)聯(lián)表(用戶與角色是多對(duì)多關(guān)系)UserRole: user_id, user_name, role_id, role_name
                    并在這三個(gè)表中插入相關(guān)的數(shù)據(jù), 我是定義了兩種角色(role_name): ROLE_USER, ROLE_ADMIN
                    和三個(gè)用戶, 一個(gè)用戶角色為: ROLE_USER, ROLE_ADMIN
                     另一個(gè)用戶角色為: ROLE_USER
                    第三個(gè)沒(méi)有角色.
    二. 修改配置文件:
        其實(shí)對(duì)Acegi框架的應(yīng)用難點(diǎn)就在配置文件, 所以要特別注意了:
        在 src 建立Acegi的配置文件: acegi-security.xml 當(dāng)然這個(gè)文件的名稱是可以任意的.
        acegi-security.xml 說(shuō)白了就是配置: 安全攔截器, 認(rèn)證管理器, 決策管理器.
        其內(nèi)容如下:
    <?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.xsd">
    <!-- ========================= 認(rèn)證管理器 ========================= -->
    <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
    <property name="providers">
       <list>
        <ref bean="daoAuthenticationProvider" />
        <ref bean="rememberMeAuthenticationProvider" />
       </list>
    </property>
    </bean>

    <!-- 基于DAO驗(yàn)證的AuthenticationProvider -->
    <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="userDetailsService" />
    </bean>
    <bean id="userDetailsService" class="org.ymcn.security.AcegiUserDeitailsService">
    <property name="userDao" ref="userDao" />
    <property name="userRoleDao" ref="userRoleDao" />
    </bean>

    <bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
    <property name="key" value="obullxl@163.com" />
    </bean>
    <bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
    <property name="userDetailsService" ref="userDetailsService" />
    <property name="parameter" value="j_remember_me" />
    <property name="key" value="obullxl@163.com" />
    <property name="tokenValiditySeconds" value="31536000" />
    </bean>

    <!-- ========================= 決策管理器 ========================= -->
    <bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
    <property name="decisionVoters">
       <list>
        <ref bean="roleVoter" />
       </list>
    </property>
    <!-- 是否全部棄權(quán)就通過(guò) -->
    <property name="allowIfAllAbstainDecisions" value="false" />
    </bean>
    <bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter">
    <property name="rolePrefix" value="ROLE_" />
    </bean>

    <!-- ========================= 過(guò)濾器鏈 ========================= -->
    <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
    <property name="filterInvocationDefinitionSource">
       <value>
        CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
        PATTERN_TYPE_APACHE_ANT
        /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,rememberMeFilter,exceptionFilter,securityInterceptor
       </value>
    </property>
    </bean>
    <bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" />
    <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
    <!-- 登錄退出后的URL -->
    <constructor-arg value="/" />
    <constructor-arg>
       <list>
        <ref bean="rememberMeServices" />
        <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
       </list>
    </constructor-arg>
    <!-- 登錄退出的URL -->
    <property name="filterProcessesUrl" value="/j_logout.j" />
    </bean>
    <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager" />
    <!-- 登錄失敗后的URL -->
    <property name="authenticationFailureUrl" value="/login.jsp?msg=%E6%97%A0%E6%95%88%E7%9A%84%E7%94%A8%E6%88%B7%E5%90%8D%E6%88%96%E5%8F%A3%E4%BB%A4" />
    <!-- 登錄成功后的URL -->
    <property name="defaultTargetUrl" value="/user/cmd.jsp" />
    <!-- 登錄的URL -->
    <property name="filterProcessesUrl" value="/j_login.j" />
    <property name="rememberMeServices" ref="rememberMeServices" />
    </bean>
    <bean id="rememberMeFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="rememberMeServices" ref="rememberMeServices" />
    </bean>
    <bean id="exceptionFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
    <!-- 出現(xiàn)AuthenticationException時(shí)的登錄入口 -->
    <property name="authenticationEntryPoint">
       <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
       <property name="loginFormUrl" value="/login.jsp" />
        <property name="forceHttps" value="false" />
       </bean>
    </property>
    <!-- 出現(xiàn)AccessDeniedException時(shí)的Handler -->
    <property name="accessDeniedHandler">
       <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
       <property name="errorPage" value="/denied.jsp" />
       </bean>
    </property>
    </bean>
    <bean id="securityInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="accessDecisionManager" ref="accessDecisionManager" />
    <property name="objectDefinitionSource">
       <value>
        CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
        PATTERN_TYPE_APACHE_ANT
        /admin/**=ROLE_ADMIN
        /user/**=ROLE_USER
        /cart/previeworder*=ROLE_USER
       </value>
    </property>
    </bean>

    </beans>
        在上面的配置文件中, 紅色部分要特別注意, 其余的內(nèi)容都差不多了.
    <bean id="userDetailsService" class="org.ymcn.security.AcegiUserDeitailsService">
    <property name="userDao" ref="userDao" />
    <property name="userRoleDao" ref="userRoleDao" />
    </bean>

        在整個(gè)應(yīng)用的安全控制中, 我們唯一要編寫(xiě)代碼的類就是: org.ymcn.security.AcegiUserDeitailsService
        就連登錄和登出的代碼也不要了.
    三. 修改 web.xml, 增加安全控制過(guò)濾鏈.
    <filter>
            <filter-name>acegiFilterChain</filter-name>
            <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
            <init-param>
                <param-name>targetClass</param-name>
                <param-value>org.acegisecurity.util.FilterChainProxy</param-value>
            </init-param>
        </filter>

    <filter-mapping>
            <filter-name>acegiFilterChain</filter-name>
            <url-pattern>*.j</url-pattern>
    </filter-mapping>

        注意: 這個(gè)過(guò)濾器一定要在MVC轉(zhuǎn)發(fā)過(guò)濾器的前面!!!!
    四. 在 applicationContext.xml 中增加 Acegi安全控制攔截器Spring的自動(dòng)代理功能實(shí)現(xiàn)AOP代理
    <!-- Acegi安全控制攔截器 -->
    <bean id="serviceSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
    <property name="validateConfigAttributes" value="true" />
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="accessDecisionManager" ref="accessDecisionManager" />
    <property name="objectDefinitionSource">
       <bean class="org.acegisecurity.intercept.method.MethodDefinitionAttributes">
        <property name="attributes">
         <bean class="org.acegisecurity.annotation.SecurityAnnotationAttributes" />
        </property>
       </bean>
    </property>
    </bean>

    <!-- 利用Spring的自動(dòng)代理功能實(shí)現(xiàn)AOP代理 -->
    <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="interceptorNames">
       <list>
        <value>transactionInterceptor</value>
        <value>serviceSecurityInterceptor</value>
       </list>
    </property>
    <property name="beanNames">
       <list>
        <value>userService</value>
        <value>mailService</value>
       </list>
    </property>
    </bean>

    五. 編寫(xiě)在利用Acegi框架唯一要我們編寫(xiě)的類 AcegiUserDeitailsService.java
    package org.ymcn.security;
    import java.util.List;
    import org.acegisecurity.GrantedAuthority;
    import org.acegisecurity.GrantedAuthorityImpl;
    import org.acegisecurity.userdetails.UserDetails;
    import org.acegisecurity.userdetails.UserDetailsService;
    import org.acegisecurity.userdetails.UsernameNotFoundException;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.dao.DataAccessException;
    import org.ymcn.dao.UserDao;
    import org.ymcn.dao.UserRoleDao;
    import org.ymcn.model.User;
    import org.ymcn.model.UserRole;
    public class AcegiUserDeitailsService implements UserDetailsService {
    private final Log LOG = LogFactory.getLog(AcegiUserDeitailsService.class);
    /* 依賴注入 */
    private UserDao userDao;
    private UserRoleDao userRoleDao;

    public void setUserDao(UserDao userDao) {
       this.userDao = userDao;
    }
    public void setUserRoleDao(UserRoleDao userRoleDao) {
       this.userRoleDao = userRoleDao;
    }

    /* 用戶所有的權(quán)限 */
    //private final List<GrantedAuthority> grantedAuthList = new ArrayList<GrantedAuthority>(6);
    private GrantedAuthority[] grantedAuthArray;

    public UserDetails loadUserByUsername(String userName)
        throws UsernameNotFoundException, DataAccessException {
       if(LOG.isDebugEnabled()) {
        LOG.debug("Loading UserDetails of userName: " + userName);
       }
       /* 取得用戶 */
       User user = userDao.getUserByName(userName);
       if(user == null) {
        LOG.warn("UserDetails load failed: No such UserRole with userName: " + userName);
                throw new UsernameNotFoundException("User name is not found.");
       }
       /* 取得所有用戶權(quán)限 */
       List<UserRole> userRoleList = userRoleDao.getUserRoleByUserName(userName);
       if(userRoleList == null || userRoleList.size() == 0) {
        LOG.warn("UserRole load failed: No such UserRole with userName: " + userName);
                throw new UsernameNotFoundException("UserRole is not found.");
       }
       /* 取得用戶的所有角色 */
       int size = userRoleList.size();
       grantedAuthArray = new GrantedAuthority[size];
       int j = 0;
       for(int i = 0; i < size; i++) {
        UserRole userRole = userRoleList.get(i);
        if(userRole != null) {
         this.grantedAuthArray[j++] = new GrantedAuthorityImpl(userRole.getRoleName().toUpperCase());
        }
       }
       LOG.info("UserName: " + userName + " loaded successfully.");
            return new org.acegisecurity.userdetails.User(userName, user.getUserPass(),
               true, true, true, true, this.grantedAuthArray);
    }
    }
    六. 在業(yè)務(wù)邏輯代碼中利用Java 5注釋實(shí)現(xiàn)安全控制
    @Secured({"ROLE_USER"})
    void sendSimpleMail(Long userId);

    @Secured({"ROLE_ADMIN"})
    void sendAttachmentMail() throws Exception;

        其實(shí)就是在需要安全控制的方法前加上: @Secured({"角色名"}), 非常的簡(jiǎn)單
    七. 整個(gè)工作完成
        Acegi框架完全是一種可插拔式的, 完全可以在原有的系統(tǒng)中加個(gè)一個(gè)配置文件, 和在每個(gè)方法前加上: @Secured({"角色名"}) 就可完成.
         上面的 AcegiUserDeitailsService.java 中的有 UserDao, UserRoleDao, 我想一看就知道它們是干什么的了, 這完全取決于個(gè)人的實(shí)現(xiàn), 與Acegi無(wú)關(guān), 它僅僅只要返回一個(gè) return new org.acegisecurity.userdetails.User(userName, user.getUserPass(),
              true, true, true, true, this.grantedAuthArray) 就可以了.
    posted @ 2008-12-11 18:51 南山隱士 閱讀(686) | 評(píng)論 (0)編輯 收藏

    上個(gè)世紀(jì)90年代中期,為了推進(jìn)我國(guó)企業(yè)管理信息化,尋求更大的企業(yè)發(fā)展空間,一批具有一定規(guī)模的財(cái)務(wù)軟件公司紛紛轉(zhuǎn)向企業(yè)管理軟件,大量冠名為某某管理的軟件產(chǎn)品迅速涌現(xiàn),同時(shí)國(guó)際管理軟件巨頭紛紛搶灘國(guó)內(nèi)市場(chǎng),在這些軟件企業(yè)的大力推動(dòng)下,我國(guó)企業(yè)界開(kāi)始廣泛了解管理軟禁先進(jìn)性,2004年-2005年,管理軟件開(kāi)始成為市場(chǎng)迅速增長(zhǎng)的需求,國(guó)內(nèi)眾多公司開(kāi)始使用管理軟件成為一種趨勢(shì)。

     
    但是,現(xiàn)在回過(guò)頭看來(lái),真正成功、成熟的管理應(yīng)用案例在中國(guó)市場(chǎng)仍然鳳毛麟角。
     
    目前市面上,叫“管理軟件”的成千上萬(wàn),很多的管理軟件,他們的界面、輸入、操作是那么的千篇一律,這類軟件,開(kāi)發(fā)就是搭積木,裝配的痕跡太重,沒(méi)有個(gè)性。有專家指出,管理思想很難“落地”的核心原因就在于對(duì)信息層次管理的認(rèn)識(shí)的缺失或不足,往往被意識(shí)層次中的一種習(xí)慣性思維--試圖用思想讓思想“落地”所束縛,而現(xiàn)實(shí)中,阻礙管理思想“落地”的核心問(wèn)題,恰恰更多的都集中到信息層次的管理問(wèn)題上了。所以,要想真正讓管理思想“落地”,我們管理者必須跳出意識(shí)層次來(lái)看問(wèn)題,并采用信息層次的管理手段來(lái)進(jìn)一步解決問(wèn)題。
     
    從這里我們不難發(fā)現(xiàn),問(wèn)題的根源就在于沒(méi)有把管理思想真正通過(guò)信息化落實(shí)下去。很多管理軟件應(yīng)用企業(yè),僅僅只是把管理軟件當(dāng)做一個(gè)統(tǒng)計(jì)或者發(fā)發(fā)信息的工具。
     
    而用戶真正需要的是解決企業(yè)在經(jīng)營(yíng)管理中遇到的問(wèn)題,而這些問(wèn)題的解決需要一個(gè)從單項(xiàng)產(chǎn)品到整合應(yīng)用的發(fā)展過(guò)程。我國(guó)企業(yè)最初的需求是財(cái)務(wù)管理、進(jìn)銷存管理,這已經(jīng)在前些年的財(cái)務(wù)軟件發(fā)展浪潮中得到普及。我國(guó)企業(yè)現(xiàn)在的需求,是面對(duì)著工業(yè)化改革與信息化顛覆的雙重革命,需要利用最少的成本代價(jià),將舊的系統(tǒng)遷移到新的平臺(tái)上,從而適應(yīng)網(wǎng)絡(luò)經(jīng)濟(jì)和電子商務(wù)帶來(lái)的供應(yīng)鏈管理、客戶關(guān)系管理等領(lǐng)域的時(shí)代變化。我國(guó)企業(yè)未來(lái)的需求,是將企業(yè)內(nèi)外資源的管理納入到統(tǒng)一的符合我國(guó)特色國(guó)情的管理平臺(tái)之上,徹底改造企業(yè)管理體制和機(jī)制。
     
    我們國(guó)家的管理軟件,這么多年來(lái)最缺的是管理思想和管理方法,沒(méi)有科學(xué)的管理模型作為支撐,管理軟件是不能稱之為“管理軟件”的。因?yàn)楣芾碥浖暮诵牟辉谟谲浖夹g(shù)本身,而是在于管理思想的問(wèn)題。
     
    一位業(yè)內(nèi)資深人士就說(shuō)了:“我們國(guó)家十幾年來(lái)管理軟件產(chǎn)業(yè)的發(fā)展,最致命的問(wèn)題就出在這個(gè)地方,我們很多的軟件公司、很多編程人員不懂管理,不知道企業(yè)的管理問(wèn)題是什么,更不知道解決這些問(wèn)題的管理思想和管理模型是什么,他們開(kāi)發(fā)出來(lái)的“管理軟件”,當(dāng)然也就不能真正幫助企業(yè)解決管理問(wèn)題。”這種“管理軟件”充斥著市場(chǎng),客戶的普遍不滿意也就是情理之中的事情了。
     
    管理軟件是用來(lái)解決管理問(wèn)題,其關(guān)鍵在于管理的思想和方法。可以說(shuō),管理思想和方法是管理軟件的靈魂。今天,我們很多人仍然以為管理軟件門(mén)檻很低,大學(xué)畢業(yè)出來(lái)就能做,只要會(huì)編程的人員就能做。開(kāi)發(fā)管理軟件產(chǎn)品,必須先把要解決的管理問(wèn)題研究清楚,把解決這些問(wèn)題的管理方法和管理模型的研究清楚,然后再開(kāi)發(fā)軟件產(chǎn)品。
     
    前沿的軟件技術(shù)、獨(dú)特的行業(yè)業(yè)務(wù)模型加上科學(xué)的管理思想和方法,三者的創(chuàng)造性融合,才有可能產(chǎn)生一個(gè)真正能創(chuàng)造客戶價(jià)值的管理軟件產(chǎn)品。著名的金和軟件產(chǎn)品一直被業(yè)界稱為“有思想的軟件”,關(guān)鍵在于金和軟件對(duì)協(xié)同管理軟件的準(zhǔn)確定位,以及為客戶帶來(lái)真正的價(jià)值。眾所周知,無(wú)論前端OA系統(tǒng)還是后端ERP等業(yè)務(wù)系統(tǒng),都是遵循固定流程的,產(chǎn)品之間并無(wú)明顯的差異,但是在這兩者之間的協(xié)同領(lǐng)域,卻存在很高的準(zhǔn)入壁壘。金和軟件創(chuàng)造性地發(fā)揮獨(dú)創(chuàng)的精確管理思想和協(xié)同理念優(yōu)勢(shì),以產(chǎn)品、工具和行業(yè)解決方案為基礎(chǔ),構(gòu)建了適合各個(gè)行業(yè)的協(xié)同管理平臺(tái)。
     
    協(xié)同企業(yè)是現(xiàn)代企業(yè)運(yùn)營(yíng)的高級(jí)狀態(tài),企業(yè)作為一個(gè)整體,一定是一個(gè)協(xié)同的系統(tǒng),有效的協(xié)同決定了企業(yè)的經(jīng)營(yíng)效率、達(dá)成目標(biāo)的能力、資源的有效利用以及企業(yè)核心能力。金和C6的設(shè)計(jì)完全符合這種柔性的企業(yè)協(xié)同理念。協(xié)同企業(yè)的主要基礎(chǔ)是企業(yè)流程和知識(shí)系統(tǒng),它們本身是剛性的和持續(xù)積累的,但是以此為基礎(chǔ)的協(xié)同管理平臺(tái)卻是整合的、柔性的,通過(guò)長(zhǎng)期的應(yīng)用和優(yōu)化,最終使企業(yè)的協(xié)同能力不斷提高,真正成為協(xié)同企業(yè)。
     
    作為國(guó)產(chǎn)軟件企業(yè)的責(zé)任之一,不能僅僅是銷售軟件,更重要的是交給企業(yè)一把“利劍”。這就要把先進(jìn)的技術(shù)和先進(jìn)的管理思想一起交給企業(yè)。僅僅“把軟件用起來(lái)”或“提高工作效率”并不是最終目的,只有通過(guò)管理思想的落實(shí),真正提高了企業(yè)的管理水平,才是實(shí)施管理軟件系統(tǒng)的真實(shí)目標(biāo)。在當(dāng)前的管理軟件市場(chǎng)中,過(guò)分強(qiáng)調(diào)技術(shù)含金量以突出產(chǎn)品的先進(jìn)性也是一種不良的傾向。
     
    管理軟件的開(kāi)發(fā)設(shè)計(jì)上,必須具體兩個(gè)條件:一是對(duì)業(yè)務(wù)流程的深刻理解;二是設(shè)計(jì)者所具備的能力。只有好的理解,在軟件設(shè)計(jì)上沒(méi)有可供操作的控件,就不能隨心所欲的去實(shí)現(xiàn)設(shè)計(jì)的初衷,表現(xiàn)在使用上,則是讓用戶改變它們過(guò)去的工作習(xí)慣和方式。對(duì)于管理軟件領(lǐng)域而言,如果不能將先進(jìn)的技術(shù)通過(guò)先進(jìn)的管理思想把企業(yè)用戶的應(yīng)用實(shí)際統(tǒng)一起來(lái),再高的技術(shù)含金量也只能是事倍功半。技術(shù)與應(yīng)用的融合,其目的是貫徹一種核心管理思想,其目的是幫助企業(yè)實(shí)現(xiàn)體制機(jī)制創(chuàng)新。建設(shè)信息交流完備的組織系統(tǒng),確立供應(yīng)鏈管理的核心地位,全面拓展客戶關(guān)系管理,最終實(shí)現(xiàn)企業(yè)的資源整合。
     
     
    經(jīng)歷了十年風(fēng)雨,我們有理由相信,跨入新世紀(jì)的我國(guó)企業(yè)管理軟件市場(chǎng)將能更為準(zhǔn)確地把握各類管理軟件的精髓,解開(kāi)中國(guó)管理軟件發(fā)展癥結(jié),最終推動(dòng)企業(yè)管理進(jìn)步,促進(jìn)整個(gè)市場(chǎng)朝著健康、有序和獨(dú)立的方向蓬勃發(fā)展。
    posted @ 2008-08-27 13:38 南山隱士 閱讀(169) | 評(píng)論 (0)編輯 收藏

    一、安裝篇
    jspSmartUpload是由www.jspsmart.com網(wǎng)站開(kāi)發(fā)的一個(gè)可免費(fèi)使用的全功能的文件上傳下載組件,適于嵌入執(zhí)行上傳下載操作的JSP文件中。該組件有以下幾個(gè)特點(diǎn):
    1、使用簡(jiǎn)單。在JSP文件中僅僅書(shū)寫(xiě)三五行JAVA代碼就可以搞定文件的上傳或下載,方便。
    2、能全程控制上傳。利用jspSmartUpload組件提供的對(duì)象及其操作方法,可以獲得全部上傳文件的信息(包括文件名,大小,類型,擴(kuò)展名,文件數(shù)據(jù)等),方便存取。
    3、能對(duì)上傳的文件在大小、類型等方面做出限制。如此可以濾掉不符合要求的文件。
    4、下載靈活。僅寫(xiě)兩行代碼,就能把Web服務(wù)器變成文件服務(wù)器。不管文件在Web服務(wù)器的目錄下或在其它任何目錄下,都可以利用jspSmartUpload進(jìn)行下載。
    5、能將文件上傳到數(shù)據(jù)庫(kù)中,也能將數(shù)據(jù)庫(kù)中的數(shù)據(jù)下載下來(lái)。這種功能針對(duì)的是MYSQL數(shù)據(jù)庫(kù),因?yàn)椴痪哂型ㄓ眯裕员疚牟粶?zhǔn)備舉例介紹這種用法。
    jspSmartUpload組件可以從www.jspsmart.com網(wǎng)站上自由下載,壓縮包的名字是jspSmartUpload.zip。下載后,用WinZip或WinRAR將其解壓到Tomcat的webapps目錄下(本文以Tomcat服務(wù)器為例進(jìn)行介紹)。解壓后,將webapps/jspsmartupload目錄下的子目錄Web-inf名字改為全大寫(xiě)的WEB-INF,這樣一改jspSmartUpload類才能使用。因?yàn)門(mén)omcat對(duì)文件名大小寫(xiě)敏感,它要求Web應(yīng)用程序相關(guān)的類所在目錄為WEB-INF,且必須是大寫(xiě)。接著重新啟動(dòng)Tomcat,這樣就可以在JSP文件中使用jspSmartUpload組件了。
    注意,按上述方法安裝后,只有webapps/jspsmartupload目錄下的程序可以使用jspSmartUpload組件,如果想讓Tomcat服務(wù)器的所有Web應(yīng)用程序都能用它,必須做如下工作:
    1.進(jìn)入命令行狀態(tài),將目錄切換到Tomcat的webapps/jspsmartupload/WEB-INF目錄下。
    2.運(yùn)行JAR打包命令:jar cvf jspSmartUpload.jar com
    (也可以打開(kāi)資源管理器,切換到當(dāng)前目錄,用WinZip將com目錄下的所有文件壓縮成jspSmartUpload.zip,然后將jspSmartUpload.zip換名為jspSmartUpload.jar文件即可。)
    3.將jspSmartUpload.jar拷貝到Tomcat的shared/lib目錄下。
    二、相關(guān)類說(shuō)明篇
    ㈠ File類
    這個(gè)類包裝了一個(gè)上傳文件的所有信息。通過(guò)它,可以得到上傳文件的文件名、文件大小、擴(kuò)展名、文件數(shù)據(jù)等信息。
    File類主要提供以下方法:
    1、saveAs作用:將文件換名另存。
    原型:
    public void saveAs(java.lang.String destFilePathName)

    public void saveAs(java.lang.String destFilePathName, int optionSaveAs)
    其中,destFilePathName是另存的文件名,optionSaveAs是另存的選項(xiàng),該選項(xiàng)有三個(gè)值,分別是SAVEAS_PHYSICAL,SAVEAS_VIRTUAL,SAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系統(tǒng)的根目錄為文件根目錄另存文件,SAVEAS_VIRTUAL表明以Web應(yīng)用程序的根目錄為文件根目錄另存文件,SAVEAS_AUTO則表示讓組件決定,當(dāng)Web應(yīng)用程序的根目錄存在另存文件的目錄時(shí),它會(huì)選擇SAVEAS_VIRTUAL,否則會(huì)選擇SAVEAS_PHYSICAL。
    例如,saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)執(zhí)行后若Web服務(wù)器安裝在C盤(pán),則另存的文件名實(shí)際是c:\upload\sample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)執(zhí)行后若Web應(yīng)用程序的根目錄是webapps/jspsmartupload,則另存的文件名實(shí)際是webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip",SAVEAS_AUTO)執(zhí)行時(shí)若Web應(yīng)用程序根目錄下存在upload目錄,則其效果同saveAs("/upload/sample.zip",SAVEAS_VIRTUAL),否則同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)。
    建議:對(duì)于Web程序的開(kāi)發(fā)來(lái)說(shuō),最好使用SAVEAS_VIRTUAL,以便移植。
    2、isMissing
    作用:這個(gè)方法用于判斷用戶是否選擇了文件,也即對(duì)應(yīng)的表單項(xiàng)是否有值。選擇了文件時(shí),它返回false。未選文件時(shí),它返回true。
    原型:public boolean isMissing()
    3、getFieldName
    作用:取HTML表單中對(duì)應(yīng)于此上傳文件的表單項(xiàng)的名字。
    原型:public String getFieldName()
    4、getFileName
    作用:取文件名(不含目錄信息)
    原型:public String getFileName()
    5、getFilePathName
    作用:取文件全名(帶目錄)
    原型:public String getFilePathName
    6、getFileExt
    作用:取文件擴(kuò)展名(后綴)
    原型:public String getFileExt()
    7、getSize
    作用:取文件長(zhǎng)度(以字節(jié)計(jì))
    原型:public int getSize()
    8、getBinaryData
    作用:取文件數(shù)據(jù)中指定位移處的一個(gè)字節(jié),用于檢測(cè)文件等處理。
    原型:public byte getBinaryData(int index)。其中,index表示位移,其值在0到getSize()-1之間。
    ㈡ Files類
    這個(gè)類表示所有上傳文件的集合,通過(guò)它可以得到上傳文件的數(shù)目、大小等信息。有以下方法:
    1、getCount
    作用:取得上傳文件的數(shù)目。
    原型:public int getCount()
    2、getFile
    作用:取得指定位移處的文件對(duì)象File(這是com.jspsmart.upload.File,不是java.io.File,注意區(qū)分)。
    原型:public File getFile(int index)。其中,index為指定位移,其值在0到getCount()-1之間。
    3、getSize
    作用:取得上傳文件的總長(zhǎng)度,可用于限制一次性上傳的數(shù)據(jù)量大小。
    原型:public long getSize()
    4、getCollection
    作用:將所有上傳文件對(duì)象以Collection的形式返回,以便其它應(yīng)用程序引用,瀏覽上傳文件信息。
    原型:public Collection getCollection()
    5、getEnumeration
    作用:將所有上傳文件對(duì)象以Enumeration(枚舉)的形式返回,以便其它應(yīng)用程序?yàn)g覽上傳文件信息。
    原型:public Enumeration getEnumeration()
    ㈢ Request類
    這個(gè)類的功能等同于JSP內(nèi)置的對(duì)象request。只所以提供這個(gè)類,是因?yàn)閷?duì)于文件上傳表單,通過(guò)request對(duì)象無(wú)法獲得表單項(xiàng)的值,必須通過(guò)jspSmartUpload組件提供的Request對(duì)象來(lái)獲取。該類提供如下方法:
    1、getParameter
    作用:獲取指定參數(shù)之值。當(dāng)參數(shù)不存在時(shí),返回值為null。
    原型:public String getParameter(String name)。其中,name為參數(shù)的名字。
    2、getParameterValues
    作用:當(dāng)一個(gè)參數(shù)可以有多個(gè)值時(shí),用此方法來(lái)取其值。它返回的是一個(gè)字符串?dāng)?shù)組。當(dāng)參數(shù)不存在時(shí),返回值為null。
    原型:public String[] getParameterValues(String name)。其中,name為參數(shù)的名字。
    3、getParameterNames
    作用:取得Request對(duì)象中所有參數(shù)的名字,用于遍歷所有參數(shù)。它返回的是一個(gè)枚舉型的對(duì)象。
    原型:public Enumeration getParameterNames()
    ㈣ SmartUpload類這個(gè)類完成上傳下載工作。
    A.上傳與下載共用的方法:
    只有一個(gè):initialize。
    作用:執(zhí)行上傳下載的初始化工作,必須第一個(gè)執(zhí)行。
    原型:有多個(gè),主要使用下面這個(gè):
    public final void initialize(javax.servlet.jsp.PageContext pageContext)
    其中,pageContext為JSP頁(yè)面內(nèi)置對(duì)象(頁(yè)面上下文)。
    B.上傳文件使用的方法:
    1、upload
    作用:上傳文件數(shù)據(jù)。對(duì)于上傳操作,第一步執(zhí)行initialize方法,第二步就要執(zhí)行這個(gè)方法。
    原型:public void upload()
    2、save
    作用:將全部上傳文件保存到指定目錄下,并返回保存的文件個(gè)數(shù)。
    原型:public int save(String destPathName)
    和public int save(String destPathName,int option)
    其中,destPathName為文件保存目錄,option為保存選項(xiàng),它有三個(gè)值,分別是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。(同F(xiàn)ile類的saveAs方法的選項(xiàng)之值類似)SAVE_PHYSICAL指示組件將文件保存到以操作系統(tǒng)根目錄為文件根目錄的目錄下,SAVE_VIRTUAL指示組件將文件保存到以Web應(yīng)用程序根目錄為文件根目錄的目錄下,而SAVE_AUTO則表示由組件自動(dòng)選擇。
    注:save(destPathName)作用等同于save(destPathName,SAVE_AUTO)。
    3、getSize
    作用:取上傳文件數(shù)據(jù)的總長(zhǎng)度
    原型:public int getSize()
    4、getFiles
    作用:取全部上傳文件,以Files對(duì)象形式返回,可以利用Files類的操作方法來(lái)獲得上傳文件的數(shù)目等信息。
    原型:public Files getFiles()
    5、getRequest
    作用:取得Request對(duì)象,以便由此對(duì)象獲得上傳表單參數(shù)之值。
    原型:public Request getRequest()
    6、setAllowedFilesList
    作用:設(shè)定允許上傳帶有指定擴(kuò)展名的文件,當(dāng)上傳過(guò)程中有文件名不允許時(shí),組件將拋出異常。
    原型:public void setAllowedFilesList(String allowedFilesList)
    其中,allowedFilesList為允許上傳的文件擴(kuò)展名列表,各個(gè)擴(kuò)展名之間以逗號(hào)分隔。如果想允許上傳那些沒(méi)有擴(kuò)展名的文件,可以用兩個(gè)逗號(hào)表示。例如:setAllowedFilesList("doc,txt,,")將允許上傳帶doc和txt擴(kuò)展名的文件以及沒(méi)有擴(kuò)展名的文件。
    7、setDeniedFilesList
    作用:用于限制上傳那些帶有指定擴(kuò)展名的文件。若有文件擴(kuò)展名被限制,則上傳時(shí)組件將拋出異常。
    原型:public void setDeniedFilesList(String deniedFilesList)
    其中,deniedFilesList為禁止上傳的文件擴(kuò)展名列表,各個(gè)擴(kuò)展名之間以逗號(hào)分隔。如果想禁止上傳那些沒(méi)有擴(kuò)展名的文件,可以用兩個(gè)逗號(hào)來(lái)表示。例如:setDeniedFilesList("exe,bat,,")將禁止上傳帶exe和bat擴(kuò)展名的文件以及沒(méi)有擴(kuò)展名的文件。
    8、setMaxFileSize
    作用:設(shè)定每個(gè)文件允許上傳的最大長(zhǎng)度。
    原型:public void setMaxFileSize(long maxFileSize)
    其中,maxFileSize為為每個(gè)文件允許上傳的最大長(zhǎng)度,當(dāng)文件超出此長(zhǎng)度時(shí),將不被上傳。
    9、setTotalMaxFileSize
    作用:設(shè)定允許上傳的文件的總長(zhǎng)度,用于限制一次性上傳的數(shù)據(jù)量大小。
    原型:public void setTotalMaxFileSize(long totalMaxFileSize)
    其中,totalMaxFileSize為允許上傳的文件的總長(zhǎng)度。
    C.下載文件常用的方法
    1、setContentDisposition
    作用:將數(shù)據(jù)追加到MIME文件頭的CONTENT-DISPOSITION域。jspSmartUpload組件會(huì)在返回下載的信息時(shí)自動(dòng)填寫(xiě)MIME文件頭的CONTENT-DISPOSITION域,如果用戶需要添加額外信息,請(qǐng)用此方法。
    原型:public void setContentDisposition(String contentDisposition)
    其中,contentDisposition為要添加的數(shù)據(jù)。如果contentDisposition為null,則組件將自動(dòng)添加"attachment;",以表明將下載的文件作為附件,結(jié)果是IE瀏覽器將會(huì)提示另存文件,而不是自動(dòng)打開(kāi)這個(gè)文件(IE瀏覽器一般根據(jù)下載的文件擴(kuò)展名決定執(zhí)行什么操作,擴(kuò)展名為doc的將用word程序打開(kāi),擴(kuò)展名為pdf的將用acrobat程序打開(kāi),等等)。
    2、downloadFile
    作用:下載文件。
    原型:共有以下三個(gè)原型可用,第一個(gè)最常用,后兩個(gè)用于特殊情況下的文件下載(如更改內(nèi)容類型,更改另存的文件名)。
    ① public void downloadFile(String sourceFilePathName)
    其中,sourceFilePathName為要下載的文件名(帶目錄的文件全名)
    ② public void downloadFile(String sourceFilePathName,String contentType)
    其中,sourceFilePathName為要下載的文件名(帶目錄的文件全名),contentType為內(nèi)容類型(MIME格式的文件類型信息,可被瀏覽器識(shí)別)。
    ③ public void downloadFile(String sourceFilePathName,String contentType,String destFileName)
    其中,sourceFilePathName為要下載的文件名(帶目錄的文件全名),contentType為內(nèi)容類型(MIME格式的文件類型信息,可被瀏覽器識(shí)別),destFileName為下載后默認(rèn)的另存文件名。

    posted @ 2008-08-26 16:12 南山隱士 閱讀(247) | 評(píng)論 (0)編輯 收藏
    現(xiàn)在想要獲得在特定時(shí)間或者指定時(shí)間執(zhí)行相應(yīng)功能
    有兩種做法
    在applicationContext.xml中寫(xiě)入如下Bean
    <bean id="repeatingTrigger"
       class="org.springframework.scheduling.timer.ScheduledTimerTask">
       <!--啟動(dòng)一秒后執(zhí)行 -->
       <property name="delay">
        <value>1000</value>
       </property>
       <!--每隔一小時(shí)執(zhí)行一次 -->
       <property name="period">
        <value>3600000</value>
       </property>
       <!--注入要監(jiān)控的javaBean -->
       <property name="timerTask">
        <ref bean="task" />
       </property>
       <!--類型是否為fixedRate型,默認(rèn)為fixedDelay-->
       <property name="fixedRate">
        <value>true</value>
       </property>


    </bean>
    <bean id="scheduler"
       class="org.springframework.scheduling.timer.TimerFactoryBean">
       <property name="scheduledTimerTasks">
        <list>
         <ref bean="repeatingTrigger" />
        </list>
       </property>
    </bean>

    <bean id="task" class="com.css.wam.portlet.SampleTask">
       <property name="workService">
        <ref bean="workService" />
       </property>
       <property name="work">
        <ref bean="work" />
       </property>
    </bean>

    然后寫(xiě)SampleTask類,如下:

     

    package com.css.wam.portlet;

     

    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Iterator;
    import java.util.List;
    import java.util.TimerTask;

     

     

    import javax.servlet.ServletContext; 字串2

    import org.apache.jetspeed.security.SecurityException; 字串9

    import com.css.wam.service.WorkService; 字串1

    @SuppressWarnings("unused")
    class SampleTask extends TimerTask{    字串2

        private static final int C_SCHEDULE_HOUR = 23;//設(shè)置指定時(shí)間
        private WorkService workService;
        private List users;
        private List teams;
        private WorkPortlet work;
       
        public void setWorkService(WorkService workService) {
       this.workService = workService;
    } 字串7

    public void setWork(WorkPortlet work) {
       this.work = work;
    } 字串4

        public SampleTask(){
        }
       
        @SuppressWarnings("unchecked")
    public void run() {
       
            Calendar cal = Calendar.getInstance();
            try {
              users = work.getUsers();
              teams = new ArrayList();
           for(Iterator it = users.iterator(); it.hasNext();)
           {
            String teamname = work.getGroupsByUser((String)it.next());
            teams.add(teamname);
           }
                //查看當(dāng)前時(shí)間與指定是否一致,一致則執(zhí)行任務(wù)
                 if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY) ) 字串6
                     workService.autoWorkOff(users, teams);    字串8

            } catch (SecurityException e) {
         e.printStackTrace();
        }
          }
    }

    posted @ 2008-06-25 17:14 南山隱士 閱讀(1398) | 評(píng)論 (0)編輯 收藏
    /*
    * @(#)BeanXML.java 1.00 2005-10-7
    *
    * Copyright 2005 BeanSoft Studio. All rights reserved.
    * PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
    */
    package beansoft.xml;

    import java.beans.XMLDecoder;
    import java.beans.XMLEncoder;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.UnsupportedEncodingException;

    /**
    * BeanXML
    *
    * Chinese documents:
    *
    * @author BeanSoft
    * @version 1.00 2005-10-7
    */
    public class BeanXML {
    /**
    * 使用 java.beans.XMLEncoder 將 對(duì)象編碼為 XML.
    * @param bean 對(duì)象
    * @return String - 編碼后的 XML
    */
    public static String encodeBean(Object bean) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    XMLEncoder encoder = new XMLEncoder(out);
    encoder.writeObject(bean);
    encoder.close();

    return out.toString();
    }

    /**
    * 使用 java.beans.XMLDecoder 將 XML 解碼為 對(duì)象.
    * @param xml - 編碼后的 XML
    * @return Object 反編碼后的對(duì)象
    */
    public static Object decodeBean(String xml) {
    try {
    // FIXME 必須使用 GBK 解碼才對(duì), 否則出來(lái)的文字是亂碼?
    XMLDecoder decoder = new XMLDecoder(new ByteArrayInputStream(xml.getBytes("GBK")));
    return decoder.readObject();
    } catch (UnsupportedEncodingException e) {
    }

    return null;
    }
    }
    posted @ 2008-06-25 16:12 南山隱士 閱讀(1943) | 評(píng)論 (0)編輯 收藏
    僅列出標(biāo)題  下一頁(yè)
    主站蜘蛛池模板: 手机在线毛片免费播放| 不卡视频免费在线观看| A级毛片内射免费视频| 亚洲国产成人91精品| 最近最新高清免费中文字幕| 亚洲va在线va天堂va四虎| 成年免费a级毛片免费看无码| 国产综合亚洲专区在线| GOGOGO免费观看国语| 亚洲爱情岛论坛永久| 大学生一级毛片免费看| 亚洲国产成人AV在线播放| 日本一道本高清免费| 一级女人18片毛片免费视频| 亚洲精品无码久久久久去q | 免费影院未满十八勿进网站| 亚洲一区二区三区高清视频| 大学生a级毛片免费观看| 亚洲精品无码专区| 亚洲国产精品人人做人人爽| 91成人免费观看在线观看| 亚洲av无码乱码国产精品fc2| 18以下岁毛片在免费播放| 狠狠色香婷婷久久亚洲精品| 国产日产成人免费视频在线观看| 少妇亚洲免费精品| 亚洲欧洲国产日韩精品| 免费a级毛片高清视频不卡| 日本亚洲高清乱码中文在线观看| 黑人大战亚洲人精品一区| 久草视频在线免费看| 亚洲偷自拍另类图片二区| 国产亚洲精品无码拍拍拍色欲| 人妻丰满熟妇无码区免费| 亚洲精品宾馆在线精品酒店| 亚洲综合久久夜AV | 18禁免费无码无遮挡不卡网站| 日韩大片免费观看视频播放| 亚洲资源在线观看| 在线永久免费观看黄网站| 久久aⅴ免费观看|