美文网首页
taotao 商城 -2

taotao 商城 -2

作者: LiuliuZhang | 来源:发表于2018-01-26 14:59 被阅读0次

    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文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" ...>
        <!-- 配置数据库连接池 -->
        <!-- 加载配置文件 -->
        <context:property-placeholder location="classpath:properties/db.properties" />
        <!-- 数据库连接池 -->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
            destroy-method="close">
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="maxActive" value="10" />
            <property name="minIdle" value="5" />
        </bean>
        <!-- SqlSessionFactory -->
        <!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 数据库连接池 -->
            <property name="dataSource" ref="dataSource" />
            <!-- 加载mybatis的全局配置文件 -->
            <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
        </bean>
        <!-- Mapper映射文件的包扫描器 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.taotao.mapper" />
        </bean> 
    </beans>
    

    其中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

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"...>
            <!-- 配置包扫描器,扫描所有带@Service注解的类 -->
        <context:component-scan base-package="com.taotao.service"></context:component-scan>
    </beans>
    

    管理事务
    创建applicationContext-trans.xml

    <beans xmlns="http://www.springframework.org/schema/beans"...>
        <!-- 事务管理器 -->
        <bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!-- 数据源 -->
            <property name="dataSource" ref="dataSource" />
        </bean>
        <!-- 通知 -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <!-- 传播行为 -->
                <tx:method name="save*" propagation="REQUIRED" />
                <tx:method name="insert*" propagation="REQUIRED" />
                <tx:method name="add*" propagation="REQUIRED" />
                <tx:method name="create*" propagation="REQUIRED" />
                <tx:method name="delete*" propagation="REQUIRED" />
                <tx:method name="update*" propagation="REQUIRED" />
                <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
                <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
                <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
            </tx:attributes>
        </tx:advice>
        <!-- 切面 -->
        <aop:config>
            <aop:advisor advice-ref="txAdvice"
                pointcut="execution(* com.taotao.service.*.*(..))" />
        </aop:config>
    </beans>
    

    配置Web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        id="WebApp_ID" version="2.5">
        <display-name>taotao-manager</display-name>
        <!-- 加载spring容器 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/applicationContext*.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    </web-app>
    

    1.5 表现层整合

    taotao-manager-web项目,创建spring/springmvc.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"...>
        <!-- 配置包扫描器,扫描@Controller注解的类 -->
        <context:component-scan base-package="com.taotao.controller" />
        <!-- 配置注解驱动 -->
        <mvc:annotation-driven />
        <!-- 视图解析器 -->
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        </bean> 
    </beans>
    

    配置web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"...>
        <display-name>taotao-manager-web</display-name>
        <welcome-file-list>
            <welcome-file>login.html</welcome-file>
        </welcome-file-list>
        <!-- 解决post乱码 -->
        <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    
        <!-- springmvc的前端控制器 -->
        <servlet>
            <servlet-name>taotao-manager</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring/springmvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>taotao-manager</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
    

    2 系统间通信

    2.1 Dubbo的架构


    节点角色说明:
    Provider: 暴露服务的服务提供方。
    Consumer: 调用远程服务的服务消费方。
    Registry: 服务注册与发现的注册中心。
    Monitor: 统计服务的调用次调和调用时间的监控中心。
    Container: 服务运行容器。
    调用关系说明:
    0 服务容器负责启动,加载,运行服务提供者。
    1 服务提供者在启动时,向注册中心注册自己提供的服务。
    2 服务消费者在启动时,向注册中心订阅自己所需的服务。
    3 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    4 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    5 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    2.2 使用方法

    远程服务配置:
    在提供方增加暴露服务配置<dubbo:service>,在消费方增加引用服务配置<dubbo:reference>
    发布服务:

    <!-- 和本地服务一样实现远程服务 -->
    <bean id="xxxService" class="com.xxx.XxxServiceImpl" />
    <!-- 增加暴露远程服务配置 -->
    <dubbo:service interface="com.xxx.XxxService" ref="xxxService" />
    

    调用服务:

    <!-- 增加引用远程服务配置 -->
    <dubbo:reference id="xxxService" interface="com.xxx.XxxService" />
    <!-- 和本地服务一样使用远程服务 -->
    <bean id="xxxAction" class="com.xxx.XxxAction">
        <property name="xxxService" ref="xxxService" />
    </bean>
    

    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包冲突。

    <!-- dubbo相关 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.jboss.netty</groupId>
                        <artifactId>netty</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
            </dependency>
            <dependency>
                <groupId>com.github.sgroschupf</groupId>
                <artifactId>zkclient</artifactId>
            </dependency>
    

    在spring的配置文件中添加dubbo的约束,然后使用dubbo:service发布服务

    <?xml version="1.0" encoding="UTF-8"?>
    <beans ...
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" ...
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        ...>
    
        <context:component-scan base-package="com.taotao.service"></context:component-scan>
    
        <!-- 使用dubbo发布服务 -->
        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="taotao-manager" />
        <dubbo:registry protocol="zookeeper" address="192.168.25.154:2181" />
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880" />
        <!-- 声明需要暴露的服务接口 -->
        <dubbo:service interface="com.taotao.service.ItemService" ref="itemServiceImpl" />
    </beans>
    

    3.5 引用服务

    在taotao-manager-web工程中添加dubbo依赖的jar包,如service工程所示。
    在springmvc的配置文件中添加服务的引用

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"...>
        <context:component-scan base-package="com.taotao.controller" />
        <mvc:annotation-driven />
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        </bean>
        
        <!-- 引用dubbo服务 -->
        <dubbo:application name="taotao-manager-web"/>
        <dubbo:registry protocol="zookeeper" address="192.168.25.154:2181"/>    
        <dubbo:reference interface="com.taotao.service.ItemService" id="itemService" />
    </beans>
    

    创建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内容:

    <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 -->
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
        </build>
    

    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中添加资源映射标签:

        <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
        <mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
    

    5.2 功能分析

    商品列表页面如下



    对应的jsp为:item-list.jsp
    请求的url:/item/list
    请求的参数:page=1&rows=30

    <table class="easyui-datagrid" id="itemList" title="商品列表" 
           data-options="singleSelect:false,collapsible:true,pagination:true,url:'/item/list',method:'get',pageSize:30,toolbar:toolbar">
        <thead>
    

    启用分页会携带请求参数,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中配置拦截器插件:

    <plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->        
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>
    

    第三步:在代码中使用
    设置分页信息

        //获取第1页,10条内容,默认查询总数count
        PageHelper.startPage(1, 10);
        //紧跟着的第一个select方法会被分页
        List<Country> list = countryMapper.selectIf(1);
    

    取分页信息

    //分页后,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,
    Page<Country> listCountry = (Page<Country>)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<TbItem> list = itemMapper.selectByExample(example);
            //4.取分页信息。使用PageInfo对象取。
            PageInfo<TbItem> 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<TbItem> list = itemMapper.selectByExample(example);
            //取分页信息
            PageInfo<TbItem> pageInfo = new PageInfo<>(list);
            
            //创建返回结果对象
            EasyUIDataGridResult result = new EasyUIDataGridResult();
            result.setTotal(pageInfo.getTotal());
            result.setRows(list);       
            return result;
        }
    

    发布服务

        <!-- 声明需要暴露的服务接口 -->
        <dubbo:service interface="com.taotao.service.ItemService" ref="itemServiceImpl" timeout="300000"/>
    

    5.5 表现层

    引用服务:<dubbo:reference interface="com.taotao.service.ItemService" id="itemService" />
    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

          本文链接:https://www.haomeiwen.com/subject/dqeiaxtx.html