【涛涛商城】jsp+redis动态展示商品详情页面

1、创建taotao-item-web的Maven——Project工程。

2、功能分析

在搜索结果页面点击商品图片或者商品标题,展示商品详情页面。

请求的url:/item/{itemId}

参数:商品id

返回值:String 逻辑视图

业务逻辑:

  1. 从url中取参数,商品id
  2. 根据商品id查询商品信息(tb_item)得到一个TbItem对象,缺少images属性,可以创建一个pojo继承TbItem,添加一个getImages方法。在taotao-item-web工程中。
public class Item extends TbItem {

	public String[] getImages() {
		String image2 = this.getImage();
		if (image2 != null && !"".equals(image2)) {
			String[] strings = image2.split(",");
			return strings;
		}
		return null;
	}
	
	public Item() {
		
	}
	
	public Item(TbItem tbItem) {
		this.setBarcode(tbItem.getBarcode());
		this.setCid(tbItem.getCid());
		this.setCreated(tbItem.getCreated());
		this.setId(tbItem.getId());
		this.setImage(tbItem.getImage());
		this.setNum(tbItem.getNum());
		this.setPrice(tbItem.getPrice());
		this.setSellPoint(tbItem.getSellPoint());
		this.setStatus(tbItem.getStatus());
		this.setTitle(tbItem.getTitle());
		this.setUpdated(tbItem.getUpdated());
	}
	
}

3、Service(taotao-manager)

  1. 根据商品id查询商品信息

参数:商品id

返回值:TbItem

扫描二维码关注公众号,回复: 5554434 查看本文章
  1. 根据商品id查询商品描述

参数:商品id

返回值:TbItemDesc

  /**
	 * 根据商品id返回商品的基础信息。
	 */
	@Override
	public TbItem selectById(Long id) {
//		不影响正常的程序运行,添加try catch
		try{
//			1、获取缓存
			String string = jedisClient.get(ITEM_INFO+":"+id+":BASE");
//			2、判断缓存是否为空
			if(StringUtils.isNoneBlank(string)){
//				2.1若不为空则将string转成json数据
				TbItem tbItem = JsonUtils.jsonToPojo(string, TbItem.class);
//				2.2 返回数据
				return tbItem;
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
		TbItem tbItem = itemMapper.selectByPrimaryKey(id);
//		不影响正常的程序运行,添加try catch
		try{
//			1、将pojo对象转换成string
			String string = jedisClient.set(ITEM_INFO+":"+id+":BASE", JsonUtils.objectToJson(tbItem));
//			2、将string对象添加到缓存中
			
//			2.1 设置过期时间
			jedisClient.expire(ITEM_INFO+":"+id+":BASE", TIEM_EXPIRE);
		}catch(Exception e){
			e.printStackTrace();
		}
		return tbItem;
	}
	
	/**
	 * 根据商品的id吗,查询商品的详细信息
	 */
	public TbItemDesc getItemDescById(long itemid) {
//		从缓存中取出商品信息
		try {
			String json = jedisClient.get(ITEM_INFO+":"+itemid+ ":DESC");
			//判断缓存是否命中
			if (StringUtils.isNotBlank(json) ) {
				//转换为java对象
				TbItemDesc itemDesc = JsonUtils.jsonToPojo(json, TbItemDesc.class);
				return itemDesc;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		TbItemDesc itemDesc = tbItemDescMapper.selectByPrimaryKey(itemid);
//		将pojo商品信息添加到缓存中
		try {
			jedisClient.set(ITEM_INFO+":"+itemid+ ":DESC", JsonUtils.objectToJson(itemDesc));
			//设置过期时间
			jedisClient.expire(ITEM_INFO+":"+itemid+ ":DESC", TIEM_EXPIRE);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return itemDesc;
	}

4、Controller

请求的url:/item/{itemId}

参数:商品id

返回值:String 逻辑视图

@Controller	
public class ItemController {

	@Autowired
	private ItemsService itemsService;
	
	@RequestMapping("/item/{itemId}")
	public String showItemInfo(@PathVariable Long itemId,Model model){
//		1、根据商品id查询商品的基本信息
		TbItem tbItem = itemsService.selectById(itemId);
//		2、使用构造方法进行初始化到自定义的pojo中
		Item item = new Item(tbItem);
//		3、使用id查询商品的详细信息
		TbItemDesc itemDesc = itemsService.getItemDescById(itemId);
//		4、将两个对象添加到model中
		model.addAttribute("item", item);
		model.addAttribute("itemDesc", itemDesc);
//		5、返回逻辑视图
		return "item";
	}
}

5、缓存中缓存热点数据,提供缓存的使用率。需要设置缓存的有效期。一般是一天的时间,可以根据实际情况跳转。Hash不能设置过期时间。所以使用String

需要使用String类型来保存商品数据。

可以加前缀方法对象redis中的key进行归类。

ITEM_INFO:123456(商品id):BASE

ITEM_INFO:123456:DESC

如果把二维表保存到redis中:

  1. 表名就是第一层
  2. 主键是第二层
  3. 字段名第三次

三层使用“:”分隔作为key,value就是字段中的内容。

猜你喜欢

转载自blog.csdn.net/lxiansheng001/article/details/83028017