###Jsp+Servlet购物商城day04.3:订单模块Order实体设计失误。【Bean属性设计两大原则】-MyBeanUtils使用注意事项。
2017-09-14 12:35
731 查看
Order bean代码:
MyBeanUtils:
package cn.itcast.domain; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; public class Orders implements Serializable{ private String oid; // private Date orderTime; /*========#########====== ===属性名和字段名不一致。导致set get方法名和字段名不一致。 插入订单信息时,因为是SQL 参数是 传参数:Order对象getDate(); ====【插入 只需要SQL语句字段名和表字段对应即可,和属性get。set方法名称和字段名是否一致无关!!!。】 ====【查询 封装数据时,这里使用了工具类MyBeanUtils(封装了BeanUtils,对日期类型进行注册), 他会根据map字段名匹配对应的get方法,读取map数据,把map封装为bean:BeanUtils.populate(bean,map)。 】 ====这里,把ordertime 写成了date,插入订单成功。显示订单封装数据时,死活查不出来date和OrderItem的subtotal。 =====【找了一上午的错误,就是出不来!!】 ===subtotal是计算出来的,不用set方法赋值【插入值的时候】。于是我给注释掉了。。。 * ====######===但是查询Order,BeanUtils封装查询的map时,需要set方法封装数据。 * 所以,原则: * 【Bean的get set 方法即使一时没用到,全都加上。 * 不用管他,难保什么时候用到!!!】 public void setSubtotal(double subtotal) { this.subtotal = subtotal; } ========######=======总之: 【牢记bean属性设计 两大原则】: 《1》属性名和字段名 必须严格一致; 【即使属性名 不一致有时不会报错,但是大大减少出错的可能,检查错误也方便。 何况 后面学习 Struts2 必须要求一致,也能养成好习惯。】 《2》get set 方法 用不到的,bean 也全都给加上。===不要轻易删除。 ======熟练BeanUtils的使用注意事项:属性名和字段名 必须严格一致; * */ //private Date orderTime;//==###=getOrderTime()获取失败,只能getOrdertime()==(已测) private Date ordertime; private double total; private int state; //对着关系图写。sql语句找起来还是费点劲的。 private String address; private String name;//===不使用user表的username,因为收货人未必是下单的用户。 private String telephone; // private String uid ; private User user;//每个用户有自己的订单 //================#######===========【加深理解:Bean属性有 两种。业务需要,表字段映射】 //订单和订单项。1:n关系。所以Orders表里不需要添加 itemid属性。 //但是业务逻辑上: Orders 包含 多个OrderItem,Orders本就是用来封装OderItem的。 //(和分页 PageBean类似,封装数据,作用只不过是:方便页面取值) //所以:和【Cart封装CartItem一样,这里也要添加一个Map<Stirng pid,OderItem item> 的map 封装多个订单项。 】 //===所以说:这个map属性是 业务需要。其他属性是表字段映射。 //private LinkedHashMap<String,OrderItem> orderItems = new LinkedHashMap<String,OrderItem>(); private List<OrderItem> orderItems = new ArrayList<OrderItem>(); /* private List<OrderItem> orderItems;//teacher ===######=======为什么,CartItem用LinkedHashMap<String,CartItem>, 而OrderItem使用List<OrderItem>? (前面说过,哪种集合都可以实现,实现复杂度不同。如何选择集合,实现最简单的集合呢?)其实都差不多。 * */ /*public Collection<OrderItem> getOrderItems() { return orderItems.values();//===为了页面取值方便。 }*/ /*public Collection<OrderItem> getOrderItems() { return orderItems.values();//===date,subtotal取不到。 }*/ public List<OrderItem> getOrderItems() { return orderItems; } public void setOrderItems(List< OrderItem> orderItems) { this.orderItems = orderItems; } public Orders() { super(); } public String getOid() { return oid; } public void setOid(String oid) { this.oid = oid; } /*public Date getOrderTime() {//==getOrderTime()获取失败,只能getOrdertime() return ordertime; }*/ public Date getOrdertime() { return ordertime; } public void setOrdertime(Date ordertime) { this.ordertime = ordertime; } public double getTotal() { Collection<OrderItem> items = getOrderItems(); int total=0; for (OrderItem item : items) { total += item.getSubtotal(); } return total; } public void setTotal(double total) { this.total = total; } public int getState() { return state; } public void setState(int state) { this.state = state; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } /*@Override public String toString() { return "Orders [oid=" + oid + ", ordertime=" + ordertime + ", total=" + getTotal() + ", state=" + state + ", address=" + address + ", name=" + name + ", telephone=" + telephone + ", user=" + user + ", orderItems=" + orderItems + "]"; }*/ @Override public String toString() { return "Orders [oid=" + oid + ", ordertime=" + ordertime + ", total=" + total + ", state=" + state + ", address=" + address + ", name=" + name + ", telephone=" + telephone + "]"; } }
MyBeanUtils:
package cn.itcast.utils; import java.util.Date; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.converters.DateConverter; /* ======封装优化了BeanUtils类。 解决:BeanUtils封装 含有 Date 类型属性 的实体。封装不了Date类型。只可以封装String。 * */ public class MyBeanUtils { //====只是getObject去掉了Map泛型。 public static void setObject(Object obj, Map map) { try { DateConverter dc = new DateConverter(); dc.setPatterns(new String[]{"yyyy-MM-dd","yyyy/MM/dd"});// 设置要转换的字符串的格式 // 注册时间转换器,将某种格式的字符串转换成 Date 对象 //===BeanUtils底层本来就会 调用类型转换器。 //===(因为基本类型可以自动转换:String:"1"会自动转为数字)。===ConvertUtils ConvertUtils.register(dc, Date.class); BeanUtils.populate(obj, map); } catch (Exception e) { e.printStackTrace(); } } public static void getObject(Object obj, Map<String, String[]> map) { try { DateConverter dc = new DateConverter(); dc.setPatterns(new String[]{"yyyy-MM-dd","yyyy/MM/dd"});// 设置要转换的字符串的格式 // 注册时间转换器,将某种格式的字符串转换成 Date 对象 ConvertUtils.register(dc, Date.class); BeanUtils.populate(obj, map); } catch (Exception e) { e.printStackTrace(); } } public static <T>T getObj(Class<T> clazz, Map<String, String[]> map){ T t = null; try { t = clazz.getConstructor().newInstance(); BeanUtils.populate(t, map); } catch (Exception e) { e.printStackTrace(); } return t; } }
相关文章推荐
- ###Jsp+Servlet购物商城day04.2:订单模块难点总结。【购物商城最大的难点:【封装一个Order对象】查询封装三张表】
- ###Jsp+Servlet购物商城day04.1:显示订单。【重中之重:查询3张表信息,封装到Order】
- ###Jsp+Servlet购物商城day04.4:订单模块 【页面双层遍历】 显示本页所有订单。bootstrap分页下标。
- ###Jsp+Servlet购物商城day03.3:生成订单。【重中之重:保存多表信息】:使用事物,dao两个方法分别插入主表和从表信息。
- ###Jsp+Servlet购物商城day04.5:支付:订单支付遇到的问题总结。
- ###Jsp+Servlet购物商城day03.2:生成订单。重点笔记
- 在 JSP/Servlet 中使用 Bean 自动属性填充机制(含原理分析)
- jsp中servlet的一些注意事项
- DevExpress.XtraTreeList.TreeList的DataSource属性使用注意事项.
- 0001 jsp中使用javabean的两点注意事项
- TD的noWrap属性使用注意事项
- TD的noWrap属性使用注意事项
- Tomcat安装配置及注意事项,jsp,servlet,javabean建立方法及注意事项!
- 使用Struts1.x中的多模块功能时的注意事项
- 使用反射修改对象属性注意事项
- Content-Disposition的使用和注意事项 jsp
- 网页设计使用Iframe注意事项
- 购物网站3:订单实体类设计----配送方式--留言--订单--订单联系方式--订单配送信息--订单项--订单状态--支付方式
- TD的noWrap属性使用注意事项
- JSP学习——Properties属性文件的使用注意