十一、Struts2封装请求参数的方式
十一、Struts2封裝請求參數的方式
方式一、Action 本身作為model對象,通過成員setter封裝(一個名字為params的攔截器干的)
注意:表單中的名稱要和動作類中的名稱一致(這是必須的)
表單代碼:
<br /> ---------------封裝請求參數到Action中-----------<br /> ???? ????<form action="${pageContext.request.contextPath }/paramAction1.action" ????????method="post"> ????????用戶名:<input type="text" name="username"/> <br/> ????????密碼: <input type="password" name="password"/> <br/> ????????<input type="submit" value="登錄">???????? ????</form> |
?
Struts.xml文件中的代碼:
<package name="p1" extends="struts-default"> ????????<action name="paramAction" class="com.itheima.action.ParamAction1" ????????????method="execute"> ???????????? ????????</action> ????</package> |
?
動作類中的代碼:
//用動作類封裝數據:定義字段名。提供setter方法,setter屬性名稱和表單的輸入域中的名稱保持一致 public class ParamAction1 extends ActionSupport{ ????private String username; ????private String password; ???? ????public void setUsername(String username) { ????????this.username = username; ????} ???? ????public void setPassword(String password) { ????????this.password = password; ????} ???? ????@Override ????public String execute() throws Exception { ????????System.out.println(username + ":" + password); ????????//這里可以調用service層的方法保存對象:save(this) ????????return NONE; ????} } |
?
方式二:動作類和模型分開
表單代碼:
<br /> ------封裝請求參數到模型對象中,Action和模型分開------<br /> ???? ????<form action="${pageContext.request.contextPath }/paramAction2.action" ????????method="post"> ????????用戶名:<input type="text" name="user.username"/> <br/> ????????密碼: <input type="password" name="user.password"/> <br/> ????????<input type="submit" value="登錄">???????? ????</form> |
?
-------------
動作類代碼:
//用動作類封裝數據:定義字段名。提供setter方法,setter屬性名稱和表單的輸入域中的名稱保持一致 public class ParamAction2 extends ActionSupport { ????private User user; ? ????public User getUser() { ????????return user; ????} ? ????public void setUser(User user) { ????????this.user = user; ????} ? ????@Override ????public String execute() throws Exception { ????????System.out.println(user); ????????// 這里可以調用service層的方法保存對象:save(user) ????????return NONE; ????} } |
?
------------
實體類:User.java
//實體類: public class User implements Serializable { ????private String username; ????private String password; ? ????public String getUsername() { ????????return username; ????} ? ????public void setUsername(String username) { ????????this.username = username; ????} ? ????public String getPassword() { ????????return password; ????} ? ????public void setPassword(String password) { ????????this.password = password; ????} ? ????@Override ????public String toString() { ????????return "User [username=" + username + ", password=" + password + "]"; ????} } |
?
方式三:模型驅動(面試)
表單代碼:
<br/>----封裝請求參數到模型對象中:Action和模型分開。模型驅動------<br/> ???? ????<form action="${pageContext.request.contextPath }/paramAction3.action" ????????method="post"> ????????用戶名:<input type="text" name="username"/> <br/> ????????密碼: <input type="password" name="password"/> <br/> ????????<input type="submit" value="登錄">???????? ????</form> |
?
動作類代碼:
//動作類和實體類分開 public class ParamAction3 extends ActionSupport implements ModelDriven<User> { ????// 此處必須創建一個對象 ????private User user = new User();; ? ????@Override ????public String execute() throws Exception { ????????System.out.println(user); ????????// 這里可以調用service層的方法保存對象:save(user) ????????return NONE; ????} ???? ????@Override ????public User getModel() { ????????//這里需要返回一個對象 ????????return user; ????} } |
?
注:模型驅動實際上是由一個攔截器來做的。modelDriven攔截器來做。把getModel方法返回的對象,壓入一個叫做ValueStack的棧頂。struts框架就會根據表單的name屬性,調用對應棧頂對象的setter方法,從而把請求參數封裝進來。
?
封裝數據到集合類型Collection中:
表單代碼:
<body> ????<br/>-----封裝請求參數到集合中:使用場景,批量添加-----<br/> ????<form action="${pageContext.request.contextPath }/paramAction4" method="post"> ????????用戶名:<input type="text" name="users[0].username"/> ????????密碼:<input type="password" name="user[0].password"/><br/> ????????用戶名:<input type="text" name="users[1].username"/> ????????密碼:<input type="password" name="user[1].password"/><br/> ????????用戶名:<input type="text" name="users[2].username"/> ????????密碼:<input type="password" name="user[2].password"/><br/> ????????<input type="submit" value="添加"> ????</form> </body> |
?
動作類代碼:
//數據封裝到集合中 public class ParamAction4 extends ActionSupport { ????// 定義一個集合 ????private Collection<User> users; ? ????public Collection<User> getUsers() { ????????return users; ????} ? ????// 通過該方法將對象注入到集合中,不用顯示的添加對象到集合中 ????public void setUsers(Collection<User> users) { ????????this.users = users; ????} ? ????public String execute() throws Exception { ????????for (User user : users) { ????????????System.out.println(user); ????????} ????????return NONE; ????} } |
?
封裝數據到Map中
表單代碼:
<br/>-----封裝請求參數到Map中:使用場景,批量添加-----<br/> ????<form action="${pageContext.request.contextPath }/paramAction5" method="post"> ????????用戶名:<input type="text" name="users.u1.username"/> ????????密碼:<input type="password" name="users.u1.password"/><br/> ????????用戶名:<input type="text" name="users['u2'].username"/> ????????密碼:<input type="password" name="user['u2'].password"/><br/> ????????<input type="submit" value="添加"> ????</form> |
?
動作類代碼:
//數據封裝到集合中 public class ParamAction5 extends ActionSupport { ????// 定義一個Map集合 ????private Map<String, User> users; ? ????// 提供相應的setter和getter方法 ????public Map<String, User> getUsers() { ????????return users; ????} ? ????public void setUsers(Map<String, User> users) { ????????this.users = users; ????} ? ????@Override ????public String execute() throws Exception { ????????for (Map.Entry<String, User> me : users.entrySet()) { ????????????System.out.println(me.getKey() + "=" + me.getValue()); ????????} ????????return NONE; ????} } |
?
轉載于:https://www.cnblogs.com/Prozhu/p/5886419.html
總結
以上是生活随笔為你收集整理的十一、Struts2封装请求参数的方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac os系统使用Visual Stu
- 下一篇: java合集框架第一天