
Java-10 项目挑战
Task1.maven
1.什么是maven?
- 请你自行上网查阅资料,了解一下什么是maven
- 什么是jar包?
- maven和jar包有关系吗?有什么关系?
- 我们为什么要用maven?
2. 试着下载maven吧!
- 你的java环境配置好了吗?
- 别忘了配置环境变量
- 看看你的maven是什么版本
3.什么是maven仓库?
- 怎么配置你自己的本地仓库位置?
- 需要的jar包本地仓库没有?让我们去看看远程仓库!
- 远程仓库不止一种!你知道中央仓库是什么吗?
- 私服又是什么?
4.创建你自己的maven项目!
- 你的IDEA关联maven了吗?
- 一个maven项目都需要配置什么参数?你能说说看吗?
- 你的项目结构是什么样的?你知道你的代码、配置文件、测试代码、测试配置文件、maven项目配置文件都在哪里吗?
- pom.xml文件?
- 这是什么?
- 它有什么用?
- 它的基本配置有哪些?
- 你能通过这个文件管理你的jar包版本、项目类型吗?
- 怎么导入你需要的jar包?去找到答案吧!
5.启动你的maven!
- maven的常用命令有哪些你知道吗?
- 图形化界面是非常方便的,去观察IDEA中的maven面板,看看可以快速执行哪些maven指令吧!
6.恭喜你~你已经对maven有初步的了解了!现在,向着最终项目进发吧!
Task2.快递取件码查询系统
李华成功通过高考考进了UESTC,开学第一天他发现他的宿舍在校外,如果要拿快递的话要去到校内的菜鸟驿站,比较远。所以他决定手搓一个快递柜,请你帮他编写一个客户端和服务端的程序,实现通过快递单号查询取件码的功能。
知识准备
maven
HTTP(HyperText Transfer Protocol):应用层协议,用于客户端(浏览器/APP)与服务端之间的数据传输。
特点
- 无状态(每个请求独立,默认不记录历史)
- 基于请求-响应模型
- 支持明文(HTTP)和加密(HTTPS)传输
请求报文样例:
http
POST /login HTTP/1.1
Host: api.example.com
Content-Type: application/json
User-Agent: Mozilla/5.0
Content-Length: 45
{"username": "admin", "password": "123456"}POST /login HTTP/1.1
Host: api.example.com
Content-Type: application/json
User-Agent: Mozilla/5.0
Content-Length: 45
{"username": "admin", "password": "123456"}响应报文样例:
http
HTTP/1.1 200 OK
Content-Type: application/json
Set-Cookie: sessionid=abc123; Path=/
Content-Length: 30
{"status": "success", "token": "xyz"}HTTP/1.1 200 OK
Content-Type: application/json
Set-Cookie: sessionid=abc123; Path=/
Content-Length: 30
{"status": "success", "token": "xyz"}需要了解常见的请求方式,以及常见的响应状态码(404 应该是最熟悉的状态码了)
JSON数据格式
json本质来说就是一个字符串,是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。
类似Java中的HashMap,通过键值的匹配来读取数据
键名必须用双引号包裹,值的类型多种多样,还可以嵌套,例如:
json
{
"key1": "value1",
"key2": 123,
"key3": true,
"key4": null,
"key5": { "nestedKey": "nestedValue" },
"key6": [1, 2, 3]
}{
"key1": "value1",
"key2": 123,
"key3": true,
"key4": null,
"key5": { "nestedKey": "nestedValue" },
"key6": [1, 2, 3]
}如果遇到很复杂的json字符串,还可以用这个网站帮助分析结构
JSON Formatter & Validator (curiousconcept.com)
TCP/IP 通信
项目实现
客户端
先要在pom.xml中导入解析json格式的依赖
xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.51</version>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.51</version>
</dependency>用fastjson构造json格式
java
//fastjson这个库需要定义一个类作为映射
public class User {
private String name;
private int age;
// 必须有无参构造函数
// 必须提供 getter/setter (Fastjson 依赖它们)
}
//然后通过给这个类实例化具体数据构建json
User user = new User("Alice", 25);
String json = JSON.toJSONString(user);
// 结果: {"age":25,"name":"Alice"}//fastjson这个库需要定义一个类作为映射
public class User {
private String name;
private int age;
// 必须有无参构造函数
// 必须提供 getter/setter (Fastjson 依赖它们)
}
//然后通过给这个类实例化具体数据构建json
User user = new User("Alice", 25);
String json = JSON.toJSONString(user);
// 结果: {"age":25,"name":"Alice"}解析json格式
java
//{"age":25,"name":"Alice"}
String json = "{\"name\":\"Alice\",\"age\":25}";
User user = JSON.parseObject(json, User.class);
//这时候user这个对象就保存了对应字段的内容//{"age":25,"name":"Alice"}
String json = "{\"name\":\"Alice\",\"age\":25}";
User user = JSON.parseObject(json, User.class);
//这时候user这个对象就保存了对应字段的内容代码实现部分
java
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Client {
private static final String SERVER_URL = "http://localhost:8000/query";
public static void main(String[] args) {
while (true) {
//读取用户输入的快递单号和手机号
try {
/*
用fastjson这个依赖构造json格式,构造的样例为
{"trackingNumber":"SF123456789","phone":"19867653558"}
*/
// 将这个json格式的数据写入请求体并发送HTTP POST请求
// 读取响应,状态码是200才是响应成功
if (connection.getResponseCode() == 200) {
/*
解析服务端响应的json格式,拿到取件码,拿不到就显示msg的内容
样例:
例如:{"pick_code":4096,"msg":"success"}
{"pick_code":null,"msg":"手机号不正确"}
*/
}
} else {
System.out.println("查询失败,状态码: " + connection.getResponseCode());
}
} catch (IOException e) {
System.out.println("请求发生错误: " + e.getMessage());
}
}
scanner.close();
System.out.println("客户端已退出");
}
}import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Client {
private static final String SERVER_URL = "http://localhost:8000/query";
public static void main(String[] args) {
while (true) {
//读取用户输入的快递单号和手机号
try {
/*
用fastjson这个依赖构造json格式,构造的样例为
{"trackingNumber":"SF123456789","phone":"19867653558"}
*/
// 将这个json格式的数据写入请求体并发送HTTP POST请求
// 读取响应,状态码是200才是响应成功
if (connection.getResponseCode() == 200) {
/*
解析服务端响应的json格式,拿到取件码,拿不到就显示msg的内容
样例:
例如:{"pick_code":4096,"msg":"success"}
{"pick_code":null,"msg":"手机号不正确"}
*/
}
} else {
System.out.println("查询失败,状态码: " + connection.getResponseCode());
}
} catch (IOException e) {
System.out.println("请求发生错误: " + e.getMessage());
}
}
scanner.close();
System.out.println("客户端已退出");
}
}服务端
java
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Server {
private static final int PORT = 8000;
private static final Map<String, String> expressMap = new HashMap<>();
public static void main(String[] args) throws IOException {
// 初始化一些测试数据
initializeExpressData();
// 创建HTTP服务器,监听指定端口
HttpServer server = HttpServer.create(new InetSocketAddress(PORT), 0);
// 设置路由和处理程序
server.createContext("/query", new QueryHandler());
// 启动服务器
server.start();
System.out.println("Server started on port " + PORT);
}
private static void initializeExpressData() {
// 添加一些测试数据
//键的构成是 快递单号_手机号
expressMap.put("SF123456789_13005433678", "1234");
expressMap.put("JD987654321_19805433168", "5678");
expressMap.put("YT456789123_13905479698", "9012");
expressMap.put("ZT789123456_18505433664", "3456");
}
static class QueryHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
if ("POST".equals(exchange.getRequestMethod())) {
// 读取请求体
try {
// 解析JSON请求(例如:{"trackingNumber":"SF123456789"})获得单号
// 在expressMap中查询取件码,
/*
构建响应的json
例如:{"pick_code":4096,"msg":"success"}
如果找不到快递则是{"pick_code":null,"msg":"根据各种情况写提示信息"}
*/
// 发送响应
} catch (Exception e) {
// 处理异常,返回400状态码(Bad Request)
}
} else {
// 非POST请求返回405 Method Not Allowed
exchange.sendResponseHeaders(405, -1);
}
}
}
}import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Server {
private static final int PORT = 8000;
private static final Map<String, String> expressMap = new HashMap<>();
public static void main(String[] args) throws IOException {
// 初始化一些测试数据
initializeExpressData();
// 创建HTTP服务器,监听指定端口
HttpServer server = HttpServer.create(new InetSocketAddress(PORT), 0);
// 设置路由和处理程序
server.createContext("/query", new QueryHandler());
// 启动服务器
server.start();
System.out.println("Server started on port " + PORT);
}
private static void initializeExpressData() {
// 添加一些测试数据
//键的构成是 快递单号_手机号
expressMap.put("SF123456789_13005433678", "1234");
expressMap.put("JD987654321_19805433168", "5678");
expressMap.put("YT456789123_13905479698", "9012");
expressMap.put("ZT789123456_18505433664", "3456");
}
static class QueryHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
if ("POST".equals(exchange.getRequestMethod())) {
// 读取请求体
try {
// 解析JSON请求(例如:{"trackingNumber":"SF123456789"})获得单号
// 在expressMap中查询取件码,
/*
构建响应的json
例如:{"pick_code":4096,"msg":"success"}
如果找不到快递则是{"pick_code":null,"msg":"根据各种情况写提示信息"}
*/
// 发送响应
} catch (Exception e) {
// 处理异常,返回400状态码(Bad Request)
}
} else {
// 非POST请求返回405 Method Not Allowed
exchange.sendResponseHeaders(405, -1);
}
}
}
}本题提交方式
出题人联系方式
出题人QQ:1507015236