第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)

时间:2022-08-28 11:24:28

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。


aaarticlea/png;base64,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*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" alt="" />

需求分析

用户在首页中输入查询条件,点击查询向taotao-portal发送请求,参数就是查询的条件,页码。Taoto-portal调用taotao-search发布的服务进行搜索,参数应该是查询条件和页码及每页显示的记录数(参数可选)。Taotao-search返回一个json格式的数据(TaotaoResult包装一个SearchResult对象)。Taotao-portal接收json数据需要把json数据转换成java对象。把java对象传递给jsp页面,jsp渲染java对象得到商品查询结果页面。

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)

请求url:http://localhost:8082/search.html?q=查询条件

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)

2.3   Service层

接收两个参数1、查询条件2、页码。调用taotao-search的搜索服务。接收返回的json数据,把json转换成java对象返回SearchResult对象。

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)

@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;
}

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)

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);
} }

ItemServiceImpl

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);
} }

public class ItemServiceImpl

3.2.2   取商品描述信息

根据商品id取商品描述信息。单表查询tb_item_desc。

Dao层

使用逆向工程

Service层

接收商品id根据商品id查询商品描述。返回商品描述的pojo。使用TaotaoResult包装。

需要添加缓存逻辑。

    @Override
public TaotaoResult getItemDesc(long itemId) { // 添加缓存逻辑
try {
// 1.从缓存中取商品描述,商品id对应的信息
String json = jedisClient.get(REDIS_ITEM_KEY + ":" + itemId + ":desc");
// 判断是否有值
// commons.lang3.StringUtils
if (!StringUtils.isBlank(json)) {
// 把json转换成java对象
TbItemDesc itemDesc = JsonUtils.jsonToPojo(json, TbItemDesc.class);
return TaotaoResult.ok(itemDesc);
} } catch (Exception e) {
e.printStackTrace();
} // 2.根据商品id查询商品描述
TbItemDesc itemDesc = itemDescMapper.selectByPrimaryKey(itemId); try {
// 3.把商品描述写入缓存
jedisClient.set(REDIS_ITEM_KEY + ":" + itemId + ":desc", JsonUtils.objectToJson(itemDesc));
// 设置key的有效期
jedisClient.expire(REDIS_ITEM_KEY + ":" + itemId + ":desc", REDIS_ITEM_EXPIRE); } catch (Exception e) {
e.printStackTrace();
} // 4.使用TaoTaoresult包装一下
return TaotaoResult.ok(itemDesc);
}

3.2.3  取商品规格参数

需要从tb_item_param_item表中根据商品id取出商品的规格参数信息。返回pojo对象,使用TaotaoResult包装。

Service层

接收商品id调用mapper查询商品规格参数,返回规格参数pojo使用TaotaoResult包装。

添加缓存逻辑。

    @Override
public TaotaoResult getItemParam(long itemId) {
// 添加缓存
try {
// 添加缓存逻辑
// 从缓存中取商品信息,商品id对应的信息
String json = jedisClient.get(REDIS_ITEM_KEY + ":" + itemId + ":param");
// 判断是否有值
if (!StringUtils.isBlank(json)) {
// 把json转换成java对象
TbItemParamItem paramItem = JsonUtils.jsonToPojo(json, TbItemParamItem.class);
return TaotaoResult.ok(paramItem);
}
} catch (Exception e) {
e.printStackTrace();
}
// 根据商品id查询规格参数
// 设置查询条件
TbItemParamItemExample example = new TbItemParamItemExample();
TbItemParamItemExample.Criteria criteria = example.createCriteria();
criteria.andItemIdEqualTo(itemId);
// 执行查询
List<TbItemParamItem> list = itemParamItemMapper.selectByExampleWithBLOBs(example); if (list != null && list.size() > 0) {
TbItemParamItem paramItem = list.get(0);
try {
// 把商品信息写入缓存
jedisClient.set(REDIS_ITEM_KEY + ":" + itemId + ":param", JsonUtils.objectToJson(paramItem));
// 设置key的有效期
jedisClient.expire(REDIS_ITEM_KEY + ":" + itemId + ":param", REDIS_ITEM_EXPIRE);
} catch (Exception e) {
e.printStackTrace();
}
return TaotaoResult.ok(paramItem);
}
return TaotaoResult.build(400, "无此商品规格");
}

3.3    使用taotao-portal调用服务

需求分析

当用户访问商品详情页面时,需要加载商品基本信息。延迟加载商品描述、按需加载商品的规格参数。

商品基本信息的查询

当商品页面展示时,数据已经到位。

请求的url:/item/{itemId}.html

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)

接收商品id,调用taotao-rest的服务,查询商品的基本信息。得到一个json字符串。需要把json转换成java对象。然后在jsp页面渲染。

@Service
public class ItemServiceImpl implements ItemService {
@Value("${REST_BASE_URL}")
private String REST_BASE_URL;
@Value("${ITEM_INFO_URL}")
private String ITEM_INFO_URL; @Override
public TbItem getItemById(Long itemId) {
try {
//调用rest的服务查询商品基本信息
String json = HttpClientUtil.doGet(REST_BASE_URL + ITEM_INFO_URL + itemId);
if(!StringUtils.isBlank(json)) {
TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, ItemInfo.class);
//需要判断并强转变量类型
if(taotaoResult.getStatus() == 200) {
TbItem item = (TbItem) taotaoResult.getData();
return item;
} } } catch (Exception e) {
e.printStackTrace();
} return null;
} }

Controller层

接收页面传递过来的商品id,调用Service查询商品基本信息。传递给jsp页面。返回逻辑视图,展示商品详情页面。

@Controller
public class ItemController { @Autowired
private ItemService itemService; @RequestMapping("/item/{itemId}")
public String showItem(@PathVariable Long itemId, Model model) {
TbItem item = itemService.getItemById(itemId);
model.addAttribute("item", item); return "item"; } }

商品POJO:

package com.taotao.portal.pojo;

import com.taotao.pojo.TbItem;

public class ItemInfo extends TbItem {

    public String[] getImages() {
String image = getImage();
if (image != null) {
String[] images = image.split(",");
return images;
} return null;
} }

商品描述延迟加载

当商品详情页面加载完毕后延迟一秒钟ajax请求商品详情。

请求的URL:/item/desc/{itemId}.html

参数:商品id

返回值:商品描述信息(html片段)

Service层

接收商品id,调用taotao-rest的服务根据商品id查询商品描述信息。得到json数据。把json转换成java对象。从java对象中把商品描述取出来。返回商品描述字符串。

参数:商品id

返回值:字符串(商品描述的html片段)

    /**
* 取商品描述
*/
@Override
public String getItemDescById(Long itemId) {
try {
// 调用rest的服务查询商品描述基本信息
String json = HttpClientUtil.doGet(REST_BASE_URL + ITEM_DESC_URL + itemId);
// 转换成java对象
TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItemDesc.class); if (taotaoResult.getStatus() == 200) {
TbItemDesc itemDesc = (TbItemDesc) taotaoResult.getData();
// 取商品描述信息
String result = itemDesc.getItemDesc();
return result;
} } catch (Exception e) {
e.printStackTrace();// TODO: handle exception
} return null; }

Controller层

接收商品id,调用Service查询商品的描述信息,返回一个字符串,是商品描述的片段。需要使用@ResponseBody。

    @RequestMapping(value="/item/desc/{itemId}", produces=MediaType.TEXT_HTML_VALUE+";charset=utf-8")
@ResponseBody
public String getItemDesc(@PathVariable Long itemId) {
String string = itemService.getItemDescById(itemId);
return string;
}

商品规格参数展示

按需加载。当用户点击规格参数tab页时触发一个单击事件,在事件中异步加载规格参数信息。规格参数内容是html片段。返回字符串。

    @Override
public String getItemParam(Long itemId) {
try {
String json = HttpClientUtil.doGet(REST_BASE_URL + ITEM_PARAM_URL + itemId);
//把json转换成java对象
TaotaoResult taotaoResult = TaotaoResult.formatToList(json, TbItemParamItem.class);
if (taotaoResult.getStatus() == 200) {
TbItemParamItem itemParamItem = (TbItemParamItem) taotaoResult.getData();
String paramData = itemParamItem.getParamData();
//生成html
// 把规格参数json数据转换成java对象
List<Map> jsonList = JsonUtils.jsonToList(paramData, Map.class);
StringBuffer sb = new StringBuffer();
sb.append("<table cellpadding=\"0\" cellspacing=\"1\" width=\"100%\" border=\"0\" class=\"Ptable\">\n");
sb.append(" <tbody>\n");
for(Map m1:jsonList) {
sb.append(" <tr>\n");
sb.append(" <th class=\"tdTitle\" colspan=\"2\">"+m1.get("group")+"</th>\n");
sb.append(" </tr>\n");
List<Map> list2 = (List<Map>) m1.get("params");
for(Map m2:list2) {
sb.append(" <tr>\n");
sb.append(" <td class=\"tdTitle\">"+m2.get("k")+"</td>\n");
sb.append(" <td>"+m2.get("v")+"</td>\n");
sb.append(" </tr>\n");
}
}
sb.append(" </tbody>\n");
sb.append("</table>");
//返回html片段
return sb.toString();
} } catch (Exception e) {
e.printStackTrace();
} return "";
}

Controller层

页面的ajax请求Controller,请求的url://item/param/{itemId}.html

响应一个字符串。规格参数的片段。@ResponseBody。

@RequestMapping(value="/item/param/{itemId}", produces=MediaType.TEXT_HTML_VALUE+";charset=utf-8")
@ResponseBody
public String getItemParam(@PathVariable Long itemId) {
String string = itemService.getItemParam(itemId);
return string;
}

5.2    用户注册

5.2.1   需求分析

请求方法为post,客户端提交表单。包含

username //用户名

password //密码

phone //手机号

email //邮箱

接收参数调用mapper向user表中添加记录。返回taotaoResult对象。如果成功200失败400异常500.

5.2.2   Dao层

可以使用逆向工程生成代码

5.2.3   Service层

接收TbUser对象,补全user的属性。向tb_user表插入记录。返回taoTaoResult。

    @Override
public TaotaoResult createUser(TbUser user) {
user.setUpdated(new Date());
user.setCreated(new Date());
//spring框架的MD5工具加密
user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
userMapper.insert(user);
return TaotaoResult.ok();
}

Controller层

    //创建用户的方法
@RequestMapping("/register")
public TaotaoResult createUser(TbUser user) {
try {
TaotaoResult result = userService.createUser(user);
return result; } catch (Exception e) {
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
} }

==========================================================

参考资料:

end

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)的更多相关文章

  1. 第04项目:淘淘商城&lpar;SpringMVC&plus;Spring&plus;Mybatis&rpar; 的学习实践总结【第二天】

    淘淘商城(SpringMVC+Spring+Mybatis)  是传智播客在2015年9月份录制的,几年过去了.由于视频里课上老师敲的代码和项目笔记有些细节上存在出入,只有根据日志报错信息作出适当的调 ...

  2. 第04项目:淘淘商城&lpar;SpringMVC&plus;Spring&plus;Mybatis&rpar; 的学习实践总结【第一天】

    本人做过一年的MATLAB编程和简单维护过VB和C++的项目.是跟着网上获得的黑马的Java双元视频课来自学入门Java知识和常用框架的使用. 淘淘商城(SpringMVC+Spring+Mybati ...

  3. 第04项目:淘淘商城&lpar;SpringMVC&plus;Spring&plus;Mybatis&rpar;【第十二天】&lpar;系统架构讲解、nginx&rpar;

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  4. 第04项目:淘淘商城&lpar;SpringMVC&plus;Spring&plus;Mybatis&rpar;【第十一天】&lpar;购物车&plus;订单&rpar;

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  5. 第04项目:淘淘商城&lpar;SpringMVC&plus;Spring&plus;Mybatis&rpar;【第十天】&lpar;单点登录系统实现&rpar;

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  6. 第04项目:淘淘商城&lpar;SpringMVC&plus;Spring&plus;Mybatis&rpar;【第八天】&lpar;solr服务器搭建、搜索功能实现&rpar;

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  7. 第04项目:淘淘商城&lpar;SpringMVC&plus;Spring&plus;Mybatis&rpar;【第七天】&lpar;redis缓存&rpar;

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  8. 第04项目:淘淘商城&lpar;SpringMVC&plus;Spring&plus;Mybatis&rpar; 的学习实践总结【第六天】

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  9. 第04项目:淘淘商城&lpar;SpringMVC&plus;Spring&plus;Mybatis&rpar; 的学习实践总结【第五天】

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

随机推荐

  1. PWM波控制舵机总结

    文章转自:http://www.geek-workshop.com/thread-70-1-1.html 一.关于舵机: 舵机(英文叫Servo):它由直流电机.减速齿轮组.传感器和控制电路组成的一套 ...

  2. Sublime Text 3103 Crack 破解 注册码

    随机复制下面的几四个注册码 粘贴到sublime text 3(Build 3103)注册框 就可以了! ----------------------------------------------- ...

  3. js 中的流程控制-条件语句

    条件语句: if(exp)执行一句代码 <script> var x = 1 ; if(x == 1 ) //当if判断语句结果是true 或者 false 当判断结果等于true的时候, ...

  4. (转)&period;net开发者对android开发一周的学习体会

    春节期间,相对比较闲,上班时也没什么事情做.利用这一周的时间,简单的学习了一下移动方面的开发.主要是针对android,其实我对IOS更感兴趣 (因为我用iphone),苦于暂时没有苹果电脑,只能把它 ...

  5. About Cheating and Plagiarism

    我先描述一下此次事件的具体经过.昨天3月15号的晚上十点,是第四次作业的deadline.在15号之前,只有五位同学提交了作业,而在临近deadline的这几个小时内密密麻麻地提交了二十多份作业.和第 ...

  6. &lbrack;C&num;&rsqb;使用Quartz&period;NET来创建定时工作任务

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...

  7. python中模块,包,库的概念

    模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...

  8. C&num; 获取版本号

    Text = Text + " [V." + Assembly.GetExecutingAssembly().GetName().Version + "]";

  9. JS自定义鼠标右击菜单

    自定义鼠标右击菜单要素: 禁止页面默认右击事件 设置右击菜单的样式以及菜单出现的位置(通过捕获鼠标点击位置来确定菜单的位置) 鼠标在指定控件(区域)上右击时显示菜单(默认菜单隐藏,点击鼠标右键时显示) ...

  10. 给大家推荐一个C&num;下的Ribbon风格的Forms实现示例-含源码

    C#下的Ribbon风格的Forms实现示例:源码下载地址