欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

struts2整合CKEditor和CKFinder实现上传

程序员文章站 2024-01-28 20:59:10
实现与Struts2的整合,整合的过程确实easy.不过实现之后,图片上传不上去,上传之后显示“文件不存在”,然后在网上找了一些资料,经过总结最终实现了这个...
实现与Struts2的整合,整合的过程确实easy.不过实现之后,图片上传不上去,上传之后显示“文件不存在”,然后在网上找了一些资料,经过总结最终实现了这个功能。此问题的原因就是struts2的拦截器,在web.xml中,可以清楚的看到:

[html]  

<filter-mapping>   

       <filter-name>struts2</filter-name>   

       <url-pattern>/*</url-pattern>   

</filter-mapping>    

上面的配置,struts2会拦截所有以"/"开头的URL.

在CKEditor的配置中,CKEditor是使用servlet来实现的,它也是通过拦截URL的机制进行工作的,CKeditor的部分servlet配置如下:

[html]  

<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",可以这样改:

[html]  

<filter-mapping>  

        <filter-name>struts2</filter-name>  

        <url-pattern>*.action</url-pattern>  

    </filter-mapping>  

第二个办法是:

自己来定义一个CKeditor的过滤器,让它来继承Struts2的过滤器FilterDispatcher,其完整代码是

[java]  

package cn.edu.csu.software.filters;  

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;  

  

@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 里的所有的方法,因此项目依然照常运行。www.2cto.com

<!-- struts2配置文件 -->

[html] 

<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>