1. 程式人生 > >2 SSH網上商城--首頁熱門商品顯示

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. 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";最後是遍歷取值展示;

最後效果展示:

最後修改的效果是: