先說怎么做,再稍微解釋一下為什么這么做
1.webwork.properties里面設置
webwork.serve.static=false
webwork.multipart.parser=cos
2.在webapp的根目錄下建一個文件夾webwork,把webwork.jar里面的/com/opensymphony/webwork/static和/template里面的文件和復制到自己建的webwork文件夾里面,在/webwork/richtexteditor里面建文件夾data(可能會自動建,沒測試過)
3.寫一個RichtexteditorConnector
package?test;
import?java.io.FileFilter;
import?java.io.IOException;
import?java.util.ArrayList;
import?java.util.List;
import?javax.servlet.ServletContext;
import?org.apache.commons.logging.Log;
import?org.apache.commons.logging.LogFactory;
import?com.opensymphony.webwork.components.DefaultRichtexteditorConnector;
public?class?RichtexteditorConnector?extends?DefaultRichtexteditorConnector?{
????public?static?final?Log?_log?=?LogFactory
????????????.getLog(RichtexteditorConnector.class);
????private?ServletContext?servletContext;
????public?void?setServletContext(ServletContext?servletContext)?{
????????this.servletContext?=?servletContext;
????}
????protected?String?calculateActualServerPath(String?actualServerPath,
????????????String?type,?String?folderPath)?throws?Exception?{
????????String?path?=?servletContext.getRealPath(actualServerPath);
????????path?=?path.replace('\\',?'/');
????????makeDirIfNotExists(path);
????????path?=?path.endsWith("/")???path?:?path?+?"/";
????????return?path?+?type?+?folderPath;
????}
????protected?Folder[]?getFolders(String?virtualFolderPath,?String?type)
????????????throws?Exception?{
????????String?path?=?calculateActualServerPath(getActualServerPath(),?type,
????????????????virtualFolderPath);
????????makeDirIfNotExists(path);
????????java.io.File?f?=?new?java.io.File(path);
????????java.io.File[]?children?=?f.listFiles(new?FileFilter()?{
????????????public?boolean?accept(java.io.File?pathname)?{
????????????????if?(!pathname.isFile())?{
????????????????????return?true;
????????????????}
????????????????return?false;
????????????}
????????});
????????List?tmpFolders?=?new?ArrayList();
????????for?(int?a?=?0;?a?<?children.length;?a++)?{
????????????tmpFolders.add(new?Folder(children[a].getName()));
????????}
????????return?(Folder[])?tmpFolders.toArray(new?Folder[0]);
????}
????protected?FoldersAndFiles?getFoldersAndFiles(String?virtualFolderPath,
????????????String?type)?throws?Exception?{
????????String?path?=?calculateActualServerPath(getActualServerPath(),?type,
????????????????virtualFolderPath);
????????makeDirIfNotExists(path);
????????java.io.File?f?=?new?java.io.File(path);
????????java.io.File[]?children?=?f.listFiles();
????????List?directories?=?new?ArrayList();
????????List?files?=?new?ArrayList();
????????for?(int?a?=?0;?a?<?children.length;?a++)?{
????????????if?(children[a].isDirectory())?{
????????????????directories.add(new?Folder(children[a].getName()));
????????????}?else?{
????????????????try?{
????????????????????files.add(new?File(children[a].getName(),
????????????????????????????fileSizeInKBytes(children[a])));
????????????????}?catch?(Exception?e)?{
????????????????????_log.error("cannot?deal?with?file?"?+?children[a],?e);
????????????????}
????????????}
????????}
????????return?new?FoldersAndFiles((Folder[])?directories
????????????????.toArray(new?Folder[0]),?(File[])?files.toArray(new?File[0]));
????}
????protected?FileUploadResult?fileUpload(String?virtualFolderPath,
????????????String?type,?String?filename,?String?contentType,
????????????java.io.File?newFile)?{
????????try?{
????????????String?tmpDir?=?calculateActualServerPath(getActualServerPath(),
????????????????????type,?virtualFolderPath);
????????????makeDirIfNotExists(tmpDir);
????????????String?tmpFile?=?tmpDir?+?filename;
????????????if?(makeFileIfNotExists(tmpFile))?{
????????????????//?already?exists
????????????????int?a?=?0;
????????????????String?ext?=?String.valueOf(a);
????????????????tmpFile?=?calculateActualServerPath(getActualServerPath(),
????????????????????????type,?virtualFolderPath)
????????????????????????+?filename?+?ext;
????????????????while?(makeFileIfNotExists(tmpFile))?{
????????????????????a?=?a?+?1;
????????????????????ext?=?String.valueOf(a);
????????????????????if?(a?>?100)?{
????????????????????????return?FileUploadResult.invalidFile();
????????????????????}
????????????????}
????????????????copyFile(newFile,?new?java.io.File(tmpFile));
????????????????return?FileUploadResult
????????????????????????.uploadCompleteWithFilenamChanged(filename?+?ext);
????????????}?else?{
????????????????copyFile(newFile,?new?java.io.File(tmpFile));
????????????????return?FileUploadResult.uploadComplete();
????????????}
????????}?catch?(Exception?e)?{
????????????_log.error(e.toString(),?e);
????????????e.printStackTrace();
????????????return?FileUploadResult.invalidFile();
????????}
????}
????protected?void?unknownCommand(String?command,?String?virtualFolderPath,
????????????String?type,?String?filename,?String?contentType,
????????????java.io.File?newFile)?{
????????throw?new?RuntimeException("unknown?command?"?+?command);
????}
????/**
?????*?
?????*?@param?path
?????*?@return?true?if?file?already?exists,?false?otherwise.
?????*/
????protected?boolean?makeDirIfNotExists(String?path)?{
????????java.io.File?dir?=?new?java.io.File(path);
????????if?(!dir.exists())?{
????????????_log.debug("make?directory?"?+?dir);
????????????boolean?ok?=?dir.mkdirs();
????????????if?(!ok)?{
????????????????throw?new?RuntimeException("cannot?make?directory?"?+?dir);
????????????}
????????????return?false;
????????}
????????return?true;
????}
????protected?boolean?makeFileIfNotExists(String?filePath)?throws?IOException?{
????????java.io.File?f?=?new?java.io.File(filePath);
????????if?(!f.exists())?{
????????????_log.debug("creating?file?"?+?filePath);
????????????boolean?ok?=?f.createNewFile();
????????????if?(!ok)?{
????????????????throw?new?RuntimeException("cannot?create?file?"?+?filePath);
????????????}
????????????return?false;
????????}
????????return?true;
????}
}
4.xwork.xml加上
<package?name="richtexteditor-browse"?extends="webwork-default"
????????namespace="/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp">
????????<action?name="connector"
????????????class="test.RichtexteditorConnector"
????????????method="browse">
????????????<param?name="actualServerPath">
????????????????/webwork/richtexteditor/data
????????????</param>
????????????<result?name="getFolders"?type="richtexteditorGetFolders"?/>
????????????<result?name="getFoldersAndFiles"
????????????????type="richtexteditorGetFoldersAndFiles"?/>
????????????<result?name="createFolder"
????????????????type="richtexteditorCreateFolder"?/>
????????????<result?name="fileUpload"?type="richtexteditorFileUpload"?/>
????????</action>
</package>
<package?name="richtexteditor-upload"?extends="webwork-default"
????????namespace="/webwork/richtexteditor/editor/filemanager/upload">
????????<action?name="uploader"
????????????class="test.RichtexteditorConnector"
????????????method="upload">
????????????<param?name="actualServerPath">
????????????????/webwork/richtexteditor/data
????????????</param>
????????????<result?name="richtexteditorFileUpload"?/>
????????</action>
</package>
5.配置標簽
<ww:form action="test" method="post">
?? ?<%request.setAttribute("contextPath",request.getContextPath());%>
?? ?<ww:richtexteditor basePath="%{#request.contextPath}/webwork/richtexteditor/"?? ????? toolbarCanCollapse="false" width="700" label="description" name="content" defaultLanguage="zh-cn" />
?? ?<ww:submit value="submit" />
</ww:form>
6.服務器端口設置為80
原因
1.
webwork.serve.static=false
/webwork/*這樣的URL是可以直接訪問不需要通過webwork,這樣做是為了自己可以在里面建文件,并且可以方便的訪問這些文件
webwork.multipart.parser=cos
設置為jakarta上傳文件不成功,com.opensymphony.webwork.interceptor.FileUploadInterceptor解析MultiPartRequestWrapper不成功,原因不清楚,反正用cos就可以了,記得加上cos.jar
2.因為設置了webwork.serve.static=false需要這樣做
3.覆蓋webwork的DefaultRichtexteditorConnector,最關鍵的是覆蓋calculateActualServerPath()方法,默認是把文件放到/WEB-INF/classes/com/opensymphony/webwork/static/richtexteditor/data/,我們需要放到/webwork/richtexteditor/data/里面,覆蓋其他方法是因為默認對文件的訪問都是通過
new File(new URI("file://"+filePath);來訪問的,會有些問題,直接new File(filePath)就可以了
4.使用自己的RichtexteditorConnector,并且設置參數actualServerPath,其他參數不要改,webwork默認的是這樣
5.basePath必須自己指定不能用默認的,雖然指定的值和默認的是一樣,但是不自己指定的話它自動加上jsessionid,如/webwork/richtexteditor/;jsessionid=301gs94034pki/editor/fckeditor.html,因為設置了webwork.serve.static=false,所以服務器不能解析這個url
defaultLanguage="zh-cn",不指定的話中文默認是繁體
6.服務器端口必須為80不能為8080,因為fckeditor鏈接你上傳的文件的時候,不會把端口加上去