1、項(xiàng)目環(huán)境
Struts2,Spring3.0.4,Hibernate3.5.6final,ckeditor-java-3.5.3,ckfinder_java_2.0.2
以上框架自己去官方網(wǎng)站去下載。
2、前言
之前使用tinymce編輯器,可發(fā)現(xiàn)要加上傳文件插件有點(diǎn)麻煩,而且資料缺乏,因此換成了ckeditor。去官網(wǎng)將ckeditor與ckfinder下載回來(lái),按demo部署項(xiàng)目(無(wú)struts框架),上傳文件功能一切正常。然后把ckfinder的源碼下載回來(lái),修改了上傳文件名稱重命名(用UUID作文件名),部署,一切OK,心中大喜,呵呵。
于是把它集成到我的ssh項(xiàng)目中,悲劇開(kāi)始了,在點(diǎn)上傳后,文件始終無(wú)法上傳,查源碼,打開(kāi)ckfinder的debug模式(debug模式無(wú)法用,腦殘了),沒(méi)法,只能自己在源代碼里加System.out來(lái)做了,經(jīng)過(guò)兩天半的時(shí)間分析,結(jié)果是ckfinder的Servlet根本沒(méi)有執(zhí)行。
3、分析過(guò)程
百度,google無(wú)果,最后只能使用“最小系統(tǒng)法”來(lái)分析問(wèn)題了,建了一個(gè)struts2項(xiàng)目,將ckeditor與ckfinder加進(jìn)來(lái),還是無(wú)法使用,看樣子是與struts2的配置有關(guān)(網(wǎng)上有人說(shuō)是與Struts2的fileupload與io包有沖突,都是胡說(shuō))查web.xml配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
 
<!-- start -->
    
<servlet>
        
<servlet-name>ConnectorServlet</servlet-name>
        
<servlet-class>com.ckfinder.connector.ConnectorServlet</servlet-class>
        
<init-param>
            
<param-name>XMLConfig</param-name>
            
<param-value>/WEB-INF/config.xml</param-value>
        
</init-param>
        
<init-param>
            
<param-name>debug</param-name>
            
<param-value>true</param-value>
        
</init-param>
        
<load-on-startup>1</load-on-startup>
    
</servlet>
    
<servlet-mapping>
        
<servlet-name>ConnectorServlet</servlet-name>
        
<url-pattern>
            /ckfinder/core/connector/java/connector.java
        
</url-pattern>
    
</servlet-mapping>
    
<session-config>
        
<session-timeout>10</session-timeout>
    
</session-config>
<!-- end -->
 
  
<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>
  
<welcome-file-list>
    
<welcome-file>index.html</welcome-file>
  
</welcome-file-list>
</web-app>
調(diào)試時(shí)發(fā)現(xiàn)一個(gè)很奇怪的現(xiàn)象,就是ckfinder的Servlet根本沒(méi)有執(zhí)行到里面去,這下恍然大悟(也許你也猜到了),是被Struts的filter過(guò)濾掉了,因此才無(wú)法執(zhí)行。
既然推測(cè)到了問(wèn)題,就改一下配置驗(yàn)證一下我的想法。將
<url-pattern>/*</url-pattern>
改為
<url-pattern>*.action</url-pattern>
讓它只處理Struts自己的action,保存修改,重新部署,測(cè)試上傳功能,一切正常!!!!興奮!!!!折騰了兩天半時(shí)間(最開(kāi)始我就想到用最小系統(tǒng)法去做,可想懶那么一次),看樣子以后還是不能懶了,呵呵。
4、結(jié)束語(yǔ)
這樣修改后,你項(xiàng)目里所有調(diào)用action的方法都要加.action后綴,至于為什么,你們懂的。希望這篇文章是及時(shí)雨,能幫忙到大家。
5、補(bǔ)充
經(jīng)多次測(cè)試,用以上方法還是不太好,下面補(bǔ)充一個(gè)好的解決辦法。
web.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
 3 
 4 <!-- start -->
 5     <servlet>
 6         <servlet-name>ConnectorServlet</servlet-name>
 7         <servlet-class>com.ckfinder.connector.ConnectorServlet</servlet-class>
 8         <init-param>
 9             <param-name>XMLConfig</param-name>
10             <param-value>/WEB-INF/config.xml</param-value>
11         </init-param>
12         <init-param>
13             <param-name>debug</param-name>
14             <param-value>false</param-value>
15         </init-param>
16         <load-on-startup>1</load-on-startup>
17     </servlet>
18     <servlet-mapping>
19         <servlet-name>ConnectorServlet</servlet-name>
20         <url-pattern>
21             /ckfinder/core/connector/java/connector.java
22         </url-pattern>
23     </servlet-mapping>
24     <session-config>
25         <session-timeout>10</session-timeout>
26     </session-config>
27 <!-- end -->
28 
29   <welcome-file-list>
30     <welcome-file>index.html</welcome-file>
31     <welcome-file>index.jsp</welcome-file>
32     <welcome-file>Index.jsp</welcome-file>
33   </welcome-file-list>
34    <error-page>
35     <error-code>404</error-code>
36     <location>/error.jsp</location>
37   </error-page>
38  <!-- <error-page>
39     <exception-type>java.lang.NullPointException</exception-type>
40     <location>/error.jsp</location>
41   </error-page>
42    -->
43   <listener>
44     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
45   </listener>
46   
47   
48   <context-param>
49     <param-name>contextConfigLocation</param-name>
50     <param-value>classpath*:beans.xml</param-value>
51   </context-param>
52  
53 
54   <filter>
55         <filter-name>AuthorityFilter</filter-name>
56         <filter-class>com.szblcz.website.util.filter.AuthorityFilter</filter-class>
57     </filter>
58     <filter-mapping>
59         <filter-name>AuthorityFilter</filter-name>
60         <url-pattern>/admin/*</url-pattern>
61     </filter-mapping>
62 
63    
64   <filter>
65     <filter-name>struts2</filter-name>
66     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
67   </filter>
68   <filter-mapping>
69     <filter-name>struts2</filter-name>
70     <url-pattern>/*</url-pattern>
71   </filter-mapping>
72 </web-app>
這里還是將所有請(qǐng)求都進(jìn)行過(guò)濾。
struts.xml
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5 
 6 <struts>
 7 
 8     <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
 9     
10     <constant name="struts.devMode" value="true" />
11     <constant name="struts.action.excludePattern" value="/ckfinder.*"/>
12 <!-- 以下代碼省略 -->

加上第11行,表示對(duì)符合此正則表達(dá)式的URL,Struts不進(jìn)行過(guò)濾,僅傳遞。