1. Action在struts2的MVC中充当什么角色?
在struts2中,
model | view | controler |
---|---|---|
action | JSP | action、StrutsPrepareAndExecuteFilter |
struts2作为MVC框架,必须负责解析HTTP请求参数,并将其封装到Model对象,所以就必须有封装数据的方法。
2. 在struts2中获取请求参数
<1>属性驱动(Action本身作为model对象,通过成员setter封装)
(1)直接将action做为一个model,就可以得到请求参数。这种方式底层是通过反射进行实现的。
页面:<input type="text" name="username"><br/>
Action:
public class RegistAction extends ActionSupport{
private String username;
public void setUsername(String username){
this.username = username;
}
}
优点:这是多实例的,不存在线程问题,因为每一次请求都是一个新的action,没有共享成员属性值。
缺点:数据封装到Action属性中,不能将Action对象传递给业务层,所以需要再再定义Javabean,将Action的属性封装到javabean中。
(2)创建独立model对象,页面通过ognl表达式封装。
页面:<input type="text" name="user.username"><br/><!--基于ognl表达式的写法-->
Action:
public class RegistAction2 extend ActionSupport{
//在action中声明一个model
private User user;
public void setUser(User user){
this.user = user;
}
public User getUser() {
return user;
}
}
User:
//这个声明上必须提供get/set方法
private String username;
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
数据如何封装的?通过struts2中的interceptor进行了数据封装。
<interceptor name=”params”
class=”com.opensymphony.xwork2.interceptor.ParametersInterceptor” />
优点:简单,解决了第一种的方案的缺点。
缺点:在封装数据上需要用到ognl表达式,如果不使用struts2框架后,会导致页面奔溃,可移植性很差。
<2>模型驱动(推荐使用,经常在开发中使用)
实现步骤:
(1)让Action类实现ModelDriven<T>。
(2)重写getModel方法。
(3)在action中实例化一个model对象,让getModel方法返回这个model对象。
//(1)实现ModelDriven<T>
public class RegistAction3 extends ActionSupport implements ModelDriven<User>{
//(3)必须手动实例化。
private User user = new User();
//(2)重写getModel方法
public User getModel() {
//(3)返回model对象
return user;
}
}
优点:解决了属性驱动存在的不足点。
缺点:一次只能封装一个model对象。
struts2有很多围绕模型驱动的特性,比如说有个拦截器:
<interceptor name=”modelDriven”
class=”com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor” />为模型提供更多驱动。
3.模型驱动封装数据到集合中
<1>将数据封装到List集合。
页面:
username1:<input type="text" name="users[0].username"><br>
password1:<input type="password" name="users[0].password"><br>
username2:<input type="text" name="users[1].username"><br>
password2:<input type="password" name="users[1].password"><br>
action类:
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
<2>将数据封装到Map集合。
页面:
username1:<input type="text" name="map['a'].username"><br>
password1:<input type="password" name="map['a'].password"><br>
username2:<input type="text" name="map['b'].username"><br>
password2:<input type="password" name="map['b'].password"><br>
action类:
private Map<String, User> map;
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}