Struts2获取表单数据

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里面不能使用模型驱动把数据封装到不同的实体类对象中。使用表达式封装可以把数据封装到不同的实体类对象中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值