我们在使用Struts2时,服务器端接收客户端数据方式有很多种,我们推荐使用Action类实现ModelDriven接口的方式,因为它有很多便利之处!
我们可以根据Action属性的不同将它分为两类:Field-Driven(属性驱动)和Model-Driven(模型驱动)Action。
一、Field-Driven(属性驱动)Action,Action拥有自己的属性,这些属性一般是Java的基本类型。表单字段直接和Action的属性对应。
二、实现了modelDriven接口可以在action中直接获得例如User对象,它会将Object GetModel()取得的User放到ValueStack中。可以理解为将这个User的属性追加到Action中。它主要是作用是实现类似Struts的FormBean功能。在struts2中,提供了一种直接使用领域对象的方式,就是让action实现com.opensymphony.xwork2.ModelDriven接口,ModelDriven让你可以直接操作应用程序中的领域对象,允许你在视图层和业务层使用相同的对象。
ModelDriven接口只有一个方法 :
public Object getModel(){return null;
}
该方法返回一个用于接收用户输入数据的对象模型,在这个模型对象中的属性可以直接通过(属性名)username来访问,而不需要使用(对象名.属性名)user.username这种格式来访问了,在action也不需要对对象提供getter和setter方法了,但是必须要在action中对模型实例化(new)。
视图层代码:
1、上传表单数据(请求)
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username">
密 码:<input type="password" name="password">
<br>
爱好1:<input type="text" name="hobbyList[0]">
爱好2:<input type="text" name="hobbyList[1]">
<br>
<input type="submit" value="登录">
</form>
2、数据处理后输出(响应)
<body>
<h2>登陆成功!</h2>
<hr>
<h4>欢迎您${user.username}!</h4><br>
<h4>您的爱好是1、${user.hobbyList[0]}2、${user.hobbyList[1]}</h4>
</body>
Model代码:
public class User {
private String username;
private String password;
private List<String> hobbyList;
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 List<String> getHobbyList() {
return hobbyList;
}
public void setHobbyList(List<String> hobbyList) {
this.hobbyList = hobbyList;
}
}
Action代码:(处理数据)
public class LoginAction extends ActionSupport implements ModelDriven<User>{
/**
*
*/
private static final long serialVersionUID = 1L;
//此处必须实例化
private User user = new User();
public String login(){
//调用ServletActionContext的方法获得servlet API
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("user", user);
System.out.println("调用action!" + "\n参数传递:姓名:" + user.getUsername() + "爱好:" + user.getHobbyList().get(0) + user.getHobbyList().get(1));
return SUCCESS;
}
//实现接口中的方法,返回在开始处实例化的Model对象
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}