Struts2是作为JavaWeb领域最为优秀和火热的MVC框架,而FCKEditer也是在线编辑器中的{wz},所以同时使用这两个利器是很多开发者选择。然而整合Struts2和FCKEditer并不像我们想象的那样顺利。一个共性的问题是每当我们上传文件后台就会出现下标越界异常(java.lang.IndexOutOfBoundsException: Index: 0, Size: 0)。 我搜罗了网上的几种解决方案,并简单分析存在的问题,并总结出一个简单合理的{zj2}方案。
一、部署包含FCKEditer的Struts2的应用
我们假设你已经知道如何创建一个包含FCKEditer的Struts2应用,可以无视这一段。 具体的方法不再赘述,你的应用配置看起来应该像这样子(Struts2.1+FCKEditer-java2.6):
<!-- 配置struts2过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置FCKEditer的Servlet --> <servlet> <servlet-name>ConnectorServlet</servlet-name> <servlet-class> net.fckeditor.connector.ConnectorServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ConnectorServlet</servlet-name> <!-- Do not wrap this line otherwise Glassfish will fail to load this file --> <url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern> </servlet-mapping>
二、问题描述与分析
部署,启动,运行,访问,貌似编辑器没什么问题。但是上传图片时问题出现了,图片传不上去,同时后台出现异常(java.lang.IndexOutOfBoundsException: Index: 0, Size: 0)。
但是我们xx是按照FCKEditer-java的DEMO配置的,而且在没有Struts2的环境中是xx正常的,所以我们初步推断出产生这个问题的原因。
由于struts2对所有的请求进行过滤,对HttpServletRequest进行了封装,FCKEditer已经无法拿到原来的HttpServletRequest,所以当FCKEditer的request.getinputStream的时候就会出错!
三、网上解决方案分析
网上主要有三种解决方案,都有不同的问题。如果你只想解决问题,可以直接看。
- 修改Web.xml ? ? 原文链接:?
- 自定义Filter(修改Struts2源代码) ? 原文链接:
- 自定义Filter(继承-覆写) ? 原文链接:
方案一存在的问题:
对于没有.action后缀的应用无效
在struts2.1中会报错
可能会留下一些隐患
方案二存在的问题
需要struts2的源代码
该拦截器的代码不能持续和应用中struts2版本同步
修改源代码是不被建议的做法
方案三存在的问题
if(“/fckeditor/editor/filemanager/connectors/fileupload”.equals(request.getRequestURI()))不正确
request.getRequestURI() 取到的值为形如 /应用名/fckeditor/editor/filemanager/connectors/php/upload.php的字符串
应该改为if (“/fckeditor/editor/filemanager/connectors”.equals(request.getServletPath()))
四、最简单的解决方案
综合几个方案,我们可以这样解决:
1、 新建一个Java类,继承自StrutsPrepareAndExecuteFilter类,如com.fuyouit.filter.FckPassFilter
2、 覆写StrutsPrepareAndExecuteFilter的doFilter方法
@Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; if ("/fckeditor/editor/filemanager/connectors".equals(request.getServletPath())) { chain.doFilter(req, res); } else { super.doFilter(req, res, chain); } }
3在Web.xml中配置将Struts的过滤器替换为该过滤器,修改完后配置如下
<!-- 配置struts2过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>com.fuyouit.blog.util.FckPassFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置FCKEditer的Servlet --> <servlet> <servlet-name>ConnectorServlet</servlet-name> <servlet-class> net.fckeditor.connector.ConnectorServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ConnectorServlet</servlet-name> <!-- Do not wrap this line otherwise Glassfish will fail to load this file --> <url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern> </servlet-mapping>
4、享受成功整合Struts2和FCKEditer的喜悦