2 SSH網上商城--首頁熱門商品顯示
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";最後是遍歷取值展示;
最後效果展示:
最後修改的效果是: