1. 程式人生 > >Struts2 2.5.2的套路

Struts2 2.5.2的套路

最近接觸了Struts2這個JavaWeb框架,結果被套路了,而且套路的很慘。

要學Struts2 就必然要下載Struts2的jar包,在官網上下載了最新的,沒錯就是這個:

這個東西真是把我快搞瘋了。

然後有了這個東西就開始我的配置Struts2之旅,我沒有用MyEclipse,我用的是Eclipse,我根據書上把關鍵的幾個包放在了WEB-INF下的lib資料夾下,


然後滿還期待的寫了一個action和兩個jsp檔案,配置了web.xml的過濾器、添加了struts.xml,之後滿懷信心的運行了,結果失敗了。連JSP檔案都載入不出來,感覺快要崩潰了,趕緊對照書中的各個部分看了又看,結果並沒有發現問題,查看了Tomcat的日誌檔案,發現找不到一個類(NotFindClass)---org.apache.struts2.dispatcher.FilterDispather,我打開了這個Jar包

就是這個,發現FilterDispather這個類並沒有

我鬱悶了。趕緊百度,發現從好像從Struts2 2.1之後就沒有再用FilterDispather這個分發器了,而是用的上面圖中的第三個類,也就是StrutsPrepareAndExecuteFilter這個累,我幹煎吧web.xml中的過濾器中的內容改成百度到的org.apache.struts2.dispatcher.ng.StrutsPrepareAndExecuteFilter,執行還是出錯說是找不到這個類,我開啟包一看發現沒有ng這個資料夾,去掉ng後變成org.apache.struts2.dispatcher.StrutsPrepareAndExecuteFilter



執行又出錯誤,連Tomcat是執行不起來。是找不到log4的東東。我趕緊百度查到需要這個日誌的包趕緊加上


以下是我匯入的所有的包


再次執行,Tomcat執行正常了,可是JSP檔案還是打不開,查書,百度,google,用了很多方法才發現是Struts.xml除了問題。Struts.xml的頭沒有這一段話

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

加上了後果然JSP可以運行了,終於算是吧Struts2給配置好了,可以高興了吧,結果接下來的幾點讓我有崩潰了

先是在通過URL執行action的方法就是這個樣子:http://localhost:8080/Struts2/Login!login.action,也就是執行Login對映的Action類中的login自定義方法(只要返回String型別的函式都可以),結果很悲催的出現了404錯誤,怎和會找不到呢,之前執行http://localhost:8080/Struts2/Login.action都沒有問題怎麼這下出問題了,找不到,不應該啊,出錯也是出的500伺服器錯誤啊,檢查了struts.xml中的對映,完全沒有問題,趕緊又百度(百度是個好東西,也是個爛東西)。發現原來Strust2提供了一種配置,用於禁用DMI,你可以在struts.xml檔案中,使用constant元素將struts.enable.DynamicMethodInvocation屬性設定為true,來啟動DMI。也就是在package標籤上struts標籤下加上這麼一句



高興的以為解決的,結果呢,被套路的完全沒有問題,一遍遍的檢查,甚至重新敲一邊,結果都是一樣的,大自然的規律果然沒法避免呢(^.^),糾結了2個多小時,終於在這個網頁找到了正確答案http://www.05935.com/bc/554840/

裡面說的是在是用struts2 2.5版本的包的時候,出現一個很噁心的問題,就是使用動態方法的時候,報這樣一個問題:This method: login for action user is not allowed! 

和我的問題一樣,作者果然是大牛,在看原始碼的時候發現了


原來是struts2 2.5版本的安全度提高了一個臺階,所有不安全的訪問都必須要在Struts.xml中宣告允許,接下來的問題也是因為版本的問題

在使用萬用字元的時候出現了問題你就是  {1}   獲取不到   *   所表示的字元,一開始我沒有往版本上考慮,我一遍一遍的排查,發現是這個萬用字元的問題,之前並沒有想到,因為出的還是404  action找不到的問題,我先不用萬用字元,能正確顯示,使用萬用字元導致Action不能區別訪問,

<action name="Person" method="add" class="com.struts2.action.LoginAction2">
     <result name="success">/success.jsp</result>
     <result name="logout">/error.jsp</result>
     <allowed-methods>*</allowed-methods>
     </action>

上面的不用萬用字元,下面的用了萬用字元卻出錯了,一邊一邊的改這個配置

<action name="*Person" method="{1}" class="com.struts2.action.LoginAction2">
     <result name="success">/success.jsp</result>
     <result name="logout">/error.jsp</result>
     <allowed-methods>*</allowed-methods>
     </action>

結果這個可以訪問到,於是我發現問題出在了    {1}       這個符號上,最後發現這是struts2 2.5 的又一個新特性---萬用字元禁止使用,我想應該是這種操作雖然對於程式設計人員來說簡化了許多操作,但是對系統來說卻增加了系統的開銷。所以預設禁止使用萬用字元,需要加入允許操作才可以


紅線標記的兩句話就是開啟這個的祕密。終於解決了,錯,struts.xml顯示這兩個東西是沒有的,瞬間懵逼了,沒有,怎麼可能,又開始檢查檔案,發現並沒有錯誤,又糾結了好長時間最終想到是不是還是版本的問題,看了看struts.xml

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

果然是版本的問題,趕緊改正

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">

這下沒問題了,這下是完全成功了,終於從Struts2   2.5的套路中走出來了,不得不說2.5的套路太深了,我都無言以對了,但是從另一個方面來看,他禁止了許多不安全或是對系統來說負擔過中的功能,這也是應該引導程式設計人員進步的階梯吧,從struts2 的更新開始就是對struts2的優化開始。

新的東西出現的很快,當我們的教材還是以前的版本時,就已經跟不上了,我們需要去接觸最新的東西,即使很難,這是因為新的東西和舊的東西有很大的改變,當這種差異顯現的時候,頭疼的就是程式設計師了,這是為什麼錯了,怎麼又錯了,欸,怎麼對了,好奇怪。原來我接觸JAVAFX2.0的時候也很頭疼,因為這種GUI很新,和舊的AWT、SWING完全不是一個思想,可以說是更高層的抽象了。扯遠了,以上就是我在最新的Strut2 2.5的版本上發現的新的,估計以後會發現更多,希望可以解決你們的問題。