1.Tomcat定义以及作用
Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作。(不用程序员自己写代码去解析http协议规则,比如不用考虑响应码的问题,以及响应数据应该如何写),让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。
Tomcat 是一个流行的开源 Java Servlet 容器和 Web 服务器,由 Apache 软件基金会维护。它主要用于运行 Java 语言编写的 web 应用程序。Tomcat 的主要用途和功能包括:
-
Servlet 和 JSP 容器:Tomcat 提供了对 Java Servlet 和 JavaServer Pages (JSP) 的支持。这意味着它可以处理由这些技术生成的动态内容,并将其呈现给客户端浏览器。
-
Web 应用程序托管:Tomcat 能够部署和管理 Java web 应用程序。开发人员可以将他们的 web 应用程序打包成 WAR(Web Application Archive)文件,并部署到 Tomcat 中进行运行。
-
处理 HTTP 请求:Tomcat 充当 HTTP 服务器,接收来自客户端的 HTTP 请求并返回响应。它处理请求的路由、执行相关的 Servlet 或 JSP、并生成响应数据。
-
会话管理:Tomcat 提供了会话管理功能,可以跟踪用户会话的状态,这对于保持用户登录状态或跟踪用户行为非常重要。
-
连接池:Tomcat 集成了数据库连接池的功能,通过 JDBC 连接池管理数据库连接,提高了数据库操作的性能和效率。
-
日志记录:Tomcat 包含了用于记录服务器运行时日志的功能,包括访问日志、错误日志等,帮助开发人员和系统管理员进行故障排除和性能监控。
-
配置灵活性:Tomcat 提供了丰富的配置选项,允许用户根据实际需求进行定制。例如,可以通过配置文件设置连接数、线程池、虚拟主机等。
-
安全性:Tomcat 提供了多种安全功能,如用户认证、授权管理、SSL/TLS 支持等,帮助保护 web 应用程序免受未经授权的访问和其他安全威胁。
-
集成支持:Tomcat 可以与其他 Java EE 技术栈的组件进行集成,如 Spring、Hibernate 等框架,帮助开发者构建更复杂的 web 应用程序。
总体来说,Tomcat 是一个强大的工具,适用于开发和部署 Java web 应用程序,特别是在开发和测试环境中非常流行。它提供了全面的功能以支持各种 web 应用程序的需求。
bin:目录下有两类文件
- 一种是以 .bat 结尾的,是Windows系统的可执行文件,
- 一种是以 .sh 结尾的,是Linux系统的可执行文件。
tomcat使用:
正常启动:双击tomcat解压目录/bin/startup.bat文件,即可启动tomcat
正常关闭:bin/shutdown.bat
bin: 可执行文件
conf: 配置文件
lib: tomcat依赖的jar包
logs: 日志文件
temp: 临时文件
webapps: 应用发布目录(就是以后项目部署的目录)
work: 工作目录
把项目部署到webapps,我们就可以通过浏览器进行访问
spring-boot-starter的web起步依赖里面有内嵌的tomcat
2.自定义Tomcat服务器
/** 自定义web服务器*/
public class Server {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(8080); // 监听指定端口System.out.println("server is running...");while (true){Socket sock = ss.accept();System.out.println("connected from " + sock.getRemoteSocketAddress());//开启线程处理请求Thread t = new Handler(sock);t.start();}}
}class Handler extends Thread {Socket sock;public Handler(Socket sock) {this.sock = sock;}public void run() {try (InputStream input = this.sock.getInputStream(); OutputStream output = this.sock.getOutputStream()) {handle(input, output);} catch (Exception e) {try {this.sock.close();} catch (IOException ioe) {}System.out.println("client disconnected.");}}private void handle(InputStream input, OutputStream output) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));// 读取HTTP请求:boolean requestOk = false;String first = reader.readLine();if (first.startsWith("GET / HTTP/1.")) {requestOk = true;}for (;;) {String header = reader.readLine();if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕break;}System.out.println(header);}System.out.println(requestOk ? "Response OK" : "Response Error");if (!requestOk) {// 发送错误响应:writer.write("HTTP/1.0 404 Not Found\r\n");writer.write("Content-Length: 0\r\n");writer.write("\r\n");writer.flush();} else { // 发送成功响应://读取html文件,转换为字符串InputStream is = Server.class.getClassLoader().getResourceAsStream("html/a.html");BufferedReader br = new BufferedReader(new InputStreamReader(is));StringBuilder data = new StringBuilder();String line = null;while ((line = br.readLine()) != null){data.append(line);}br.close();int length = data.toString().getBytes(StandardCharsets.UTF_8).length;writer.write("HTTP/1.1 200 OK\r\n");writer.write("Connection: keep-alive\r\n");writer.write("Content-Type: text/html\r\n");writer.write("Content-Length: " + length + "\r\n");writer.write("\r\n"); // 空行标识Header和Body的分隔writer.write(data.toString());writer.flush();}}
可以看出自定义Tomcat处理请求以及响应都是比较繁琐的,有了Tomcat帮我们封装http协议,
让我们只需要把精力放在业务逻辑上。
3.Tomcat处理请求后响应的响应码对应的作用
响应码 :::
1xx
响应中 --- 临时状态码。表示请求已经接受,告诉客户端应该继续请求或者如果已经
完成则忽略
2xx 成功 --- 表示请求已经被成功接收,处理已完成
3xx 重定向 --- 重定向到其它地方,让客户端再发起一个请求以完成整个处理
4xx
客户端错误 --- 处理发生错误,责任在客户端,如:客户端的请求一个不存在的资
源,客户端未被授权,禁止访问等
5xx
服务器端错误 --- 处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,
HTTP版本不支持等