步骤 2 : 页面截图 步骤 3 : 模仿和排错 步骤 4 : Product 步骤 5 : ProductService 步骤 6 : ProductServiceImpl 步骤 7 : Action4Pojo 步骤 8 : Action4Service 步骤 9 : ProductAction 步骤 10 : listProduct.jsp+editProduct.jsp 步骤 11 : 查询功能讲解 步骤 12 : 增加功能讲解 步骤 13 : 编辑功能讲解 步骤 14 : 修改功能讲解 步骤 15 : 删除功能讲解
增值内容,请先登录
完整的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 { }
增值内容,请先登录
完整的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";
}
}
增值内容,请先登录
完整的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>
增值内容,请先登录
完整的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>
增值内容,请先登录
完整的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";
}
增值内容,请先登录
完整的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}">
增值内容,请先登录
完整的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"; }
增值内容,请先登录
完整的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
删除问题,没有更改代码,只是运行
1 个答案
how2j 跳转到问题位置 答案时间:2020-05-22 在创建表结构的时候,有外键约束,导致当存在从表数据的时候,主表数据无法被删除。
为什么会这样呢? 假设即使有从表数据,主表也允许被删除,那么那些从表数据就变成脏数据了。
对于这个问题通常有两种解决办法:
1. 使用级联删除。即删除主表的时候,从表自动删除。 这样做在技术上最简单,但是在业务上最危险,不推荐。
2. 删除有从表数据的主表时,提醒用户依然有从表数据,建议用户一条一条删除从表数据,再删除主表数据。 这样技术上无改动,业务上最安全。 建议采纳此种方案。
附:主从表概念——以分类和产品而言,他们是一对多关系,分类就是主表,产品就是从表。
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2020-05-11
删除按钮这样写就不需要在delete方法里面持久化对象了t2p(product),老师不持久话直接把参数传入的话效率应该高一些把
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2018-06-04
疑问
2018-04-13
异常
2017-10-12
实体类
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 3 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|