Struts2获取表单数据
- Struts2获取表单数据
- 1、原始Servlet方法
- 2、属性封装
- 3、表达式封装
- 4、模型驱动封装
Struts2获取表单数据
在Struts2中获取表单数据或提交路径的参数值的方式有4种。如下:
- 原始Servlet方法
- 属性封装
- 表达式封装
- 模型驱动封装
1、原始Servlet方法
该方法一般用于提取url中的参数,如下:
控制器Action如下:
public class HelloUserAction extends ActionSupport {private static final long serialVersionUID = 1L;public String getMessage() {HttpServletRequest request = ServletActionContext.getRequest();String username = request.getParameter("username");String password = request.getParameter("password");String age = request.getParameter("age");System.out.println(username + "===>" + password + "===>" + age);return SUCCESS;}}
struts.xml中配置如下:
启动项目,访问a标签链接,页面跳转:
控制台输出:
参数接收成功。但是这种方式有不足之处,如下:
- 获取到的所有数据都是String类型的,需要进行数据类型转换。
- 获取数据的代码复杂、冗余。
2、属性封装
在Action控制器中定义成员变量,提供set和get方式。需注意的是,必须保证成员变量的名称和input表单中的name属性值或提交路径中的参数名称保持一致,否则无法接收。该方法的不足之处是获取数据的方式比较简单,但是会造成属性过多,Action控制器的代码冗余。
直接修改上面的HelloUserAction控制器,修改后如下:
public class HelloUserAction extends ActionSupport {private static final long serialVersionUID = 1L;private String username;private String password;private Integer age;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;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getMessage() {System.out.println(username + "===>" + password + "===>" + age);return SUCCESS;}}
控制器中的username,password,age分别对应url中的参数:
启动项目,点击a标签链接,控制台输出如下:
参数接收成功。下面将a标签链接中的参数改为form表单提交:
<form action="user/helloUser.action" method="post"><div><label>用户名:</label><input type="text" name="username" /></div><div><label>密码:</label><input type="password" name="password" /></div><div><label>性别:</label><input type="radio" name="sex" value="1" />男<input type="radio" name="sex" value="0" />女</div><div><label>年龄:</label><input type="text" name="age" /></div><div><input type="submit" value="提交" /></div></form>
修改后的HelloUserAction:
public class HelloUserAction extends ActionSupport {private static final long serialVersionUID = 1L;private String username;private String password;private Integer age;private Integer sex;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;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Integer getSex() {return sex;}public void setSex(Integer sex) {this.sex = sex;}public String getMessage() {System.out.println(username + "===>" + password + "===>" + age + "===>" + sex);return SUCCESS;}}
启动项目,填写表单提交:
控制台输出:
参数接收成功。
3、表达式封装
使用表达式封装的方式获取表单数据,步骤如下:
- 在控制器中定义类类型成员变量,并且提供get和set方法。
- 页面中使用对象.属性名。
修改页面中form表单的name属性值,如下:
<form action="user/helloUser.action" method="post"><div><label>用户名:</label><input type="text" name="user.username" /></div><div><label>密码:</label><input type="password" name="user.password" /></div><div><label>性别:</label><input type="radio" name="user.sex" value="1" />男<input type="radio" name="user.sex" value="0" />女</div><div><label>年龄:</label><input type="text" name="user.age" /></div><div><input type="submit" value="提交" /></div></form>
修改后的HelloUserAction:
public class HelloUserAction extends ActionSupport {private static final long serialVersionUID = 1L;private User user;public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String getMessage() {System.out.println(user.toString());return SUCCESS;}}
对应的User类:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private String username;private String password;private Integer sex;private Integer age;}
启动项目,填写表单后提交,控制台输出如下:
参数接收成功。
4、模型驱动封装
需要Action控制器实现ModelDriven接口,并且重写getModel()方法。
com.opensymphony.xwork2.ModelDriven接口源码如下:
只有一个getModel()方法,实现此接口需要重写这个方法。
修改后的HelloUserAction:
public class HelloUserAction extends ActionSupport implements ModelDriven<User> {private static final long serialVersionUID = 1L;private User user = new User();@Overridepublic User getModel() {return user;}public String getMessage() {System.out.println(user.toString());return SUCCESS;}}
修改后的form表单name属性:
启动项目,填写表单提交,控制台输出:
参数接收成功,模型驱动相当于将属性都做了一层封装。
注意:
- input标签的name属性值、提交路径的参数名称必须与实体类的属性相同,控制器不需要提供模型对象的set和get方法。
- 模型驱动封装与属性封装一起使用时,同名优先使用模型驱动封装,属性封装无法获取数据。
表达式封装和模型驱动封装的比较
- 共同点:使用表达式封装和模型驱动封装都可以把数据封装到实体类对象中。
- 不同点:使用模型驱动封装只能把数据封装到一个实体类对象里面。在一个Action里面不能使用模型驱动把数据封装到不同的实体类对象中。使用表达式封装可以把数据封装到不同的实体类对象中。