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

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

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

    itstarting:IT進(jìn)行時(shí)

    想自己所想,做自己所愛(ài)

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      28 隨筆 :: 3 文章 :: 55 評(píng)論 :: 0 Trackbacks

    以前公司購(gòu)買(mǎi)過(guò)eWebEditor,功能應(yīng)該還是不錯(cuò)的,但即便到了現(xiàn)在,也還僅是一個(gè)IE only的版本,無(wú)法滿足現(xiàn)在差異化的需求。故前段時(shí)間下了最新的FCKeditor2.3.3版本下來(lái)(當(dāng)然了,連帶java的integration),demo來(lái)看看,發(fā)現(xiàn)有幾個(gè)地方非常不爽:
    1、上載的文件,只能放在URL可及的地方(如默認(rèn)只能放到嵌入應(yīng)用路徑的/UserFiles/下);
    2、沒(méi)有明確的上載視頻的按鈕;
    3、圖片、FLASH、附件上載等,步驟多,復(fù)雜度高(想想,用戶不都是高手)。

    怎么辦呢,改!

    一、第一個(gè)就是增加一個(gè)FileLocatorServlet,思路很簡(jiǎn)單:通過(guò)這個(gè)服務(wù)來(lái)定位文件,而不是之間產(chǎn)生鏈接,既是安全的考慮,也是應(yīng)用集群的一個(gè)重要考慮點(diǎn)。而且原來(lái)的幾個(gè)servlet的配置羅嗦且重疊,難以讓人產(chǎn)生美感。所謂代碼勝千言,通過(guò)下面的web.xml大家應(yīng)該可以看出修理的要點(diǎn):

    ??1 <? xml?version="1.0"?encoding="ISO-8859-1" ?>
    ??2
    ??3 <! DOCTYPE?web-app
    ??4 ??PUBLIC?"-//Sun?Microsystems,?Inc.//DTD?Web?Application?2.2//EN"
    ??5 ??"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd" >
    ??6
    ??7 < web-app >
    ??8 ?? < display-name > FCKeditor?Test?Application </ display-name > ??
    ??9 ???? < context-param >
    ?10 ???????? <!-- ?setting?the?FCKecitor?context?based?parameters? -->
    ?11 ???????? <!-- ?baseDir?means?the?root?of?the?uploaded?file/image/flash?stored?
    ?12 ?????????????the?prefix?of?'file:/'?means?strore?in?a?file?system?root?that?cannot?get?from?webapp?url
    ?13 ???????? -->
    ?14 ???????? < param-name > baseDir </ param-name >
    ?15 ???????? < param-value > file:/C:/Temp/FCKeditorUpload/ </ param-value >
    ?16 ???? </ context-param > ?
    ?17
    ?18 ???? < context-param >
    ?19 ???????? <!-- ?
    ?20 ?????????????if?the?baseDir?prefix?by?'file:/',please?set?it.
    ?21 ???????? -->
    ?22 ???????? < param-name > fileLocator </ param-name >
    ?23 ???????? < param-value > /editor/filemanager/browser/default/service/jsp/filelocator </ param-value >
    ?24 ???? </ context-param > ?
    ?25
    ?26 ???? < context-param >
    ?27 ???????? <!-- ?
    ?28 ?????????????debug?setting,true?means?verbose?output?to?the?console.
    ?29 ???????? -->
    ?30 ???????? < param-name > debug </ param-name >
    ?31 ???????? < param-value > true </ param-value >
    ?32 ???? </ context-param > ?
    ?33
    ?34 ???? < context-param >
    ?35 ???????? <!-- ?
    ?36 ?????????????enabled?setting,true?means?upload?enabled.
    ?37 ???????? -->
    ?38 ???????? < param-name > enabled </ param-name >
    ?39 ???????? < param-value > true </ param-value >
    ?40 ???? </ context-param > ?
    ?41
    ?42 ???? < context-param >
    ?43 ???????? <!-- ?
    ?44 ?????????????encoding,the?response?encoding?of?the?file/image/flash,default?is?UTF-8
    ?45 ???????? -->
    ?46 ???????? < param-name > encoding </ param-name >
    ?47 ???????? < param-value > UTF-8 </ param-value >
    ?48 ???? </ context-param > ?
    ?49
    ?50 ???? < context-param >
    ?51 ???????? <!-- ?
    ?52 ?????????????contentTypeMapping,a?map?for?the?response?ContentType
    ?53 ???????? -->
    ?54 ???????? < param-name > contentTypeMapping </ param-name >
    ?55 ???????? < param-value > doc=application/vnd.ms-word
    ?56 ????????|xls=application/vnd.ms-excel
    ?57 ????????|jpg=image/jpeg
    ?58 ????????|gif=image/gif
    ?59 ????????|swf=application/x-shockwave-flash
    ?60 ????????|avi=video/x-msvideo
    ?61 ???????? </ param-value >
    ?62 ???? </ context-param > ?
    ?63
    ?64 ???? < context-param >
    ?65 ???????? <!-- ?
    ?66 ?????????????allowedExtensionsFile,the?logic?is?'Not?allowed?means?deny.'
    ?67 ???????? -->
    ?68 ???????? < param-name > allowedExtensionsFile </ param-name >
    ?69 ???????? < param-value > doc|xls|pdf|avi </ param-value >
    ?70 ???? </ context-param > ?
    ?71
    ?72 ???? < context-param >
    ?73 ???????? <!-- ?
    ?74 ?????????????allowedExtensionsImage,the?logic?is?'Not?allowed?means?deny.'
    ?75 ???????? -->
    ?76 ???????? < param-name > allowedExtensionsImage </ param-name >
    ?77 ???????? < param-value > jpg|gif|png </ param-value >
    ?78 ???? </ context-param > ?
    ?79
    ?80 ???? < context-param >
    ?81 ???????? <!-- ?
    ?82 ?????????????allowedExtensionsFlash,the?logic?is?'Not?allowed?means?deny.'
    ?83 ???????? -->
    ?84 ???????? < param-name > allowedExtensionsFlash </ param-name >
    ?85 ???????? < param-value > swf|fla </ param-value >
    ?86 ???? </ context-param >
    ?87
    ?88 ???? < servlet >
    ?89 ???????? < servlet-name > Connector </ servlet-name >
    ?90 ???????? < servlet-class > com.fredck.FCKeditor.connector.ConnectorServlet </ servlet-class >
    ?91 ???????? < load-on-startup > 1 </ load-on-startup >
    ?92 ???? </ servlet >
    ?93 ????
    ?94 ???? < servlet >
    ?95 ???????? < servlet-name > FileLocator </ servlet-name >
    ?96 ???????? < servlet-class > com.fredck.FCKeditor.service.FileLocatorServlet </ servlet-class >
    ?97 ???????? < load-on-startup > 1 </ load-on-startup >
    ?98 ???? </ servlet >
    ?99
    100 ???? < servlet >
    101 ???????? < servlet-name > SimpleUploader </ servlet-name >
    102 ???????? < servlet-class > com.fredck.FCKeditor.uploader.SimpleUploaderServlet </ servlet-class >
    103 ???????? < load-on-startup > 1 </ load-on-startup >
    104 ???? </ servlet >
    105
    106 ?? < servlet-mapping >
    107 ???? < servlet-name > Connector </ servlet-name >
    108 ???? < url-pattern > /editor/filemanager/browser/default/connectors/jsp/connector </ url-pattern >
    109 ?? </ servlet-mapping >
    110 ??
    111 ?? < servlet-mapping >
    112 ???? < servlet-name > SimpleUploader </ servlet-name >
    113 ???? < url-pattern > /editor/filemanager/upload/simpleuploader </ url-pattern >
    114 ?? </ servlet-mapping > ??
    115 ??
    116 ?? < servlet-mapping >
    117 ???? < servlet-name > FileLocator </ servlet-name >
    118 ???? < url-pattern > /editor/filemanager/browser/default/service/jsp/filelocator </ url-pattern >
    119 ?? </ servlet-mapping > ??
    120
    121 </ web-app >

    連帶FCKeditorConfigurations.java一并修理,配置統(tǒng)一且singleton。關(guān)鍵代碼為:

    ?1
    ?2 ???? /**
    ?3 ?????*?Make?the?configuration?sigleton
    ?4 ?????*? @param ?sc
    ?5 ?????*? @return ?the?static?configuration?map
    ?6 ????? */

    ?7 ???? public ? static ?Map?getContextConfigurationsInstance(ServletContext?sc) {
    ?8 ???????? if (contextConfigurations == null ) {
    ?9 ????????????initContextConfigurations(sc);
    10 ????????}

    11 ???????? return ?contextConfigurations;
    12 ????}

    13 ????
    14 ???? /**
    15 ?????*?Init?all?the?FCKeditor?configuration.
    16 ?????*?add?by?zhengxq
    17 ?????*? @param ?sc
    18 ????? */

    19 ???? private ? static ? void ?initContextConfigurations(ServletContext?sc) {
    20 ???????? if ?(debug)
    21 ????????????System.out.println( " \r\n----?FCKeditorConfigurations?for?java?initialization?started?---- " );
    22 ????????
    23 ????????String?baseDir? = ?sc.getInitParameter( " baseDir " );
    24 ????????String?fileLocator? = ?sc.getInitParameter( " fileLocator " );
    25 ????????String?debugStr? = ?sc.getInitParameter( " debug " );
    26 ????????String?enabledStr? = ?sc.getInitParameter( " enabled " );????????
    27 ????????String?encoding? = ?sc.getInitParameter( " encoding " );
    28 ????????String?contentTypeMapping? = ?sc.getInitParameter( " contentTypeMapping " );
    29 ????????String?AllowedExtensionsFile? = ?sc.getInitParameter( " allowedExtensionsFile " );
    30 ????????String?AllowedExtensionsImage? = ?sc.getInitParameter( " allowedExtensionsImage " );
    31 ????????String?AllowedExtensionsFlash? = ?sc.getInitParameter( " allowedExtensionsFlash " );
    32 ????????
    33 ????????debug? = ?( new ?Boolean(debugStr)).booleanValue();
    34 ????????encoding? = ?(encoding == null ? || ?encoding.length() == 0 ) ? " UTF-8 " :encoding;
    35 ????????
    36 ???????? if (baseDir == null ? || ?baseDir.length() == 0 )?baseDir? = ?defaultBaseDir;
    37 ????????String?realBaseDir? = ?defaultBaseDir;
    38 ???????? if ?(baseDir.startsWith(fileSystemUriPrefix))? {
    39 ????????????realBaseDir? = ?baseDir.substring(fileSystemUriPrefix.length());????????????
    40 ????????}
    ? else ? {
    41 ????????????realBaseDir? = ?sc.getRealPath(baseDir);
    42 ????????????fileLocator? = ? null ; // no?use?and?should?set?null
    43 ????????}

    44 ????????File?baseFile = new ?File(realBaseDir);
    45 ???????? if ( ! baseFile.exists()) {
    46 ????????????baseFile.mkdir();
    47 ????????}

    48 ????????contextConfigurations? = ? new ?HashMap();
    49 ????????contextConfigurations.put( " baseDir " ,baseDir);
    50 ????????contextConfigurations.put( " realBaseDir " ,realBaseDir);
    51 ????????contextConfigurations.put( " fileLocator " ,fileLocator);
    52 ????????contextConfigurations.put( " debug " ,debugStr);
    53 ????????contextConfigurations.put( " enabled " ,enabledStr);
    54 ????????contextConfigurations.put( " encoding " ,encoding);
    55 ????????contextConfigurations.put( " contentTypeMapping " ,contentTypeMappingToMap(contentTypeMapping));
    56 ????????contextConfigurations.put( " allowedExtensionsFile " ,stringToArrayList(AllowedExtensionsFile));
    57 ????????contextConfigurations.put( " allowedExtensionsImage " ,stringToArrayList(AllowedExtensionsImage));
    58 ????????contextConfigurations.put( " allowedExtensionsFlash " ,stringToArrayList(AllowedExtensionsFlash));
    59 ????????
    60 ???????? if ?(debug)
    61 ????????????System.out.println( " \r\n----?FCKeditorConfigurations?for?java?initialization?end?---- " );
    62 ????????
    63 ????}


    FileLocatorServlet.java也很簡(jiǎn)單,無(wú)非就是文件的物理定位和文件流的輸出:

    ?1 String?type? = ?request.getParameter( " Type " );
    ?2 ????????String?fileName? = ?request.getParameter( " FileName " );
    ?3
    ?4 ????????String?realFilePath? = ?config.get( " realBaseDir " )? + ?type? + ? " / " ? + ?fileName;
    ?5 ????????File?file? = ? new ?File(realFilePath);
    ?6 ???????? if ?(file.exists())? {
    ?7 ????????????response.setHeader( " Content-Transfer-Encoding " ,? " base64 " );
    ?8 ????????????response.setHeader( " Cache-Control " ,? " no-store " );
    ?9 ????????????response.setHeader( " Pragma " ,? " no-cache " );
    10 ????????????response.setDateHeader( " Expires " ,? 0 );
    11 ????????????response.setContentType(getContentTypeByFileExt(fileName.substring(fileName.lastIndexOf( " . " ))));
    12 ????????????
    13 ????????????ServletOutputStream?out? = ?response.getOutputStream();????????????
    14 ????????????InputStream?in? = ? new ?FileInputStream(file);
    15 ????????????BufferedInputStream?bis? = ? new ?BufferedInputStream(in);
    16 ????????????BufferedOutputStream?bos? = ? new ?BufferedOutputStream(out);
    17 ???????????? byte []?buff? = ? new ? byte [ 2048 ];
    18 ???????????? int ?bytesRead;
    19 ???????????? while ?( - 1 ? != ?(bytesRead? = ?bis.read(buff,? 0 ,?buff.length)))? {
    20 ????????????????bos.write(buff,? 0 ,?bytesRead);
    21 ????????????}

    22 ???????????? if ?(bis? != ? null )? {
    23 ????????????????bis.close();
    24 ????????????}

    25 ???????????? if ?(bos? != ? null )? {
    26 ????????????????bos.close();
    27 ????????????}

    28 ????????}
    ? else ? {
    29 ???????????? throw ? new ?FileNotFoundException(fileName);
    30 ????????}

    上述改動(dòng)已經(jīng)提交給了FCKeditor,如果大家真的有興趣,可以去找里面我所提交的patch。

    二、至于上述的2、3問(wèn)題,同樣,動(dòng)手即可解決,在此略過(guò)。

    過(guò)程中倒是碰到幾個(gè)有意思的問(wèn)題,成了花絮,其實(shí)也是使用FCKeditor的一些心得,寫(xiě)寫(xiě)可能還有點(diǎn)意思:
    1、如何取得FCKeditor的值?
    答案:這是我們常常干的事情:取得這個(gè)值并賦值給某個(gè)hidden,再合法性檢查+submit等。怎么取得呢?這樣:

    1 ???? var ?oEditor? = ?FCKeditorAPI.GetInstance('editor')?;
    2 ???? // Get?the?editor?contents?in?XHTML.
    3 ???? // alert(?oEditor.GetXHTML(true)?)?;????//?"true"?means?you?want?it?formatted.
    4 ????document.all( " tip.c_content " ).value = oEditor.GetXHTML( true );

    2、如何使得FCKeditor接收tab鍵?
    答案:我們希望界面元素按照外面的安排進(jìn)行tab切換,但FCKeditor怎么能做到呢?也有辦法:

    1 function ?focusIframeOnTab(caller,?tabTargetId,?callEvent) {
    2 ???????????????? // ?If?keypress?TAB?and?not?SHIFT+TAB?
    3 ???????????????? if (callEvent.keyCode? == ? 9 ? && ? ! callEvent.shiftKey)
    4 ????????????????????document.getElementById(tabTargetId).contentWindow.focus();
    5 ????????????}

    光光有個(gè)函數(shù)頂個(gè)什么用,還要這樣:在之前的那個(gè)界面元素中加上下面的事件,如使用struts的tag的化,這樣就可以了:

    < html:text? property ="tip.c_title" ?style ="width:450px" ?tabindex ="1" ?onkeydown ="focusIframeOnTab(this,?'editor___Frame',event);if(!document.all)?return?false;" />

    這點(diǎn)是google了半天最終在FCKeditor的FAQ中找到的,看來(lái)以后用開(kāi)源的軟件第一件事情就是看FAQ,錯(cuò)不了!

    3、如何希望在FCKeditor加載完畢后做點(diǎn)什么事情?
    答案:也很簡(jiǎn)單,編寫(xiě)自己的FCKeditor_OnComplete函數(shù),如:

    function ?FCKeditor_OnComplete(?editorInstance?)? {
    ????????????????window.status?
    = ?editorInstance.Description?;
    ????????????}


    4、如果在圖片、FLASH等界面中上載了東西后,希望能告訴自己的表單,怎么做?
    答案:這個(gè)花了我不少看代碼和調(diào)試時(shí)間!其實(shí)這里的關(guān)鍵就是如何獲取嵌入FCKeditor的那個(gè)window,這樣就可以了,在對(duì)應(yīng)的js文件(如editor\dialog\fck_image\fck_image.js)中的ok方法的最后加入:


    ????
    // edit?by?zhengxq
    ???? try {????????
    ????????
    var ?obj? = ?window.dialogArguments.Editor.parent.document;
    ????????obj.getElementById(
    " tip.c_tip_has_pic " ).value? = ? " 1 " ;
    ????}
    catch (e) {} ????

    關(guān)鍵就是:window.dialogArguments.Editor.parent.document,這個(gè)能夠找到對(duì)應(yīng)窗口的引用,有了這個(gè),還不會(huì)控制嗎?!

    posted on 2007-03-11 20:20 IT進(jìn)行時(shí) 閱讀(6866) 評(píng)論(12)  編輯  收藏 所屬分類: Java Tips

    評(píng)論

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2007-03-11 21:22 祎恬凡
    謝謝摟住共享!q是多少,好隨時(shí)請(qǐng)教阿!
      回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2007-03-12 09:36 darkbluefeeling
    不認(rèn)同F(xiàn)ileLocatorServlet.java的做法。web的集群已經(jīng)是非常成熟的技術(shù),不存在你提到的風(fēng)險(xiǎn),而且web服務(wù)器處理這行靜態(tài)文件效率非常高。樓主這樣把靜態(tài)文件丟給應(yīng)用服務(wù)器去做,如果訪問(wèn)量比較高的話,問(wèn)題會(huì)非常多。  回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2007-03-12 17:11 IT進(jìn)行時(shí)
    to darkbluefeeling:
    謝謝反饋!
    據(jù)我所知,對(duì)于基于session上載的文件,一般的app中間件(包括IBM WAS5/6)都不具備集群同步的能力,難道你另有高招?請(qǐng)不吝賜教。  回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享[未登錄](méi) 2007-03-13 10:28 jacky
    我也是類似的修改了.  回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2007-07-14 11:10 gok
    請(qǐng)問(wèn)樓上知不知道怎樣截獲FCKeditor的文本編輯區(qū)的按鍵事件,我弄了很久,都沒(méi)有成功。  回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2007-11-30 11:22 IT進(jìn)行時(shí)
    有基于二次開(kāi)發(fā)的API的,可以找找看。  回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2008-02-18 23:07 FastUnit
    收藏。  回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2008-03-22 21:38 flyfan
    剛學(xué)用FCKeditor,你的文章受益不淺,轉(zhuǎn)貼了  回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2010-03-10 10:43 王彬
    我問(wèn)個(gè)問(wèn)題,F(xiàn)CKeditor編輯器里面的內(nèi)容我怎么添加到隱藏的textarea里
      回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2010-03-10 11:10 IT進(jìn)行時(shí)
    to 王彬:

    文檔你可能沒(méi)看清楚,或者我沒(méi)理解你的意思。
    如果要添加到textarea,意味著兩步:

    //1、取得fckeditor實(shí)例;
    var oEditor = FCKeditorAPI.GetInstance('editor') ;

    //2、取得fckeditor的值并賦予textarea:
    // "true" means you want it formatted.
    document.getElementById(你的textarea對(duì)象).value = oEditor.GetXHTML( true );   回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2010-03-10 11:33 王彬
    @IT進(jìn)行時(shí)
    直接在window.onload這個(gè)js里面加嗎
    還是加載后加個(gè)function方法,我覺(jué)得我的主要問(wèn)題應(yīng)該是他沒(méi)有實(shí)時(shí)把編輯器里面的內(nèi)容寫(xiě)到textarea里  回復(fù)  更多評(píng)論
      

    # re: FCKeditor的幾點(diǎn)重要改進(jìn)和使用心得,值得分享 2011-08-05 11:05 后生
    我想在FCK上實(shí)現(xiàn),光標(biāo)在“源代碼”按鈕【左上角】后,能夠在源代碼下相同。。。

    例如在設(shè)計(jì)模式時(shí),光標(biāo)在文章最后。
    現(xiàn)在點(diǎn)擊源代碼按鈕后,光標(biāo)也在源代碼最后~  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 一区二区3区免费视频| 国国内清清草原免费视频99| 免费无码看av的网站| 亚洲av午夜成人片精品网站| 亚洲sm另类一区二区三区| 男的把j放进女人下面视频免费| 国产乱子伦片免费观看中字| 亚洲精品在线视频观看| 亚洲五月午夜免费在线视频| 成人毛片免费观看视频| 久久久综合亚洲色一区二区三区| 337p日本欧洲亚洲大胆人人| 57pao国产成永久免费视频| 国产亚洲精品拍拍拍拍拍| 亚洲jizzjizz少妇| 亚洲第一成年免费网站| 亚洲国产精品久久久久网站| 国产免费内射又粗又爽密桃视频| 日韩在线a视频免费播放| 亚洲成AV人片久久| 久久99青青精品免费观看| 亚洲午夜福利精品无码| 国产精品亚洲一区二区在线观看| 四虎最新永久免费视频| 亚洲AV无码专区国产乱码电影| 伊人久久国产免费观看视频| 日韩中文无码有码免费视频| 亚洲xxxxxx| 亚洲一级毛片免费在线观看| 亚洲AV日韩AV天堂一区二区三区| 国产福利免费视频| 亚洲国产成人VA在线观看| 亚洲第一第二第三第四第五第六| 嘿嘿嘿视频免费网站在线观看| 亚洲人成网站在线播放影院在线| 国产成人精品免费大全| 亚洲国产一区二区视频网站| 男女超爽视频免费播放| 国产成人免费a在线资源| 亚洲国产午夜精品理论片在线播放 | 国内一级一级毛片a免费|