在JSF/JSP中集成FCKEditor
目前,F(xiàn)CKEditor (http://www.fckeditor.net/) 是開源社區(qū)一款強大的HTML編輯器,目前***版本是2.6,支持Java的插件版本是2.4Beta1。
對于一般的Java Web應用,我們可以通過直接插入JavaScript代碼來構造頁面,這種方式操作起來比較簡便,也是通用在所有web頁面的一種方式。但是,在實際的 Java Web應用中,我們除了用到普通的頁面編輯功能之外,難免會考慮到頁面上傳圖片、附件等功能。所以,單純使用JavaScript方式的話,這一大堆的文件上傳代碼將由你自己來寫了,工程量還是比較浩大的。自然而然,我們會想到Jsp Tag,有沒有現(xiàn)成的快餐式的頁面標簽呢?答案是肯定的,就如我上文提到的Java插件就已經實現(xiàn)了這些功能,并集成了Apache Commons-FileUpload,以此來實現(xiàn)文件服務器上傳。
2.4版的Java插件已經封裝得更加簡潔,不同于之前的其他版本。標簽的使用方式是
- <%@taglib uri="http://java.fckeditor.net" prefix="FCK"%>
- <FCK:editor instanceName="EditorDefault" width="755" height="460" basePath= "/fckeditor" value="Hello, world">
- <jsp:body>
- <FCK:config SkinPath="skins/office2003/" />
- < SPAN>jsp:body>
- < SPAN>FCK:editor>
在JSF應用中,由于頁面都是JSF自定義標簽,對于其他標簽的內容,JSF不會自動將后臺Bean中的值綁定到
- <script type="text/javascript">
- function renderMessage() {
- YAHOO.util.Dom.get("EditorDefault").value = YAHOO.util.Dom.get("form:content").value;
- }
- < SPAN>script>
- <f:view>
- <h:form id="form">
- <h:inputTextarea id="content" value="#{mainMessageEditBean. message.messageContent}" style="display:none">< SPAN>h:inputTextarea>
- < SPAN>h:form>
- < SPAN>f:view>
保存HTML編輯內容的時候,你只需要通過獲得到的HttpServletRequest對象獲取頁面提交中的Parameter對象,示例代碼如下:
- public Map getParamMap() {
- return getFacesContext().getExternalContext().getRequestParameterMap();
- }
- public String getParamAsString(String paramName) {
- Object obj = getParamMap().get(paramName);
- if (obj != null) {
- return obj.toString();
- } else {
- return "";
- }
- }
- public String saveMessage() {
- if (message == null) {
- setErrMsg("Message does not exist.");
- return null;
- }
- String content = getParamAsString("EditorDefault");
- if (content == null || content.length() == 0) {
- setErrMsg("Message must not be empty.");
- return null;
- }
- }
其他方面,我們需要在自己的web.xml中定義FCKEditor相關的Servlet:
- <servlet>
- <servlet-name>Connector< SPAN>servlet-name>
- <servlet-class>
- net.fckeditor.connector.ConnectorServlet
- < SPAN>servlet-class>
- <load-on-startup>1< SPAN>load-on-startup>
- < SPAN>servlet>
- <servlet-mapping>
- <servlet-name>Connector< SPAN>servlet-name>
- <url-pattern>
- /fckeditor/editor/filemanager/connectors/*
- < SPAN>url-pattern>
- < SPAN>servlet-mapping>
這里需要注明的是,/fckeditor這個web根目錄下的目錄來源于FCKEditor的核心包(Ver 2.6),可以在官方網站上面下載得到。
在目錄/fckeditor下面有一個重要的文件fckconfig.js,里面可以配置許多FCKEditor在頁面上的展示風格,大家可以仔細慢慢研究 :)
PS: 考慮到安全問題,建議大家把FCKEditor界面上的Source Code按鈕屏蔽掉,防止黑客的惡意腳本的破壞。
在我的實際應用中,因為要限制上傳文件的權限,所以我要用到權限控制。幸好FCKEditor提供了相應的UserAction接口,可以讓我自己實現(xiàn)一個類來控制權限。
- <em style="font-style: italic;">package com.tail.utils;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
- import net.fckeditor.requestcycle.UserAction;
- import com.tail.beans.Principal;
- import com.tail.objects.User;
- public class UserActionImpl implements UserAction {
- public boolean isEnabledForFileBrowsing(HttpServletRequest req) {
- return true;
- }
- public boolean isEnabledForFileUpload(HttpServletRequest req) {
- HttpSession session = req.getSession();
- Principal principal = (Principal) session.getAttribute(ConstantUtil.SESSION_PRINCIPAL);
- if (principal != null) {
- User user = principal.getUser();
- if (user.isUploadable()) {
- return true;
- }
- }
- return false;
- }
- } < SPAN>em>
如何加載自定義的UserAction類呢?在classes的根目錄下,你需要定義一個fckeditor.properties文件:
- <em style="font-style: italic;">connector.userActionImpl=com. tail.utils.UserActionImpl < SPAN>em>
這樣你就可以控制文件上傳的權限了。
【編輯推薦】