• struts2整合CKEditor實現上傳

    1
    Java XML C/C++ Struts2 Go 15919 次瀏覽
    之前折騰了下CKEditor和CKFinder實現上傳功能,今想來把這個文本編輯器應用到一個自己在做的練手項目中,實現與Struts2的整合,整合的過程so easy.但圖片死活上傳不上去.那個整合啊,那個蛋疼啊. 經過不懈的努力問題發現了,原來是被struts2搞了.此問題的原因就是struts2的攔截器,在web.xml中,可以清楚的看到:
     <filter-mapping> 
            <filter-name>struts2</filter-name> 
            <url-pattern>/*</url-pattern> 
        </filter-mapping>  
    上面的配置,struts2會攔截所有以"/"開頭的URL.
    在CKEditor的配置中,CKEditor是使用servlet來實現的,它也是通過攔截URL的機制進行工作的,CKeditor的部分servlet配置如下:
    <servlet-mapping>
    	<servlet-name>ConnectorServlet</servlet-name>
    	<url-pattern>/ckfinder/core/connector/java/connector.java</url-pattern>
    	</servlet-mapping>
    現在就很明了了,struts2攔截器會攔截所有以"/"開頭的URL,CKEd的servlet攔截器攔截所有以"
    /ckfinder/core/connector/java/connector.java"開頭的URL.當時CKEditor上傳圖片的時 候,URL中包含有"/"(指網站根目錄),優先被struts2的攔截器攔截,這樣上傳的URL請求就不會轉發到CKEditor的servlet中, 所有上傳圖片也就不會成功.

      問題所在找到了,那這個問題就好解決了,最簡單的辦法是將struts2的攔截器"/*"改成"#.action"或者"*.do"
    第二個辦法是:
    自己來定義一個CKeditor的過濾器,讓它來繼承Struts2的過濾器FilterDispatcher,其完整代碼是
    /**
    * @Title: FCKFilter.java
    * @Package: cn.itcast.utils
    * @Description: TODO(用一句話描述該文件做什么)
    * @author: 何楓
    * @date: 2011-11-1 下午08:49:10
    * @version: V1.0
    */
    package cn.itcast.utils;
    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.FilterDispatcher;
    
    /**
     * @Title: FCKFilter.java
     * @Package: cn.itcast.utils
     * @Description: TODO(用一句話描述該文件做什么)
     * @author: 何楓
     * @date: 2011-11-1 下午08:49:10
     * @version: V1.0
     */
    @SuppressWarnings("deprecation")
    public class FCKFilter extends FilterDispatcher {
    	 public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException {   
    	        HttpServletRequest request = (HttpServletRequest) req;  
    	        String URI = request.getRequestURI(); 
    	        String[] uriArray = URI.split("/ckfinder/core/connector/java/*/"); 
    	        int arrayLen = uriArray.length; 
    	        if (arrayLen >= 2) { 
    	            chain.doFilter(req, res);  
    	        }else { 
    	            super.doFilter(req, res, chain);   
    	        } 
    	    }  
    	} 
     
    上面的方法重寫了struts2的過濾器FilterDispatcher中的doFilter方法,執行原理為:獲得完整的http url的地址,然后判斷URL地址中是否包含CKEditor的servlet攔截規則"/ckfinder/core/connector/java /*/",若包含,struts2就不攔截該URL請求,而直接轉發,交友CKEditor的servlet來處理;若不包含,ze攔截器攔截該URL請 求,由struts2來處理
    自定義的過濾器寫完之后,要在web.xml中更改struts2的攔截器類,不能再使用struts2的默認攔截器類 FilterDispatcher 。但是請放心,自定義的過濾器FCKFilter繼承了 FilterDispatcher 里的所有的方法,因此項目依然照常運行。
    <!-- struts2配置文件 -->
    <filter>
    		<filter-name>struts2</filter-name>
    		<!--
    			<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    		-->
    		<filter-class>cn.itcast.utils.FCKFilter</filter-class>
    	</filter>
    
    	<filter-mapping>
    		<filter-name>struts2</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    轉自:http://hefeng1987-net-163-com.iteye.com/blog/1231940

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色