一开始敲网上商城的时候,对于数据的传递方式我是很惊艳了一把的,感觉特别高大上,就感觉,竟然不用像.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; } }