1. 创建商品表:
因为有二级分类,二级分类和商品表,一级分类相关,为此创建二级分类表和商品表;
CREATE TABLE `categorysecond` (
`csid` int(11) NOT NULL AUTO_INCREMENT,
`csname` varchar(255) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
PRIMARY KEY (`csid`),
KEY `FK936FCAF21DB1FD15` (`cid`),
CONSTRAINT `FK936FCAF21DB1FD15` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8;
csid:二级分类的主键,cid为一级分类的主键,在二级分类表内为外键,链接两张表;
商品表:
CREATE TABLE `product` (
`pid` int(11) NOT NULL AUTO_INCREMENT,
`pname` varchar(255) DEFAULT NULL,
`market_price` double DEFAULT NULL,
`shop_price` double DEFAULT NULL,
`image` varchar(255) DEFAULT NULL,
`pdesc` varchar(255) DEFAULT NULL,
`is_hot` int(11) DEFAULT NULL,
`pdate` datetime DEFAULT NULL,
`csid` int(11) DEFAULT NULL,
PRIMARY KEY (`pid`),
KEY `FKED8DCCEFB9B74E02` (`csid`),
CONSTRAINT `FKED8DCCEFB9B74E02` FOREIGN KEY (`csid`) REFERENCES `categorysecond` (`csid`)
) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=utf8;
2. 创建商品的包和类
cn.itcast.shop.product
* action
* ProductAction
* service
* ProductService
* dao
* ProductDao
* vo
* Product
* Product.hbm.xml
分别建包action,sevice,dao,vo,并在相应的包下建立相应的类;
public class Product {
private Integer pid;
private String pname;
private Double market_price;
private Double shop_price;
private String image;
private String pdesc;
private Integer is_hot;
private String pdate;
//创建的为外键,需要一个对象去处理;
hibernate不能在表格内创建外键,而是需要创建一个对象;
映射文件Product.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.shop.product.vo.Product" table="product">
<id name="pid">
<generator class="native"/>
</id>
<property name="pname"/>
<property name="market_price"/>
<property name="shop_price"/>
<property name="image"/>
<property name="pdesc"/>
<property name="is_hot"/>
<property name="pdate"/>
</class>
</hibernate-mapping>
然后需要交给Spring appicationContect.xml管理映射文件
<!-- 配置Hibernate的映射文件 -->
<property name="mappingResources">
<list>
<value>cn/itcast/shop/user/vo/User.hbm.xml</value>
<value>cn/itcast/shop/category/vo/Category.hbm.xml</value>
<value>cn/itcast/shop/product/vo/Product.hbm.xml</value>
</list>
</property>
ProductDao需要注入sessionFactory,则需要继承,代码如下
public class ProductDao extends HibernateDaoSupport{
}
ProductService注入相应的dao
@Transactional
public class ProductService {
//注入dao
private ProductDao productDao;
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
}
@Transactional:如果单单是查询不需要增加事务,但是当增加其他操作,如增删改则需要增加事务,为此后期则在service上增加事务;
因为在首页访问的时候显示热门商品,需要将productService注入IndexAction;
public class IndexAction extends ActionSupport{
//注入一级分类的Service
private CategoryService categoryService;
// 注入商品的service
private ProductService productService;
public void setCategoryService(CategoryService categoryService) {
this.categoryService = categoryService;
}
public void setProductService(ProductService productService) {
this.productService = productService;
}
然后需要交给Spring appicationContect.xml管理映射文件
<!-- 首页访问的Action -->
<bean id="indexAction" class="cn.itcast.shop.index.action.IndexAction" scope="prototype">
<property name="categoryService" ref="categoryService"></property>
<property name="productService" ref="productService"></property>
</bean>
<!-- Service的配置 ===========================-->
<bean id="userService" class="cn.itcast.shop.user.service.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="categoryService" class="cn.itcast.shop.category.service.CategoryService">
<property name="categoryDao" ref="categoryDao"/>
</bean>
<bean id="productService" class="cn.itcast.shop.product.service.ProductService">
<property name="productDao" ref="productDao"/>
</bean>
<!-- Dao的配置 ===========================-->
<bean id="userDao" class="cn.itcast.shop.user.dao.UserDao">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="categoryDao" class="cn.itcast.shop.category.dao.CategoryDao">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="productDao" class="cn.itcast.shop.product.dao.ProductDao">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
4.
- 1.Action-----ProductService------>ProductDao
* 查询热门商品:
* is_hot: 0 :不是热门 1:是热门.
* 查询带有个数:
* 分页查询:
* 将查询到数据保存到值栈中.
疑问:
1. 为什么存入值栈中?
为了将数值传递到页面
2. 使用set方法?
ActionContext.getContext().getValueStack()这个方法是获得值栈。
如果使用put方法则是没有key,使用set则是有key值
引申的问题:
那put set底层的区别是什么?
另外session为什么可以用put?
public class IndexAction extends ActionSupport{
//注入一级分类的Service
private CategoryService categoryService;
// 注入商品的service
private ProductService productService;
public void setCategoryService(CategoryService categoryService) {
this.categoryService = categoryService;
}
public void setProductService(ProductService productService) {
this.productService = productService;
}
/**
* 接收数据需要使用模型 驱动
*/
/**
* 执行的访问首页的方法:
*/
public String execute(){
//查询所有一级分类
List<Category> cList = categoryService.findAll();
//将一级分类存入session范围内
ActionContext.getContext().getSession().put("cList", cList);
//查询热门商品
List<Product> hList = productService.findHot();
//保存在值栈中
ActionContext.getContext().getValueStack().set("hList", hList);
return "index";
}
}
service
@Transactional
public class ProductService {
//注入dao
private ProductDao productDao;
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
public List<Product> findHot() {
return productDao.findHot();
}
}
dao
public class ProductDao extends HibernateDaoSupport{
/**
* 查询首页热门商品
* @return
*/
public List<Product> findHot() {
//使用离线查询条件
DetachedCriteria criteria =DetachedCriteria.forClass(Product.class);
//查询热门商品,条件是is_hot=1
criteria.add(Restrictions.eq("is_hot", 1));
//倒序排序输出
criteria.addOrder(Order.desc("pdate"));
//执行查询,分页
List<Product> hlist = this.getHibernateTemplate().findByCriteria(criteria, 0, 10);
return hlist;
}
}
index.jsp页面
<strong>热门商品</strong>
<!-- <a target="_blank"></a> -->
</div>
<ul class="tab">
<li class="current">
<a href="./蔬菜分类.htm?tagIds=1" target="_blank"></a>
</li>
<li>
<a target="_blank"></a>
</li>
<li>
<a target="_blank"></a>
</li>
</ul>
<!-- <div class="hotProductAd">
<img src="${pageContext.request.contextPath}/image/a.jpg" width="260" height="343" alt="热门商品" title="热门商品">
</div> -->
<ul class="tabContent" style="display: block;">
<s:iterator var ="p" value="hList">
<li>
<a target="_blank"><img src="${pageContext.request.contextPath}/<s:property value = "#p.image"/>" data-original="http://storage.shopxx.net/demo-image/3.0/201301/0ff130db-0a1b-4b8d-a918-ed9016317009-thumbnail.jpg" style="display: block;"></a>
</li>
</s:iterator>
因为数值保存在值栈中,所以value可以直接取hList,写法:value="hList",后赋值为var="p";最后是遍历取值展示;
最后效果展示:
最后修改的效果是: