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

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

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

    posts - 32,  comments - 3,  trackbacks - 0
      2010年2月4日

    發(fā)現(xiàn)現(xiàn)在幾乎所有的網(wǎng)站都對url中的漢字和特殊的字符,進(jìn)行了urlencode操作,也就是:

    http://hi.baidu.com/%BE%B2%D0%C4%C0%CF%C8%CB/creat/blog/

    這個(gè)樣子,中間%形式的,肯定就是我的登錄用戶名稱了吧。

    為什么對這些字符進(jìn)行了u的編碼形式,是為了字符編碼(gbk、utf8)還是為了不出現(xiàn)特殊的字符在url中?都知道要轉(zhuǎn),但是轉(zhuǎn)了的真正好處呢。查看了網(wǎng)上的很多資料,也沒有找到更加準(zhǔn)確的說法。

    url轉(zhuǎn)義其實(shí)也只是為了符合url的規(guī)范而已。因?yàn)樵跇?biāo)準(zhǔn)的url規(guī)范中中文和很多的字符是不允許出現(xiàn)在url中的。

    看一下php的urlencode的說明了。

    urlencode — 編碼 URL 字符串

    string urlencode ( string $str )

    返回字符串,此字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(%)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(+)。此編碼與 WWW 表單 POST 數(shù)據(jù)的編碼方式是一樣的,同時(shí)與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣。由于歷史原因,此編碼在將空格編碼為加號(+)方面與 RFC1738 編碼(參見 rawurlencode())不同。此函數(shù)便于將字符串編碼并將其用于 URL 的請求部分,同時(shí)它還便于將變量傳遞給下一頁。

    標(biāo)準(zhǔn)的英文說明是:

    "...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

    那哪些字符是需要轉(zhuǎn)化的呢?

    1. ASCII 的控制字符

    這些字符都是不可打印的,自然需要進(jìn)行轉(zhuǎn)化。

    2. 一些非ASCII字符

    這些字符自然是非法的字符范圍。轉(zhuǎn)化也是理所當(dāng)然的了。

    3. 一些保留字符

    很明顯最常見的就是“&”了,這個(gè)如果出現(xiàn)在url中了,那你認(rèn)為是url中的一個(gè)字符呢,還是特殊的參數(shù)分割用的呢?

    4. 就是一些不安全的字符了。

    例如:空格。為了防止引起歧義,需要被轉(zhuǎn)化為“+”。

    明白了這些,也就知道了為什么需要轉(zhuǎn)化了,而轉(zhuǎn)化的規(guī)則也是很簡單的。

    按照每個(gè)字符對應(yīng)的字符編碼,不是符合我們范圍的,統(tǒng)統(tǒng)的轉(zhuǎn)化為%的形式也就是了。自然也是16進(jìn)制的形式。

    和字符編碼無關(guān)

    通過urlencode的轉(zhuǎn)化規(guī)則和目的,我們也很容易的看出,urleocode是基于字符編碼的。同樣的一個(gè)漢字,不同的編碼類型,肯定對應(yīng)不同的urleocode的串。gbk編碼的有g(shù)bk的encode結(jié)果。

    apache等服務(wù)器,接受到字符串后,可以進(jìn)行decode,但是還是無法解決編碼的問題。編碼問題,還是需要靠約定或者字符編碼的判斷解決。

    因此,urleocode只是為了url中一些非ascii字符,可以正確無誤的被傳輸,至于使用哪種編碼,就不是eocode所關(guān)心和解決的問題了。

    編碼問題,不是urlencode所要解決的。
    轉(zhuǎn)自:http://apps.hi.baidu.com/share/detail/32230450

    參考資料:

    http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

    http://cn.php.net/manual/zh/function.urlencode.php

     

     

     

    posted @ 2011-08-10 13:16 donghang73 閱讀(10422) | 評論 (0)編輯 收藏

    在文件夾選項(xiàng)里改了驅(qū)動器或文件夾的圖標(biāo),發(fā)現(xiàn)雙擊打開硬盤變成了搜索

    解決方法:

    運(yùn)行
    regsvr32 /i shell32.dll

    解決!

    posted @ 2011-08-05 10:27 donghang73 閱讀(242) | 評論 (0)編輯 收藏
    //首先在HEAD區(qū)加入要引用的JS
    <head>
    <script type="text/javascript" src="FCKEditor/fckeditor.js"></script> 
    <script type="text/javascript" language="javascript">
    function check()
    {
       // 取得FCKEditor的值,GetInstance(arg),這里的參數(shù)arg是FCKeditor實(shí)例名;
       //如聲明FCKeditor用var oFCKeditor = new FCKeditor('FCKEditor1',500,200,'Board'),則此時(shí)arg就是FCKEditor1;
            var checkContent1 =FCKeditorAPI.GetInstance("FCKEditor1").GetXHTML();
            if (checkContent1 == "")
            {
               strErr += '評論內(nèi)容不能為空!\n\n';
        alert(strErr);
            }
    }
    </script>
    </head>
    <%-- 把這段寫在需要顯示FCKEditor編輯框的地方 --%>
    <div class="FCKeditor">
    <script type="text/javascript">
        var sBasePath = "FCKEditor/";
        var oFCKeditor = new FCKeditor('FCKEditor1',500,200,'Board'); //實(shí)例名為FCKEditor1
        oFCKeditor.BasePath = sBasePath ;
        oFCKeditor.Create() ;
    </script>
    </div>
    <%-- 用于提交內(nèi)容的按鈕,響應(yīng)點(diǎn)擊事件為 check() --%>
    <input id="Button1" value="button" type="button" onclick="check()" />
    轉(zhuǎn)自:http://hi.baidu.com/myaspdotnet/blog/item/0b73cd3f0ab9f3c77c1e714a.html
    posted @ 2011-05-27 22:21 donghang73 閱讀(228) | 評論 (0)編輯 收藏

    Google code 獲取密碼頁打不開的解決辦法

    # Project members authenticate over HTTPS to allow committing changes. 
    svn checkout https://yourprj.googlecode.com/svn/trunk/ yourprj --username youraccount

    When prompted, enter your generated googlecode.com password.

     

    在文件 C:\Windows\System32\drivers\etc\hosts 中加入 66.249.89.99 code.google.com

    posted @ 2011-04-17 17:25 donghang73 閱讀(1412) | 評論 (0)編輯 收藏

    1. 進(jìn)入http://code.google.com/ 用Google帳戶登錄(推薦使用gmail郵箱)。然后點(diǎn)擊>Project Hosting
    2. 進(jìn)入>> http://code.google.com/hosting/ 然后點(diǎn)擊>Create a new project
    3. 填入信息:
          寫入項(xiàng)目名,描述,兩個(gè)選擇項(xiàng)(不太明白啥意思)選第一個(gè)就好使,寫入標(biāo)簽,點(diǎn)擊確定。就可以了
    4. 提交成功后,選擇菜單的Source(其中有https上傳協(xié)議路徑需要拷貝一份,還有一個(gè)上傳密碼)。
    5. 打開MyEclipse,打開需要上傳的項(xiàng)目,點(diǎn)鼠標(biāo)右鍵->team->share Project->svn,寫入https路徑,下一步,輸入Google賬號和上傳密碼,起個(gè)名,finish。
    6.如果一切順利,會自動生成一個(gè)項(xiàng)目目錄,可以查看所有項(xiàng)目文件。然后進(jìn)入搭建項(xiàng)目界面,點(diǎn)鼠標(biāo)右鍵->team->commit。然后開始上傳項(xiàng)目。
    7.哦了,搭建完成。
    8.如果想查看自己的項(xiàng)目,可以用瀏覽器登陸https的路徑,輸入Google賬號和上傳密碼,如果成功就可以看到含有項(xiàng)目名稱的目錄。

    PS:
    需要注意的是,Google的SVN是強(qiáng)制開源的哦,如果不想開源又沒服務(wù)器的朋友開源選擇svnhost
    再PS:
    http地址是自讀權(quán)限的,供游客下載代碼,https是我們更新代碼的時(shí)候使用的

    轉(zhuǎn)自:http://hi.baidu.com/%C0%AF%B1%CA%B9%A4%D7%F7%CA%D2/blog/item/d6f6c6d7707d81d0a044df5f.html

    posted @ 2011-04-17 17:12 donghang73 閱讀(14577) | 評論 (2)編輯 收藏

    <property name="hibernate.hbm2ddl.auto" value="update" />

    Hibernate Reference Documentation解釋如下:
    hibernate.hbm2ddl.auto Automatically validate or export schema DDL to the database when the SessionFactory is created. With create-drop, the database schema will be dropped when the SessionFactory is closed explicitly.  eg. validate | update | create | create-drop

    這個(gè)參數(shù)的作用主要用于:自動創(chuàng)建|更新|驗(yàn)證數(shù)據(jù)庫表結(jié)構(gòu)。
    如果沒有此方面的需求建議不設(shè)置此屬性,默認(rèn)是不對數(shù)據(jù)庫結(jié)構(gòu)作任何改變

    其它幾個(gè)參數(shù)的意思:
    validate     
    每次加載hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu),只會和數(shù)據(jù)庫中的表進(jìn)行比較,不會創(chuàng)建新表,但是會插入新值。

    create
    每次加載hibernate時(shí)都會刪除上一次的生成的表,然后根據(jù)你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執(zhí)行,這就是導(dǎo)致數(shù)據(jù)庫表數(shù)據(jù)丟失的一個(gè)重要原因。

    create-drop
    每次加載hibernate時(shí)根據(jù)model類生成表,但是sessionFactory一關(guān)閉,表就自動刪除。

    update
    最常用的屬性,第一次加載hibernate時(shí)根據(jù)model類會自動建立起表的結(jié)構(gòu)(前提是先建立好數(shù)據(jù)庫),以后加載hibernate時(shí)根據(jù) model類自動更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會被馬上建立起來的,是要等 應(yīng)用第一次運(yùn)行起來后才會。

    posted @ 2011-04-17 16:53 donghang73 閱讀(559) | 評論 (0)編輯 收藏
         摘要: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> 1 <?xml version="1.0" encoding="ISO-8859-1"?>    2&nb...  閱讀全文
    posted @ 2011-04-16 17:18 donghang73 閱讀(2749) | 評論 (0)編輯 收藏

    Java中使用的路徑,分為兩種:絕對路徑和相對路徑。歸根結(jié)底,Java本質(zhì)上只能使用絕對路徑來尋找資源。所有的相對路徑尋找資源的方法,都不過是一些便利方法。不過是API在底層幫助我們構(gòu)建了絕對路徑,從而找到資源的!

    在開發(fā)Web方面的應(yīng)用時(shí), 經(jīng)常需要獲取 服務(wù)器中當(dāng)前WebRoot的物理路徑。

    如果是Servlet , Action , Controller, 或則Filter , Listener , 攔截器等相關(guān)類時(shí), 我們只需要獲得ServletContext, 然后通過ServletContext.getRealPath("/")來獲取當(dāng)前應(yīng)用在服務(wù)器上的物理地址。

    如果在類中取不到ServletContext時(shí), 有兩種方式可以做到:

    1. 利用Java的類加載機(jī)制 調(diào)用 XXX.class.getClassLoader().getResource(""); 方法來獲取到ClassPath , 然后處理獲得WebRoot目錄,這種方式只能是該class在WebRoot/WEB-INF/classes下才能生效, 如果該class被打包到一個(gè)jar文件中, 則該方法失效。這時(shí)就應(yīng)該用下面一種方式。

    2. spring框架的思路, 在WEB-INF/web.xml中 , 創(chuàng)建一個(gè)webAppRootKey的param, 指定一個(gè)值(默認(rèn)為webapp.root)作為鍵值, 然后通過Listener , 或者Filter , 或者Servlet 執(zhí)行String webAppRootKey = getServletContext().getRealPath("/"); 并將webAppRootKey對應(yīng)的webapp.root 分別作為Key , Value寫到System Properties系統(tǒng)屬性中。之后在程序中通過System.getProperty("webapp.root")來獲得WebRoot的物理路 徑。

    根據(jù)第二種的思路,我們還可以再擴(kuò)展一下。不過對于在部署在一臺服務(wù)器中的應(yīng)用來說,若還不是你所需請?jiān)偻驴础?/p>

    下面是一些得到classpath和當(dāng)前類的絕對路徑的一些方法。你可使用其中的一些方法來得到你需要的資源的絕對路徑:

    1. DebitNoteAction.class.getResource("")

    得到的是當(dāng)前類FileTest.class文件的URI目錄。不包括自己!

    如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

    atacarnet/src/com/evi/modules/atacarnet/action/

    2. DebitNoteAction.class.getResource("/")

    得到的是當(dāng)前的classpath的絕對URI路徑。

    如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

    3. Thread.currentThread().getContextClassLoader().getResource("")

    得到的也是當(dāng)前ClassPath的絕對URI路徑

    如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

    4. DebitNoteAction.class.getClassLoader().getResource("") 或ClassLoader.getSystemResource("")

    得到的也是當(dāng)前ClassPath的絕對URI路徑。

    如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

    5. 取得服務(wù)器相對路徑

    System.getProperty("user.dir")

    例如:E:\apache-tomcat-5.5.16\apache-tomcat-5.5.16\bin

    我推薦使用Thread.currentThread().getContextClassLoader().getResource("")來得到當(dāng)前的classpath的絕對路徑的URI表示法

    6. 取得項(xiàng)目中的絕對路徑

    一般用request.getRealPath("/")或request.getRealPath("/config/")

    但現(xiàn)在不提倡使用request.getRealPath("/")了,大家可試用ServletContext.getRealPath("/")方法得到Web應(yīng)用程序的根目錄的絕對路徑

    要取得src的文件非常容易,因?yàn)閟rc是默認(rèn)的相對目錄,比如你說要取得src下com目錄的test.java文件,你只需要這樣就夠了

    File f = new File(com/test.java);

    但如果我要取得不在src目錄或者WebRoot目錄下的文件呢,而是要從src或者WebRoot同級的目錄中取呢,比如說doc吧

    我的硬方法是這樣實(shí)現(xiàn)的:

    String path = this.getServletContext().getRealPath("/");

    Properties p = new Properties();

    p.load(new FileInputStream(new File(path.substring(0,(path.lastIndexOf("\\WebRoot ") + 1)) + "doc/db.properties")));

    System.out.println(p.getProperty("driverName"));

    轉(zhuǎn)自:http://blog.csdn.net/c5153000/archive/2011/03/23/6272195.aspx

    posted @ 2011-04-15 17:25 donghang73 閱讀(821) | 評論 (0)編輯 收藏
    啥也不說了,看圖吧
    posted @ 2011-03-02 16:12 donghang73 閱讀(385) | 評論 (0)編輯 收藏
     

        有很多時(shí)候,我們刪除文件,系統(tǒng)會提示找不到指定的文件。但是你可以看到文件在硬盤里面,這個(gè)問題需要怎么解決呢?一般情況下,我們可以使用軟件解決。不過推薦使用DOS命令,找不到指定文件通常使用一下方法解決。
      1、新建一個(gè)文本文檔,寫入(直接復(fù)制粘貼)下列命令:
      DEL /F /A /Q \\?\%1  
          RD /S /Q \\?\%1
      
       
    2、另存為:刪除OK.bat
      3、建好后,把要刪除的文件或者目錄直接拖放到這個(gè)bat文件圖標(biāo)上就可以刪除了,一切OK!
      ------------------------------------------------------------------------------------------------

      在說另種方法,提供刪除方法(以刪除c "xxxxxx..."文件夾為例),在執(zhí)行刪除動作時(shí),提示文件夾無法刪除,找不到指定路徑
      解決方法:由于該文件夾真正的名稱為"xxxxxx..."" 所以我們就必須寫對文件名.
      操作:開始運(yùn)行輸入“cmd”回車——輸入“C: ”回車輸入 RMDIR    空格 C:"xxxxxx..."    空格 /S 空格 /Q    回車即可刪除。
      注意:需要刪除其他類似文件,把盤符和xxxxxx...改為你電腦里面的盤符和文件名即可!
      或新建記事本,在記事本寫入:RMDIR 空格文件夾" /S /Q    保存(保存前把文件夾改為你要刪除文件夾的名稱)退出把記事本的后綴名改成“bat”(如:新建文本文檔.txt   改成新文本文檔 .bat)然后剪切到你要刪除文件夾所在的目錄,最后點(diǎn)擊你粘貼過來的文件-->運(yùn)行就OK
          ==================================================

    posted @ 2011-03-02 15:57 donghang73 閱讀(453) | 評論 (0)編輯 收藏
    一、windows中虛擬Linux

    1.Linux安裝增強(qiáng)功能

    2.VirtualBox 分配數(shù)據(jù)空間

    3.Linux中建共享文件夾掛載的目錄(如mkdir /mnt/share)

    4.linux掛載共 享文件夾(sudo mount –t vboxsf [設(shè)置的共享文件夾名稱]  /mnt/share)

    二、Linux中虛擬windows

    1.windows安裝增強(qiáng)功能

    2.VirtualBox分配數(shù)據(jù)空間

    3.windows 中我的電腦右鍵-映射網(wǎng)絡(luò)驅(qū)動器-瀏覽-選中分配的共享文件夾

    posted @ 2010-08-09 23:12 donghang73 閱讀(216) | 評論 (0)編輯 收藏
         摘要: 最近用到了JFreeChart,現(xiàn)將實(shí)例代碼貼出來,大家可以參考一下,代碼中如有錯(cuò)誤或可以改進(jìn)的地方,還請大家指正。 通過下面的代碼,可以很清晰地看出JFreeChart的結(jié)構(gòu),核心即為chart, plot, XXXAxis, renderer,了解了它們的常用方法后, 會發(fā)現(xiàn)其實(shí)JFreeChart使用起來是很簡單方便的。廢話不多說了,還是直接看示例吧。   1.柱狀圖 ...  閱讀全文
    posted @ 2010-07-25 22:44 donghang73 閱讀(4476) | 評論 (1)編輯 收藏
    1,apache_2.0.63-win32-x86-no_ssl.msi
    下載:http://apache.mirror.phpchina.com/httpd/binaries/win32/apache_2.0.63-win32-x86-no_ssl.msi
    2,svn-1.4.5-setup.exe
    下載地址:http://subversion.tigris.org/files/documents/15/39559/svn-1.4.5-setup.exe
    當(dāng)然,你也可以選擇安裝TortoiseSVN.但是我沒有裝,因?yàn)槲业脑创a管理都是用netbeans完成的.

    好了,準(zhǔn)備的兩個(gè)軟件都下載下來以后,就可以開始安裝了.
    首先安裝apache,一般來說直接點(diǎn)下一步就可以了,在設(shè)置domain以及host的時(shí)候,設(shè)置為localhost就可以了,Email你可以填你自己的Email,也可以隨便填一個(gè).安裝apache要注意的是,你的電腦上80端口不能被占用, 否則你的http服務(wù)是啟動不起來的,我就遇到過這事,因?yàn)槲矣昧藄kype,它在本機(jī)上打開了80和443端口來監(jiān)聽,搞得我一開始裝不好,總是啟動不起來,后來才發(fā)現(xiàn)是skype占用了80端口,于是把skype的設(shè)置改了以后,重裝apache才成功.裝好apache以后,這個(gè)時(shí)候,它已經(jīng)在運(yùn)行了,你可以在瀏覽器的地址欄輸入http://localhost看看,是否安裝成功,如果安裝成功的話,這個(gè)時(shí)候?yàn)g覽器里面應(yīng)該是可以看到一個(gè)頁面的.
    然后,再安裝svn-1.4.5-setup.exe,也很簡單,一步一步點(diǎn)下步就可以了, 在安裝的過程中,它會默認(rèn)選中一些選項(xiàng),其中就有一個(gè)是是否對apache的HTTP服務(wù)器提供支持的選項(xiàng),這個(gè)默認(rèn)是勾上的,不要去反選它,其它的你可以反選掉.然后svn就宣布安裝成功了.你可以到CMD下面去試一下svn這個(gè)命令,如果有輸出,則說明安裝成功了,如果提示svn 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件。那就說明沒有裝好.或者沒有把這個(gè)命令加入到path中,所以最好的辦法是到svn的安裝目錄下的 bin里面去看一下.
    兩者都裝好了以后,就開始配置,當(dāng)然,配置也是最重要的.
    首先要建立一個(gè)數(shù)據(jù)倉庫,我們假設(shè)建在E盤,數(shù)據(jù)倉庫最好不要建在C盤,因?yàn)镃盤重裝系統(tǒng)以后就格了.我們先在E盤下面建立一個(gè)目錄叫svnroot,然后在svnroot下面再建立一個(gè)我們專門放我們工程的目錄,比如叫MyProject.于是我們在E盤下面就有了這個(gè)一個(gè)文件夾:E:\svnroot\MyProject, 然后我們用svnadmin的命令,使這個(gè)文件夾變成我們的數(shù)據(jù)倉庫,命令如下:
    svnadmin create E:\svnroot\MyProject
    如果運(yùn)行成功的話,什么也沒有輸出,這個(gè)時(shí)候,我們再來到MyProject文件夾下面,我們會發(fā)現(xiàn)多了幾個(gè)文件夾和文件,我們打開conf文件夾,然后再打開svnserve.conf文件,找到如下行# password-db = passwd,然后把它前面的#去掉,表示MyProject是需要密碼驗(yàn)證的.但是我們密碼設(shè)在哪里呢,這個(gè)時(shí)候我們再打開conf文件夾下面的 passwd文件,用文本編輯器打開,在[users]下面加上我們需要啟動的人員的用戶和密碼,比如
    [users]
    hadeslee=hadeslee1234
    tom=123456

    這個(gè)的話,我們就啟動了兩個(gè)用戶,一個(gè)叫hadeslee,密碼是hadeslee1234,一個(gè)叫tom,密碼是123456.然后我們保存passwd文件.然后,我們再建一個(gè)文件,叫access.auth,這個(gè)文件是設(shè)置訪問權(quán)限的,里面內(nèi)容如下:
    [MyProject:/]
    hadeslee = rw
    [MyProject:/module1]
    tom=rw
    hadeslee=rw

    這表示,MyProject下面的所有子目錄hadeslee都是有權(quán)限讀寫的,但是tom只有權(quán)限讀寫此項(xiàng)目下面的module1目錄,這個(gè)各自的訪問權(quán)限就分的更細(xì)致了.有關(guān)于MyProject文件夾下面的設(shè)置,我們就告一段落了,我們現(xiàn)在開始設(shè)置apache,使它能和subvertion一起工作.

    首先來到Subersion的安裝目錄,進(jìn)入它的bin目錄,我們會發(fā)現(xiàn)如下兩個(gè)文件:
    mod_authz_svn.so
    mod_dav_svn.so

    我們把這兩個(gè)文件復(fù)制一下,粘帖到 apache的安裝目錄下的modules文件中,然后我們再打開apache安裝目錄下的conf文件夾,打開httpd.conf文件.增加如下兩行:
    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule authz_svn_module modules/mod_authz_svn.so

    注意,由于dav_svn需要dav_module的支持,所以要確保下面這一行沒有被注釋,并且保證在dav_svn之前加載:
    LoadModule dav_module modules/mod_dav.so
    然后模塊的設(shè)置就完成了,下面我們要設(shè)置SVN的目錄,以使我們的apache能知道訪問不同的URL的時(shí)候,它去哪里尋找這個(gè)URL所對應(yīng)的SVN目錄.
    httpd.conf文件中,增加如下內(nèi)容:
    <Location /svn/MyProject>
    DAV svn
    SVNPath E:/svnroot/MyProject

    AuthzSVNAccessFile E:/svnroot/MyProject/conf/access.auth
    Satisfy Any
    Require valid-user

    AuthType Basic
    AuthName "Subversion repositories"
    AuthUserFile  E:/svnroot/MyProject/conf/users.auth
    Require valid-user
    </Location>


    添加完上面這些,我們會發(fā)現(xiàn)access.auth是我們剛才新建的,可是users.auth我們并沒有新建啊.怎么就把它加進(jìn)去了.不要急,現(xiàn)在我們就來生成users.auth文件.

    進(jìn)入 apache的安裝目錄的bin文件夾,輸入如下命令:

    D:\Program Files\Apache Group\Apache2\bin>htpasswd -cb users.auth hadeslee hadeslee1234
    Automatically using MD5 format.
    Adding password for user hadeslee

    D:\Program Files\Apache Group\Apache2\bin>

    我們就會發(fā)現(xiàn)在bin目錄生成了users.auth,我們可以看到,hadeslee用戶名已經(jīng)被添加進(jìn)去了,密碼是用MD5加密過的.然后我們還要增加用戶呢,可以用如下方法:
    D:\Program Files\Apache Group\Apache2\bin>htpasswd -b users.auth tom 123456
    Automatically using MD5 format.
    Adding password for user tom

    D:\Program Files\Apache Group\Apache2\bin>


    只是在生成密碼的時(shí)候,小了一個(gè)c的參數(shù),因?yàn)閏表示重新生成一個(gè)這樣的文件,我們第一次的時(shí)候是要加的,后面我們要添加用戶的時(shí)候,就不用這個(gè)c了.然后打開users.auth,會發(fā)現(xiàn)兩個(gè)用戶都已經(jīng)在里面了,這個(gè)時(shí)候,我們把users.auth移到E:/svnroot/MyProject/conf/里面去,使我們上面的設(shè)置生效.

    這個(gè)時(shí)候,我們的設(shè)置就完成了.可以在瀏覽器里面輸入http://localhost/svn/MyProject試試看.

    如果以后我們還要加入其它的項(xiàng)目呢,可以有兩點(diǎn)解決方式
    1,把以后的項(xiàng)目也導(dǎo)入到我們的MyProject的倉庫中,這個(gè)的話,就不用改什么配置了
    2,新建一個(gè)數(shù)據(jù)倉庫,然后只要按上面的步驟,把新的<Location...>設(shè)置放到 httpd.conf里面就可以了.
    當(dāng)然,驗(yàn)證文件,訪問權(quán)限文件,還有訪問SVN的密碼都要自己按上面的方法再設(shè)一遍.

    祝大家能夠設(shè)置成功:)

    轉(zhuǎn)自:http://www.tkk7.com/hadeslee/archive/2008/03/12/185788.html
    posted @ 2010-07-25 22:17 donghang73 閱讀(224) | 評論 (0)編輯 收藏
    1、下載jadclipse插件
    注意:jadclipse_3.1.0.jar版本,該版本支持eclipse3.1M6~3.2M2
          jadclipse_3.2.0.jar版本,該版本支持eclipse3.2M3和eclipse3.2M4.
          jadclipse_3.2.4.jar版本,該版本支持eclipse3.2M5~3.3M5
          jadclipse_3.3.0.jar版本,該版本支持eclipse3.3M6及以上

    2、下載jad.exe,并將下載好的jad.exe拷貝到j(luò)re的bin的目錄下,或者把jad的執(zhí)行文件的絕對路徑加入到環(huán)境變量PATH中。

    3、配置jadClipse,在在%ECLIPSE_HOME%\目錄下建立myplugins\jadclipse\eclipse\plugins的目錄結(jié)構(gòu),將jadclipse_3.3.0.jar(用于Eclipse3.5)放到plugins目錄下面,再在%ECLIPSE_HOME%\links目錄下面建立jadclipse.link的文件(名字可以隨便取),jadclipse.link的內(nèi)容為:path=..\\jadclipse(注意一定要雙反斜杠"\\")

    4、重新啟動eclipse,查看 window->preferences->java->jadClipse,如果出現(xiàn)jadClipse則說明上述配置成功,否則檢查上述配置。

    5、Path to decomplier:指定反編譯工具的jad文件所在的位置。(可以指定為jre的bin的目錄下的jad.exe)

    6、把*.class文件的associated editors設(shè)置為jadClipse Class File Viewer做為默認(rèn)項(xiàng)


    另:批量反編譯
    在cmd中,進(jìn)入到class文件所在路徑下,輸入命令:jad -o -r -s java -d src *.class
           參數(shù)的含義:
           -o:覆蓋舊文件,而且不用提示確認(rèn)。
           -r:重新加載生成包結(jié)構(gòu)。
           -s:定義輸出文件的擴(kuò)展名。jad為默認(rèn)擴(kuò)展名,我們反編譯后當(dāng)然是要.java源文件了。
           -d:輸出文件的目錄。src表示反編譯后的所有文件都放在src目錄下。
           *.class:指定解析該文件夾下的所有以.class結(jié)尾的文件,即解析class文件
    posted @ 2010-07-22 22:05 donghang73 閱讀(1023) | 評論 (0)編輯 收藏

    myeclipseUTF-8設(shè)置

       如果要使插件開發(fā)應(yīng)用能有更好的國際化支持,能夠最大程度的支持中文輸出,則最好使 Java文件使用UTF-8編碼。然而,Eclipse工作空間(workspace)的缺省字符編碼是操作系統(tǒng)缺省的編碼,簡體中文操作系統(tǒng) (Windows XPWindows 2000簡體中文)的缺省編碼是GB18030,在此工作空間中建立的工程編碼是GB18030,工程中建立的java文件也是GB18030。如果要使 新建立工程、java文件直接使UTF-8則需要做以下工作:

     

    1windows->Preferences...打開"首選項(xiàng)"對話框,左側(cè)導(dǎo)航樹,導(dǎo)航到general->Workspace,右 側(cè)Text file encoding,選擇Other,改變?yōu)?/span>UTF-8,以后新建立工程其屬性對話框中的Text file encoding即為UTF-8


    2windows->Preferences...打開"首選項(xiàng)"對話框,左側(cè)導(dǎo)航樹,導(dǎo)航到general->Content Types,右側(cè)Context Types樹,點(diǎn)開Text,選擇Java Source File,在下面的Default encoding輸入框中輸入UTF-8,點(diǎn)Update,則設(shè)置Java文件編碼為UTF-8。其他java應(yīng)用開發(fā)相關(guān)的文件 如:propertiesXML等已經(jīng)由Eclipse缺省指定,分別為ISO8859-1UTF-8,如開發(fā)中確需改變編碼格式則可以在此指定。


    3經(jīng)過上述兩步,新建java文件即為UTF-8編碼,Eclipse編譯、運(yùn)行、調(diào)試都沒問題,但是做RCP應(yīng)用的Product輸出時(shí)、或者插件 輸出時(shí),則總是出錯(cuò),要么不能編譯通過(輸出時(shí)要重新compile)、要么輸出的插件運(yùn)行時(shí)中文顯示亂碼。此時(shí)需要再RCP應(yīng)用、或插件Plugin 程的build.properties中增加一行,javacDefaultEncoding.. = UTF-8。讓輸出時(shí)編譯知道java源文件時(shí)UTF-8編碼。這個(gè)設(shè)置需要保證所有的java源文件時(shí)UTF-8編碼格式,如果不全是,可以參考 Eclipse幫中(Plug-in Development Environment Guide > Reference > Feature and Plug-in Build configuration),建議全部java源文件是UTF-8編碼。

       如果插件開發(fā)、RCP應(yīng)用開發(fā)原來基于其他編碼,如GB18030,想轉(zhuǎn)換為UTF-8,則首先,做以上工作;然后通過查找編碼轉(zhuǎn)換工具,如基于 iconv的批量轉(zhuǎn)換工具,將原編碼轉(zhuǎn)換為UTF-8編碼,注意只轉(zhuǎn)換java源文件,其他類型文件可能已經(jīng)是比較合適的編碼了;將原工程屬性中的 Text file encoding,從原編碼改為UTF-8即可。

    posted @ 2010-07-20 22:03 donghang73 閱讀(7960) | 評論 (0)編輯 收藏

    JFreeChart類:
    void setAntiAlias(boolean flag)    字體模糊邊界
    void setBackgroundImage(Image image)   背景圖片
    void setBackgroundImageAlignment(int alignment) 背景圖片對齊方式(參數(shù)常量在org.jfree.ui.Align類中定義)
    void setBackgroundImageAlpha(float alpha) 背景圖片透明度(0.0~1.0)
    void setBackgroundPaint(Paint paint)   背景色
    void setBorderPaint(Paint paint)   邊界線條顏色
    void setBorderStroke(Stroke stroke)   邊界線條筆觸
    void setBorderVisible(boolean visible)   邊界線條是否可見

    -----------------------------------------------------------------------------------------------------------

    TextTitle類:
    void setFont(Font font)     標(biāo)題字體
    void setPaint(Paint paint)    標(biāo)題字體顏色
    void setText(String text)    標(biāo)題內(nèi)容

    -----------------------------------------------------------------------------------------------------------

    StandardLegend(Legend)類:
    void setBackgroundPaint(Paint paint)   圖示背景色
    void setTitle(String title)    圖示標(biāo)題內(nèi)容
    void setTitleFont(Font font)    圖示標(biāo)題字體
    void setBoundingBoxArcWidth(int arcWidth) 圖示邊界圓角寬
    void setBoundingBoxArcHeight(int arcHeight) 圖示邊界圓角高
    void setOutlinePaint(Paint paint)   圖示邊界線條顏色
    void setOutlineStroke(Stroke stroke)   圖示邊界線條筆觸
    void setDisplaySeriesLines(boolean flag) 圖示項(xiàng)是否顯示橫線(折線圖有效)
    void setDisplaySeriesShapes(boolean flag) 圖示項(xiàng)是否顯示形狀(折線圖有效)
    void setItemFont(Font font)    圖示項(xiàng)字體
    void setItemPaint(Paint paint)    圖示項(xiàng)字體顏色
    void setAnchor(int anchor)    圖示在圖表中的顯示位置(參數(shù)常量在Legend類中定義)

    -----------------------------------------------------------------------------------------------------------

    Axis類:
    void setVisible(boolean flag)    坐標(biāo)軸是否可見
    void setAxisLinePaint(Paint paint)   坐標(biāo)軸線條顏色(3D軸無效)
    void setAxisLineStroke(Stroke stroke)   坐標(biāo)軸線條筆觸(3D軸無效)
    void setAxisLineVisible(boolean visible) 坐標(biāo)軸線條是否可見(3D軸無效)
    void setFixedDimension(double dimension) (用于復(fù)合表中對多坐標(biāo)軸的設(shè)置)
    void setLabel(String label)    坐標(biāo)軸標(biāo)題
    void setLabelFont(Font font)    坐標(biāo)軸標(biāo)題字體
    void setLabelPaint(Paint paint)    坐標(biāo)軸標(biāo)題顏色
    void setLabelAngle(double angle)`   坐標(biāo)軸標(biāo)題旋轉(zhuǎn)角度(縱坐標(biāo)可以旋轉(zhuǎn))
    void setTickLabelFont(Font font)   坐標(biāo)軸標(biāo)尺值字體
    void setTickLabelPaint(Paint paint)   坐標(biāo)軸標(biāo)尺值顏色
    void setTickLabelsVisible(boolean flag)   坐標(biāo)軸標(biāo)尺值是否顯示
    void setTickMarkPaint(Paint paint)   坐標(biāo)軸標(biāo)尺顏色
    void setTickMarkStroke(Stroke stroke)   坐標(biāo)軸標(biāo)尺筆觸
    void setTickMarksVisible(boolean flag)   坐標(biāo)軸標(biāo)尺是否顯示

    ValueAxis(Axis)類:
    void setAutoRange(boolean auto)    自動設(shè)置數(shù)據(jù)軸數(shù)據(jù)范圍
    void setAutoRangeMinimumSize(double size) 自動設(shè)置數(shù)據(jù)軸數(shù)據(jù)范圍時(shí)數(shù)據(jù)范圍的最小跨度
    void setAutoTickUnitSelection(boolean flag) 數(shù)據(jù)軸的數(shù)據(jù)標(biāo)簽是否自動確定(默認(rèn)為true)
    void setFixedAutoRange(double length)   數(shù)據(jù)軸固定數(shù)據(jù)范圍(設(shè)置100的話就是顯示MAXVALUE到MAXVALUE-100那段數(shù)據(jù)范圍)
    void setInverted(boolean flag)    數(shù)據(jù)軸是否反向(默認(rèn)為false)
    void setLowerMargin(double margin)   數(shù)據(jù)軸下(左)邊距
    void setUpperMargin(double margin)   數(shù)據(jù)軸上(右)邊距
    void setLowerBound(double min)    數(shù)據(jù)軸上的顯示最小值
    void setUpperBound(double max)    數(shù)據(jù)軸上的顯示最大值
    void setPositiveArrowVisible(boolean visible) 是否顯示正向箭頭(3D軸無效)
    void setNegativeArrowVisible(boolean visible) 是否顯示反向箭頭(3D軸無效)
    void setVerticalTickLabels(boolean flag) 數(shù)據(jù)軸數(shù)據(jù)標(biāo)簽是否旋轉(zhuǎn)到垂直
    void setStandardTickUnits(TickUnitSource source) 數(shù)據(jù)軸的數(shù)據(jù)標(biāo)簽(可以只顯示整數(shù)標(biāo)簽,需要將AutoTickUnitSelection設(shè)false)

    NumberAxis(ValueAxis)類:
    void setAutoRangeIncludesZero(boolean flag) 是否強(qiáng)制在自動選擇的數(shù)據(jù)范圍中包含0
    void setAutoRangeStickyZero(boolean flag) 是否強(qiáng)制在整個(gè)數(shù)據(jù)軸中包含0,即使0不在數(shù)據(jù)范圍中
    void setNumberFormatOverride(NumberFormat formatter) 數(shù)據(jù)軸數(shù)據(jù)標(biāo)簽的顯示格式
    void setTickUnit(NumberTickUnit unit)   數(shù)據(jù)軸的數(shù)據(jù)標(biāo)簽(需要將AutoTickUnitSelection設(shè)false)

    DateAxis(ValueAxis)類:
    void setMaximumDate(Date maximumDate)   日期軸上的最小日期
    void setMinimumDate(Date minimumDate)   日期軸上的最大日期
    void setRange(Date lower,Date upper)   日期軸范圍
    void setDateFormatOverride(DateFormat formatter) 日期軸日期標(biāo)簽的顯示格式
    void setTickUnit(DateTickUnit unit)   日期軸的日期標(biāo)簽(需要將AutoTickUnitSelection設(shè)false)
    void setTickMarkPosition(DateTickMarkPosition position) 日期標(biāo)簽位置(參數(shù)常量在org.jfree.chart.axis.DateTickMarkPosition類中定義)

    CategoryAxis(Axis)類:
    void setCategoryMargin(double margin)   分類軸邊距
    void setLowerMargin(double margin)   分類軸下(左)邊距
    void setUpperMargin(double margin)   分類軸上(右)邊距
    void setVerticalCategoryLabels(boolean flag) 分類軸標(biāo)題是否旋轉(zhuǎn)到垂直
    void setMaxCategoryLabelWidthRatio(float ratio) 分類軸分類標(biāo)簽的最大寬度

    -----------------------------------------------------------------------------------------------------------

    Plot類:
    void setBackgroundImage(Image image)   數(shù)據(jù)區(qū)的背景圖片
    void setBackgroundImageAlignment(int alignment) 數(shù)據(jù)區(qū)的背景圖片對齊方式(參數(shù)常量在org.jfree.ui.Align類中定義)
    void setBackgroundPaint(Paint paint)   數(shù)據(jù)區(qū)的背景圖片背景色
    void setBackgroundAlpha(float alpha)   數(shù)據(jù)區(qū)的背景透明度(0.0~1.0)
    void setForegroundAlpha(float alpha)   數(shù)據(jù)區(qū)的前景透明度(0.0~1.0)
    void setDataAreaRatio(double ratio)   數(shù)據(jù)區(qū)占整個(gè)圖表區(qū)的百分比
    void setOutLinePaint(Paint paint)   數(shù)據(jù)區(qū)的邊界線條顏色
    void setOutLineStroke(Stroke stroke)   數(shù)據(jù)區(qū)的邊界線條筆觸
    void setNoDataMessage(String message)   沒有數(shù)據(jù)時(shí)顯示的消息
    void setNoDataMessageFont(Font font)   沒有數(shù)據(jù)時(shí)顯示的消息字體
    void setNoDataMessagePaint(Paint paint)   沒有數(shù)據(jù)時(shí)顯示的消息顏色

    CategoryPlot(Plot)類:
    void setDataset(CategoryDataset dataset) 數(shù)據(jù)區(qū)的2維數(shù)據(jù)表
    void setColumnRenderingOrder(SortOrder order) 數(shù)據(jù)分類的排序方式
    void setAxisOffset(Spacer offset)   坐標(biāo)軸到數(shù)據(jù)區(qū)的間距
    void setOrientation(PlotOrientation orientation) 數(shù)據(jù)區(qū)的方向(PlotOrientation.HORIZONTAL或PlotOrientation.VERTICAL)
    void setDomainAxis(CategoryAxis axis)   數(shù)據(jù)區(qū)的分類軸
    void setDomainAxisLocation(AxisLocation location) 分類軸的位置(參數(shù)常量在org.jfree.chart.axis.AxisLocation類中定義)
    void setDomainGridlinesVisible(boolean visible) 分類軸網(wǎng)格是否可見
    void setDomainGridlinePaint(Paint paint) 分類軸網(wǎng)格線條顏色
    void setDomainGridlineStroke(Stroke stroke) 分類軸網(wǎng)格線條筆觸
    void setRangeAxis(ValueAxis axis)   數(shù)據(jù)區(qū)的數(shù)據(jù)軸
    void setRangeAxisLocation(AxisLocation location) 數(shù)據(jù)軸的位置(參數(shù)常量在org.jfree.chart.axis.AxisLocation類中定義)
    void setRangeGridlinesVisible(boolean visible) 數(shù)據(jù)軸網(wǎng)格是否可見
    void setRangeGridlinePaint(Paint paint)   數(shù)據(jù)軸網(wǎng)格線條顏色
    void setRangeGridlineStroke(Stroke stroke) 數(shù)據(jù)軸網(wǎng)格線條筆觸
    void setRenderer(CategoryItemRenderer renderer) 數(shù)據(jù)區(qū)的表示者(詳見Renderer組)
    void addAnnotation(CategoryAnnotation annotation) 給數(shù)據(jù)區(qū)加一個(gè)注釋
    void addRangeMarker(Marker marker,Layer layer) 給數(shù)據(jù)區(qū)加一個(gè)數(shù)值范圍區(qū)域

    PiePlot(Plot)類:
    void setDataset(PieDataset dataset)   數(shù)據(jù)區(qū)的1維數(shù)據(jù)表
    void setIgnoreNullValues(boolean flag)   忽略無值的分類
    void setCircular(boolean flag)    餅圖是否一定是正圓
    void setStartAngle(double angle)   餅圖的初始角度
    void setDirection(Rotation direction)   餅圖的旋轉(zhuǎn)方向
    void setExplodePercent(int section,double percent) 抽取的那塊(1維數(shù)據(jù)表的分類下標(biāo))以及抽取出來的距離(0.0~1.0),3D餅圖無效
    void setLabelBackgroundPaint(Paint paint) 分類標(biāo)簽的底色
    void setLabelFont(Font font)    分類標(biāo)簽的字體
    void setLabelPaint(Paint paint)    分類標(biāo)簽的字體顏色
    void setLabelLinkMargin(double margin)   分類標(biāo)簽與圖的連接線邊距
    void setLabelLinkPaint(Paint paint)   分類標(biāo)簽與圖的連接線顏色
    void setLabelLinkStroke(Stroke stroke)   分類標(biāo)簽與圖的連接線筆觸
    void setLabelOutlinePaint(Paint paint)   分類標(biāo)簽邊框顏色
    void setLabelOutlineStroke(Paint paint)   分類標(biāo)簽邊框筆觸
    void setLabelShadowPaint(Paint paint)   分類標(biāo)簽陰影顏色
    void setMaximumLabelWidth(double width)   分類標(biāo)簽的最大長度(0.0~1.0)
    void setPieIndex(int index)    餅圖的索引(復(fù)合餅圖中用到)
    void setSectionOutlinePaint(int section,Paint paint) 指定分類餅的邊框顏色
    void setSectionOutlineStroke(int section,Stroke stroke) 指定分類餅的邊框筆觸
    void setSectionPaint(int section,Paint paint) 指定分類餅的顏色
    void setShadowPaint(Paint paint)   餅圖的陰影顏色
    void setShadowXOffset(double offset)   餅圖的陰影相對圖的水平偏移
    void setShadowYOffset(double offset)   餅圖的陰影相對圖的垂直偏移
    void setLabelGenerator(PieSectionLabelGenerator generator) 分類標(biāo)簽的格式,設(shè)置成null則整個(gè)標(biāo)簽包括連接線都不顯示
    void setToolTipGenerator(PieToolTipGenerator generator) MAP中鼠標(biāo)移上的顯示格式
    void setURLGenerator(PieURLGenerator generator)   MAP中鉆取鏈接格式

    PiePlot3D(PiePlot)類:
    void setDepthFactor(double factor)   3D餅圖的Z軸高度(0.0~1.0)

    MultiplePiePlot(Plot)類:
    void setLimit(double limit)    每個(gè)餅圖之間的數(shù)據(jù)關(guān)聯(lián)(詳細(xì)比較復(fù)雜)  
    void setPieChart(JFreeChart pieChart)   每個(gè)餅圖的顯示方式(見JFreeChart類個(gè)PiePlot類)

    -----------------------------------------------------------------------------------------------------------

    AbstractRenderer類:
    void setItemLabelAnchorOffset(double offset)     數(shù)據(jù)標(biāo)簽的與數(shù)據(jù)點(diǎn)的偏移
    void setItemLabelsVisible(boolean visible)     數(shù)據(jù)標(biāo)簽是否可見
    void setItemLabelFont(Font font)      數(shù)據(jù)標(biāo)簽的字體
    void setItemLabelPaint(Paint paint)      數(shù)據(jù)標(biāo)簽的字體顏色
    void setItemLabelPosition(ItemLabelPosition position)    數(shù)據(jù)標(biāo)簽位置
    void setPositiveItemLabelPosition(ItemLabelPosition position)   正數(shù)標(biāo)簽位置
    void setNegativeItemLabelPosition(ItemLabelPosition position)   負(fù)數(shù)標(biāo)簽位置
    void setOutLinePaint(Paint paint)      圖形邊框的線條顏色
    void setOutLineStroke(Stroke stroke)      圖形邊框的線條筆觸
    void setPaint(Paint paint)       所有分類圖形的顏色
    void setShape(Shape shape)       所有分類圖形的形狀(如折線圖的點(diǎn))
    void setStroke(Stroke stroke)       所有分類圖形的筆觸(如折線圖的線)
    void setSeriesItemLabelsVisible(int series,boolean visible)   指定分類的數(shù)據(jù)標(biāo)簽是否可見
    void setSeriesItemLabelFont(int series,Font font)    指定分類的數(shù)據(jù)標(biāo)簽的字體
    void setSeriesItemLabelPaint(int series,Paint paint)    指定分類的數(shù)據(jù)標(biāo)簽的字體顏色
    void setSeriesItemLabelPosition(int series,ItemLabelPosition position) 數(shù)據(jù)標(biāo)簽位置
    void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正數(shù)標(biāo)簽位置
    void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 負(fù)數(shù)標(biāo)簽位置
    void setSeriesOutLinePaint(int series,Paint paint)    指定分類的圖形邊框的線條顏色
    void setSeriesOutLineStroke(int series,Stroke stroke)    指定分類的圖形邊框的線條筆觸
    void setSeriesPaint(int series,Paint paint)     指定分類圖形的顏色
    void setSeriesShape(int series,Shape shape)     指定分類圖形的形狀(如折線圖的點(diǎn))
    void setSeriesStroke(int series,Stroke stroke)     指定分類圖形的筆觸(如折線圖的線)

    AbstractCategoryItemRenderer(AbstractRenderer)類:
    void setLabelGenerator(CategoryLabelGenerator generator)   數(shù)據(jù)標(biāo)簽的格式
    void setToolTipGenerator(CategoryToolTipGenerator generator)   MAP中鼠標(biāo)移上的顯示格式
    void setItemURLGenerator(CategoryURLGenerator generator)   MAP中鉆取鏈接格式
    void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分類的數(shù)據(jù)標(biāo)簽的格式
    void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分類的MAP中鼠標(biāo)移上的顯示格式
    void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分類的MAP中鉆取鏈接格式

    BarRenderer(AbstractCategoryItemRenderer)類:
    void setDrawBarOutline(boolean draw)      是否畫圖形邊框
    void setItemMargin(double percent)      每個(gè)BAR之間的間隔
    void setMaxBarWidth(double percent)      每個(gè)BAR的最大寬度
    void setMinimumBarLength(double min)      最短的BAR長度,避免數(shù)值太小而顯示不出
    void setPositiveItemLabelPositionFallback(ItemLabelPosition position) 無法在BAR中顯示的正數(shù)標(biāo)簽位置
    void setNegativeItemLabelPositionFallback(ItemLabelPosition position) 無法在BAR中顯示的負(fù)數(shù)標(biāo)簽位置

    BarRenderer3D(BarRenderer)類:
    void setWallPaint(Paint paint)    3D坐標(biāo)軸的墻體顏色

    StackedBarRenderer(BarRenderer)類:
    沒有特殊的設(shè)置

    StackedBarRenderer3D(BarRenderer3D)類:
    沒有特殊的設(shè)置

    GroupedStackedBarRenderer(StackedBarRenderer)類:
    void setSeriesToGroupMap(KeyToGroupMap map)將分類自由的映射成若干個(gè)組(KeyToGroupMap.mapKeyToGroup(series,group))

    LayeredBarRenderer(BarRenderer)類:
    void setSeriesBarWidth(int series,double width) 設(shè)定每個(gè)分類的寬度(注意設(shè)置不要使某分類被覆蓋)

    WaterfallBarRenderer(BarRenderer)類:
    void setFirstBarPaint(Paint paint)   第一個(gè)柱圖的顏色
    void setLastBarPaint(Paint paint)   最后一個(gè)柱圖的顏色
    void setPositiveBarPaint(Paint paint)   正值柱圖的顏色
    void setNegativeBarPaint(Paint paint)   負(fù)值柱圖的顏色

    IntervalBarRenderer(BarRenderer)類:
    需要傳IntervalCategoryDataset作為數(shù)據(jù)源

    GanttBarRenderer(IntervalBarRenderer)類:
    void setCompletePaint(Paint paint)   完成進(jìn)度顏色
    void setIncompletePaint(Paint paint)   未完成進(jìn)度顏色
    void setStartPercent(double percent)   設(shè)置進(jìn)度條在整條中的起始位置(0.0~1.0)
    void setEndPercent(double percent)   設(shè)置進(jìn)度條在整條中的結(jié)束位置(0.0~1.0)

    StatisticBarRenderer(BarRenderer)類:
    需要傳StatisticCategoryDataset作為數(shù)據(jù)源

    LineAndShapeRenderer(AbstractCategoryItemRenderer)類:
    void setDrawLines(boolean draw)    是否折線的數(shù)據(jù)點(diǎn)之間用線連
    void setDrawShapes(boolean draw)   是否折線的數(shù)據(jù)點(diǎn)根據(jù)分類使用不同的形狀
    void setShapesFilled(boolean filled)   所有分類是否填充數(shù)據(jù)點(diǎn)圖形
    void setSeriesShapesFilled(int series,boolean filled) 指定分類是否填充數(shù)據(jù)點(diǎn)圖形
    void setUseFillPaintForShapeOutline(boolean use) 指定是否填充數(shù)據(jù)點(diǎn)的Paint也被用于畫數(shù)據(jù)點(diǎn)形狀的邊框

    LevelRenderer(AbstractCategoryItemRenderer)類:
    void setItemMargin(double percent)   每個(gè)分類之間的間隔
    void setMaxItemWidth(double percent)   每個(gè)分類的最大寬度

    CategoryStepRenderer(AbstractCategoryItemRenderer)類:
    void setStagger(boolean shouldStagger)   不同分類的圖是否交錯(cuò)

    MinMaxCategoryRenderer(AbstractCategoryItemRenderer)類:
    void setDrawLines(boolean drawLines)   是否在每個(gè)分類線間畫連接線
    void setGroupPaint(Paint groupPaint)   一組圖形連接線的顏色
    void setGroupStroke(Stroke groupStroke)   一組圖形連接線的筆觸
    void setMaxIcon(Icon maxIcon)    最大值的ICON
    void setMinIcon(Icon minIcon)    最小值的ICON
    void setObjectIcon(Icon objectIcon)   所有值的ICON

    AreaRender(AbstractCategoryItemRenderer)類:
    沒有特殊的設(shè)置

    StackedAreaRender(AreaRender)類:
    沒有特殊的設(shè)置

    posted @ 2010-07-20 20:35 donghang73 閱讀(2740) | 評論 (0)編輯 收藏
             JFreeChart并不存在多個(gè)不同的類來生成不同的圖形。所有的圖形都是具體類JFreeChart的實(shí)例化對象,初始化JFreeChart對象的時(shí)候通過指定不同的Plot實(shí)現(xiàn)類就可以顯示出不同的圖形。不同的Plot實(shí)現(xiàn)類具有不同的Renderer對象、Axis對象、Dataset對象。

           JFreeChart提供工廠類ChartFactory方便使用者生成各種不同的圖形。ChartFactory類的各個(gè)工廠方法中實(shí)現(xiàn)對具體Plot的指定以及對類JFreeChart構(gòu)造函數(shù)的調(diào)用。

        下面以常用圖形說一下常用的使用流程(大部分的操作講的并不全面,比如JFreeChart可能提供了很多增加、修改數(shù)據(jù)的方式,下文中可能只列舉一種)。

    1柱狀圖

    1)平面柱狀圖

        生成柱狀圖操作:

    JFreeChartchart=ChartFactory.createBarChart(String title,//圖標(biāo)題

    String categoryAxisLabel,//x軸標(biāo)題

    String valueAxisLabel,//y軸標(biāo)題

    CategoryDataset dataset,//數(shù)據(jù)源

    PlotOrientation orientation,//顯示方向

    Boolean legend,//是否顯示圖例

    Boolean tooltips,//是否顯示tooltip

    Boolean urls)//是否指定url

    平面柱狀圖的Plot對象是CategoryPlot類型。CategoryPlot對象的x軸是CategoryAxis對象,y軸是NumberAxis對象,繪制單元是BarRenderer對象,數(shù)據(jù)源是CategoryDataset對象。

    獲取CategoryPlot對象操作為:

    CategoryPlot plot = (CategoryPlot)chart.getPlot();或者

    CategoryPlot plot = chart.getCategoryPlot();

    獲取繪制單元操作:

           BarRenderer renderer = (BarRenderer)plot.getRenderer();

    獲取x軸的操作:

    CategoryAxis xAxis = (CategoryAxis)plot.getDomainAxis();

    獲取y軸操作:

    NumberAxis yAxis = (NumberAxis)plot.getRangeAxis();

    獲取數(shù)據(jù)源:

    CategoryDataset dataset = plot.getDataset();

        柱狀圖可以接受一切CategoryDataset類型的數(shù)據(jù)源,下面講解一下常用的CategoryDataset類型DefaultCategoryDataset的使用方式

    實(shí)例化:

    DefaultCategoryDataset dataset = new DefaultCategoryDataset();

    增加數(shù)據(jù)

    dataset.addValue(doublevalue,ComparablerowKey,ComparablecolumnKey);

    刪除數(shù)據(jù):

           dataset.removeValue(ComparablerowKey,ComparablecolumnKey);

        或者

           dataset.removeColumn(intcolumnIndex);

        或者

           dataset.removeColumn(ComparablecolumnKey);

        對行同樣有上述兩種刪除方式,不在列舉。

    修改數(shù)據(jù):

           dataset.setValue(doublevalue,ComparablerowKey,ComparablecolumnKey);

    查詢數(shù)據(jù):

    plot對象、繪制單元、x軸、y軸的顯示特性修改不再一一介紹。

    23D柱狀圖

        對應(yīng)的工廠方法為createBarChart3D,該方法的參數(shù)與平面柱狀圖相同。3D柱狀圖的Plot對象是CategoryPlot類型。CategoryPlot對象的x軸是CategoryAxis3D對象,y軸是NumberAxis3D對象,繪制單元是BarRenderer3D對象,數(shù)據(jù)源是CategoryDataset對象。

        具體使用以及操作與平面柱狀圖雷同,不在詳述。

    2餅狀圖

    (1)平面餅狀圖

    生成平面餅狀圖:

    JFreeChartchart=ChartFactory.createPieChart(String title,//圖標(biāo)題

    PieDataset dataset,//數(shù)據(jù)源

    Boolean legend,//是否顯示圖例

    Boolean tooltips,//是否顯示tooltip

    Boolean urls)//是否指定url

    平面餅狀圖的Plot對象是PiePlot類型。PiePlot對象沒有x軸對象、y軸對象、繪制單元對象,數(shù)據(jù)源是PieDataset對象。

    獲取PiePlot對象操作為:

    PiePlot plot = (PiePlot)chart.getPlot();

    獲取數(shù)據(jù)源:

    PieDataset dataset = plot.getDataset();

    餅狀圖可以接受一切PieDataset類型的數(shù)據(jù)源,下面講解一下常用的PieDataset類型DefaultPieDataset的使用方式

    實(shí)例化:

        DefaultPieDatasetdataset=newDefaultPieDataset();

    增加修改操作:

        dataset.setValue(Comparablekey,doublevalue);

    刪除操作:

        dataset.remove(Comparablekey);

    查詢操作:

        dataset.getKey(intitem);

    或者

    dataset.getValue(intitem);

    (1)3D餅狀圖

        對應(yīng)的工廠方法為createPieChart3D,參數(shù)與平面餅狀圖相同。與平面餅狀圖的差別在于Plot對象是PiePlot3D類型,不再詳述。

    3多重餅狀圖

    1)多重平面餅狀圖

    生成多重平面餅狀圖:

    JFreeChartchart=ChartFactory.createMultiplePieChart (String title,//圖標(biāo)題

    CategoryDataset dataset,//數(shù)據(jù)源

    TableOrder order,//指定提取數(shù)據(jù)的方式(按行或者按列)

    Boolean legend,//是否顯示圖例

    boolean tooltips,//是否顯示tooltip

    boolean urls)   //是否指定url

    多重平面餅狀圖的Plot對象是MultiplePiePlot類型。MultiplePiePlot對象沒有x軸對象、y軸對象、繪制單元對象,數(shù)據(jù)源是CategoryDataset對象。MultiplePiePlot對象中可以含有多個(gè)子JFreeChart對象,子JFreeChart對象是上面講過的餅狀圖對象。

    獲取MultiplePiePlot對象操作為:

    MultiplePiePlot plotMain = (MultiplePiePlot)chart.getPlot();

    獲取子JFreeChart的操作為:

           JfreeChart childChart = plotMain.getPieChart();

    獲取數(shù)據(jù)源:

    CategoryDataset dataset = plotMain.getDataset();

    2)多重3D餅狀圖

        對應(yīng)的工廠方法為createMultiplePieChart3D,該方法的參數(shù)與多重平面餅狀圖相同。多重3D餅狀圖的Plot對象是MultiplePiePlot類型。MultiplePiePlot對象中可以含有多個(gè)子JFreeChart對象,子JFreeChart對象是上面講過的3D餅狀圖對象。

    4線圖

    1)平面線圖

        生成平面線圖:

    JFreeChartchart=ChartFactory.createLineChart(String title,//圖標(biāo)題

    String categoryAxisLabel,//x軸標(biāo)題

    String valueAxisLabel,//y軸標(biāo)題

    CategoryDataset dataset,//數(shù)據(jù)源

    PlotOrientation orientation,//顯示方向

    Boolean legend,//是否顯示圖例

    Boolean tooltips,//是否顯示tooltip

    Boolean urls);//是否指定url

    平面線圖除了的Plot對象中繪制單元對象是LineAndShapeRenderer對象,其他一切組成對象與平面柱狀圖相同。

    獲取Renderer操作:

    LineAndShapeRenderer renderer = (LineAndShapeRenderer)plot.getRenderer();

    其他參考平面柱狀圖。

    23D線圖

    對應(yīng)工廠方法為createLineChart3D,參數(shù)與createLineChart相同。3D線圖的組成對象除了繪制單元對象是LineAndShapeRenderer3D對象,其他一切組成對象與3D柱狀圖相同。

    5時(shí)序圖

    生成時(shí)序圖:

    JfreeChartchart = ChartFactory.createTimeSeriesChart(String title,//圖標(biāo)題

    String timeAxisLabel,//x軸標(biāo)題

    String valueAxisLabel,//y軸標(biāo)題

    XYDataset dataset,//數(shù)據(jù)源

    Boolean legend,//是否顯示圖例

    Boolean tooltips,//是否顯示tooltip

    Boolean urls);//是否指定url

    時(shí)序圖的Plot對象是XYPlot類型。XYPlot對象的x軸是DateAxis對象,y軸是NumberAxis對象,繪制單元是XYLineAndShapeRenderer對象,數(shù)據(jù)源是XYDataset對象。

    Plot對象的獲取操作:

           XYPlot plot = (XYPlot)chart.getPlot();

    X軸對象的獲取操作:

           DateAxis xAxis = (DateAxis)plot.getDomainAxis();

    Y軸對象的獲取操作:

           NumberAxis yAxis = (NumberAxis)plot.getRangeAxis();

    Renderer對象的獲取操作:

           XYItemRenderer renderer = plot.getRenderer();

    時(shí)序圖可以接受一切XYDataset類型的數(shù)據(jù)源,下面講解一下常用的XYDataset類型TimeSeriesCollection的使用方式。

    實(shí)例化:

           TimeSeriesCollection dataset = newTimeSeriesCollection();

    添加數(shù)據(jù)操作:

           dataset.addSeries(TimeSeries);//后面講解TimeSeries對象

    刪除數(shù)據(jù)操作:

           dataset.removeSeries(intindex);

    查詢數(shù)據(jù)操作:

           dataset.getSeries(intseries);

    TimeSeries對象操作

    實(shí)例化:

           TimeSeries ts = TimeSeries(Stringname,ClasstimePeriodClass);

    增加數(shù)據(jù)操作:

           ts.add(RegularTimePeriod period,double value);

    刪除數(shù)據(jù)操作:

           ts.delete(RegularTimePeriod period);

    修改數(shù)據(jù)操作:

           ts.update(RegularTimePeriod period,Number value);

    查詢數(shù)據(jù)操作:

        ts.getValue(RegularTimePeriodperiod);

    RegularTimePeriodJFreeChart提供的時(shí)間模板類,它有很多具體的時(shí)間類,比如:MinuteSecondHourDay……等,不再詳述。

    posted @ 2010-07-20 20:33 donghang73 閱讀(1225) | 評論 (0)編輯 收藏

     

    1簡介

    JFreeChartSourceForge.net上的一個(gè)開源項(xiàng)目,它的源碼和API都可以免費(fèi)獲得。JFreeChart的功能非常強(qiáng)大,可以實(shí)現(xiàn)餅圖(二維和三維),柱狀圖(水平,垂直),線圖,點(diǎn)圖,時(shí)序圖,甘特圖,股票行情圖,混和圖,溫度計(jì)圖,刻度圖等常用商用圖表,圖形可以導(dǎo)出成PNGJPEG格式,同時(shí)還可以與PDFEXCEL關(guān)聯(lián),支持對圖形的放大、縮小,支持常見圖形的3D顯示。

    2圖形對象的處理

    2.1 JFreeChart對象

    JFreeChart可以生成很多圖形對象,它的工廠類提供了33個(gè)工廠方法用于生成不同的圖形對象(具體的工廠方法可以參見JFreeChartAPI手冊或者源碼中的ChartFactory)。JFreechart對圖形對象的抽象具體化。圖形對象(JFreeChart),由Title(主標(biāo)題)SubTitle(子標(biāo)題)Plot(圖形的繪制結(jié)構(gòu))等幾個(gè)主要對象組成。各個(gè)組成部分如下圖所示:
       
        
    這是一個(gè)JFreeChart對象,上面的“chart標(biāo)題”是Title對象,中間區(qū)域是Plot對象(包括繪圖區(qū)域和坐標(biāo)軸區(qū)域),下面的區(qū)域是LegendTitle對象,LegendTitle是一種SubTitle對象。

    每個(gè)JFreeChart對象只能有1個(gè)Title對象,1個(gè)Plot對象,可以有多個(gè)SubTitle對象。JFreeChart對象可以進(jìn)行的操作有:背景的設(shè)置(背景顏色、背景圖片、透明度等)、邊框的設(shè)置(是否可見、筆畫、Paint等)、渲染方式的設(shè)置、標(biāo)題對象的設(shè)置、子標(biāo)題對象的增刪查操作。(本文中的所有操作都不提供代碼級的介紹,可參見API手冊或者源碼)

    2.2 主標(biāo)題對象

    主標(biāo)題對象是TextTitle類型,可以進(jìn)行的操作有:背景設(shè)置、字體設(shè)置(字體類型、顏色、內(nèi)容、對齊方式等操作)、tooltip設(shè)置、URL設(shè)置。

    2.3 Plot對象

    Plot對象是圖形的繪制結(jié)構(gòu)對象。JFreeChart中含有很多不同的Plot對象,每一種圖形對象中的Plot對象都在實(shí)例化的時(shí)候創(chuàng)建。所有的Plot共有的操作有:背景設(shè)置(背景顏色、背景圖片、透明度等)、前景透明度設(shè)置、無數(shù)據(jù)存在情況的設(shè)置(顯示的字符內(nèi)容、顯示的字體、顯示的Paint)、放大縮小比例的設(shè)置,大部分Plot對象還有設(shè)置Datset、設(shè)置Renderer對象操作。

    JFreeChart中有18Plot抽象類的具體實(shí)現(xiàn)類。Plot的具體實(shí)現(xiàn)類主要由以下重要對象組成:Renderer對象(圖形的繪制單元——繪圖域),Datset(圖形的數(shù)據(jù)源),DomainAxis(區(qū)域軸,相當(dāng)于x軸),RangeAxis(范圍軸,相當(dāng)于y軸)。

    不同的Plot對象組成方式不盡相同,有的不含有Renderer對象,比如CompassPlotContourPlotMultiplePiePlotPiePlot等,有的不含有DomainAxisRangeAxis對象,另外除了FastScatterPlot類都含有Datset對象,FastScatterPlot使用float的二維數(shù)組充當(dāng)數(shù)據(jù)源。尤其說明一點(diǎn),餅狀圖相關(guān)的Plot對象(MultiplePiePlotPiePlotPiePlot3DRingPlot)中都不含有Renderer對象、DomainAxis對象、RangeAxis對象。

    一般來說,Datset對象存儲數(shù)據(jù)模型,Renderer對象存儲顯示模型,Plot對象根據(jù)Datset對象、Renderer對象完成畫圖操作。


        仍以上面的圖形講解
    Plot對象的組成。
    上圖的中間區(qū)域是是一個(gè)XYPlot對象。其中的折線部分即是圖形的繪制單元Renderer對象。X軸是DomainAxisy軸是RangeAxis,其中Datset對象屬于數(shù)據(jù)模型范疇,是UI不可見對象。該圖中的plot背景色、網(wǎng)格線的各種設(shè)置可以通過XYPlot對象本身完成。

        下面講解Renderer對象、Axis對象(X軸、y軸都屬于Axis對象),Datset對象在后續(xù)章節(jié)中專門講解。

    2.3.1 Renderer對象

    Renderer對象是圖形的繪制單元。JFreeChart提供了兩個(gè)接口CategoryItemRendererXYItemRenderer、以及1個(gè)抽象類AbstractRenderer供具體的Renderer類實(shí)現(xiàn),給出了將近50種具體實(shí)現(xiàn)類。

    一般來說Renderer對象可進(jìn)行的操作有:對itemlabel(下圖中的柱狀圖上的紅色數(shù)字即為itemlabel的示例)的默認(rèn)設(shè)置(itemlabel的產(chǎn)生方式、是否可見、字體、Paint、正反向itemlabel的位置設(shè)置等)、繪制圖形的邊框默認(rèn)設(shè)置(Paint、筆畫、是否可見等)、繪制圖形的默認(rèn)設(shè)置(形狀、筆畫、是否可見、對應(yīng)的圖例中是否可見等,折線圖還有線條是否可見、折點(diǎn)圖形是否可見、折點(diǎn)圖形是否填充、折點(diǎn)圖形的形狀、對應(yīng)的圖例中線條是否可見、圖形是否可見、整體是否可見等)、以及對指定itemlabel的設(shè)置、指定繪制圖形的設(shè)置。可以說和具體繪制的圖形相關(guān)的屬性都可以通過Renderer對象設(shè)置。

    不同的Renderer的實(shí)現(xiàn)類實(shí)現(xiàn)了不同的顯示方式,在含有Renderer對象的JFreeChart對象中,Renderer對象決定了JFreeChart對象的顯示方式。例如:柱狀圖的Plot對象中默認(rèn)的Renderer對象是CategoryItemRenderer對象,通過設(shè)置Plot對象的Renderer對象LineAndShapeRenderer,則柱狀圖變?yōu)榫€圖。使用中一般不需要顯式的實(shí)例化一個(gè)Renderer對象,一般通過JFreeChart對象的Plot對象調(diào)用現(xiàn)有的Renderer對象進(jìn)行重新設(shè)置等操作。

    2.3.2 Axis對象

    JFreeChart提供了兩種類型的坐標(biāo)軸:CategoryAxis(等級軸)和ValueAxis(值軸),ValueAxis又有3個(gè)子類:DateAxis(時(shí)間軸)、NumberAxis(數(shù)字軸)、PeriodAxis(時(shí)期軸)。這些坐標(biāo)軸還有更詳細(xì)的子類,不再一一列舉

    Axis對象可進(jìn)行的操作有:標(biāo)題的設(shè)置(內(nèi)容、字體、Paint、顯示角度等)、坐標(biāo)線的設(shè)置(筆畫、Paint、是否可見等)、刻度線的設(shè)置(是否可見、筆畫、Paint、位于繪圖區(qū)域的長度、位于繪圖區(qū)域外的長度等)、刻度標(biāo)示的設(shè)置(筆畫、Paint、字體、與軸的距離等)、坐標(biāo)軸范圍設(shè)置等。

    CategoryAxis對象還可以進(jìn)行的操作有:刻度標(biāo)示間距設(shè)置(最小間距、最大間距、指定間距)等。

    ValueAxis對象可進(jìn)行的操作有:軸端設(shè)置(顯示的圖形形狀)、范圍設(shè)置(是否自動產(chǎn)生范圍、自動產(chǎn)生的最小范圍、最大范圍、指定確定范圍、指定范圍大小等)、間隔設(shè)置(是否自動產(chǎn)生間隔、指定間隔)等。

    DateAxis對象還有對時(shí)間刻度顯示格式的設(shè)置操作。

    2.4 子標(biāo)題對象

        子標(biāo)題對象是Title類型的對象,一個(gè)JFreeChart可以有多個(gè)子標(biāo)題對象。JFreeChart提供了5種Title的實(shí)現(xiàn),可以是圖片、文本、圖例等的形式。

    2.5數(shù)據(jù)源處理

    JFreeChart中的數(shù)據(jù)源是DataSet接口類型。該接口有三個(gè)主要的子類接口:CategoryDataset、PieDataset、SeriesDataset

    CategoryDataset接口的實(shí)現(xiàn)類基本上都維護(hù)了一個(gè)三元組<value,row,col>的列表結(jié)構(gòu)。不同的實(shí)現(xiàn)類中value的類型不相同。<row,col>唯一確定一個(gè)三元組。CategoryDataset的實(shí)現(xiàn)類提供對這個(gè)三元組的增刪改查操作。

    PieDataset接口有兩個(gè)主要的實(shí)現(xiàn)類:CategoryToPieDataset、DefaultPieDataset。

    SeriesDataset接口的實(shí)現(xiàn)類基本上都維護(hù)了一種特定數(shù)據(jù)結(jié)構(gòu)的列表。以TimeSeriesCollection為例。它維護(hù)一個(gè)TimeSeries對象列表,提供對該列表的增刪查操作。每個(gè)TimeSeries對象維護(hù)一個(gè)<time,value>列表,提供對該列表的增刪改查操作。

    posted @ 2010-07-20 20:29 donghang73 閱讀(1515) | 評論 (0)編輯 收藏

    public class SimpleDateFormat extends DateFormat
    SimpleDateFormat 是一個(gè)以國別敏感的方式格式化和分析數(shù)據(jù)的具體類。 它允許格式化 (date -> text)、語法分析 (text -> date)和標(biāo)準(zhǔn)化。

    SimpleDateFormat 允許以為日期-時(shí)間格式化選擇任何用戶指定的方式啟動。 但是,希望用 DateFormat 中的 getTimeInstance、 getDateInstance 或 getDateTimeInstance 創(chuàng)建一個(gè)日期-時(shí)間格式化程序。 每個(gè)類方法返回一個(gè)以缺省格式化方式初始化的日期/時(shí)間格式化程序。 可以根據(jù)需要用 applyPattern 方法修改格式化方式。

    SimpleDateFormat函數(shù)的繼承關(guān)系:
    java.lang.Object
       |
       +----java.text.Format
               |
               +----java.text.DateFormat
                       |
                       +----java.text.SimpleDateFormat
    字母 日期或時(shí)間元素 表示 示例
    G Era 標(biāo)志符 Text AD
    y Year 1996; 96
    M 年中的月份 Month July; Jul; 07
    w 年中的周數(shù) Number 27
    W 月份中的周數(shù) Number 2
    D 年中的天數(shù) Number 189
    d 月份中的天數(shù) Number 10
    F 月份中的星期 Number 2
    E 星期中的天數(shù) Text Tuesday; Tue
    a Am/pm 標(biāo)記 Text PM
    H 一天中的小時(shí)數(shù)(0-23) Number 0
    k 一天中的小時(shí)數(shù)(1-24) Number 24
    K am/pm 中的小時(shí)數(shù)(0-11) Number 0
    h am/pm 中的小時(shí)數(shù)(1-12) Number 12
    m 小時(shí)中的分鐘數(shù) Number 30
    s 分鐘中的秒數(shù) Number 55
    S 毫秒數(shù) Number 978
    z 時(shí)區(qū) General time zone Pacific Standard Time; PST; GMT-08:00
    Z 時(shí)區(qū) RFC 822 time zone -0800

    一個(gè)小例子,幫助更好的理解SimpleDataFormat

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    public class TestSimpleDataFormat {
        
    public static void main(String[] args) 
            SimpleDateFormat myFmt 
    = new SimpleDateFormat("yyyy年MM月dd日 HH時(shí)mm分ss秒"); 
            SimpleDateFormat myFmt1 
    = new SimpleDateFormat("yy/MM/dd HH:mm"); 
            SimpleDateFormat myFmt2 
    = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等價(jià)于now.toLocaleString() [depreciated]
            SimpleDateFormat myFmt3 = new SimpleDateFormat("yyyy年MM月dd日 HH時(shí)mm分ss秒 E "); 
            SimpleDateFormat myFmt4 
    = new SimpleDateFormat("一年中的第 D 天|一年中第w個(gè)星期 |一月中第W個(gè)星期|在一天中k時(shí) z時(shí)區(qū)");
            
            
    //格式化示例
            Date now=new Date(); 
            System.out.println(myFmt.format(now)); 
            System.out.println(myFmt1.format(now)); 
            System.out.println(myFmt2.format(now)); 
            System.out.println(myFmt3.format(now)); 
            System.out.println(myFmt4.format(now)); 
            System.out.println(now.toString()); 
            
            
    //解析示例
            SimpleDateFormat myFmt5 = new SimpleDateFormat("yyyy/MM/dd HH"); 
            String time 
    = "2010/08/02 00";
            
    try {
                Date datatime 
    = myFmt5.parse(time);
                System.out.println(datatime);
            }
     catch (ParseException e) {
                e.printStackTrace();
            }

            
        }

    }

    posted @ 2010-07-13 21:39 donghang73 閱讀(1237) | 評論 (0)編輯 收藏
    網(wǎng)上很多人都說J2EE5兼容性不好,例如典型的javamail1.4中包與J2EE5中包接口包引起沖突,導(dǎo)致單元測試經(jīng)常報(bào)如下錯(cuò)誤:

        java.lang.NoClassDefFoundError: com/sun/mail/util/BEncoderStream

        當(dāng)然這個(gè)錯(cuò)誤是沒有將javamail的實(shí)現(xiàn)者引進(jìn)工程(沒有導(dǎo)包),但導(dǎo)包后,就會出現(xiàn)另外一個(gè)錯(cuò)誤:

        java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

        此時(shí)甚至web容器都無法啟動,經(jīng)常會有網(wǎng)友們?yōu)檫@兩個(gè)異常搞得焦頭爛額,如此更換J2EE1.4,會對工程造成影響。但是一定要把概念弄清楚,問題就好 解決。J2EE5中mail.jar包定義的只是接口,沒有實(shí)現(xiàn),是不能真正發(fā)送郵件的,但開發(fā)編譯肯定是可以過去的,因?yàn)槲覀兪轻槍2EE規(guī)范編的程 序。而運(yùn)行期用Sun公司的JavaMail1.4的實(shí)現(xiàn)才可以開始發(fā)送郵件,但老大為什么把這兩個(gè)弄沖突了?

        筆者的解決辦法是:

        開發(fā)期不要導(dǎo)包,運(yùn)行期將javamail1.4壓縮文件中的mail.jar包放入到tomcat"lib目錄下,這樣完全可以通過開發(fā)和運(yùn)行。若要做 單元測試則新開一個(gè)Java Project,注意,不是web工程,此時(shí)可以將javamail1.4壓縮包中的mail.jar放入到工程的classpath下。

    posted @ 2010-06-03 13:36 donghang73 閱讀(6836) | 評論 (0)編輯 收藏
    JavaMail API詳解(from http://www.tkk7.com/jxhkwhy/archive/2007/10/26/156118.html)
    摘要:
    JavaMail API是讀取、撰寫、發(fā)送電子信息的可選包。我們可用它來建立如Eudora、Foxmail、MS Outlook Express一般的郵件用戶代理程序(Mail User Agent,簡稱MUA)。讓我們看看JavaMail API是如何提供信息訪問功能的吧!JavaMail API被設(shè)計(jì)用于以不依賴協(xié)議的方式去發(fā)送和接收電子信息,文中著重:如何以不依賴于協(xié)議的方式發(fā)送接收電子信息,這也是本文所要描述的.

    版權(quán)聲明:本文可以自由轉(zhuǎn)載,轉(zhuǎn)載時(shí)請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
    作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig)
    原文:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html
    關(guān)鍵字:java,mail,pop,smtp

    一、JavaMail API簡介
    JavaMail API是讀取、撰寫、發(fā)送電子信息的可選包。我們可用它來建立如Eudora、Foxmail、MS Outlook Express一般的郵件用戶代理程序(Mail User Agent,簡稱MUA)。而不是像sendmail或者其它的郵件傳輸代理(Mail Transfer Agent,簡稱MTA)程序那樣可以傳送、遞送、轉(zhuǎn)發(fā)郵件。從另外一個(gè)角度來看,我們這些電子郵件用戶日常用MUA程序來讀寫郵件,而MUA依賴著 MTA處理郵件的遞送。
    在清楚了到MUA與MTA之間的關(guān)系后,讓我們看看JavaMail API是如何提供信息訪問功能的吧!JavaMail API被設(shè)計(jì)用于以不依賴協(xié)議的方式去發(fā)送和接收電子信息,這個(gè)API被分為兩大部分:

    基本功能:如何以不依賴于協(xié)議的方式發(fā)送接收電子信息,這也是本文所要描述的,不過在下文中,大家將看到這只是一廂情愿而已。
    第二個(gè)部分則是依賴特定協(xié)議的,比如SMTP、POP、IMAP、NNTP協(xié)議。在這部分的JavaMail API是為了和服務(wù)器通訊,并不在本文的內(nèi)容中。

    二、相關(guān)協(xié)議一覽
    在我們步入JavaMail API之前,先看一下API所涉及的協(xié)議。以下便是大家日常所知、所樂于使用的4大信息傳輸協(xié)議:
    SMTP
    POP
    IMAP
    MIME
    當(dāng)然,上面的4個(gè)協(xié)議,并不是全部,還有NNTP和其它一些協(xié)議可用于傳輸信息,但是由于不常用到,所以本文便不提及了。理解這4個(gè)基本的協(xié)議有助于我們 更好的使用JavaMail API。然而JavaMail API是被設(shè)計(jì)為與協(xié)議無關(guān)的,目前我們并不能克服這些協(xié)議的束縛。確切的說,如果我們使用的功能并不被我們選擇的協(xié)議支持,那么JavaMail API并不可能如魔術(shù)師一樣神奇的賦予我們這種能力。

    1.SMTP
    簡單郵件傳輸協(xié)議定義了遞送郵件的機(jī)制。在下文中,我們將使用基于Java-Mail的程序與公司或者ISP的SMTP服務(wù)器進(jìn)行通訊。這個(gè) SMTP服務(wù)器將郵件轉(zhuǎn)發(fā)到接收者的SMTP服務(wù)器,直至最后被接收者通過POP或者IMAP協(xié)議獲取。這并不需要SMTP服務(wù)器使用支持授權(quán)的郵件轉(zhuǎn) 發(fā),但是卻的確要注意SMTP服務(wù)器的正確設(shè)置(SMTP服務(wù)器的設(shè)置與JavaMail API無關(guān))。

    2.POP
    POP是一種郵局協(xié)議,目前為第3個(gè)版本,即眾所周知的POP3。POP定義了一種用戶如何獲得郵件的機(jī)制。它規(guī)定了每個(gè)用戶使用一個(gè)單獨(dú)的郵箱。大多數(shù) 人在使用POP時(shí)所熟悉的功能并非都被支持,例如查看郵箱中的新郵件數(shù)量。而這個(gè)功能是微軟的Outlook內(nèi)建的,那么就說明微軟 Outlook之類的郵件客戶端軟件是通過查詢最近收到的郵件來計(jì)算新郵件的數(shù)量來實(shí)現(xiàn)前面所說的功能。因此在我們使用JavaMail API時(shí)需要注意,當(dāng)需要獲得如前面所講的新郵件數(shù)量之類的信息時(shí),我們不得不自己進(jìn)行計(jì)算。

    3.IMAP
    IMAP使用在接收信息的高級協(xié)議,目前版本為第4版,所以也被稱為IMAP4。需要注意的是在使用IMAP時(shí),郵件服務(wù)器必須支持該協(xié)議。從這個(gè)方面 講,我們并不能完全使用IMAP來替代POP,不能期待IMAP在任何地方都被支持。假如郵件服務(wù)器支持IMAP,那么我們的郵件程序?qū)⒛軌蚓哂幸韵卤? IMAP所支持的特性:每個(gè)用戶在服務(wù)器上可具有多個(gè)目錄,這些目錄能在多個(gè)用戶之間共享。
    其與POP相比高級之處顯而易見,但是在嘗試采取IMAP時(shí),我們認(rèn)識到它并不是十分完美的:由于IMAP需要從其它服務(wù)器上接收新信息,將這些信息遞送 給用戶,維護(hù)每個(gè)用戶的多個(gè)目錄,這都為郵件服務(wù)器帶來了高負(fù)載。并且IMAP與POP的一個(gè)不同之處是POP用戶在接收郵件時(shí)將從郵件服務(wù)器上下載郵 件,而IMAP允許用戶直接訪問郵件目錄,所以在郵件服務(wù)器進(jìn)行備份作業(yè)時(shí),由于每個(gè)長期使用此郵件系統(tǒng)的用戶所用的郵件目錄會占有很大的空間,這將直接 導(dǎo)致郵件服務(wù)器上磁盤空間暴漲。

    4.MIME
    MIME并不是用于傳送郵件的協(xié)議,它作為多用途郵件的擴(kuò)展定義了郵件內(nèi)容的格式:信息格式、附件格式等等。一些RFC標(biāo)準(zhǔn)都涉及了MIME: RFC 822, RFC 2045, RFC 2046, RFC 2047,有興趣的Matrixer可以閱讀一下。而作為JavaMail API的開發(fā)者,我們并不需關(guān)心這些格式定義,但是這些格式被用在了程序中。

    5.NNTP和其它的第三方協(xié)議
    正因?yàn)镴avaMail API在設(shè)計(jì)時(shí)考慮到與第三方協(xié)議實(shí)現(xiàn)提供商之間的分離,故我們可以很容易的添加一些第三方協(xié)議。SUN維護(hù)著一個(gè)第三方協(xié)議實(shí)現(xiàn)提供商的列表:http://java.sun.com/products/javamail/Third_Party.html, 通過此列表我們可以找到所需要的而又不被SUN提供支持的第三方協(xié)議:比如NNTP這個(gè)新聞組協(xié)議和S/MIME這個(gè)安全的MIME協(xié)議。

    三、安裝
    1.安裝JavaMail
    為了使用JavaMail API,需要從http://java.sun.com/products/javamail/downloads/index.html下 載文件名格式為javamail-[version].zip的文件(這個(gè)文件中包括了JavaMail實(shí)現(xiàn)),并將其中的mail.jar文件添加到 CLASSPATH中。這個(gè)實(shí)現(xiàn)提供了對SMTP、IMAP4、POP3的支持。
    注意:在安裝JavaMail實(shí)現(xiàn)之后,我們將在demo目錄中發(fā)現(xiàn)許多有趣的簡單實(shí)例程序。
    在安裝了JavaMail之后,我們還需要安裝JavaBeans Activation Framework,因?yàn)檫@個(gè)框架是JavaMail API所需要的。如果我們使用J2EE的話,那么我們并無需單獨(dú)下載JavaMail,因?yàn)樗嬖谟贘2EE.jar中,只需將J2EE.jar加入到 CLASSPATH即可。

    2.安裝JavaBeans Activation Framework
    http://java.sun.com/products/javabeans/glasgow/jaf.html下 載JavaBeans Activation Framework,并將其添加到CLASSPATH中。此框架增加了對任何數(shù)據(jù)塊的分類、以及對它們的處理的特性。這些特性是JavaMail API需要的。雖然聽起來這些特性非常模糊,但是它對于我們的JavaMail API來說只是提供了基本的MIME類型支持。
    到此為止,我們應(yīng)當(dāng)把mail.jar和activation.jar都添加到了CLASSPATH中。
    當(dāng)然如果從方便的角度講,直接把這兩個(gè)Jar文件復(fù)制到JRE目錄的lib/ext目錄中也可以。

    四、初次認(rèn)識JavaMail API
    1.了解我們的JavaMail環(huán)境
    A.縱覽JavaMail核心類結(jié)構(gòu)
    打開JavaMail.jar文件,我們將發(fā)現(xiàn)在javax.mail的包下面存在著一些核心類:Session、Message、 Address、Authenticator、Transport、Store、Folder。而且在javax.mail.internet包中還有一 些常用的子類。
    B.Session
    Session類定義了基本的郵件會話。就像Http會話那樣,我們進(jìn)行收發(fā)郵件的工作都是基于這個(gè)會話的。Session對象利用了 java.util.Properties對象獲得了郵件服務(wù)器、用戶名、密碼信息和整個(gè)應(yīng)用程序都要使用到的共享信息。
    Session類的構(gòu)造方法是私有的,所以我們可以使用Session類提供的getDefaultInstance()這個(gè)靜態(tài)工廠方法獲得一個(gè)默認(rèn)的 Session對象:

    Properties props = new Properties();
    // fill props with any information
    Session session = Session.getDefaultInstance(props, null);

    或者使用getInstance()這個(gè)靜態(tài)工廠方法獲得自定義的Session:

    Properties props = new Properties();
    // fill props with any information
    Session session = Session.getInstance(props, null);

    從上面的兩個(gè)例子中不難發(fā)現(xiàn),getDefaultInstance()和getInstance()方法的第二個(gè)參數(shù)都是null,這是因?yàn)樵谏厦娴睦? 子中并沒有使用到郵件授權(quán),下文中將對授權(quán)進(jìn)行詳細(xì)介紹。
    從很多的實(shí)例看,在對mail server進(jìn)行訪問的過程中使用共享的Session是足夠的,即使是工作在多個(gè)用戶郵箱的模式下也不例外。

    C.Message
    當(dāng)我們建立了Session對象后,便可以被發(fā)送的構(gòu)造信息體了。在這里SUN提供了Message類型來幫助開發(fā)者完成這項(xiàng)工作。由于 Message是一個(gè)抽象類,大多數(shù)情況下,我們使用javax.mail.internet.MimeMessage這個(gè)子類,該類是使用MIME類 型、MIME信息頭的郵箱信息。信息頭只能使用US-ASCII字符,而非ASCII字符將通過編碼轉(zhuǎn)換為ASCII的方式使用。
    為了建立一個(gè)MimeMessage對象,我們必須將Session對象作為MimeMessage構(gòu)造方法的參數(shù)傳入:

    MimeMessage message = new MimeMessage(session);

    注意:對于MimeMessage類來講存在著多種構(gòu)造方法,比如使用輸入流作為參數(shù)的構(gòu)造方法。

    在建立了MimeMessage對象后,我們需要設(shè)置它的各個(gè)part,對于MimeMessage類來說,這些part就是MimePart接口。最基 本的設(shè)置信息內(nèi)容的方法就是通過表示信息內(nèi)容和米么類型的參數(shù)調(diào)用setContent()方法:

    message.setContent("Hello", "text/plain");

    然而,如果我們所使用的MimeMessage中信息內(nèi)容是文本的話,我們便可以直接使用setText()方法來方便的設(shè)置文本內(nèi)容。

    message.setText("Hello");

    前面所講的兩種方法,對于文本信息,后者更為合適。而對于其它的一些信息類型,比如HTML信息,則要使用前者。
    別忘記了,使用setSubject()方法對郵件設(shè)置郵件主題:

    message.setSubject("First");


    D.Address
    到這里,我們已經(jīng)建立了Session和Message,下面將介紹如何使用郵件地址類:Address。像Message一樣,Address類也是一 個(gè)抽象類,所以我們將使用javax.mail.internet.InternetAddress這個(gè)子類。
    通過傳入代表郵件地址的字符串,我們可以建立一個(gè)郵件地址類:

    Address address = new InternetAddress("president@whitehouse.gov");

    如果要在郵件地址后面增加名字的話,可以通過傳遞兩個(gè)參數(shù):代表郵件地址和名字的字符串來建立一個(gè)具有郵件地址和名字的郵件地址類:

    Address address = new InternetAddress("president@whitehouse.gov", "George Bush");

    本文在這里所講的郵件地址類是為了設(shè)置郵件信息的發(fā)信人和收信人而準(zhǔn)備的,在建立了郵件地址類后,我們通過message的setFrom()和 setReplyTo()兩種方法設(shè)置郵件的發(fā)信人:

    message.setFrom(address);
    message.setReplyTo(address);

    若在郵件中存在多個(gè)發(fā)信人地址,我們可用addForm()方法增加發(fā)信人:

    Address address[] = ...;
    message.addFrom(address);

    為了設(shè)置收信人,我們使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量來區(qū)分收信人的 類型:

    message.addRecipient(type, address)

    下面是Message.RecipientType的三個(gè)常量:
    Message.RecipientType.TO
    Message.RecipientType.CC
    Message.RecipientType.BCC
    因此,如果我們要發(fā)送郵件給總統(tǒng),并發(fā)用一個(gè)副本給第一夫人的話,下面的方法將被用到:

    Address toAddress = new InternetAddress("vice.president@whitehouse.gov");
    Address ccAddress = new InternetAddress("first.lady@whitehouse.gov");
    message.addRecipient(Message.RecipientType.TO, toAddress);
    message.addRecipient(Message.RecipientType.CC, ccAddress);

    JavaMail API并沒有提供檢查郵件地址有效性的機(jī)制。當(dāng)然我們可以自己完成這個(gè)功能:驗(yàn)證郵件地址的字符是否按照RFC822規(guī)定的格式書寫或者通過DNS服務(wù)器 上的MX記錄驗(yàn)證等。

    E.Authenticator
    像java.net類那樣,JavaMail API通過使用授權(quán)者類(Authenticator)以用戶名、密碼的方式訪問那些受到保護(hù)的資源,在這里“資源”就是指郵件服務(wù)器。在 javax.mail包中可以找到這個(gè)JavaMail的授權(quán)者類(Authenticator)。
    在使用Authenticator這個(gè)抽象類時(shí),我們必須采用繼承該抽象類的方式,并且該繼承類必須具有返回 PasswordAuthentication對象(用于存儲認(rèn)證時(shí)要用到的用戶名、密碼)getPasswordAuthentication()方 法。并且要在Session中進(jìn)行注冊,使Session能夠了解在認(rèn)證時(shí)該使用哪個(gè)類。
    下面代碼片斷中的MyAuthenticator就是一個(gè)Authenticator的子類。

    Properties props = new Properties();
    // fill props with any information
    Authenticator auth = new MyAuthenticator();
    Session session = Session.getDefaultInstance(props, auth);


    F.Transport
    在發(fā)送信息時(shí),Transport類將被用到。這個(gè)類實(shí)現(xiàn)了發(fā)送信息的協(xié)議(通稱為SMTP),此類是一個(gè)抽象類,我們可以使用這個(gè)類的靜態(tài)方法 send()來發(fā)送消息:

    Transport.send(message);

    當(dāng)然,方法是多樣的。我們也可由Session獲得相應(yīng)協(xié)議對應(yīng)的Transport實(shí)例。并通過傳遞用戶名、密碼、郵件服務(wù)器主機(jī)名等參數(shù)建立與郵件服 務(wù)器的連接,并使用sendMessage()方法將信息發(fā)送,最后關(guān)閉連接:

    message.saveChanges(); // implicit with send()
    Transport transport = session.getTransport("smtp");
    transport.connect(host, username, password);
    transport.sendMessage(message, message.getAllRecipients());
    transport.close();

    評論:上面的方法是一個(gè)很好的方法,尤其是在我們在同一個(gè)郵件服務(wù)器上發(fā)送多個(gè)郵件時(shí)。因?yàn)檫@時(shí)我們將在連接郵件服務(wù)器后連續(xù)發(fā)送郵件,然后再關(guān)閉掉連 接。send()這個(gè)基本的方法是在每次調(diào)用時(shí)進(jìn)行與郵件服務(wù)器的連接的,對于在同一個(gè)郵件服務(wù)器上發(fā)送多個(gè)郵件來講可謂低效的方式。
    注意:如果需要在發(fā)送郵件過程中監(jiān)控mail命令的話,可以在發(fā)送前設(shè)置debug標(biāo)志:

    session.setDebug(true)。


    G.Store和Folder
    接收郵件和發(fā)送郵件很類似都要用到Session。但是在獲得Session后,我們需要從Session中獲取特定類型的Store,然后連接到 Store,這里的Store代表了存儲郵件的郵件服務(wù)器。在連接Store的過程中,極有可能需要用到用戶名、密碼或者Authenticator。

    // Store store = session.getStore("imap");
    Store store = session.getStore("pop3");
    store.connect(host, username, password);

    在連接到Store后,一個(gè)Folder對象即目錄對象將通過Store的getFolder()方法被返回,我們可從這個(gè)Folder中讀取郵件信息:

    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_ONLY);
    Message message[] = folder.getMessages();

    上面的例子首先從Store中獲得INBOX這個(gè)Folder(對于POP3協(xié)議只有一個(gè)名為INBOX的Folder有效),然后以只讀 (Folder.READ_ONLY)的方式打開Folder,最后調(diào)用Folder的getMessages()方法得到目錄中所有Message的數(shù) 組。

    注意:對于POP3協(xié)議只有一個(gè)名為INBOX的Folder有效,而對于IMAP協(xié)議,我們可以訪問多個(gè)Folder(想想前面講的IMAP協(xié)議)。而 且SUN在設(shè)計(jì)Folder的getMessages()方法時(shí)采取了很智能的方式:首先接收新郵件列表,然后再需要的時(shí)候(比如讀取郵件內(nèi)容)才從郵件 服務(wù)器讀取郵件內(nèi)容。
    在讀取郵件時(shí),我們可以用Message類的getContent()方法接收郵件或是writeTo()方法將郵件保存,getContent()方法 只接收郵件內(nèi)容(不包含郵件頭),而writeTo()方法將包括郵件頭。

    System.out.println(((MimeMessage)message).getContent());

    在讀取郵件內(nèi)容后,別忘記了關(guān)閉Folder和Store。

    folder.close(aBoolean);
    store.close();

    傳遞給Folder.close()方法的boolean 類型參數(shù)表示是否在刪除操作郵件后更新Folder。

    H.繼續(xù)向前進(jìn)!
    在講解了以上的七個(gè)Java Mail核心類定義和理解了簡單的代碼片斷后,下文將詳細(xì)講解怎樣使用這些類實(shí)現(xiàn)JavaMail API所要完成的高級功能。

    五、使用JavaMail API
    在明確了JavaMail API的核心部分如何工作后,本人將帶領(lǐng)大家學(xué)習(xí)一些使用Java Mail API任務(wù)案例。
    1.發(fā)送郵件
    在獲得了Session后,建立并填入郵件信息,然后發(fā)送它到郵件服務(wù)器。這便是使用Java Mail API發(fā)送郵件的過程,在發(fā)送郵件之前,我們需要設(shè)置SMTP服務(wù)器:通過設(shè)置Properties的mail.smtp.host屬性。

    String host = ...;
    String from = ...;
    String to = ...;

    // Get system properties
    Properties props = System.getProperties();

    // Setup mail server
    props.put("mail.smtp.host", host);

    // Get session
    Session session = Session.getDefaultInstance(props, null);

    // Define message
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO,
    new InternetAddress(to));
    message.setSubject("Hello JavaMail");
    message.setText("Welcome to JavaMail");
    // Send message
    Transport.send(message);

    由于建立郵件信息和發(fā)送郵件的過程中可能會拋出異常,所以我們需要將上面的代碼放入到try-catch結(jié)構(gòu)塊中。

    2.接收郵件
    為了在讀取郵件,我們獲得了session,并且連接到了郵箱的相應(yīng)store,打開相應(yīng)的Folder,然后得到我們想要的郵件,當(dāng)然別忘記了在結(jié)束時(shí) 關(guān)閉連接。

    String host = ...;
    String username = ...;
    String password = ...;

    // Create empty properties
    Properties props = new Properties();

    // Get session
    Session session = Session.getDefaultInstance(props, null);

    // Get the store
    Store store = session.getStore("pop3");
    store.connect(host, username, password);

    // Get folder
    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_ONLY);

    // Get directory
    Message message[] = folder.getMessages();

    for (int i=0, n=message.length; i<n; i++) {
    System.out.println(i + ": " + message[i].getFrom()[0]
    + ""t" + message[i].getSubject());
    }

    // Close connection
    folder.close(false);
    store.close();

    上面的代碼所作的是從郵箱中讀取每個(gè)郵件,并且顯示郵件的發(fā)信人地址和主題。從技術(shù)角度講,這里存在著一個(gè)異常的可能:當(dāng)發(fā)信人地址為空 時(shí),getFrom()[0]將拋出異常。

    下面的代碼片斷有效的說明了如何讀取郵件內(nèi)容,在顯示每個(gè)郵件發(fā)信人和主題后,將出現(xiàn)用戶提示從而得到用戶是否讀取該郵件的確認(rèn),如果輸入YES 的話,我們可用Message.writeTo(java.io.OutputStream os)方法將郵件內(nèi)容輸出到控制臺上,關(guān)于Message.writeTo()的具體用法請看JavaMail API。

    BufferedReader reader = new BufferedReader (
    new InputStreamReader(System.in));

    // Get directory
    Message message[] = folder.getMessages();
    for (int i=0, n=message.length; i<n; i++) {
    System.out.println(i + ": " + message[i].getFrom()[0]
    + ""t" + message[i].getSubject());

    System.out.println("Do you want to read message? " +
    "[YES to read/QUIT to end]");
    String line = reader.readLine();
    if ("YES".equals(line)) {
    message[i].writeTo(System.out);
    } else if ("QUIT".equals(line)) {
    break;
    }
    }


    3.刪除郵件和標(biāo)志
    設(shè)置與message相關(guān)的Flags是刪除郵件的常用方法。這些Flags表示了一些系統(tǒng)定義和用戶定義的不同狀態(tài)。在Flags類的內(nèi)部類Flag中 預(yù)定義了一些標(biāo)志:
    Flags.Flag.ANSWERED
    Flags.Flag.DELETED
    Flags.Flag.DRAFT
    Flags.Flag.FLAGGED
    Flags.Flag.RECENT
    Flags.Flag.SEEN
    Flags.Flag.USER
    但需要在使用時(shí)注意的:標(biāo)志存在并非意味著這個(gè)標(biāo)志被所有的郵件服務(wù)器所支持。例如,對于刪除郵件的操作,POP協(xié)議不支持上面的任何一個(gè)。所以要確定哪 些標(biāo)志是被支持的——通過訪問一個(gè)已經(jīng)打開的Folder對象的getPermanetFlags()方法,它將返回當(dāng)前被支持的Flags類對象。
    刪除郵件時(shí),我們可以設(shè)置郵件的DELETED標(biāo)志:

    message.setFlag(Flags.Flag.DELETED, true);

    但是首先要采用READ_WRITE的方式打開Folder:

    folder.open(Folder.READ_WRITE);

    在對郵件進(jìn)行刪除操作后關(guān)閉Folder時(shí),需要傳遞一個(gè)true作為對刪除郵件的擦除確認(rèn)。

    folder.close(true);

    Folder類中另一種用于刪除郵件的方法expunge()也同樣可刪除郵件,但是它并不為sun提供的POP3實(shí)現(xiàn)支持,而其它第三方提供的POP3 實(shí)現(xiàn)支持或者并不支持這種方法。
    另外,介紹一種檢查某個(gè)標(biāo)志是否被設(shè)置的方法:Message.isSet(Flags.Flag flag)方法,其中參數(shù)為被檢查的標(biāo)志。

    4.郵件認(rèn)證
    我們在前面已經(jīng)學(xué)會了如何使用Authenticator類來代替直接使用用戶名和密碼這兩字符串作為 Session.getDefaultInstance()或者Session.getInstance()方法的參數(shù)。在前面的小試牛刀后,現(xiàn)在我們將 了解到全面認(rèn)識一下郵件認(rèn)證。
    我們在此取代了直接使用郵件服務(wù)器主機(jī)名、用戶名、密碼這三個(gè)字符串作為連接到POP3 Store的方式,使用存儲了郵件服務(wù)器主機(jī)名信息的屬性文件,并在獲得Session時(shí)傳入自定義的Authenticator實(shí)例:

    // Setup properties
    Properties props = System.getProperties();
    props.put("mail.pop3.host", host);

    // Setup authentication, get session
    Authenticator auth = new PopupAuthenticator();
    Session session = Session.getDefaultInstance(props, auth);

    // Get the store
    Store store = session.getStore("pop3");
    store.connect();


    PopupAuthenticator類繼承了抽象類Authenticator,并且通過重載Authenticator類的 getPasswordAuthentication()方法返回PasswordAuthentication類對象。而 getPasswordAuthentication()方法的參數(shù)param是以逗號分割的用戶名、密碼組成的字符串。

    import javax.mail.*;
    import java.util.*;

    public class PopupAuthenticator extends Authenticator {

    public PasswordAuthentication getPasswordAuthentication(String param) {
    String username, password;

    StringTokenizer st = new StringTokenizer(param, ",");
    username = st.nextToken();
    password = st.nextToken();

    return new PasswordAuthentication(username, password);
    }

    }


    5.回復(fù)郵件
    回復(fù)郵件的方法很簡單:使用Message類的reply()方法,通過配置回復(fù)郵件的收件人地址和主題(如果沒有提供主題的話,系統(tǒng)將默認(rèn)將 “Re:”作為郵件的主體),這里不需要設(shè)置任何的郵件內(nèi)容,只要復(fù)制發(fā)信人或者reply-to到新的收件人。而reply()方法中的boolean 參數(shù)表示是否將郵件回復(fù)給發(fā)送者(參數(shù)值為false),或是恢復(fù)給所有人(參數(shù)值為true)。
    補(bǔ)充一下,reply-to地址需要在發(fā)信時(shí)使用setReplyTo()方法設(shè)置。

    MimeMessage reply = (MimeMessage)message.reply(false);
    reply.setFrom(new InternetAddress("president@whitehouse.gov"));
    reply.setText("Thanks");
    Transport.send(reply);


    6.轉(zhuǎn)發(fā)郵件
    轉(zhuǎn)發(fā)郵件的過程不如前面的回復(fù)郵件那樣簡單,它將建立一個(gè)轉(zhuǎn)發(fā)郵件,這并非一個(gè)方法就能做到。
    每個(gè)郵件是由多個(gè)部分組成,每個(gè)部分稱為一個(gè)郵件體部分,是一個(gè)BodyPart類對象,對于MIME類型郵件來講就是MimeBodyPart 類對象。這些郵件體包含在成為Multipart的容器中對于MIME類型郵件來講就是MimeMultiPart類對象。在轉(zhuǎn)發(fā)郵件時(shí),我們建立一個(gè)文 字郵件體部分和一個(gè)被轉(zhuǎn)發(fā)的文字郵件體部分,然后將這兩個(gè)郵件體放到一個(gè)Multipart中。說明一下,復(fù)制一個(gè)郵件內(nèi)容到另一個(gè)郵件的方法是僅復(fù)制它 的DataHandler(數(shù)據(jù)處理者)即可。這是由JavaBeans Activation Framework定義的一個(gè)類,它提供了對郵件內(nèi)容的操作命令的訪問、管理了郵件內(nèi)容操作,是不同的數(shù)據(jù)源和數(shù)據(jù)格式之間的一致性接口。

    // Create the message to forward
    Message forward = new MimeMessage(session);

    // Fill in header
    forward.setSubject("Fwd: " + message.getSubject());
    forward.setFrom(new InternetAddress(from));
    forward.addRecipient(Message.RecipientType.TO,
    new InternetAddress(to));

    // Create your new message part
    BodyPart messageBodyPart = new MimeBodyPart();
    messageBodyPart.setText(
    "Here you go with the original message:"n"n");

    // Create a multi-part to combine the parts
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // Create and fill part for the forwarded content
    messageBodyPart = new MimeBodyPart();
    messageBodyPart.setDataHandler(message.getDataHandler());

    // Add part to multi part
    multipart.addBodyPart(messageBodyPart);

    // Associate multi-part with message
    forward.setContent(multipart);

    // Send message
    Tran
    posted @ 2010-06-03 12:18 donghang73 閱讀(302) | 評論 (0)編輯 收藏
    1、將用戶名(Grape)加入sudoers
    $su
    (input password,不帶回顯)
    $echo 'Grape ALL=(ALL) ALL' >> /etc/sudoers

    2、文本編輯(突然忘記了,寫下來,以免再忘,呵呵)
    gedit

    3、Windows無法啟動 / 調(diào)整Windows和Linux的啟動順序
    位 置:/boot/grub/menu.lst
    $sudo gedit /boot/grub/menu.lst
    添加或者修改:
    title Windows XP Professional
    rootnoverify (hd0,0)
    chainloader +1

    4、安裝yum
    $sudo rpm -ivh http://rpv.livna.org/livna-release-9.rpm
    (另 外:
    $sudo yum update
    可以執(zhí)行系統(tǒng)的全面升級,不過網(wǎng)上有資料說不推薦使用...)

    5、中文輸入法
    $sudo yum install scim-pinyin
    (可以看到y(tǒng)um的作用了嘿)
    這個(gè)安裝完似乎 要重啟下XWindow

    6、重啟XWindow
    Ctrl+Alt+Backspace
    簡單!~

    7、tar.bz2的安裝(具體參數(shù)就省略了)
    解壓:
    $tar -xjf FILENAME.tar.bz2
    進(jìn)入目錄安 裝:
    #./configure
    #make
    #make install

    8、進(jìn)入root
    $su root
    (input password)^_^
    #

    9、MPlayer
    更改配置文件:
    $gedit ~/.mplayer/config
    全屏:
    寫入:
    zoom=yes
    由 于我有兩塊聲卡,這下吃了大苦頭了,要么用MPlayer播放avi沒聲音,要么用RealPlayer播放rm/rmvb沒聲音....
    要解決 問題(前提是在Linux下的硬件配置要一致,驅(qū)動正確),要么在BIOS里面屏蔽一塊聲卡,要么可以選擇在MPlayer的配置文件里寫入音頻輸出的設(shè) 備配置:
    ao=oss:/dev/dsp2,oss:/dev/dsp1,(最后這個(gè),不能少)
    或者ao=alsa或者pcm之類 的...
    嗯,我要好好夸獎這個(gè)播放器,界面簡潔,畫質(zhì)也還不錯(cuò)吧,啟動非常快,快得剛開始讓我有點(diǎn)驚訝...

    10、MP3的標(biāo)簽問題
    很要命的問題,全 是亂碼...
    可以安裝一個(gè)叫python-mutagen的小東東,它可以將MP3標(biāo)簽里面的ID3v1、ID3v2等 標(biāo)簽統(tǒng)統(tǒng)轉(zhuǎn)換成APEv2填充,這樣在Linux和Windows下面都可以顯示正常了。
    千千靜聽默認(rèn)讀取的就是APEv2格式的標(biāo) 簽,foobar也讀取APEv2的標(biāo)簽,但是在Windows下面會出現(xiàn)一個(gè)新問題,所有的歌曲在以詳細(xì)信息查看的時(shí)候就會顯示亂碼—— ???????,怎么辦呢?干脆刪掉ID3v1的標(biāo)簽吧。
    $mid3iconv -e GBK --remove v1 *.MP3
    這個(gè)小東東效果很好的! 贊!~

    11、訪問局域網(wǎng)共享
    不知道為什么,我的Fedora 9用不成smbmount,但是可以找到smbclient,也可以了
    列出共享:
    #smbclient -L //192.168.1.200 -U 用戶名
    #smbclient //192.168.1.200 -U 用戶名
    這個(gè)執(zhí)行完就可以進(jìn) 入
    smb: ">
    呵呵,ls、cd等命令統(tǒng)統(tǒng)可以用,還可以用get和put下載和上傳文件
    當(dāng)然,那樣有些麻煩,當(dāng)然可以 把共享目錄像掛載硬盤一樣掛載到/mnt下面的目錄
    Fedora 9下面得找到/sbin/mount.cifs
    mount.cifs //192.168.1.200/Music /mnt/netshare -o user=用戶名
    呵呵,如果那個(gè)“Music”也就是掛載的目錄名中間有空格怎么辦?簡單~~
    mount.cifs //192.168.1.200/'Music Pop' /mnt/netshare -o user=用戶名
    搞定!~

    12、掛載硬盤、移動硬盤等
    哎,用得太多了,都忘不了了,也寫寫吧
    比如要掛載原來的系統(tǒng)盤(假設(shè)為Windows下的C盤,位置 /dev/sda0),NTFS格式
    $sudo mount -t ntfs /dev/sda0 /mnt/winsys
    卸載:
    $sudo umount /dev/sda0
    或者:
    $sudo umount /mnt/winsys
    或者能卸載的全卸載:
    $sudo umount -a
    有時(shí)候移動硬盤在Windows下非正常拔出可能導(dǎo)致在Linux下無法掛載,使用上述命令也無法掛載,這種情況可以使用 force開關(guān)
    $sudo mount -t ntfs /dev/sdc1 /mnt/usbhdd -o force
    這樣,它會重寫 NTFS的日志文件,將磁盤掛載,Linux是很嚴(yán)謹(jǐn)?shù)呐叮
    先寫這么多吧,以后碰到什么再寫^_^
    Linux很強(qiáng)大,慢慢學(xué)習(xí) ing~~
    喜歡Linux (*^__^*)


    轉(zhuǎn)自:http://www.linuxidc.com/Linux/2008-10/17050.htm

     

     


    posted @ 2010-04-09 01:17 donghang73 閱讀(174) | 評論 (0)編輯 收藏

    1. 安裝依賴包
    su -'yum install compat-libstdc++-33 compat-libstdc++-296'

    su -c '/sbin/ldconfig/'

    2. Oracle的網(wǎng)站上下載linux版的JDK安裝文件,jdk-6u19-linux-i586-rpm.bin(目前的最新版)
     
    并將安裝文件移動到/opt目錄下

    3.
    切換到root用戶,并進(jìn)入/opt目錄

    su --login
    輸入密碼
    cd 
    /opt


    4.
    直接運(yùn)行安裝文件即可完成安裝

    sh ./jdk-6u19-linux-i586-rpm.bin

    一路按space,選擇接受協(xié)議,然后就等待它完成吧。

    5.
    安裝完成后就需要設(shè)定環(huán)境變量了

    # nano /etc/profile.d/java.sh
    在編輯器中輸入如下內(nèi)容:
    export JAVA_HOME
    =(具體的JDK的安裝目錄,例如/usr/java/jdk1.6.0_19/
    export PATH
    =$JAVA_HOME/bin:$PATH 
    然后保存退出即可


    6. 因?yàn)镕edora 9自帶了OpenJDK,所以還需要將剛剛安裝的JDK設(shè)為默認(rèn)

    /usr/sbin/alternatives --install /usr/bin/java java /(JDK的安裝目錄)/bin/java 3
    /usr/sbin/alternatives --config java

    然后會出現(xiàn):

    共有 3 個(gè)程序提供“java”。

      選擇    命令
    -----------------------------------------------
    *  1           /usr/lib/jvm/jre-1.6.0-openjdk/bin/java
       
    2           /usr/lib/jvm/jre-1.5.0-gcj/bin/java
     
    + 3           /usr/java/jdk1.6.0_19/bin/java

    按 Enter 來保存當(dāng)前選擇[
    +],或鍵入選擇號碼:

    輸入:3 回車后即ok!


    7. 測試是否安裝成功

    java -version

    如果顯示

    java version "1.6.0_19"
    Java(TM) SE Runtime Environment (build 
    1.6.0_19-b04)
    Java HotSpot(TM) Client VM (build 
    16.2-b04, mixed mode, sharing)

    則表示已成功安裝


    posted @ 2010-04-09 00:12 donghang73 閱讀(384) | 評論 (0)編輯 收藏
    首先去小企鵝的官方網(wǎng)站上下載fedora對應(yīng)的RPM包。

    然后就是常用的RPM包安裝方法了
    rpm -ivh fcitx-3.2.050827-fc4.noarch.rpm


    要想讓輸入法開機(jī)自啟動, 在 /etc/X11/xinit/xinput.d/ 目錄中查看文件zh_CN ,如果沒有就建一個(gè);把里面的內(nèi)容改為如下的;


    XIM=fcitx
    XIM_PROGRAM=fcitx
    GTK_IM_MODULE=fcitx
    gnome-im-settings-daemon >/dev/null


    OK!大功告成。


    posted @ 2010-04-08 23:38 donghang73 閱讀(405) | 評論 (0)編輯 收藏
    使用Nero Burning ROM 將APE(CUE)刻錄成CD音樂光盤

      APE是目前流行的數(shù)字音樂文件格式之一。與MP3這類有損壓縮方式不同,APE是一種無損壓縮技術(shù),也就是說當(dāng)你將從音頻CD上 讀取的音頻數(shù)據(jù)文件壓縮成APE格式后,你還可以再將APE格式的文件還原,而還原后的音頻文件與壓縮前的一模一樣,沒有任何損失。APE的文件大小大概 為CD的一半,但是隨著寬帶的普及,APE格式受到了許多音樂愛好者的喜愛,特別是對于希望通過網(wǎng)絡(luò)傳輸音頻CD的朋友來說,APE可以幫助他們節(jié)約大量 的資源。

    本人在電驢瀏覽器里下載到了非常多的APE音樂文件,這APE的容量比較大,很占硬盤空間,就想將一部分APE刻錄成CD光盤。

    在百度里用關(guān)鍵詞“如何把APE刻錄成CD ”搜索到的方法有很多,看到那些方法都非常麻煩,操作起來不方便。下面根據(jù)自己摸索,終于找到了比較簡單的方 法,拿出來跟大家分享一下。

    一、有CUE文件的APE刻錄。

    運(yùn)行刻錄軟件,選擇刻錄音頻->制作音頻光盤。





    軟件會自動進(jìn)入下面這個(gè)界面:



    這時(shí)候無法選擇CUE文件進(jìn)行刻錄,必須點(diǎn)擊“上一步”,退回來選擇。選擇左邊的第三項(xiàng)“映像、項(xiàng)目、復(fù)制”,然后點(diǎn)擊右邊的“映像光盤或保存項(xiàng) 目”。





    找到要刻錄的APE的播放列表CUE文件,打開:



    接下來會有幾秒鐘的等待時(shí)間,這可能是檢測過程。然后會顯示下面這個(gè)窗口,放入刻錄光盤,直接點(diǎn)擊刻錄就行了。



    二、沒有播放列表CUE文件的刻錄方法

    如果沒有CUE播放列表,就只能下載APE插件APE Plugin for Nero 了。可以到百度去搜索。建議使用這個(gè)網(wǎng)址:http://www.china1000.net/downinfo/25697.html。 我的插件就是從這里下載的。

    使用該插件可以讓Nero直接刻錄APE音樂。解壓nxMyAPE.dll到C:"PROGRAM FILES"COMMON FILES"AHEAD"AUDIOPLUGINS,啟動Nero后就可以了!安裝了ape plugin for nero,就可以像用wav、mp3刻cd一樣,直接在nero里拖放就成。


    PS:如果沒有cue文件,而下載的文件是每個(gè)音軌單獨(dú)對應(yīng)一個(gè)ape,則與nero里把wav或者mp3文件刻成cd類似,一個(gè)一個(gè)文 件分別導(dǎo)入。但是如果整張音樂CD光盤就一個(gè)APE,且沒有CUE文件的話,按第二種方法刻錄出來的CD光盤,里面的歌曲就無法選擇曲目進(jìn)行播放。遇到這 種情況的時(shí)候最好先制作CUE文件。制作CUE的方法可以到網(wǎng)上去搜索,這里就不再敘述了。

    轉(zhuǎn)自:
    http://hi.baidu.com/94selina/blog/item/2f9ec281040eb9d3bc3e1e56.html

    補(bǔ)充:
    1、用NERO刻錄APE就需要安裝一個(gè)插件,這插件很容易找,在google或迅雷一搜“NERO支持APE刻錄CD插件”你就可以找到很多,其實(shí)只是 個(gè)DLL文件。
    插件的安裝方法和注意事項(xiàng)::
    - Nero Burning ROM 5.5.9.0或更高版本  
    - Nero Burning ROM 5.x:將.dll解壓到'...AheadSharedAudioPlugins'目錄下  
    - Nero Burning ROM 6.x:將.dll解壓到'Program FilesCommon FilesAheadAudioPlugins'目錄下  

    - Nero Burning ROM 7.x將.dll解壓到
    'Program FilesCommon FilesAheadAudioPlugins'目錄下
    * 插件(*.dll)名字頭兩個(gè)字母'nx'必須小寫

    2、準(zhǔn)備工作完畢后,開始動手吧~~~首先運(yùn)行NERO6.0,注意啦,我用的是6.0而不是其它版本,開始我用的是7.0,沒有成功,后來改用6.0。 是什么原因,我也不清楚,可能是我安裝的不好,可能7.0真的不支持吧,可能我的系統(tǒng)有問題……



    3、選擇“刻錄鏡像文件”
    然后選擇這個(gè)APE相關(guān)的CUE文件,“打開”之后你就可以刻錄了。。。。。

    怎樣?很簡單吧?三步就搞掂了。但是初學(xué)者可能會遇到很多問,下面我來說說要注意的一些小細(xì)節(jié):

    1、CUE打開出錯(cuò)。
    不用想了,CUE有問題,所以NERO肯定打不開,首先你要了解CUE,你也可以自己編寫。用記事本打開CUE,你就可以看到CD的詳細(xì)信息:

    第一行是:CATALOG 0028946218624
                這個(gè)CATALOG是一個(gè)媒體編目碼(Media Catalog Number),必須是13位阿拉伯?dāng)?shù)字,一般與唱片的UPC(商品條形碼)相對應(yīng)。比如這張片子的UPC碼就是:0028946218624。兩張不同 唱片的CATALOG碼是絕不會重復(fù)的。這一行是可選的,沒有也可以。

    第二行是:PERFORMER 'Mozart'
                這個(gè)PERFORMER是指整個(gè)唱片的表演家的名字。必須用雙引號括起來。這一行也是可選的。

    第三行是: 'Les grandes sonates pour violon, vol.1'
                    TITLE是指唱片的名字。必須用雙引號括起來。這一行也是可選的。

    第四行是:FILE “歌曲名 4CD-1.ape” WAVE
                    FILE就是你要刻錄的光盤映像文件了。WAVE表示該文件是音頻文件。
    文件的路徑可以是絕對路徑,如:“I:歌曲名 4CD-1.ape”。
    也可以是相對路徑,如:“歌曲名 4CD-1.ape”。
    注意,如果使用相對路徑,則CUE文件和APE必須在同一路徑下,否則播放或刻錄的時(shí)候CUE無法定位APE/WAV文件。

    第五行是:TRACK 01 AUDIO
                    這一行很關(guān)鍵,它表示當(dāng)前刻錄那個(gè)光軌、光軌的類型。這里表示是第一個(gè)光軌,AUDIO表示光軌的類型是音頻。
    當(dāng)中這個(gè)數(shù)字必須是從01開始的2位阿拉伯?dāng)?shù)字,升序排列,絕不可以跳躍、空缺或重復(fù),一定是:01、02、03、04…這樣下去,直到結(jié)束。

    第六、七行
                   指該曲目的表演家、曲目的名字,這兩行都是可選的,也可以只有其中的一個(gè)。

    第八行:INDEX 01 00:00:00
                這行表示光軌中段落的索引號。其中INDEX 00一般表示該光軌開始時(shí)的間歇(留一段空白),而INDEX 01則表示音樂開始了,多段的索引:01、02、03等用得比較少,一般表示交響樂中的段落等。大部分CD播放機(jī)有INDEX顯示功能,能在播放時(shí)顯示 INDEX號碼。如果這段音樂有INDEX 00,那么大部分CD機(jī)在選曲時(shí)將會自動跳躍到INDEX 01處進(jìn)行播放,而在順序播放時(shí),會從INDEX 00處開始,以保持曲間的間隙,這時(shí)候,CD機(jī)的時(shí)間顯示為負(fù)數(shù)。
    INDEX 01是必需的,而INDEX 00等都是可選的。索引號后面用冒號分開的數(shù)字,表示該索引開始的時(shí)間。第一段是分鐘,第二段是秒,第三段是幀數(shù)()。一秒鐘的音樂包含75個(gè)幀,數(shù)字從 零開始,到74為止。
    注意:這個(gè)時(shí)間是相對于整個(gè)映像文件的絕對值。


    好了,了解了CUE可以自己修改和編寫CUE文件了。

    2、提示打不開APE文件。
    這個(gè)要跟CUE里的信息有關(guān),打開CUE文件,在第四行 FILE 'CDImage.ape' WAVE
    如果雙引號里的是CDImage.ape。那么,ape文件名必須是CDImage。只要把APE文件名改為跟CUE里的匹配就行了。

    3、NERO刻錄的APE文件不能有無效字符在文件名里面,比如CDImage.ape是可以的,
    CD Image.ape這個(gè)文件名就是肯定不能刻錄的,會提示出錯(cuò)。。。
    建議如果出現(xiàn)不能刻錄的問題,但是可以播放的話,將文件名改成CDImage.ape再試試,同時(shí)不要忘了要修改一下CUE文件的第三行,等下又要出現(xiàn)錯(cuò) 誤了。

    還有一點(diǎn)要注意的:


    flac和ape一樣是無損壓縮的格式,國外比較的流行flac,國內(nèi)的用ape的比較多,我兩個(gè)都用

    a. 將你的flac文件就是很大的那個(gè)音頻文件的名字改成CDImage.flac,如果是ape文件改名成CDImage.ape,注意這里的.flac 和.ape都是系統(tǒng)文件名后綴,不要改錯(cuò)了,不知道什么叫在后綴名的翻windows書看看

    b. 將你的cue文件用記事本打開,修改第四行的相應(yīng)文件名,比如樓主的這個(gè)改成

    FILE 'CDImage.flac' WAVE 如果是APE 就改成 FILE 'CDImage.APE' WAVE

    要切記,文件名不能有空格。
    posted @ 2010-04-07 19:02 donghang73 閱讀(4837) | 評論 (0)編輯 收藏

    在使用Spring的AOP編程時(shí),會用到這幾個(gè)lib:
    asm-2.2.2.jar
    asm-commons-2.2.2.jar
    asm-util-2.2.2.jar

    Hibernate使用如果lib:
    asm.jar
    asm-attrs.jar


    其中asm-2.2.2.jar與asm.jar存在類上的沖突!!!
    使用其中之一或兩者都使用,可能會出現(xiàn)如下錯(cuò)誤:
    java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
    java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor
    java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。


    解決辦法是:
    1.去掉類路徑上的關(guān)于Hibernate的3個(gè)lib
    asm.jar
    asm-attrs.jar
    cglib-2.1.3.jar

    2.加入Spring中的以下4個(gè)lib
    asm-2.2.2.jar
    asm-commons-2.2.2.jar
    asm-util-2.2.2.jar
    cglib-nodep-2.1_3.jar

    OK,搞定了!!! 

    轉(zhuǎn)自:http://hi.baidu.com/hateeyes/blog/item /741acbd47cb43403a08bb771.html
    posted @ 2010-02-09 16:26 donghang73 閱讀(171) | 評論 (0)編輯 收藏
    因?yàn)镠ibernate采用Anotation的方式配置,故而在applicationContext中sesionFactory應(yīng)該基于AnnotationSessionFactoryBean,具體代碼如下:
     1 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
     2     <property name="dataSource" ref="dataSource"></property>
     3     <property name="hibernateProperties">
     4         <props>
     5             <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
     6             <prop key="hibernate.show_sql">true</prop>
     7         </props>
     8     </property>
     9     <property name="annotatedClasses">
    10             <list>
    11                 <value>com.donghang.bean.User</value>
    12             </list>
    13     </property>
    14 </bean>
    其中User即為采用Anotation映射的實(shí)體類。

    posted @ 2010-02-09 16:24 donghang73 閱讀(386) | 評論 (0)編輯 收藏
    Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
    Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V

    原因:asm-2.2.3.jar與asm.jar沖突

    解決辦法:將asm-2.2.3.jar包去掉
    posted @ 2010-02-09 16:08 donghang73 閱讀(3521) | 評論 (0)編輯 收藏
    因經(jīng)常用到,就寫在博客里吧,免得再Google了。

    1. JavaScript代碼:
    <script type="text/javascript">       
                function del() {
                    var msg = "您真的確定要刪除嗎?\n\n請確認(rèn)!";
                    if (confirm(msg)==true){
                            return true;
                        }else{
                            return false;
                        }
                    }
    </script>

    2. 具體調(diào)用:
    <a href="#" onclick="javascript:return del()">刪除</a>      

    posted @ 2010-02-04 21:28 donghang73 閱讀(269) | 評論 (0)編輯 收藏
         摘要: 轉(zhuǎn)載自http://nomandia.javaeye.com/blog/320667 一、最簡單的情況,未使用<display:column/> 標(biāo)簽 Html代碼 <%request.setAttribute( "test", new ReportList(6) );%>  ...  閱讀全文
    posted @ 2010-02-04 20:47 donghang73 閱讀(226) | 評論 (0)編輯 收藏

    1,原理

    Property 文件中,使用的編碼方式根據(jù)機(jī)器本身的設(shè)置可能是GBK或者UTF-8。而在Java程序中讀取Property文件的時(shí)候使用的是Unicode編碼方 式,這種編碼方式不同會導(dǎo)致中文亂碼。因此需要將Property文件中的中文字符轉(zhuǎn)化成Unicode編碼方式才能正常顯示中文。



    2,解決辦法

    Java提供了專門的 工具對Property文件進(jìn)行Unicode轉(zhuǎn)化,這種工具就是native2ascii,它在JDK安裝環(huán)境的bin目錄下。

    native2ascii 工具將帶有本機(jī)編碼字符(非拉丁 1 和非單一碼字符)的文件轉(zhuǎn)換成帶有Unicode編碼字符的文件。

    假設(shè)需要轉(zhuǎn)化的屬性文件 為:D:\src\resources.properties(含有中文字符)

    轉(zhuǎn)化后的屬性文件為:D:\classes \resources.properties(中文字符統(tǒng)一轉(zhuǎn)化為Unicode)

    那么使用如下命令
    JAVA_HOME\bin\native2ascii -encoding GBK D:\src\resources.properties D:\classes\resources.properties

    就能將含有中文字符的屬性文件轉(zhuǎn)化成單一Unicode編碼方式的屬 性文件。中文亂碼自然會被解決
    posted @ 2010-02-04 20:43 donghang73 閱讀(753) | 評論 (0)編輯 收藏
    sendRedirect()與forward()實(shí)現(xiàn)轉(zhuǎn)向的異同
           1.前面慢,后者快
           2.前面無法讀取request.setAttribute()所保存的數(shù)值,而后者可以讀取
           3.前者地址欄顯示真正轉(zhuǎn)向后的地址,而后者顯示的是轉(zhuǎn)向前的地址
           4.前者,轉(zhuǎn)向地址開始的"/",表示的是本機(jī)的根目錄;而后者,"/"表示的是應(yīng)用的根目錄

    1.RequestDispatcher.forward()

            是在服務(wù)器端起作用,當(dāng)使用forward()時(shí),Servletengine傳遞HTTP請求從當(dāng)前的Servlet or JSP到另外一個(gè)Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此時(shí)form提交的所有信息在 b.jsp都可以獲得,參數(shù)自動傳遞.

            但forward()無法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同時(shí)forward()無法在后面帶參數(shù)傳遞,比如servlet?name=frank,這樣不行,可以程序內(nèi)通過 response.setAttribute("name",name)來傳至下一個(gè)頁面.

            重定向后瀏覽器地址欄URL不變. 因?yàn)橥瓿梢粋€(gè)業(yè)務(wù)操作往往需要跨越多個(gè)步驟,每一步驟完成相應(yīng)的處理后,轉(zhuǎn)向到下一個(gè)步驟。比如,通常業(yè)務(wù)處理在Servlet中處理,處理的結(jié)果轉(zhuǎn)向到一個(gè) JSP頁面進(jìn)行顯示。這樣看起來類似于Servlet鏈的功能,但是還有一些區(qū)別。一個(gè)RequestDispatcher對象可以把請求發(fā)送到任意一個(gè)服務(wù)器資源,而不僅僅是另外一個(gè)Servlet。

    注意,只有在尚未向客戶端輸出響應(yīng)時(shí)才可以調(diào)用forward()方法,如果頁面緩存不為空,在重定向前將自動清除緩存。否則將拋出一個(gè)異常

    例:servlet文件中重定向


    public void doPost(HttpServletRequest request,HttpServletResponse response)

            throws ServletException,IOException

    {

            response.setContentType("text/html; charset=gb2312");

            ServletContext sc = getServletContext();

            RequestDispatcher rd = null;

            rd = sc.getRequestDispatcher("/index.jsp");

            rd.forward(request, response);

    }

         
     
    2.response.sendRedirect()

            是在用戶的瀏覽器端工作,sendRedirect()可以帶參數(shù)傳遞,比如servlet?name=frank傳至下個(gè)頁面,同時(shí)它可以重定向至不同的主機(jī)上,且在瀏覽器地址欄上會出現(xiàn)重定向頁面的URL.

            HttpServletResponse接口定義了可用于轉(zhuǎn)向的sendRedirect()方法。代碼如下:

            public void sendRedirect(java.lang.String location)throws java.io.IOException

            這個(gè)方法將響應(yīng)定向到參數(shù)location指定的、新的URL。location可以是一個(gè)絕對的URL,如response.sendRedirect ("  

            RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的區(qū)別是:前者僅是容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會顯示出轉(zhuǎn)向后的地址;后者則是完全的跳轉(zhuǎn),瀏覽器將會得到跳轉(zhuǎn)的地址,并重新發(fā)送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時(shí),盡量使用Request Dispatcher.forward()方法,并且,這樣也有助于隱藏實(shí)際的鏈接。在有些情況下,比如,需要跳轉(zhuǎn)到一個(gè)其它服務(wù)器上的資源,則必須使用 HttpServletResponse.sendRequest()方法。

    posted @ 2010-02-04 16:15 donghang73 閱讀(298) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 在线免费观看你懂的| 久久亚洲精品成人无码网站| 成人a毛片免费视频观看| 国产免费av一区二区三区| 久久综合亚洲色hezyo| 好吊妞998视频免费观看在线| 亚洲国产精品免费观看| 精品国产免费人成电影在线观看| 亚洲第一页中文字幕| 国产免费女女脚奴视频网| 亚洲国产精品白丝在线观看| 国产成人精品免费午夜app| 亚洲网站视频在线观看| 91精品免费久久久久久久久| 亚洲国产精品免费在线观看| 成年人免费的视频| 国产日本亚洲一区二区三区| 青青青国产免费一夜七次郎 | 在线观看免费视频网站色| 国产亚洲精AA在线观看SEE| 精品国产一区二区三区免费| 亚洲五月激情综合图片区| 99re免费99re在线视频手机版| 亚洲短视频在线观看| 曰批视频免费30分钟成人| 亚洲午夜精品一区二区麻豆| 成人免费无码精品国产电影| 日韩精品无码免费视频| 国产偷国产偷亚洲清高动态图| 免费a级毛片无码a∨免费软件| 亚洲国产天堂久久综合网站| av无码免费一区二区三区| 亚洲日韩精品无码专区加勒比| 国产一区二区三区无码免费| 亚洲av无码专区国产不乱码| 亚洲精品第一国产综合精品99| 成全动漫视频在线观看免费高清版下载| 亚洲另类激情综合偷自拍| 福利免费观看午夜体检区| 亚洲JLZZJLZZ少妇| 久久精品国产精品亚洲下载|