170328、Maven+SpringMVC+Dubbo 简单的入门demo配置
之前一直听说dubbo,是一个很厉害的分布式服务框架,而且巴巴将其开源,这对于咱们广大程序猿来说,真是一个好消息。最近有时间了,打算做一个demo把dubbo在本地跑起来先。
先copy一段dubbo的介绍哈!DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点(其他的详细介绍可以查看dubbo的官网地址dubbo,写的很详细哒!)。
该demo是基于maven搭建的,项目架构基于SpringMVC,这里忽略Spring的基本配置,着重介绍下dubbo部分的配置,以及dubbo后台管理系统
一、软件环境
1、zookeeper
下载地址:https://zookeeper.apache.org/releases.html 下载最新版的zookeeper,我这里使用的版本是 zookeeper-3.4.8(当前最新版3.5.1)
2、springMVC (maven方式引入)
3、dubbo (maven方式引入)
二、项目搭建
这里我搭建了三个项目,分别为dubbo-api,dubbo-controller,dubbo-service
dubbo-api:主要是接口定义,供controller调用,以及service层去实现该接口,分离这一层的好处就是前段项目调用接口时候,直接调用dubbo-api的接口即可,不需要关注后端如何实现;而service层来具体实现该接口,进行业务逻辑处理,不需要关注 controller层如何调用。
dubbo-controller:主要controller层控制跳转等。
dubbo-service:主要是service实现,结合数据层实现后端业务逻辑处理。
项目搭建完成之后,的结构图如下:
三、项目配置
1、dubbo-api
新建TestService接口类
1
2
3
4
5
6
7
8
9
10
11
12
|
<code class = "hljs java" > package com.dubbo.service; public interface TestService { /** * 测试发消息 * @param name * @return */ public String sayHello(String name); }</code> |
pom.xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<code class = " hljs xml" ><project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelversion> 4.0 . 0 </modelversion> <groupid>com.dubbo</groupid> <artifactid>dubbo-api</artifactid> <version> 0.0 . 1 -SNAPSHOT</version> <packaging>jar</packaging> <name>dubbo-api</name> <url>http: //maven.apache.org</url> <properties> <project.build.sourceencoding>UTF- 8 </project.build.sourceencoding> </properties> <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version> 3.8 . 1 </version> <scope>test</scope> </dependency> </dependencies> </project></code> |
注意: 这个项目最终打包成jar文件,直接maven引入到另外两个项目中
2、dubbo-controller
新建MyController类
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
|
<code class = "hljs avrasm" > package com.dubbo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.dubbo.service.TestService; /** * controller * @author hwy * */ @Controller public class MyController { @Autowired private TestService testService; @RequestMapping (value = "/test" ) @ResponseBody public String testSay( @RequestParam (value = "name" ,defaultValue = "" ) String name){ StringBuffer sb = new StringBuffer(); sb.append( "Dubbo: " ).append(testService.sayHello(name)); return sb.toString(); } }</code> |
新建dubbo-config.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<beans xmlns= "http://www.springframework.org/schema/beans" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo= "http://code.alibabatech.com/schema/dubbo" 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"> <dubbo:application name= "test_consumer" > <dubbo:reference interface = "com.dubbo.service.TestService" id= "testService" check= "false" > </dubbo:reference></dubbo:registry></dubbo:application></beans></code> |
注意:这里作为消费者名称为test_consumer,注释很详细,就不一一介绍了,这个项目最终打包成dubbo-service.war放在tomcat或其他容器中运行。
pom.xml配置
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
<code class = " hljs xml" ><project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelversion> 4.0 . 0 </modelversion> <groupid>com.dubbo</groupid> <artifactid>dubbo-controller</artifactid> <version> 0.0 . 1 -SNAPSHOT</version> <packaging>war</packaging> <name>dubbo-contoller</name> <url>http: //maven.apache.org</url> <properties> <project.build.sourceencoding>UTF- 8 </project.build.sourceencoding> <org.springframework.version> 3.1 . 4 .RELEASE</org.springframework.version> </properties> <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version> 3.8 . 1 </version> <scope>test</scope> </dependency> <dependency> <groupid>javax.servlet</groupid> <artifactid>javax.servlet-api</artifactid> <version> 3.1 . 0 </version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context</artifactid> <version>${org.springframework.version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context-support</artifactid> <version>${org.springframework.version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-web</artifactid> <version>${org.springframework.version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-webmvc</artifactid> <version>${org.springframework.version}</version> </dependency> <dependency> <groupid>org.codehaus.jackson</groupid> <artifactid>jackson-core-asl</artifactid> <version> 1.9 . 12 </version> </dependency> <dependency> <groupid>org.codehaus.jackson</groupid> <artifactid>jackson-mapper-asl</artifactid> <version> 1.9 . 12 </version> </dependency> <dependency> <groupid>net.sf.json-lib</groupid> <artifactid>json-lib</artifactid> <version> 2.4 </version> <classifier>jdk15</classifier> </dependency> <dependency> <groupid>com.alibaba</groupid> <artifactid>dubbo</artifactid> <version> 2.5 . 3 </version> <exclusions> <exclusion> <artifactid>spring</artifactid> <groupid>org.springframework</groupid> </exclusion> </exclusions> </dependency> <dependency> <groupid>org.apache.zookeeper</groupid> <artifactid>zookeeper</artifactid> <version> 3.3 . 6 </version> <exclusions> <exclusion> <groupid>log4j</groupid> <artifactid>log4j</artifactid> </exclusion> </exclusions> </dependency> <dependency> <groupid>log4j</groupid> <artifactid>log4j</artifactid> <version> 1.2 . 16 </version> </dependency> <dependency> <groupid>com.github.sgroschupf</groupid> <artifactid>zkclient</artifactid> <version> 0.1 </version> </dependency> <dependency> <groupid>com.dubbo</groupid> <artifactid>dubbo-api</artifactid> <version> 0.0 . 1 -SNAPSHOT</version> </dependency> </dependencies> <build> <finalname>dubbo-controller</finalname> </build> </project></code> |
3、dubbo-service
新建TestServiceImpl类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<code class = "hljs java" > package com.dubbo.service.impl; import com.dubbo.service.TestService; /** * service impl * @author hwy * */ public class TestServiceImpl implements TestService{ public String sayHello(String name) { return name + " service2 say hello word service2!" ; } }</code> |
新建applicationContext.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<beans xmlns= "http://www.springframework.org/schema/beans" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:p= "http://www.springframework.org/schema/p" xmlns:dubbo= "http://code.alibabatech.com/schema/dubbo" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans- 3.1 .xsd http: //code.alibabatech.com/schema/dubbo http: //code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name= "test_provider" > <dubbo:protocol name= "dubbo" port= "20880" > <dubbo:service interface = "com.dubbo.service.TestService" ref= "testService" > <bean id= "testService" class = "com.dubbo.service.impl.TestServiceImpl" > </bean></dubbo:service></dubbo:protocol></dubbo:registry></dubbo:application></beans></code> |
注意:这里作为服务提供者名称为test_provider,注释很详细,就不一一介绍了,这个项目最终打包成dubbo-service.war放在tomcat或其他容器中运行,跟其他直接通过ClassPathXmlApplicationContext 启动方式稍微有点区别。
pom.xml配置
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
<code class = " hljs xml" ><project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" > <modelversion> 4.0 . 0 </modelversion> <groupid>com.dubbo</groupid> <artifactid>dubbo-service</artifactid> <packaging>war</packaging> <version> 0.0 . 1 -SNAPSHOT</version> <name>dubbo-service Maven Webapp</name> <url>http: //maven.apache.org</url> <properties> <project.build.sourceencoding>UTF- 8 </project.build.sourceencoding> <spring.vesion> 3.1 . 4 .RELEASE</spring.vesion> </properties> <dependencies> <dependency> <groupid>com.alibaba</groupid> <artifactid>dubbo</artifactid> <version> 2.5 . 3 </version> <exclusions> <exclusion> <artifactid>spring</artifactid> <groupid>org.springframework</groupid> </exclusion> </exclusions> </dependency> <dependency> <groupid>org.apache.zookeeper</groupid> <artifactid>zookeeper</artifactid> <version> 3.4 . 6 </version> <exclusions> <exclusion> <artifactid>log4j</artifactid> <groupid>log4j</groupid> </exclusion> </exclusions> </dependency> <dependency> <groupid>log4j</groupid> <artifactid>log4j</artifactid> <version> 1.2 . 17 </version> </dependency> <dependency> <groupid>com.github.sgroschupf</groupid> <artifactid>zkclient</artifactid> <version> 0.1 </version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-aop</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-asm</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-aspects</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-beans</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context-support</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-core</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-expression</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-instrument</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-instrument-tomcat</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.aspectj</groupid> <artifactid>aspectjweaver</artifactid> <version> 1.6 . 9 </version> </dependency> <dependency> <groupid>commons-pool</groupid> <artifactid>commons-pool</artifactid> <version> 1.5 . 3 </version> </dependency> <dependency> <groupid>commons-collections</groupid> <artifactid>commons-collections</artifactid> <version> 3.2 </version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-jms</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-oxm</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-web</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-webmvc</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-webmvc-portlet</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-struts</artifactid> <version>${spring.vesion}</version> </dependency> <dependency> <groupid>commons-httpclient</groupid> <artifactid>commons-httpclient</artifactid> <version> 3.1 </version> </dependency> <dependency> <groupid>com.dubbo</groupid> <artifactid>dubbo-api</artifactid> <version> 0.0 . 1 -SNAPSHOT</version> </dependency> </dependencies> <build> <finalname>dubbo-service</finalname> </build> </project> </code> |
好了,经过这么配置之后,我们的项目编码配置部分就大功告成了!
maven编译下三个项目,将dubbo-controller和dubbo-service放到tomcat容器中,启动tomcat容器! 出错啦! 为啥容器不起来!那是因为我们还少了主要的一步,那就是配置启动zookeeper,不然dubbo去zookeeper注册中心暴露服务地址不成功啦!
四、配置启动zookeeper
将下载的zookeeper压缩包,解压到一个磁盘目录上去,这里我指定的位置:D:\hwy\zookeeper-3.4.8,我们可以通过启动D:\hwy\zookeeper-3.4.8\bin\zkServer.cmd直接启动默认配置,默认端口为2181,当然我们也可以指定其他的配置,打开D:\hwy\zookeeper-3.4.8\conf\zoo.cfg,这个是zookeeper配置文件的位置,我们这里在指定一下数据目录以及数据日志目录
1
2
|
<code class = "hljs tex" >dataDir=D:\\hwy\\www\\zookeeper\\data dataLogDir=D:\\hwy\\www\\zookeeper\\log</code> |
启动zookeeper!
再次启动tomcat容器,是不是就成功啦!我们来访问下http://127.0.0.1:8090/dubbo-controller/test?name=hwy,看下返回结果是不是正确啦!
好啦!经过上边的一系列操作,一个Maven+SpringMVC+Dubbo 的demo就配置完成了,但是我们如果管理这些服务提供者以及消费者呢?当然,dubbo给我们提供了现成的后台管理网站,专门管理这些服务,应用,路由规则,动态配置,访问控制、权重控制、负载均衡等等,还可以查看系统日志,系统状态,系统环境等等,功能很是强大,通过这个后台,可以可视化控制你的服务和应用。
接下来我们来简单的看看后台系统,以及简单修改下权重控制啥的看看效果吧!我们将dubbo-admin-2.5.3.war包放到tomcat容器中,启动tomcat容器,访问http://127.0.0.1:8080/dubbo-admin-2.5.3
一、登录
注意:用户名和密码默认为root,当然为了安全起见,线上必须更改这个用户名和密码,
二、首页
注意:我们看到红色区域,里面显示 服务数:1 应用数:2 提供者数:1 消费者数:1 。
这就是刚刚我们启动的那个服务1(com.dubbo.service.TestService服务),应用2(test_consumer,test_provider),提供者1(192.168.2.193:20880) 消费者1(192.168.2.193),分别来张截图看看:
1、服务
2、应用
3、提供者
4、消费者
看看,是不是很直观的看到刚刚我们启动的服务,应用,提供者及消费者信息,这里,我们在演示下里面的功能之一权重调节功能,给不同的服务提供者分配不同的权限,看下消费者消费提供者的次数的变化。
为了达到演示效果,我将dubbo-service项目在复制一份放到tomcat里面去,并将TestServiceImpl类修改下sayHello()方法,并修改dubbo暴露端口号,通过输出不同信息,判断消费者调用哪个服务提供者提供的服务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<code class = "hljs java" > package com.dubbo.service.impl; import com.dubbo.service.TestService; /** * service impl * @author hwy * */ public class TestServiceImpl implements TestService{ public String sayHello(String name) { return name + " say hello word!" ; } }</code> |
接着,我们在修改下dubbo的暴漏端口号,修改applicationContext.xml里面的
1
|
<code class = "hljs xml" ><dubbo:protocol name= "dubbo" port= "20881" ></dubbo:protocol></code> |
好了,我们在重新启动tomcat,继续访问http://127.0.0.1:8080/dubbo-admin-2.5.3,我们能看到提供者里面,已经有我们刚新加的192.168.2.193:20881服务提供者啦!
这个时候我们在访问http://127.0.0.1:8090/dubbo-controller/test?name=hwy,当我们刷新时,返回的结果中除了上面截图返回的结果,也会返回刚新修改的返回结果,而且多刷新几次,两种结果出现的几率是一样哒!因为这里的提供者权重是一样的。
现在,我们修改这2个提供者的权重,我们让192.168.2.193:20881的权重降一半即50,另一个192.168.2.193:20880提高到200,我们在来刷新多次,看下返回的两种结果出现的几率是不是1:4。亲测,是哒!!!
好了,上边只是简单介绍了这个后台管理系统,里面还有很多很强大的功能,我也暂时还没完全玩转,大家一起尝试下,分享下吧!
dubbo是一个很强大的分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,我用到的只是冰山一角,他的更多功能,大家一起研究下吧!
170328、Maven+SpringMVC+Dubbo 简单的入门demo配置的更多相关文章
- Maven+SpringMVC+Dubbo 简单的入门demo配置
转载自:https://cloud.tencent.com/developer/article/1010636 之前一直听说dubbo,是一个很厉害的分布式服务框架,而且巴巴将其开源,这对于咱们广大程 ...
- maven+springmvc+dubbo+zookeeper
为什么要用dubbo? 还是让官方来解释吧: http://dubbo.io/User+Guide-zh.htm http://dubbo.io/ 一般 nginx+tomcat ...
- 关于Maven+Springmvc+Dubbo+Zookeeper整合
为什么要用dubbo? 还是让官方来解释吧: http://dubbo.io/User+Guide-zh.htm http://dubbo.io/ 一般 nginx+tomcat | - ...
- Dubbo与Zookeeper、Spring整合使用 maven+springmvc+dubbo+zookeeper
为什么要用dubbo? 还是让官方来解释吧: http://dubbo.io/User+Guide-zh.htm http://dubbo.io/ 一般 nginx+tomcat | - ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
- IntelliJ IDEA maven springmvc+shiro简单项目
搭建springmvc简单步骤如:http://www.cnblogs.com/grasp/p/9045242.html,这点就不在描述了. 新建和设置完工程的目录后,结构如下: pom.xml文件内 ...
- .net core api +swagger(一个简单的入门demo 使用codefirst+mysql)
前言: 自从.net core问世之后,就一直想了解.但是由于比较懒惰只是断断续续了解一点.近段时间工作不是太忙碌,所以偷闲写下自己学习过程.慢慢了解.net core 等这些基础方面学会之后再用.n ...
- IDEA下将dubbo简单项目跑Demo(2019.12版)
项目架构(聚合项目,父子模块) src没用,所以删去 选择maven项目,不用勾选模板骨架,直接main方法,因为不用到服务器 顺序是按照:添加pom依赖-接口实现类-配置文件 项目环境 IDE:In ...
- 【SSH系列】初识spring+入门demo
学习过了hibernate,也就是冬天,经过一个冬天的冬眠,当春风吹绿大地,万物复苏,我们迎来了spring,在前面的一系列博文中,小编介绍hibernate的相关知识,接下来的博文中,小编将继续介绍 ...
随机推荐
- 怎样在tsung中使用动态參数(二)
上一篇博客说过,在配置getOrderId请求时,能够用动态变量(order_id)解析和捕获服务端返回的json对象.这个变量能够作为接下来的订单确认请求(Confirm)的输入參数.看一下Conf ...
- mysql 开启慢查询 如何打开mysql的慢查询日志记录
mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,那如何打开mysql的慢查询日志记录呢,接下来将详细为您介绍 原文出自:http://www.jbxue ...
- IP地址欺骗
1.什么是IP地址欺骗按照IP网络协议,数据包头包含来源地和目的地信息,而IP地址欺骗,就是通过伪造数据包爆头,使显示的信息源不是实际的来源,就像这个数据包是从另一台计算机上发送的. 2.IP地址欺骗 ...
- 每日英语:The Perils Of Giving Advice
I know what you should do and here's my advice. How many times have you heard that (and groaned)? gr ...
- widnows 使用WIN32 APi 实现修改另一打开程序的窗口显示方式
1.GUI点击打开一个程序那边做一个判断. hwnd = 获取目标程序窗口句柄: if(hwnd == NULL /*不存在目标程序窗口句柄*/){ 创建进程,打开目标程序: } else{ ...
- PyCharm 在django程序中单独运行py文件
使用PyCharm开发django程序,发现如果不在命令行而在IDE的django项目中直接运行django程序,发现报错,程序如下: def main(): from people.models ...
- ibatis中integer类型
假如java代码中设置的返回类型是integer类型,ibatis实际上返回的是BigDecimal,也就是说 ibatis转换成integer默认是bigdecimal类型的
- CSS学习笔记(8)--纯CSS绘制三角形(各种角度)
纯CSS绘制三角形(各种角度) CSS三角形绘制方法,学会了这个,其它的也就简单. 我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多 ...
- const成员或者引用成员必须使用构造函数初始化列表的方式
#include<iostream.h> class A { const int a; int b; }; void main() { A obja; }编译出现如下错误:error C2 ...
- 同过增强Connection类[重写了close的方法]实现的从连接池取出连接并放回连接的简单的实现流程
package tk.dong.connection.util; import java.io.IOException;import java.io.InputStream;import java.i ...