Java:Tomcat是什么
1. 下载Tomcat
官网:apache-tomcat-9.0.41
安装地址:C:\Environmental\apache-tomcat-9.0.41
2. 配置环境变量
第一步,在系统环境变量中添加两个变量
变量名:CATALINA_HOME
变量值:C:\Environmental\apache-tomcat-9.0.41
变量名:CATALINA_BASE
变量值:C:\Environmental\apache-tomcat-9.0.41
第二步,在系统环境变量的 Path 中添加两个路径引用
%CATALINA_HOME%\bin
%CATALINA_HOME%\lib
3.简单的代码实现
package com.icss.itomcat;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class HttpServer extends Thread{
// 服务器监听socket
private ServerSocket serverSocket;
public HttpServer(int port) {
try {
this.serverSocket = new ServerSocket(port);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
while(true) {
try {
// 监听连接,返回当前连接的套接字
System.out.println("服务器启动成功:");
Socket clientSocket = this.serverSocket.accept();
// 启动子线程,处理当前的socket请求
WorkThread wt = new WorkThread(clientSocket);
new Thread(wt).start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new HttpServer(80).start();
}
}
package com.icss.itomcat;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class WorkThread implements Runnable{
// 保存当前连接的套接字
private Socket socket;
public WorkThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
// 处理请求数据和发送响应数据
try {
InputStream in = this.socket.getInputStream(); // 输入流,读取请求数据
OutputStream out = this.socket.getOutputStream();// 输出流发送响应数据
// 读取请求头
String requestHeader = ""; // 保存请求头信息
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = br.readLine()) != null && line.length() >0) {
requestHeader += line + "\r\n";
}
// 解析请求头
String[] headers = requestHeader.split("\r\n");
String url = headers[0].split(" ")[1];
if(url.equals("/index.html")) { // 如果请求index.html
String filePath = this.getClass().getResource("/").getPath();
File file = new File(filePath + "index.html");
StringBuilder sb=new StringBuilder();
sb.append("HTTP/1.0 200 OK\r\n");
sb.append("Content-Type: text/html;charset=utf-8\r\n");
sb.append("X-Ua-Compatible: IE=Edge,chrome=1\r\n");
String path = this.getClass().getResource("/").getPath();
System.out.println(path);
BufferedReader reader = null;
StringBuffer sbf = new StringBuffer();
try {
reader = new BufferedReader(new FileReader(file));
String tempStr;
while ((tempStr = reader.readLine()) != null) {
sbf.append(tempStr);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
sb.append("Content-length: ").append(sbf.toString().getBytes().length).append("\r\n");
sb.append("\r\n");
System.out.println(sb.append(sbf.toString()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(sb.toString());
bw.flush();
}else if(url.equals("/tomcat.png")) { // 图片 tomcat.png
StringBuilder sb=new StringBuilder();
sb.append("HTTP/1.0 200 OK\r\n");
sb.append("Content-Type: image/png\r\n");
sb.append("X-Ua-Compatible: IE=Edge,chrome=1\r\n");
String path = this.getClass().getResource("/").getPath();
System.out.println(path);
String fileName = path + "tomcat.png";
File file = new File(fileName);
DataInputStream fis=new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
byte[] theData=new byte[(int)file.length()];
fis.readFully(theData);
fis.close();
sb.append("Content-length: ").append(theData.length).append("\r\n");
sb.append("\r\n");
System.out.println(sb.toString());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(sb.toString());
bw.flush();
out.write(theData);
out.flush();
}else {
// 实现最简单的应答(response)
String responseHeader = ""; // 封装应答头
String responseContent = "<html><head></head>"
+ " <body>欢迎访问XXX的个人主页"
+ "</body></html>"; // 封装应答的内容
responseHeader += "HTTP/1.1 200 OK\r\n";
responseHeader += "Content-Type: text/html;charset=utf-8\r\n";
responseHeader += "Content-length: " + responseContent.getBytes().length + "\r\n";
responseHeader += "\r\n"; // 响应头结束
String content = responseHeader + responseContent; // 头和响应的内容拼在一起
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(content);
bw.flush();
}
in.close();
out.close();
socket.close();
System.out.println(requestHeader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
}
}
}
总结:
1、Tomcat是运行在JVM中的一个进程。它定义为“中间件”,顾名思义是一个在Java项目与JVM之间的中间容器。
2、Web项目的本质,是一大堆的资源文件和方法。Web项目没有入口方法(即main方法),这意味着Web项目中的方法不会自动运行起来。
Web项目部署进Tomcat的webapp中的目的是很明确的,那就是希望Tomcat去调用写好的方法去为客户端返回需要的资源和数据。
3、Tomcat可以运行起来,并调用写好的方法。那么,Tomcat一定有一个main方法。对于Tomcat而言,它并不知道用户会有什么样的方法,这些都只是在项目被部署进webapp下后才确定的。
由此,可知Tomcat用到了Java的反射来实现类的动态加载、实例化、获取方法、调用方法。但是部署到Tomcat的中的Web项目必须是按照规定好的接口来进行编写,以便进行调用。
特点:
Tomcat运行时占用的系统资源小,扩展性好,支持负载均衡与邮件服务等开发应用系统常用的功能。Tomcat是一个开源的web服务器,且是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应对HTML页面的访问请求。实际上Tomcat部分是Apache服务器的扩展,所以当你运行tomcat时,它实际上作为一个Apache独立的进程单独运行的。
当配置正确时,Apache为HTML页面服务,而Tomcat实际上运行JSP页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。