在學(xué)習(xí)struts框架時(shí)經(jīng)常會(huì)使用到通配符調(diào)用方法君珠,如下:
其中的action name="user_*"中*這個(gè)符號(hào)代表的值會(huì)傳入method=“{1}”中究流,并對(duì)應(yīng)action類的一個(gè)方法名锄码,這樣就能很大程度地減少配置文檔中action的數(shù)目动知。
但是在使用這種通配符方法的時(shí)候涩僻,經(jīng)常會(huì)看到這樣的映射錯(cuò)誤提示
Struts has detected an unhandled exception:
Message:There is no Action mappedfornamespace [/] and action name [user_login] associated with context path [/shop].
如果看到提示的是映射問題缭召,你可以按照映射路線排除一遍栈顷,
第一步:先排查訪問的鏈接有沒有問題(細(xì)節(jié)問題)
第二步:查看struts.xml的配置(仔細(xì)排查,出現(xiàn)問題幾率很大)
第三步:查看相關(guān)的action類及方法(比如return的值是不是跟配置文件中的result對(duì)應(yīng)得上等)
第四步:查看結(jié)果響應(yīng)頁(yè)面是否存在問題(出現(xiàn)問題的幾率比較星断铩)
(具體的做法我不細(xì)講了萄凤,網(wǎng)上很多優(yōu)秀篇章都有提及,可自行百度)
如果上面的四個(gè)步驟沒出問題搪哪,可是還是報(bào)錯(cuò)靡努,怎么辦?那就可能是內(nèi)部屬性配置的問題了
在Struts
2的核心jar包struts2-core中晓折,有一個(gè)default.properties的默認(rèn)配置文件(路徑:struts-2.5.2-min\lib\org\apache\struts2\default.properties)里面配置了一些全局的信息
其中有條語(yǔ)句是配置動(dòng)態(tài)方法調(diào)用的
struts.enable.DynamicMethodInvocation = true
當(dāng)使用動(dòng)態(tài)調(diào)用方法時(shí)(action名 + 感嘆號(hào) + 方法名進(jìn)行方法調(diào)用)惑朦,需要將其屬性改為true,
當(dāng)使用通配符調(diào)用語(yǔ)法時(shí)漓概,建議將其屬性改為false(struts2.5.2中默認(rèn)是false)
當(dāng)我們需要將其屬性改成false時(shí)漾月,
只在struts.xml配置文件中加入此句即可修改屬性
<constantname="struts.enable.DynamicMethodInvocation"value="false"/>
很多網(wǎng)友都說(shuō)改了之后都行了,不過(guò)我換了struts2.5之后垛耳,整了好久都還是不行……
最后是在配置文檔struts.xml的Action中配置了<allowed-methods>Action內(nèi)的方法名</allowed-methods>才成功了
比如上面代碼修改如下:
備注:紅色代碼中的login為對(duì)應(yīng)Action類里面的方法名栅屏,可以加上多個(gè)方法,方法名之間用逗號(hào)隔開堂鲜。
總結(jié):在struts2.3之前的版本栈雳,正常的配置就可以了,但在struts2.3版本之后缔莲,使用通配符調(diào)用方法時(shí)哥纫,內(nèi)部會(huì)驗(yàn)證是否允許訪問該方法,所以要加上
<allowed-methods>方法名1痴奏,方法名2…代碼蛀骇。</allowed-methods>
希望這個(gè)小知識(shí)點(diǎn)能幫助更多編程愛好者,在java道路上读拆,與志同道合者共勉I勉尽!
(該篇隨筆由我之前的csdn博客搬家而來(lái))