美文网首页
手写SpringMVC:集成服务器之Web服务器&Servlet

手写SpringMVC:集成服务器之Web服务器&Servlet

作者: 谁家的猪 | 来源:发表于2019-07-29 08:23 被阅读0次

服务器和Servlet

Web服务器

  • 监听一个TCP端口
  • 转发请求,回收响应
  • 本身没有业务逻辑,连接操作系统和应用程序代码

系统Web服务模型

系统Web服务模型.png

Servlet

  • 一种规范:约束了Java服务器与业务类的通信方式
  • 一个接口:javax.servlet.Servlet
  • 一种Java类:实现了Servlet接口的应用程序类
    Servlet.png

Tomcat

  • Java原生,运行在JVM上
  • 多种并发模型,高性能
  • 支持嵌入应用程序

集成Tomcat

1. 添加tomcat依赖

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    // https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core
    compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '8.5.23'
}

2. 创建TomcatServer类

package com.istimeless.web.server;

import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;

/**
 * @author lijiayin
 */
public class TomcatServer {
    private Tomcat tomcat;
    private String[] args;
    
    public TomcatServer(String[] args){
        this.args = args;
    }
    public void startServer() throws LifecycleException {
        tomcat = new Tomcat();
        tomcat.setPort(6699);
        tomcat.start();
        
        Thread awaitThread = new Thread("tomcat_await_thread") {
            @Override
            public void run() {
                TomcatServer.this.tomcat.getServer().await();
            }
        };
        awaitThread.setDaemon(false);
        awaitThread.start();
    }
}

3. 修改MiniApplication类

package com.istimeless.starter;

import com.istimeless.web.server.TomcatServer;
import org.apache.catalina.LifecycleException;

/**
 * @author lijiayin
 */
public class MiniApplication {
    public static void run(Class<?> cls, String[] args){
        System.out.println("Hello Mini-Spring!");
        TomcatServer tomcatServer = new TomcatServer(args);
        try {
            tomcatServer.startServer();
        } catch (LifecycleException e) {
            e.printStackTrace();
        }
    }
}

4. 运行并测试

运行结果

测试结果.png
使用浏览器访问http://localhost:6699时返回404 测试结果.png

5. 创建TestServlet类,只需要实现service方法

package com.istimeless.web.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author lijiayin
 */
public class TestServlet implements Servlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        res.getWriter().println("test");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

6. 修改TomcatServer类

package com.istimeless.web.server;

import com.istimeless.web.servlet.TestServlet;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;

/**
 * @author lijiayin
 */
public class TomcatServer {
    private Tomcat tomcat;
    private String[] args;
    
    public TomcatServer(String[] args){
        this.args = args;
    }
    public void startServer() throws LifecycleException {
        tomcat = new Tomcat();
        tomcat.setPort(6699);
        tomcat.start();
        
        //注入servlet
        Context context = new StandardContext();
        context.setPath("");
        context.addLifecycleListener(new Tomcat.FixContextListener());
        //自己定义的servlet
        TestServlet servlet = new TestServlet();
        Tomcat.addServlet(context, "testServlet", servlet)
        .setAsyncSupported(true);
        //名称和上面的一致
        context.addServletMappingDecoded("/test.json", "testServlet");
        //context添加到host中
        tomcat.getHost().addChild(context);
        
        Thread awaitThread = new Thread("tomcat_await_thread") {
            @Override
            public void run() {
                TomcatServer.this.tomcat.getServer().await();
            }
        };
        awaitThread.setDaemon(false);
        awaitThread.start();
    }
}

7. 运行并测试

运行结果

测试结果.png
使用浏览器访问http://localhost:6699/test.json 测试结果.png

相关文章

网友评论

      本文标题:手写SpringMVC:集成服务器之Web服务器&Servlet

      本文链接:https://www.haomeiwen.com/subject/swzmlctx.html