[java]struts2 模型驅動
一開始敲網上商城的時候,對於資料的傳遞方式我是很驚豔了一把的,感覺特別高大上,就感覺,竟然不用像.net一樣取誰的值,給誰賦值這樣,只要需要用的時候,簡單的get一下就ok了,簡直高大上啊。
然後發現,這是struts2的模型驅動,下面,就來和我一起學習一下struts2吧。
何為struts2?
Apache Struts 2是一個用於開發Java EE網路應用程式的開源Web應用框架。它利用並擴充套件了Java Servlet API,鼓勵開發者採用MVC架構。
Struts2的優點
POJO表單和POJO動作 - Struts2的Struts框架已經擺脫了動作表單組成部分, Struts2可以使用任何POJO接收的形式輸入。同樣現在可以看到任何POJO作為一個Action類。
標籤支援 - Struts2中,提高了表單標籤和新標籤允許開發人員編寫更少的程式碼。
AJAX 支援- Struts2中已確認由Web2.0技術接管,並整合到產品中,通過建立AJAX標籤,功能非常相似的標準Struts2 標籤AJAX支援。
易於整合 - Struts2 整合各種整合與其他框架如Spring,Tiles 和SiteMesh是現在更容易。
模板支援 - 支援生成使用模板。
外掛支援 - 可以提高核心Struts2的特性,並增強使用外掛。大量的外掛可供Struts2。
效能分析 - Struts2的分析,除錯和分析應用程式提供了整合。除此之外,Struts還提供了整合的內建除錯工具除錯。
易於修改標籤 - Struts2的標籤標註,可以調整使用Freemarker的模板。這並不需要JSP或Java知識。基本HTML,XML和CSS知識是足夠修改標籤。
提倡少配置 - Struts2 促進較少的配置的幫助下,使用預設的各種設定值。不必配置的東西,除非它不符
Struts2的預設設定。
檢視技術: - Struts2中有一個很大的支援多個檢視選項 (JSP, Freemarker, Velocity 和 XSLT)
以上只是Struts2的十大功能,這使得它是企業公司級應用框架。
什麼是模型驅動?
struts2與struts很大的不同點在於,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在獲取客戶端提交的資料資訊的時候需要使用HttpServletRequest的getParameter()方法,並且還需要進行必要的資料型別轉換。如何客戶端提交的資料量大的時候,我們則需要寫很多的getParameter方法。這樣程式碼量就相應的增加不少。但是struts2為我們提供了屬性驅動和模型驅動,它不需要我們寫很多的獲取值的方法。而只需要我們在Action中定義相應的getter方法,在介面上以Action中的變數名作為表單元素的name屬性值即可。
屬性驅動和模型驅動的異同?
1.屬性驅動
對於屬性驅動,我們需要在Action中定義與表單元素對應的所有的屬性,因而在Action中會出現很多的getter和setter方法
2.模型驅動
對於模型驅動,使用的Action物件需要實現ModelDriven介面並給定所需要的型別.而在Action中我們只需要定義一個封裝所有資料資訊的javabean
3.屬性和模型驅動的相同點
當我們使用屬性驅動和模型驅動的時候,必須將表單的元素中的name屬性值與我們定義接收資料資訊的變數名對應起來。
驅動模型的使用
在使用方面,驅動模型就是將所有的屬性都封裝在javabean裡面,然後Action除了繼承ActionSupport還要實現ModelDriven介面,該介面定義了一個getModel()方法,返回經過賦值的模型例項。
例項:
Order.java
package cn.itcast.shop.order.vo;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import cn.itcast.shop.user.vo.User;
/**
* 訂單模組的實體類
* @author glntg
*
*/
public class Order {
private Integer oid;
private Double total;
private Date ordertime;
private Integer state;
private String name;
private String addr;
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
public Double getTotal() {
return total;
}
public void setTotal(Double total) {
this.total = total;
}
public Date getOrdertime() {
return ordertime;
}
public void setOrdertime(Date ordertime) {
this.ordertime = ordertime;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Set<OrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(Set<OrderItem> orderItems) {
this.orderItems = orderItems;
}
private String phone;
//訂單所屬的使用者
private User user;
//訂單中所屬的多個訂單項
private Set<OrderItem> orderItems=new HashSet<OrderItem>();
}
OrderAction.java
package cn.itcast.shop.order.action;
import java.text.SimpleDateFormat;
import java.util.Date;
import cn.itcast.shop.order.vo.Order;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* 訂單管理Action
* @author glntg
*
*/
public class OrderAction extends ActionSupport implements ModelDriven<Order>{
//模型驅動使用的物件
private Order order=new Order();
//注入OrderServiec
private OrderService orderService;
public void setOrderService(OrderService orderService) {
this.orderService = orderService;
}
public Order getModel() {
return order;
}
}