Struts2是作为JavaWeb领域最为优秀和火热的MVC框架,而FCKEditer也是在线编辑器中的王者,所以同时使用这两个利器是很多开发者选择。然而整合Struts2和FCKEditer并不像我们想象的那样顺利。一个共性的问题是每当我们上传文件后台就会出现下标越界异常(java.lang.IndexOutOfBoundsException: Index: 0, Size: 0)。
我搜罗了网上的几种解决方案,并简单分析存在的问题,并总结出一个简单合理的终极方案。
一、部署包含FCKEditer的Struts2的应用我们假设你已经知道如何创建一个包含FCKEditer的Struts2应用,可以无视这一段。 具体的方法不再赘述,你的应用配置看起来应该像这样子(Struts2.1+FCKEditer-java2.6):
<!-- 配置struts2过滤器 -->struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /*
<!-- 配置FCKEditer的Servlet -->ConnectorServlet net.fckeditor.connector.ConnectorServlet 1 ConnectorServlet <!-- Do not wrap this line otherwise Glassfish will fail to load this file -->
/fckeditor/editor/filemanager/connectors/*
二、问题描述与分析部署,启动,运行,访问,貌似编辑器没什么问题。但是上传图片时问题出现了,图片传不上去,同时后台出现异常(java.lang.IndexOutOfBoundsException: Index: 0, Size: 0)。 但是我们完全是按照FCKEditer-java的DEMO配置的,而且在没有Struts2的环境中是完全正常的,所以我们初步推断出产生这个问题的原因。 由于struts2对所有的请求进行过滤,对HttpServletRequest进行了封装,FCKEditer已经无法拿到原来的HttpServletRequest,所以当FCKEditer的request.getinputStream的时候就会出错!
三、网上解决方案分析网上主要有三种解决方案,都有不同的问题。如果你只想解决问题,可以直接看第四。
1.修改Web.xml 原文链接: http://www.iteye.com/topic/150989
2.自定义Filter(修改Struts2源代码) 原文链接:http://hi.baidu.com/hsazj/blog/item/33f032119404251bb9127b89.html
3.自定义Filter(继承-覆写) 原文链接:http://www.po-soft.com/blog/yongtree/566.html 方案一存在的问题: 对于没有.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的喜悦