企业中代码维护

相信你写过大一点的项目的时候,各个目录下总是有各种各样的文件,实体类、业务层、控制返回层、数据库调用层…等等,这些文件如果很多,并且是多个模块之间,那就两个字,无解

既然它业务有很多种类型,分模块,我们代码也分模块就完事了

如何分模块

根据需求来分啦

搜索模块 一个tomcat端口20001

购买模块 一个tomcat端口20002

用户模块 一个tomcat端口20003

我们概念上分了多个模块,实际如何体现?:

录制_2020_08_12_10_15_23_692

如何创建多模块?

很简单,但是这个问题可以拓展着说,所以请看我的另一篇:(暂未整理)

多个服务器之间数据传递

首先思考下,项目与项目之间有哪些除了技术以外的不同之处?

  1. 服务器
  2. 开发语言
  3. 操作系统

我们如何在接口的调用中做到无需考虑上面的兼容问题?

可以用 HttpClient 或者 RestTemplate

这两者的区别就是,httpclient是不属于spring维护的,所以用spring框架,导入相对麻烦。但是resttemplate,从名字就能看出来是spring系列的东西,没错,这个是spring集合好的工具,如果用这个将方便一些。

HttpClient:

get请求

预计效果:

通过代码的形式访问浏览器上的内容

具体实现:

pom:

1
2
3
4
5
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.4</version>
</dependency>

HP01:

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
package com.http_client;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import javax.swing.text.html.parser.Entity;
import java.io.IOException;

public class HP01 {
public static void main(String[] args) throws IOException {
// 使用http请求百度,用java代码代体浏览器
CloseableHttpClient aDefault = HttpClients.createDefault();

// 创建客户端对象,理解为java实现了一个浏览器
HttpGet httpGet = new HttpGet("http://lsbd.fun");
// 输入网址,理解为定义变量,确定请求类型
// 回车,理解为执行命令接收响应结果
CloseableHttpResponse execute = aDefault.execute(httpGet);

System.out.println(execute.getStatusLine());

// 对结果进行进一步处理
if (execute.getStatusLine().getStatusCode() == 200) {
// 获取响应体
HttpEntity entity = execute.getEntity();
String s = EntityUtils.toString(entity, "utf-8");
System.out.println(s);
}
execute.close();
aDefault.close();
}
}

运行效果:

录制_2020_08_12_10_33_35_981

上面的例子是get请求的但是没有参数,来个有参数的:

get请求带参数

预期效果:

通过java代码访问百度,并且通过向百度的搜索引擎传递参数,接收查询返回数据

具体实现:

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
package com.http_client;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class HP02 {
public static void main(String[] args) throws IOException, URISyntaxException {
// 使用http请求百度,用java代码代体浏览器
CloseableHttpClient aDefault = HttpClients.createDefault();
// 带个参数 观察百度搜索引擎发现传参格式是 百度网址/s?参数名=参数方法
URI build = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "java").build();
// 创建客户端对象,理解为java实现了一个浏览器
HttpGet httpGet = new HttpGet(build);
// 输入网址,理解为定义变量,确定请求类型
// 回车,理解为执行命令接收响应结果
CloseableHttpResponse execute = aDefault.execute(httpGet);
// 对结果进行进一步处理
if (execute.getStatusLine().getStatusCode() == 200) {
// 获取响应体
HttpEntity entity = execute.getEntity();
//不加编码类型,中文乱码
String s = EntityUtils.toString(entity, "utf-8");
System.out.println(s);
}
execute.close();
aDefault.close();
}
}

运行效果:

录制_2020_08_12_10_42_23_236

post请求

预期效果:

发送post请求,使我们的请求被成功响应,因为正规的网站是不允许用技术直接将网站源码爬取下来的,所以我们要伪装起来才可以接收响应,也就是反爬虫

具体实现:

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
package com.http_client;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class DoPOST {

public static void main(String[] args) throws Exception {

// 创建Httpclient对象

CloseableHttpClient httpclient = HttpClients.createDefault();

// 创建http POST请求

HttpPost httpPost = new HttpPost("http://www.oschina.net/");

// 把自己伪装成浏览器。否则开源中国会拦截访问

httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");


CloseableHttpResponse response = null;

try {

// 执行请求

response = httpclient.execute(httpPost);

// 判断返回状态是否为200

if (response.getStatusLine().getStatusCode() == 200) {

// 解析响应数据

String content = EntityUtils.toString(response.getEntity(), "UTF-8");

System.out.println(content);

}

} finally {

if (response != null) {

response.close();

}

// 关闭浏览器

httpclient.close();

}


}

}

运行效果:

录制_2020_08_12_10_51_36_47

post带参数请求:

预期效果:

将自己封装好的实体类,通过我们的特殊实现提交到目标服务器上

具体实现:

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
package com.http_client;

import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.util.ArrayList;
import java.util.List;

public class DoPOSTParam {


public static void main(String[] args) throws Exception {

// 创建Httpclient对象

CloseableHttpClient httpclient = HttpClients.createDefault();

// 创建http POST请求,访问开源中国

HttpPost httpPost = new HttpPost("http://www.oschina.net/search");


// 根据开源中国的请求需要,设置post请求参数

List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);

parameters.add(new BasicNameValuePair("scope", "project"));

parameters.add(new BasicNameValuePair("q", "java"));

parameters.add(new BasicNameValuePair("fromerr", "8bDnUWwC"));

// 构造一个form表单式的实体

UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);

// 将请求实体设置到httpPost对象中

httpPost.setEntity(formEntity);


CloseableHttpResponse response = null;

try {

// 执行请求

response = httpclient.execute(httpPost);

// 判断返回状态是否为200

if (response.getStatusLine().getStatusCode() == 200) {

// 解析响应体

String content = EntityUtils.toString(response.getEntity(), "UTF-8");

System.out.println(content);

}

} finally {

if (response != null) {

response.close();

}

// 关闭浏览器

httpclient.close();

}

}

}

运行效果:

录制_2020_08_12_10_56_17_921

httpclient其实就是java中的爬虫