项目框架
接受请求并截图请求方式和相应的注解
package com.qcby.tomcat.Socket;
import com.qcby.tomcat.Request.Request;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private static Request request=new Request();
public static void main(String[] args) throws Exception {
// 1.打开通信端口 tomcat:8080 3306 ---------》进行网络通信
ServerSocket serverSocket=new ServerSocket(8080);
System.out.println("****************server start.....");
//2.接受请求数据
while (true){
Socket socket = serverSocket.accept(); //--------------------->注意:此时监听网卡的是:主线程
System.out.println("有客户进行了链接");
new Thread(()->{
//处理数据---------》数据的处理在于读和写
try {
handler(socket);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
public static void handler(Socket socket) throws Exception {
//读取请求的数据
InputStream inputStream = socket.getInputStream();
requestContext(inputStream);
}
public static void requestContext(InputStream inputStream) throws IOException {
//将bit流转为文字信息
int count = 0;
while (count == 0){
count = inputStream.available();
}
byte[] bytes = new byte[count];
inputStream.read(bytes);
String Context = new String(bytes);
System.out.println(Context);
//解析数据
if(Context.equals("")){
System.out.println("你输入了一个空请求");
}else {
String firstLine=Context.split("\\n")[0];
//使用 split("\\n") 方法将 Context 字符串按换行符(\n)分割,并提取出第一行。
String method=firstLine.split("\\s")[0];
//firstLine.split("\\s") 将 firstLine 按空白字符(包括空格、制表符等)进行分割,返回一个字符串数组。
//[0] 代表获取分割后的数组的第一个元素,通常这是 HTTP 方法。比如在 HTTP 请求中,第一行通常是 GET /index.html HTTP/1.1,那么第一部分 GET 就是方法。
String path=firstLine.split("\\s")[1];
//同样的,firstLine.split("\\s") 将 firstLine 按空白字符进行分割,返回一个字符串数组。
//[1] 代表获取分割后的数组的第二个元素,通常这是请求的路径部分。延续上面的例子,如果 firstLine 是 GET /index.html HTTP/1.1,则第二部分 /index.html 就是路径
System.out.println(path+" "+method);
request.setPath(method);
request.setMethod(path);
}
}
}
新建类来封装截取到的信息
package com.qcby.tomcat.Request;
public class Request {
private String path;
private String method;
public void setMethod(String method) {
this.method = method;
}
public String getPath(String path) {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getMethod() {
return method;
}
}
package com.qcby.tomcat.Response;
public class Response {
}
对请求方式进行判断
package com.qcby.tomcat.HttpServlet;
import com.qcby.tomcat.Request.Request;
import com.sun.deploy.nativesandbox.comm.Response;
public abstract class HttpServlet {
//HttpServlet方法是要被实现的一定不是抽象方法
//service用途 根据用户的请求方式来调用不同的方法去处理
//GET请求 doGet()方法去实现
//POST请求 doPost()方法实现
public void service(Request request, Response response)
{
if(request.getMethod().equals("GET"))
{
doGet(request,response);
}
else if(request.getMethod().equals("POST"))
{
doPost(request,response);
}
else if(request.getMethod().equals(""))
{
}
}
public abstract void doGet(Request request, Response response) ;
public abstract void doPost(Request request, Response response) ;
}
三个子类重写doGet和doPost方法
package com.qcby.tomcat.myweb;
import com.qcby.tomcat.HttpServlet.HttpServlet;
import com.qcby.tomcat.Request.Request;
import com.qcby.tomcat.webServlet.WebServlet;
import com.sun.deploy.nativesandbox.comm.Response;
@WebServlet(urlPatterns = {"MyFirstServlet"})
public class MyFirstServlet extends HttpServlet {
@Override
public void doGet(Request request, Response response) {
}
@Override
public void doPost(Request request, Response response) {
}
}
Second和Third同上
原理
接收到浏览器客户端发出的信息后获取注解和请求方式并封装到Request类的对象中
再HttpServlet中做出判断如果是Get则执行doGet方法但由于是抽象类无法直接执行方法,会选择让子类实现,可以进一步通过request获取的path进行判断为first还是second等再执行其对应的方法,这就将信息落实到了具体上
在HttpServlet中实现service方法来更好的匹配http的请求方式
实现接口类,就必须实现该接口类当中的所有方法
抽象类当中可以有抽象方法也可以有具体方法
抽象类实现了接口那么抽象类可以有选择的实现接口中的方法
对http访问原理的分析