【涛涛商城】jsp+redis动态展示商品详情页面
1、创建taotao-item-web的Maven——Project工程。
2、功能分析
在搜索结果页面点击商品图片或者商品标题,展示商品详情页面。
请求的url:/item/{itemId}
参数:商品id
返回值:String 逻辑视图
业务逻辑:
- 从url中取参数,商品id
- 根据商品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)
- 根据商品id查询商品信息
参数:商品id
返回值:TbItem
- 根据商品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中:
- 表名就是第一层
- 主键是第二层
- 字段名第三次
三层使用“:”分隔作为key,value就是字段中的内容。