zoukankan      html  css  js  c++  java
  • struts2整合CKEditor和CKFinder实现上传

    上一篇文章给大家分享了CKEditor+CKFinder+JSP实现了在线编辑器上传图片的功能,这里在给大家分享一下如何在前面的基础上在struts2下实现这样的功能。

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

    [html] view plain copy
     
    1. <filter-mapping>   
    2.        <filter-name>struts2</filter-name>   
    3.        <url-pattern>/*</url-pattern>   
    4. </filter-mapping>    

    上面的配置,struts2会拦截所有以"/"开头的URL.
    在CKEditor的配置中,CKEditor是使用servlet来实现的,它也是通过拦截URL的机制进行工作的,CKeditor的部分servlet配置如下:

    [html] view plain copy
     
    1. <servlet-mapping>  
    2.     <servlet-name>ConnectorServlet</servlet-name>  
    3.     <url-pattern>/ckfinder/core/connector/java/connector.java</url-pattern>  
    4. </servlet-mapping>  

    现在就很明了了,struts2拦截器会拦截所有以"/"开头的URL,CKEditor的servlet拦截器拦截所有以"
    /ckfinder/core/connector/java/connector.java"开头的URL.当时CKEditor上传图片的时 候,URL中包含有"/"(指网站根目录),优先被struts2的拦截器拦截,这样上传的URL请求就不会转发到CKEditor的servlet中, 所有上传图片也就不会成功.
    问题所在找到了,那这个问题就好解决了,最简单的办法是将struts2的拦截器"/*"改成"#.action"或者"*.do",可以这样改:

    [html] view plain copy
     
    1. <filter-mapping>  
    2.         <filter-name>struts2</filter-name>  
    3.         <url-pattern>*.action</url-pattern>  
    4.     </filter-mapping>  

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

    [java] view plain copy
     
    1. package cn.edu.csu.software.filters;  
    2. import java.io.IOException;   
    3.   
    4. import javax.servlet.FilterChain;   
    5. import javax.servlet.ServletException;   
    6. import javax.servlet.ServletRequest;   
    7. import javax.servlet.ServletResponse;   
    8. import javax.servlet.http.HttpServletRequest;   
    9. import org.apache.struts2.dispatcher.FilterDispatcher;  
    10.   
    11. @SuppressWarnings("deprecation")  
    12. public class FCKFilter extends FilterDispatcher {  
    13.      public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException {     
    14.             HttpServletRequest request = (HttpServletRequest) req;    
    15.             String URI = request.getRequestURI();   
    16.             String[] uriArray = URI.split("/ckfinder/core/connector/java/*/");   
    17.             int arrayLen = uriArray.length;   
    18.             if (arrayLen >= 2) {   
    19.                 chain.doFilter(req, res);    
    20.             }else {   
    21.                 super.doFilter(req, res, chain);     
    22.             }   
    23.         }    
    24.     }   
    25.    

    上面的方法重写了struts2的过滤器FilterDispatcher中的doFilter方法,执行原理为:获得完整的http url的地址,然后判断URL地址中是否包含CKEditor的servlet拦截规则"/ckfinder/core/connector/java /*/",若包含,struts2就不拦截该URL请求,而直接转发,交给CKEditor的servlet来处理;若不包含,则拦截器拦截该URL请 求,由struts2来处理
    自定义的过滤器写完之后,要在web.xml中更改struts2的拦截器类,不能再使用struts2的默认拦截器类 FilterDispatcher 。但是请放心,自定义的过滤器FCKFilter继承了 FilterDispatcher 里的所有的方法,因此项目依然照常运行。
    <!-- struts2配置文件 -->

    [html] view plain copy
     
    1. <filter>  
    2.         <filter-name>struts2</filter-name>  
    3.         <!-- 
    4.             <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
    5.         -->  
    6.         <filter-class>cn.itcast.utils.FCKFilter</filter-class>  
    7. </filter>  
    8. <filter-mapping>  
    9.         <filter-name>struts2</filter-name>  
    10.         <url-pattern>/*</url-pattern>  
    11. </filter-mapping>  

    本文参考:何枫网友:http://hefeng1987-net-163-com.iteye.com/blog/1231940

  • 相关阅读:
    day22【网络编程】
    day21【缓冲流、转换流、序列化流】
    day20【字节流、字符流】
    设计模式7-适配器模式
    设计模式6-状态模式
    设计模式5-观察者模式
    设计模式4-建造者模式
    Web Service与WCF与Web API区别
    设计模式3-外观模式
    设计模式2-模板方法模式
  • 原文地址:https://www.cnblogs.com/yxnchinahlj/p/5939400.html
Copyright © 2011-2022 走看看