文章大纲
一、课程介绍
二、整合淘淘商城ssm项目
三、Mybatis分页插件PageHelper使用
四、整合测试
五、项目源码与资料下载
六、参考文章
一、课程介绍
一共14天课程
(1)第一天:电商行业的背景。淘淘商城的介绍。搭建项目工程。Svn的使用。
(2)第二天:框架的整合。后台管理商品列表的实现。分页插件。
(3)第三天:后台管理。商品添加。商品类目的选择、图片上传、富文本编辑器的使用。
(4)第四天:商品规格的实现。
(5)第五天:商城前台系统的搭建。首页商品分类的展示。Jsonp。
(6)第六天:cms系统的实现。前台大广告位的展示。
(7)第七天:cms系统添加缓存。Redis。缓存同步。
(8)第八天:搜索功能的实现。使用solr实现搜索。
(9)第九天:商品详情页面的展示。
(10)第十天:单点登录系统。Session共享。
(11)第十一天:购物车订单系统的实现。
(12)第十二天:nginx。反向代理工具。
(13)第十三天:redis集群的搭建、solr集群的搭建。系统的部署。
(14)项目总结。
二、整合淘淘商城ssm项目
1. 后台所用技术
框架:Spring + SpringMVC + Mybatis
前端:EasyUI
数据库:mysql
2. 数据库操作
2.1 创建数据库
使用Navicat for MySQL工具,连接mysql之后,新建一个数据库
导入.sql文件
在该文章的资料下载内容中找到taotao.sql文件,在数据库操作工具中选择数据库名,右键选择运转SQL文件
选择文件路径
导入数据成功
3. 整合思路
3.1 持久层
mybatis整合spring,通过spring管理SqlSessionFactory、mapper代理对象。需要mybatis和spring的整合包。
3.2 业务逻辑层
所有的实现类都放到spring容器中管理。由spring创建数据库连接池,并有spring管理实务。
3.3 表现层
Springmvc整合spring框架,由springmvc管理controller
4. 持久层整合实战
在taotao-manager-web项目的资源文件下新建SqlMapConfig.xml配置文件
在taotao-manager-web项目的资源文件下新建applicationContext-dao.xml配置文件
在taotao-manager-web项目的资源文件下新建db.properties来管理Service实现类
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/taotao?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
温馨提示:
在上面的配置文件中,我们使用了阿里巴巴封装的的数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过多年多生产环境大规模部署的严苛考验。
5. 业务逻辑层整合
在taotao-manager-web项目的资源文件下新建applicationContext-service.xml配置文件
在taotao-manager-web项目的资源文件下新建applicationContext-trans.xml配置进行事务管理
6. 表现层整合实战
在taotao-manager-web项目的资源文件下新建Springmvc.xml配置文件
在taotao-manager-web项目的web.xml中添加以下内容
taotao-manager-web
login.html
contextConfigLocation
classpath:spring/applicationContext*.xml
org.springframework.web.context.ContextLoaderListener
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
taotao-manager
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/springmvc.xml
1
taotao-manager
/
7. 整合静态页面
在文章的资料下载内容中,将css、jsp、js等资源拷贝到taotao-manager-web项目中
由于在web.xml中定义的url拦截形式为“/”表示拦截所有的url请求,包括静态资源例如css、js等。所以需要在springmvc.xml中添加资源映射标签:
在taotao-manager-mapper的pom文件下添加以下内容
src/main/java
**/*.properties
**/*.xml
false
温馨提示:如果不添加此内容,在项目编译后,target文件夹中会漏掉mapper.xml文件内容,导致项目访问失败
8. Springmvc和spring的父子容器关系
例如:
在applicationContext-service中配置:
会扫描@Controller、@Service、@Repository、@Compnent
Springmvc.Xml中不扫描。因为配置的是在spring容器中
结论:springmvc。不能提供服务,因为springmvc子容器中没有controller对象。如果没有spring容器,则可以把所有注解放在spring mvc容器中。为什么要用spring和spring mvc容器,是为了扩展性强。
三、Mybatis分页插件PageHelper使用
PageHelper目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库分页,使用前需要导入maven相关依赖
com.github.pagehelper
pagehelper
1. SqlMapConfig.xml中配置插件
2. 代码中使用分页功能
设置分页信息
//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
List list = countryMapper.selectIf(1);
获取分页信息
//分页后,实际返回的结果list类型是Page,如果想取出分页信息,需要强制转换为Page,
Page listCountry = (Page)list;
listCountry.getTotal();
分页测试
public class TestPageHelper {
@Test
public void testPageHelper() {
//创建一个spring容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
//从spring容器中获得Mapper的代理对象
TbItemMapper mapper = applicationContext.getBean(TbItemMapper.class);
//执行查询,并分页
TbItemExample example = new TbItemExample();
//分页处理
PageHelper.startPage(2, 10);
List list = mapper.selectByExample(example);
//取商品列表
for (TbItem tbItem : list) {
System.out.println(tbItem.getTitle());
}
//取分页信息
PageInfo pageInfo = new PageInfo<>(list);
long total = pageInfo.getTotal();
System.out.println("共有商品:"+ total);
}
}
四、整合测试
对应的jsp为:
item-list.jsp
请求的url:
/item/list
请求的参数:
page=1&rows=30
响应的json数据格式:
Easyui中datagrid控件要求的数据格式为:
{total:”2”,rows:[{“id”:”1”,”name”,”张三”},{“id”:”2”,”name”,”李四”}]}
1. 在taotao-common中创建EasyUIDataGridResult.java
package com.taotao.common.pojo;
import java.util.List;
/**
* 查询商品列表的数据包装
*
* Easyui中datagrid控件要求的数据格式为:
{total:”2”,rows:[{“id”:”1”,”name”,”张三”},{“id”:”2”,”name”,”李四”}]}
*/
public class EasyUIDataGridResult {
private long total;//总的商品列表数量 满足Easyui中datagrid控件要求
private List> rows;//每个列表的数据字段
public EasyUIDataGridResult(long total, List> rows) {
this.total = total;
this.rows = rows;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public List> getRows() {
return rows;
}
public void setRows(List> rows) {
this.rows = rows;
}
}
2. 在taotao-manager-mapper项目中新建TbItemMapper.java和TbItemMapper.xml
package com.taotao.mapper;
import com.taotao.pojo.TbItem;
import com.taotao.pojo.TbItemExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface TbItemMapper {
int countByExample(TbItemExample example);
int deleteByExample(TbItemExample example);
int deleteByPrimaryKey(Long id);
int insert(TbItem record);
int insertSelective(TbItem record);
List selectByExample(TbItemExample example);
TbItem selectByPrimaryKey(Long id);
int updateByExampleSelective(@Param("record") TbItem record, @Param("example") TbItemExample example);
int updateByExample(@Param("record") TbItem record, @Param("example") TbItemExample example);
int updateByPrimaryKeySelective(TbItem record);
int updateByPrimaryKey(TbItem record);
}
and ${criterion.condition}
and ${criterion.condition} #{criterion.value}
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
and ${criterion.condition}
#{listItem}
and ${criterion.condition}
and ${criterion.condition} #{criterion.value}
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
and ${criterion.condition}
#{listItem}
id, title, sell_point, price, num, barcode, image, cid, status, created, updated
delete from tb_item
where id = #{id,jdbcType=BIGINT}
delete from tb_item
insert into tb_item (id, title, sell_point,
price, num, barcode,
image, cid, status,
created, updated)
values (#{id,jdbcType=BIGINT}, #{title,jdbcType=VARCHAR}, #{sellPoint,jdbcType=VARCHAR},
#{price,jdbcType=BIGINT}, #{num,jdbcType=INTEGER}, #{barcode,jdbcType=VARCHAR},
#{image,jdbcType=VARCHAR}, #{cid,jdbcType=BIGINT}, #{status,jdbcType=TINYINT},
#{created,jdbcType=TIMESTAMP}, #{updated,jdbcType=TIMESTAMP})
insert into tb_item
id,
title,
sell_point,
price,
num,
barcode,
image,
cid,
status,
created,
updated,
#{id,jdbcType=BIGINT},
#{title,jdbcType=VARCHAR},
#{sellPoint,jdbcType=VARCHAR},
#{price,jdbcType=BIGINT},
#{num,jdbcType=INTEGER},
#{barcode,jdbcType=VARCHAR},
#{image,jdbcType=VARCHAR},
#{cid,jdbcType=BIGINT},
#{status,jdbcType=TINYINT},
#{created,jdbcType=TIMESTAMP},
#{updated,jdbcType=TIMESTAMP},
update tb_item
id = #{record.id,jdbcType=BIGINT},
title = #{record.title,jdbcType=VARCHAR},
sell_point = #{record.sellPoint,jdbcType=VARCHAR},
price = #{record.price,jdbcType=BIGINT},
num = #{record.num,jdbcType=INTEGER},
barcode = #{record.barcode,jdbcType=VARCHAR},
image = #{record.image,jdbcType=VARCHAR},
cid = #{record.cid,jdbcType=BIGINT},
status = #{record.status,jdbcType=TINYINT},
created = #{record.created,jdbcType=TIMESTAMP},
updated = #{record.updated,jdbcType=TIMESTAMP},
update tb_item
set id = #{record.id,jdbcType=BIGINT},
title = #{record.title,jdbcType=VARCHAR},
sell_point = #{record.sellPoint,jdbcType=VARCHAR},
price = #{record.price,jdbcType=BIGINT},
num = #{record.num,jdbcType=INTEGER},
barcode = #{record.barcode,jdbcType=VARCHAR},
image = #{record.image,jdbcType=VARCHAR},
cid = #{record.cid,jdbcType=BIGINT},
status = #{record.status,jdbcType=TINYINT},
created = #{record.created,jdbcType=TIMESTAMP},
updated = #{record.updated,jdbcType=TIMESTAMP}
update tb_item
title = #{title,jdbcType=VARCHAR},
sell_point = #{sellPoint,jdbcType=VARCHAR},
price = #{price,jdbcType=BIGINT},
num = #{num,jdbcType=INTEGER},
barcode = #{barcode,jdbcType=VARCHAR},
image = #{image,jdbcType=VARCHAR},
cid = #{cid,jdbcType=BIGINT},
status = #{status,jdbcType=TINYINT},
created = #{created,jdbcType=TIMESTAMP},
updated = #{updated,jdbcType=TIMESTAMP},
where id = #{id,jdbcType=BIGINT}
update tb_item
set title = #{title,jdbcType=VARCHAR},
sell_point = #{sellPoint,jdbcType=VARCHAR},
price = #{price,jdbcType=BIGINT},
num = #{num,jdbcType=INTEGER},
barcode = #{barcode,jdbcType=VARCHAR},
image = #{image,jdbcType=VARCHAR},
cid = #{cid,jdbcType=BIGINT},
status = #{status,jdbcType=TINYINT},
created = #{created,jdbcType=TIMESTAMP},
updated = #{updated,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=BIGINT}
温馨提示:
该项目很多的mapper都是使用了mybatis的逆向工程生成的,但是在实际操作中,我们应该自己编写,不依赖于工具
3. 在taotao-manager-service中创建ItemService.java和ItemServiceImpl.java
package com.taotao.service;
import com.taotao.common.pojo.EasyUIDataGridResult;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.pojo.TbItem;
import com.taotao.pojo.TbItemDesc;
/**
* 商品查询(查询单条记录、查询列表)、添加操作类
*
* @author Administrator
*
*/
public interface ItemService {
/**
* 根据商品id查询商品具体内容
*
* @param itemId 商品ID
*
* @return
*/
TbItem getItemById(long itemId);
/**
* 查询商品列表
*
* @param page 页数
*
* @param rows 每页的数目
* @return
*/
EasyUIDataGridResult getItemList(int page, int rows);
/**
* 商品添加功能实现
*
* @param item 商品详细字段
*
* @param itemDesc 商品描述
*
* @param itemParams
* @return
*/
TaotaoResult addItem(TbItem item, TbItemDesc itemDesc, String itemParams);
}
package com.taotao.service.impl;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taotao.common.pojo.EasyUIDataGridResult;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.ExceptionUtil;
import com.taotao.common.utils.IDUtils;
import com.taotao.mapper.TbItemDescMapper;
import com.taotao.mapper.TbItemMapper;
import com.taotao.mapper.TbItemParamItemMapper;
import com.taotao.pojo.TbItem;
import com.taotao.pojo.TbItemDesc;
import com.taotao.pojo.TbItemExample;
import com.taotao.pojo.TbItemExample.Criteria;
import com.taotao.pojo.TbItemParamItem;
import com.taotao.service.ItemService;
/**
* 商品查询(查询单条记录、查询列表)、添加操作类
*
* @author Administrator
*
*/
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
TbItemMapper itemMapper;//商品表操作
@Autowired
TbItemDescMapper itemDescMapper;//商品描述表 分开的目的是为了提高查询效率。
@Autowired
private TbItemParamItemMapper itemParamItemMapper;
@Override
public TbItem getItemById(long itemId) {
TbItem item = itemMapper.selectByPrimaryKey(itemId);
return item;
}
/**
* 查询商品列表
*
* @param page 页数
*
* @param rows 每页的数目
* @return
*/
@Override
public EasyUIDataGridResult getItemList(int page, int rows) {
//分页处理
PageHelper.startPage(page, rows);
//执行查询
TbItemExample example = new TbItemExample();
//添加条件
//Criteria criteria = example.createCriteria();
//criteria.andIdEqualTo(123l);
List list = itemMapper.selectByExample(example);
//取total
PageInfo pageInfo = new PageInfo(list);
long total = pageInfo.getTotal();
//创建返回值对象
EasyUIDataGridResult result = new EasyUIDataGridResult(total, list);
return result;
}
/**
* 添加商品
*/
@Override
public TaotaoResult addItem(TbItem item, TbItemDesc itemDesc, String itemParams) {
try {
//生成商品id
//可以使用redis的自增长key,在没有redis之前使用时间+随机数策略生成
Long itemId = IDUtils.genItemId();
//补全不完整的字段
item.setId(itemId);
item.setStatus((byte) 1);
Date date = new Date();
item.setCreated(date);
item.setUpdated(date);
//把数据插入到商品表
itemMapper.insert(item);
//添加商品描述
itemDesc.setItemId(itemId);
itemDesc.setCreated(date);
itemDesc.setUpdated(date);
//把数据插入到商品描述表
itemDescMapper.insert(itemDesc);
//把商品的规格参数插入到tb_item_param_item中
TbItemParamItem itemParamItem = new TbItemParamItem();
itemParamItem.setItemId(itemId);
itemParamItem.setParamData(itemParams);
itemParamItem.setCreated(date);
itemParamItem.setUpdated(date);
itemParamItemMapper.insert(itemParamItem);
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
return TaotaoResult.ok();
}
}
4. 在taotao-manager-web中创建ItemController.java
@Controller
@RequestMapping("/item")
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping("/list")
//设置相应的内容为json数据
@ResponseBody
public EasyUIResult getItemlist(@RequestParam(defaultValue="1")Integer page,
@RequestParam(defaultValue="30")Integer rows) throws Exception {
//查询商品列表
EasyUIResult result = itemService.getItemList(page, rows);
return result;
}
}
5. 运行项目
在项目运行前,如果我们的taotao-parent和taotao-common项目代码有更新时,要重新install到本地仓库中,taotao-manager是聚合的父项目,且我们再taotao-manager-web中使用了maven内置的tomcat,所以我们运行聚合项目可以直接运行taotao-manager,maven会自动识别pom、jar、war类型项目,之后完成项目启动,如果使用的是本地tomcat,也可以直接将编译的taotao-manager-web.war包放入tomcat进行运行。
项目启动完成
在浏览器中输入localhost:8080,即可看到以下内容
6. 总结
在淘淘商城中,前端网页使用的都是jsp,但是在实际的项目中,我们更多的是使用前后端分离方式,所以我们只要能将项目运行起来,然后将我们的重点放在后端技术实现上即可。
五、项目源码与资料下载
链接:https://pan.baidu.com/s/1VuRGe69_R4uqO-SRf2v-5w
提取码:pr3f
六、参考文章
http://yun.itheima.com/course?hm