1、項目環境
Struts2,Spring3.0.4,Hibernate3.5.6final,ckeditor-java-3.5.3,ckfinder_java_2.0.2
以上框架自己去官方網站去下載。
2、前言
之前使用tinymce編輯器,可發現要加上傳文件插件有點麻煩,而且資料缺乏,因此換成了ckeditor。去官網將ckeditor與ckfinder下載回來,按demo部署項目(無struts框架),上傳文件功能一切正常。然后把ckfinder的源碼下載回來,修改了上傳文件名稱重命名(用UUID作文件名),部署,一切OK,心中大喜,呵呵。
于是把它集成到我的ssh項目中,悲劇開始了,在點上傳后,文件始終無法上傳,查源碼,打開ckfinder的debug模式(debug模式無法用,腦殘了),沒法,只能自己在源代碼里加System.out來做了,經過兩天半的時間分析,結果是ckfinder的Servlet根本沒有執行。
3、分析過程
百度,google無果,最后只能使用“最小系統法”來分析問題了,建了一個struts2項目,將ckeditor與ckfinder加進來,還是無法使用,看樣子是與struts2的配置有關(網上有人說是與Struts2的fileupload與io包有沖突,都是胡說)查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>
調試時發現一個很奇怪的現象,就是ckfinder的Servlet根本沒有執行到里面去,這下恍然大悟(也許你也猜到了),是被Struts的filter過濾掉了,因此才無法執行。
既然推測到了問題,就改一下配置驗證一下我的想法。將
<url-pattern>/*</url-pattern>
改為
<url-pattern>*.action</url-pattern>
讓它只處理Struts自己的action,保存修改,重新部署,測試上傳功能,一切正常?。。?!興奮?。。?!折騰了兩天半時間(最開始我就想到用最小系統法去做,可想懶那么一次),看樣子以后還是不能懶了,呵呵。
4、結束語
這樣修改后,你項目里所有調用action的方法都要加.action后綴,至于為什么,你們懂的。希望這篇文章是及時雨,能幫忙到大家。
5、補充
經多次測試,用以上方法還是不太好,下面補充一個好的解決辦法。
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>
這里還是將所有請求都進行過濾。
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行,表示對符合此正則表達式的URL,Struts不進行過濾,僅傳遞。