zoukankan      html  css  js  c++  java
  • SSM+dubbo+zookeeper实现基本的增删改查

    前言

    本文中使用的项目是由上一篇文章中的项目改造而来。具体来说,就是引入了dubbo和zookeeper,并将Controller层与service层dao层进行了拆分,使双方通过service接口远程调用的形式,再次实现了基本的增删改查。

    上一篇文章:http://www.cnblogs.com/hanzx/p/10016468.html

    名词解释

    dubbo:dubbo是阿里开源的一款优秀的java RPC框架,可以配合spring和zookeeper使用。它提供了这些功能:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

    zookeeper:zookeeper 是由雅虎创建的一个开源的分布式协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它提供了这些功能:配置维护、域名服务、分布式同步、组服务等。

    zookeeper的windows版安装方法

    https://blog.csdn.net/weixin_37715446/article/details/78642052

    程序结构

    interface:

    provider:

    consumer:

    程序源码

    interface

    pom.xml

    没添加什么东西,所以不贴出来了

    UserModel

     1 package org.hanzx.model;
     2 
     3 
     4 import java.io.Serializable;
     5 
     6 public class UserModel implements Serializable{
     7 
     8     private Integer id;
     9 
    10     private String name;
    11 
    12     private Integer age;
    13 
    14     private String password;
    15 
    16     public Integer getId() {
    17         return id;
    18     }
    19 
    20     public void setId(Integer id) {
    21         this.id = id;
    22     }
    23 
    24     public String getName() {
    25         return name;
    26     }
    27 
    28     public void setName(String name) {
    29         this.name = name;
    30     }
    31 
    32     public Integer getAge() {
    33         return age;
    34     }
    35 
    36     public void setAge(Integer age) {
    37         this.age = age;
    38     }
    39 
    40     public String getPassword() {
    41         return password;
    42     }
    43 
    44     public void setPassword(String password) {
    45         this.password = password;
    46     }
    47 }
    View Code

    UserService

     1 package org.hanzx.service;
     2 
     3 
     4 import org.hanzx.model.UserModel;
     5 
     6 import java.util.List;
     7 
     8 public interface UserService {
     9 
    10     List<UserModel> getAllUser();
    11 
    12     void addUser(UserModel userModel);
    13 
    14     UserModel getUserById(Integer id);
    15 
    16     void updateUser(UserModel userModel);
    17 
    18     void deleteUser(Integer[] ids);
    19 }
    View Code

    provider

    pom.xml

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <project xmlns="http://maven.apache.org/POM/4.0.0"
      3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      5     <parent>
      6         <artifactId>web_ssm_dubbo</artifactId>
      7         <groupId>org.hanzx</groupId>
      8         <version>1.0-SNAPSHOT</version>
      9     </parent>
     10     <modelVersion>4.0.0</modelVersion>
     11 
     12     <artifactId>provider</artifactId>
     13 
     14     <properties>
     15         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     16         <spring.version>4.2.5.RELEASE</spring.version>
     17         <mybatis.version>3.2.1</mybatis.version>
     18         <slf4j.version>1.6.6</slf4j.version>
     19         <log4j.version>1.2.12</log4j.version>
     20         <mysql.version>5.1.35</mysql.version>
     21     </properties>
     22 
     23     <dependencies>
     24         <dependency>
     25             <groupId>org.hanzx</groupId>
     26             <artifactId>interface</artifactId>
     27             <version>1.0-SNAPSHOT</version>
     28         </dependency>
     29 
     30         <dependency>
     31             <groupId>junit</groupId>
     32             <artifactId>junit</artifactId>
     33             <version>4.11</version>
     34             <scope>test</scope>
     35         </dependency>
     36         <!-- 添加Spring依赖 -->
     37         <dependency>
     38             <groupId>org.springframework</groupId>
     39             <artifactId>spring-core</artifactId>
     40             <version>${spring.version}</version>
     41         </dependency>
     42         <dependency>
     43             <groupId>org.springframework</groupId>
     44             <artifactId>spring-context</artifactId>
     45             <version>${spring.version}</version>
     46         </dependency>
     47         <dependency>
     48             <groupId>org.springframework</groupId>
     49             <artifactId>spring-context-support</artifactId>
     50             <version>${spring.version}</version>
     51         </dependency>
     52         <dependency>
     53             <groupId>org.springframework</groupId>
     54             <artifactId>spring-aop</artifactId>
     55             <version>${spring.version}</version>
     56         </dependency>
     57         <dependency>
     58             <groupId>org.springframework</groupId>
     59             <artifactId>spring-aspects</artifactId>
     60             <version>${spring.version}</version>
     61         </dependency>
     62         <dependency>
     63             <groupId>org.springframework</groupId>
     64             <artifactId>spring-tx</artifactId>
     65             <version>${spring.version}</version>
     66         </dependency>
     67         <dependency>
     68             <groupId>org.springframework</groupId>
     69             <artifactId>spring-jdbc</artifactId>
     70             <version>${spring.version}</version>
     71         </dependency>
     72         <!--spring单元测试依赖 -->
     73         <dependency>
     74             <groupId>org.springframework</groupId>
     75             <artifactId>spring-test</artifactId>
     76             <version>${spring.version}</version>
     77             <scope>test</scope>
     78         </dependency>
     79         <!-- mysql驱动包 -->
     80         <dependency>
     81             <groupId>mysql</groupId>
     82             <artifactId>mysql-connector-java</artifactId>
     83             <version>${mysql.version}</version>
     84         </dependency>
     85 
     86         <!-- alibaba data source 相关jar包-->
     87         <dependency>
     88             <groupId>com.alibaba</groupId>
     89             <artifactId>druid</artifactId>
     90             <version>0.2.23</version>
     91         </dependency>
     92         <!-- logback start -->
     93         <dependency>
     94             <groupId>log4j</groupId>
     95             <artifactId>log4j</artifactId>
     96             <version>${log4j.version}</version>
     97         </dependency>
     98         <dependency>
     99             <groupId>org.slf4j</groupId>
    100             <artifactId>slf4j-api</artifactId>
    101             <version>${slf4j.version}</version>
    102         </dependency>
    103         <dependency>
    104             <groupId>ch.qos.logback</groupId>
    105             <artifactId>logback-classic</artifactId>
    106             <version>1.1.2</version>
    107         </dependency>
    108         <dependency>
    109             <groupId>ch.qos.logback</groupId>
    110             <artifactId>logback-core</artifactId>
    111             <version>1.1.2</version>
    112         </dependency>
    113         <dependency>
    114             <groupId>org.logback-extensions</groupId>
    115             <artifactId>logback-ext-spring</artifactId>
    116             <version>0.1.1</version>
    117         </dependency>
    118 
    119         <!--mybatis依赖 -->
    120         <dependency>
    121             <groupId>org.mybatis</groupId>
    122             <artifactId>mybatis</artifactId>
    123             <version>${mybatis.version}</version>
    124         </dependency>
    125 
    126         <!-- mybatis/spring包 -->
    127         <dependency>
    128             <groupId>org.mybatis</groupId>
    129             <artifactId>mybatis-spring</artifactId>
    130             <version>1.2.0</version>
    131         </dependency>
    132 
    133         <!--dubbo-->
    134         <dependency>
    135             <groupId>com.alibaba</groupId>
    136             <artifactId>dubbo</artifactId>
    137             <version>2.5.7</version>
    138         </dependency>
    139         <dependency>
    140             <groupId>org.apache.zookeeper</groupId>
    141             <artifactId>zookeeper</artifactId>
    142             <version>3.5.4-beta</version>
    143             <type>pom</type>
    144         </dependency>
    145         <dependency>
    146             <groupId>com.101tec</groupId>
    147             <artifactId>zkclient</artifactId>
    148             <version>0.10</version>
    149         </dependency>
    150         <dependency>
    151             <groupId>org.apache.curator</groupId>
    152             <artifactId>curator-framework</artifactId>
    153             <version>2.7.1</version>
    154         </dependency>
    155     </dependencies>
    156 
    157 
    158 </project>
    View Code

    applicationContext.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:context="http://www.springframework.org/schema/context"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
     6 
     7     <!-- 1.配置jdbc文件 -->
     8     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
     9         <property name="locations" value="classpath:jdbc.properties"/>
    10     </bean>
    11     <!-- 2.扫描的包路径 --><!--使用<context:component-scan/> 可以不再配置<context:annotation-config/> -->
    12     <context:component-scan base-package="org.hanzx"/>
    13     <!--6 容器自动扫描IOC组件  -->
    14     <!--<context:component-scan base-package="org.hanzx.model"/>-->
    15     <import resource="spring-mybatis.xml"/>
    16     <import resource="spring-dubbo.xml"/>
    17 </beans>
    View Code

    jdbc.properties

    1 jdbc.driver=com.mysql.jdbc.Driver
    2 jdbc.url=jdbc:mysql://localhost:3306/web_test?useUnicode=true&characterEncoding=utf8&useSSL=false
    3 jdbc.username=root
    4 jdbc.password=root
    View Code

    log4j2.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 
     3 <Configuration status="warn">
     4     <Appenders>
     5         <Console name="Console" target="SYSTEM_OUT">
     6             <PatternLayout pattern="%m%n" />
     7         </Console>
     8     </Appenders>
     9     <Loggers>
    10         <Root level="INFO">
    11             <AppenderRef ref="Console" />
    12         </Root>
    13     </Loggers>
    14 </Configuration>
    View Code

    logback.xml

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <configuration>
      3     <!-- 尽量别用绝对路径,如果带参数不同容器路径解释可能不同,以下配置参数在pom.xml里 -->
      4     <property name="log.root.level" value="${log.root.level}" /> <!-- 日志级别 -->
      5     <property name="log.other.level" value="${log.other.level}" /> <!-- 其他日志级别 -->
      6     <property name="log.base" value="${log.base}" /> <!-- 日志路径,这里是相对路径,web项目eclipse下会输出到eclipse的安装目录下,如果部署到linux上的tomcat下,会输出到tomcat/bin目录 下 -->
      7     <property name="log.moduleName" value="${log.moduleName}" />  <!-- 模块名称, 影响日志配置名,日志文件名 -->
      8     <property name="log.max.size" value="100MB" /> <!-- 日志文件大小,超过这个大小将被压缩 -->
      9 
     10     <!--控制台输出 -->
     11     <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
     12         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
     13             <Pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method():%L -%msg%n</Pattern>
     14         </encoder>
     15     </appender>
     16 
     17     <!-- 用来保存输出所有级别的日志 -->
     18     <appender name="file.all" class="ch.qos.logback.core.rolling.RollingFileAppender">
     19         <File>${log.base}/${log.moduleName}.log</File><!-- 设置日志不超过${log.max.size}时的保存路径,注意如果
     20             是web项目会保存到Tomcat的bin目录 下 -->
     21         <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。 -->
     22         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     23             <FileNamePattern>${log.base}/archive/${log.moduleName}_all_%d{yyyy-MM-dd}.%i.log.zip
     24             </FileNamePattern>
     25             <!-- 文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份) -->
     26             <timeBasedFileNamingAndTriggeringPolicy
     27                     class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
     28                 <maxFileSize>${log.max.size}</maxFileSize>
     29             </timeBasedFileNamingAndTriggeringPolicy>
     30         </rollingPolicy>
     31         <!-- 日志输出的文件的格式 -->
     32         <layout class="ch.qos.logback.classic.PatternLayout">
     33             <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method():%L -%msg%n</pattern>
     34         </layout>
     35     </appender>
     36 
     37     <!-- 这也是用来保存输出所有级别的日志 -->
     38     <appender name="file.all.other" class="ch.qos.logback.core.rolling.RollingFileAppender">
     39         <File>${log.base}/${log.moduleName}_other.log</File>
     40         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     41             <FileNamePattern>${log.base}/archive/${log.moduleName}_other_%d{yyyy-MM-dd}.%i.log.zip
     42             </FileNamePattern>
     43             <timeBasedFileNamingAndTriggeringPolicy
     44                     class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
     45                 <maxFileSize>${log.max.size}</maxFileSize>
     46             </timeBasedFileNamingAndTriggeringPolicy>
     47         </rollingPolicy>
     48         <layout class="ch.qos.logback.classic.PatternLayout">
     49             <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method():%L -%msg%n</pattern>
     50         </layout>
     51     </appender>
     52 
     53     <!-- 只用保存输出error级别的日志 -->
     54     <appender name="file.error"
     55               class="ch.qos.logback.core.rolling.RollingFileAppender">
     56         <File>${log.base}/${log.moduleName}_err.log</File>
     57         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     58             <FileNamePattern>${log.base}/archive/${log.moduleName}_err_%d{yyyy-MM-dd}.%i.log.zip
     59             </FileNamePattern>
     60             <timeBasedFileNamingAndTriggeringPolicy
     61                     class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
     62                 <maxFileSize>${log.max.size}</maxFileSize>
     63             </timeBasedFileNamingAndTriggeringPolicy>
     64         </rollingPolicy>
     65         <layout class="ch.qos.logback.classic.PatternLayout">
     66             <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method():%L - %msg%n</pattern>
     67         </layout>
     68         <!-- 下面为配置只输出error级别的日志 -->
     69         <filter class="ch.qos.logback.classic.filter.LevelFilter">
     70             <level>ERROR</level>
     71             <onMatch>ACCEPT</onMatch>
     72             <onMismatch>DENY</onMismatch>
     73         </filter>
     74     </appender>
     75 
     76     <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
     77     <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
     78     <!-- 添加附加的appender,最多只能添加一个 -->
     79     <appender name="file.async" class="ch.qos.logback.classic.AsyncAppender">
     80         <discardingThreshold>0</discardingThreshold>
     81         <queueSize>256</queueSize>
     82         <includeCallerData>true</includeCallerData>
     83         <appender-ref ref="file.all" />
     84     </appender>
     85 
     86     <appender name="file.async.other" class="ch.qos.logback.classic.AsyncAppender">
     87         <discardingThreshold>0</discardingThreshold>
     88         <queueSize>256</queueSize>
     89         <includeCallerData>true</includeCallerData>
     90         <appender-ref ref="file.all.other" />
     91     </appender>
     92 
     93     <!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName -->
     94     <logger name="com.lin" additivity="false">
     95         <level value="${log.root.level}" />
     96         <appender-ref ref="stdout" />
     97         <appender-ref ref="file.async" /><!-- 即com.lin包下级别为 ${log.root.level}的才会使用file.async来打印 -->
     98         <appender-ref ref="file.error" />
     99     </logger>
    100 
    101     <!-- root将级别为${log.root.level}及大于${log.root.level}的日志信息交给已经配置好的名为“Console”的appender处理,“Console”appender将信息打印到Console,其它同理 -->
    102     <root level="${log.root.level}">
    103         <appender-ref ref="stdout" /> <!--  标识这个appender将会添加到这个logger -->
    104         <appender-ref ref="file.async.other" />
    105         <appender-ref ref="file.error" />
    106     </root>
    107 </configuration>
    View Code

    spring-dubbo.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
     4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
     5     <!-- 提供方应用信息,用于计算依赖关系 -->
     6     <dubbo:application name="provider"/>
     7     <!-- 使用zookeeper注册中心暴露服务地址 -->
     8     <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
     9     <!-- 用dubbo协议在20880端口暴露服务 -->
    10     <dubbo:protocol name="dubbo" port="20880"/>
    11     <!-- 声明需要暴露的服务接口 -->
    12     <dubbo:service interface="org.hanzx.service.UserService" ref="userService" protocol="dubbo"/>
    13     <!-- 具体的实现bean -->
    14     <bean id="userService" class="org.hanzx.serviceimpl.UserServiceImpl"/>
    15 </beans>
    View Code

    spring-mybatis.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
     4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
     5     <!-- 3.配置数据源 ,使用的alibba的数据库-->
     6     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
     7         <!-- 基本属性 url、userEntity、password -->
     8         <property name="driverClassName" value="${jdbc.driver}"/>
     9         <property name="url" value="${jdbc.url}"/>
    10         <property name="username" value="${jdbc.username}"/>
    11         <property name="password" value="${jdbc.password}"/>
    12 
    13         <!-- 配置初始化大小、最小、最大 -->
    14         <property name="initialSize" value="10"/>
    15         <property name="minIdle" value="10"/>
    16         <property name="maxActive" value="50"/>
    17 
    18         <!-- 配置获取连接等待超时的时间 -->
    19         <property name="maxWait" value="60000"/>
    20         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
    21         <property name="timeBetweenEvictionRunsMillis" value="60000" />
    22 
    23         <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
    24         <property name="minEvictableIdleTimeMillis" value="300000" />
    25 
    26         <property name="validationQuery" value="SELECT 'x'" />
    27         <property name="testWhileIdle" value="true" />
    28         <property name="testOnBorrow" value="false" />
    29         <property name="testOnReturn" value="false" />
    30 
    31         <!-- 打开PSCache,并且指定每个连接上PSCache的大小  如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。-->
    32         <property name="poolPreparedStatements" value="false" />
    33         <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
    34 
    35         <!-- 配置监控统计拦截的filters -->
    36         <property name="filters" value="wall,stat" />
    37     </bean>
    38 
    39 
    40 
    41     <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    42     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    43         <property name="dataSource" ref="dataSource" />
    44         <!-- 自动扫描mapping.xml文件 -->
    45         <property name="mapperLocations" value="classpath:mappers/*.xml" />
    46     </bean>
    47 
    48 
    49     <!-- DAO接口所在包名,Spring会自动查找其下的类 ,自动扫描了所有的XxxxMapper.xml对应的mapper接口文件,只要Mapper接口类和Mapper映射文件对应起来就可以了-->
    50     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    51         <property name="basePackage" value="org.hanzx.dao" />
    52         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    53     </bean>
    54 
    55     <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
    56     <!-- 配置事务管理器 -->
    57     <bean id="transactionManager"
    58           class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    59         <property name="dataSource" ref="dataSource" />
    60     </bean>
    61 
    62     <!--======= 事务配置 End =================== -->
    63     <!-- 配置基于注解的声明式事务 -->
    64     <!-- enables scanning for @Transactional annotations -->
    65     <tx:annotation-driven transaction-manager="transactionManager" />
    66 </beans>
    View Code

    ProviderRunner

     1 package org.hanzx;
     2 
     3 import org.springframework.context.support.ClassPathXmlApplicationContext;
     4 
     5 import java.io.IOException;
     6 
     7 public class ProviderRunner {
     8 
     9 
    10     public static void main(String[] args) throws IOException {
    11         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    12         context.start();
    13         System.out.println("provider start");
    14         int x = System.in.read();
    15     }
    16 
    17 }
    View Code

    UserEntity

     1 package org.hanzx.entity;
     2 
     3 
     4 
     5 public class UserEntity {
     6 
     7     private Integer id;
     8 
     9     private String name;
    10 
    11     private Integer age;
    12 
    13     private String password;
    14 
    15     public Integer getId() {
    16         return id;
    17     }
    18 
    19     public void setId(Integer id) {
    20         this.id = id;
    21     }
    22 
    23     public String getName() {
    24         return name;
    25     }
    26 
    27     public void setName(String name) {
    28         this.name = name;
    29     }
    30 
    31     public Integer getAge() {
    32         return age;
    33     }
    34 
    35     public void setAge(Integer age) {
    36         this.age = age;
    37     }
    38 
    39     public String getPassword() {
    40         return password;
    41     }
    42 
    43     public void setPassword(String password) {
    44         this.password = password;
    45     }
    46 }
    View Code

    UserServiceImpl

     1 package org.hanzx.serviceimpl;
     2 
     3 import org.hanzx.dao.UserDao;
     4 import org.hanzx.entity.UserEntity;
     5 import org.hanzx.model.UserModel;
     6 import org.hanzx.service.UserService;
     7 import org.springframework.beans.factory.annotation.Autowired;
     8 import org.springframework.stereotype.Service;
     9 
    10 import java.util.ArrayList;
    11 import java.util.List;
    12 
    13 @Service
    14 public class UserServiceImpl implements UserService{
    15 
    16     private final UserDao userDao;
    17 
    18     @Autowired
    19     public UserServiceImpl(UserDao userDao) {
    20         this.userDao = userDao;
    21     }
    22 
    23     @Override
    24     public List<UserModel> getAllUser() {
    25         List<UserEntity> userEntityList = userDao.getAllUser();
    26         List<UserModel> userModelList = new ArrayList<>();
    27         for (UserEntity userEntity : userEntityList){
    28             UserModel userModel = new UserModel();
    29             userModel.setName(userEntity.getName());
    30             userModel.setId(userEntity.getId());
    31             userModel.setAge(userEntity.getAge());
    32             userModelList.add(userModel);
    33         }
    34         return userModelList;
    35 //        return null;
    36     }
    37 
    38     @Override
    39     public void addUser(UserModel userModel) {
    40         UserEntity userEntity = new UserEntity();
    41         userEntity.setName(userModel.getName());
    42         userEntity.setAge(userModel.getAge());
    43         userEntity.setPassword(userModel.getPassword());
    44         userDao.addUser(userEntity);
    45     }
    46 
    47     @Override
    48     public UserModel getUserById(Integer id) {
    49         UserEntity userEntity = userDao.getUserById(id);
    50         UserModel userModel = new UserModel();
    51         userModel.setAge(userEntity.getAge());
    52         userModel.setId(userEntity.getId());
    53         userModel.setName(userEntity.getName());
    54         userModel.setPassword(userEntity.getPassword());
    55         return userModel;
    56 //        return null;
    57     }
    58 
    59     @Override
    60     public void updateUser(UserModel userModel) {
    61         UserEntity userEntity = userDao.getUserById(userModel.getId());
    62         userEntity.setPassword(userModel.getPassword());
    63         userEntity.setAge(userModel.getAge());
    64         userEntity.setName(userModel.getName());
    65         userDao.updateUser(userEntity);
    66     }
    67 
    68     @Override
    69     public void deleteUser(Integer[] ids) {
    70         for (Integer id : ids){
    71             userDao.deleteUserById(id);
    72         }
    73     }
    74 }
    View Code

    UserDao

     1 package org.hanzx.dao;
     2 
     3 
     4 import org.hanzx.entity.UserEntity;
     5 import org.springframework.stereotype.Repository;
     6 
     7 import java.util.List;
     8 
     9 @Repository
    10 public interface UserDao {
    11 
    12     List<UserEntity> getAllUser();
    13 
    14     void addUser(UserEntity userEntity);
    15 
    16     UserEntity getUserById(Integer id);
    17 
    18     void updateUser(UserEntity userEntity);
    19 
    20     void deleteUserById(Integer id);
    21 }
    View Code

    userMapper.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
     3 
     4 <mapper namespace="org.hanzx.dao.UserDao">
     5     <resultMap id="BaseResultMap" type="org.hanzx.entity.UserEntity" >
     6         <id column="id" property="id" jdbcType="INTEGER" />
     7         <result column="name" property="name" jdbcType="VARCHAR" />
     8         <result column="password" property="password" jdbcType="VARCHAR" />
     9         <result column="age" property="age" jdbcType="INTEGER" />
    10     </resultMap>
    11     <select id="getAllUser" resultMap="BaseResultMap" >
    12       SELECT * FROM user;
    13     </select>
    14 
    15     <insert id="addUser">
    16         INSERT USER VALUES (null, #{name}, #{age}, #{password});
    17     </insert>
    18 
    19     <select id="getUserById" resultMap="BaseResultMap">
    20         SELECT * FROM user WHERE user.id = #{id};
    21     </select>
    22 
    23     <update id="updateUser">
    24         UPDATE user SET name = #{name}, age = #{age}, password = #{password} WHERE id = #{id};
    25     </update>
    26 
    27     <delete id="deleteUserById">
    28         DELETE FROM user where id = #{id};
    29     </delete>
    30 
    31 </mapper>
    View Code

    consumer

    pom.xml

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 
      3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      5     <parent>
      6         <artifactId>web_ssm_dubbo</artifactId>
      7         <groupId>org.hanzx</groupId>
      8         <version>1.0-SNAPSHOT</version>
      9     </parent>
     10     <modelVersion>4.0.0</modelVersion>
     11 
     12     <artifactId>consumer</artifactId>
     13     <packaging>war</packaging>
     14 
     15     <name>consumer Maven Webapp</name>
     16     <!-- FIXME change it to the project's website -->
     17     <url>http://www.example.com</url>
     18 
     19     <properties>
     20         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     21         <spring.version>4.2.5.RELEASE</spring.version>
     22         <mybatis.version>3.2.1</mybatis.version>
     23         <slf4j.version>1.6.6</slf4j.version>
     24         <log4j.version>1.2.12</log4j.version>
     25         <mysql.version>5.1.35</mysql.version>
     26         <jackson.version>2.9.2</jackson.version>
     27     </properties>
     28 
     29     <dependencies>
     30         <dependency>
     31             <groupId>junit</groupId>
     32             <artifactId>junit</artifactId>
     33             <version>4.11</version>
     34             <scope>test</scope>
     35         </dependency>
     36         <dependency>
     37             <groupId>org.hanzx</groupId>
     38             <artifactId>interface</artifactId>
     39             <version>1.0-SNAPSHOT</version>
     40         </dependency>
     41 
     42         <!-- 添加Spring依赖 -->
     43         <dependency>
     44             <groupId>org.springframework</groupId>
     45             <artifactId>spring-core</artifactId>
     46             <version>${spring.version}</version>
     47         </dependency>
     48         <dependency>
     49             <groupId>org.springframework</groupId>
     50             <artifactId>spring-context</artifactId>
     51             <version>${spring.version}</version>
     52         </dependency>
     53         <dependency>
     54             <groupId>org.springframework</groupId>
     55             <artifactId>spring-context-support</artifactId>
     56             <version>${spring.version}</version>
     57         </dependency>
     58         <!--<dependency>-->
     59             <!--<groupId>org.springframework</groupId>-->
     60             <!--<artifactId>spring-aop</artifactId>-->
     61             <!--<version>${spring.version}</version>-->
     62         <!--</dependency>-->
     63         <!--<dependency>-->
     64             <!--<groupId>org.springframework</groupId>-->
     65             <!--<artifactId>spring-aspects</artifactId>-->
     66             <!--<version>${spring.version}</version>-->
     67         <!--</dependency>-->
     68         <!--<dependency>-->
     69             <!--<groupId>org.springframework</groupId>-->
     70             <!--<artifactId>spring-tx</artifactId>-->
     71             <!--<version>${spring.version}</version>-->
     72         <!--</dependency>-->
     73         <!--<dependency>-->
     74             <!--<groupId>org.springframework</groupId>-->
     75             <!--<artifactId>spring-jdbc</artifactId>-->
     76             <!--<version>${spring.version}</version>-->
     77         <!--</dependency>-->
     78         <dependency>
     79             <groupId>org.springframework</groupId>
     80             <artifactId>spring-web</artifactId>
     81             <version>${spring.version}</version>
     82         </dependency>
     83         <!--spring单元测试依赖 -->
     84         <dependency>
     85             <groupId>org.springframework</groupId>
     86             <artifactId>spring-test</artifactId>
     87             <version>${spring.version}</version>
     88             <scope>test</scope>
     89         </dependency>
     90 
     91         <!-- spring webmvc相关jar -->
     92         <dependency>
     93             <groupId>org.springframework</groupId>
     94             <artifactId>spring-webmvc</artifactId>
     95             <version>${spring.version}</version>
     96         </dependency>
     97 
     98         <!-- mysql驱动包 -->
     99         <!--<dependency>-->
    100             <!--<groupId>mysql</groupId>-->
    101             <!--<artifactId>mysql-connector-java</artifactId>-->
    102             <!--<version>${mysql.version}</version>-->
    103         <!--</dependency>-->
    104 
    105         <!-- alibaba data source 相关jar包-->
    106         <!--<dependency>-->
    107             <!--<groupId>com.alibaba</groupId>-->
    108             <!--<artifactId>druid</artifactId>-->
    109             <!--<version>0.2.23</version>-->
    110         <!--</dependency>-->
    111 
    112         <!-- alibaba fastjson 格式化对 -->
    113         <dependency>
    114             <groupId>com.alibaba</groupId>
    115             <artifactId>fastjson</artifactId>
    116             <version>1.1.41</version>
    117         </dependency>
    118 
    119         <!-- logback start -->
    120         <dependency>
    121             <groupId>log4j</groupId>
    122             <artifactId>log4j</artifactId>
    123             <version>${log4j.version}</version>
    124         </dependency>
    125         <dependency>
    126             <groupId>org.slf4j</groupId>
    127             <artifactId>slf4j-api</artifactId>
    128             <version>${slf4j.version}</version>
    129         </dependency>
    130         <dependency>
    131             <groupId>ch.qos.logback</groupId>
    132             <artifactId>logback-classic</artifactId>
    133             <version>1.1.2</version>
    134         </dependency>
    135         <dependency>
    136             <groupId>ch.qos.logback</groupId>
    137             <artifactId>logback-core</artifactId>
    138             <version>1.1.2</version>
    139         </dependency>
    140         <dependency>
    141             <groupId>org.logback-extensions</groupId>
    142             <artifactId>logback-ext-spring</artifactId>
    143             <version>0.1.1</version>
    144         </dependency>
    145 
    146         <!--mybatis依赖 -->
    147         <!--<dependency>-->
    148             <!--<groupId>org.mybatis</groupId>-->
    149             <!--<artifactId>mybatis</artifactId>-->
    150             <!--<version>${mybatis.version}</version>-->
    151         <!--</dependency>-->
    152 
    153         <!-- mybatis/spring包 -->
    154         <!--<dependency>-->
    155             <!--<groupId>org.mybatis</groupId>-->
    156             <!--<artifactId>mybatis-spring</artifactId>-->
    157             <!--<version>1.2.0</version>-->
    158         <!--</dependency>-->
    159         <!-- 添加servlet3.0核心包 -->
    160         <dependency>
    161             <groupId>javax.servlet</groupId>
    162             <artifactId>javax.servlet-api</artifactId>
    163             <version>3.0.1</version>
    164         </dependency>
    165         <dependency>
    166             <groupId>javax.servlet.jsp</groupId>
    167             <artifactId>javax.servlet.jsp-api</artifactId>
    168             <version>2.3.2-b01</version>
    169         </dependency>
    170         <!-- jstl -->
    171         <dependency>
    172             <groupId>javax.servlet</groupId>
    173             <artifactId>jstl</artifactId>
    174             <version>1.2</version>
    175         </dependency>
    176         <!--thymeleaf-->
    177         <dependency>
    178             <groupId>org.thymeleaf</groupId>
    179             <artifactId>thymeleaf-spring5</artifactId>
    180             <version>3.0.9.RELEASE</version>
    181         </dependency>
    182 
    183 
    184         <!-- json -->
    185         <dependency>
    186             <groupId>com.fasterxml.jackson.core</groupId>
    187             <artifactId>jackson-core</artifactId>
    188             <version>${jackson.version}</version>
    189         </dependency>
    190         <dependency>
    191             <groupId>com.fasterxml.jackson.core</groupId>
    192             <artifactId>jackson-databind</artifactId>
    193             <version>${jackson.version}</version>
    194         </dependency>
    195 
    196         <!--dubbo-->
    197         <dependency>
    198             <groupId>com.alibaba</groupId>
    199             <artifactId>dubbo</artifactId>
    200             <version>2.5.7</version>
    201         </dependency>
    202         <dependency>
    203             <groupId>org.apache.zookeeper</groupId>
    204             <artifactId>zookeeper</artifactId>
    205             <version>3.5.4-beta</version>
    206             <type>pom</type>
    207         </dependency>
    208         <dependency>
    209             <groupId>com.101tec</groupId>
    210             <artifactId>zkclient</artifactId>
    211             <version>0.10</version>
    212         </dependency>
    213         <dependency>
    214             <groupId>org.apache.curator</groupId>
    215             <artifactId>curator-framework</artifactId>
    216             <version>2.7.1</version>
    217         </dependency>
    218     </dependencies>
    219 
    220     <build>
    221         <finalName>consumer</finalName>
    222         <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
    223             <plugins>
    224                 <plugin>
    225                     <artifactId>maven-clean-plugin</artifactId>
    226                     <version>3.0.0</version>
    227                 </plugin>
    228                 <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
    229                 <plugin>
    230                     <artifactId>maven-resources-plugin</artifactId>
    231                     <version>3.0.2</version>
    232                 </plugin>
    233                 <plugin>
    234                     <artifactId>maven-compiler-plugin</artifactId>
    235                     <version>3.7.0</version>
    236                 </plugin>
    237                 <plugin>
    238                     <artifactId>maven-surefire-plugin</artifactId>
    239                     <version>2.20.1</version>
    240                 </plugin>
    241                 <plugin>
    242                     <artifactId>maven-war-plugin</artifactId>
    243                     <version>3.2.0</version>
    244                 </plugin>
    245                 <plugin>
    246                     <artifactId>maven-install-plugin</artifactId>
    247                     <version>2.5.2</version>
    248                 </plugin>
    249                 <plugin>
    250                     <artifactId>maven-deploy-plugin</artifactId>
    251                     <version>2.8.2</version>
    252                 </plugin>
    253             </plugins>
    254         </pluginManagement>
    255     </build>
    256 </project>
    View Code

    web.xml

     1 <!DOCTYPE web-app PUBLIC
     2  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     3  "http://java.sun.com/dtd/web-app_2_3.dtd" >
     4 
     5 <web-app>
     6   <display-name>Archetype Created Web Application</display-name>
     7   <!-- 读取spring配置文件 -->
     8   <context-param>
     9     <param-name>contextConfigLocation</param-name>
    10     <param-value>classpath:applicationContext.xml</param-value>
    11   </context-param>
    12 
    13   <context-param>
    14     <param-name>logbackConfigLocation</param-name>
    15     <param-value>classpath:logback.xml</param-value>
    16   </context-param>
    17 
    18   <!-- 设计路径变量值
    19   <context-param>
    20       <param-name>webAppRootKey</param-name>
    21       <param-value>springmvc.root</param-value>
    22   </context-param>
    23   -->
    24 
    25   <!-- Spring字符集过滤器 -->
    26   <filter>
    27     <filter-name>SpringEncodingFilter</filter-name>
    28     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    29     <init-param>
    30       <param-name>encoding</param-name>
    31       <param-value>UTF-8</param-value>
    32     </init-param>
    33     <init-param>
    34       <param-name>forceEncoding</param-name>
    35       <param-value>true</param-value>
    36     </init-param>
    37   </filter>
    38   <filter-mapping>
    39     <filter-name>SpringEncodingFilter</filter-name>
    40     <url-pattern>/*</url-pattern>
    41   </filter-mapping>
    42   <!-- 添加日志监听器 -->
    43   <listener>
    44     <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
    45   </listener>
    46 
    47   <listener>
    48     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    49   </listener>
    50 
    51   <!-- springMVC核心配置 -->
    52   <servlet>
    53     <servlet-name>dispatcherServlet</servlet-name>
    54     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    55     <init-param>
    56       <param-name>contextConfigLocation</param-name>
    57       <!--spingMVC的配置路径 -->
    58       <param-value>classpath:spring-mvc.xml</param-value>
    59     </init-param>
    60     <load-on-startup>1</load-on-startup>
    61   </servlet>
    62   <!-- 拦截设置 -->
    63   <servlet-mapping>
    64     <servlet-name>dispatcherServlet</servlet-name>
    65     <url-pattern>/</url-pattern>
    66   </servlet-mapping>
    67 
    68 
    69   <welcome-file-list>
    70     <welcome-file>index.jsp</welcome-file>
    71   </welcome-file-list>
    72 
    73 </web-app>
    View Code

    applicationContext.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:context="http://www.springframework.org/schema/context"
     5        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
     6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
     7 
     8     <!-- 提供方应用信息,用于计算依赖关系 -->
     9     <dubbo:application name="consumer" owner="user" organization="dubbox"  />
    10     <!-- 使用zookeeper注册中心暴露服务地址 -->
    11     <dubbo:registry check="false" address="zookeeper://localhost:2181" />
    12     <!-- 使用dubbo协议调用定义好的api接口 -->
    13     <dubbo:consumer check="false"/>
    14     <!-- 使用dubbo协议调用定义好的api接口 -->
    15     <dubbo:reference id="userService" interface="org.hanzx.service.UserService" check="false"/>
    16     <context:component-scan base-package="org.hanzx.controller"/>
    17 </beans>
    View Code

    logback.xml

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <configuration>
      3     <!-- 尽量别用绝对路径,如果带参数不同容器路径解释可能不同,以下配置参数在pom.xml里 -->
      4     <property name="log.root.level" value="${log.root.level}" /> <!-- 日志级别 -->
      5     <property name="log.other.level" value="${log.other.level}" /> <!-- 其他日志级别 -->
      6     <property name="log.base" value="${log.base}" /> <!-- 日志路径,这里是相对路径,web项目eclipse下会输出到eclipse的安装目录下,如果部署到linux上的tomcat下,会输出到tomcat/bin目录 下 -->
      7     <property name="log.moduleName" value="${log.moduleName}" />  <!-- 模块名称, 影响日志配置名,日志文件名 -->
      8     <property name="log.max.size" value="100MB" /> <!-- 日志文件大小,超过这个大小将被压缩 -->
      9 
     10     <!--控制台输出 -->
     11     <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
     12         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
     13             <Pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method():%L -%msg%n</Pattern>
     14         </encoder>
     15     </appender>
     16 
     17     <!-- 用来保存输出所有级别的日志 -->
     18     <appender name="file.all" class="ch.qos.logback.core.rolling.RollingFileAppender">
     19         <File>${log.base}/${log.moduleName}.log</File><!-- 设置日志不超过${log.max.size}时的保存路径,注意如果
     20             是web项目会保存到Tomcat的bin目录 下 -->
     21         <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。 -->
     22         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     23             <FileNamePattern>${log.base}/archive/${log.moduleName}_all_%d{yyyy-MM-dd}.%i.log.zip
     24             </FileNamePattern>
     25             <!-- 文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份) -->
     26             <timeBasedFileNamingAndTriggeringPolicy
     27                     class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
     28                 <maxFileSize>${log.max.size}</maxFileSize>
     29             </timeBasedFileNamingAndTriggeringPolicy>
     30         </rollingPolicy>
     31         <!-- 日志输出的文件的格式 -->
     32         <layout class="ch.qos.logback.classic.PatternLayout">
     33             <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method():%L -%msg%n</pattern>
     34         </layout>
     35     </appender>
     36 
     37     <!-- 这也是用来保存输出所有级别的日志 -->
     38     <appender name="file.all.other" class="ch.qos.logback.core.rolling.RollingFileAppender">
     39         <File>${log.base}/${log.moduleName}_other.log</File>
     40         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     41             <FileNamePattern>${log.base}/archive/${log.moduleName}_other_%d{yyyy-MM-dd}.%i.log.zip
     42             </FileNamePattern>
     43             <timeBasedFileNamingAndTriggeringPolicy
     44                     class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
     45                 <maxFileSize>${log.max.size}</maxFileSize>
     46             </timeBasedFileNamingAndTriggeringPolicy>
     47         </rollingPolicy>
     48         <layout class="ch.qos.logback.classic.PatternLayout">
     49             <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method():%L -%msg%n</pattern>
     50         </layout>
     51     </appender>
     52 
     53     <!-- 只用保存输出error级别的日志 -->
     54     <appender name="file.error"
     55               class="ch.qos.logback.core.rolling.RollingFileAppender">
     56         <File>${log.base}/${log.moduleName}_err.log</File>
     57         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     58             <FileNamePattern>${log.base}/archive/${log.moduleName}_err_%d{yyyy-MM-dd}.%i.log.zip
     59             </FileNamePattern>
     60             <timeBasedFileNamingAndTriggeringPolicy
     61                     class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
     62                 <maxFileSize>${log.max.size}</maxFileSize>
     63             </timeBasedFileNamingAndTriggeringPolicy>
     64         </rollingPolicy>
     65         <layout class="ch.qos.logback.classic.PatternLayout">
     66             <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{56}.%method():%L - %msg%n</pattern>
     67         </layout>
     68         <!-- 下面为配置只输出error级别的日志 -->
     69         <filter class="ch.qos.logback.classic.filter.LevelFilter">
     70             <level>ERROR</level>
     71             <onMatch>ACCEPT</onMatch>
     72             <onMismatch>DENY</onMismatch>
     73         </filter>
     74     </appender>
     75 
     76     <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
     77     <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
     78     <!-- 添加附加的appender,最多只能添加一个 -->
     79     <appender name="file.async" class="ch.qos.logback.classic.AsyncAppender">
     80         <discardingThreshold>0</discardingThreshold>
     81         <queueSize>256</queueSize>
     82         <includeCallerData>true</includeCallerData>
     83         <appender-ref ref="file.all" />
     84     </appender>
     85 
     86     <appender name="file.async.other" class="ch.qos.logback.classic.AsyncAppender">
     87         <discardingThreshold>0</discardingThreshold>
     88         <queueSize>256</queueSize>
     89         <includeCallerData>true</includeCallerData>
     90         <appender-ref ref="file.all.other" />
     91     </appender>
     92 
     93     <!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName -->
     94     <logger name="com.lin" additivity="false">
     95         <level value="${log.root.level}" />
     96         <appender-ref ref="stdout" />
     97         <appender-ref ref="file.async" /><!-- 即com.lin包下级别为 ${log.root.level}的才会使用file.async来打印 -->
     98         <appender-ref ref="file.error" />
     99     </logger>
    100 
    101     <!-- root将级别为${log.root.level}及大于${log.root.level}的日志信息交给已经配置好的名为“Console”的appender处理,“Console”appender将信息打印到Console,其它同理 -->
    102     <root level="${log.root.level}">
    103         <appender-ref ref="stdout" /> <!--  标识这个appender将会添加到这个logger -->
    104         <appender-ref ref="file.async.other" />
    105         <appender-ref ref="file.error" />
    106     </root>
    107 </configuration>
    View Code

    spring-mvc.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:context="http://www.springframework.org/schema/context"
     5        xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
     6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
     7 
     8     <!-- 扫描controller(controller层注入) -->
     9     <context:component-scan base-package="org.hanzx.controller" use-default-filters="false">
    10         <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    11     </context:component-scan>
    12 
    13     <mvc:annotation-driven />
    14 
    15     <!-- 内容协商管理器  -->
    16     <!--1、首先检查路径扩展名(如my.pdf);2、其次检查Parameter(如my?format=pdf);3、检查Accept Header-->
    17     <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    18         <!-- 扩展名至mimeType的映射,即 /userEntity.json => application/json -->
    19         <property name="favorPathExtension" value="true"/>
    20         <!-- 用于开启 /userinfo/123?format=json 的支持 -->
    21         <property name="favorParameter" value="true"/>
    22         <property name="parameterName" value="format"/>
    23         <!-- 是否忽略Accept Header -->
    24         <property name="ignoreAcceptHeader" value="false"/>
    25 
    26         <property name="mediaTypes"> <!--扩展名到MIME的映射;favorPathExtension, favorParameter是true时起作用  -->
    27             <value>
    28                 json=application/json
    29                 xml=application/xml
    30                 html=text/html
    31             </value>
    32         </property>
    33         <!-- 默认的content type -->
    34         <property name="defaultContentType" value="text/html"/>
    35     </bean>
    36 
    37 
    38     <!-- 当在web.xml 中   DispatcherServlet使用 <url-pattern>/</url-pattern> 映射时,能映射静态资源 -->
    39     <mvc:default-servlet-handler />
    40     <!-- 静态资源映射 -->
    41     <mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>
    42 
    43 
    44     <!-- 对模型视图添加前后缀 -->
    45     <!--<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"-->
    46           <!--p:prefix="/WEB-INF/pages/" p:suffix=".jsp"/>-->
    47 
    48     <bean id="templateResolver"
    49           class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
    50         <property name="prefix" value="/WEB-INF/templates/"/>
    51         <property name="suffix" value=".html"/>
    52         <property name="characterEncoding" value="UTF-8"/>
    53         <property name="order" value="1"/>
    54         <property name="templateMode" value="HTML5"/>
    55         <property name="cacheable" value="false"/>
    56     </bean>
    57 
    58     <bean id="templateEngine"
    59           class="org.thymeleaf.spring5.SpringTemplateEngine">
    60         <property name="templateResolver" ref="templateResolver"/>
    61     </bean>
    62 
    63     <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    64         <property name="templateEngine" ref="templateEngine"/>
    65         <property name="characterEncoding" value="UTF-8"/>
    66     </bean>
    67 
    68     <!--拦截器 跨域拦截器-->
    69     <mvc:interceptors>
    70         <mvc:interceptor>
    71             <mvc:mapping path="/**"/>
    72             <mvc:exclude-mapping path="/WEB-INF/static/**" />
    73             <bean class="org.hanzx.interceptors.CORSInterceptor" />
    74         </mvc:interceptor>
    75     </mvc:interceptors>
    76 
    77 
    78 
    79 </beans>
    View Code

    UserController

     1 package org.hanzx.controller;
     2 
     3 import org.hanzx.model.UserModel;
     4 import org.hanzx.service.UserService;
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.stereotype.Controller;
     7 import org.springframework.ui.ModelMap;
     8 import org.springframework.web.bind.annotation.RequestMapping;
     9 import org.springframework.web.bind.annotation.RequestParam;
    10 import org.springframework.web.bind.annotation.ResponseBody;
    11 
    12 @Controller
    13 @RequestMapping("/user")
    14 public class UserController {
    15 
    16     private final UserService userService;
    17     private String prefix = "user/";
    18 
    19     @Autowired
    20     public UserController(UserService userService) {
    21         this.userService = userService;
    22     }
    23 
    24 
    25 
    26 //    @RequestMapping(value="/getAllUser")
    27 //    @ResponseBody
    28 //    public List<UserModel> getAllUser(){
    29 //        return userService.getAllUser();
    30 //    }
    31 //
    32 //    @RequestMapping(value="/addUser")
    33 //    @ResponseBody
    34 //    public boolean addUser(UserModel userModel){
    35 //        userService.addUser(userModel);
    36 //        return true;
    37 //    }
    38 //
    39 //    @RequestMapping(value="/updateUser")
    40 //    @ResponseBody
    41 //    public boolean updateUser(UserModel userModel){
    42 //        userService.updateUser(userModel);
    43 //        return true;
    44 //    }
    45 //
    46 //    @RequestMapping(value="/deleteUser")
    47 //    @ResponseBody
    48 //    public boolean deleteUser(@RequestParam(value = "ids[]") Integer[] ids){
    49 //        userService.deleteUser(ids);
    50 //        return true;
    51 //    }
    52 
    53 
    54 //    @RequestMapping(value="/getUserListForm")
    55 //    public String getUserListForm(){
    56 //        return prefix + "user_list";
    57 //    }
    58 
    59     @RequestMapping(value="/getAllUser")
    60     public String getAllUser(ModelMap modelMap){
    61         modelMap.put("userModelList", userService.getAllUser());
    62         return prefix + "user_list";
    63     }
    64 
    65     @RequestMapping(value="/getUserDetailForm")
    66     public String getUserDetailForm(ModelMap modelMap, Integer id){
    67         if (id != null){
    68             modelMap.put("userModel", userService.getUserById(id));
    69         }
    70         return prefix + "user_detail";
    71     }
    72 
    73     @RequestMapping(value="/addUser")
    74     public String addUser(UserModel userModel){
    75         userService.addUser(userModel);
    76         return "redirect:getAllUser";
    77     }
    78 
    79     @RequestMapping(value="/updateUser")
    80     public String updateUser(UserModel userModel){
    81         userService.updateUser(userModel);
    82         return "redirect:getAllUser";
    83     }
    84 
    85     @RequestMapping(value="/deleteUser")
    86     @ResponseBody
    87     public boolean deleteUser(@RequestParam(value = "ids[]") Integer[] ids){
    88         userService.deleteUser(ids);
    89         return true;
    90     }
    91 
    92 
    93 }
    View Code

    CORSInterceptor

     1 package org.hanzx.interceptors;
     2 
     3 
     4 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
     5 
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 public class CORSInterceptor extends HandlerInterceptorAdapter {
    10 
    11     @Override
    12     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    13         System.out.println("拦截请求: " + request.getServletPath());
    14         response.setHeader("Access-Control-Allow-Origin", "*");
    15         response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    16         response.setHeader("Access-Control-Max-Age", "0");
    17         response.setHeader("Access-Control-Allow-Headers",
    18                 "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
    19         response.setHeader("Access-Control-Allow-Credentials", "true");
    20         response.setHeader("XDomainRequestAllowed", "1");
    21         return true;
    22     }
    23 }
    View Code

    user_list.html

     1 <!DOCTYPE html>
     2 <html lang="cn" xmlns:th="http://www.thymeleaf.org">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>userEntityList</title>
     6     <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js" ></script>
     7     <script type="text/javascript">
     8         $(function () {
     9             //全选
    10             $("#selectAll").click(function () {
    11                 if (this.checked) {
    12                     $("input[name=deleteId]").prop("checked", true);
    13                 } else {
    14                     $("input[name=deleteId]").prop("checked", false);
    15                 }
    16             });
    17 
    18             $("input[name=deleteId]").click(function () {
    19                 var allChecked = true;
    20                 $("input[name=deleteId]").each(function(){
    21                     if(!$(this).prop("checked")){
    22                         allChecked = false;
    23                     }
    24                 });
    25                 if(allChecked){
    26                     $("#selectAll").prop("checked",true);
    27                 } else {
    28                     $("#selectAll").prop("checked",false);
    29                 }
    30             });
    31 
    32             //删除用户
    33             $("#delete").click(function () {
    34                 var ids = [];
    35                 $("input[name=deleteId]:checked").each(function(index){
    36                     ids[index] = $(this).val();
    37                 });
    38                 if (ids.length === 0){
    39                     alert("没有选中的选项");
    40                     return false;
    41                 }
    42                 $.ajax({
    43                     url : "deleteUser",
    44                     data: {"ids": ids},
    45                     cache : false,
    46                     async : false,
    47                     type : "GET",
    48                     success:function(data){
    49                         if (data === true){
    50                             window.location.reload();
    51                         }
    52                     }
    53                 });
    54             });
    55 
    56         });
    57 
    58     </script>
    59 </head>
    60 <body>
    61     <a th:href="getUserDetailForm">添加</a>
    62     <a th:id="delete" href="#" >删除</a>
    63     <table>
    64         <tr>
    65             <th><input th:type="checkbox" th:id="selectAll" title="点击全选/取消"/></th>
    66             <th>用户名</th>
    67             <th>年龄</th>
    68             <th>操作</th>
    69         </tr>
    70         <tr th:each="userModel : ${userModelList}">
    71             <td><input th:type="checkbox" th:value="${userModel.id}" th:name="deleteId"/></td>
    72             <td th:text="${userModel.name}">abc</td>
    73             <td th:text="${userModel.age}">15</td>
    74             <td><a th:href="'getUserDetailForm?id=' + ${userModel.id}">修改</a></td>
    75         </tr>
    76     </table>
    77 </body>
    78 </html>
    View Code

    user_detail.html

     1 <!DOCTYPE html>
     2 <html lang="en" xmlns:th="http://www.thymeleaf.org">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8     <div th:if="${userModel} eq null">
     9         <form th:action="addUser" th:method="post">
    10     </div>
    11     <div th:if="${userModel} ne null">
    12         <form th:action="updateUser" th:method="post">
    13     </div>
    14         <table>
    15             <tr>
    16                 <th>用户名</th>
    17                 <td><input th:type="text" th:name="name" th:value="${userModel == null? '' : userModel.name}" th:title="请输入用户名"/></td>
    18             </tr>
    19             <tr>
    20                 <th>密码</th>
    21                 <td><input th:type="password" th:name="password" th:title="请输入密码"/></td>
    22             </tr>
    23             <tr>
    24                 <th>年龄</th>
    25                 <td><input th:type="number" th:name="age" th:value="${userModel == null? '' : userModel.age}" th:title="请输入年龄"/></td>
    26             </tr>
    27             <tr><td th:colspan="2" ><input th:type="submit" th:value="提交" /></td></tr>
    28         </table>
    29         <input th:type="hidden" th:name="id" th:value="${userModel == null? null : userModel.id}" />
    30     </form>
    31 </body>
    32 </html>
    View Code

    运行结果

    先启动zookeeper:双击 zookeeper文件夹/bin/zkServer.cmd

    启动结果如下:

    然后直接启动provider的main方法(注意这里不使用tomcat),启动结果如下:

    使用tomcat启动consumer,结果如下:

    浏览器输入:http://localhost:8080/user/getAllUser,结果如下:

    参考资料

    https://blog.csdn.net/weixin_37715446/article/details/78642052

    https://blog.csdn.net/u013374645/article/details/81809576

  • 相关阅读:
    ExecuteScalar requires the command to have a transaction when the connection assigned to the command is in a pending
    如何从vss中分离程序
    String or binary data would be truncated
    the pop3 service failed to retrieve authentication type and cannot continue
    The POP3 service failed to start because
    IIS Error he system cannot find the file specified _找不到页面
    pku2575Jolly Jumpers
    pku2940Wine Trading in Gergovia
    pku3219二项式系数
    pku1029false coin
  • 原文地址:https://www.cnblogs.com/hanzx/p/10054429.html
Copyright © 2011-2022 走看看