关于CKEditor4.5.6的使用,自定义toolbar配置,上传图片案例(SpringMVC+MyBatis案例),自定义行高,去编辑器的中内容,将编辑器中内容设置到指定的位置等

简介: 关于CKEditor的一个配置整理,改文件为config.js:文件内容如下: /** * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md or http://ckeditor.com/


关于CKEditor的一个配置整理,改文件为config.js

文件内容如下:

/**
 * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
 * For licensing, see LICENSE.md or http://ckeditor.com/license
 */

CKEDITOR.editorConfig = function( config ) {
 // Define changes to default configuration here. For example:
 // config.language = 'fr';
 // config.uiColor = '#AADC6E';
 config.toolbarGroups = [
  { name: 'document', groups: [ 'mode', 'document', 'doctools' ] },
  { name: 'clipboard', groups: [ 'clipboard', 'undo' ] },
  { name: 'editing', groups: [ 'find', 'selection', 'spellchecker', 'editing' ] },
  { name: 'forms', groups: [ 'forms' ] },
  { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
  '/',
  { name: 'links', groups: [ 'links' ] },
  { name: 'insert', groups: [ 'insert' ] },
  { name: 'colors', groups: [ 'colors' ] },
  { name: 'styles', groups: [ 'styles' ] },
  { name: 'tools', groups: [ 'tools' ] },
  { name: 'paragraph', groups: [ 'list', 'blocks', 'bidi', 'align', 'indent', 'paragraph' ] },
  { name: 'others', groups: [ 'others' ] },
  { name: 'about', groups: [ 'about' ] }
 ];
 // config.removeButtons = 'Source,Save,Templates,Cut,Undo,Find,Scayt,SelectAll,Paste,Copy,Redo,NewPage,Preview,Print,Form,Bold,RemoveFormat,Link,Image,TextColor,Outdent,JustifyLeft,BidiLtr,Blockquote,NumberedList,UIColor,lineheight';
 config.line_height ='8px;9px;10px;11px;12px;13px;14px;15px;16px;17px;18px;19px;20px;21px;22px;23px;24px;25px;26px;27px;28px;29px;30px;31px;32px;33px;34px;35px;36px;37px;38px;39px;40px;41px;42px;43px;44px;45px;46px;47px;48px;49px;50px;51px;52px;53px;54px;55px;56px;57px;58px;59px;60px;61px;62px;63px;64px;65px;66px;67px;68px;69px;70px;71px;72px;';
 config.skin = 'office2013';
 config.extraPlugins='imagepaste';
 config.pasteFromWordRemoveFontStyles = false;
 config.pasteFromWordRemoveStyles = false;
 config.extraPlugins = 'uploadwidget';
 config.extraPlugins = 'notificationaggregator';
 config.extraPlugins = 'notification';
 config.extraPlugins = 'uploadimage';
 config.extraPlugins = 'toolbar';
 config.extraPlugins = 'button';
 config.extraPlugins = 'filetools';
 config.extraPlugins = 'clipboard';
 config.extraPlugins = 'dialog';
 config.extraPlugins = 'dialogui';
 config.extraPlugins = 'widget';
 config.extraPlugins = 'lineutils';
 config.extraPlugins = 'widget';
 config.SecureImageUploads = true;
 config.image_previewText=' '; //预览区域显示内容
 //config.filebrowserUploadUrl: "import/ckeditorUploadFile.action";
 config.filebrowserImageUploadUrl = basePath + "/import/ckeditorUploadFile.action?type=Image"; //待会要上传的action或servlet
 
};

 

关于图片上传部分可以参考:

http://blog.csdn.net/itmyhome1990/article/details/17264627

 

实现过程中的一个案例

/*

 * name       :tuzuoquan

 * mail       :tuzq@XXXX.cn

 * date       :2016/01/13

 * version    :1.0

 * description:XXXXXX对应的js

 * CopyRight (C) 2015-12-31

 */

if (CKEDITOR.env.ie && CKEDITOR.env.version < 9)

   CKEDITOR.tools.enableHtml5Elements(document);

 

/**

 * 编辑器对应的操作方法

 *

 * 关于在线编辑器的文档:http://sdk.ckeditor.com/samples/resize.html

 */

var CKEDITORHandler = (function($) {

   return {

      /**

       * 初始化参数配置

       */

      ckeditorConfig:function(){

          //去掉开始进来的时候自动添加 BR

          CKEDITOR.config.enterMode = CKEDITOR.ENTER_BR;

          //去掉开始进来的时候自动添加P

          CKEDITOR.config.shiftEnterMode = CKEDITOR.ENTER_P;

          CKEDITOR.config.font_names='微软雅黑;宋体;新宋体;黑体;隶书;幼圆;楷体_GB2312;仿宋_GB2312;方正舒体;方正姚体;华文隶书;华文新魏;华文行楷;sans-serif;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana;'

          CKEDITOR.config.line_height="1em;1.1em;1.2em;1.3em;1.4em;1.5em";

       },

      /**

       * 初始化工具条的相关信息

       */

      initToolBar:function(){

         CKEDITOR.config.toolbar = 'Full';

  

         /**

          * 其中("-")为空间栏的水平分割,("/")为换行

          *

          * 以下:Full表示的所有的操作

          */

         CKEDITOR.config.toolbar_Full =

         [

            { name: 'document', groups: [ 'mode', 'document', 'doctools' ] },

            { name: 'clipboard', groups: [ 'clipboard', 'undo' ] },

            { name: 'editing', groups: [ 'find', 'selection', 'spellchecker', 'editing' ] },

            { name: 'forms', groups: [ 'forms' ] },

            { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },

            '/',

            { name: 'links', groups: [ 'links' ] },

            { name: 'insert', groups: [ 'insert' ] },

            { name: 'colors', groups: [ 'colors' ] },

            { name: 'styles', groups: [ 'styles' ] },

            { name: 'tools', groups: [ 'tools' ] },

            { name: 'paragraph', groups: [ 'list', 'blocks', 'bidi', 'align', 'indent', 'paragraph' ] },

            { name: 'others', groups: [ 'others' ] },

            { name: 'about', groups: [ 'about' ] }

         ];

  

         CKEDITOR.config.toolbar_Basic =

         [

             ['Source','Preview'],

             ['Cut','Copy','Paste','PasteText','PasteFromWord','-','SpellChecker'],

             ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],

             ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'],

             ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],

             ['NumberedList','BulletedList','-','Outdent','Indent'],

             ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],

             ['Link','Unlink','Anchor'],

             ['Image','Flash','Table','SpecialChar'],

             ['Styles','Format','Font','FontSize'],

             ['TextColor','BGColor'],

             ['lineheight']

         ];

       },

      /**

       * 在线编辑器的初始化过程

       * textContent   :表示的是文本组件的内容

       */

      init:function(textContent){

          //注意:这里的tpl-content-editor是编辑器对应的id

          if(CKEDITOR.instances.tplContentEditor) {

             var editor = CKEDITOR.instances["tplContentEditor"];

  

             //console.log("1------------------------------------------");

             //console.log(editor.getData());

             //editor.setData(editor.setData(textContent));

             //console.log("2------------------------------------------");

            

             //销毁编辑器,然后新增一个

             if(editor) editor.destroy(true);

          }

         

          CKEDITORHandler.ckeditorConfig();

          //初始化工具栏

          CKEDITORHandler.initToolBar();

         

          CKEDITOR.replace("tplContentEditor",

          {

             toolbar:'Basic',

             height:'300',

             width:'auto'

          });

         

          //为编辑器设置内容

          CKEDITOR.instances.tplContentEditor.setData(textContent);

       },

       /**

       * 2、判断一个字符串变量是否为空

       * 如果不为空:返回true

       * 如果为空:返回false

       */

      isNotBlank:function(variable){

         return (variable != null && typeof(variable) != "undefined" && variable != undefined && variable != "") ? true : false;

      },

       /**

        * 通过编辑的icon获得组件元素,查找父元素,直到找到含有className这个类选择器的元素停止

        * domEle         :表示的是编辑的元素

        */

       /**

         * str1这个原始的字符串中的str2全部换成str3

         * str1      :最原始的字符串

         * str2      :要被替换的字符串

         * str3      :最终替换成的字符串

         *

         * 此外可以增加String对象的原型方法:

         * String.prototype.replaceAll = function(str2,str3){

       *     return this.replace(new RegExp(str2,"gm"),str3);

       * }

         */

        replaceAll:function(str1,str2,str3) {

            var newStr  = str1;

            if(this.isNotBlank(str1)) {

                //其中gm中的g表示"执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)"

                //其中gm中的m表示执行多行匹配

                newStr = str1.replace(new RegExp(str2,"gm"),str3);

            }

            return newStr;

        },

        /**

         * 清除样式

         */

        removeCss:function(id,childPathOfSelectedElement,cssType){

            //替换原来的css样式

            var oldStyleCss = $("#generatedCss").html().replace(

                new RegExp("#"+ id + childPathOfSelectedElement + ".*?{.*"+cssType+".*?}"),"");

 

            oldStyleCss = this.replaceAll(oldStyleCss,"\r\n","");

 

            $("#generatedCss").text(oldStyleCss);

        },

       obtainComponentEle:function(domEle,className) {

          var tempObj = domEle;

          while(!$(tempObj).parent().hasClass(className)) {

             tempObj = $(tempObj).parent().get(0);

          }

         

          return $(tempObj).parent().get(0);

       },

       /**

        * 存储的是要编辑的对象

        */

       editObj : null,

       /**

        * 表示的是否是多列的

        */

       isMultiseriate : false,

       /**

        * 1、点击编辑按钮的时候执行的操作

        * domEle                     :代表的是编辑按钮

        * selectedElementInfo        :表示的是被选中的元素

        * childPathOfSelectedElement :表示的是放置内容的位置

        *

        * isMultiseriate             :表示的是是否多列

        * obj                        :表示的是被点击的个元素

        *

        * 如果是单列的:

        * 比如点击"text"组件"编辑"按钮的时候传递进入的参数是:(this,selectedElementInfo,'',false,'')

        * 如果实在配置文件中点击弹出的,传递的参数是:('',selectedElementInfo,' .xxx .xxx',false,''),其中' .xxx .xxx'是你要改变的元素

        *

        * 如果是多列的:

        * ('',selectedElementInfo,'',true,editObj)

        */

       tplEditSelectedContent:function(domEle,selectedElementInfo,childPathOfSelectedElement,isMultiseriate,editObj) {

          //存储的是点击的对象

          CKEDITORHandler.editObj = editObj;

          //存储是否是多列的情况

          CKEDITORHandler.isMultiseriate = isMultiseriate;

         

          //如果是多列的

          if(CKEDITORHandler.isMultiseriate) {

             //获得要编辑的元素的内容:

             var textContent = $(CKEDITORHandler.editObj).html();

          } else {

             //获得domEle这个编辑按钮的组件

             var componentEle = null;

             if(CKEDITORHandler.isNotBlank(domEle)) {

                componentEle = CKEDITORHandler.obtainComponentEle(domEle,"tpl-monitored-class");

             } else {

                var id = selectedElementInfo.get("id");

                componentEle = $("#" + id);

             }

            

             //将当前元素的id存储到隐藏域中

             $(".tpl-edit-popup-window #componentId").val($(componentEle).attr("id"));

             //存储要设置的元素的值

             if(!CKEDITORHandler.isNotBlank($.trim(childPathOfSelectedElement))) {

                childPathOfSelectedElement = " .tpl-component-2015-12-30-text-content";

             }

             //将要编辑的后代的值存到隐藏域中

             $(".tpl-edit-popup-window #childPathOfSelectedElement").val(childPathOfSelectedElement);

            

             //获得当前要编辑的元素的id

             var componentId = $(componentEle).attr("id");

             //获得要编辑的元素的内容:

             var textContent = $("#" + componentId + " " + childPathOfSelectedElement).html();

          }

         

          //获得文本组件中的内容

           CKEDITORHandler.init(textContent);

 

            $('.theme-popover-mask').fadeIn(10);

           $('.theme-popover').slideDown(20);

       },

       /**

        * 点击取消的时候执行的动作

        * @return

        */

       tplEditCancel:function() {

          $('.theme-popover-mask').fadeOut(100);

          $('.theme-popover').slideUp(200);

       },

       /**

        * 点击"确定的时候执行的动作"

        * @return

        */

       tplEditOk:function() {

          //获得编辑器中的内容

          var editorContent = CKEDITOR.instances.tplContentEditor.getData();

          var id = selectedElementInfo.get("id");

          /**

           * 判断是否是多列的

           */

          if(CKEDITORHandler.isMultiseriate) {

             $(CKEDITORHandler.editObj).empty();

             $(CKEDITORHandler.editObj).append(editorContent);

          } else {

             //1、首先判断编辑器内容中第一个子标签的内容是否是<pre>,若是,则在后面不在添加<pre>

             //$("<div></div>").append(editorContent).first().prop("tagName");

             //$("<div></div>").append(editorContent).first().prop("nodeName");

            

             //获得要修改的组件的id

             var componentId = $(".tpl-edit-popup-window #componentId").val();

             //获得组件中要放置内容的元素

             var childPathOfSelectedElement = $(".tpl-edit-popup-window #childPathOfSelectedElement").val();

            

             $("#" + componentId + " " + childPathOfSelectedElement).empty();

             $("#" + componentId + " " + childPathOfSelectedElement).append(editorContent);  

          }

          if($("#" + id + " .picturegroup #topMarquee_1 li").length>0){

             var currCount = $("#" + id + " .picturegroup #topMarquee_1 li").length;

               var baseHeight = 0;

            var i=0;

            for(;i<currCount;i++){

                baseHeight += $("#" + id + " .picturegroup #topMarquee_1 li").eq(i).outerHeight(true);

            }

               var dyHeight = baseHeight  + 'px';

               var divHeight = baseHeight  * 2  + 'px';      

               $("#" + id + " .picturegroup .picture-holder").css("height", dyHeight);

               $("#" + id + " .picturegroup  div").css("height", divHeight);

         

     

          }

          /*if($("#" + id + " .picturegroup #erwm").length>0){

             this.removeCss(id," .picturegroup","height");

             this.removeCss(id," .picturegroup #erwm","height");

             var height = parseFloat($("#picHeight").val());

             var spanHeight = $("#" + id + " .picturegroup #erwm .bottomContent").height();

             console.log(spanHeight);

             $("#" + id + " .picturegroup").css("height","'+(height+spanHeight)+'+'px'");

             $("#" + id + " .picturegroup #erwm").css("height","'+(height+spanHeight)+'+'px'");

          }*/

          $('.theme-popover-mask').fadeOut(100);

          $('.theme-popover').slideUp(200);

         

          //恢复默认值

          CKEDITORHandler.isMultiseriate = false;

          CKEDITORHandler.editObj = null;

       }

   }

})(jQuery);

 

/**

 * 1、页面加载完成后执行的动作

 */

$(function(){

   $('.theme-poptit .close').click(function(){

      $('.theme-popover-mask').fadeOut(100);

      $('.theme-popover').slideUp(200);

   });

});

 

关于图片上传的后台操作,使用的框架是Spring+SpringMVC+MyBatis

package XXX.controller.upload;

 

import org.apache.log4j.Logger;

 

@Controller

@RequestMapping(value = "/import", method = { RequestMethod.GET,RequestMethod.POST })

public class ImportController extends BaseController{

         /** 用于打印日志 */

         private static final Logger logger = Logger

                            .getLogger(SpecialController.class);

        

         /**

          * 此方法用于CKEditor的本地上传图片的功能

          *

          * @param param

          * @param imageFile

          * @return

          */

         @RequestMapping(value = "/ckeditorUploadFile", produces = "text/json")

         public void ckeditorUploadFile(

                            @RequestParam("upload") MultipartFile upload,

                            HttpServletRequest request,

                            HttpServletResponse response,

                            @RequestParam("CKEditorFuncNum")String CKEditorFuncNum)

                            throws IllegalStateException,IOException {

                  

                   PrintWriter out = response.getWriter();

                   response.setCharacterEncoding("utf-8");

 

                   //判断扩展文件名是否正确

                   String uploadContentType = upload.getContentType();

                   if(uploadContentType.equals("image/pjpeg") || uploadContentType.equals("image/jpeg")) {

                           

                   } else if(uploadContentType.equals("image/png") || uploadContentType.equals("image/x-png")) {

                           

                   } else if(uploadContentType.equals("image/gif")) {

                           

                   } else if(uploadContentType.equals("image/bmp")) {

                           

                   } else {

                            out.println("<script type=\"text/javascript\">");

                            out.println("window.parent.CKEDITOR.tools.callFunction(" + CKEditorFuncNum + ",''," + "'文件格式不正确(必须为.jpg/.gif/.bmp/.png文件)');");

                            out.println("</script>");

                           

                            return;

                   }

                  

                   if (!upload.isEmpty()) {

                            try {

                                     //如果上传的图片大于10M,返回提示

                                     if (upload.getSize() > 10 * 1024 * 1024) {

                                               out.println("<script type=\"text/javascript\">");

                                               out.println("window.parent.CKEDITOR.tools.callFunction(" + CKEditorFuncNum + ",''," + "'文件大小不得大于600k');");

                                               out.println("</script>");

 

                                               return;

                                     }

                                    

                                     Calendar calendar = Calendar.getInstance();//获取当前时间

                                     //时间路径,解压文件,以年月日创建文件夹

                                     String dataPath ="/"+calendar.get(Calendar.YEAR)+"/"

                                                                 + (calendar.get(Calendar.MONTH)+1)+"/" + calendar.get(Calendar.DATE)+"/";

                                     // 原文件名

                                     String srcName = upload.getOriginalFilename();

                                     //获取上传文件后缀

                                     String suffix = srcName.substring(srcName.lastIndexOf(".") + 1,

                                                        srcName.length()).toLowerCase();

                                     //随机生成32id,用于解压文件目录

                                     String uuid = UUIDGenerator.generate();

                                     //新的文件名,随机的uuid;

                                     String picName = uuid +"."+suffix;

                                    

                                     //图片存储的实际路径

                                     String urlPrefix = ExtendedServerConfig.getInstance().getStringProperty("VISITE_PREFIX_URL");

                                     //大图缩略图生成路径

                                     String thumbnailPath =ExtendedServerConfig.getInstance()

                                                                 .getStringProperty("THUMBNAIL_PATH")+ ExtendedServerConfig.getInstance()

                                                                 .getStringProperty("SAVE_BIG_THUMBNAIL")+dataPath;

                                     //生成缩略图保存数据库路径

                                     String savePath =ExtendedServerConfig.getInstance()

                                                        .getStringProperty("SAVE_BIG_THUMBNAIL")+dataPath+picName;

                                     //文件夹不存在,则创建

                                     File destfile = new File(thumbnailPath);

                                if(!destfile.exists()){

                                         destfile.mkdirs();

                                }

                                     // 写文件

                                     InputStream fi = upload.getInputStream();

                                     //上传文件写入到配置文件夹下

                                     FileUtils.writeFile(fi, thumbnailPath+picName);

                                     File file = new File(thumbnailPath+picName);

                                     if(file.exists()) {

                                               out.println("<script type=\"text/javascript\">");

                                               out.println("window.parent.CKEDITOR.tools.callFunction(" + CKEditorFuncNum + ",'" + urlPrefix + savePath + "','')");

                                               out.println("</script>");

 

                                               return;

                                     }

                            } catch (Exception e) {

                                     e.printStackTrace();

                            }

                   }

                   return;

         }

}

 

 

 

 


目录
相关文章
|
5天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
20 0
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
29天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
36 0
|
22天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
14天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
27 1
|
30天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
123 1
|
2月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
210 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
1月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
54 2
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)