实现内容
![]()
删除选中的卡券
到处都是地雷
1. 删除不是实际的删除,而是修改卡券表的卡券状态,同时将删除的操作记录到卡券日志表中
2. 日志表比卡券表多两个字段:log_id和oper_type;log_id通过oracle的sequence获取唯一的值,oper_type是枚举值,相同的字段要通过set和get方法。
3. “删除”的操作复用update的sql,不要我写;log_id的获取通过工程已经写好的sequence,不要我写,Log对象实例和卡券对象实例相同的属性通过工具类方法,不要我写。
我本来想这样写的,但是可读性语义代码原则之一:15行的小方法轻舞飞扬,然后这26的字段,我调用的26次set和get方法;所以我自己设想在sql中实现取出卡券列表的值,再插入到log表中,问题就来了,log表多了两个字段,insert into log_table select * from cardcoupon_table 这种形式就没法用,再想能不能把 log_id,oper_type和 cardcoupon_table的字段连接起来,union all连接的是多个表中读取到的具有相同属性的列的连接,将多表查询的结果一并输出,join可以连接属性,但是两表连接必须有个属性是相同。然后我就问了大佬,工程里的解决方案是:
1. TfFCardcouponsLog tfFCardcouponsLog = BeanUtils.convertBean(tfFCardcoupon,TfFCardcouponsLog.class);
通过这个方法将卡券实例的值赋给 tfFCardcouponsLog
24行的set和get就变成了一行
2. tfFCardcouponsLog.setLogId(tfFCardcouponsMapper.getSeqNextValue());
查数据库得到序列set给log实例
3. tfFCardcouponsLog.setOperType("1");
设置本次操作的枚举类型
4. tfFCardcouponsLogMapper.insert(tfFCardcouponsLog);
插入数据。
学习:
1.oracle的sequence定义和获取
CREATE SEQUENCE CARD_COUPON_LOG_ID --为卡券操作历史表建立log_id
INCREMENT BY 1 --每次增加1
START WITH 24 --自定义从24开始,因为表中数据最小为23
NOMAXVALUE --不设置最大值
NOCYCLE --一直累加不循环
CACHE 10 --每次去10个序列之放到缓存
oracle sequence参考博客
insert语句的三种写法
SELECT CARD_COUPON_LOG_ID.NEXTVAL FROM DUAL---首次使用
SELECT CARD_COUPON_LOG_ID.CURRVAL FROM DUAL---返回当前的值,如果创建sequence,但是没有执行nextval就执行currval会报错
2.用JQuery获取选中的checkBox,通过ajax传入数组发起请求,需要在ajax中设置属性:traditional:true
/**
* 删除选中的卡券
*/
function deletecardCoupons() {
var chkboxGroup = $("[name='group']").filter(":checked");
var cardIdGrp = new Array();
for(var i = 0 ; i<chkboxGroup.length;i++){
cardIdGrp.push(chkboxGroup[i].id);
}
confirmx('您确定删除吗?',function(){
$.ajx({
url:basePath+"deletecardCoupons",
data:{cardIdGrp:cardIdGrp},
dataType:json,
traditional:true,//如果没有这个
success:function(data){
alertx(data.message);//显示提示
$('#searchForm').submit();//刷新页面
}
});
});
}
1. 发起的请求group后面有个[],servlet就无法取到数据了。
2. 返回结果后重新提交表单,就会刷新整个页面。
checkbox注册事件
3.参考coupon开发cardcoupon-1的问题:不同按钮的不同操作,href没懂是怎么发起请求的,但是onclick是通过js发起了ajax请求,之前都没看到优惠券里面的js文件。
不同按钮的不同操作
按钮 | 操作 |
---|---|
修改 | 带参数向servlet提交请求 href="updateCouponInit?couponBatchId=${couponBatch.couponBatchId}" RequestMapping(value = "updateCouponInit") |
删除 | 向servlet提交请求 onclick="deleteCouponBatch('${couponBatch.couponBatchId}')" @RequestMapping("deleteCouponBatch") 注解 public Object deleteCouponBatch(HttpServletRequest request, HttpServletResponse response, Model model,Long couponBatchId) 传参数 |
遗留问题
1.通过Spring,发起的请求参数可以放到
当做参数
但是一般的javaweb工程就只能使用request.getParameter
所以要详细了解@RequestMapping
的作用。
可以参考的博客
可以参考的博客
2. bean转化的两个方法完全看不懂,是用了反射机制吗,留个问题啊,这个不懂。
public static <T> T convertBean(Object fromBean, Class<T> toBeanClassName) {
Object toBean = null;
try {
toBean = getBeanInstance(toBeanClassName.getName());
return convertBean(fromBean, toBean);
} catch (Exception var4) {
var4.printStackTrace();
return toBean;
}
}
private static <T> T convertBean(Object fromBean, T toBean) {
BeanUtil.getBeanUtilBean().getTypeConverterManager().register(String.class, new StringConverter());
BeanCopy.beans(fromBean, toBean).copy();
return toBean;
}
在写记录的编辑状态的时候,千万不要再将以前的记录弄到编辑状态,因为,会覆盖会覆盖会覆盖。
总的来说,这个页面的功能很简单,只高兴都没人催我,立个目标,通过这个项目,了解SSM的原理。