struts2從請求取值的三種方式

Struts2作爲WEB框架,必不可少的需要請求中取值。(我在這裏說是從請求中取值對於一些讀者可能有些晦澀,其實如果我說從頁面取值可能就好理解一點了,但除了從已經存在的頁面裏面能夠給後臺傳值,在地址欄裏也可以傳,甚至在java代碼裏也是可以的。)

這裏就談談struts如何從請求中取值。

我介紹三種方式:

三種取值方式:
1,使用默認的action的傳遞方式。
2,自定義一個vo,在action中使用這個vo
3,使用ModelDriven的方式。



一、使用默認的action的傳遞方式

如果我們的請求裏面帶有兩個參數userName和passWord的話,我們只需要在Action裏有這兩個私有屬性就可以了。

請看我的Action:

Java代碼  收藏代碼
  1. package study.getValue;  
  2.   
  3. import com.opensymphony.xwork2.Action;  
  4.   
  5. /** 
  6.  
  7. * 在Action中定義請求裏面傳過來的值, 
  8.  
  9. * 並且定義所有的Setter和Getter 
  10.  
  11. * 這樣可以直接在功能方法裏面直接使用這些值。 
  12.  
  13. * @author  arne3166 
  14.  
  15. * @version  [0100, 2010-9-30] 
  16.  
  17. */  
  18.   
  19. public class LoginAction  
  20.   
  21. {  
  22.   
  23.     private String userName;//頁面裏面的userName  
  24.   
  25.     private String passWord;//頁面裏面的passWord  
  26.   
  27.     //必須的setter和getter方法  
  28.   
  29.     public String getUserName();  
  30.   
  31.     public void setUserName(String userName);  
  32.   
  33.     public String getPassWord();  
  34.   
  35.     public void setPassWord(String passWord);      
  36.   
  37.     //業務邏輯     
  38.   
  39.     public String execute()  
  40.   
  41.     {  
  42.   
  43.         if (null!= userName && null != passWord  
  44.   
  45.             && userName.equals("arne3166") && passWord.equals("111111"))  
  46.   
  47.         {  
  48.   
  49.             return Action.SUCCESS;  
  50.   
  51.         }  
  52.   
  53.         else  
  54.   
  55.         {  
  56.   
  57.             return Action.ERROR;  
  58.   
  59.         }  
  60.   
  61.     }  
  62.   
  63. }  


複製代碼在struts .xml裏面的配置

Xml代碼  收藏代碼
  1. <action name="loginput" >  
  2.   
  3.         <result>/page/getValue/login_input.jsp</result>  
  4.   
  5. </action>  
  6.   
  7. <action name="login" class="study.getValue.LoginAction">  
  8.   
  9.         <result name="success">/page/getValue/success.jsp</result>  
  10.   
  11.         <result name="error">/page/getValue/fail.jsp</result>  
  12.   
  13. </action>  


複製代碼看jsp是怎麼寫的:

Java代碼  收藏代碼
  1. <form action="login.action"><!-- name="userName" 和 name="passWord"同Action裏面的私有屬性對上 -->  
  2.   
  3. 用戶名:<input name="userName" type="text"/>用戶密碼<input name="passWord" type="password"/>  
  4.   
  5. <input type="submit" value="提交"/>  
  6.   
  7. </form>  


二、自定義一個vo,在action中使用這個vo

區別於以上的方式,Struts2中允許將頁面的值封裝起來,放到一個ValueObject(VO)中。就比如上面的例子中的userName和passWord,完全可以放到一個User類中。這樣做的好處是,避免如果Action中如果有好多這樣的值的話,太多的setter和getter會使得Action看起來比較臃腫的毛病。

看看我們是怎麼做的

首先定義User

Java代碼
Java代碼  收藏代碼
  1. package study.getValue.vo;     
  2. public class User     
  3. {     
  4.     //頁面中的值的封裝     
  5.     private String userName;     
  6.     private String passWord;     
  7.     //所有的setter和getter     
  8.     public String getUserName();     
  9.     public void setUserName(String userName);     
  10.     public String getPassWord();     
  11.     public void setPassWord(String passWord);     

  12.  


再看Action被簡化成了什麼樣子
Java代碼

Java代碼  收藏代碼
  1. package study.getValue;     
  2. import com.opensymphony.xwork2.Action;     
  3. import study.getValue.vo.User;     
  4. /**   
  5. *   
  6. * 在Action中定義請求裏面傳過來Vo,   
  7. * 並且定義VO的Setter和Getter   
  8. * 使用頁面參數的時候像使用Vo的屬性一樣。   
  9. * @author  arne3166   
  10. * @version  [0100, 2010-9-30]   
  11. */    
  12. public class VoLoginAction     
  13. {     
  14.     //將vo作爲私有屬性     
  15.     private User u;     
  16.     //setter和getter必不可少     
  17.    public User getU();     
  18.     public void setU(User u);     
  19.     public String execute()     
  20.     {     
  21.         String userName = u.getUserName();     
  22.         String passWord = u.getPassWord();     
  23.         if (null!= userName && null != passWord     
  24.             && userName.equals("arne3166") && passWord.equals("111111"))     
  25.         {     
  26.             return Action.SUCCESS;     
  27.         }     
  28.         else    
  29.         {     
  30.             return Action.ERROR;     
  31.         }     
  32.     }     
  33. }    
  34.   

這樣做了,頁面任然用原來的當然是不行的,注意到Action中的user對象的引用是u,那麼,在頁面裏面userName也需要修改成u.userName,passWord也應當修改成u.passWord

Html代碼
Java代碼  收藏代碼
  1. <!--login_input_vo.jsp name="u.passWord"和name="u.passWord"是對Action中User對象進行映射 -->    
  2. <form action="loginvo.action">    
  3. 用戶名:<input name="u.userName" type="text"/>用戶密碼<input name="u.passWord" type="password"/>    
  4. <input type="submit" value="提交"/>    
  5. </form>    
  6.   


再看看配置文件

Xml代碼
Java代碼  收藏代碼
  1. <action name="loginputvo" >    
  2.     <result>/page/getValue/login_input_vo.jsp</result>    
  3. </action>    
  4. <action name="loginvo" class="study.getValue.VoLoginAction">    
  5.     <result name="success">/page/getValue/success.jsp</result>    
  6.     <result name="error">/page/getValue/fail.jsp</result>    
  7. </action>    
  8.   
  9. <action name="loginputvo" >  
  10.         <result>/page/getValue/login_input_vo.jsp</result>  
  11. </action>  
  12. <action name="loginvo" class="study.getValue.VoLoginAction">  
  13.         <result name="success">/page/getValue/success.jsp</result>  
  14.         <result name="error">/page/getValue/fail.jsp</result>  
  15. </action> 成功失敗後的頁面沒有什麼好修改的。  



三、使用模型驅動(ModelDriven)的方式。

上面的例子中在頁面要寫上u.userName,按照習慣前面的“u.”是不是可以不要呢,同時又能保持第二種方式裏Action的“純潔”,Struts2的模型驅動就可以做到。

從實現方式上面需要Action實現模型驅動的接口,先來看Action是怎麼寫的:

Java代碼  收藏代碼
  1. package study.getValue;     
  2. import study.getValue.vo.User;     
  3. import com.opensymphony.xwork2.Action;     
  4. import com.opensymphony.xwork2.ModelDriven;     
  5. /**   
  6. *   
  7. * Action實現ModelDriven接口。   
  8. * 在Action裏定義一個私有變量User,這個User應該被new出來,   
  9. * 不過裏面的值是Strus來設置的   
  10. * 不需要Setter和Getter方法   
  11. * @author  arne3166   
  12. * @version  [0100, 2010-9-30]   
  13. */    
  14. public class ModelDrivenLoginAction implements ModelDriven<User>     
  15. {     
  16.     //需要將user對象new出來;     
  17.     private User u = new User();     
  18.     //實現的接口方法     
  19.     @Override    
  20.     public User getModel()     
  21.     {     
  22.         return u;     
  23.     }     
  24.     public String execute()     
  25.     {     
  26.         String userName = u.getUserName();     
  27.         String passWord = u.getPassWord();     
  28.         if (null!= userName && null != passWord     
  29.             && userName.equals("arne3166") && passWord.equals("111111"))     
  30.         {     
  31.             return Action.SUCCESS;     
  32.         }     
  33.         else    
  34.         {     
  35.             return Action.ERROR;     
  36.         }     
  37.     }     
  38. }    
  39.   


下面回到Sturts的配置文件



Xml代碼
Java代碼  收藏代碼
  1. <action name="loginputmodeldriven" >    
  2.     <result>/page/getValue/login_input_modeldriven.jsp</result>    
  3. </action>    
  4. <action name="loginmodeldriven" class="study.getValue.ModelDrivenLoginAction">    
  5.     <result name="success">/page/getValue/success.jsp</result>    
  6.     <result name="error">/page/getValue/fail.jsp</result>    
  7. </action>    
  8.   
  9. <action name="loginputmodeldriven" >  
  10.         <result>/page/getValue/login_input_modeldriven.jsp</result>  
  11. </action>  
  12. <action name="loginmodeldriven" class="study.getValue.ModelDrivenLoginAction">  
  13.         <result name="success">/page/getValue/success.jsp</result>  
  14.         <result name="error">/page/getValue/fail.jsp</result>  
  15. </action>   


再看錶單的頁面

Java代碼  收藏代碼
  1.    
  2. <!--又回到原始簡單的樣式了O(∩_∩)O-->     
  3. <form action="loginmodeldriven.action">     
  4. 用戶名:<input name="userName" type="text"/>用戶密碼<input name="passWord" type="password"/>     
  5. <input type="submit" value="提交"/>     
  6. </form>    
  7.   
  8. <!--又回到原始簡單的樣式了O(∩_∩)O-->  
  9. <form action="loginmodeldriven.action">  
  10. 用戶名:<input name="userName" type="text"/>用戶密碼<input name="passWord" type="password"/>  
  11. <input type="submit" value="提交"/>  
  12. </form>   

這裏注意一下,

這是必須的
//需要將user對象new出來;
private User u = new User();

如果不將user new出來的話,會在頁面給你一個異常吃吃


Java代碼  收藏代碼
  1. Struts Problem Report     
  2. Struts has detected an unhandled exception:      
  3.     
  4. Messages:       
  5. File: study/getValue/ModelDrivenLoginAction.java      
  6. Line number: 23      
  7.     
  8.     
  9. --------------------------------------------------------------------------------     
  10.     
  11. Stacktraces     
  12. java.lang.NullPointerException      
  13.     study.getValue.ModelDrivenLoginAction.execute(ModelDrivenLoginAction.java:23)     
  14.     sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     
  15.     sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     
  16.     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     
  17.     java.lang.reflect.Method.invoke(Method.java:597)    
發佈了67 篇原創文章 · 獲贊 3 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章