1. 程式人生 > >struts2 value屬性預設值解決方案

struts2 value屬性預設值解決方案

使用者登陸後把他的全部資訊放在session裡,這種做法很正常,有一點開發經驗的程式設計師都會這樣去做。

      我一開始的做法是這樣:把這個session傳到jsp頁面上,然後使用<s:textfield>的value屬性去顯示,結果發現value不支援任何表示式,這讓我有點沮喪。

      我在csdn上發帖問過這個問題,但沒有一個讓人滿意的答案。每個人的回帖都是寫在value裡怎樣寫表示式!

      後來經過思索,我完全推翻了上面這種愚蠢的作法。

      我們為什麼會用struts2的標籤,不用html的標籤,原因很簡單,就是他在提交失敗後會留住頁面狀態。

      反之,如果<s:textfield>的value屬性支援表示式,那麼提交失敗後,它還會去讀表示式裡的值,也就是說它會還原成預設值,而不是使用者修改後的值,這是我們都不想要的結果,我們要的是它既能顯示預設值又能留住頁面狀態(修改過後的值)。

      所以,我們可以這樣去做:

      我們去寫一個GetUserInfo.action,在這個action裡,我們去定義一個屬性:Users user給它get,set方法,然後我們給他賦上session裡的值,成功後頁面跳轉到jsp頁面裡,在jsp裡面,我們這樣去寫:<s:textfield name="user.username"/>這裡不需要value屬性。

      只要user裡面有值,頁面上就會顯示我們想要的值,而使用者修改後提交失敗後也能留住修改過後的值,這才是我們想要的效果。

      當然,那個GetUserInfo.action就是修改個人資訊的超連結,而不是之前的jsp頁面。

action原始碼:

  1. publicclassGetInfoActionextendsActionSupport{
  2. privatestaticfinallongserialVersionUID = -3187524365142687278L;
  3. privateUsersuser;
  4.    @Override
  5. publicStringexecute()throwsException{
  6. try{
  7. user= (Users)ActionContext.getContext().getSession().get("userInfo");
  8. returnSUCCESS;
  9. }catch(Exceptione){
  10. e.printStackTrace();
  11. returnERROR;
  12. }
  13. }
  14. publicUsersgetUser(){
  15. returnuser;
  16. }
  17. publicvoidsetUser(Usersuser){
  18. this.user = user;
  19. }
  20. }