Struts2中使用Fckeditor上传文件报错

本文档探讨了在Struts2中使用Fckeditor上传文件时遇到的异常,异常信息提示权限不足。文章分析了问题可能的原因,并提供了解决方案,包括检查服务器权限设置。同时,还讨论了Struts2与Dojo的集成问题,特别是在datetimepicker标签无法正常工作时的过滤器映射调整,以及如何通过添加特定的过滤器映射来解决问题。此外,还介绍了在Struts2中使用Dojo的简单配置方法,包括在HTML中添加<s:head theme="ajax"/>和<s:textarea theme="ajax"/>来实现简洁的风格。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在Struts2项目中使用Fckeditor上传文件时报如下异常:

Java代码 复制代码
  1. java.lang.RuntimeException: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]  
java.lang.RuntimeException: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]


上网搜了一下,主要是因为与struts2拦截器的拦截发生冲突引起的原因:

Struts2默认使用的是Jakarta的Common-FileUpload的文件上传框架,而struts2的filter拦截了上传文件的动作,拦截器代码是这样写的:

Java代码 复制代码
  1. //org.apache.struts2.dispatcher.Dispatcher.java    
  2. public HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException {    
  3.         // don't wrap more than once    
  4.         if (request instanceof StrutsRequestWrapper) {    
  5.             return request;    
  6.         }    
  7.         String content_type = request.getContentType();    
  8.         if (content_type != null && content_type.indexOf("multipart/form-data") != -1) {    
  9.             MultiPartRequest multi = getContainer().getInstance(MultiPartRequest.class);    
  10.             request = new MultiPartRequestWrapper(multi, request, getSaveDir(servletContext));    
  11.         } else {    
  12.             request = new StrutsRequestWrapper(request);    
  13.         }    
  14.         return request;    
  15.     }   
//org.apache.struts2.dispatcher.Dispatcher.java 
public HttpServletRequest wrapRequest(HttpServletRequest request, ServletContext servletContext) throws IOException { 
        // don't wrap more than once 
        if (request instanceof StrutsRequestWrapper) { 
            return request; 
        } 
        String content_type = request.getContentType(); 
        if (content_type != null && content_type.indexOf("multipart/form-data") != -1) { 
            MultiPartRequest multi = getContainer().getInstance(MultiPartRequest.class); 
            request = new MultiPartRequestWrapper(multi, request, getSaveDir(servletContext)); 
        } else { 
            request = new StrutsRequestWrapper(request); 
        } 
        return request; 
    } 


注意MultiPartRequest multi = getContainer().getInstance(MultiPartRequest.class);这句是上传文件时拦截器实现所需要的,出错的原因是找不到MultiPartRequest.class的实现类.这个类在上传框架jar文件中.这是文件上传fileupload解析器。

因此,如果需要使用Struts2的文件上传功能,则需要在web应用中增加两个JAR文件,即commons-io-1.4.jar和commons-fileupload-1.2.1.jar。将这个包或是包的最新版本放在工程的lib目录下,即解决以上异常问题,成功实现文件的上传。

上传图片时弹出完全警告:

Java代码 复制代码
  1. Security error. You probably don't have enough permissions to upload. Please check your server  
Security error. You probably don't have enough permissions to upload. Please check your server


struts2对request进行了封装,所以当fck的request.getinputStream的时候就会出错.修改的方法就是对filtermapping的路径进行修改。

解决方法如下:

将下面代码中的“/*”

Java代码 复制代码
  1. <filter-mapping>    
  2. <filter-name>struts2</filter-name>    
  3. <url-pattern>/*</url-pattern>    
  4. </filter-mapping>  
<filter-mapping> 
<filter-name>struts2</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping>


改为:“*.action”。
另外,jsp页面上面用到了struts2的tag,那么就要增加一个*.jsp的url-pattern。

如下:

Java代码 复制代码
  1. <filter-mapping>      
  2.   <filter-name>struts2</filter-name>      
  3.   <url-pattern>*.action</url-pattern>      
  4. </filter-mapping>      
  5.   
  6. <filter-mapping>      
  7.   <filter-name>struts2</filter-name>      
  8.   <url-pattern>*.jsp</url-pattern>      
  9. </filter-mapping>   

如果你用到struts2的datetimepicker标签发现他不能用了
你查看源代码的时候会发现有如下代码 
<link rel="stylesheet" href="/para/struts/xhtml/styles.css" type="text/css"/> 
<script language="JavaScript" type="text/javascript"> 
// Dojo configuration 
djConfig = { 
baseRelativePath: "/para/struts/dojo", 
isDebug: false, 
bindEncoding: "utf-8", 
debugAtAllCosts: true // not needed, but allows the Venkman debugger to work with the includes 
}; 
</script> 
<script language="JavaScript" type="text/javascript" 
src="/para/struts/dojo/dojo.js"></script> 
<script language="JavaScript" type="text/javascript" 
src="/para/struts/simple/dojoRequire.js"></script> 
这时加上以下过滤后问题解决
<filter-mapping> 
<filter-name>struts2</filter-name> 
<url-pattern>/struts/*</url-pattern> 
</filter-mapping> 
当然要用datetimepicker标签在<head>中还要加入 <s:head theme="ajax"/>

二 Struts2 + Dojo

Struts2部分更简单了。虽然Struts2不直接支持FCKeditor,但直接Dojo,而且个人更喜欢这种简洁的风格,我用的是Struts2.0.11版本进行测试,使用时,只要配置两个地方

1. 在HTML<head />标签之间,加上
Html代码 
<s:head theme="ajax"/>  
2. 将textarea加上主题  Html代码 
<s:textarea theme="ajax" />  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

無名VF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值