• springboot-dubbo and Thymeleaf使用


    SpringBoot集成Dubbo

    使用SpringBoot搭建基于SSM的分布式框架。按照dubbo官方的推荐,一个基于dubbo的微服务项目至少包含三个模块。接口模块,生产者模块,消费者模块。

    1 创建接口模块

    1.1 基于 Maven 创建服务接口(mycinema-interface)

    指定打包方式和编译级别:

        <packaging>jarpackaging>
        <properties>
            <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
            <maven.compiler.source>1.8maven.compiler.source>
            <maven.compiler.target>1.8maven.compiler.target>
        properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2 创建服务提供者模块

    2.1 创建基于SpringBoot的提供者web项目,提供数据服务

    2.2 添加依赖:web、mybatis、mysql、dubbo 以及 zookeeper 等核心依赖

    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-webartifactId>
    		dependency>
            <dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-devtoolsartifactId>
    			<scope>runtimescope>
    			<optional>trueoptional>
    		dependency>
    		<dependency>
    			<groupId>org.mybatis.spring.bootgroupId>
    			<artifactId>mybatis-spring-boot-starterartifactId>
    			<version>2.2.0version>
    		dependency>
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-testartifactId>
    			<scope>testscope>
    		dependency>
    		<dependency>
    			<groupId>mysqlgroupId>
    			<artifactId>mysql-connector-javaartifactId>
    			<scope>runtimescope>
    		dependency>
    
    		
    		<dependency>
    			<groupId>com.alibaba.spring.bootgroupId>
    			<artifactId>dubbo-spring-boot-starterartifactId>
    			<version>2.0.0version>
    		dependency>
    		
    		<dependency>
    			<groupId>com.101tecgroupId>
    			<artifactId>zkclientartifactId>
    			<version>0.11version>
    		dependency>
    
    		
    		<dependency>
    			<groupId>com.bjpowernodegroupId>
    			<artifactId>mycinema-interfaceartifactId>
    			<version>1.0.0version>
    		dependency>
    	dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    2.3 配置application.properties/yml,设置数据库连接,dubbo服务等信息

    #数据库信息
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/mycinema?serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=123456
    
    #设置内嵌 Tomcat 端口号
    server.port=8090
    #设置上下文根
    server.servlet.context-path=/
    
    #配置 dubbo 的服务提供者信息
    #服务提供者应用名称(必须写,且不能重复)
    spring.application.name=mycinema-provider
    #设置当前工程为服务提供者
    spring.dubbo.server=true
    #设置注册中心
    spring.dubbo.registry=zookeeper://localhost:2181
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.4 使用逆向工程生成实体类,数据访问接口,以及sql-mapper映射文件

    (1)在pom的<plugins>中添加MyBatis逆向工程的插件

              
                <plugin>
                    <groupId>org.mybatis.generatorgroupId>
                    <artifactId>mybatis-generator-maven-pluginartifactId>
                    <version>1.3.7version>
                    <configuration>
                        
                        <configurationFile>GeneratorMapper.xmlconfigurationFile>
                        <verbose>trueverbose>
                        <overwrite>trueoverwrite>
                    configuration>
                plugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (2)在项目的根目录下面添加插件的配置文件GeneratorMapper.xml,内容如下:

    
    DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
    <generatorConfiguration>
        
        <classPathEntry location="C:\repository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar"/>
        
        <context id="tables" targetRuntime="MyBatis3">
    
            
            <commentGenerator>
                <property name="suppressAllComments" value="true" />
            commentGenerator>
    
            
            <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                            connectionURL="jdbc:mysql://127.0.0.1:3306/mycinema"
                            userId="root"
                            password="">
            jdbcConnection>
    
            
            <javaModelGenerator targetPackage="com.bjpowernode.model"
                                targetProject="E:\mycinema-interface\src\main\java">
                <property name="enableSubPackages" value="false" />
                <property name="trimStrings" value="false" />
            javaModelGenerator>
    
            
            <sqlMapGenerator targetPackage="com.bjpowernode.mapper"                targetProject="src/main/java">
                <property name="enableSubPackages" value="false" />  
            sqlMapGenerator>
    
            
            <javaClientGenerator type="XMLMAPPER" targetPackage="com.bjpowernode.mapper"    targetProject="src/main/java">
                <property name="enableSubPackages" value="false" />
            javaClientGenerator>
    
            
            <table tableName="category" domainObjectName="Category"
                   enableCountByExample="false"
                   enableUpdateByExample="false"
                   enableDeleteByExample="false"
                   enableSelectByExample="false"
                   selectByExampleQueryId="false"/>
            <table tableName="movie" domainObjectName="Movie"
                   enableCountByExample="false"
                   enableUpdateByExample="false"
                   enableDeleteByExample="false"
                   enableSelectByExample="false"
                   selectByExampleQueryId="false"/>
    
            <table tableName="user" domainObjectName="User"
                   enableCountByExample="false"
                   enableUpdateByExample="false"
                   enableDeleteByExample="false"
                   enableSelectByExample="false"
                   selectByExampleQueryId="false"/>
        context>
    generatorConfiguration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    (3)在maven窗口中执行插件,生成代码

    注意:执行插件时,会解析pom文件中的所有依赖,已经导入了 mycinema-interface 的依赖,所以会去本地仓库查找这个包,找不到就会报错。解决方法如下:

    ​ 1)可以先注释这个包依赖,等生成代码之后再添加

    ​ 2)将mycinema-interface项目打包安装到本地仓库mvn install

    ​ 3)将生成的实体类都实现序列化接口,用于远程传输数据

    public class Movie implements Serializable { }
    
    • 1

    ​ 4)插件生成的Mapper.xml文件和Mapper接口在同一个包下,但是idea不会编译,需要手动指定资源文件,修改

    提供者mycinema-provider的pom.xml文件,手动指定资源路径

           		<resources>
                    <resource>
                        <directory>src/main/javadirectory>
                        <includes>
                            <include>**/*.xmlinclude>
                        includes>
                    resource>
                resources>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (4)在服务接口工程mycinema-interface工程中添加接口内容

    public interface CategoryService {
        List<Category> getAll();
        Category getById(Integer id);
    }
    public interface MovieService {
        List<Movie> getAll();
        Movie getById(Integer id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (5)在提供者工程mycinema-provider中创建业务的实现包service.impl实现业务接口,并添加业务注解

    @Component,dubbo服务注解@Service

    @Component
    @Service(interfaceClass = MovieService.class,version = "1.0.0",timeout = 15000)
    public class MovieServiceImpl implements MovieService {    
        @Autowired    
        private MovieMapper movieMapper;    
        @Override    
        public List<Movie> queryAll() {        
            return movieMapper.selectAll();    
        }    
        @Override    
        public Movie queryById(Integer id) {        
            return movieMapper.selectByPrimaryKey(id);    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    @Component
    @Service(interfaceClass = CategoryService.class,timeout = 15000,version = "1.0.0")
    public class CategoryServiceImpl implements CategoryService {    
        @Autowired    
        private CategoryMapper categoryMapper;    
        @Override    
        public List<Category> queryAll() {        
            return categoryMapper.selectAll();    
        }    
        @Override    
        public Category queryById(Integer id) {        
            return categoryMapper.selectByPrimaryKey(id);    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.5 开启Dubbo配置——@EnableDubboConfiguration

    在启动类上开启dubbo配置支持注解(@EnableDubboConfiguration

    @SpringBootApplication
    @MapperScan("com.bjpowernode.mapper") //扫描数据访问接口
    @EnableDubboConfiguration  			//开启dubbo注解支持
    public class MycinemaProviderApplication {    
        public static void main(String[] args) {        
            SpringApplication.run(MycinemaProviderApplication.class, args);    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    开启zooker服务,启动提供者项目

    3.创建服务消费者项目

    3.1 创建基于SpringBoot的web项目,添加以下必要的依赖

    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-webartifactId>
    		dependency>
    
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-devtoolsartifactId>
    			<scope>runtimescope>
    			<optional>trueoptional>
    		dependency>
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-testartifactId>
    			<scope>testscope>
    		dependency>
    
    		
    		<dependency>
    			<groupId>com.alibaba.spring.bootgroupId>
    			<artifactId>dubbo-spring-boot-starterartifactId>
    			<version>2.0.0version>
    		dependency>
    		
    		<dependency>
    			<groupId>com.101tecgroupId>
    			<artifactId>zkclientartifactId>
    			<version>0.10version>
    		dependency>
    		
    		<dependency>
    			<groupId>com.bjpowernodegroupId>
    			<artifactId>mycinema-interfaceartifactId>
    			<version>1.0.0version>
    		dependency>
    	dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    3.2 修改application.properties添加配置信息

    #设置内嵌 Tomcat 端口号
    server.port=8080
    #设置上下文根
    server.servlet.context-path=/
    #设置 dubbo 配置
    #设置服务消费者名称
    spring.application.name=mycinema-consumer
    #配置 dubbo 注册中心
    spring.dubbo.registry=zookeeper://localhost:2181
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.3 添加Controller,依赖服务提供者提供的服务信息

    @Controller
    public class IndexController {
        //组件由dubbo提供,使用@Reference注解
        @Reference(interfaceClass = MovieService.class,version = "1.0.0")
        private MovieService movieService;
    
        @RequestMapping("/api/movies")
        @ResponseBody
        public List<Movie> findAqueryAllll(){
            return movieService.queryAll();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.4 开启Dubbo配置——@EnableDubboConfiguration

    @EnableDubboConfiguration
    @SpringBootApplication
    public class WebApplication {
    	public static void main(String[] args) {
    		SpringApplication.run(WebApplication.class, args);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.5 测试

    开启zookeeper 再启动provide和comsumer
    在这里插入图片描述

    3.6 集成Thymeleaf实现界面

    (1)添加Thymeleaf坐标

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-thymeleafartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    (2)添加视图配置

    spring.thymeleaf.suffix=.html
    spring.thymeleaf.prefix=classpath:/templates/
    
    • 1
    • 2

    (3)编写控制器

      	@GetMapping("/index")
        public String index(Model model){
            model.addAttribute("movies",movieService.getAll());
            return "index";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (4)在templates下面添加index.html

    DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
    head>
    <body>
        <table>
            <tr><td>编号td><td>名称td><td>导演td><td>日期td>tr>
            <tr th:each="movie:${movies}">
                <td th:text="${movie.id}">td>
                <td th:text="${movie.title}">td>
                <td th:text="${movie.director}">td>
                <td th:text="${movie.datereleased}">td>
            tr>
        table>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    python_多进程、多线程
    【WEEK15】 【DAY2】【DAY3】邮件任务【中文版】
    高等数学(第七版)同济大学 习题7-2 个人解答
    Windows右键菜单
    Vue路由重定向
    微服务中的鉴权该怎么做?
    程序本地能运行,服务器上不能(以flink为例)
    【OpenCV 例程300篇】234. 特征提取之主成分分析(PCA)
    Shel简介入门
    2023最新PS(photoshop)Win+Mac免费下载安装包及教程内置AI绘画-网盘下载
  • 原文地址:https://blog.csdn.net/qq_51307593/article/details/127433664