`
ryanflyer
  • 浏览: 101007 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Tomcat :一个简单的Servlet容器

 
阅读更多

Servlet容器处理Servlet请求的简单流程图如下图所示:

 



 UML类图如下图所示:



 

HttpServletProcessor类:

 

package com.flyer.tomcat.first;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 一个简单的http服务器
 * <p />
 * 
 * @author Administrator
 */
public class HttpServer {
    
    private static Logger logger = LoggerFactory.getLogger(HttpServer.class);

    private final static String SHUTDOWN_COMMAND = "/shutdown";
    
    public final static String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot";

    private boolean shutdown = false;

    public static void main(String[] args) {
        logger.info("server start");
        HttpServer server = new HttpServer();
        try {
            server.await();
        } catch (IOException e) {
            logger.error("io exception",e);
        }
    }

    private void await() throws IOException {

        ServerSocket serverSocket = new ServerSocket(9090,1,InetAddress.getByName("127.0.0.1"));
        InputStream input = null;
        OutputStream output = null;
        while (!shutdown) {
            Socket socket = null;
            try {
                socket = serverSocket.accept();
                input = socket.getInputStream();
                output = socket.getOutputStream();
                Request request = new Request(input);
                request.parse();
                Response response = new Response(output);
                response.setRequest(request);
                
                if(request.getUri().startsWith("/servlet")){
                    ServletProcessor servletProcessor = new ServletProcessor();
                    servletProcessor.process(request, response);
                }else{
                    StaticResourceProcessor processor = new StaticResourceProcessor();
                    processor.process(request, response);
                }
                
                
                socket.close();

                shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                
                input.close();
                output.close();
            }
        }

    }

}
 

代码

 

package com.flyer.tomcat.first;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Servlet请求处理器
 * <p />
 * 
 * @author Administrator
 */
public class ServletProcessor implements Processor {

    private static Logger logger = LoggerFactory.getLogger(ServletProcessor.class);

    // private final static String FILE_PATH = Constants.getClassPath() + File.separator + "com" +
    // File.separator
    // + "flyer" + File.separator + "tomcat" + File.separator + "first" + "" + File.separator;

    @Override
    public void process(HttpServletRequest request, HttpServletResponse response) {
        Request internalRequest = (Request) request;
        String uri = internalRequest.getUri();
        String servletClassName = uri.substring(uri.lastIndexOf("/") + 1);
        URLClassLoader classLoader = null;
        File file = new File(Constants.getClassPath());
        URL url = null;
        try {
            url = file.toURI().toURL();
        } catch (MalformedURLException e) {
            logger.error("convert to url error", e);
        }
        logger.info("url:" + url);
        URL[] urls = new URL[1];
        urls[0] = url;
        classLoader = new URLClassLoader(urls);
        Class<?> myClass = null;
        try {
            myClass = classLoader.loadClass(servletClassName);
        } catch (ClassNotFoundException e) {
            logger.error("class not found", e);
        }
        Servlet servlet = null;
        if (myClass != null) {
            try {
                servlet = (Servlet) myClass.newInstance();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                servlet.service(request, response);
            } catch (ServletException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}
 

改进:

 

添加facade类,为的是Request类中的parse方法和getUri方法不被Servlet类访问。

 


 

  • 大小: 28.3 KB
  • 大小: 39.2 KB
  • 大小: 22.6 KB
分享到:
评论
1 楼 daichenqiu 2015-09-18  
写的很好啊,赞!

相关推荐

    一个简单的servlet容器

    [深入剖析Tomcat]一书第二章中 一个简单的servlet容器实现

    Java WEB 篇八 tomcat 容器是如何创建 servlet 类实例?用到了什么原 理?.xmind

    Java WEB 篇八 tomcat 容器是如何创建 servlet 类实例?用到了什么原 理?

    Servlet 容器工作原理解析

    一个 Web 工程在 Servlet 容器中是如何启动的? Servlet 容器如何解析你在 web.xml 中定义的 Servlet ?用户的请求是如何被分配给指定的 Servlet 的? Servlet 容器如何管理 Servlet 生命周期?你还将了解到最新的 ...

    Tomcat中的Host和Engine级别的servlet容器.docx

    Engine容器表示Catalina的整个Servlet引擎,如果使用了Engine容器,那么它总是处于容器层级的最顶层,添加到Enginer容器中的子容器通常是org.apache.catalina.Host 或者 org.apahce.catalina.Context的实现,默认...

    tomcatweb:servlet规范servlet容器tomcat源码研究

    供应商: Oracle CorporationIDE idea2019第一个问题--idea控制台乱码### 乱码解决tomcat conf下logging.properties设置文件编码 其中由如下一行,默认utf-8java.util.logging.ConsoleHandler.encoding = G

    servlet容器工作原理

    这是针对Tomcat中的servlet容器工作原理的详解

    JavaWeb程序Tomcat及Servlet配置:实例与组件包-zip压缩包

    Tomcat是一个开源的Java Servlet容器,用于提供Web应用程序的运行环境。 配置Tomcat通常包括设置端口号、虚拟主机、SSL/TLS证书、线程池等。 Tomcat的server.xml文件是主要的配置文件,其中定义了上述的各种设置。 ...

    Tomcat面试专题.pdf

    1、Tomcat 的缺省端口是多少,怎么修改? 2、tomcat 有哪几种 Connector 运行模式(优化)? 3、Tomcat 有几种部署方式? 4、tomcat 容器是如何创建 servlet 类实例...13.Tomcat 一个请求的完整过程 14.Tomcat 工作模式?

    apache-tomcat-9.0.41.zip

    Apache是web服务器,Tomcat是应用服务器,apache tomcat只是一个servlet容器,是Apache的扩展;Apache和Tomcat都可以做为独立的web服务器来运行,但是Apache不能解释java程序。我后面Javaweb程序设计文章里面在...

    2024年java面试题-tomcat面试题

    Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容 器、进程内的Servlet容器和进程外的Servlet容器。 进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类: Tomcat作为应用程序...

    简单的Servlet容器

    《深入剖析Tomcat》书中第二章代码,在此基础上做了修改详细请参考博客https://blog.csdn.net/TYOUKAI_/article/details/88540763

    apache-tomcat-7.0.42.rar

    Apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展。 Apache和Tomcat都可以做为独立的web服务器来运行,但是Apache不能解释java程序(jsp,servlet)。 两者都是一种容器,只...

    tomcat_role:安装Apache Tomcat Java Servlet容器的角色

    为了进行测试,使用Docker作为驱动程序并使用Goss验证程序的Molecule这个角色需要一个预先安装了Java的系统。 为此,它确实建议使用idealista的java角色: idealista.java-role 正在安装 从GitHub创建或添加到您的...

    apache-tomcat 6到9的4个版本,Tomcat 6.zip Tomcat 7.zip Tomcat 8.zip Tomcat 9.zip

    Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为 Web服务器的一些特有功能,如Tomcat管理...

    apache-tomcat-8.5.37

    tomcat是一个免费的,开放源代码的Web应用服务器,是Apache软件基金会项目中的一个核心项目,由Apache ,Sun和一些公司以及个人共同开发而成,深受Java爱好者的喜爱,是一款比较流行的web应用服务器。 Tomcat由一...

    bitnami-docker-tomcat:Bitnami Tomcat Docker映像

    (通常称为Tomcat)是由开发的开源Web服务器和servlet容器。 Tomcat实现了几种Java EE规范,包括Java Servlet,JavaServer Pages(JSP),Java EL和WebSocket,并提供了运行Java代码的“纯Java” HTTP Web服务器...

    Apache Tomcat 9.0

    Tomcat是一个开放源代码、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。Tomcat Server是根据servlet和JSP规范进行执行的,因此我们就可以说Tomcat Server也实行了Apache-Jakarta规范且比绝大多数商业...

    Tomcat 7 API文档

    Tomcat 7 API文档。...另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。

    tomcat 8.5

    Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 由于 Tomcat 本身也内含了一个 HTTP ...

    core:焊接,包括Servlet容器和Java SE的集成,示例和文档

    Weld也可以在仅Servlet的环境(Tomcat,Jetty)或纯Java SE环境中使用。 有关更多详细信息,请参见 。 建筑焊接 要构建Weld,只需运行 $ mvn全新安装 在WildFly中升级焊接 首先,设置JBOSS_HOME环境属性,使其指向...

Global site tag (gtag.js) - Google Analytics