Struts2資料封裝詳解
阿新 • • 發佈:2018-12-24
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>