1. 程式人生 > >Struts2資料封裝詳解

Struts2資料封裝詳解

1 屬性驅動

1.1 提供set方法的方式

該方式需要在action類中提供相應的屬性並提供屬性的set方法,並且jsp頁面中的name屬性要與Action類中的屬性相對應,下面是對應的Action類和jsp頁面

  • Action類
package com.itykd.web.action;

import java.util.Date;

import com.itykd.domain.User;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{
    private String username;
    private String password;
    private Integer age;
    private Date birthday;
    private Double salary;
    public String executeBySetAttributeDriven() throws Exception{
    	System.out.println(username);
    	System.out.println(password);
    	System.out.println(age);
    	System.out.println(birthday);
    	System.out.println(salary);
    	User user = new User();
    	user.setName(name);
    	user.setPassword(password);
    	user.setAge(age);
    	user.setBirthday(birthday);
    	user.setSalary(salary);
    	return NONE;
    }
	public void setUsername(String name) {
		this.name = name;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public void setSalary(Double salary) {
		this.salary = salary;
	}
    
}
  •  jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h3>屬性驅動:提供set方法的方式</h3>
    <form action="${pageContext.request.contextPath}/userAction_executeBySetAttributeDriven" method="post">
         使用者名稱:<input type="text" name="username"/><br/>
               密碼:<input type="password" name="password"/><br/>
               年齡:<input type="text" name="age"/><br/>
               生日:<input type="text" name="birthday"/><br/>
               薪資:<input type="text" name="salary"/><br/>
      <input type="submit" value="提交"/>
    </form>
</body>
</html>

 

1.2 頁面表示式的方式 

提供一個User的成員,並提供該成員的get和set方法;且jsp頁面的name屬性要使用“例項物件名.物件的成員名”,這裡jsp頁面中的表單中要使用“user.username

  • Action類
package com.itykd.web.action;

import com.itykd.domain.User;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{
	private User user;
	public String executeByPageExpression() {
		System.out.println(user);
		return NONE;
		
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
}
  • jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h3>屬性驅動-頁面中提供表示式的方式</h3>
    <form action="${pageContext.request.contextPath }/userAction_executeByPageExpression" method="post">
               使用者名稱:<input type="text" name="user.username"/><br/>
               密碼:<input type="password" name="user.password"/><br/>
               年齡:<input type="text" name="user.age"/><br/>
               生日:<input type="text" name="user.birthday"/><br/>
               薪資:<input type="text" name="user.salary"/><br/>
      <input type="submit" value="提交"/> 
    </form>
</body>
</html>

2 模型驅動的方式(最常用)

模型驅動的方式要實現ModelDriven<T>介面,並重寫其getModel方法;

  • Action類
package com.itykd.web.action;

import com.itykd.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class UserAction extends ActionSupport implements ModelDriven<User>{
	private User user = new User();

	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
	public String excuteByModelDriven() {
		System.out.println(user);
		
		return NONE;
	}
  • jsp頁面
     <h3>模型驅動方式</h3>
    <form action="${pageContext.request.contextPath }/userAction_excuteByModelDriven" method="post">
               使用者名稱:<input type="text" name="username"/><br/>
               密碼:<input type="password" name="password"/><br/>
               年齡:<input type="text" name="age"/><br/>
               生日:<input type="text" name="birthday"/><br/>
               薪資:<input type="text" name="salary"/><br/>
      <input type="submit" value="提交"/> 
    </form>

模型驅動的缺點:只能同時在一個物件中封裝資料,而使用頁面表示式的方法可以同時向多個物件中同時封裝資料

3 Struts2為什麼能進行資料封裝

 

Struts2能夠提供資料封裝是因為它在經過核心過濾器後執行了一組攔截器,modelDriven攔截器執行的是模型驅動封裝引數,而params攔截器則封裝了屬性驅動的引數conversionError攔截器完成了資料的轉換,validation攔截器負責資料校驗

4 資料型別封裝錯誤

比如我們提交表單資料時,年齡我們設定的型別為Integer,但是輸入表單的時候我們在年齡上輸入字串:aaa,就會報出input檢視錯誤,這時候我們需要在action中result標籤中配置input檢視;

5 複雜型別資料的封裝

5.1 封裝資料到List集合中

  • Action類
package com.itykd.web.action;

import java.util.List;

import com.itykd.domain.Product;
import com.opensymphony.xwork2.ActionSupport;

public class ProductAction extends ActionSupport {
    private List<Product> productList;


	public List<Product> getProductList() {
		return productList;
	}


	public void setProductList(List<Product> productList) {
		this.productList = productList;
	}


	public String execute() throws Exception{
		for(Product product : productList)
			System.out.println(product);
		return NONE;
	} 
}
  • jsp頁面
<body>
    <h3>封裝資料到List集合中</h3>
    <form action="${pageContext.request.contextPath }/productAction">
                商品名稱:<input type="text" name="productList[0].name"/><br/>
                商品價格:<input type="text" name="productList[0].price"/><br/>
                商品名稱:<input type="text" name="productList[1].name"/><br/>
                商品價格:<input type="text" name="productList[1].price"/><br/>
                商品名稱:<input type="text" name="productList[2].name"/><br/>
                商品價格:<input type="text" name="productList[2].price"/><br/>
      <input type="submit" value="提交"/>    
    </form>
</body>

5.2 封裝資料到Map集合中

  • Action類
package com.itykd.web.action;

import java.util.Map;

import com.itykd.domain.Product;
import com.opensymphony.xwork2.ActionSupport;


public class ProductAction2 extends ActionSupport {
    private Map<String,Product> map;

	public Map<String, Product> getMap() {
		return map;
	}

	public void setMap(Map<String, Product> map) {
		this.map = map;
	}
	@Override
	public String execute() throws Exception {
		for (String key : map.keySet()) {
			Product product = map.get(key);
			System.out.println(key+" "+product);
		}
		return NONE;
	}
}
  • jsp頁面
<body>
    <h3>封裝資料到Map集合中</h3>
    <form action="${pageContext.request.contextPath }/productAction2">
                商品名稱:<input type="text" name="map['xxx'].name"/><br/>
                商品價格:<input type="text" name="map['xxx'].price"/><br/>
                商品名稱:<input type="text" name="map['yyy'].name"/><br/>
                商品價格:<input type="text" name="map['yyy'].price"/><br/>
                商品名稱:<input type="text" name="map['zzz'].name"/><br/>
                商品價格:<input type="text" name="map['zzz'].price"/><br/>
      <input type="submit" value="提交"/>    
    </form>
</body>