參考coupon開發cardcoupon-3

實現內容
這裏寫圖片描述
刪除選中的卡券

到處都是地雷
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的原理。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章