How Tomcat Works 1

2024-03-15 00:38
文章标签 tomcat works

本文主要是介绍How Tomcat Works 1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一直以来都在使用Tomcat作为servlet容器,很好奇tomcat的工作原理和结构。正好How tomcat works这本书讲解的比较清晰,虽然很多东西不懂,但也要慢慢来研究一下,这样才能有提高。

tomcat中最核心的部分是catalina,我们可以将其简单的看做由两个主要模块构成的,连接器connector和容器container,他们之间的对应关系如下

连接器负责为接收到得每个http请求构造一个resquest和response对象,然后传递给container,容器负责调用servlet的service方法。

下面就创建一个最简单的基于java的web服务器来响应请求。该服务器只能处理静态的资源请求。

一个基于java的web服务器要涉及到两个非常重要的类,socket和server socket,通过http协议进行通讯。

下面是一个HttpServer类

package server1;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 java.net.UnknownHostException;public class HttpServer {private boolean shutdown = false;//服务器是否停止public static String WEB_ROOT = System.getProperty("user.dir") + File.separator  + "webroot";//服务器资源目录public static void main(String[] args) {System.out.println(WEB_ROOT);HttpServer server = new HttpServer();server.await();}public void await(){ServerSocket serverSocket = null;int port = 8080;try {serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}Socket socket = null;InputStream input = null;OutputStream output = null;while(!shutdown){//不停的接受请求try {socket = serverSocket.accept();input = socket.getInputStream();output = socket.getOutputStream();} catch (IOException e) {e.printStackTrace();}Request request = new Request(input);request.parse();//解析urlResponse response = new Response(output);response.setRequest(request);try {response.sendStaticResource();//返回客户端socket.close();} catch (IOException e) {e.printStackTrace();}}}
}
下面是Request类

package server1;import java.io.IOException;
import java.io.InputStream;public class Request {private InputStream input;private String uri;public String getUri() {return uri;}public void setUri(String uri) {this.uri = uri;}public Request(InputStream input){this.input = input;}//读取客户端的请求,并解析出uripublic void parse(){StringBuffer request = new StringBuffer(2048);int i = 0;byte[] buffer = new byte[2048];try {i = input.read(buffer);} catch (IOException e) {e.printStackTrace();}for(int j=0;j<i;j++){request.append((char)buffer[j]);}System.out.println(request.toString());uri = this.parseUri(request.toString());System.out.println(uri);}//传入的requestString类似以GET /favicon.ico HTTP/1.1开头//该方法负责将uri截取出来public String parseUri(String requestString){int index1,index2;index1 = requestString.indexOf(" ");if(index1!=-1){index2 = requestString.indexOf(" ", index1+1);if(index2!=-1){return requestString.substring(index1+1, index2);}}return null;}}

下面是Response类

package server1;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;public class Response {private OutputStream output;Request request;private static final int  BUFFER_SIZE = 1024;public void setRequest(Request request) {this.request = request;}public Response(OutputStream output){this.output =  output;}public void sendStaticResource() throws IOException{byte[] bytes = new byte[BUFFER_SIZE];FileInputStream fis = null;try {File file = new File(HttpServer.WEB_ROOT,request.getUri());//判断资源目录下是否有此页面,有的话输出到客户端if(file.exists()){fis = new FileInputStream(file);int i = fis.read(bytes);while(i!=-1){output.write(bytes, 0, i);i = fis.read(bytes);}}else {// file not foundString errorMessage = "HTTP/1.1 404 File Not Found\r\n" +"Content-Type: text/html\r\n" +"Content-Length: 23\r\n" +"\r\n" +"<h1>File Not Found</h1>";output.write(errorMessage.getBytes());}} catch (Exception e) {e.printStackTrace();}finally{if(fis!=null)fis.close();}}
}
在浏览器中访问 http://localhost:8080/index.html即可。在工程的根目录建立webroot文件夹添加index.html即可访问到



这篇关于How Tomcat Works 1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810251

相关文章

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们

Tomcat性能参数设置

转自:http://blog.csdn.net/chinadeng/article/details/6591542 Tomcat性能参数设置 2010 - 12 - 27 Tomcat性能参数设置 博客分类: Java Linux Tomcat 网络应用 多线程 Socket 默认参数不适合生产环境使用,因此需要修改一些参数   1、修改启动时内存参数、并指定J

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。

Tomcat下载压缩包解压后应有如下文件结构

1、bin:存放启动和关闭Tomcat的命令的路径。 2、conf:存放Tomcat的配置,所有的Tomcat的配置都在该路径下设置。 3、lib:存放Tomcat服务器的核心类库(JAR文件),如果需要扩展Tomcat功能,也可将第三方类库复制到该路径下。 4、logs:这是一个空路径,该路径用于保存Tomcat每次运行后产生的日志。 5、temp:保存Web应用运行过程中生成的临时文件

docker学习系列(四)制作基础的base项目镜像--jdk+tomcat

前面已经完成了docker的安装以及使用,现在我们要将自己的javaweb项目与docker结合 1.1准备jdk+tomcat软件 ​​我下载了apache-tomcat-7.0.68.tar.gz和jdk-7u79-linux-x64.tar.gz,存储于Linux机器的本地目录/usr/ect/wt/下(利用xshell上传)。利用linux命令 tar -zxvf apache-tom

Tomcat服务详解

一、部署Tomcat服务器 JDK安装官方网址:https://www.oracle.com/cn/java Tomcat安装官方网址:Apache Tomcat® - Welcome! 安装JDK 1.获取安装包wget https://download.oracle.com/otn/java/jdk/8u411-b09/43d62d619be4e416215729597d70b8ac

龙芯小本8089b安装debian7+java+tomcat+mysql

之前团购了一个龙芯小本8089b,cpu很差劲,内存也只有1G,根本不能用来娱乐,于是想把它换个纯字符系统,然后搭建java服务器平台,用作局域网固定的mini服务器开发用。 以下是我搭建过程,当然实际比这做的多,这是多次尝试之后的成功过程,分享给大家,自己也做个笔记 debian7纯字符系统安装龙芯专有java安装tomcat安装mysql安装 一、debian7安装参考 圣域☆

eclipse中,更新JDK之后,启动Tomcat报错:

更新到这个版本之后,启动Tomcat报错: 四月 25, 2016 10:13:20 上午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent INFO: The APR based Apache Tomcat Native library which allows optimal performance in prod

在Eclipse环境下修改Tomcat编码的问题

问题: 由于BMS需要设置UTF-8编码,要不就会出现中文乱码问题; 一、项目保持UTF-8格式; 二、由于可能会多次移除项目、加载项目,不想每次都要修改tmp0\conf 原因: 如果在eclipse中配置了tomcat后,其实,tomcat所用的所有tomcat配置文件,都不是catalina_home/config下面的xml文件,而是在eclipse所创建的Serve

Eclipse发布Maven项目到tomcat,无法加载到lib文件夹下的jar包

BMS 解决方法: 当我们发布web项目到tomcat时,访问地址时会报一个classnotfound的错误,但是eclipse中的项目中都已经添加了相应的类,有一种比较容易犯的错误是,你没有把额外所需的jar包加到tomcat中的lib文件夹中,在这里介绍一种在项目中直接添加jar包到lib目录下:  右键已创建的web项目——properties属性——点击Deployment Assem