在最近的一次JavaEE項目開發中,項目架構中有用到Struts2 ,遇到了一個以前從來沒有遇到過的小難題,困擾了我很久,今天我打算把該問題剖析一下。
問題是這樣的,在配置路徑以及跳轉路徑均不存在問題的情況下,從jsp頁面點擊到Action的鏈接,頁面會報這個錯:404 No result defined for action XXXAction and result input ,並且web服務器后台並沒有報錯。
可能的原因有如下幾方面:
1. 頁面中傳入的值與業務實體或Action中屬性的類型不一致
例如:后台定義的是java.util.Date 類型,前台隨便輸入的數據,Struts2的攔截器無法將前台的數據按照后台要求的類型給你轉化,所以頁面報錯。
2. 頁面中用到的控件名稱與后台Action中的屬性名稱不一致
這個很好理解,名稱不匹配,Struts2是不會給Action中的屬性賦值的。
3. 可能涉及到Struts2的bug, 例如前台頁面:
有一個輸入控件:
<input type=”text” name=”soldMount” value=”<s:sproperty value=”%{batch.soldMount}” />” />
當Struts2的攔截器在解析以“soldMount”命名的輸入控件的時候,無法將<s:sproperty value=”%{batch.soldMount}” />帶來的值,傳送過去,而只是簡單的將其作為字符創來傳遞給Action,而后台Action要接受的數據類型卻是Long 或者int ,所以會發生如原因1的問題,結果也會報錯,這極有可能是Struts2的bug,所以應該盡量避免上述用法。
解決辦法:
詳細檢查是否有原因1、2所述的問題,若果這是問題3類型,解決辦法如下:前台僅僅只是作為顯示的工具,要想辦法把后台要獲取的值從后台程序中獲取,而不從前台中獲取,就不會發生類型轉換錯誤了,頁面也會正常顯示的。