*14.Estore_注解1
想做到只要在真正需要事务处理的时候,再调用事务处理,不需要就不用控制。
自定义注解
@interface 定义一个注解
定义出来的注解可以被元注解修饰,确定其基本的特性:
@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留的域
RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释
RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解. 这是默认值
RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注释
@Target:指定注解用于修饰类的哪个成员
@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.
@Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解
注解中还可以包含属性:
属性的定义类似于在接口中定义一个方法
String name();
String addr() default "xxx";
如果注解中只有一个属性并且名字为value,则在定义注解时可以直接写值而省略value= 部分
反射注解:通过反射注解,来确定某个类方法属性上是否有注解从而控制程序的流转.
*15.Estore_注解2_事务管理改造2
还有问题:
还有BUG!
还需要做个代理:
--希望在Service和dao中都不用操心事务,是否管理事务只需要在Service接口中的方法上写或不写 @Tran就可以控制了
ThreadLocal + 注解 实现事务管理
工厂类+动态代理 实现面向切面编程
利用动态代理,使dao中不需要区分是否开启过事务
*16.Estore_订单列表
订单查询
在主页中 提供 订单查询
OrderListServlet 获取当前客户的用户号,调用Service中查询指定用户订单的方法,查询出这个用户所有订单,存入request域,带到页面显示
OrderService 提供根据用户id查询订单的方法
OrderDao 提供根据用户id查询订单的方法
orderList.jsp 展示所有订单
订单号 ok
用户名称 --- 用户表中查
订单金额 ok
支付状态 ok
收货地址 ok
下单时间 ok
------------------------------------------------------
商品名称 购买数量 单价 总金额 --------------------------------订单项 表 商品表
------------------------------------------------------
海尔冰箱 1 999 999
美的笔记本 1 888 888
....
...
------------------------------------------------------
public class OrderServiceImpl implements OrderService {
OrderDao orderDao = BasicFactory.getFactory().getDao(OrderDao.class);
ProdDao prodDao = BasicFactory.getFactory().getDao(ProdDao.class);
UserDao userDao = BasicFactory.getFactory().getDao(UserDao.class);
public void addOrder(Order order) {
try{
//1.生成订单
orderDao.addOrder(order);
//2.生成订单项/扣除商品数量
for(OrderItem item : order.getList()){
orderDao.addOrderItem(item);
prodDao.delPnum(item.getProduct_id(),item.getBuynum());
}
}catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public List<OrderListForm> findOrders(int user_id) {
try{
List<OrderListForm> olfList = new ArrayList<OrderListForm>();
//1.根据用户id查询这个id用户的所有订单
List<Order> list = orderDao.findOrderByUserId(user_id);
//2.遍历订单 生成orderListForm对象,存入List中
for(Order order : list){
//--设置订单信息
OrderListForm olf = new OrderListForm();
BeanUtils.copyProperties(olf, order);
//--设置用户名
User user = userDao.findUserById(order.getUser_id());
olf.setUsername(user.getUsername());
//--设置商品信息
//----查询当前订单所有订单项
List<OrderItem> itemList = orderDao.findOrderItems(order.getId());
//----遍历所有订单项,获取商品id,查找对应的商品,存入list
Map<Product,Integer> prodMap = new HashMap<Product,Integer>();
for(OrderItem item : itemList){
String prod_id = item.getProduct_id();
Product prod = prodDao.findProdById(prod_id);
prodMap.put(prod, item.getBuynum());
}
olf.setProdMap(prodMap);
olfList.add(olf);
}
return olfList;
}catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
显示查询订单的界面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h1>订单列表</h1><hr>
<c:forEach items="${requestScope.list}" var="olf">
<h3>
订单号:${olf.id }<br>
</h3>
用户名称 :${olf.username }<br>
订单金额 :${olf.money }<br>
支付状态 :
<c:if test="${olf.paystate == 0}">
<font color="red">未支付</font>
</c:if>
<c:if test="${olf.paystate != 0}">
<font color="blue">已支付</font>
</c:if>
<br>
收货地址 :${olf.receiverinfo }<br>
下单时间 :${olf.ordertime }<br>
<table width="100%" border="1">
<tr>
<th>商品名称</th>
<th>商品种类</th>
<th>购买数量</th>
<th>商品单价</th>
<th>总金额</th>
</tr>
<c:forEach items="${olf.prodMap}" var="entry">
<tr>
<td>${entry.key.name }</td>
<td>${entry.key.category }</td>
<td>${entry.value }</td>
<td>${entry.key.price }</td>
<td>${entry.key.price * entry.value }</td>
</tr>
</c:forEach>
</table>
<hr>
</c:forEach>
</body>
</html>