我们在使用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;
	}	
}





本文转载:CSDN博客