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 ...
随机推荐
- nginx+lua+redis实现灰度发布
前言: 授人以鱼不如授人以渔.先学会用,在学原理,在学创造,可能一辈子用不到这种能力,但是不能不具备这种能力.这篇文章主要是沉淀使用nginx+lua+redis实现灰度,当我们具备了这种能力,随时可 ...
- 如何给图数据库 NebulaGraph 新增一种数据类型,以 Binary 为例
NebulaGraph 内核所自带的数据结构其实已经很丰富了,比如 List.Set.Map.Duration.DataSet 等等,但是我们平时在建表和数据写入的时候,可以用到的数据结构其实比较有限 ...
- 华企盾DSC申请解密在键盘中勾选会自动取消
解决方法:打开系统偏好设置-键盘--服务,由于服务中超出了系统支持的最大菜单数,删除两个即可
- 华企盾DSC服务器无法启动常见处理方法
先查看<服务问题判断>文档.常见的 1.授权已经过期--需延长授权 2.ERR_BASE64 – 机器码变更 3.不能在该计算机上使用该数据库,需要解锁才可以--打开服务器配置解锁数据库 ...
- rust 过程宏
简介 Rust 编程语言里面有两种宏系统,一种是声明宏(Declarative Macros),另一种为过程宏(Procedural Macros).声明宏和过程宏是两种基本上完全不一样的宏系统,编写 ...
- [研究]SpringBoot-MybatisPlus-Dynamic(多数据源)
SpringBoot-MybatisPlus-Dynamic(多数据源) 前言 基于工作上班累死了...打开自己电脑 不知道干些啥 就康康 PL 网站康康 更新了啥 咦~~~还挺多 看到了多数 ...
- 微信现金红包开发 PHP
第一次在cnblogs发文章 微信商家后台-现金红包开发 sdk <?php class wxPay { //配置参数信息 const SHANGHUHAO = "1430998xxx ...
- 由浅入深理解C#中的事件
目录 本文较长,给大家提供了目录,可以直接看自己感兴趣的部分. 前言 有关事件的概念 示例 简单示例 标准 .NET 事件模式 使用泛型版本的标准 .NET 事件模式 补充 总结 参考 ...
- 5s!用浏览器打造一个开箱即用的Linux系统
做为Linux系统管理员.或者是系统运维工程师,肯定会在工作遇到这样的需求:需要开发环境.测试环境.准生产环境等等环境,有时候建一个环境费时间不说,还容易出各种错误,好不容易建好了,可能还用不了几天. ...
- 2022年发布jar到Maven公共仓库最全攻略
2022年jar包发布到Maven公共仓库最全攻略 分几个步骤: 1.注册 issues.sonatype.org 账号 2.创建 issues 填写项目地址(github.gitee等) 3.验证域 ...