其实Struts2的action类也提供原生servlet的API,但这样也就失去了使用该框架的意义。接下来我们介绍三种action类获取参数的方式。
一、属性驱动方式
源码:
/*
* 参数获取方式之属性驱动方式
*/
public class TestAction extends ActionSupport {
//设置与表单项相对应的属性,并设置set,get方法
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
System.out.println("name:" + name + ",password:" + password);
return SUCCESS;
}
}
该方式中,拥有着getter和setter的属性,对应着传值参数中的key,获取value,方便理解,但是当传值参数过多时,代码就会巨增,充斥在业务逻辑代码中,故,不推荐。
二、模型驱动方式
源码:
/*
* 参数获取方法之模型驱动方式
*/
public class TestAction3 extends ActionSupport implements ModelDriven<User>{
/*
* (1)继承自 ModelDriven<User>借口
* (2)创建User对象。
* (3)实现ModelDriven.getModel()方法并返回该对象
*/
private User user = new User();
@Override
public String execute() throws Exception {
System.out.println(user);
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
该方式,实现了ModelDriven接口,并且创建一个实体类对象,重写getModel()方法,将其返回,该实体类中封装有传值参数的key属性,并写有getter、setter方法,前台页面无需多做修改,推荐。
三、对象驱动方式
源码:
/*
* 获取参数方式之对象驱动方式
*/
public class TestAction2 extends ActionSupport {
/*
* 和属性驱动方式没有什么不同,只不过我们这里的是对象而已
* 还有一点不同体现在表单项控件的属性名上name=“对象名.属性名”
*/
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);
return SUCCESS;
}
}
前台源码:
<form action="${pageContext.request.contextPath }/TestAction2.action" method="post">
用户名:<input name="user.name" type="text" /><br/>
密码:<input name="user.password" type="password" /><br/>
<input type="submit" value="登录">
</form>
同样是实现属性的实体类封装,对象驱动方式,虽说无需继承任何接口了,但是,前台代码需要改成实体类属性名.传值key,这样使得前台代码变得复杂不易理解,故不推荐。