十一、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; } } | 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号