how2j.cn

下载区
文件名 文件大小
请先登录 19m
增值内容 19m
19m

8分20秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器

步骤 1 : 先运行,看到效果,再学习   
步骤 2 : 模仿和排错   
步骤 3 : 页面截图   
步骤 4 : Property   
步骤 5 : PropertyService   
步骤 6 : PropertyServiceImpl   
步骤 7 : Action4Pojo   
步骤 8 : Action4Service   
步骤 9 : PropertyAction   
步骤 10 : listProperty.jsp+editProperty.jsp   
步骤 11 : 查询功能讲解   
步骤 12 : 增加功能讲解   
步骤 13 : 编辑功能讲解   
步骤 14 : 修改功能讲解   
步骤 15 : 删除功能讲解   
步骤 16 : 其他-面包屑导航   
步骤 17 : 其他-分页   

步骤 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 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; @Entity @Table(name = "property") public class Property { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private int id; @Column(name = "name") private String name; @ManyToOne @JoinColumn(name="cid") private Category category; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } }
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.service; import java.util.List; import com.how2java.tmall.pojo.Category; import com.how2java.tmall.util.Page; public interface PropertyService extends BaseService{ public List listByCategory(Category category); public List list(Page page,Category category); public int total (Category category); }
package com.how2java.tmall.service;

import java.util.List;

import com.how2java.tmall.pojo.Category;
import com.how2java.tmall.util.Page;

public interface PropertyService extends BaseService{
	public List listByCategory(Category category);
	public List list(Page page,Category category);
	public int total (Category category);
}
步骤 6 :

PropertyServiceImpl

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.service.impl; import java.util.List; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.springframework.stereotype.Service; import com.how2java.tmall.pojo.Category; import com.how2java.tmall.service.PropertyService; import com.how2java.tmall.util.Page; @Service public class PropertyServiceImpl extends BaseServiceImpl implements PropertyService { @Override public List listByCategory(Category category) { DetachedCriteria dc = DetachedCriteria.forClass(clazz); dc.add(Restrictions.eq("category", category)); dc.addOrder(Order.desc("id")); return findByCriteria(dc); } @Override public List list(Page page, Category category) { DetachedCriteria dc = DetachedCriteria.forClass(clazz); dc.add(Restrictions.eq("category", category)); dc.addOrder(Order.desc("id")); return findByCriteria(dc,page.getStart(),page.getCount()); } @Override public int total(Category category) { String sqlFormat = "select count(*) from %s bean where bean.category = ?"; String hql = String.format(sqlFormat, clazz.getName()); List<Long> l= this.find(hql,category); if(l.isEmpty()) return 0; Long result= l.get(0); return result.intValue(); } }
增值内容,请先登录
完整的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.Property; public class Action4Pojo extends Action4Pagination { protected Category category; protected Property property; protected List<Category> categorys; protected List<Property> propertys; 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; } }
增值内容,请先登录
完整的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.PropertyService; public class Action4Service extends Action4Pojo{ @Autowired CategoryService categoryService; @Autowired PropertyService propertyService; /** * 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 org.apache.struts2.convention.annotation.Action; import com.how2java.tmall.util.Page; public class PropertyAction extends Action4Result{ @Action("admin_property_list") public String list() { if(page==null) page = new Page(); int total = propertyService.total(category); page.setTotal(total); page.setParam("&category.id="+category.getId()); propertys = propertyService.list(page,category); t2p(category); return "listProperty"; } @Action("admin_property_add") public String add() { propertyService.save(property); return "listPropertyPage"; } @Action("admin_property_delete") public String delete() { t2p(property); propertyService.delete(property); return "listPropertyPage"; } @Action("admin_property_edit") public String edit() { t2p(property); return "editProperty"; } @Action("admin_property_update") public String update() { propertyService.update(property); return "listPropertyPage"; } }
步骤 10 :

listProperty.jsp+editProperty.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 true; return false; }); }); </script> <title>属性管理</title> <div class="workingArea"> <ol class="breadcrumb"> <li><a href="admin_category_list">所有分类</a></li> <li><a href="admin_property_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> </tr> </thead> <tbody> <c:forEach items="${propertys}" var="p"> <tr> <td>${p.id}</td> <td>${p.name}</td> <td><a href="admin_property_edit?property.id=${p.id}"><span class="glyphicon glyphicon-edit"></span></a></td> <td><a deleteLink="true" href="admin_property_delete?property.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_property_add"> <table class="addTable"> <tr> <td>属性名称</td> <td><input id="name" name="property.name" type="text" class="form-control"></td> </tr> <tr class="submitTR"> <td colspan="2" align="center"> <input type="hidden" name="property.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> <div class="workingArea"> <ol class="breadcrumb"> <li><a href="admin_category_list">所有分类</a></li> <li><a href="admin_property_list?category.id=${property.category.id}">${property.category.name}</a></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_property_update"> <table class="editTable"> <tr> <td>属性名称</td> <td><input id="name" name="property.name" value="${property.name}" type="text" class="form-control"></td> </tr> <tr class="submitTR"> <td colspan="2" align="center"> <input type="hidden" name="property.id" value="${property.id}"> <input type="hidden" name="property.category.id" value="${property.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项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
查询功能讲解
@Action("admin_property_list") public String list() { if(page==null) page = new Page(); int total = propertyService.total(category); page.setTotal(total); page.setParam("&category.id="+category.getId()); propertys = propertyService.list(page,category); t2p(category); return "listProperty"; }
<c:forEach items="${propertys}" var="p"> <tr> <td>${p.id}</td> <td>${p.name}</td> <td><a href="admin_property_edit?property.id=${p.id}"><span class="glyphicon glyphicon-edit"></span></a></td> <td><a deleteLink="true" href="admin_property_delete?property.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_property_add"> <table class="addTable"> <tr> <td>属性名称</td> <td><input id="name" name="property.name" type="text" class="form-control"></td> </tr> <tr class="submitTR"> <td colspan="2" align="center"> <input type="hidden" name="property.category.id" value="${category.id}"> <button type="submit" class="btn btn-success">提 交</button> </td> </tr> </table> </form>
@Action("admin_property_add") public String add() { propertyService.save(property); return "listPropertyPage"; }
步骤 13 :

编辑功能讲解

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
编辑功能讲解
public String edit() { t2p(property); return "editProperty"; }
<form method="post" id="editForm" action="admin_property_update"> <table class="editTable"> <tr> <td>属性名称</td> <td><input id="name" name="property.name" value="${property.name}" type="text" class="form-control"></td> </tr> <tr class="submitTR"> <td colspan="2" align="center"> <input type="hidden" name="property.id" value="${property.id}"> <input type="hidden" name="property.category.id" value="${property.category.id}"> <button type="submit" class="btn btn-success">提 交</button></td> </tr> </table> </form>
步骤 14 :

修改功能讲解

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

删除功能讲解

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

其他-面包屑导航

edit
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
其他-面包屑导航
<ol class="breadcrumb"> <li><a href="admin_category_list">所有分类</a></li> <li><a href="admin_property_list?category.id=${category.id}">${category.name}</a></li> <li class="active">属性管理</li> </ol>
	<ol class="breadcrumb">
	  <li><a href="admin_category_list">所有分类</a></li>
	  <li><a href="admin_property_list?category.id=${category.id}">${category.name}</a></li>
	  <li class="active">属性管理</li>
	</ol>
增值内容,请先登录
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
其他-分页
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <script> $(function(){ $("ul.pagination li.disabled a").click(function(){ return false; }); }); </script> <nav> <ul class="pagination"> <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>> <a href="?page.start=0${page.param}" aria-label="Previous" > <span aria-hidden="true">«</span> </a> </li> <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>> <a href="?page.start=${page.start-page.count}${page.param}" aria-label="Previous" > <span aria-hidden="true">‹</span> </a> </li> <c:forEach begin="0" end="${page.totalPage-1}" varStatus="status"> <li <c:if test="${status.index*page.count==page.start}">class="disabled"</c:if>> <a href="?page.start=${status.index*page.count}${page.param}" <c:if test="${status.index*page.count==page.start}">class="current"</c:if> >${status.count}</a> </li> </c:forEach> <li <c:if test="${!page.hasNext}">class="disabled"</c:if>> <a href="?page.start=${page.start+page.count}${page.param}" aria-label="Next"> <span aria-hidden="true">›</span> </a> </li> <li <c:if test="${!page.hasNext}">class="disabled"</c:if>> <a href="?page.start=${page.last}${page.param}" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> </ul> </nav>


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


问答区域    
2020-01-09 @ManyToOne与mysql库里面定义的外键是否功能一致?
Ivan2019

1.是否声明映射 @ManyToOne,创建表时FOREIGN KEY可以不关联(二者择一) 2 @ManyToOne逻辑外键?.FOREIGN KEY物理外键? 站长,最近发现此问题,有点疑惑,望解答,辛苦了,谢谢。




3 个答案

Ivan2019
答案时间:2020-01-10
关联映射:实体类之间的关联作用?

Ivan2019
答案时间:2020-01-10
@how2j 站长,我以为功能重复,所有二选一。 @ManyToOne具体功能和作用可以简述下吗? 谢谢~

how2j
答案时间:2020-01-09
1. 为什么不能都有,要二选一? 2. @ManyToOne 是hibernate 注解, FOREIGN KEY 是数据库层面物理外键。 @ManyToOne 不能等同于逻辑外键。



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




2019-12-17 步骤11中,dc.add(Restrictions.eq("category", category));等价于cid=category.Id?
Ivan2019




站长,使用Criteria进行数据查询。 因为 @JoinColumn(name="cid") private Category category; 所以 Restrictions.eq("category", category) 等价于 cid=category.id 是这样的理解吗? 谢谢
public List listByCategory(Category category) {
		DetachedCriteria dc = DetachedCriteria.forClass(clazz);
		dc.add(Restrictions.eq("category", category));
		dc.addOrder(Order.desc("id"));
		return findByCriteria(dc);
	}

							


1 个答案

how2j
答案时间:2019-12-18
嗯呢,是的



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





2019-08-14 关于property.category.id
2019-06-26 属性根据分类进行 分页查询
2019-05-14 不加 分页的级联 action 查询所有怎么写啊


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

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

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

上传截图