https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040
第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第五天】
第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第六天】
第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第七天】(redis缓存)
第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第八天】(solr服务器搭建、搜索功能实现)
第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)
1 课程计划
今天的内容:
1、在taotao-portal工程中调用taotao-search工程发布的服务。实现商品搜索功能。
2、点击商品的图片,打开商品详情页面
a) 商品基本信息
b) 延迟加载商品详情。延迟一秒加载使用ajax
c) 商品的规格参数。按需加载,当用户点击商品规格参数tab页,加载ajax。
需求分析
用户在首页中输入查询条件,点击查询向taotao-portal发送请求,参数就是查询的条件,页码。Taoto-portal调用taotao-search发布的服务进行搜索,参数应该是查询条件和页码及每页显示的记录数(参数可选)。Taotao-search返回一个json格式的数据(TaotaoResult包装一个SearchResult对象)。Taotao-portal接收json数据需要把json数据转换成java对象。把java对象传递给jsp页面,jsp渲染java对象得到商品查询结果页面。
2.3 Service层
接收两个参数1、查询条件2、页码。调用taotao-search的搜索服务。接收返回的json数据,把json转换成java对象返回SearchResult对象。
@Service
public class SearchServiceImpl implements SearchService {
@Value("${SEARCH_BASE_URL}")
private String SEARCH_BASE_URL;
@Override
public SearchResult search(String queryString, int page) {
// 调用taotao-search的服务
// 查询参数
Map<String, String> param = new HashMap<>();
param.put("q", queryString);
param.put("page", page + "");
try {
// 调用服务得到JSON格式
String json = HttpClientUtil.doGet(SEARCH_BASE_URL, param);
// 把字符串转换成java对象
TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, SearchResult.class);
if (taotaoResult.getStatus() == 200) {
SearchResult result = (SearchResult) taotaoResult.getData();
return result;
}
} catch (Exception e) {
e.printStackTrace();
}
// 程序正常执行走try{}代码块,必然会return rsult;
// 此处的return null;只是为了这个方法返回值类型检查不报错
return null;
}
}
知识兔2.4 Controller层
功能:接收请求的参数查询条件和页码。调用Service查询商品列表得到SearchResult对象。
需要把
Query:回显的查询条件
totalPages:总页数
itemList:商品列表
Page:当前页码
传递到页面。返回一个逻辑视图search字符串。
//首页商品搜索Controller
@Controller
public class PortalSearchController {
@Autowired
private SearchService searchService;
@RequestMapping("/search")
public String search(@RequestParam("q")String queryString,
@RequestParam(defaultValue="1")Integer page, Model model) {
if (queryString != null) {
try {
//防止字符串乱码
queryString = new String(queryString.getBytes("iso8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
SearchResult searchResult = searchService.search(queryString, page);
//向页面传递参数
model.addAttribute("query", queryString);
model.addAttribute("totalPages", searchResult.getPageCount());
model.addAttribute("itemList", searchResult.getItemList());
model.addAttribute("page", page);
return "search";
}
}
知识兔2.5 存在的问题
搜索结果中图片展示不出来,image字段中存储的图片是多张,使用逗号分隔。
修改方法:
Pojo:
package com.taotao.common.pojo;
public class Item {
private String id;
private String title;
private String sell_point;
private long price;
private String image;
private String category_name;
private String item_des;
public String[] getImages() {
if(image != null) {
String[] images = image.split(",");
return images;
}
return null;
}
知识兔3 商品详情页面展示
3.1 需求分析
需要在taotao-portal中调用taotao-rest发布的服务,查询商品详情。
1、商品的基本信息
2、商品的描述
3、商品的规格
当用户请求商品详情页面时,只需要把商品基本信息展示出来,为了快速响应用户。商品的描述可以延迟加载,延迟一秒钟加载。商品的规格参数按需加载,当用户点击商品规格参数的标签页此时再加载。
3.2 服务发布
需要在taotao-rest工程中发布服务
1、取商品基本信息的服务
2、取商品描述的服务
3、取商品规格的服务
需要把商品信息添加到缓存中。设置商品的过期时间,过期时间为一天。需要缓存同步。
3.2.1 取商品基本信息
Dao层
查询的表tb_item
Service层
接收商品id,根据商品id查询商品基本信息。返回一个商品的pojo,使用taotaoResult包装返回。
/**
* 商品信息管理Service
*
* @author kangy
*
*/
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private TbItemMapper itemMapper;
@Override
public TaotaoResult getItemBaseInfo(long itemId) {
// 根据商品ID查询商品信息
TbItem item = itemMapper.selectByPrimaryKey(itemId);
// 使用TaoTaoresult包装一下
return TaotaoResult.ok(item);
}
}
知识兔Controller层
接收商品id调用Service查询商品信息,返回商品对象,使用TaotaoResult包装。
Url:/rest/item/info/{itemId}
@RestController
@RequestMapping("/item")
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping("/info/{itemId}")
public TaotaoResult getItemBaseInfo(@PathVariable Long itemId) {
TaotaoResult result = itemService.getItemBaseInfo(itemId);
return result;
}
}
知识兔添加缓存逻辑
Redis的hash类型中的key是不能设置过期时间。如果还需要对key进行分类可以使用折中的方案。
Key的命名方式:
Itheima:javaee16:01=刘备
Itheima:javaee16:02=张飞
商品key的定义:
基本信息:
REDIS_ITEM_KEY:商品id:base=json
描述:
REDIS_ITEM_KEY:商品id:desc=json
规格参数:
REDIS_ITEM_KEY:商品id:param=json
/**
* 商品信息管理Service
*
* @author kangy
*
*/
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private TbItemMapper itemMapper;
@Value("${REDIS_ITEM_KEY}")
private String REDIS_ITEM_KEY;
@Value("${REDIS_ITEM_EXPIRE}")
private Integer REDIS_ITEM_EXPIRE;
@Autowired
private JedisClient jedisClient;
@Override
public TaotaoResult getItemBaseInfo(long itemId) {
try {
// 添加缓存逻辑
// 从缓存中取商品信息,商品id对应的信息
String json = jedisClient.get(REDIS_ITEM_KEY + ":" + itemId + ":base");
// 判断是否有值
// commons.lang3.StringUtils
if (!StringUtils.isBlank(json)) {
// 把json转换成java对象
TbItem item = JsonUtils.jsonToPojo(json, TbItem.class);
return TaotaoResult.ok(item);
}
} catch (Exception e) {
e.printStackTrace();
}
// 根据商品ID查询商品信息
TbItem item = itemMapper.selectByPrimaryKey(itemId);
// 使用TaoTaoresult包装一下
try {
// 把商品信息写入缓存
jedisClient.set(REDIS_ITEM_KEY + ":" + itemId + ":base", JsonUtils.objectToJson(item));
// 设置key的有效期
jedisClient.expire(REDIS_ITEM_KEY + ":" + itemId + ":base", REDIS_ITEM_EXPIRE);
} catch (Exception e) {
e.printStackTrace();
}
return TaotaoResult.ok(item);
}
}
知识兔3.2.2 取商品描述信息
根据商品id取商品描述信息。单表查询tb_item_desc。
Dao层
使用逆向工程
Service层
接收商品id根据商品id查询商品描述。返回商品描述的pojo。使用TaotaoResult包装。
需要添加缓存逻辑。
==========================================================
参考资料:
end