第三個選項卡涉及到了咱們的手機屬性,所以,仍是須要用到咱們其餘的數據庫表:EB_FEATUREjavascript
繼續作逆向工程:html
查詢出普通屬性和特殊屬性:java
<select id="selectCommFeature" resultMap="BaseResultMap"> select * from eb_feature t where t.is_spec = 0 </select> <select id="selectSpecFeature" resultMap="BaseResultMap"> select * from eb_feature t where t.is_spec = 1 </select>
dao實現正則表達式
/** * 繼承SqlSessionDaoSupport可以獲得sessionFactory的引用,很是方便! */ @Repository public class EbFeatureDaoImpl extends SqlSessionDaoSupport implements EbFeatureDao { String nameSpace = "com.rl.ecps.sqlMap.EbFeatureMapper."; public List<EbFeature> selectCommFeature() { return this.getSqlSession().selectList(nameSpace + "selectCommFeature"); } public List<EbFeature> selectSpecFeature() { return this.getSqlSession().selectList(nameSpace + "selectSpecFeature"); } }
service實現sql
@Service public class EbFeatureServiceImpl implements EbFeatureService { @Autowired private EbFeatureDao featureDao; public List<EbFeature> selectCommFeature() { return featureDao.selectCommFeature(); } public List<EbFeature> selectSpecFeature() { return featureDao.selectSpecFeature(); } }
controller調用service拿到對應的普通屬性和特殊屬性。數據庫
/** * 跳轉到添加商品頁面 * * @return */ @RequestMapping("/toAddItem.do") public String toAddItem(Model model) { List<EbBrand> ebBrands = ebBrandService.selectBrand(); List<EbFeature> commFeature = featureService.selectCommFeature(); List<EbFeature> specFeature = featureService.selectSpecFeature(); model.addAttribute("ebBrands", ebBrands); model.addAttribute("commFeature", commFeature); model.addAttribute("specFeature", specFeature); return "item/addItem"; }
JSP顯示普通屬性:bash
<div id="tab_3" class="edit set" style="display: none"> <c:if test="${fn:length(commFeature) == 0}"> <p><label></label>無屬性</p> </c:if> <%--判斷每一個屬性的錄入方式並顯示--%> <c:forEach items="${commFeature}" var="feature"> <p> <label>${feature.featureName }:</label> <%--若是輸入類型爲1,那麼就是下拉框方式--%> <c:if test="${feature.inputType==1}"> <select name="${feature.featureId}"> <%--這裏須要設置一個空值,不然後臺是能夠獲取到數據「請選擇」--%> <option value="">請選擇</option> <c:forEach items="${feature.selectValues}" var="value"> <option value="${value}">${value}</option> </c:forEach> </select> </c:if> <%--若是輸入類型爲2,那麼就是單選框方式--%> <c:if test="${feature.inputType==2}"> <c:forEach items="${feature.selectValues}" var="value"> <input type="radio" name="${feature.featureId}" value="${value}">${value} </c:forEach> </c:if> <%--若是輸入類型爲3,那麼就是多選框方式--%> <c:if test="${feature.inputType==3}"> <c:forEach items="${feature.selectValues}" var="value"> <input type="checkbox" name="${feature.featureId}" value="${value}">${value} </c:forEach> </c:if> </p> </c:forEach> </div>
想要把咱們在頁面上選定的基本屬性進行保存的話,咱們是使用另外一張表來進行保存的。Featrue表僅僅保存了相對應的屬性,是不作保存功能的!markdown
所以,咱們須要對EB_PARA_VALUE作逆向工程!session
咱們參數表的主鍵是不須要被其餘的表用的, 所以咱們直接使用序列來管理進行的。並不須要主鍵返回app
<insert id="insert" parameterType="com.rl.ecps.model.EbParaValue" > insert into EB_PARA_VALUE (PARA_ID, ITEM_ID, FEATURE_ID, PARA_VALUE) values (seqparavalueid.nextval, #{itemId,jdbcType=DECIMAL}, #{featureId,jdbcType=DECIMAL}, #{paraValue,jdbcType=VARCHAR}) </insert>
public interface EbParaValueDao { /** *因爲咱們的參數數據是多個的,不想在service作循環而浪費咱們的數據庫鏈接 * 所以就使用了List集合做爲參數 * @param ebParaValues * @param itemId */ void saveParaValue(List<EbParaValue> ebParaValues, Long itemId); }
@Repository public class EbParaValueDaoImpl extends SqlSessionDaoSupport implements EbParaValueDao { private String nameSpace = "com.rl.ecps.sqlMap.EbParaValueMapper."; public void saveParaValue(List<EbParaValue> ebParaValues, Long itemId) { //獲取數據庫鏈接,經過一個鏈接把數據存到數據庫裏邊去 SqlSession sqlSession = this.getSqlSession(); for (EbParaValue ebParaValue : ebParaValues) { ebParaValue.setItemId(itemId); sqlSession.insert(nameSpace + "insert", ebParaValue); } } }
回到咱們的網頁上,咱們發現屬性是很是多的,那麼咱們在controller是怎麼接收的呢???
咱們將JSP頁面的name屬性都設置爲咱們的featureId
因爲咱們該頁面上的數據都是從數據庫中查詢出來的,數據庫中的記錄有多少,在頁面上顯示的就有多少
所以,咱們能夠這麼幹:
代碼:
//查詢出全部的屬性數據 List<EbFeature> commFeature = featureService.selectCommFeature(); //建立一個集合來裝載咱們全部的參數數據 List<EbParaValue> ebParaValues = new ArrayList<EbParaValue>(); for (EbFeature feature : commFeature) { //獲得錄入方式 Short inputType = feature.getInputType(); //複選,複選的值是有多個的 if (inputType == 3) { String[] parameterValues = request.getParameterValues(feature.getFeatureId() + ""); //裝載參數數據 String value = ""; //若是獲得的數據不爲null,那麼就使用一個字符串來對其進行拼接 if (parameterValues != null && parameterValues.length > 0) { for (String parameterValue : parameterValues) { value = value + parameterValue + ","; } //去除最後一個逗號 value = value.substring(0, value.length() - 1); //把數據封裝到參數對象上 EbParaValue ebParaValue = new EbParaValue(); ebParaValue.setFeatureId(feature.getFeatureId()); ebParaValue.setParaValue(value); //裝載到集合中 ebParaValues.add(ebParaValue); } }else{ //非複選的值都只有一個 String parameter = request.getParameter(feature.getFeatureId() + ""); //若是拿到的數據不爲null if (StringUtils.isNotBlank(parameter)) { //把數據封裝到參數對象上 EbParaValue ebParaValue = new EbParaValue(); ebParaValue.setFeatureId(feature.getFeatureId()); ebParaValue.setParaValue(parameter); //裝載到集合中 ebParaValues.add(ebParaValue); } } }
測試:
來到咱們的最小庫存單元選項卡,咱們是須要把咱們的特殊屬性查詢出來的,供用戶選擇。
查詢出特殊屬性:
<c:forEach items="${specFeature }" var="spec"> <tr> <td>${spec.featureName }:</td> <td> <c:forEach items="${spec.selectValues}" var="para"> <input type="radio" name="${spec.featureId}" value="${para}">${para} </c:forEach> </td> </tr> </c:forEach>
當咱們想點擊增長規格的時候,就應該多那麼一個div在頁面上顯示!那爲何咱們須要多個規格呢??以下所示:
對該按鈕添加單擊事件
//實現頁面規格的自動增長和刪除 $("#button2").click(function () { //獲得想要控件div全部的內容,不包含本身的標籤 var htmlDiv = $("#sp_0").html(); //把本身的標籤包含進去 htmlDiv = "<div class='sp_0'>"+htmlDiv+"</div>"; //在下一個div以前插入 $(".page_c").before(htmlDiv); });
當咱們添加了對應的內容時,問題就隨之而來了:咱們的按鈕選項互斥了!
緣由就是出在:
那麼咱們使用一個變量值,讓每次的name屬性都不同便可!
//獲得divNum的值 var divNum = $("#divNum").val(); //實現頁面規格的自動增長和刪除 $("#button2").click(function () { divNum++; //獲得想要控件div全部的內容,不包含本身的標籤 var htmlDiv = $("#sp_0").html(); //把本身的標籤包含進去 htmlDiv = "<div class='sp_0' id='sp_"+divNum+"'>"+htmlDiv+"</div>"; //修改各個name的值,使用正則表達式就能夠修改一部份的了 htmlDiv = htmlDiv.replace(/specradio1/g, "specradio"+divNum); htmlDiv = htmlDiv.replace(/#sp_0/g, "#sp_"+divNum); //skuType1 showStatus1 sort1 skuPrice1 marketPrice1 stockInventory1 skuUpperLimit1 sku1 location1 htmlDiv = htmlDiv.replace(/skuType1/g, "skuType"+divNum); htmlDiv = htmlDiv.replace(/showStatus1/g, "showStatus"+divNum); htmlDiv = htmlDiv.replace(/sort1/g, "sort"+divNum); htmlDiv = htmlDiv.replace(/skuPrice1/g, "skuPrice"+divNum); htmlDiv = htmlDiv.replace(/marketPrice1/g, "marketPrice"+divNum); htmlDiv = htmlDiv.replace(/stockInventory1/g, "stockInventory"+divNum); htmlDiv = htmlDiv.replace(/skuUpperLimit1/g, "skuUpperLimit"+divNum); htmlDiv = htmlDiv.replace(/sku1/g, "sku"+divNum); htmlDiv = htmlDiv.replace(/location1/g, "location"+divNum); //從新設置div的值 $("#divNum").val(divNum); //在下一個div以前插入 $(".page_c").before(htmlDiv); });
仍是就是咱們不能刪除第一個銷售單元規格:
function clickRemove(id) { var a = $(".sp_0").length; if (a == 1) { alert("默認規格不可刪除"); return; } }
咱們的最小庫存單元涉及到了兩張數據庫表:
首先咱們來作逆向工程:
設置SKU有一個集合來保存全部的特殊屬性值:
private List<EbSpecValue> specList; public List<EbSpecValue> getSpecList() { return specList; } public void setSpecList(List<EbSpecValue> specList) { this.specList = specList; }
sku的主鍵須要被SpecValue用到,所以須要返回主鍵
<selectKey keyProperty="skuId" order="BEFORE" resultType="long"> select seqskuid.nextval from dual </selectKey>
specValue主鍵自動增加:
<insert id="insert" parameterType="com.rl.ecps.model.EbSpecValue" > insert into EB_SPEC_VALUE (SPEC_ID, SKU_ID, FEATURE_ID, SPEC_VALUE) values (seqspecvalueid.nextval, #{skuId,jdbcType=DECIMAL}, #{featureId,jdbcType=DECIMAL}, #{specValue,jdbcType=VARCHAR}) </insert>
public interface EbSkuDao { void saveEbSku(List<EbSku> ebSkus, Long itemId); }
/** * 繼承SqlSessionDaoSupport可以獲得sessionFactory的引用,很是方便! */ @Repository public class EbSkuDaoImpl extends SqlSessionDaoSupport implements EbSkuDao { String nameSpace = "com.rl.ecps.sqlMap.EbSkuMapper."; String nameSpace1 = "com.rl.ecps.sqlMap.EbSpecValueMapper."; public void saveEbSku(List<EbSku> ebSkus, Long itemId) { SqlSession sqlSession = this.getSqlSession(); for (EbSku ebSku : ebSkus) { //設置商品屬性 ebSku.setItemId(itemId); sqlSession.insert(nameSpace+"insert", ebSku); List<EbSpecValue> specList = ebSku.getSpecList(); for (EbSpecValue ebSpecValue : specList) { ebSpecValue.setSkuId(ebSku.getSkuId()); sqlSession.insert(nameSpace1 + "insert", ebSpecValue); } } } }
//使用集合來進行裝sku的對象 List<EbSku> skuList = new ArrayList<EbSku>(); //遍歷出特殊屬性的值 List<EbFeature> specList = featureService.selectSpecFeature(); //獲取頁面有多少個單元格,對其進行遍歷,取出對應的值 for (int i = 1; i <= divNum; i++) { //得到商城價和庫存,他們是必填的字段 String skuPrice = request.getParameter("skuPrice" + i); String stock = request.getParameter("stockInventory" + i); //若是上面的必填字段不是空說明數據有效 if (StringUtils.isNotBlank(skuPrice) && StringUtils.isNotBlank(stock)) { String skuType = request.getParameter("skuType" + i); String showStatus = request.getParameter("showStatus" + i); String sort = request.getParameter("sort" + i); String marketPrice = request.getParameter("marketPrice" + i); String skuUpperLimit = request.getParameter("skuUpperLimit" + i); String sku = request.getParameter("sku" + i); String location = request.getParameter("location" + i); //建立最小銷售單元的對象,而且賦值 EbSku skuObj = new EbSku(); skuObj.setSkuPrice(new BigDecimal(skuPrice)); skuObj.setStockInventory(new Integer(stock)); if (StringUtils.isNotBlank(skuType) && !StringUtils.equals(skuType, "")) { skuObj.setSkuType(new Short(skuType)); } if (StringUtils.isNotBlank(showStatus) && !StringUtils.equals(showStatus, "")) { skuObj.setShowStatus(new Short(showStatus)); } if (StringUtils.isNotBlank(sort) && !StringUtils.equals(sort, "")) { skuObj.setSkuSort(new Integer(sort)); } if (StringUtils.isNotBlank(marketPrice) && !StringUtils.equals(marketPrice, "")) { skuObj.setMarketPrice(new BigDecimal(marketPrice)); } if (StringUtils.isNotBlank(skuUpperLimit) && !StringUtils.equals(skuUpperLimit, "")) { skuObj.setSkuUpperLimit(new Integer(skuUpperLimit)); } skuObj.setSku(sku); skuObj.setLocation(location); //裝取特殊屬性的集合 List<EbSpecValue> specValList = new ArrayList<EbSpecValue>(); for (EbFeature feature : specList) { Long featureId = feature.getFeatureId(); //得到所選規格屬性的值 String specVal = request.getParameter(featureId + "specradio" + i); if (StringUtils.isNotBlank(specVal)) { //建立規格對象 EbSpecValue spec = new EbSpecValue(); spec.setFeatureId(featureId); spec.setSpecValue(specVal); specValList.add(spec); } } skuObj.setSpecList(specValList); skuList.add(skuObj); } }
獲取獲得值:
到目前爲止,咱們4個選項卡的數據均可以拿到了。所以,咱們能夠把Item所須要的對象存入數據庫了..
dao層編寫
public void saveItem(EbItem ebItem) { this.getSqlSession().insert(nameSpace + "insert", ebItem); }
service層編寫:
public void saveItem(EbItem ebItem, EbItemClob clob, List<EbSku> skus, List<EbParaValue> ebParaValues) { itemDao.saveItem(ebItem); clobDao.saveItemClob(clob, ebItem.getItemId()); skuDao.saveEbSku(skus, ebItem.getItemId()); paraValueDao.saveParaValue(ebParaValues, ebItem.getItemId()); }
controller編寫:
@RequestMapping("/addItem.do") public void addItem(EbItem ebItem, EbItemClob ebItemClob, HttpServletRequest request, Integer divNum) { //爲商品設置編號 ebItem.setItemNo(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())); //查詢出全部的屬性數據 List<EbFeature> commFeature = featureService.selectCommFeature(); //建立一個集合來裝載咱們全部的參數數據 List<EbParaValue> ebParaValues = new ArrayList<EbParaValue>(); for (EbFeature feature : commFeature) { //獲得錄入方式 Short inputType = feature.getInputType(); //複選,複選的值是有多個的 if (inputType == 3) { String[] parameterValues = request.getParameterValues(feature.getFeatureId() + ""); //裝載參數數據 String value = ""; //若是獲得的數據不爲null,那麼就使用一個字符串來對其進行拼接 if (parameterValues != null && parameterValues.length > 0) { for (String parameterValue : parameterValues) { value = value + parameterValue + ","; } //去除最後一個逗號 value = value.substring(0, value.length() - 1); //把數據封裝到參數對象上 EbParaValue ebParaValue = new EbParaValue(); ebParaValue.setFeatureId(feature.getFeatureId()); ebParaValue.setParaValue(value); //裝載到集合中 ebParaValues.add(ebParaValue); } } else { //非複選的值都只有一個 String parameter = request.getParameter(feature.getFeatureId() + ""); //若是拿到的數據不爲null if (StringUtils.isNotBlank(parameter)) { //把數據封裝到參數對象上 EbParaValue ebParaValue = new EbParaValue(); ebParaValue.setFeatureId(feature.getFeatureId()); ebParaValue.setParaValue(parameter); //裝載到集合中 ebParaValues.add(ebParaValue); } } } //使用集合來進行裝sku的對象 List<EbSku> skuList = new ArrayList<EbSku>(); //遍歷出特殊屬性的值 List<EbFeature> specList = featureService.selectSpecFeature(); //獲取頁面有多少個單元格,對其進行遍歷,取出對應的值 for (int i = 1; i <= divNum; i++) { //得到商城價和庫存,他們是必填的字段 String skuPrice = request.getParameter("skuPrice" + i); String stock = request.getParameter("stockInventory" + i); //若是上面的必填字段不是空說明數據有效 if (StringUtils.isNotBlank(skuPrice) && StringUtils.isNotBlank(stock)) { String skuType = request.getParameter("skuType" + i); String showStatus = request.getParameter("showStatus" + i); String sort = request.getParameter("sort" + i); String marketPrice = request.getParameter("marketPrice" + i); String skuUpperLimit = request.getParameter("skuUpperLimit" + i); String sku = request.getParameter("sku" + i); String location = request.getParameter("location" + i); //建立最小銷售單元的對象,而且賦值 EbSku skuObj = new EbSku(); skuObj.setSkuPrice(new BigDecimal(skuPrice)); skuObj.setStockInventory(new Integer(stock)); if (StringUtils.isNotBlank(skuType) && !StringUtils.equals(skuType, "")) { skuObj.setSkuType(new Short(skuType)); } if (StringUtils.isNotBlank(showStatus) && !StringUtils.equals(showStatus, "")) { skuObj.setShowStatus(new Short(showStatus)); } if (StringUtils.isNotBlank(sort) && !StringUtils.equals(sort, "")) { skuObj.setSkuSort(new Integer(sort)); } if (StringUtils.isNotBlank(marketPrice) && !StringUtils.equals(marketPrice, "")) { skuObj.setMarketPrice(new BigDecimal(marketPrice)); } if (StringUtils.isNotBlank(skuUpperLimit) && !StringUtils.equals(skuUpperLimit, "")) { skuObj.setSkuUpperLimit(new Integer(skuUpperLimit)); } skuObj.setSku(sku); skuObj.setLocation(location); //裝取特殊屬性的集合 List<EbSpecValue> specValList = new ArrayList<EbSpecValue>(); for (EbFeature feature : specList) { Long featureId = feature.getFeatureId(); //得到所選規格屬性的值 String specVal = request.getParameter(featureId + "specradio" + i); if (StringUtils.isNotBlank(specVal)) { //建立規格對象 EbSpecValue spec = new EbSpecValue(); spec.setFeatureId(featureId); spec.setSpecValue(specVal); specValList.add(spec); } } skuObj.setSpecList(specValList); skuList.add(skuObj); } } itemService.saveItem(ebItem, ebItemClob, skuList, ebParaValues); return "redirect:listItem.do"; }
檢查數據是否進去了
SELECT * from EB_ITEM WHERE ITEM_ID = 3073 SELECT * from EB_SKU where ITEM_ID = 3073 SELECT * from EB_PARA_VALUE WHERE ITEM_ID = 3073 SELECT * from EB_SPEC_VALUE WHERE SKU_ID = 3060