how2j.cn

下载区
文件名 文件大小
请先登录 19m
增值内容 19m
19m
步骤 1 : 先运行,看到效果,再学习   
步骤 2 : 页面截图   
步骤 3 : 模仿和排错   
步骤 4 : Product   
步骤 5 : ProductService   
步骤 6 : ProductServiceImpl   
步骤 7 : Action4Pojo   
步骤 8 : Action4Service   
步骤 9 : ProductAction   
步骤 10 : listProduct.jsp+editProduct.jsp   
步骤 11 : 查询功能讲解   
步骤 12 : 增加功能讲解   
步骤 13 : 编辑功能讲解   
步骤 14 : 修改功能讲解   
步骤 15 : 删除功能讲解   

步骤 1 :

先运行,看到效果,再学习

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
页面截图
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.pojo; import java.util.Date; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.Transient; @Entity @Table(name = "product") public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") int id; @ManyToOne @JoinColumn(name="cid") private Category category; private String name; private String subTitle; private float originalPrice; private float promotePrice; private int stock; private Date createDate; public int getId() { return id; } public void setId(int id) { this.id = id; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSubTitle() { return subTitle; } public void setSubTitle(String subTitle) { this.subTitle = subTitle; } public float getOriginalPrice() { return originalPrice; } public void setOriginalPrice(float originalPrice) { this.originalPrice = originalPrice; } public float getPromotePrice() { return promotePrice; } public void setPromotePrice(float promotePrice) { this.promotePrice = promotePrice; } public int getStock() { return stock; } public void setStock(int stock) { this.stock = stock; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } }
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.service; public interface ProductService extends BaseService { }
package com.how2java.tmall.service;

public interface ProductService extends BaseService {

}
步骤 6 :

ProductServiceImpl

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.service.impl; import org.springframework.stereotype.Service; import com.how2java.tmall.service.ProductService; @Service public class ProductServiceImpl extends BaseServiceImpl implements ProductService { }
package com.how2java.tmall.service.impl;

import org.springframework.stereotype.Service;

import com.how2java.tmall.service.ProductService;

@Service
public class ProductServiceImpl  extends BaseServiceImpl implements ProductService {

}
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.action; import java.util.List; import com.how2java.tmall.pojo.Category; import com.how2java.tmall.pojo.Product; import com.how2java.tmall.pojo.Property; public class Action4Pojo extends Action4Pagination { protected Category category; protected Property property; protected Product product; protected List<Category> categorys; protected List<Property> propertys; protected List<Product> products; public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } public List<Category> getCategorys() { return categorys; } public void setCategorys(List<Category> categorys) { this.categorys = categorys; } public Property getProperty() { return property; } public void setProperty(Property property) { this.property = property; } public List<Property> getPropertys() { return propertys; } public void setPropertys(List<Property> propertys) { this.propertys = propertys; } public Product getProduct() { return product; } public void setProduct(Product product) { this.product = product; } public List<Product> getProducts() { return products; } public void setProducts(List<Product> products) { this.products = products; } }
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.action; import java.lang.reflect.Method; import org.apache.commons.lang3.text.WordUtils; import org.springframework.beans.factory.annotation.Autowired; import com.how2java.tmall.service.CategoryService; import com.how2java.tmall.service.ProductService; import com.how2java.tmall.service.PropertyService; public class Action4Service extends Action4Pojo{ @Autowired CategoryService categoryService; @Autowired PropertyService propertyService; @Autowired ProductService productService; /** * transient to persistent * 瞬时对象转换为持久对象 * @param o */ public void t2p(Object o){ try { Class clazz = o.getClass(); int id = (Integer) clazz.getMethod("getId").invoke(o); Object persistentBean = categoryService.get(clazz, id); String beanName = clazz.getSimpleName(); Method setMethod = getClass().getMethod("set" + WordUtils.capitalize(beanName), clazz); setMethod.invoke(this, persistentBean); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.action; import java.util.Date; import org.apache.struts2.convention.annotation.Action; import com.how2java.tmall.pojo.Product; import com.how2java.tmall.util.Page; public class ProductAction extends Action4Result { @Action("admin_product_list") public String list() { if(page==null) page = new Page(); int total = productService.total(category); page.setTotal(total); page.setParam("&category.id="+category.getId()); products = productService.list(page,category); t2p(category); return "listProduct"; } @Action("admin_product_add") public String add() { product.setCreateDate(new Date()); productService.save(product); return "listProductPage"; } @Action("admin_product_delete") public String delete() { t2p(product); productService.delete(product); return "listProductPage"; } @Action("admin_product_edit") public String edit() { t2p(product); return "editProduct"; } @Action("admin_product_update") public String update() { Product productFromDB= (Product)productService.get(product.getId()); product.setCreateDate(productFromDB.getCreateDate()); productService.update(product); return "listProductPage"; } }
步骤 10 :

listProduct.jsp+editProduct.jsp

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@include file="../include/admin/adminHeader.jsp"%> <%@include file="../include/admin/adminNavigator.jsp"%> <script> $(function() { $("#addForm").submit(function() { if (!checkEmpty("name", "产品名称")) return false; if (!checkEmpty("subTitle", "小标题")) return false; if (!checkNumber("originalPrice", "原价格")) return false; if (!checkNumber("promotePrice", "优惠价格")) return false; if (!checkInt("stock", "库存")) return false; return true; }); }); </script> <title>产品管理</title> <div class="workingArea"> <ol class="breadcrumb"> <li><a href="admin_category_list">所有分类</a></li> <li><a href="admin_product_list?category.id=${category.id}">${category.name}</a></li> <li class="active">产品管理</li> </ol> <div class="listDataTableDiv"> <table class="table table-striped table-bordered table-hover table-condensed"> <thead> <tr class="success"> <th>ID</th> <th>图片</th> <th>产品名称</th> <th>产品小标题</th> <th width="53px">原价格</th> <th width="80px">优惠价格</th> <th width="80px">库存数量</th> <th width="80px">图片管理</th> <th width="80px">设置属性</th> <th width="42px">编辑</th> <th width="42px">删除</th> </tr> </thead> <tbody> <c:forEach items="${products}" var="p"> <tr> <td>${p.id}</td> <td> <%-- <c:if test="${!empty p.firstProductImage}"> <img width="40px" src="img/productSingle/${p.firstProductImage.id}.jpg"> </c:if> --%> </td> <td>${p.name}</td> <td>${p.subTitle}</td> <td>${p.originalPrice}</td> <td>${p.promotePrice}</td> <td>${p.stock}</td> <td><a href="admin_productImage_list?product.id=${p.id}"><span class="glyphicon glyphicon-picture"></span></a></td> <td><a href="admin_propertyValue_edit?product.id=${p.id}"><span class="glyphicon glyphicon-th-list"></span></a></td> <td><a href="admin_product_edit?product.id=${p.id}"><span class="glyphicon glyphicon-edit"></span></a></td> <td><a deleteLink="true" href="admin_product_delete?product.id=${p.id}"><span class=" glyphicon glyphicon-trash"></span></a></td> </tr> </c:forEach> </tbody> </table> </div> <div class="pageDiv"> <%@include file="../include/admin/adminPage.jsp"%> </div> <div class="panel panel-warning addDiv"> <div class="panel-heading">新增产品</div> <div class="panel-body"> <form method="post" id="addForm" action="admin_product_add"> <table class="addTable"> <tr> <td>产品名称</td> <td><input id="name" name="product.name" type="text" class="form-control"></td> </tr> <tr> <td>产品小标题</td> <td><input id="subTitle" name="product.subTitle" type="text" class="form-control"></td> </tr> <tr> <td>原价格</td> <td><input id="originalPrice" value="99.98" name="product.originalPrice" type="text" class="form-control"></td> </tr> <tr> <td>优惠价格</td> <td><input id="promotePrice" value="19.98" name="product.promotePrice" type="text" class="form-control"></td> </tr> <tr> <td>库存</td> <td><input id="stock" value="99" name="product.stock" type="text" class="form-control"></td> </tr> <tr class="submitTR"> <td colspan="2" align="center"> <input type="hidden" name="product.category.id" value="${category.id}"> <button type="submit" class="btn btn-success">提 交</button> </td> </tr> </table> </form> </div> </div> </div> <%@include file="../include/admin/adminFooter.jsp"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@include file="../include/admin/adminHeader.jsp"%> <%@include file="../include/admin/adminNavigator.jsp"%> <title>编辑产品</title> <script> $(function() { $("#editForm").submit(function() { if (!checkEmpty("name", "产品名称")) return false; if (!checkEmpty("subTitle", "小标题")) return false; if (!checkNumber("originalPrice", "原价格")) return false; if (!checkNumber("promotePrice", "优惠价格")) return false; if (!checkInt("stock", "库存")) return false; return true; }); }); </script> <div class="workingArea"> <ol class="breadcrumb"> <li><a href="admin_category_list">所有分类</a></li> <li><a href="admin_product_list?category.id=${product.category.id}">${product.category.name}</a></li> <li class="active">${product.name}</li> <li class="active">编辑产品</li> </ol> <div class="panel panel-warning editDiv"> <div class="panel-heading">编辑产品</div> <div class="panel-body"> <form method="post" id="editForm" action="admin_product_update"> <table class="editTable"> <tr> <td>产品名称</td> <td><input id="name" name="product.name" value="${product.name}" type="text" class="form-control"></td> </tr> <tr> <td>产品小标题</td> <td><input id="subTitle" name="product.subTitle" type="text" value="${product.subTitle}" class="form-control"></td> </tr> <tr> <td>原价格</td> <td><input id="originalPrice" value="${product.originalPrice}" name="product.originalPrice" type="text" class="form-control"></td> </tr> <tr> <td>优惠价格</td> <td><input id="promotePrice" value="${product.promotePrice}" name="product.promotePrice" type="text" class="form-control"></td> </tr> <tr> <td>库存</td> <td><input id="stock" value="${product.stock}" name="product.stock" type="text" class="form-control"></td> </tr> <tr class="submitTR"> <td colspan="2" align="center"> <input type="hidden" name="product.id" value="${product.id}"> <input type="hidden" name="product.category.id" value="${product.category.id}"> <button type="submit" class="btn btn-success">提 交</button></td> </tr> </table> </form> </div> </div> </div>
步骤 11 :

查询功能讲解

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
查询功能讲解
public String list() { if(page==null) page = new Page(); int total = productService.total(category); page.setTotal(total); page.setParam("&category.id="+category.getId()); products = productService.list(page,category); t2p(category); return "listProduct"; }
<c:forEach items="${products}" var="p"> <tr> <td>${p.id}</td> <td> </td> <td>${p.name}</td> <td>${p.subTitle}</td> <td>${p.originalPrice}</td> <td>${p.promotePrice}</td> <td>${p.stock}</td> <td><a href="admin_productImage_list?product.id=${p.id}"><span class="glyphicon glyphicon-picture"></span></a></td> <td><a href="admin_propertyValue_edit?product.id=${p.id}"><span class="glyphicon glyphicon-th-list"></span></a></td> <td><a href="admin_product_edit?product.id=${p.id}"><span class="glyphicon glyphicon-edit"></span></a></td> <td><a deleteLink="true" href="admin_product_delete?product.id=${p.id}"><span class=" glyphicon glyphicon-trash"></span></a></td> </tr> </c:forEach>
步骤 12 :

增加功能讲解

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
增加功能讲解
<form method="post" id="addForm" action="admin_product_add"> <table class="addTable"> <tr> <td>产品名称</td> <td><input id="name" name="product.name" type="text" class="form-control"></td> </tr> <tr> <td>产品小标题</td> <td><input id="subTitle" name="product.subTitle" type="text" class="form-control"></td> </tr> <tr> <td>原价格</td> <td><input id="originalPrice" value="99.98" name="product.originalPrice" type="text" class="form-control"></td> </tr> <tr> <td>优惠价格</td> <td><input id="promotePrice" value="19.98" name="product.promotePrice" type="text" class="form-control"></td> </tr> <tr> <td>库存</td> <td><input id="stock" value="99" name="product.stock" type="text" class="form-control"></td> </tr> <tr class="submitTR"> <td colspan="2" align="center"> <input type="hidden" name="product.category.id" value="${category.id}"> <button type="submit" class="btn btn-success">提 交</button> </td> </tr> </table> </form>
public String add() { product.setCreateDate(new Date()); productService.save(product); return "listProductPage"; }
步骤 13 :

编辑功能讲解

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
编辑功能讲解
public String edit() { t2p(product); return "editProduct"; }
	public String edit() {
		t2p(product);
		return "editProduct";
	}
<input type="hidden" name="product.id" value="${product.id}"> <input type="hidden" name="product.category.id" value="${product.category.id}">


						<input type="hidden" name="product.id" value="${product.id}">
						<input type="hidden" name="product.category.id" value="${product.category.id}">
步骤 14 :

修改功能讲解

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
修改功能讲解
public String update() { Product productFromDB= (Product)productService.get(product.getId()); product.setCreateDate(productFromDB.getCreateDate()); productService.update(product); return "listProductPage"; }
	public String update() {
		Product productFromDB= (Product)productService.get(product.getId());
		product.setCreateDate(productFromDB.getCreateDate());
		
		productService.update(product);
		return "listProductPage";
	}
步骤 15 :

删除功能讲解

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
删除功能讲解
public String delete() { t2p(product); productService.delete(product); return "listProductPage"; }
	public String delete() {
		t2p(product);
		productService.delete(product);
		return "listProductPage";
	}


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2020-05-20 删除问题,没有更改代码,只是运行
_789426




为什么删除产品的时候,不能直接删除,而必须得先删除产品里的图片,然后才能删除产品,不然就出现如图的错误
加载中

							

							


1 个答案

how2j
答案时间:2020-05-22
在创建表结构的时候,有外键约束,导致当存在从表数据的时候,主表数据无法被删除。 为什么会这样呢? 假设即使有从表数据,主表也允许被删除,那么那些从表数据就变成脏数据了。 对于这个问题通常有两种解决办法: 1. 使用级联删除。即删除主表的时候,从表自动删除。 这样做在技术上最简单,但是在业务上最危险,不推荐。 2. 删除有从表数据的主表时,提醒用户依然有从表数据,建议用户一条一条删除从表数据,再删除主表数据。 这样技术上无改动,业务上最安全。 建议采纳此种方案。 附:主从表概念——以分类和产品而言,他们是一对多关系,分类就是主表,产品就是从表。



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2020-05-11 删除按钮这样写就不需要在delete方法里面持久化对象了t2p(product),老师不持久话直接把参数传入的话效率应该高一些把
尹文




删除按钮这样写就不需要在delete方法里面持久化对象了t2p(product),老师不持久话直接把参数传入的话效率应该高一些把 href="admin_product_delete?product.id=${p.id}&product.category.id=${p.category.id}"
href="admin_product_delete?product.id=${p.id}&product.category.id=${p.category.id}"

							


1 个答案

how2j
答案时间:2020-05-12
你说得对,可以不调用 t2p



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-06-04 疑问
2018-04-13 异常
2017-10-12 实体类


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 3 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 已下架实践项目-天猫整站SSH-产品管理 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图