java项目实践-webapp-mytomcat-day16
1. http协议
CS架构

建立连接“三次握手” 断开连接 “四次挥手”
三次握手:
client:可以与你建立连接吗?
server:可以的
client: 我也可以了
四次挥手:
client:我要断开
server:可以断开
server:我要断开
client:可以断开
双方都有一个确认 断开的过程 因为连接的建立 双方都有资源打开 都有port号被占用 双方需要将打开的资源关闭掉
请求的格式:

响应的格式:

2. 自定义的web框架

核心:Request Response类
applet
servlet
3. 具体实现
Request Response
package com.msb.mytomcat;
import java.io.IOException;
import java.io.InputStream;
/**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 9:24
* @Description: com.msb.mytomcat
* @version: 1.0
*/
public class Request {
//请求方法 GET POST PUT DELETE ...
private String requestMethod;
// 请求的url
private String requestUrl;
// 构造方法 将请求的inputStream 转化成Request对象
public Request(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;// 每次读取的长度
String str = null;
if ((len=inputStream.read(buffer))>0){
str = new String(buffer, 0, len);
}
// GET / HTTP/1.1
String data = str.split("\r\n")[0];
String[] params = data.split(" ");
this.requestMethod = params[0];
this.requestUrl = params[1];
}
public String getRequestMethod() {
return requestMethod;
}
public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
}
public String getRequestUrl() {
return requestUrl;
}
public void setRequestUrl(String requestUrl) {
this.requestUrl = requestUrl;
}
@Override
public String toString() {
return "Request{" +
"requestMethod='" + requestMethod + '\'' +
", requestUrl='" + requestUrl + '\'' +
'}';
}
}
package com.msb.mytomcat;
import java.io.IOException;
import java.io.OutputStream;
/**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 9:24
* @Description: com.msb.mytomcat
* @version: 1.0
*/
public class Response {
private OutputStream outputStream;
public Response(OutputStream outputStream) {
this.outputStream = outputStream;
}
// 将返回的str 包装成前端能识别的 响应
public void write(String str) throws IOException {
StringBuilder builder = new StringBuilder();
builder.append("HTTP/1.1 200 OK\n")
.append("Content-Type:text/html\n")
.append("\r\n")
.append("<html>")
.append("<body>")
.append("<h1>"+str+"</h1>")
.append("</body>")
.append("</html>");
this.outputStream.write(builder.toString().getBytes());
this.outputStream.flush();
this.outputStream.close();
}
}
maping
package com.msb.mytomcat;
import java.util.HashMap;
/**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 10:06
* @Description: com.msb.mytomcat
* @version: 1.0
*/
// 请求utl 与 处理类servlet 映射关系
public class Mapping {
public static HashMap<String, String> map = new HashMap<>();
static {
map.put("/mytomcat", "com.msb.mytomcat.Servlet");
}
public HashMap<String, String> getMap(){
return map;
}
}
抽象类HttpServlet
package com.msb.mytomcat;
import java.io.IOException;
/**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 10:10
* @Description: com.msb.mytomcat
* @version: 1.0
* 抽象类
*/
public abstract class HttpServlet {
public static final String METHOD_GET = "GET";
public static final String METHOD_POST = "POST";
public abstract void doGet(Request request, Response response) throws IOException;
public abstract void doPost(Request request, Response response) throws IOException;
// 根据请求的方式 调用对应的方法
public void service(Request request, Response response) throws IOException {
if (METHOD_GET.equals(request.getRequestMethod())){
doGet(request, response);
} else if (METHOD_POST.equals(request.getRequestMethod())){
doPost(request, response);
}
}
}
实现类Servlet
package com.msb.mytomcat;
import java.io.IOException;
/**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 10:23
* @Description: com.msb.mytomcat
* @version: 1.0
*/
public class Servlet extends HttpServlet{
@Override
public void doGet(Request request, Response response) throws IOException {
response.write("get method !");
}
@Override
public void doPost(Request request, Response response) throws IOException {
response.write("post method !");
}
}
服务端:
package com.msb.mytomcat;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 10:26
* @Description: com.msb.mytomcat
* @version: 1.0
* 服务端
*/
public class Server {
public static void startServer(int port) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException {
ServerSocket serverSocket = new ServerSocket(port);
Socket socket = null;
while (true){
socket = serverSocket.accept();
// input output
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
Request request = new Request(inputStream);
Response response = new Response(outputStream);
String url = request.getRequestUrl();
String clazz = new Mapping().getMap().get(url);// 处理类的包
if(clazz!=null){
Class<Servlet> servletClass = (Class<Servlet>) Class.forName(clazz);
Servlet servlet = servletClass.newInstance();
servlet.service(request, response);
System.out.println("200 ok "+ request.toString());
}
}
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
startServer(8080);
}
}
4. 启动


java项目实践-webapp-mytomcat-day16的更多相关文章
- 一次从0到1的java项目实践清单
虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...
- 一份从0到1的java项目实践清单
虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...
- 【java项目实践】具体解释Ajax工作原理以及实现异步验证username是否存在+源代码下载(java版)
一年前,从不知道Ajax是什么,伴随着不断的积累,到如今常常使用,逐渐有了深入的认识. 今天,假设想开发一个更加人性化,友好,无刷新,交互性更强的网页,那您的目标一定是Ajax. 介绍 在具体讨论Aj ...
- SuperDiamond在JAVA项目中的三种应用方法实践总结
SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...
- webapp项目新建java class、webapp目录树结构
上一篇中我们介绍了IDEA.maven新建webapp项目的两种方式,分别是:在命令行中用模板创建.直接在IDEA中选择骨架创建. 但都存在一个问题:目录树不完整.有些人会不知道接下来该如何创建j ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 【项目实践】手把手带你搞定SSM
以项目驱动学习,以实践检验真知 前言 现在使用Java后端开发使用的技术栈基本上比较统一:Spring + SpringMVC + Mybatis,即大家常说的SSM.虽然现在流行的做法是使用Spri ...
- Hangfire项目实践分享
Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...
- Hangfire项目实践
Hangfire项目实践分享 Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget ...
- 使用maven来管理您的java项目
maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试.发布和报告等.在大型项目开发中,使用maven来管理是必不可少的. 一.安装maven 1.W ...
随机推荐
- Celery将任务分发到不同的队列,交给不同的Worker处理
https://docs.celeryq.dev/en/stable/userguide/routing.html#routing-tasks https://blog.csdn.net/wangle ...
- 关于Secure Hash Algorithm加密算法
一.概述 SHA(Secure Hash Algorithm)加密算法是一种广泛应用的密码散列函数,由美国国家安全局(NSA)设计,用于保障数据的安全性和完整性.SHA算法经历了多个版本的更新,目前主 ...
- Linux的一些的常用命令
小杰笔记: 记录一下Linux的一些常见命令: 1:Linux关机与重启的命令: shutdown:关机 shutdown -h 30 30秒后关机 reboot 重启 sync:将数据由内存同步到硬 ...
- CSS 基础 5 - CSS 选择器
基础 #id{} ID 选择器 .class{} 类选择器 tag{} 标签选择器,tag 可以是 h1, p, div, span, img, nav, footer... *{} 通用选择器,选择 ...
- 【manim动画教程】--目录(完结)
manim是一个生成数学教学视频的动画引擎. 它用编程的方式创建精美的数学动画,让数学更加易懂. 本教程简单介绍了 manim 的基本使用方式,基于 v0.17.2 版本 manim 安装 manim ...
- 文心一言 VS 讯飞星火 VS chatgpt (48)-- 算法导论6.1 6题
值为<23,17,14,6,13,10,1,5,7,12>的数组是一个最大堆吗? 文心一言: 是的,这个数组是一个最大堆. 最大堆是一种特殊的二叉树,它满足以下性质:对于任意节点 x,其子 ...
- picker组件增加搜索item条目的功能
picker组件顶部有搜索框,能搜索条目,如果条目很多的时候,上下翻很麻烦了,而且不容易找到,可以先全查,然后js搜索 wxml <button bindtap="openFlag&q ...
- LeetCode 贪心篇(455、55)
455. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 ...
- 源生创新 云享未来|GOTC全球开源技术峰会华为云云原生精彩时刻
摘要:GOTC 全球开源技术峰会在上海张江科学会堂成功举办. 本文分享自华为云社区<源生创新 云享未来|GOTC全球开源技术峰会华为云云原生精彩时刻>,作者:华为云云原生团队. GOTC ...
- 用火山引擎DataTester,这家企业开始了“数据驱动增长”
年末购物季已至,近些年来,预售抵扣.平台满减.品类专享券.大额补贴--动辄四五种计算方法叠加的大促活动,让不少消费者"懵"感十足.同一样商品,到底谁家卖的最便宜?比价平台应声发展而 ...