這裏就談談struts如何從請求中取值。
我介紹三種方式:
三種取值方式:
1,使用默認的action的傳遞方式。
2,自定義一個vo,在action中使用這個vo
3,使用ModelDriven的方式。
一、使用默認的action的傳遞方式
如果我們的請求裏面帶有兩個參數userName和passWord的話,我們只需要在Action裏有這兩個私有屬性就可以了。
請看我的Action:
- package study.getValue;
- import com.opensymphony.xwork2.Action;
- /**
- * 在Action中定義請求裏面傳過來的值,
- * 並且定義所有的Setter和Getter
- * 這樣可以直接在功能方法裏面直接使用這些值。
- * @author arne3166
- * @version [0100, 2010-9-30]
- */
- public class LoginAction
- {
- private String userName;//頁面裏面的userName
- private String passWord;//頁面裏面的passWord
- //必須的setter和getter方法
- public String getUserName();
- public void setUserName(String userName);
- public String getPassWord();
- public void setPassWord(String passWord);
- //業務邏輯
- public String execute()
- {
- if (null!= userName && null != passWord
- && userName.equals("arne3166") && passWord.equals("111111"))
- {
- return Action.SUCCESS;
- }
- else
- {
- return Action.ERROR;
- }
- }
- }
複製代碼在struts .xml裏面的配置
- <action name="loginput" >
- <result>/page/getValue/login_input.jsp</result>
- </action>
- <action name="login" class="study.getValue.LoginAction">
- <result name="success">/page/getValue/success.jsp</result>
- <result name="error">/page/getValue/fail.jsp</result>
- </action>
複製代碼看jsp是怎麼寫的:
- <form action="login.action"><!-- name="userName" 和 name="passWord"同Action裏面的私有屬性對上 -->
- 用戶名:<input name="userName" type="text"/>用戶密碼<input name="passWord" type="password"/>
- <input type="submit" value="提交"/>
- </form>
二、自定義一個vo,在action中使用這個vo
區別於以上的方式,Struts2中允許將頁面的值封裝起來,放到一個ValueObject(VO)中。就比如上面的例子中的userName和passWord,完全可以放到一個User類中。這樣做的好處是,避免如果Action中如果有好多這樣的值的話,太多的setter和getter會使得Action看起來比較臃腫的毛病。
看看我們是怎麼做的
首先定義User
Java代碼
- package study.getValue.vo;
- public class User
- {
- //頁面中的值的封裝
- private String userName;
- private String passWord;
- //所有的setter和getter
- public String getUserName();
- public void setUserName(String userName);
- public String getPassWord();
- public void setPassWord(String passWord);
- }
再看Action被簡化成了什麼樣子
Java代碼
- package study.getValue;
- import com.opensymphony.xwork2.Action;
- import study.getValue.vo.User;
- /**
- *
- * 在Action中定義請求裏面傳過來Vo,
- * 並且定義VO的Setter和Getter
- * 使用頁面參數的時候像使用Vo的屬性一樣。
- * @author arne3166
- * @version [0100, 2010-9-30]
- */
- public class VoLoginAction
- {
- //將vo作爲私有屬性
- private User u;
- //setter和getter必不可少
- public User getU();
- public void setU(User u);
- public String execute()
- {
- String userName = u.getUserName();
- String passWord = u.getPassWord();
- if (null!= userName && null != passWord
- && userName.equals("arne3166") && passWord.equals("111111"))
- {
- return Action.SUCCESS;
- }
- else
- {
- return Action.ERROR;
- }
- }
- }
這樣做了,頁面任然用原來的當然是不行的,注意到Action中的user對象的引用是u,那麼,在頁面裏面userName也需要修改成u.userName,passWord也應當修改成u.passWord
Html代碼
- <!--login_input_vo.jsp name="u.passWord"和name="u.passWord"是對Action中User對象進行映射 -->
- <form action="loginvo.action">
- 用戶名:<input name="u.userName" type="text"/>用戶密碼<input name="u.passWord" type="password"/>
- <input type="submit" value="提交"/>
- </form>
再看看配置文件
Xml代碼
- <action name="loginputvo" >
- <result>/page/getValue/login_input_vo.jsp</result>
- </action>
- <action name="loginvo" class="study.getValue.VoLoginAction">
- <result name="success">/page/getValue/success.jsp</result>
- <result name="error">/page/getValue/fail.jsp</result>
- </action>
- <action name="loginputvo" >
- <result>/page/getValue/login_input_vo.jsp</result>
- </action>
- <action name="loginvo" class="study.getValue.VoLoginAction">
- <result name="success">/page/getValue/success.jsp</result>
- <result name="error">/page/getValue/fail.jsp</result>
- </action> 成功失敗後的頁面沒有什麼好修改的。
三、使用模型驅動(ModelDriven)的方式。
上面的例子中在頁面要寫上u.userName,按照習慣前面的“u.”是不是可以不要呢,同時又能保持第二種方式裏Action的“純潔”,Struts2的模型驅動就可以做到。
從實現方式上面需要Action實現模型驅動的接口,先來看Action是怎麼寫的:
- package study.getValue;
- import study.getValue.vo.User;
- import com.opensymphony.xwork2.Action;
- import com.opensymphony.xwork2.ModelDriven;
- /**
- *
- * Action實現ModelDriven接口。
- * 在Action裏定義一個私有變量User,這個User應該被new出來,
- * 不過裏面的值是Strus來設置的
- * 不需要Setter和Getter方法
- * @author arne3166
- * @version [0100, 2010-9-30]
- */
- public class ModelDrivenLoginAction implements ModelDriven<User>
- {
- //需要將user對象new出來;
- private User u = new User();
- //實現的接口方法
- @Override
- public User getModel()
- {
- return u;
- }
- public String execute()
- {
- String userName = u.getUserName();
- String passWord = u.getPassWord();
- if (null!= userName && null != passWord
- && userName.equals("arne3166") && passWord.equals("111111"))
- {
- return Action.SUCCESS;
- }
- else
- {
- return Action.ERROR;
- }
- }
- }
下面回到Sturts的配置文件
Xml代碼
- <action name="loginputmodeldriven" >
- <result>/page/getValue/login_input_modeldriven.jsp</result>
- </action>
- <action name="loginmodeldriven" class="study.getValue.ModelDrivenLoginAction">
- <result name="success">/page/getValue/success.jsp</result>
- <result name="error">/page/getValue/fail.jsp</result>
- </action>
- <action name="loginputmodeldriven" >
- <result>/page/getValue/login_input_modeldriven.jsp</result>
- </action>
- <action name="loginmodeldriven" class="study.getValue.ModelDrivenLoginAction">
- <result name="success">/page/getValue/success.jsp</result>
- <result name="error">/page/getValue/fail.jsp</result>
- </action>
再看錶單的頁面
- <!--又回到原始簡單的樣式了O(∩_∩)O-->
- <form action="loginmodeldriven.action">
- 用戶名:<input name="userName" type="text"/>用戶密碼<input name="passWord" type="password"/>
- <input type="submit" value="提交"/>
- </form>
- <!--又回到原始簡單的樣式了O(∩_∩)O-->
- <form action="loginmodeldriven.action">
- 用戶名:<input name="userName" type="text"/>用戶密碼<input name="passWord" type="password"/>
- <input type="submit" value="提交"/>
- </form>
這裏注意一下,
這是必須的
//需要將user對象new出來;
private User u = new User();
如果不將user new出來的話,會在頁面給你一個異常吃吃
- Struts Problem Report
- Struts has detected an unhandled exception:
- Messages:
- File: study/getValue/ModelDrivenLoginAction.java
- Line number: 23
- --------------------------------------------------------------------------------
- Stacktraces
- java.lang.NullPointerException
- study.getValue.ModelDrivenLoginAction.execute(ModelDrivenLoginAction.java:23)
- sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
- sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
- java.lang.reflect.Method.invoke(Method.java:597)