taotao 商城 -2

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文件夹,添加相应的源码项目


你可能感兴趣的:(taotao 商城 -2)