Java 编程实战:如何用 Java 编写一个简单而强大的 Tomcat

学习完了JavaWeb,为了深入了解tomcat,打算手撕tomcat搭建自己的tomcat,希望对来访小伙伴也有帮助

引言

        Tomcat 是一个开源的 Web 服务器和 Servlet 容器,它可以提供动态 Web 内容的处理和交互功能。Tomcat 是用 Java 语言编写的,需要运行在 Java 虚拟机上,所以它可以跨平台运行,并且可以与其他 Java 技术集成。Tomcat 是 Java EE 规范的一个实现,它支持 Servlet、JSP、EL、JSTL 等标准技术,以及 Struts、Spring、Hibernate 等流行框架。

        Tomcat 的设计和实现是基于模块化和可扩展的原则,它由多个组件构成,每个组件都有自己的功能和职责。Tomcat 的核心组件是 Catalina,它是一个 Servlet 容器,负责管理和执行 Servlet。其他组件包括 Coyote,它是一个连接器,负责接收和解析 HTTP 请求;Jasper,它是一个 JSP 引擎,负责编译和执行 JSP 页面;Cluster,它是一个集群模块,负责实现负载均衡和会话复制等功能;以及其他一些辅助组件,如安全模块、日志模块、管理模块等。

        本文将介绍如何使用 Java 编写 Tomcat,并实现一个简单的 Web 服务器和 Servlet 容器。本文还将介绍 Tomcat 的基本框架和相关配置,并使用 Eclipse 进行开发和调试。本文旨在帮助读者理解和掌握 Tomcat 的原理和用法。

目录

(一)创建项目

(二)编写代码

1.Server

2.Connector

3.request

4.response

5.Processor

6.StaticProcessor

7.DynamicProcessor

8.ServletContainer

9.Servlet

10.HelloServlet

(三)编写配置文件

(四)编写 Web 应用

(五)测试和调试

(六)总结


使用 Java 编写 Tomcat

(一)创建项目

首先,我们需要创建一个 Java 项目,并命名为 MyTomcat。我们可以使用 Eclipse 或者其他 IDE 来创建项目,也可以使用命令行或者文本编辑器来创建项目。在本文中,我们使用 Eclipse 作为开发工具。

在 Eclipse 中,我们选择 File -> New -> Java Project,然后输入项目名称 MyTomcat,并选择 JDK 作为 JRE System Library。点击 Finish 完成项目的创建。

        我们创建的项目的结构,如下:有一个 src 文件夹,用于存放源代码文件;有一个 bin 文件夹,用于存放编译后的字节码文件;有一个 lib 文件夹,用于存放依赖的 jar 包;有一个 webapps 文件夹,用于存放 Web 应用;有一个 conf 文件夹,用于存放配置文件;有一个 logs 文件夹,用于存放日志文件。

(二)编写代码

        接下来,我们需要编写代码来实现 Tomcat 的功能。我们需要实现以下几个类:

  • Server:这是 Tomcat 的主类,负责启动 Tomcat 服务器,并初始化各个组件。
  • Connector:这是连接器类,负责接收客户端的 HTTP 请求,并将其封装成 Request 对象。
  • Request:这是请求类,负责存储请求的相关信息,如请求方法、请求路径、请求参数等。
  • Response:这是响应类,负责存储响应的相关信息,如响应状态码、响应头、响应体等。
  • Processor:这是处理器类,负责根据请求的类型(静态或动态)来选择不同的处理方式,并将结果写入 Response 对象。
  • StaticProcessor:这是静态处理器类,负责处理静态资源的请求,如 HTML、CSS、JS、图片等。
  • DynamicProcessor:这是动态处理器类,负责处理动态资源的请求,如 Servlet、JSP 等。
  • ServletContainer:这是 Servlet 容器类,负责管理和执行 Servlet。
  • Servlet:这是一个接口,定义了 Servlet 的规范,所有的 Servlet 都必须实现这个接口。
  • HelloServlet:这是一个具体的 Servlet 类,用于演示 Tomcat 的功能。

        下面逐一介绍这些类的代码和功能。

1.Server

        Server 类是 Tomcat 的主类,它有一个 main 方法,用于启动 Tomcat 服务器,并初始化各个组件。它有一个 ServerSocket 属性,用于监听客户端的连接请求。它有一个 Connector 属性,用于创建和管理连接器。它有一个 port 属性,用于指定服务器的监听端口。它有一个 webapps 属性,用于指定 Web 应用的根目录。它有一个 conf 属性,用于指定配置文件的路径。它有一个 servletContainer 属性,用于创建和管理 Servlet 容器。

        Server 类的代码如下:

package com.mytomcat;

import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Tomcat 的主类,负责启动服务器,并初始化各个组件
 */
public class Server {

    // 服务器套接字
    private ServerSocket serverSocket;
    // 连接器
    private Connector connector;
    // 服务器监听端口
    private int port = 8080;
    // Web 应用根目录
    private String webapps = "webapps";
    // 配置文件路径
    private String conf = "conf/web.xml";
    // Servlet 容器
    private ServletContainer servletContainer;

    /**
     * 构造方法,初始化各个组件
     */
    public Server() {
        try {
            // 创建服务器套接字,并绑定端口
            serverSocket = new ServerSocket(port);
            System.out.println("Server started at port: " + port);
            // 创建连接器
            connector = new Connector();
            // 创建 Servlet 容器,并加载配置文件
            servletContainer = new ServletContainer(new File(conf));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 启动服务器的方法
     */
    public void start() {
        while (true) {
            try {
                // 接受客户端的连接请求,返回一个套接字
                Socket socket = serverSocket.accept();
                System.out.println("Client connected: " + socket.getInetAddress());
                // 交给连接器处理
                connector.process(socket, webapps, servletContainer);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 主方法,创建并启动服务器实例
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }
}

2.Connector

        Connector 类是连接器类,它负责接收客户端的 HTTP 请求,并将其封装成 Request 对象。它有一个 process 方法,用于处理客户端的连接请求。它有一个 Processor 属性,用于创建和管理处理器。

        Connector 类的代码如下:

package com.mytomcat;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

/**
 * 连接器类,负责接收客户端的 HTTP 请求,并将其封装成 Request 对象
 */
public class Connector {

    // 处理器
    private Processor processor;

    /**
     * 构造方法,初始化处理器
     */
    public Connector() {
        processor = new Processor();
    }

    /**
     * 处理客户端连接请求的方法
     * @param socket 套接字
     * @param webapps Web 应用根目录
     * @param servletContainer Servlet 容器
     */
    public void process(Socket socket, String webapps, ServletContainer servletContainer) {
        try {
            // 获取输入流,读取请求内容
            InputStream inputStream = socket.getInputStream();
            // 创建请求对象,并解析请求内容
            Request request = new Request(inputStream);
            // 创建响应对象,并关联套接字的输出流
            Response response = new Response(socket.getOutputStream());
            // 交给处理器处理
            processor.process(request, response, webapps, servletContainer);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭套接字
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3.request

        Request 类是请求类,负责存储请求的相关信息,如请求方法、请求路径、请求参数等。它有一个构造方法,用于接收输入流,并解析请求内容。它有一些属性和方法,用于获取和设置请求的相关信息。

        Request 类的代码如下:

package com.mytomcat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

/**
 * 请求类,负责存储请求的相关信息,如请求方法、请求路径、请求参数等
 */
public class Request {

    // 输入流
    private InputStream inputStream;
    // 请求方法
    private String method;
    // 请求路径
    private String uri;
    // 请求参数
    private Map<String, String> parameters;

    /**
     * 构造方法,接收输入流,并解析请求内容
     * @param inputStream 输入流
     */
    public Request(InputStream inputStream) {
        this.inputStream = inputStream;
        // 创建参数映射对象
        parameters = new HashMap<>();
        // 解析请求内容
        parse();
    }

    /**
     * 解析请求内容的方法
     */
    private void parse() {
        try {
            // 创建缓冲读取器,读取输入流中的内容
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            // 读取第一行内容,即请求行
            String requestLine = br.readLine();
            System.out.println("Request Line: " + requestLine);
            // 如果请求行不为空,则继续解析
            if (requestLine != null) {
                // 将请求行按空格分割成三部分,分别是请求方法、请求路径和协议版本
                String[] parts = requestLine.split(" ");
                // 获取并设置请求方法
                method = parts[0];
                // 获取并设置请求路径
                uri = parts[1];
                // 如果请求路径中包含 ? ,则表示有查询字符串,需要进一步解析
                if (uri.contains("?")) {
                    // 将请求路径按 ? 分割成两部分,分别是路径和查询字符串
                    parts = uri.split("\\?");
                    // 重新设置请求路径为 ? 前面的部分
                    uri = parts[0];
                    // 获取查询字符串
                    String queryString = parts[1];
                    // 如果查询字符串不为空,则继续解析
                    if (queryString != null && !queryString.isEmpty()) {
                        // 将查询字符串按 & 分割成多个键值对
                        parts = queryString.split("&");
                        // 遍历每个键值对
                        for (String part : parts) {
                            // 将键值对按 = 分割成两部分,分别是键和值
                            String[] pair = part.split("=");
                            // 获取并设置参数的键和值,并放入参数映射对象中
                            parameters.put(pair[0], pair[1]);
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取输入流的方法
     * @return 输入流对象
     */
    public InputStream getInputStream() {
        return inputStream;
    }

    /**
     * 获取请求方法的方法
     * @return 请求方法字符串
     */
    public String getMethod() {
        return method;
    }

    /**
     * 获取请求路径的方法
     * @return 请求路径字符串
     */
    public String getUri() {
        return uri;
    }

    /**
     * 根据参数名获取参数值的方法
     * @param name 参数名字符串
     * @return 参数值字符串,如果没有找到,则返回 null
     */
    public String getParameter(String name) {
        return parameters.get(name);
    }
}

4.response

        Response 类是响应类,负责存储响应的相关信息,如响应状态码、响应头、响应体等。它有一个构造方法,用于接收输出流,并初始化响应内容。它有一些属性和方法,用于获取和设置响应的相关信息。它还有一个 send 方法,用于发送响应内容到输出流中。

        Request 类的代码如下:

package com.mytomcat;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * 响应类,负责存储响应的相关信息,如响应状态码、响应头、响应体等
 */
public class Response {

    // 输出流
    private OutputStream outputStream;
    // 响应状态码
    private int status;
    // 响应头
    private Map<String, String> headers;
    // 响应体
    private StringBuilder body;
    // 缓冲写入器
    private PrintWriter writer;

    /**
     * 构造方法,接收输出流,并初始化响应内容
     * @param outputStream 输出流
     */
    public Response(OutputStream outputStream) {
        this.outputStream = outputStream;
        // 创建响应头映射对象
        headers = new HashMap<>();
        // 创建响应体字符串对象
        body = new StringBuilder();
        // 创建缓冲写入器,关联响应体字符串对象
        writer = new PrintWriter(body);
    }

    /**
     * 获取输出流的方法
     * @return 输出流对象
     */
    public OutputStream getOutputStream() {
        return outputStream;
    }

    /**
     * 获取缓冲写入器的方法
     * @return 缓冲写入器对象
     */
    public PrintWriter getWriter() {
        return writer;
    }

    /**
     * 设置响应状态码的方法
     * @param status 响应状态码整数
     */
    public void setStatus(int status) {
        this.status = status;
    }

    /**
     * 设置响应头的方法
     * @param name 响应头名字符串
     * @param value 响应头值字符串
     */
    public void setHeader(String name, String value) {
        headers.put(name, value);
    }

    /**
     * 设置响应头 Content-Type 的方法
     * @param contentType Content-Type 字符串
     */
    public void setContentType(String contentType) {
        setHeader("Content-Type", contentType);
    }

    /**
     * 设置响应头 Content-Length 的方法
     * @param contentLength Content-Length 整数
     */
    public void setContentLength(int contentLength) {
        setHeader("Content-Length", String.valueOf(contentLength));
    }

    /**
     * 向响应体中写入字符串的方法
     * @param s 字符串对象
     */
    public void println(String s) {
        writer.println(s);
    }

    /**
     * 向响应体中写入字节数组的方法
     * @param b 字节数组对象
     * @param off 起始位置整数
     * @param len 长度整数
     */
    public void write(byte[] b, int off, int len) {
        writer.write(new String(b, off, len));
    }

5.Processor

        Processor 类是处理器类,它负责根据请求的类型(静态或动态)来选择不同的处理方式,并将结果写入 Response 对象。它有一个 process 方法,用于处理请求和响应。它有一个 StaticProcessor 属性,用于创建和管理静态处理器。它有一个 DynamicProcessor 属性,用于创建和管理动态处理器。

        Processor 类的代码如下:

package com.mytomcat;

/**
 * 处理器类,负责根据请求的类型(静态或动态)来选择不同的处理方式,并将结果写入 Response 对象
 */
public class Processor {

    // 静态处理器
    private StaticProcessor staticProcessor;
    // 动态处理器
    private DynamicProcessor dynamicProcessor;

    /**
     * 构造方法,初始化静态处理器和动态处理器
     */
    public Processor() {
        staticProcessor = new StaticProcessor();
        dynamicProcessor = new DynamicProcessor();
    }

    /**
     * 处理请求和响应的方法
     * @param request 请求对象
     * @param response 响应对象
     * @param webapps Web 应用根目录
     * @param servletContainer Servlet 容器
     */
    public void process(Request request, Response response, String webapps, ServletContainer servletContainer) {
        // 获取请求路径
        String uri = request.getUri();
        // 判断请求路径是否以 /servlet/ 开头,如果是,则表示请求动态资源,否则表示请求静态资源
        if (uri.startsWith("/servlet/")) {
            // 交给动态处理器处理
            dynamicProcessor.process(request, response, servletContainer);
        } else {
            // 交给静态处理器处理
            staticProcessor.process(request, response, webapps);
        }
    }
}

6.StaticProcessor

        StaticProcessor 类是静态处理器类,它负责处理静态资源的请求,如 HTML、CSS、JS、图片等。它有一个 process 方法,用于读取静态资源文件,并将其内容写入 Response 对象。

        StaticProcessor 类的代码如下:

package com.mytomcat;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 静态处理器类,负责处理静态资源的请求,如 HTML、CSS、JS、图片等
 */
public class StaticProcessor {

    /**
     * 处理静态资源请求的方法
     * @param request 请求对象
     * @param response 响应对象
     * @param webapps Web 应用根目录
     */
    public void process(Request request, Response response, String webapps) {
        try {
            // 获取请求路径
            String uri = request.getUri();
            // 根据 Web 应用根目录和请求路径构造文件路径
            String filePath = webapps + uri;
            // 创建文件对象
            File file = new File(filePath);
            // 判断文件是否存在且可读,如果是,则表示找到了对应的静态资源,否则表示没有找到对应的静态资源
            if (file.exists() && file.canRead()) {
                // 设置响应状态码为 200 OK
                response.setStatus(200);
                // 设置响应头 Content-Type 为根据文件扩展名判断的 MIME 类型
                response.setContentType(getContentType(file));
                // 设置响应头 Content-Length 为文件长度
                response.setContentLength((int) file.length());
                // 创建文件输入流,读取文件内容
                FileInputStream fis = new FileInputStream(file);
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = fis.read(buffer)) != -1) {
                    // 将文件内容写入响应体中
                    response.write(buffer, 0, len);
                }
                // 关闭文件输入流
                fis.close();
            } else {
                // 设置响应状态码为 404 Not Found
                response.setStatus(404);
                // 设置响应头 Content-Type 为 text/html
                response.setContentType("text/html");
                // 设置响应体为一个简单的错误页面
                response.println("<html><head><title>404 Not Found</title></head><body>");
                response.println("<h1>404 Not Found</h1>");
                response.println("<p>The requested resource " + uri + " was not found on this server.</p>");
                response.println("</body></html>");
            }
            // 发送响应
            response.send();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据文件扩展名判断 MIME 类型的方法
     * @param file 文件对象
     * @return MIME 类型字符串
     */
    private String getContentType(File file) {
        // 获取文件名
        String fileName = file.getName();
        // 获取文件扩展名
        String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
        // 根据文件扩展名判断 MIME 类型,这里只列举了一些常见的类型,实际上还有很多其他的类型
        switch (extension) {
            case "html":
            case "htm":
                return "text/html";
            case "css":
                return "text/css";
            case "js":
                return "text/javascript";
            case "jpg":
            case "jpeg":
                return "image/jpeg";
            case "png":
                return "image/png";
            case "gif":
                return "image/gif";
            default:
                return "application/octet-stream";
        }
    }
}

7.DynamicProcessor

        DynamicProcessor 类是动态处理器类,它负责处理动态资源的请求,如 Servlet、JSP 等。它有一个 process 方法,用于根据请求路径找到对应的 Servlet,并调用其 service 方法,并将结果写入 Response 对象。

        DynamicProcessor 类的代码如下:

package com.mytomcat;

/**
 * 动态处理器类,负责处理动态资源的请求,如 Servlet、JSP 等
 */
public class DynamicProcessor {

    /**
     * 处理动态资源请求的方法
     * @param request 请求对象
     * @param response 响应对象
     * @param servletContainer Servlet 容器
     */
    public void process(Request request, Response response, ServletContainer servletContainer) {
        try {
            // 获取请求路径
            String uri = request.getUri();
            // 根据请求路径从 Servlet 容器中获取对应的 Servlet 实例,如果没有找到,则返回 null
            Servlet servlet = servletContainer.getServlet(uri);
            // 判断是否找到了对应的 Servlet,如果是,则表示找到了对应的动态资源,否则表示没有找到对应的动态资源
            if (servlet != null) {
                // 设置响应状态码为 200 OK
                response.setStatus(200);
                // 调用 Servlet 的 service 方法,传入请求对象和响应对象,让 Servlet 处理业务逻辑,并生成响应内容
                servlet.service(request, response);
            } else {
                // 设置响应状态码为 404 Not Found
                response.setStatus(404);
                // 设置响应头 Content-Type 为 text/html
                response.setContentType("text/html");
                // 设置响应体为一个简单的错误页面
                response.println("<html><head><title>404 Not Found</title></head><body>");
                response.println("<h1>404 Not Found</h1>");
                response.println("<p>The requested resource " + uri + " was not found on this server.</p>");
                response.println("</body></html>");
            }
            // 发送响应
            response.send();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

8.ServletContainer

        ServletContainer 类是 Servlet 容器类,它负责管理和执行 Servlet。它有一个 load 方法,用于加载配置文件,并根据配置文件中的信息创建和注册 Servlet 实例。它有一个 getServlet 方法,用于根据请求路径获取对应的 Servlet 实例。它有一个 Map 属性,用于存储请求路径和 Servlet 实例之间的映射关系。

        ServletContainer 类的代码如下:

package com.mytomcat;

import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * Servlet 容器类,负责管理和执行 Servlet
 */
public class ServletContainer {

    // 请求路径和 Servlet 实例之间的映射关系
    private Map<String, Servlet> servletMap;

    /**
     * 构造方法,加载配置文件,并创建和注册 Servlet 实例
     * @param configFile 配置文件对象
     */
    public ServletContainer(File configFile) {
        // 创建映射关系对象
        servletMap = new HashMap<>();
        // 加载配置文件
        load(configFile);
    }

    /**
     * 加载配置文件,并创建和注册 Servlet 实例的方法
     * @param configFile 配置文件对象
     */
    private void load(File configFile) {
        try {
            // 创建属性对象,用于存储配置文件中的键值对
            Properties properties = new Properties();
            // 创建文件输入流,读取配置文件内容
            FileInputStream fis = new FileInputStream(configFile);
            // 加载配置文件内容到属性对象中
            properties.load(fis);
            // 关闭文件输入流
            fis.close();
            // 遍历属性对象中的所有键值对
            for (Map.Entry<Object, Object> entry : properties.entrySet()) {
                // 获取键,即请求路径
                String uri = (String) entry.getKey();
                // 获取值,即 Servlet 类名
                String className = (String) entry.getValue();
                // 通过反射机制,根据类名创建 Servlet 类的实例
                Class<?> clazz = Class.forName(className);
                Servlet servlet = (Servlet) clazz.newInstance();
                // 将请求路径和 Servlet 实例放入映射关系对象中
                servletMap.put(uri, servlet);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据请求路径获取对应的 Servlet 实例的方法
     * @param uri 请求路径
     * @return 对应的 Servlet 实例,如果没有找到,则返回 null
     */
    public Servlet getServlet(String uri) {
        // 从映射关系对象中根据请求路径获取对应的 Servlet 实例,并返回
        return servletMap.get(uri);
    }
}

9.Servlet

        Servlet 是一个接口,定义了 Servlet 的规范,所有的 Servlet 都必须实现这个接口。Servlet 接口有一个 service 方法,用于处理客户端的请求,并生成响应内容。Servlet 接口还有一些其他的方法,如 init、destroy、getServletConfig、getServletInfo 等,但在本文中我们不需要实现这些方法。

        Servlet 接口的代码如下:

package com.mytomcat;

import java.io.IOException;

/**
 * Servlet 接口,定义了 Servlet 的规范,所有的 Servlet 都必须实现这个接口
 */
public interface Servlet {

    /**
     * 处理客户端请求,并生成响应内容的方法
     * @param request 请求对象
     * @param response 响应对象
     * @throws IOException 输入输出异常
     */
    public void service(Request request, Response response) throws IOException;
}

10.HelloServlet

        HelloServlet 是一个具体的 Servlet 类,用于演示 Tomcat 的功能。它实现了 Servlet 接口,并重写了 service 方法。在 service 方法中,它根据请求参数 name 的值,生成一个简单的欢迎页面,并将其写入响应对象中。

        HelloServlet 类的代码如下:

package com.mytomcat;

import java.io.IOException;

/**
 * 一个具体的 Servlet 类,用于演示 Tomcat 的功能
 */
public class HelloServlet implements Servlet {

    /**
     * 处理客户端请求,并生成响应内容的方法
     * @param request 请求对象
     * @param response 响应对象
     * @throws IOException 输入输出异常
     */
    @Override
    public void service(Request request, Response response) throws IOException {
        // 获取请求参数 name 的值,如果没有,则默认为 World
        String name = request.getParameter("name");
        if (name == null) {
            name = "World";
        }
        // 设置响应头 Content-Type 为 text/html
        response.setContentType("text/html");
        // 设置响应体为一个简单的欢迎页面
        response.println("<html><head><title>Hello Servlet</title></head><body>");
        response.println("<h1>Hello, " + name + "!</h1>");
        response.println("<p>This is a simple Servlet example.</p>");
        response.println("</body></html>");
    }
}

(三)编写配置文件

        接下来,我们需要编写配置文件,用于指定请求路径和 Servlet 类名之间的映射关系。我们使用一个简单的属性文件(web.xml)来存储这些信息。属性文件中的每一行都是一个键值对,键是请求路径,值是 Servlet 类名。我们需要将属性文件放在 conf 文件夹中。

        属性文件的内容如下:

/servlet/HelloServlet=com.mytomcat.HelloServlet

        这表示当客户端请求 /servlet/HelloServlet 路径时,服务器会调用 com.mytomcat.HelloServlet 类的实例来处理请求。

(四)编写 Web 应用

        最后,我们需要编写 Web 应用,用于测试 Tomcat 的功能。我们使用一个简单的 HTML 文件(index.html)来作为 Web 应用的入口页面。HTML 文件中有一个表单,用于向服务器发送请求,并携带一个 name 参数。我们需要将 HTML 文件放在 webapps 文件夹中。

        HTML 文件的内容如下:

<html>
<head>
    <title>Tomcat Test</title>
</head>
<body>
    <h1>Tomcat Test</h1>
    <p>This is a simple Web application to test Tomcat.</p>
    <form action="/servlet/HelloServlet" method="get">
        <p>Please enter your name:</p>
        <input type="text" name="name">
        <input type="submit" value="Submit">
    </form>
</body>
</html>

        这表示当用户点击提交按钮时,浏览器会向服务器发送一个 GET 请求,并携带一个 name 参数,请求路径为 /servlet/HelloServlet。

(五)测试和调试

        现在,我们已经完成了 Tomcat 的编写和配置,我们可以运行 Server 类的 main 方法来启动 Tomcat 服务器,并在浏览器中访问 http://localhost:8080/index.html 来测试 Tomcat 的功能。

        如果我们遇到了任何问题或错误,我们可以使用 Eclipse 的调试功能来进行调试。我们可以在代码中设置断点,然后使用 Debug As -> Java Application 来运行 Server 类的 main 方法。这样,当程序执行到断点时,Eclipse 会暂停程序的执行,并显示当前的变量值、堆栈信息、控制台输出等信息。我们可以使用 Step Into、Step Over、Step Return 等命令来逐步执行程序,并观察程序的运行情况。

(六)总结

        本文介绍了如何使用 Java 编写 Tomcat,并实现一个简单的 Web 服务器和 Servlet 容器。本文还介绍了 Tomcat 的基本框架和相关配置,并使用 Eclipse 进行开发和调试。本文旨在帮助伙伴们理解和掌握 Tomcat 的原理和用法。

        Tomcat 是一个开源的 Web 服务器和 Servlet 容器,它可以提供动态 Web 内容的处理和交互功能。Tomcat 是用 Java 语言编写的,需要运行在 Java 虚拟机上,所以它可以跨平台运行,并且可以与其他 Java 技术集成。Tomcat 是 Java EE 规范的一个实现,它支持 Servlet、JSP、EL、JSTL 等标准技术,以及 Struts、Spring、Hibernate 等流行框架。

        Tomcat 的设计和实现是基于模块化和可扩展的原则,它由多个组件构成,每个组件都有自己的功能和职责。Tomcat 的核心组件是 Catalina,它是一个 Servlet 容器,负责管理和执行 Servlet。其他组件包括 Coyote,它是一个连接器,负责接收和解析 HTTP 请求;Jasper,它是一个 JSP 引擎,负责编译和执行 JSP 页面;Cluster,它是一个集群模块,负责实现负载均衡和会话复制等功能;以及其他一些辅助组件,如安全模块、日志模块、管理模块等。

以上就是全部内容啦~

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Docker —— 从入门到实践 - v1.0.pdf Dubbo部署文档.doc Dubbo面试专题.docx java后端面试题答案.pdf Java并发Fork-Join框架原理解析.docx JAVA核心知识整理.pdf JAVA核心知识点整理.pdf Java面试笔记.docx JAVA面试题解惑系列.pdf Java面试题(基础).pdf JVM 实用参数系列 - v1.0.pdf JVM与性能优化知识点整理.pdf JVM面试专题.docx JVM面试专题及答案.pdf Linux系统Redis笔记.docx MongoDB学习笔记.docx mybatis原理.docx MyBatis面试专题.docx MyBatis面试专题及答案.pdf Mybatis面试题(含答案).pdf MySQL性能优化的21个最佳实践.pdf mysql面试专题.docx MySQL面试题(含答案).pdf Netty面试专题.docx Nginx实战.pdf ORACLE数据库SQL语句编写优化总结.pdf Redis面试题(含答案).docx Redis面试题(含答案).pdf solr索引搜索.docx Spring Boot实战 .pdf Spring Boot面试专题.docx Spring Cloud面试专题.docx SpringBoot面试专题及答案.pdf SpringCloud面试专题及答案.pdf SpringMVC面试专题.docx Spring全家桶知识笔记.pdf Spring源码分析.pdf Spring面试专题.docx Spring面试专题及答案.pdf Spring面试题(含答案).pdf Tomcat面试专题.docx vivo2021届春季招聘在线编程考试.docx 哔哩哔哩2021招聘后端笔试卷(一).docx 哔哩哔哩2021招聘后端笔试卷(二).docx 多线程面试59题(含答案).pdf 多线程面试专题及答案.pdf 完整面试题(含答案).pdf 小米2021软件开发工程师笔试题一.docx 小米2021软件开发工程师笔试题二.docx 并发编程面试专题.docx 微服务面试专题及答案.pdf 快手2021招聘秋招笔试--工程A试卷.docx 快手2021招聘秋招笔试--工程B试卷.docx 快手2021招聘秋招笔试--工程C试卷.docx 拼多多2021部分编程题合集.docx 数据库面试专题及答案.pdf 正则表达式.pdf 消息中间件面试专题及答案.pdf 深入浅出Redis.pdf 爱奇艺2021Java方向笔试题.docx 爱奇艺2021Java方向笔试题(第一场).docx 看透springMvc源代码分析与实践.pdf 网易2021招聘笔试- 系统开发研发工程师(提前批).docx 网易2021笔试- Java 开发工程师(提前批).docx 网易2021笔试- Java 开发工程师(正式批).docx 网易2021笔试- 系统开发研发工程师(正式批).docx 美团点评2021校招后台开发方向笔试题.docx 美团点评2021系统开发方向笔试题.docx 腾讯2021招聘-后台.docx 设计模式面试专题及答案.pdf 详细解析_Log4j_配置 .docx 阿里百度美团面试题集合.pdf 面试宝典.pdf
第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素概览 2.2.2、创建显示WEB页 2.2.3、创建表单WEB页 2.3、JavaScript简介 2.3.1、JavaScript的基本语法 2.3.2、事件处理 2.3.3、window对象 2.4、本章摘要 2.5、开发实战讲解 第3章 XML简介 3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 4.2、Tomcat简介 4.3、Tomcat服务器的下载及配置 4.3.1、Tomcat下载 4.3.2、Tomcat安装 4.3.3、服务器配置 4.4、编写一个jsp文件 4.5、交互性 4.6、本章摘要 4.7、开发实战讲解 第5章 JSP基础语法 5.1、JSP注释 5.2、Scriptlet 5.2.1、第一种Scriptlet: 5.2.2、第二种Scriptlet: 5.2.3、第三种Scriptlet: 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、错误页的设置 5.4.4、数据库连接操作 5.5、包含指令 5.5.1、静态包含 5.5.2、动态包含 5.6、跳转指令 5.7、实例操作:用户登陆程序实现(JSP + JDBC实现) 5.7.1、创建数据库表 5.7.2、程序实现思路 5.7.3、程序实现 5.8、本章摘要 5.9、开发实战讲解(基于Oracle数据库) 第6章 JSP内置对象 6.1、JSP内置对象概览 6.2、四种属性范围 6.2.1、page属性范围(pageContext范围) 6.2.2、request属性范围 6.2.3、session属性范围 6.2.4、application属性范围 6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 6.10、本章摘要 6.11、开发实战讲解(基于Oracle数据库) 第7章 JavaBean 7.1、JavaBean简介 7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用指令 7.3、JavaBean与表单 7.4、设置属性: 7.4.1、设置指定的属性 7.4.2、指定设置属性的参数 7.4.3、为属性设置具体内容 7.5、取得属性: 7.6、JavaBean的保存范围 7.6.1、page范围的JavaBean 7.6.2、request范围的JavaBean 7.6.3、session范围的JavaBean 7.6.4、application范围的JavaBean 7.7、JavaBean的删除 7.8、实例操作:注册验证 7.9、DAO设计模式 7.9.1、DAO设计模式简介 7.9.2、DAO开发 7.9.3、JSP调用DAO 7.10、本章摘要 7.11、开发实战讲解(基于Oracle数据库) 第8章 文件上传 8.1、smartupload上传组件 8.1.1、上传单个文件 8.1.2、混合表单 8.1.3、为上传文件自动命名 8.1.4、批量上传 8.2、FileUpload 8.2.1、使用FileUpload接收上传内容 8.2.2、保存上传内容 8.2.3、开发FileUpload组件的专属操作类 8.3、本章摘要 8.4、开发实战讲解(基于Oracle数据库) 第9章 Servlet程序开发 9.1、Servlet简介 9.2、永远的“HelloWorld”:第一个Servlet程序 9.3、Servlet与表单 9.4、Servlet生命周期 9.5、取得初始化配置信息 9.6、取得其他内置对象 9.6.1、取得HttpSession实例 9.6.2、取得ServletContext实例 9.7、Servlet跳转 9.7.1、客户端跳转 9.7.2、服务器端跳转 9.8、WEB开发模式:Mode I与Mode II 9.8.1、Mode I 9.8.2、Mode II:Model-View-Controller 9.9、实例操作:MVC设计模式应用 9.10、过滤器 9.10.1、过滤器的基本概念 9.10.2、实现过滤器 9.10.3、过滤器的应用 9.11、监听器 9.11.1、对application监听 9.11.2、对session监听 9.11.3、对request监听 9.11.4、监听器实例 —— 在线人员统计 9.12、本章摘要 9.13、开发实战讲解(基于Oracle数据库) 第10章 表达式语言 10.1、表达式语言简介 10.2、表达式语言的内置对象 10.2.1、访问四种属性范围的内容 10.2.2、调用内置对象操作 10.2.3、接收请求参数 10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 11.3、查找数据源 11.4、本章摘要 第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义有标签体的标签库 12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、TagExtraInfo类和VariableInfo类 12.9、使用BodyTagSupport开发迭代输出 12.10、简单标签 12.11、DynamicAttributes接口 12.12、本章摘要 第13章 标准标签库(JSTL) 13.1、JSTL简介 13.2、安装JSTL 1.2 13.3、核心标签库 13.3.1、标签 13.3.2、标签 13.3.3、标签 13.3.4、标签 13.3.5、标签 13.3.6、、、标签 13.3.7、标签 13.3.8、标签 13.3.9、标签 13.3.10、标签 13.3.11、标签 13.4、国际化标签库 13.4.1、标签 13.4.2、标签 13.4.3、读取资源文件 13.4.4、数字格式化标签 13.4.5、日期时间格式化标签 13.4.6、设置时区 13.5、SQL标签库 13.5.1、 13.5.2、数据库操作标签 13.5.3、事务处理 13.6、XML标签库 13.6.1、XPath简介 13.6.2、标签 13.6.3、标签 13.6.4、标签 13.6.5、标签 13.6.6、、、标签 13.6.7、标签 13.7、函数标签库 13.8、本章摘要 13.9、开发实战讲解(基于Oracle数据库) 第14章 AJAX开发技术 14.1、AJAX技术简介 14.2、XMLHttpRequest对象 14.3、第一个AJAX程序 14.4、异步验证 14.5、返回XML数据 14.6、本章摘要 14.7、开发实战讲解(基于Oracle数据库) 第15章 Struts基础开发 15.1、Struts简介 15.2、配置Struts开发环境 15.3、开发一个Struts程序 15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、标签 16.2.2、标签 16.2.3、资源访问标签 16.2.4、标签 16.2.5、标签 16.2.6、标签 16.2.7、国际化与标签 16.3、Logic标签 16.3.1、标签和标签 16.3.2、标签和标签 16.3.3、关系运算标签 16.3.4、标签 16.3.5、重定向标签: 16.4、Html标签 16.4.1、<html:form>标签 16.4.2、<html:text>与<html:password>标签 16.4.3、<html:radio>标签 16.4.5、<html:textarea>标签 16.4.6、<html:hidden>标签 16.4.7、按钮标签 16.4.8、实例:编写基本表单 16.4.9、复选框标签 16.4.10、下拉列表框 16.5、本章摘要 16.6、开发实战讲解(JSP + Oracle) 第17章 Struts高级开发 17.1、Struts多人开发 17.2、Token 17.3、文件上传 17.4、动态ActionForm 17.5、Action深入 17.5.1、ForwardAction 17.5.2、IncludeAction 17.5.3、DispatchAction 17.6、验证框架 附录A:实用工具 18.1、JavaMail 18.1.1、James邮件服务器的下载及配置 18.1.2、JavaMail简介及配置 18.1.3、发送普通邮件 18.1.4、发送带附件的HTML风格邮件 18.2、操作Excel文件 18.2.1、JExcelAPI简介 18.2.2、创建一个Excel文件 18.2.3、读取Excel文件 18.2.4、格式化文本 18.3、本章摘要 附录B:MyEclipse开发工具 19.1、MyEclipse简介 19.2、MyEclipse的安装 19.3、MyEclipse的使用 19.4、配置Tomcat服务器 19.5、MyEclipse卸载 19.6、本章摘要 附录C:HTTP状态码及头信息 20.1、HTTP状态码 20.2、HTTP头信息
第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素概览 2.2.2、创建显示WEB页 2.2.3、创建表单WEB页 2.3、JavaScript简介 2.3.1、JavaScript的基本语法 2.3.2、事件处理 2.3.3、window对象 2.4、本章摘要 2.5、开发实战讲解 第3章 XML简介 3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 4.2、Tomcat简介 4.3、Tomcat服务器的下载及配置 4.3.1、Tomcat下载 4.3.2、Tomcat安装 4.3.3、服务器配置 4.4、编写一个jsp文件 4.5、交互性 4.6、本章摘要 4.7、开发实战讲解 第5章 JSP基础语法 5.1、JSP注释 5.2、Scriptlet 5.2.1、第一种Scriptlet:<%%> 5.2.2、第二种Scriptlet:<%!%> 5.2.3、第三种Scriptlet:<%=%> 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、错误页的设置 5.4.4、数据库连接操作 5.5、包含指令 5.5.1、静态包含 5.5.2、动态包含 5.6、跳转指令 5.7、实例操作:用户登陆程序实现(JSP + JDBC实现) 5.7.1、创建数据库表 5.7.2、程序实现思路 5.7.3、程序实现 5.8、本章摘要 5.9、开发实战讲解(基于Oracle数据库) 第6章 JSP内置对象 6.1、JSP内置对象概览 6.2、四种属性范围 6.2.1、page属性范围(pageContext范围) 6.2.2、request属性范围 6.2.3、session属性范围 6.2.4、application属性范围 6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 6.10、本章摘要 6.11、开发实战讲解(基于Oracle数据库) 第7章 JavaBean 7.1、JavaBean简介 7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用<jsp:useBean>指令 7.3、JavaBean与表单 7.4、设置属性:<jsp:setProperty> 7.4.1、设置指定的属性 7.4.2、指定设置属性的参数 7.4.3、为属性设置具体内容 7.5、取得属性:<jsp:getProperty> 7.6、JavaBean的保存范围 7.6.1、page范围的JavaBean 7.6.2、request范围的JavaBean 7.6.3、session范围的JavaBean 7.6.4、application范围的JavaBean 7.7、JavaBean的删除 7.8、实例操作:注册验证 7.9、DAO设计模式 7.9.1、DAO设计模式简介 7.9.2、DAO开发 7.9.3、JSP调用DAO 7.10、本章摘要 7.11、开发实战讲解(基于Oracle数据库) 第8章 文件上传 8.1、smartupload上传组件 8.1.1、上传单个文件 8.1.2、混合表单 8.1.3、为上传文件自动命名 8.1.4、批量上传 8.2、FileUpload 8.2.1、使用FileUpload接收上传内容 8.2.2、保存上传内容 8.2.3、开发FileUpload组件的专属操作类 8.3、本章摘要 8.4、开发实战讲解(基于Oracle数据库) 第9章 Servlet程序开发 9.1、Servlet简介 9.2、永远的“HelloWorld”:第一个Servlet程序 9.3、Servlet与表单 9.4、Servlet生命周期 9.5、取得初始化配置信息 9.6、取得其他内置对象 9.6.1、取得HttpSession实例 9.6.2、取得ServletContext实例 9.7、Servlet跳转 9.7.1、客户端跳转 9.7.2、服务器端跳转 9.8、WEB开发模式:Mode I与Mode II 9.8.1、Mode I 9.8.2、Mode II:Model-View-Controller 9.9、实例操作:MVC设计模式应用 9.10、过滤器 9.10.1、过滤器的基本概念 9.10.2、实现过滤器 9.10.3、过滤器的应用 9.11、监听器 9.11.1、对application监听 9.11.2、对session监听 9.11.3、对request监听 9.11.4、监听器实例 —— 在线人员统计 9.12、本章摘要 9.13、开发实战讲解(基于Oracle数据库) 第10章 表达式语言 10.1、表达式语言简介 10.2、表达式语言的内置对象 10.2.1、访问四种属性范围的内容 10.2.2、调用内置对象操作 10.2.3、接收请求参数 10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 11.3、查找数据源 11.4、本章摘要 第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义有标签体的标签库 12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、TagExtraInfo类和VariableInfo类 12.9、使用BodyTagSupport开发迭代输出 12.10、简单标签 12.11、DynamicAttributes接口 12.12、本章摘要 第13章 标准标签库(JSTL) 13.1、JSTL简介 13.2、安装JSTL 1.2 13.3、核心标签库 13.3.1、<c:out>标签 13.3.2、<c:set>标签 13.3.3、<c:remove>标签 13.3.4、<c:catch>标签 13.3.5、<c:if>标签 13.3.6、<c:choose>、<c:when>、<c:otherwise>标签 13.3.7、<c:forEach>标签 13.3.8、<c:forTokens>标签 13.3.9、<c:import>标签 13.3.10、<c:url>标签 13.3.11、<c:redirect>标签 13.4、国际化标签库 13.4.1、<fmt:setLocale>标签 13.4.2、<fmt:requestEncoding>标签 13.4.3、读取资源文件 13.4.4、数字格式化标签 13.4.5、日期时间格式化标签 13.4.6、设置时区 13.5、SQL标签库 13.5.1、<sql:setDataSource> 13.5.2、数据库操作标签 13.5.3、事务处理 13.6、XML标签库 13.6.1、XPath简介 13.6.2、<x:parse>标签 13.6.3、<x:out>标签 13.6.4、<x:set>标签 13.6.5、<x:if>标签 13.6.6、<x:choose>、<x:when>、<x:otherwise>标签 13.6.7、<x:forEach>标签 13.7、函数标签库 13.8、本章摘要 13.9、开发实战讲解(基于Oracle数据库) 第14章 AJAX开发技术 14.1、AJAX技术简介 14.2、XMLHttpRequest对象 14.3、第一个AJAX程序 14.4、异步验证 14.5、返回XML数据 14.6、本章摘要 14.7、开发实战讲解(基于Oracle数据库) 第15章 Struts基础开发 15.1、Struts简介 15.2、配置Struts开发环境 15.3、开发一个Struts程序 15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、<bean:define>标签 16.2.2、<bean:size>标签 16.2.3、资源访问标签 16.2.4、<bean:write>标签 16.2.5、<bean:include>标签 16.2.6、<bean:resource>标签 16.2.7、国际化与<bean:message>标签 16.3、Logic标签 16.3.1、<logic:present>标签和<logic:notPresent>标签 16.3.2、<logic:empty>标签和<logic:notEmpty>标签 16.3.3、关系运算标签 16.3.4、<logic:iterate>标签 16.3.5、重定向标签:<logic:redirect> 16.4、Html标签 16.4.1、<html:form>标签 16.4.2、<html:text>与<html:password>标签 16.4.3、<html:radio>标签 16.4.5、<html:textarea>标签 16.4.6、<html:hidden>标签 16.4.7、按钮标签 16.4.8、实例:编写基本表单 16.4.9、复选框标签 16.4.10、下拉列表框 16.5、本章摘要 16.6、开发实战讲解(JSP + Oracle) 第17章 Struts高级开发 17.1、Struts多人开发 17.2、Token 17.3、文件上传 17.4、动态ActionForm 17.5、Action深入 17.5.1、ForwardAction 17.5.2、IncludeAction 17.5.3、DispatchAction 17.6、验证框架 附录A:实用工具 18.1、JavaMail 18.1.1、James邮件服务器的下载及配置 18.1.2、JavaMail简介及配置 18.1.3、发送普通邮件 18.1.4、发送带附件的HTML风格邮件 18.2、操作Excel文件 18.2.1、JExcelAPI简介 18.2.2、创建一个Excel文件 18.2.3、读取Excel文件 18.2.4、格式化文本 18.3、本章摘要 附录B:MyEclipse开发工具 19.1、MyEclipse简介 19.2、MyEclipse的安装 19.3、MyEclipse的使用 19.4、配置Tomcat服务器 19.5、MyEclipse卸载 19.6、本章摘要 附录C:HTTP状态码及头信息 20.1、HTTP状态码 20.2、HTTP头信息
第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素概览 2.2.2、创建显示WEB页 2.2.3、创建表单WEB页 2.3、JavaScript简介 2.3.1、JavaScript的基本语法 2.3.2、事件处理 2.3.3、window对象 2.4、本章摘要 2.5、开发实战讲解 第3章 XML简介 3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 4.2、Tomcat简介 4.3、Tomcat服务器的下载及配置 4.3.1、Tomcat下载 4.3.2、Tomcat安装 4.3.3、服务器配置 4.4、编写一个jsp文件 4.5、交互性 4.6、本章摘要 4.7、开发实战讲解 第5章 JSP基础语法 5.1、JSP注释 5.2、Scriptlet 5.2.1、第一种Scriptlet: 5.2.2、第二种Scriptlet: 5.2.3、第三种Scriptlet: 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、错误页的设置 5.4.4、数据库连接操作 5.5、包含指令 5.5.1、静态包含 5.5.2、动态包含 5.6、跳转指令 5.7、实例操作:用户登陆程序实现(JSP + JDBC实现) 5.7.1、创建数据库表 5.7.2、程序实现思路 5.7.3、程序实现 5.8、本章摘要 5.9、开发实战讲解(基于Oracle数据库) 第6章 JSP内置对象 6.1、JSP内置对象概览 6.2、四种属性范围 6.2.1、page属性范围(pageContext范围) 6.2.2、request属性范围 6.2.3、session属性范围 6.2.4、application属性范围 6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 6.10、本章摘要 6.11、开发实战讲解(基于Oracle数据库) 第7章 JavaBean 7.1、JavaBean简介 7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用指令 7.3、JavaBean与表单 7.4、设置属性: 7.4.1、设置指定的属性 7.4.2、指定设置属性的参数 7.4.3、为属性设置具体内容 7.5、取得属性: 7.6、JavaBean的保存范围 7.6.1、page范围的JavaBean 7.6.2、request范围的JavaBean 7.6.3、session范围的JavaBean 7.6.4、application范围的JavaBean 7.7、JavaBean的删除 7.8、实例操作:注册验证 7.9、DAO设计模式 7.9.1、DAO设计模式简介 7.9.2、DAO开发 7.9.
好的,以下是一个简单Java Web程序的例子: 1. 创建一个Java Web项目 首先,在你的IDE中创建一个新的Java Web项目。你可以使用Eclipse、IntelliJ IDEA或NetBeans等任何一个IDE。 2. 创建一个Servlet 在项目创建一个Servlet。可以使用如下代码创建一个简单的Servlet: ```java import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().println("Hello World"); } } ``` 3. 配置Servlet 在web.xml文件中配置Servlet。可以使用如下代码将Servlet配置到web.xml文件中: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> ``` 4. 部署项目项目部署到Web服务器中。可以使用Tomcat或Jetty等Web服务器。 5. 访问Web应用 访问Web应用的URL,例如http://localhost:8080/mywebapp/hello。在浏览器中输入这个URL,应该会看到“Hello World”的文本。 以上是一个简单Java Web程序的例子。你可以根据自己的需求修改代码和配置文件来构建更复杂的Web应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gavana.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值