解决Struts2.1+FckEditer无法上传文件

 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的喜悦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值