一个简单的Web服务器-支持Servlet请求

上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢?

判断是否是Servlet请求

首先Web服务器需要判断当前请求是否是Servlet请求。

像Tomcat,通过解析HTTP报文拿到请求url后,就可以根据web.xml来查找是否有匹配的Servlet,如果有匹配则认定为是一个有效的Servlet请求,然后将request,response传给对应的servlet的service()方法。

这里既然要实现一个简单的Web服务器,就怎么简单怎么来。认定以“/servlet”为前缀的url为Servlet请求,比如http://localhost:8080/servlet/cn.edu.jxau.tomcat.PrimitiveServlet,则是一个请求cn.edu.jxau.tomcat.PrimitiveServlet的Servlet请求。判定逻辑如下

// HttpServer 类的service()方法,是整个服务器的入口
        while (true) {
            try (Socket socket = serverSocket.accept()) {
                System.out.println("客户端建立连接:" + socket);
                Request request = new Request(socket.getInputStream());
                if (Objects.isNull(request.getUri())) {
                    continue;
                }
                if (isShutdownComment(request)) { //如果是shutdown命令,则关闭服务器
                    break;
                }
                Response response = new Response(request, socket.getOutputStream());
                if (request.getUri().startsWith("/servlet/")) { // 请求Servlet资源
                    new ServletProcessor().process(request, response);
                } else { // 请求静态资源
                    response.sendStaticResource();
                    // 书上使用了StaticResourceProcessor new StaticResourceProcessor().process(request,response);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

加载Servlet

如果确实是Servlet请求,下一步就是实例化Servlet并调用service()方法。

首先需要知道请求是哪个Servlet:根据url拿到Servlet的名称

然后需要调用Servlet的service()方法:使用ClassLoader加载对应的Servlet字节码,然后实例化Servlet,调用service()方法,传入request,response。

// ServletProcessor 类的process()方法,用于处理Servlet请求
public void process(Request request, Response response) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, ServletException {

        String uri = request.getUri();
        String servletName = uri.substring(uri.lastIndexOf("/") + 1);
        File file = new File(Constants.WEB_ROOT);
        String urlStr = new URL("file", null, file.getCanonicalPath() + File.separator).toString(); //使用File协议
        URL[] urlArr = new URL[1];
        urlArr[0] = new URL(urlStr);
        System.out.println(Arrays.toString(urlArr));
        URLClassLoader loader = new URLClassLoader(urlArr);
        Class clazz = loader.loadClass(servletName); // 根据Servlet的全路径名加载Servlet字节码
        Servlet servlet = (Servlet) clazz.newInstance(); // 实例化Servlet
        servlet.service(request, response); //调用Servlet.service()
    }

PrimitiveServlet的实现如下,实现了Servlet接口,service()方法的实现是重点。

public class PrimitiveServlet implements Servlet {

    public void init(ServletConfig config) throws ServletException {
        System.out.println("-----init");
    }

    public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        out.println("HTTP/1.1 200 Status OK\r\n");
        out.println("Content-Type: text/html\r\n");
        out.println("Content-Length: 36\r\n");
        out.println("\r\n");
        out.println("<h1>Status OK</h1>");
        out.print("<h1>Status OK</h1>");
    }

    public void destroy() {
        System.out.println("-------destroy");
    }

    public String getServletInfo() {
        return null;
    }

    public ServletConfig getServletConfig() {
        return null;
    }
}

参考

1.《How Tomcat Works》 - Budi Kurniawan

原文地址:https://www.cnblogs.com/fudashi233/p/10995402.html

时间: 2024-10-26 23:20:02

一个简单的Web服务器-支持Servlet请求的相关文章

自己模拟的一个简单的web服务器

首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器是如何工作的 servlet容器是一个复杂的系统.不过,一个servlet容器要为一个servlet的请求提供服务,基本上有三件事要做: 1,创建一个request对象并填充那些有可能被所引用的servlet使用的信息,如参数.头部. cookies.查询字符串. URI 等等.一个 request

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的Web服务器来体会一下. 一.请求-处理-响应模型 1.1 基本过程介绍 每一个HTTP请求都会经历三个步凑:请求-处理-响应:每当我们在浏览器中输入一个URL时都会被封装为一个HTTP请求报文发送到Web服务器,而Web服务器则接收并解析HTTP请求报文,然后针对请求进行处理(返回指定的HTML页面

使用 Nodejs 搭建一个简单的Web服务器

使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 作为一个Web服务器应具备以下几个功能: 1.能显示以.html/.htm结尾的Web页面 2.能直接打开以.js/.css/.json/.text结尾的文件内容 3.显示图片资源 4.自动下载以.apk/.

如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个iPhone/iPad开发者,能够自己写一个简单的web服务器将是很有用的. 例如,你可能希望在软件启动时显示一些来自服务器的更新,或者在服务器端保存一些用户数据.除了你的想象力,没有什么能限制你了. 在第一篇中,我们将会一步一步的建立一个web服务器,基于promo code system(促销码系

一个简单的web服务器

static void Main(string[] args) { IPAddress localAddress = IPAddress.Loopback;//获取本机的ip地址 IPEndPoint endPoint =new IPEndPoint(localAddress, 49155); Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); socket.Bind

【WEB】一个简单的WEB服务器

WEB 服务器如何工作的? HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务,HTTP目前协议的版本是1.1.HTTP是一种无状态的协议,无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息.HT

(一)一个简单的Web服务器

万丈高楼平地起,首先我们必须了解 超文本传输协议(HTTP) 以后才能够比较清晰的明白web服务器是怎么回事. 1. 浅析Http协议 HTTP是一种协议,允许web服务器和浏览器通过互联网进行来发送和接受数据.它是一种请求和响应协议.客户端请求一个文件而服务器响应请求.HTTP使用可靠的TCP连接--TCP默认使用80端口.第一个HTTP版是HTTP/0.9,然后被HTTP/1.0所替代.正在取代HTTP/1.0的是当前版本HTTP/1.1,它定义于征求意见文档(RFC) 2616,可以从ht

一个简单的web服务器例子

一个简单的web容器小例子,功能十分简单,只能访问静态资源,对于新手来说还是有一定的意义.主要分三个类 1.server类:主要功能开启socketServer,阻塞server,接收socket访问,解析request,创建request,作出响应 public class TestServer1 { private boolean shutdown = false; // web目录webroot public static final String WEB_ROOT = System.ge

学习用node.js建立一个简单的web服务器

一.建立简单的Web服务器涉及到Node.js的一些基本知识点: 1.请求模块 在Node.js中,系统提供了许多有用的模块(当然你也可以用JavaScript编写自己的模块,以后的章节我们将详细讲解),如http.url等.模块封装特定的功能,提供相应的方法或属性,要使用这些模块,需要先请求模块获得其操作对象. 例如要使用系统的http模块,可以这样写: var libHttp = require('http'); //请求HTTP协议模块 这样,以后的程序将可以通过变量libHttp访问ht