歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

FCkeditor和struts2結合使用解決不能上傳圖片的問題

前提是,FCKeditor已經整合到你的Web項目中,FCKeditor已經可以使用,但就是在上傳圖片的時候一直停住不動,如下圖。如果FCKeditor單純地在jsp頁面上顯示,不會存在這樣的問題。但是如果FCKeditor與Struts整合,就會出現這樣的問題。造成此問題的原因就是Struts的攔截器,在web.xml配置文件中,可以清楚的看到:

<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

就是上面這個配置,Struts會攔截所以以“/”開頭的URL。

在FCKeditor的配置中,FCKeditor是使用servlet來實現的,它也是通過攔截URL的機制進行工作的,FCKeditor的部分servlet配置如下:

 <!-- fckeditor 配置 by lyf 2014-09-12 start -->
 <servlet>
  <servlet-name>Connector</servlet-name>
  <servlet-class>
    net.fckeditor.connector.ConnectorServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet> 
 <servlet-mapping>
  <servlet-name>Connector</servlet-name>
  <url-pattern>/js/fckEditor/editor/filemanager/connectors/*</url-pattern>
 </servlet-mapping>
 <!-- fckeditor 配置 by lyf 2014-09-12  end -->

現在就很明了了,struts攔截所有以“/”開頭的URL,FCKeditor的servlet攔截所有以“/js/fckEditor/editor/filemanager/connectors/”開頭的URL,當你使用FCKeditor上傳圖片的時候,URL中包含有“/”(指網站根目錄),優先被struts的攔截器攔截,這樣上傳圖片的URL請求自然就不會轉發到FCKeditor的servlet,所以我們上傳圖片也就不成功。

解決辦法:自己定義了一個過濾器FCKFilter.java,讓它繼承Struts2的過濾器StrutsPrepareAndExecuteFilter,完整代碼如下:

package com.ckms.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;

/**
 * 類名稱:FCKFilter
 * 類描述:解決struts2 FCKeditor不能上傳圖片的問題
 * 創建人:lyf
 * 創建時間:2014-9-12 上午10:19:08
 * 修改人:lyf
 * 修改時間:2014-9-12 上午10:19:08
 * 修改備注:
 * @version 1.0
 *
 */
public class FCKFilter extends StrutsPrepareAndExecuteFilter {
  public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException { 
        HttpServletRequest request = (HttpServletRequest) req; 
        String URI = request.getRequestURI();
        // 此處的值要和 web.xml 中fck配置的路徑開頭一致 -->
        String[] uriArray = URI.split("/js/fckEditor/editor/filemanager/connectors/");
        int arrayLen = uriArray.length;
        if (arrayLen >= 2) {
            chain.doFilter(req, res); 
        }else {
            super.doFilter(req, res, chain); 
        }
    } 
}

上面的代碼是重寫了Struts2的過濾器StrutsPrepareAndExecuteFilter中的doFilter方法,執行的原理為:

獲得完整的http url地址,然後判斷url地址中是否包含有FCKeditor的servlet攔截規則“/js/fckEditor/editor/filemanager/connectors/”,若包含,struts就不攔截該url請求,而是直接轉發,交由FCKeditor的servlet來處理;若不包含,則攔截該url請求,由struts來處理。

自定義的過濾器寫完之後,要在web.xml中更改struts的攔截器類,不能再使用struts的默認攔截器類StrutsPrepareAndExecuteFilter。但是請放心,自定義的過濾器FCKFilter繼承了StrutsPrepareAndExecuteFilter裡的所有的方法,因此項目依然照常運行。

該方法巧妙的解決了struts2和FCKeditor整合後不能上傳圖片的問題,需要改動的系統配置非常少,只需自定義一個攔截器,然後改一下struts的攔截器類為自定義的攔截器類。

修改後的web.xml:

<filter>
  <filter-name>struts2</filter-name>
  <!-- 解決struts2 FCKeditor不能上傳圖片的問題
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  -->
  <filter-class>com.ckms.filter.FCKFilter</filter-class>
 </filter>

SSH2 struts2 FCKeditor在線編輯器實現  http://www.linuxidc.com/Linux/2013-04/82955.htm

Struts2的入門實例 http://www.linuxidc.com/Linux/2013-05/84618.htm

Struts2實現ModelDriven接口 http://www.linuxidc.com/Linux/2014-04/99466.htm

遇到的Struts2文件下載亂碼問題 http://www.linuxidc.com/Linux/2014-03/98990.htm

Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm

Struts2 注解模式的幾個知識點 http://www.linuxidc.com/Linux/2013-06/85830.htm

Struts 的詳細介紹:請點這裡
Struts 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved