最近在搭建一個最新的ssh2框架,今天在調試的時候,發現了一個以前一直沒有注意過的問題,我在Action中使用域模型的方式去接收jsp畫面中的參數的時候,發現參數總是接收不完,頭一次遇到這種問題,現在把解決辦法寫下來
Jsp中的代碼如下:
1 <form action="TestAction" method="post">2 用戶名:<input type="text" name="user.userName"><br/>3 密 碼:<input type="text" name="user.userPwd"><br/>4 <input type="submit" value="提交">5 </form>
然後我在Action中定義一個user屬性,user中包含了userName和userPwd屬性,代碼如下:
1 /**2 * 定義UserInfo的域模型,用於接收Form表單中的參數3 */4 private UserInfo user;5 public void setUser(UserInfo user) {6 this.user = user;7 }
因爲我在Action只寫了setUser方法,沒有寫相應的getUser方法,所以在接收參數的時候就出現瞭如下問題
在調試過程中發現,user域模型只接收到了一個參數,userName的卻爲空了
使用了Struts2框架那麼久了,還是頭一次遇到這個問題,百思不得其解。後來上網查了原因發現,原來是少了對應的getUser方法才導致出現了這個問題,因爲struts2對這種混合類型的注入不是一次性全部注入其屬性,而是每注入一次下一次就在前臺獲取obj然後再注入。我們編程時習慣getter/setter 都寫,因此很少碰到這個問題。
在Action中加上對應的getUser方法,代碼如下:
1 private UserInfo user;2 public UserInfo getUser() {3 return user;4 }5 public void setUser(UserInfo user) {6 this.user = user;7 }
再次進行接收參數測試
這次就可以把JSP中填寫的用戶名和密碼都獲取下來了,如下圖所示:
總結:在Struts2中使用domain模型接收參數時,一定要寫上該模型對應的get和set方法,否則就會出現參數接收不完的情況。
在Action中使用域模型接收參數的正確寫法範例: