FCKeditor在使用过程中出现的问题曾经困扰了我很长时间. 不过问题终于解决了. 现将解决办法分享与大家,望大家多多指教.
使用步骤:
1). 从FCKeditor的官网获取FCKeditor以及相关的jar包
2). 将FCKeditor拷贝至webroot下面,将jar包添加到lib目录下.
配置web.xml:
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <servlet> <servlet-name>Connector</servlet-name> <servlet-class> net.fckeditor.connector.ConnectorServlet </servlet-class> <init-param> <param-name>baseDir</param-name> <param-value>/UserFiles/</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Connector</servlet-name> <url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern> </servlet-mapping> </web-app>
在classpath能找到的地方添加:fckeditor.properties文件,内容如下:
connector.userActionImpl=net.fckeditor.requestcycle.impl.UserActionImpl
3). 在页面上调用FCKeditor, 可以通过javascript调取,也可以通过jsp来调用
a).通过javascript:
(1). 在页面中引入fckeditor.js.
<script type="text/javascript" src="FCKEditor/fckeditor.js"></script>
(2). 在期望出现FCKeditor的位置添加如下代码:
<script type="text/javascript"> var oFCKeditor = new FCKeditor( 'FCKeditor1' ) ; oFCKeditor.BasePath = "/FCKeditor/FCKEditor/" ; oFCKeditor.Width="70%"; oFCKeditor.Height="400"; oFCKeditor.Value="初始化内容"; oFCKeditor.Create() ; </script>
(3). 将FCKeditor置于form表单之中.
(4). 提交信息的处理.
在负责处理请求的Servlet或JSP中对所有的请求参数一一获取,
request.setCharacterEncoding("utf-8"); Enumeration<String> params = (Enumeration<String>) request.getParameterNames(); String parameter; String content=""; while (params.hasMoreElements()) { parameter = params.nextElement(); String subcontent=request.getParameter(parameter).trim(); content=content+subcontent; } //根据需求进行进一步处理
b).通过JSP的自定义标签获取FCKeditor
(1). 引入标签:<%@taglib prefix="FCK" uri="http://java.fckeditor.net"%>
(2). 在适当的位置显示:(value的值不能为空,否则会NullPointerException)
<FCK:editor instanceName="myeditor" basePath="/FCKEditor" value="initializing..."> </FCK:editor>
(2).关于数据的提交与处理的过程与a)中所说类似,不再重复
4.FCKeditor的自定义
在使用FCKeditor时,难免要增加一些自己的风格,去掉一些不必要的功能.
1). 在FCKeditor目录下创建myconfig.js. (虽然可以直接修改fckconfig.js, 但最好不要这么做), 在
fckconfig中指定自定义配置文件的位置. 出现在自定义配置文件中的配置项会覆盖掉fckconfig中的
同名配置项.
2).通常需要自定义的内容:
自定义 ToolbarSet, 去掉一些功能
加上几种常用的字体
修改 “回车” 和 “Shift + 回车” 的换行行为
修改编辑区样式文件
更换表情图片
5. FCKeditor的一些其他问题:
1). 上传中文名字的文件会出现乱码.
解决办法:
使用自定义的ConnectorServlet替换net.fckeditor.connector.ConnectorServlet, 在web.xml中将
<servlet-class>指定为自定义的ConnectorServlet. 自定义的ConnectorServlet如下:
public class ConnectorServlet extends HttpServlet { private static final long serialVersionUID = -5742008970929377161L; private static final Logger logger = LoggerFactory.getLogger(ConnectorServlet.class); public void init() throws ServletException, IllegalArgumentException { String realDefaultUserFilesPath = getServletContext().getRealPath( ConnectorHandler.getDefaultUserFilesPath()); File defaultUserFilesDir = new File(realDefaultUserFilesPath); UtilsFile.checkDirAndCreate(defaultUserFilesDir); logger.info("ConnectorServlet successfully initialized!"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.debug("Entering ConnectorServlet#doGet"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/xml; charset=UTF-8"); response.setHeader("Cache-Control", "no-cache"); PrintWriter out = response.getWriter(); String commandStr = request.getParameter("Command"); String typeStr = request.getParameter("Type"); String currentFolderStr = request.getParameter("CurrentFolder"); logger.debug("Parameter Command: {}", commandStr); logger.debug("Parameter Type: {}", typeStr); logger.debug("Parameter CurrentFolder: {}", currentFolderStr); XmlResponse xr; if (!RequestCycleHandler.isEnabledForFileBrowsing(request)) xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.NOT_AUTHORIZED_FOR_BROWSING); else if (!CommandHandler.isValidForGet(commandStr)) xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_COMMAND); else if (typeStr != null && !ResourceTypeHandler.isValid(typeStr)) xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_TYPE); else if (!UtilsFile.isValidPath(currentFolderStr)) xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_CURRENT_FOLDER); else { CommandHandler command = CommandHandler.getCommand(commandStr); ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr); String typePath = UtilsFile.constructServerSidePath(request, resourceType); String typeDirPath = getServletContext().getRealPath(typePath); File typeDir = new File(typeDirPath); UtilsFile.checkDirAndCreate(typeDir); File currentDir = new File(typeDir, currentFolderStr); if (!currentDir.exists()) xr = new XmlResponse(XmlResponse.EN_INVALID_FOLDER_NAME); else { xr = new XmlResponse(command, resourceType, currentFolderStr, UtilsResponse .constructResponseUrl(request, resourceType, currentFolderStr, true, ConnectorHandler.isFullUrl())); if (command.equals(CommandHandler.GET_FOLDERS)) xr.setFolders(currentDir); else if (command.equals(CommandHandler.GET_FOLDERS_AND_FILES)) xr.setFoldersAndFiles(currentDir); else if (command.equals(CommandHandler.CREATE_FOLDER)) { String newFolderStr = UtilsFile.sanitizeFolderName(request .getParameter("NewFolderName")); logger.debug("Parameter NewFolderName: {}", newFolderStr); File newFolder = new File(currentDir, newFolderStr); int errorNumber = XmlResponse.EN_UKNOWN; if (newFolder.exists()) errorNumber = XmlResponse.EN_ALREADY_EXISTS; else { try { errorNumber = (newFolder.mkdir()) ? XmlResponse.EN_OK : XmlResponse.EN_INVALID_FOLDER_NAME; } catch (SecurityException e) { errorNumber = XmlResponse.EN_SECURITY_ERROR; } } xr.setError(errorNumber); } } } out.print(xr); out.flush(); out.close(); logger.debug("Exiting ConnectorServlet#doGet"); } @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.debug("Entering Connector#doPost"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); response.setHeader("Cache-Control", "no-cache"); PrintWriter out = response.getWriter(); String commandStr = request.getParameter("Command"); String typeStr = request.getParameter("Type"); String currentFolderStr = request.getParameter("CurrentFolder"); logger.debug("Parameter Command: {}", commandStr); logger.debug("Parameter Type: {}", typeStr); logger.debug("Parameter CurrentFolder: {}", currentFolderStr); UploadResponse ur; // if this is a QuickUpload request, 'commandStr' and 'currentFolderStr' // are empty if (Utils.isEmpty(commandStr) && Utils.isEmpty(currentFolderStr)) { commandStr = "QuickUpload"; currentFolderStr = "/"; } if (!RequestCycleHandler.isEnabledForFileUpload(request)) ur = new UploadResponse(UploadResponse.SC_SECURITY_ERROR, null, null, Messages.NOT_AUTHORIZED_FOR_UPLOAD); else if (!CommandHandler.isValidForPost(commandStr)) ur = new UploadResponse(UploadResponse.SC_ERROR, null, null, Messages.INVALID_COMMAND); else if (typeStr != null && !ResourceTypeHandler.isValid(typeStr)) ur = new UploadResponse(UploadResponse.SC_ERROR, null, null, Messages.INVALID_TYPE); else if (!UtilsFile.isValidPath(currentFolderStr)) ur = UploadResponse.UR_INVALID_CURRENT_FOLDER; else { ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr); String typePath = UtilsFile.constructServerSidePath(request, resourceType); String typeDirPath = getServletContext().getRealPath(typePath); File typeDir = new File(typeDirPath); UtilsFile.checkDirAndCreate(typeDir); File currentDir = new File(typeDir, currentFolderStr); if (!currentDir.exists()) ur = UploadResponse.UR_INVALID_CURRENT_FOLDER; else { String newFilename = null; FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); //1 try { List<FileItem> items = upload.parseRequest(request); FileItem uplFile = items.get(0); String rawName = UtilsFile.sanitizeFileName(uplFile.getName()); String filename = FilenameUtils.getName(rawName); String baseName = FilenameUtils.removeExtension(filename); String extension = FilenameUtils.getExtension(filename); if (!ExtensionsHandler.isAllowed(resourceType, extension)) ur = new UploadResponse(UploadResponse.SC_INVALID_EXTENSION); else { File pathToSave = new File(currentDir, filename); int counter = 1; while (pathToSave.exists()) { newFilename = baseName.concat("(").concat(String.valueOf(counter)) .concat(")").concat(".").concat(extension); pathToSave = new File(currentDir, newFilename); counter++; } if (Utils.isEmpty(newFilename)) ur = new UploadResponse(UploadResponse.SC_OK, UtilsResponse .constructResponseUrl(request, resourceType, currentFolderStr, true, ConnectorHandler.isFullUrl()).concat(filename)); else ur = new UploadResponse(UploadResponse.SC_RENAMED, UtilsResponse.constructResponseUrl(request, resourceType, currentFolderStr, true, ConnectorHandler.isFullUrl()) .concat(newFilename), newFilename); // secure image check if (resourceType.equals(ResourceTypeHandler.IMAGE) && ConnectorHandler.isSecureImageUploads()) { if (UtilsFile.isImage(uplFile.getInputStream())) uplFile.write(pathToSave); else { uplFile.delete(); ur = new UploadResponse(UploadResponse.SC_INVALID_EXTENSION); } } else uplFile.write(pathToSave); } } catch (Exception e) { ur = new UploadResponse(UploadResponse.SC_SECURITY_ERROR); } } } out.print(ur); out.flush(); out.close(); logger.debug("Exiting Connector#doPost"); } }
在原始的ConnectorServlet中找到doPost方法,并在第150行的//1处添加:
upload.setHeaderEncoding("utf-8")即可.
相关推荐
【标题】"FCKeditor HelloWorld" 【描述】中提到的"Fckeditor HelloWorld"是一个关于使用FCKeditor进行初步集成和使用的示例。FCKeditor是一款曾经非常流行的开源富文本编辑器,它允许用户在网页上创建和编辑内容,...
oFCKeditor.Value = 'Hello World!' ; oFCKeditor.Create() ; ``` 在上述代码中,`'editor'` 是编辑器实例的名称,`BasePath` 指定FCKeditor的路径,`Width` 和 `Height` 设置编辑器的尺寸,`Value` 初始化编辑...
oFCKeditor.Value = 'Hello World!' ; oFCKeditor.Create() ; ``` ### 三、功能与设置 FCKEditor提供了多种配置选项,允许开发者自定义编辑器的行为。例如,可以通过修改`BasePath`设置编辑器的路径,`Width`和`...
<fckeditor name="myEditor" value="Hello, World!" basepath="/js/fckeditor/" width="80%" height="300"></fckeditor> ``` 这里,`basepath`属性指定了FCKeditor的根路径,`width`和`height`定义了编辑器的尺寸。 ...
editor.Value = '<p>Hello, World!</p>'; editor.Replace('fckeditor'); }; // 事件处理示例 document.getElementById('saveBtn').onclick = function() { var content = FCKeditorAPI.GetInstance('fckeditor')...
oFCKeditor.Value = 'Hello, World!' ; // 设置初始内容 oFCKeditor.Create() ; ``` 在上述代码中,`txtEditor`是编辑器的ID,用于在JavaScript中引用编辑器实例。 3. **功能介绍** - **文本格式化**:...
这将替换当前编辑器的内容为`<p>Hello, World!</p>`。 在实际应用中,可能还需要处理一些其他情况,例如确保在设置值之前编辑器已经完全初始化。FCKeditor提供了一个事件`OnInstanceReady`,可以在编辑器准备就绪后...
oFCKeditor.Value = '<p>Hello World!</p>' ; // 初始化编辑器内容 oFCKeditor.Create() ; ``` 6. **与后端交互**: - **文件上传**:FCKeditor内置了文件上传功能,可以通过设置Servlet处理上传请求,保存...
oFCKeditor.Value = 'Hello World!' ; oFCKeditor.Create() ; } ; <textarea id="txtEditor" name="txtEditor"></textarea> ``` 这里,`txtEditor`是编辑器实例的ID,`BasePath`是FCKeditor的路径,`Value`是...
要避免这种情况,我们需要使用反斜杠转义这些特殊字符,像这样:`echo "Hello \'World\'";`。 对于FCKeditor,它在提交数据到服务器时,可能会自动进行HTML实体编码,将特殊字符转换为对应的HTML实体,例如单引号...
oFCKeditor.Value = 'Hello, World!' ; oFCKeditor.ReplaceTextarea() ; ``` **4. 功能与设置** fckeditor提供了丰富的功能,包括字体样式、颜色选择、列表、对齐方式等。你还可以自定义编辑器的工具栏,添加或...
3. **交互操作**:可以使用FCKeditor提供的API进行内容获取、设置、插入图片、链接等操作,例如`FCKeditorObj.InsertHtml('<p>Hello, World!</p>')`。 **三、FCKeditor的封装** 在实际开发中,为了便于管理和复用...
4. **插入内容**:使用`oFCKeditor.Value = '<p>Hello World!</p>'`来预填充编辑器的内容。 5. **获取编辑器内容**:在提交表单前,可以使用`oFCKeditor.GetInstance('editor').GetHTML()`获取编辑器中的富文本内容...
最新版本的文字编辑器以及.net中对应组件 该工具的简介、配置以及使用方法可以参考: http://blog.csdn.net/Hello_World_wusu/archive/2009/03/21/4013067.aspx
4. 引入编辑器:在需要使用编辑器的页面中,引入FCKeditor的JavaScript文件,并调用初始化函数,例如`<script type="text/javascript">FCKeditorObject.InsertHtml('Hello, World!');</script>`。 三、基本使用 1. ...
- 使用文本编辑器编写Java程序,例如`HelloWorld.java`。 - 编译:`javac HelloWorld.java`。 - 运行:`java HelloWorld`。 - 示例程序:`public class hello { public static void main(String args[]) { ...
默认管理员和密码在web.config中配置 默认为:admin/admin 后台登录:/admin作者:TriptychStudios汉化修改:forgetuhttp://blog.helloworld.org.cn主要修改:1、将文件编码由iso-8859-1改为了utf-82、添加了App_Code...
1.7. 入门之前,都看helloworld。 1.7.1. 直接使用下载的发布包 1.7.2. 只把必要的东西放进项目中 2. 震撼吧!让你知道ext表格控件的厉害。 2.1. 功能丰富,无人能出其右 2.2. 让我们搞一个grid出来耍耍吧。 2.3. ...
window.alert('Hello World!!!'); } ``` 27. **隐藏图片工具栏**: 通过`http-equiv`元标签,可以禁止图片工具栏显示: ```html ``` 28. **页面最大化**: 类似于前面的窗口最大化,这里使用了相同的...