Struts2的数据封装
在很多实际开发中,页面提交请求参数到Action,在Action中接收参数并且对请求参数需要进行数据的封装,封装到一个pojo类中,然后将pojo类传递给业务层,这些操作,struts2已经帮我们封装好了,并且提供了两大类的封装方式:一类被称为属性驱动,一类被称为模型驱动
属性驱动
属性驱动分为两种,一种是只需提供属性的set方法,另一种是封装到pojo对象中。
提供属性的set方法
- 编写前端form表单
<body>
<form action="${pageContext.request.contextPath }/paramAction_get" method="post">
用户名:<input type="text" name="username"></br>
密码:<input type="text" name="password"></br>
年龄:<input type="text" name="age"></br>
<input type="submit" value="提交">
</form>
</body>
- 编写获得参数的Action类和方法
package com.zillion.action;
import com.opensymphony.xwork2.ActionSupport;
public class ParamAction extends ActionSupport{
//提供与form表单name属性一样值的域和set方法,struts2会自动注入到该域中
private String username;
private String password;
private int age;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(int age) {
this.age = age;
}
//打印参数并跳转
public String get() throws Exception {
System.out.println(username+" "+password+" "+age);
return SUCCESS;
}
}
- 配置Action
<action name="paramAction_*" class="com.zillion.action.ParamAction" method="{1}">
<result name="success">/success.jsp</result>
</action>
- 打印结果
提供pojo对象的方式
提供了一个pojo的类,类中的属性必须与表单name的属性值一一对应(对应指的是对象名.属性名),然后在Action类中,添加该pojo的域对象和get和set方法即可
- 提供一个pojo类
package com.zillion.action;
public class User {
private String username;
private String password;
private int 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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password
+ ", age=" + age + "]";
}
}
- 编写前端form表单
<body>
<form action="${pageContext.request.contextPath }/paramAction_get" method="post">
<!-- 注意:这里的name试用的是OGNL表达式的方式——对象名.属性名 -->
用户名:<input type="text" name="user.username"></br>
密码:<input type="text" name="user.password"></br>
年龄:<input type="text" name="user.age"></br>
<input type="submit" value="提交">
</form>
</body>
- 编写Action类
注意:这里的User对象属性,一定要添加get方法,如果没有get方法,struts2的底层就无法获得到该对象,在user对象中就只会有第一个属性,其他的属性注入不进去。
package com.zillion.action;
import com.opensymphony.xwork2.ActionSupport;
public class ParamAction extends ActionSupport{
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String get() throws Exception {
System.out.println(user);
return SUCCESS;
}
}
配置Action
结果
添加了get方法的结果
没有添加get方法的结果
模型驱动
在struts2中,Action处理请求参数还有另外一种方式,就是模型驱动(ModelDriven),通过实现ModelDriven接口来接收请求的参数,并且需要重写getModel()方法,这个方法的返回值就是Action所使用的数据模型对象。模型驱动的方式通过pojo模型进行数据传递,只需要普通的pojo类,就可以充当模型部分,并且pojo类中封装的属性与表单的name属性值一一对应。
- 前端from表单
<body>
<form action="${pageContext.request.contextPath }/paramAction_get" method="post">
用户名:<input type="text" name="username"></br>
密码:<input type="text" name="password"></br>
年龄:<input type="text" name="age"></br>
<input type="submit" value="提交">
</form>
</body>
提供User类
编写Action类
package com.zillion.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
// 实现ModelDriven接口,泛型填写需要封装到的pojo类
public class ParamAction extends ActionSupport implements ModelDriven<User>{
//提供一个user对象
private User user = new User();
//返回该对象,即可将参数封装到该对象中
@Override
public User getModel() {
return user;
}
public String get() throws Exception {
System.out.println(user);
return SUCCESS;
}
}
配置Action类
结果
结论
如果前端jsp页面的表单数据比较多,推荐采用实现ModelDriven接口,因为Struts2内部的很多结果都是围绕模型驱动来设计的;如果页面中有多个对象的封装,就需要属性驱动的对象封装方式;如果页面中仅仅传递了单个参数,则使用简单的提供set方法。