`
zhangbaocheng
  • 浏览: 34546 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

FCKeditor的HelloWorld

阅读更多

      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 helloword

    【标题】"FCKeditor HelloWorld" 【描述】中提到的"Fckeditor HelloWorld"是一个关于使用FCKeditor进行初步集成和使用的示例。FCKeditor是一款曾经非常流行的开源富文本编辑器,它允许用户在网页上创建和编辑内容,...

    文本编辑器FCKEditor使用详解

    oFCKeditor.Value = 'Hello World!' ; oFCKeditor.Create() ; ``` 在上述代码中,`'editor'` 是编辑器实例的名称,`BasePath` 指定FCKeditor的路径,`Width` 和 `Height` 设置编辑器的尺寸,`Value` 初始化编辑...

    FCKEDITOR 使用说明

    oFCKeditor.Value = 'Hello World!' ; oFCKeditor.Create() ; ``` ### 三、功能与设置 FCKEditor提供了多种配置选项,允许开发者自定义编辑器的行为。例如,可以通过修改`BasePath`设置编辑器的路径,`Width`和`...

    用MyEclipse集成FCKeditor的几个小例子

    &lt;fckeditor name="myEditor" value="Hello, World!" basepath="/js/fckeditor/" width="80%" height="300"&gt;&lt;/fckeditor&gt; ``` 这里,`basepath`属性指定了FCKeditor的根路径,`width`和`height`定义了编辑器的尺寸。 ...

    FCKEditor与ext结合使用

    editor.Value = '&lt;p&gt;Hello, World!&lt;/p&gt;'; editor.Replace('fckeditor'); }; // 事件处理示例 document.getElementById('saveBtn').onclick = function() { var content = FCKeditorAPI.GetInstance('fckeditor')...

    FCKEditor使用范例

    oFCKeditor.Value = 'Hello, World!' ; // 设置初始内容 oFCKeditor.Create() ; ``` 在上述代码中,`txtEditor`是编辑器的ID,用于在JavaScript中引用编辑器实例。 3. **功能介绍** - **文本格式化**:...

    request_and_set_FCKeditor_value.rar_fckeditor val_javascript

    这将替换当前编辑器的内容为`&lt;p&gt;Hello, World!&lt;/p&gt;`。 在实际应用中,可能还需要处理一些其他情况,例如确保在设置值之前编辑器已经完全初始化。FCKeditor提供了一个事件`OnInstanceReady`,可以在编辑器准备就绪后...

    fckeditor---java

    oFCKeditor.Value = '&lt;p&gt;Hello World!&lt;/p&gt;' ; // 初始化编辑器内容 oFCKeditor.Create() ; ``` 6. **与后端交互**: - **文件上传**:FCKeditor内置了文件上传功能,可以通过设置Servlet处理上传请求,保存...

    fckeditor 使用文档

    oFCKeditor.Value = 'Hello World!' ; oFCKeditor.Create() ; } ; &lt;textarea id="txtEditor" name="txtEditor"&gt;&lt;/textarea&gt; ``` 这里,`txtEditor`是编辑器实例的ID,`BasePath`是FCKeditor的路径,`Value`是...

    PHP5_fckeditor.zip_fckeditor

    要避免这种情况,我们需要使用反斜杠转义这些特殊字符,像这样:`echo "Hello \'World\'";`。 对于FCKeditor,它在提交数据到服务器时,可能会自动进行HTML实体编码,将特殊字符转换为对应的HTML实体,例如单引号...

    fckeditor 在线编辑器实例教程

    oFCKeditor.Value = 'Hello, World!' ; oFCKeditor.ReplaceTextarea() ; ``` **4. 功能与设置** fckeditor提供了丰富的功能,包括字体样式、颜色选择、列表、对齐方式等。你还可以自定义编辑器的工具栏,添加或...

    fckeditor封装

    3. **交互操作**:可以使用FCKeditor提供的API进行内容获取、设置、插入图片、链接等操作,例如`FCKeditorObj.InsertHtml('&lt;p&gt;Hello, World!&lt;/p&gt;')`。 **三、FCKeditor的封装** 在实际开发中,为了便于管理和复用...

    web编辑器fckeditor ,JSP里使用

    4. **插入内容**:使用`oFCKeditor.Value = '&lt;p&gt;Hello World!&lt;/p&gt;'`来预填充编辑器的内容。 5. **获取编辑器内容**:在提交表单前,可以使用`oFCKeditor.GetInstance('editor').GetHTML()`获取编辑器中的富文本内容...

    文字编辑器FCKeditor核心文件以及.net中对应组件

    最新版本的文字编辑器以及.net中对应组件 该工具的简介、配置以及使用方法可以参考: http://blog.csdn.net/Hello_World_wusu/archive/2009/03/21/4013067.aspx

    fck实现htm在线编辑

    4. 引入编辑器:在需要使用编辑器的页面中,引入FCKeditor的JavaScript文件,并调用初始化函数,例如`&lt;script type="text/javascript"&gt;FCKeditorObject.InsertHtml('Hello, World!');&lt;/script&gt;`。 三、基本使用 1. ...

    JavaEE学习实战笔记心得

    - 使用文本编辑器编写Java程序,例如`HelloWorld.java`。 - 编译:`javac HelloWorld.java`。 - 运行:`java HelloWorld`。 - 示例程序:`public class hello { public static void main(String args[]) { ...

    TriptychBlog博客程序

    默认管理员和密码在web.config中配置 默认为:admin/admin 后台登录:/admin作者:TriptychStudios汉化修改:forgetuhttp://blog.helloworld.org.cn主要修改:1、将文件编码由iso-8859-1改为了utf-82、添加了App_Code...

    EXT2.0中文教程

    1.7. 入门之前,都看helloworld。 1.7.1. 直接使用下载的发布包 1.7.2. 只把必要的东西放进项目中 2. 震撼吧!让你知道ext表格控件的厉害。 2.1. 功能丰富,无人能出其右 2.2. 让我们搞一个grid出来耍耍吧。 2.3. ...

    js使用小技巧

    window.alert('Hello World!!!'); } ``` 27. **隐藏图片工具栏**: 通过`http-equiv`元标签,可以禁止图片工具栏显示: ```html ``` 28. **页面最大化**: 类似于前面的窗口最大化,这里使用了相同的...

Global site tag (gtag.js) - Google Analytics