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 ...
随机推荐
- MyBatis的执行流程分析
核心流程介绍 我们都知道 MyBatis 是对 JDBC 的封装,不管怎样,JDBC 的那一套还是不会变的,只是做了抽象.封装.归类等:所以我们顺着 JDBC 的思路来说下MyBatis的执行流程,J ...
- ElasticSearch 命令执行漏洞
漏洞编号:CVE-2014-3120 漏洞详情 CVE编号 CVE-2014-3120 漏洞级别 中危6.8 标题 Elasticsearch默认配置允许动态脚本执行漏洞 披露时间 2014/07/2 ...
- nginx下的proxy_pass使用
之前的文章说到了,return,rewrite的使用,以及它们的使用场景,今天再来说一种代理的使用,proxy_pass,它属于nginx下的ngx_http_proxy_module模块,没有显示的 ...
- python操作mongodb实现读写分离
读写分离 默认情况下,MongoClient 实例将查询发送到副本集的主要成员. 要使用副节点作为查询,以实现读写分离,我们必须更改读取首选项: 读取首选项在模块pymongo.ReadPrefere ...
- 华企盾DSC造成扫描仪无法扫描成pdf文件
解决方法:去掉缩略图策略,重启电脑
- 9.mysql的数据迁移到es中
背景 从开发的角度说,就是老板叫我用es了,没那么多为什么,爸爸说了算 从业务角度,mysql已经不能满足我对全文检索的需求了.我需要检索某一个字段包含"圣诞节刚刚过去"这一字符串 ...
- P3537 [POI2012]SZA-Cloakroom 题解
题目大意 有 \(n\) 件物品,每件物品有三个属性 \(a_i, b_i, c_i (a_i < b_i)\). 再给出 \(q\) 个询问,每个询问由非负整数 \(m, k, s\)组成,问 ...
- Python中的@abstractmethod
@abstractmethod 是 Python 中 abc 模块(Abstract Base Classes)提供的一个装饰器,用于声明抽象方法.抽象方法是指在抽象类中声明但没有提供具体实现的方 ...
- 日常Bug排查-集群逐步失去响应
前言 日常Bug排查系列都是一些简单Bug排查.笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材_ Bug现场 最近碰到一个产线问题,表现为某个应用集群所有的节点全部下线了.导致上游调用全部 ...
- 云图说|初识云数据库GaussDB(for Cassandra)
摘要:不用再为数据不一致苦恼,因为强一致的Cassandra来了,DBA们不用加班修数据了.GaussDB(for Cassandra)是一款基于华为自主研发的计算存储分离架构的分布式云数据库服务,是 ...