實現內容
刪除選中的卡券
到處都是地雷
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的原理。