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();
@Override
public User getModel() {
return user;
}
public String getMessage() {
System.out.println(user.toString());
return SUCCESS;
}
}
修改后的form表单name属性:
启动项目,填写表单提交,控制台输出:
参数接收成功,模型驱动相当于将属性都做了一层封装。
注意:
- input标签的name属性值、提交路径的参数名称必须与实体类的属性相同,控制器不需要提供模型对象的set和get方法。
- 模型驱动封装与属性封装一起使用时,同名优先使用模型驱动封装,属性封装无法获取数据。
表达式封装和模型驱动封装的比较
- 共同点:使用表达式封装和模型驱动封装都可以把数据封装到实体类对象中。
- 不同点:使用模型驱动封装只能把数据封装到一个实体类对象里面。在一个Action里面不能使用模型驱动把数据封装到不同的实体类对象中。使用表达式封装可以把数据封装到不同的实体类对象中。