servlet中根据请求类型做出判断

项目框架

接受请求并截图请求方式和相应的注解

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访问原理的分析

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值