1 SSM框架整合
1.1 Mybatis逆向工程
使用mybatis官方提供的mybatis-generator生成pojo、mapper接口及映射文件。
并且将pojo放到toatao-manager-pojo工程中。将mapper接口及映射文件放到taotao-manager-dao工程中。
1.2 整合思路
DAO层:
Dao层有pojo及dao两个项目,mybatis整合spring,通过spring管理SqlSessionFactory、mapper代理对象。需要mybatis和spring的整合包。
Service层:
Service层有interface及service两个项目,所有的service实现类都放到spring容器中管理。由spring创建数据库连接池,并有spring管理实务。
表现层:
Springmvc框架,由springmvc管理controller。
1.3 Dao整合
Service项目中创建mybatis/SqlMapConfig.xml配置文件。
Spring整合mybatis
创建spring/applicationContext-dao.xml文件
其中properties/db.properties文件保存数据库链接信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/taotao?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
1.4 Service整合
管理Service
创建applicationContext-service.xml
管理事务
创建applicationContext-trans.xml
配置Web.xml
taotao-manager
contextConfigLocation
classpath:spring/applicationContext*.xml
org.springframework.web.context.ContextLoaderListener
1.5 表现层整合
taotao-manager-web项目,创建spring/springmvc.xml文件
配置web.xml
taotao-manager-web
login.html
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
/
2 系统间通信
2.1 Dubbo的架构
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0 服务容器负责启动,加载,运行服务提供者。
1 服务提供者在启动时,向注册中心注册自己提供的服务。
2 服务消费者在启动时,向注册中心订阅自己所需的服务。
3 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
2.2 使用方法
远程服务配置:
在提供方增加暴露服务配置
,在消费方增加引用服务配置
。
发布服务:
调用服务:
2.3 注册中心
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。使用dubbo-2.3.3以上版本,建议使用zookeeper注册中心。
Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用
Zookeeper的安装:
第一步:安装jdk
第二步:解压缩zookeeper压缩包 tar -zxvf zookeeper-3.4.6.tar.gz
,在下面创建data目录。
第三步:将conf文件夹下zoo_sample.cfg复制一份,改名为zoo.cfgmv zoo_sample.cfg zoo.cfg
第四步:编辑zoo.cfg,修改配置dataDir属性,指定一个真实目录dataDir=/root/zookeeper-3.4.6/data
第五步:
启动zookeeper:bin/zkServer.sh start
关闭zookeeper:bin/zkServer.sh stop
查看zookeeper状态:bin/zkServer.sh status
注意要关闭linux的防火墙。
3 整合测试
3.1 需求分析
根据商品id查询商品信息,并将商品信息使用json数据返回。
请求的url:/item/{itemId}
参数:商品id,从请求的url中获得
返回值:TbItem对象,逆向工程生成的pojo(响应json数据)
3.2 Dao层
根据商品id查询商品信息,单表查询可以使用逆向工程生成的代码。
3.3 Service层
在interface工程中创建一个ItemService接口,在Service工程中创建一个itemSeviceImpl的实现类。
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private TbItemMapper itemMapper;
@Override
public TbItem getItemById(long itemId) {
TbItem tbItem = itemMapper.selectByPrimaryKey(itemId);
return tbItem;
}
}
3.4 发布服务
在taotao-manager-Service工程中添加dubbo依赖的jar包,通过exclusion解决jar包冲突。
com.alibaba
dubbo
org.springframework
spring
org.jboss.netty
netty
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
在spring的配置文件中添加dubbo的约束,然后使用dubbo:service发布服务
3.5 引用服务
在taotao-manager-web工程中添加dubbo依赖的jar包,如service工程所示。
在springmvc的配置文件中添加服务的引用
创建Controller,ItemService为前面dubbo暴露的service
@Controller
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping("/item/{itemId}")
@ResponseBody
public TbItem getItemById(@PathVariable Long itemId) {
//根据商品id查询商品信息
TbItem tbItem = itemService.getItemById(itemId);
return tbItem;
}
}
3.6 解决mapper映射文件不发布问题
由于引用的是target文件夹,而xml映射文件并没有编译到target文件夹中,因此报错。在taotao-manager-dao工程的pom文件中添加如下resource内容:
src/main/java
**/*.properties
**/*.xml
false
4 Dubbo监控中心
1 安装tomcat,然后部署监控中心dubbo-admin-2.5.4.war即可cp dubbo-admin-2.5.4.war apache-tomcat-7.0.47/webapps/dubbo-admin.war
。
2 启动tomcat,访问http://192.168.25.167:8080/dubbo-admin/
,用户名:root,密码:root
3 如果监控中心和注册中心在同一台服务器上,可以不需要任何配置。如果不在同一台服务器,需要修改配置文件:/root/apache-tomcat-7.0.47/webapps/dubbo-admin/WEB-INF/dubbo.properties
5 商品列表查询功能实现
5.1 展示后台首页
请求的url:/
参数:无
返回值:逻辑视图String
创建PageController
@Controller
public class PageController {
@RequestMapping("/")
public String showIndex() {
return "index";
}
@RequestMapping("/{page}")
public String showPage(@PathVariable String page) {
return page;
}
}
由于在web.xml中定义的url拦截形式为“/”表示拦截所有的url请求,包括静态资源例如css、js等。所以需要在springmvc.xml中添加资源映射标签:
5.2 功能分析
商品列表页面如下
对应的jsp为:item-list.jsp
请求的url:/item/list
请求的参数:page=1&rows=30
启用分页会携带请求参数,pageSize
即为rows参数。
Easyui中datagrid控件要求的数据格式为:{total:”2”,rows:[{“id”:”1”,”name”:”张三”},{“id”:”2”,”name”:”李四”}]}
响应的json数据格式EasyUIResult
在common工程中创建POJO EasyUIDataGridResult,包括total rows两个参数,由于涉及网络传输,要实现序列化接口。
public class EasyUIDataGridResult implements Serializable{
private long total;
private List 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;
}
}
分页处理
逆向工程生成的代码是不支持分页处理的,如果想进行分页需要自己编写mapper,这样就失去逆向工程的意义了。为了提高开发效率可以使用mybatis的分页插件PageHelper。
5.3 分页插件PageHelper
Mybatis分页插件 - PageHelper说明
如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件。
该插件目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库分页。
使用方法
第一步:把PageHelper依赖的jar包添加到工程中。官方提供的代码对逆向工程支持的不好,使用参考资料中的pagehelper-fix。
第二步:在service项目的Mybatis配置xml中配置拦截器插件:
第三步:在代码中使用
设置分页信息
//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
List list = countryMapper.selectIf(1);
取分页信息
//分页后,实际返回的结果list类型是Page,如果想取出分页信息,需要强制转换为Page,
Page listCountry = (Page)list;
listCountry.getTotal();
//或者用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);
分页测试
public class TestPageHelper {
@Test
public void testPageHelper() throws Exception {
//1.在mybatis的配置文件中配置分页插件
//2.在执行查询之前配置分页条件。使用PageHelper的静态方法
PageHelper.startPage(1, 10);
//3.执行查询
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-dao.xml");
TbItemMapper itemMapper = applicationContext.getBean(TbItemMapper.class);
//创建Example对象
TbItemExample example = new TbItemExample();
// Criteria criteria = example.createCriteria();
List list = itemMapper.selectByExample(example);
//4.取分页信息。使用PageInfo对象取。
PageInfo pageInfo = new PageInfo<>(list);
System.out.println("总记录数:" + pageInfo.getTotal());
System.out.println("总记页数:" + pageInfo.getPages());
System.out.println("返回的记录数:" + list.size());
}
}
5.4 Service层
参数:int page ,int rows
业务逻辑:查询所有商品列表,要进行分页处理。
返回值:EasyUIDataGridResult
在ItemServiceImpl中实现getItemList方法
@Override
public EasyUIDataGridResult getItemList(int page, int rows) {
//设置分页信息
PageHelper.startPage(page, rows);
//执行查询
TbItemExample example = new TbItemExample();
List list = itemMapper.selectByExample(example);
//取分页信息
PageInfo pageInfo = new PageInfo<>(list);
//创建返回结果对象
EasyUIDataGridResult result = new EasyUIDataGridResult();
result.setTotal(pageInfo.getTotal());
result.setRows(list);
return result;
}
发布服务
5.5 表现层
引用服务:
1、初始化表格请求的url:/item/list
2、Datagrid默认请求参数:
1、page:当前的页码,从1开始。
2、rows:每页显示的记录数。
3、响应的数据:json数据。EasyUIDataGridResult
在ItemController中实现getItemList方法
@RequestMapping("/item/list")
@ResponseBody
public EasyUIDataGridResult getItemList(Integer page, Integer rows) {
EasyUIDataGridResult result = itemService.getItemList(page, rows);
return result;
}
Debug设置源代码:删除default文件夹,添加相应的源码项目